From 2c35db7a0759ae9c4c53297565e9b6bea631d31a Mon Sep 17 00:00:00 2001 From: TransZAllen Date: Tue, 26 Aug 2025 18:19:10 +0800 Subject: [PATCH 001/190] [Bug] Fix missing subtitle text in manually downloaded *.SRT files. (issue #10030) - Previously, *.SRT files only contained timestamps and sequence numbers, without the actual text content. - Added recursive text extraction to handle nested tags in TTML files.(e.g.: tags) --- .../newpipe/streams/SrtFromTtmlWriter.java | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java index 7aff655a0..902d5f57c 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java +++ b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java @@ -54,6 +54,30 @@ public class SrtFromTtmlWriter { out.write(text.getBytes(charset)); } + /* + * Recursive method to extract text from all nodes + * - This method processes TextNode and
tags, recursively + * extracting text from nested tags. + * For example: extract text from nested tags + * - Appends newlines for
tags. + */ + private void extractText(final Node node, final StringBuilder text) { + if (node instanceof TextNode) { + text.append(((TextNode) node).text()); + } else if (node instanceof Element) { + final Element element = (Element) node; + //
is a self-closing HTML tag used to insert a line break. + if (element.tagName().equalsIgnoreCase("br")) { + // Add a newline for
tags + text.append(NEW_LINE); + } + } + // Recursively process child nodes + for (final Node child : node.childNodes()) { + extractText(child, text); + } + } + public void build(final SharpStream ttml) throws IOException { /* * TTML parser with BASIC support @@ -81,14 +105,8 @@ public class SrtFromTtmlWriter { for (final Element paragraph : paragraphList) { text.setLength(0); - for (final Node children : paragraph.childNodes()) { - if (children instanceof TextNode) { - text.append(((TextNode) children).text()); - } else if (children instanceof Element - && ((Element) children).tagName().equalsIgnoreCase("br")) { - text.append(NEW_LINE); - } - } + // Recursively extract text from all child nodes + extractText(paragraph, text); if (ignoreEmptyFrames && text.length() < 1) { continue; From e1888ede8744829cf47716d987f2fc7d12a75de3 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 27 Aug 2025 10:34:21 +0200 Subject: [PATCH 002/190] Fix JDoc and apply suggestions --- .../newpipe/streams/SrtFromTtmlWriter.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java index 902d5f57c..5f43185c6 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java +++ b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java @@ -54,18 +54,23 @@ public class SrtFromTtmlWriter { out.write(text.getBytes(charset)); } - /* - * Recursive method to extract text from all nodes - * - This method processes TextNode and
tags, recursively - * extracting text from nested tags. - * For example: extract text from nested tags - * - Appends newlines for
tags. + // CHECKSTYLE:OFF checkstyle:JavadocStyle + // checkstyle does not understand that span tags are inside a code block + /** + *

Recursive method to extract text from all nodes.

+ *

+ * This method processes {@link TextNode}s and {@code
} tags, + * recursively extracting text from nested tags + * (e.g. extracting text from nested {@code } tags). + * Newlines are added for {@code
} tags. + *

+ * @param node the current node to process + * @param text the {@link StringBuilder} to append the extracted text to */ private void extractText(final Node node, final StringBuilder text) { - if (node instanceof TextNode) { - text.append(((TextNode) node).text()); - } else if (node instanceof Element) { - final Element element = (Element) node; + if (node instanceof TextNode textNode) { + text.append((textNode).text()); + } else if (node instanceof Element element) { //
is a self-closing HTML tag used to insert a line break. if (element.tagName().equalsIgnoreCase("br")) { // Add a newline for
tags @@ -77,6 +82,7 @@ public class SrtFromTtmlWriter { extractText(child, text); } } + // CHECKSTYLE:ON public void build(final SharpStream ttml) throws IOException { /* @@ -98,7 +104,7 @@ public class SrtFromTtmlWriter { final Elements paragraphList = doc.select("body > div > p"); // check if has frames - if (paragraphList.size() < 1) { + if (paragraphList.isEmpty()) { return; } From fd4f4737c218ba3a5fa7b684287dd8575bba0dbe Mon Sep 17 00:00:00 2001 From: m Date: Fri, 10 Oct 2025 03:22:23 -0700 Subject: [PATCH 003/190] Support on.soundcloud link opening --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8a6b22ab3..3da97f268 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -340,6 +340,7 @@ + From 0ebd01e65edcd370dfccca198667c87223c88313 Mon Sep 17 00:00:00 2001 From: Howar Date: Thu, 9 Oct 2025 21:07:23 +1100 Subject: [PATCH 004/190] =?UTF-8?q?fix(playback):=20handle=20long-press=20?= =?UTF-8?q?on=20=E2=80=9CPlay=20All=E2=80=9D=20button=20for=20issue=20#124?= =?UTF-8?q?33?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/schabi/newpipe/util/PlayButtonHelper.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/util/PlayButtonHelper.java b/app/src/main/java/org/schabi/newpipe/util/PlayButtonHelper.java index 9727c8083..655ea7092 100644 --- a/app/src/main/java/org/schabi/newpipe/util/PlayButtonHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/PlayButtonHelper.java @@ -50,6 +50,10 @@ public final class PlayButtonHelper { }); // long click listener + playlistControlBinding.playlistCtrlPlayAllButton.setOnLongClickListener(view -> { + NavigationHelper.enqueueOnPlayer(activity, fragment.getPlayQueue(), PlayerType.MAIN); + return true; + }); playlistControlBinding.playlistCtrlPlayPopupButton.setOnLongClickListener(view -> { NavigationHelper.enqueueOnPlayer(activity, fragment.getPlayQueue(), PlayerType.POPUP); return true; From 2dd4509b7521dc36bce6b8e7cf543617f1121c3c Mon Sep 17 00:00:00 2001 From: jianing liu Date: Sat, 11 Oct 2025 21:12:57 +0800 Subject: [PATCH 005/190] change marginRight to marginEnd --- app/src/main/res/layout/player.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 99b514bb0..11a525632 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -123,7 +123,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="6dp" - android:layout_marginRight="8dp" + android:layout_marginEnd="8dp" android:layout_weight="1" android:gravity="top" android:orientation="vertical" From fbc664d0dae79bafd0379ea48085b1a821985e88 Mon Sep 17 00:00:00 2001 From: jianing liu Date: Sun, 12 Oct 2025 02:03:38 +0800 Subject: [PATCH 006/190] [player] Prevent long audio track label from pushing controls off-screen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - audioTrackTextView: layout_width=0dp + layout_weight=1 - Make it singleLine with ellipsize="end" - When not fullscreen, hide metadataView so an empty weighted container doesn’t reserve space - Result: controls stay visible on small screens; longer labels can use space on larger screens --- .../main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java | 2 ++ app/src/main/res/layout/player.xml | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java index d8efb30df..b79ef9235 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java @@ -289,6 +289,7 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh binding.topControls.setClickable(true); binding.topControls.setFocusable(true); + binding.metadataView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE); binding.titleTextView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE); binding.channelTextView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE); } @@ -934,6 +935,7 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh } fragmentListener.onFullscreenStateChanged(isFullscreen); + binding.metadataView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE); binding.titleTextView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE); binding.channelTextView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE); binding.playerCloseButton.setVisibility(isFullscreen ? View.GONE : View.VISIBLE); diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 11a525632..4e5cd8533 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -160,12 +160,15 @@ Date: Tue, 14 Oct 2025 23:04:51 +0800 Subject: [PATCH 007/190] Revert "Add snippet to ensure baseline.profm file is sorted" This reverts commit 1db1a0058106af6b4b2c7e850a370c32f899e019. The issue has been long resolved making this fix no longer required. --- app/build.gradle | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 38765476a..784f11ee7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,3 @@ -import com.android.tools.profgen.ArtProfileKt -import com.android.tools.profgen.ArtProfileSerializer -import com.android.tools.profgen.DexFile - plugins { id "com.android.application" id "kotlin-android" @@ -336,25 +332,3 @@ static String getGitWorkingBranch() { return "" } } - -// fix reproducible builds -project.afterEvaluate { - tasks.compileReleaseArtProfile.doLast { - outputs.files.each { file -> - if (file.toString().endsWith(".profm")) { - println("Sorting ${file} ...") - def version = ArtProfileSerializer.valueOf("METADATA_0_0_2") - def profile = ArtProfileKt.ArtProfile(file) - def keys = new ArrayList(profile.profileData.keySet()) - def sortedData = new LinkedHashMap() - Collections.sort keys, new DexFile.Companion() - keys.each { key -> sortedData[key] = profile.profileData[key] } - new FileOutputStream(file).with { - write(version.magicBytes$profgen) - write(version.versionBytes$profgen) - version.write$profgen(it, sortedData, "") - } - } - } - } -} From d99435c4ad43ae20ba378d00135acf5908bd3899 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 14 Oct 2025 23:02:42 +0800 Subject: [PATCH 008/190] Migrate build scripts to kotlin DSL Ref: https://developer.android.com/build/migrate-to-kotlin-dsl Signed-off-by: Aayush Gupta --- app/build.gradle | 334 ------------------------------------------- app/build.gradle.kts | 320 +++++++++++++++++++++++++++++++++++++++++ build.gradle | 25 ---- build.gradle.kts | 12 ++ settings.gradle | 11 -- settings.gradle.kts | 32 +++++ 6 files changed, 364 insertions(+), 370 deletions(-) delete mode 100644 app/build.gradle create mode 100644 app/build.gradle.kts delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 784f11ee7..000000000 --- a/app/build.gradle +++ /dev/null @@ -1,334 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - id "kotlin-kapt" - id "kotlin-parcelize" - id "checkstyle" - id "org.sonarqube" version "4.0.0.2929" -} - -android { - compileSdk 36 - namespace 'org.schabi.newpipe' - - defaultConfig { - applicationId "org.schabi.newpipe" - resValue "string", "app_name", "NewPipe" - minSdk 21 - targetSdk 35 - if (System.properties.containsKey('versionCodeOverride')) { - versionCode System.getProperty('versionCodeOverride') as Integer - } else { - versionCode 1005 - } - versionName "0.28.0" - if (System.properties.containsKey('versionNameSuffix')) { - versionNameSuffix System.getProperty('versionNameSuffix') - } - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - - javaCompileOptions { - annotationProcessorOptions { - arguments = ["room.schemaLocation": "$projectDir/schemas".toString()] - } - } - } - - buildTypes { - debug { - debuggable true - - // suffix the app id and the app name with git branch name - def workingBranch = getGitWorkingBranch() - def normalizedWorkingBranch = workingBranch.replaceFirst("^[^A-Za-z]+", "").replaceAll("[^0-9A-Za-z]+", "") - if (normalizedWorkingBranch.isEmpty() || workingBranch == "master" || workingBranch == "dev") { - // default values when branch name could not be determined or is master or dev - applicationIdSuffix ".debug" - resValue "string", "app_name", "NewPipe Debug" - } else { - applicationIdSuffix ".debug." + normalizedWorkingBranch - resValue "string", "app_name", "NewPipe " + workingBranch - archivesBaseName = 'NewPipe_' + normalizedWorkingBranch - } - } - - release { - if (System.properties.containsKey('packageSuffix')) { - applicationIdSuffix System.getProperty('packageSuffix') - resValue "string", "app_name", "NewPipe " + System.getProperty('packageSuffix') - archivesBaseName = 'NewPipe_' + System.getProperty('packageSuffix') - } - minifyEnabled true - shrinkResources false // disabled to fix F-Droid's reproducible build - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - archivesBaseName = 'app' - } - } - - lint { - checkReleaseBuilds false - // Or, if you prefer, you can continue to check for errors in release builds, - // but continue the build even when errors are found: - abortOnError false - // suppress false warning ("Resource IDs will be non-final in Android Gradle Plugin version - // 5.0, avoid using them in switch case statements"), which affects only library projects - disable 'NonConstantResourceId' - } - - compileOptions { - // Flag to enable support for the new language APIs - coreLibraryDesugaringEnabled true - - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - encoding 'utf-8' - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17 - } - - sourceSets { - androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) - } - - androidResources { - generateLocaleConfig = true - } - - buildFeatures { - viewBinding true - buildConfig true - } - - packagingOptions { - resources { - // remove two files which belong to jsoup - // no idea how they ended up in the META-INF dir... - excludes += ['META-INF/README.md', 'META-INF/CHANGES', - // 'COPYRIGHT' belongs to RxJava... - 'META-INF/COPYRIGHT'] - } - } -} - -ext { - checkstyleVersion = '10.12.1' - - androidxLifecycleVersion = '2.6.2' - androidxRoomVersion = '2.6.1' - androidxWorkVersion = '2.8.1' - - stateSaverVersion = '1.4.1' - exoPlayerVersion = '2.18.7' - googleAutoServiceVersion = '1.1.1' - groupieVersion = '2.10.1' - markwonVersion = '4.6.2' - - leakCanaryVersion = '2.12' - stethoVersion = '1.6.0' -} - -configurations { - checkstyle - ktlint -} - -checkstyle { - getConfigDirectory().set(rootProject.file("checkstyle")) - ignoreFailures false - showViolations true - toolVersion = checkstyleVersion -} - -tasks.register('runCheckstyle', Checkstyle) { - source 'src' - include '**/*.java' - exclude '**/gen/**' - exclude '**/R.java' - exclude '**/BuildConfig.java' - exclude 'main/java/us/shandian/giga/**' - - classpath = configurations.checkstyle - - showViolations true - - reports { - xml.getRequired().set(true) - html.getRequired().set(true) - } -} - -def outputDir = "${project.buildDir}/reports/ktlint/" -def inputFiles = project.fileTree(dir: "src", include: "**/*.kt") - -tasks.register('runKtlint', JavaExec) { - inputs.files(inputFiles) - outputs.dir(outputDir) - getMainClass().set("com.pinterest.ktlint.Main") - classpath = configurations.ktlint - args "src/**/*.kt" - jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED") -} - -tasks.register('formatKtlint', JavaExec) { - inputs.files(inputFiles) - outputs.dir(outputDir) - getMainClass().set("com.pinterest.ktlint.Main") - classpath = configurations.ktlint - args "-F", "src/**/*.kt" - jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED") -} - -afterEvaluate { - if (!System.properties.containsKey('skipFormatKtlint')) { - preDebugBuild.dependsOn formatKtlint - } - preDebugBuild.dependsOn runCheckstyle, runKtlint -} - -sonar { - properties { - property "sonar.projectKey", "TeamNewPipe_NewPipe" - property "sonar.organization", "teamnewpipe" - property "sonar.host.url", "https://sonarcloud.io" - } -} - -dependencies { -/** Desugaring **/ - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs_nio:2.0.4' - -/** NewPipe libraries **/ - // You can use a local version by uncommenting a few lines in settings.gradle - // Or you can use a commit you pushed to GitHub by just replacing TeamNewPipe with your GitHub - // name and the commit hash with the commit hash of the (pushed) commit you want to test - // This works thanks to JitPack: https://jitpack.io/ - implementation 'com.github.TeamNewPipe:nanojson:e9d656ddb49a412a5a0a5d5ef20ca7ef09549996' - // WORKAROUND: if you get errors with the NewPipeExtractor dependency, replace `v0.24.3` with - // 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. - implementation 'com.github.TeamNewPipe:NewPipeExtractor:0023b22095a2d62a60cdfc87f4b5cd85c8b266c3' - implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' - -/** Checkstyle **/ - checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}" - ktlint 'com.pinterest:ktlint:0.45.2' - -/** Kotlin **/ - implementation "org.jetbrains.kotlin:kotlin-stdlib:${kotlin_version}" - -/** AndroidX **/ - implementation 'androidx.appcompat:appcompat:1.7.1' - implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.core:core-ktx:1.12.0' - implementation 'androidx.documentfile:documentfile:1.0.1' - implementation 'androidx.fragment:fragment-ktx:1.6.2' - implementation "androidx.lifecycle:lifecycle-livedata-ktx:${androidxLifecycleVersion}" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:${androidxLifecycleVersion}" - implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.1.0' - implementation 'androidx.media:media:1.7.0' - implementation 'androidx.preference:preference:1.2.1' - implementation 'androidx.recyclerview:recyclerview:1.3.2' - implementation "androidx.room:room-runtime:${androidxRoomVersion}" - implementation "androidx.room:room-rxjava3:${androidxRoomVersion}" - kapt "androidx.room:room-compiler:${androidxRoomVersion}" - implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' - // Newer version specified to prevent accessibility regressions with RecyclerView, see: - // https://developer.android.com/jetpack/androidx/releases/viewpager2#1.1.0-alpha01 - implementation 'androidx.viewpager2:viewpager2:1.1.0-beta02' - implementation "androidx.work:work-runtime-ktx:${androidxWorkVersion}" - implementation "androidx.work:work-rxjava3:${androidxWorkVersion}" - implementation 'com.google.android.material:material:1.11.0' - implementation "androidx.webkit:webkit:1.9.0" - -/** Third-party libraries **/ - // Instance state boilerplate elimination - implementation 'com.github.livefront:bridge:v2.0.2' - implementation "com.evernote:android-state:$stateSaverVersion" - kapt "com.evernote:android-state-processor:$stateSaverVersion" - - // HTML parser - implementation "org.jsoup:jsoup:1.17.2" - - // HTTP client - implementation "com.squareup.okhttp3:okhttp:4.12.0" - - // Media player - implementation "com.google.android.exoplayer:exoplayer-core:${exoPlayerVersion}" - implementation "com.google.android.exoplayer:exoplayer-dash:${exoPlayerVersion}" - implementation "com.google.android.exoplayer:exoplayer-database:${exoPlayerVersion}" - implementation "com.google.android.exoplayer:exoplayer-datasource:${exoPlayerVersion}" - implementation "com.google.android.exoplayer:exoplayer-hls:${exoPlayerVersion}" - implementation "com.google.android.exoplayer:exoplayer-smoothstreaming:${exoPlayerVersion}" - implementation "com.google.android.exoplayer:exoplayer-ui:${exoPlayerVersion}" - implementation "com.google.android.exoplayer:extension-mediasession:${exoPlayerVersion}" - - // Metadata generator for service descriptors - compileOnly "com.google.auto.service:auto-service-annotations:${googleAutoServiceVersion}" - kapt "com.google.auto.service:auto-service:${googleAutoServiceVersion}" - - // Manager for complex RecyclerView layouts - implementation "com.github.lisawray.groupie:groupie:${groupieVersion}" - implementation "com.github.lisawray.groupie:groupie-viewbinding:${groupieVersion}" - - // Image loading - //noinspection NewerVersionAvailable,GradleDependency --> 2.8 is the last version, not 2.71828! - implementation "com.squareup.picasso:picasso:2.8" - - // Markdown library for Android - implementation "io.noties.markwon:core:${markwonVersion}" - implementation "io.noties.markwon:linkify:${markwonVersion}" - - // Crash reporting - implementation "ch.acra:acra-core:5.11.3" - - // Properly restarting - implementation 'com.jakewharton:process-phoenix:2.1.2' - - // Reactive extensions for Java VM - implementation "io.reactivex.rxjava3:rxjava:3.1.8" - implementation "io.reactivex.rxjava3:rxandroid:3.0.2" - // RxJava binding APIs for Android UI widgets - implementation "com.jakewharton.rxbinding4:rxbinding:4.0.0" - - // Date and time formatting - implementation "org.ocpsoft.prettytime:prettytime:5.0.8.Final" - -/** Debugging **/ - // Memory leak detection - debugImplementation "com.squareup.leakcanary:leakcanary-object-watcher-android:${leakCanaryVersion}" - debugImplementation "com.squareup.leakcanary:plumber-android:${leakCanaryVersion}" - debugImplementation "com.squareup.leakcanary:leakcanary-android-core:${leakCanaryVersion}" - // Debug bridge for Android - debugImplementation "com.facebook.stetho:stetho:${stethoVersion}" - debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoVersion}" - -/** Testing **/ - testImplementation 'junit:junit:4.13.2' - testImplementation 'org.mockito:mockito-core:5.6.0' - - androidTestImplementation "androidx.test.ext:junit:1.1.5" - androidTestImplementation "androidx.test:runner:1.5.2" - androidTestImplementation "androidx.room:room-testing:${androidxRoomVersion}" - androidTestImplementation "org.assertj:assertj-core:3.24.2" -} - -static String getGitWorkingBranch() { - try { - def gitProcess = "git rev-parse --abbrev-ref HEAD".execute() - gitProcess.waitFor() - if (gitProcess.exitValue() == 0) { - return gitProcess.text.trim() - } else { - // not a git repository - return "" - } - } catch (IOException ignored) { - // git was not found - return "" - } -} diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 000000000..4bbb8ad93 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,320 @@ +/* + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +plugins { + id("com.android.application") + id("kotlin-android") + id("kotlin-kapt") + id("kotlin-parcelize") + id("org.sonarqube") + checkstyle +} + +val gitWorkingBranch = providers.exec { + commandLine("git", "rev-parse", "--abbrev-ref", "HEAD") +}.standardOutput.asText.map { it.trim() } + +android { + compileSdk = 36 + namespace = "org.schabi.newpipe" + + defaultConfig { + applicationId = "org.schabi.newpipe" + resValue("string", "app_name", "NewPipe") + minSdk = 21 + targetSdk = 35 + + versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1005 + + versionName = "0.28.0" + System.getProperty("versionNameSuffix")?.let { versionNameSuffix = it } + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + + javaCompileOptions { + annotationProcessorOptions { + arguments["room.schemaLocation"] = "$projectDir/schemas" + } + } + } + + buildTypes { + debug { + isDebuggable = true + + // suffix the app id and the app name with git branch name + val defaultBranches = listOf("master", "dev") + val workingBranch = gitWorkingBranch.getOrElse("") + val normalizedWorkingBranch = workingBranch + .replaceFirst("^[^A-Za-z]+".toRegex(), "") + .replace("[^0-9A-Za-z]+".toRegex(), "") + + if (normalizedWorkingBranch.isEmpty() || workingBranch in defaultBranches) { + // default values when branch name could not be determined or is master or dev + applicationIdSuffix = ".debug" + resValue("string", "app_name", "NewPipe Debug") + } else { + applicationIdSuffix = ".debug.$normalizedWorkingBranch" + resValue("string", "app_name", "NewPipe $workingBranch") + setProperty("archivesBaseName", "NewPipe_$normalizedWorkingBranch") + } + } + + release { + System.getProperty("packageSuffix")?.let { suffix -> + applicationIdSuffix = suffix + resValue("string", "app_name", "NewPipe $suffix") + setProperty("archivesBaseName", "NewPipe_" + System.getProperty("packageSuffix")) + } + isMinifyEnabled = true + isShrinkResources = false // disabled to fix F-Droid"s reproducible build + proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + setProperty("archivesBaseName", "app") + } + } + + lint { + checkReleaseBuilds = false + // Or, if you prefer, you can continue to check for errors in release builds, + // but continue the build even when errors are found: + abortOnError = false + // suppress false warning ("Resource IDs will be non-final in Android Gradle Plugin version + // 5.0, avoid using them in switch case statements"), which affects only library projects + disable += "NonConstantResourceId" + } + + compileOptions { + // Flag to enable support for the new language APIs + isCoreLibraryDesugaringEnabled = true + + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + encoding = "utf-8" + } + + kotlinOptions { + jvmTarget = "17" + } + + sourceSets { + getByName("androidTest") { + assets.srcDir("$projectDir/schemas") + } + } + + androidResources { + generateLocaleConfig = true + } + + buildFeatures { + viewBinding = true + buildConfig = true + } + + packaging { + resources { + // remove two files which belong to jsoup + // no idea how they ended up in the META-INF dir... + excludes += setOf( + "META-INF/README.md", + "META-INF/CHANGES", + "META-INF/COPYRIGHT" // "COPYRIGHT" belongs to RxJava... + ) + } + } +} + +val checkstyleVersion = "10.12.1" + +val androidxLifecycleVersion = "2.6.2" +val androidxRoomVersion = "2.6.1" +val androidxWorkVersion = "2.8.1" + +val stateSaverVersion = "1.4.1" +val exoPlayerVersion = "2.18.7" +val googleAutoServiceVersion = "1.1.1" +val groupieVersion = "2.10.1" +val markwonVersion = "4.6.2" + +val leakCanaryVersion = "2.12" +val stethoVersion = "1.6.0" + +val ktlint by configurations.creating + +checkstyle { + configDirectory = rootProject.file("checkstyle") + isIgnoreFailures = false + isShowViolations = true + toolVersion = checkstyleVersion +} + +tasks.register("runCheckstyle") { + source("src") + include("**/*.java") + exclude("**/gen/**") + exclude("**/R.java") + exclude("**/BuildConfig.java") + exclude("main/java/us/shandian/giga/**") + + classpath = configurations.getByName("checkstyle") + + isShowViolations = true + + reports { + xml.required = true + html.required = true + } +} + +val outputDir = project.layout.buildDirectory.dir("reports/ktlint/") +val inputFiles = fileTree("src") { include("**/*.kt") } + +tasks.register("runKtlint") { + inputs.files(inputFiles) + outputs.dir(outputDir) + mainClass.set("com.pinterest.ktlint.Main") + classpath = configurations.getByName("ktlint") + args = listOf("src/**/*.kt") + jvmArgs = listOf("--add-opens", "java.base/java.lang=ALL-UNNAMED") +} + +tasks.register("formatKtlint") { + inputs.files(inputFiles) + outputs.dir(outputDir) + mainClass.set("com.pinterest.ktlint.Main") + classpath = configurations.getByName("ktlint") + args = listOf("-F", "src/**/*.kt") + jvmArgs = listOf("--add-opens", "java.base/java.lang=ALL-UNNAMED") +} + +afterEvaluate { + tasks.named("preDebugBuild").configure { + if (!System.getProperties().containsKey("skipFormatKtlint")) { + dependsOn("formatKtlint") + } + dependsOn("runCheckstyle", "runKtlint") + } +} + +sonar { + properties { + property("sonar.projectKey", "TeamNewPipe_NewPipe") + property("sonar.organization", "teamnewpipe") + property("sonar.host.url", "https://sonarcloud.io") + } +} + +dependencies { + /** Desugaring **/ + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs_nio:2.0.4") + + /** NewPipe libraries **/ + implementation("com.github.TeamNewPipe:nanojson:e9d656ddb49a412a5a0a5d5ef20ca7ef09549996") + // WORKAROUND: if you get errors with the NewPipeExtractor dependency, replace `v0.24.3` with + // 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. + implementation("com.github.TeamNewPipe:NewPipeExtractor:0023b22095a2d62a60cdfc87f4b5cd85c8b266c3") + implementation("com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0") + + /** Checkstyle **/ + checkstyle("com.puppycrawl.tools:checkstyle:$checkstyleVersion") + ktlint("com.pinterest:ktlint:0.45.2") + + /** AndroidX **/ + implementation("androidx.appcompat:appcompat:1.7.1") + implementation("androidx.cardview:cardview:1.0.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + implementation("androidx.core:core-ktx:1.12.0") + implementation("androidx.documentfile:documentfile:1.0.1") + implementation("androidx.fragment:fragment-ktx:1.6.2") + implementation("androidx.lifecycle:lifecycle-livedata-ktx:$androidxLifecycleVersion") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$androidxLifecycleVersion") + implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.1.0") + implementation("androidx.media:media:1.7.0") + implementation("androidx.preference:preference:1.2.1") + implementation("androidx.recyclerview:recyclerview:1.3.2") + implementation("androidx.room:room-runtime:$androidxRoomVersion") + implementation("androidx.room:room-rxjava3:$androidxRoomVersion") + kapt("androidx.room:room-compiler:$androidxRoomVersion") + implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") + // Newer version specified to prevent accessibility regressions with RecyclerView, see: + // https://developer.android.com/jetpack/androidx/releases/viewpager2#1.1.0-alpha01 + implementation("androidx.viewpager2:viewpager2:1.1.0-beta02") + implementation("androidx.work:work-runtime-ktx:$androidxWorkVersion") + implementation("androidx.work:work-rxjava3:$androidxWorkVersion") + implementation("com.google.android.material:material:1.11.0") + implementation("androidx.webkit:webkit:1.9.0") + + /** Third-party libraries **/ + implementation("com.github.livefront:bridge:v2.0.2") + implementation("com.evernote:android-state:$stateSaverVersion") + kapt("com.evernote:android-state-processor:$stateSaverVersion") + + // HTML parser + implementation("org.jsoup:jsoup:1.17.2") + + // HTTP client + implementation("com.squareup.okhttp3:okhttp:4.12.0") + + // Media player + implementation("com.google.android.exoplayer:exoplayer-core:$exoPlayerVersion") + implementation("com.google.android.exoplayer:exoplayer-dash:$exoPlayerVersion") + implementation("com.google.android.exoplayer:exoplayer-database:$exoPlayerVersion") + implementation("com.google.android.exoplayer:exoplayer-datasource:$exoPlayerVersion") + implementation("com.google.android.exoplayer:exoplayer-hls:$exoPlayerVersion") + implementation("com.google.android.exoplayer:exoplayer-smoothstreaming:$exoPlayerVersion") + implementation("com.google.android.exoplayer:exoplayer-ui:$exoPlayerVersion") + implementation("com.google.android.exoplayer:extension-mediasession:$exoPlayerVersion") + + // Metadata generator for service descriptors + compileOnly("com.google.auto.service:auto-service-annotations:$googleAutoServiceVersion") + kapt("com.google.auto.service:auto-service:$googleAutoServiceVersion") + + // Manager for complex RecyclerView layouts + implementation("com.github.lisawray.groupie:groupie:$groupieVersion") + implementation("com.github.lisawray.groupie:groupie-viewbinding:$groupieVersion") + + // Image loading + //noinspection NewerVersionAvailable,GradleDependency --> 2.8 is the last version, not 2.71828! + implementation("com.squareup.picasso:picasso:2.8") + + // Markdown library for Android + implementation("io.noties.markwon:core:$markwonVersion") + implementation("io.noties.markwon:linkify:$markwonVersion") + + // Crash reporting + implementation("ch.acra:acra-core:5.11.3") + + // Properly restarting + implementation("com.jakewharton:process-phoenix:2.1.2") + + // Reactive extensions for Java VM + implementation("io.reactivex.rxjava3:rxjava:3.1.8") + implementation("io.reactivex.rxjava3:rxandroid:3.0.2") + // RxJava binding APIs for Android UI widgets + implementation("com.jakewharton.rxbinding4:rxbinding:4.0.0") + + // Date and time formatting + implementation("org.ocpsoft.prettytime:prettytime:5.0.8.Final") + + /** Debugging **/ + // Memory leak detection + debugImplementation("com.squareup.leakcanary:leakcanary-object-watcher-android:$leakCanaryVersion") + debugImplementation("com.squareup.leakcanary:plumber-android:$leakCanaryVersion") + debugImplementation("com.squareup.leakcanary:leakcanary-android-core:$leakCanaryVersion") + // Debug bridge for Android + debugImplementation("com.facebook.stetho:stetho:$stethoVersion") + debugImplementation("com.facebook.stetho:stetho-okhttp3:$stethoVersion") + + /** Testing **/ + testImplementation("junit:junit:4.13.2") + testImplementation("org.mockito:mockito-core:5.6.0") + + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test:runner:1.5.2") + androidTestImplementation("androidx.room:room-testing:$androidxRoomVersion") + androidTestImplementation("org.assertj:assertj-core:3.24.2") +} diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 3cdc0dc59..000000000 --- a/build.gradle +++ /dev/null @@ -1,25 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - ext.kotlin_version = '1.9.25' - repositories { - google() - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:8.13.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -allprojects { - repositories { - google() - mavenCentral() - maven { url "https://jitpack.io" } - maven { url "https://repo.clojars.org" } - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 000000000..d08a3cda5 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +plugins { + id("com.android.application") version "8.13.0" apply false + id("org.jetbrains.kotlin.android") version "1.9.25" apply false + id("org.jetbrains.kotlin.kapt") version "1.9.25" apply false + id("org.jetbrains.kotlin.plugin.parcelize") version "1.9.25" apply false + id("org.sonarqube") version "4.0.0.2929" apply false +} diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 0338fde6c..000000000 --- a/settings.gradle +++ /dev/null @@ -1,11 +0,0 @@ -include ':app' - -// Use a local copy of NewPipe Extractor by uncommenting the lines below. -// We assume, that NewPipe and NewPipe Extractor have the same parent directory. -// If this is not the case, please change the path in includeBuild(). - -//includeBuild('../NewPipeExtractor') { -// dependencySubstitution { -// substitute module('com.github.TeamNewPipe:NewPipeExtractor') using project(':extractor') -// } -//} diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 000000000..d9e899151 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,32 @@ +/* + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven(url = "https://jitpack.io") + maven(url = "https://repo.clojars.org") + } +} +include (":app") + +// Use a local copy of NewPipe Extractor by uncommenting the lines below. +// We assume, that NewPipe and NewPipe Extractor have the same parent directory. +// If this is not the case, please change the path in includeBuild(). + +//includeBuild('../NewPipeExtractor') { +// dependencySubstitution { +// substitute module('com.github.TeamNewPipe:NewPipeExtractor') using project(':extractor') +// } +//} From 15089245bb48faa3ce42d049f0b0dbb8adaab9c3 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 15 Oct 2025 12:58:54 +0800 Subject: [PATCH 009/190] Migrate to build version catalog Ref: https://developer.android.com/build/migrate-to-catalogs Signed-off-by: Aayush Gupta --- app/build.gradle.kts | 163 +++++++++++++++++--------------------- build.gradle.kts | 10 +-- gradle/libs.versions.toml | 130 ++++++++++++++++++++++++++++++ 3 files changed, 206 insertions(+), 97 deletions(-) create mode 100644 gradle/libs.versions.toml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4bbb8ad93..e5f9ce3e4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -4,11 +4,11 @@ */ plugins { - id("com.android.application") - id("kotlin-android") - id("kotlin-kapt") - id("kotlin-parcelize") - id("org.sonarqube") + alias(libs.plugins.android.application) + alias(libs.plugins.jetbrains.kotlin.android) + alias(libs.plugins.jetbrains.kotlin.kapt) + alias(libs.plugins.jetbrains.kotlin.parcelize) + alias(libs.plugins.sonarqube) checkstyle } @@ -126,28 +126,14 @@ android { } } -val checkstyleVersion = "10.12.1" - -val androidxLifecycleVersion = "2.6.2" -val androidxRoomVersion = "2.6.1" -val androidxWorkVersion = "2.8.1" - -val stateSaverVersion = "1.4.1" -val exoPlayerVersion = "2.18.7" -val googleAutoServiceVersion = "1.1.1" -val groupieVersion = "2.10.1" -val markwonVersion = "4.6.2" - -val leakCanaryVersion = "2.12" -val stethoVersion = "1.6.0" - +// Custom dependency configuration for ktlint val ktlint by configurations.creating checkstyle { configDirectory = rootProject.file("checkstyle") isIgnoreFailures = false isShowViolations = true - toolVersion = checkstyleVersion + toolVersion = libs.versions.checkstyle.get() } tasks.register("runCheckstyle") { @@ -208,113 +194,106 @@ sonar { dependencies { /** Desugaring **/ - coreLibraryDesugaring("com.android.tools:desugar_jdk_libs_nio:2.0.4") + coreLibraryDesugaring(libs.android.desugar) /** NewPipe libraries **/ - implementation("com.github.TeamNewPipe:nanojson:e9d656ddb49a412a5a0a5d5ef20ca7ef09549996") - // WORKAROUND: if you get errors with the NewPipeExtractor dependency, replace `v0.24.3` with - // 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. - implementation("com.github.TeamNewPipe:NewPipeExtractor:0023b22095a2d62a60cdfc87f4b5cd85c8b266c3") - implementation("com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0") + implementation(libs.newpipe.nanojson) + implementation(libs.newpipe.extractor) + implementation(libs.newpipe.filepicker) /** Checkstyle **/ - checkstyle("com.puppycrawl.tools:checkstyle:$checkstyleVersion") - ktlint("com.pinterest:ktlint:0.45.2") + checkstyle(libs.puppycrawl.checkstyle) + ktlint(libs.pinterest.ktlint) /** AndroidX **/ - implementation("androidx.appcompat:appcompat:1.7.1") - implementation("androidx.cardview:cardview:1.0.0") - implementation("androidx.constraintlayout:constraintlayout:2.1.4") - implementation("androidx.core:core-ktx:1.12.0") - implementation("androidx.documentfile:documentfile:1.0.1") - implementation("androidx.fragment:fragment-ktx:1.6.2") - implementation("androidx.lifecycle:lifecycle-livedata-ktx:$androidxLifecycleVersion") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$androidxLifecycleVersion") - implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.1.0") - implementation("androidx.media:media:1.7.0") - implementation("androidx.preference:preference:1.2.1") - implementation("androidx.recyclerview:recyclerview:1.3.2") - implementation("androidx.room:room-runtime:$androidxRoomVersion") - implementation("androidx.room:room-rxjava3:$androidxRoomVersion") - kapt("androidx.room:room-compiler:$androidxRoomVersion") - implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") - // Newer version specified to prevent accessibility regressions with RecyclerView, see: - // https://developer.android.com/jetpack/androidx/releases/viewpager2#1.1.0-alpha01 - implementation("androidx.viewpager2:viewpager2:1.1.0-beta02") - implementation("androidx.work:work-runtime-ktx:$androidxWorkVersion") - implementation("androidx.work:work-rxjava3:$androidxWorkVersion") - implementation("com.google.android.material:material:1.11.0") - implementation("androidx.webkit:webkit:1.9.0") + implementation(libs.androidx.appcompat) + implementation(libs.androidx.cardview) + implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.core) + implementation(libs.androidx.documentfile) + implementation(libs.androidx.fragment) + implementation(libs.androidx.lifecycle.livedata) + implementation(libs.androidx.lifecycle.viewmodel) + implementation(libs.androidx.localbroadcastmanager) + implementation(libs.androidx.media) + implementation(libs.androidx.preference) + implementation(libs.androidx.recyclerview) + implementation(libs.androidx.room.runtime) + implementation(libs.androidx.room.rxjava3) + kapt(libs.androidx.room.compiler) + implementation(libs.androidx.swiperefreshlayout) + implementation(libs.androidx.viewpager2) + implementation(libs.androidx.work.runtime) + implementation(libs.androidx.work.rxjava3) + implementation(libs.google.android.material) + implementation(libs.androidx.webkit) /** Third-party libraries **/ - implementation("com.github.livefront:bridge:v2.0.2") - implementation("com.evernote:android-state:$stateSaverVersion") - kapt("com.evernote:android-state-processor:$stateSaverVersion") + implementation(libs.livefront.bridge) + implementation(libs.evernote.statesaver.core) + kapt(libs.evernote.statesaver.compiler) // HTML parser - implementation("org.jsoup:jsoup:1.17.2") + implementation(libs.jsoup) // HTTP client - implementation("com.squareup.okhttp3:okhttp:4.12.0") + implementation(libs.squareup.okhttp) // Media player - implementation("com.google.android.exoplayer:exoplayer-core:$exoPlayerVersion") - implementation("com.google.android.exoplayer:exoplayer-dash:$exoPlayerVersion") - implementation("com.google.android.exoplayer:exoplayer-database:$exoPlayerVersion") - implementation("com.google.android.exoplayer:exoplayer-datasource:$exoPlayerVersion") - implementation("com.google.android.exoplayer:exoplayer-hls:$exoPlayerVersion") - implementation("com.google.android.exoplayer:exoplayer-smoothstreaming:$exoPlayerVersion") - implementation("com.google.android.exoplayer:exoplayer-ui:$exoPlayerVersion") - implementation("com.google.android.exoplayer:extension-mediasession:$exoPlayerVersion") + implementation(libs.google.exoplayer.core) + implementation(libs.google.exoplayer.dash) + implementation(libs.google.exoplayer.database) + implementation(libs.google.exoplayer.datasource) + implementation(libs.google.exoplayer.hls) + implementation(libs.google.exoplayer.mediasession) + implementation(libs.google.exoplayer.smoothstreaming) + implementation(libs.google.exoplayer.ui) // Metadata generator for service descriptors - compileOnly("com.google.auto.service:auto-service-annotations:$googleAutoServiceVersion") - kapt("com.google.auto.service:auto-service:$googleAutoServiceVersion") + compileOnly(libs.google.autoservice.annotations) + kapt(libs.google.autoservice.compiler) // Manager for complex RecyclerView layouts - implementation("com.github.lisawray.groupie:groupie:$groupieVersion") - implementation("com.github.lisawray.groupie:groupie-viewbinding:$groupieVersion") + implementation(libs.lisawray.groupie.core) + implementation(libs.lisawray.groupie.viewbinding) // Image loading - //noinspection NewerVersionAvailable,GradleDependency --> 2.8 is the last version, not 2.71828! - implementation("com.squareup.picasso:picasso:2.8") + implementation(libs.squareup.picasso) // Markdown library for Android - implementation("io.noties.markwon:core:$markwonVersion") - implementation("io.noties.markwon:linkify:$markwonVersion") + implementation(libs.noties.markwon.core) + implementation(libs.noties.markwon.linkify) // Crash reporting - implementation("ch.acra:acra-core:5.11.3") + implementation(libs.acra.core) // Properly restarting - implementation("com.jakewharton:process-phoenix:2.1.2") + implementation(libs.jakewharton.phoenix) // Reactive extensions for Java VM - implementation("io.reactivex.rxjava3:rxjava:3.1.8") - implementation("io.reactivex.rxjava3:rxandroid:3.0.2") + implementation(libs.reactivex.rxjava) + implementation(libs.reactivex.rxandroid) // RxJava binding APIs for Android UI widgets - implementation("com.jakewharton.rxbinding4:rxbinding:4.0.0") + implementation(libs.jakewharton.rxbinding) // Date and time formatting - implementation("org.ocpsoft.prettytime:prettytime:5.0.8.Final") + implementation(libs.ocpsoft.prettytime) /** Debugging **/ // Memory leak detection - debugImplementation("com.squareup.leakcanary:leakcanary-object-watcher-android:$leakCanaryVersion") - debugImplementation("com.squareup.leakcanary:plumber-android:$leakCanaryVersion") - debugImplementation("com.squareup.leakcanary:leakcanary-android-core:$leakCanaryVersion") + debugImplementation(libs.squareup.leakcanary.watcher) + debugImplementation(libs.squareup.leakcanary.plumber) + debugImplementation(libs.squareup.leakcanary.core) // Debug bridge for Android - debugImplementation("com.facebook.stetho:stetho:$stethoVersion") - debugImplementation("com.facebook.stetho:stetho-okhttp3:$stethoVersion") + debugImplementation(libs.facebook.stetho.core) + debugImplementation(libs.facebook.stetho.okhttp3) /** Testing **/ - testImplementation("junit:junit:4.13.2") - testImplementation("org.mockito:mockito-core:5.6.0") + testImplementation(libs.junit) + testImplementation(libs.mockito.core) - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test:runner:1.5.2") - androidTestImplementation("androidx.room:room-testing:$androidxRoomVersion") - androidTestImplementation("org.assertj:assertj-core:3.24.2") + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.runner) + androidTestImplementation(libs.androidx.room.testing) + androidTestImplementation(libs.assertj.core) } diff --git a/build.gradle.kts b/build.gradle.kts index d08a3cda5..e79ccc3e0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,9 +4,9 @@ */ plugins { - id("com.android.application") version "8.13.0" apply false - id("org.jetbrains.kotlin.android") version "1.9.25" apply false - id("org.jetbrains.kotlin.kapt") version "1.9.25" apply false - id("org.jetbrains.kotlin.plugin.parcelize") version "1.9.25" apply false - id("org.sonarqube") version "4.0.0.2929" apply false + alias(libs.plugins.android.application) apply false + alias(libs.plugins.jetbrains.kotlin.android) apply false + alias(libs.plugins.jetbrains.kotlin.kapt) apply false + alias(libs.plugins.jetbrains.kotlin.parcelize) apply false + alias(libs.plugins.sonarqube) apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 000000000..f0718d4fb --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,130 @@ +# +# SPDX-FileCopyrightText: 2025 NewPipe e.V. +# SPDX-License-Identifier: GPL-3.0-or-later +# + +[versions] +acra = "5.11.3" +agp = "8.13.0" +appcompat = "1.7.1" +assertj = "3.24.2" +autoservice = "1.1.1" +bridge = "v2.0.2" +cardview = "1.0.0" +checkstyle = "10.12.1" +constraintlayout = "2.1.4" +core = "1.12.0" +desugar = "2.0.4" +documentfile = "1.0.1" +exoplayer = "2.18.7" +extractor = "0023b22095a2d62a60cdfc87f4b5cd85c8b266c3" +filepicker = "5.0.0" +fragment = "1.6.2" +groupie = "2.10.1" +jsoup = "1.17.2" +junit = "4.13.2" +junit-ext = "1.1.5" +kotlin = "1.9.25" +ktlint = "0.45.2" +leakcanary = "2.12" +lifecycle = "2.6.2" +localbroadcastmanager = "1.1.0" +markwon = "4.6.2" +material = "1.11.0" +media = "1.7.0" +mockitoCore = "5.6.0" +nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" +okhttp = "4.12.0" +phoenix = "2.1.2" +#noinspection NewerVersionAvailable,GradleDependency --> 2.8 is the last version, not 2.71828! +picasso = "2.8" +preference = "1.2.1" +prettytime = "5.0.8.Final" +recyclerview = "1.3.2" +room = "2.6.1" +runner = "1.5.2" +rxandroid = "3.0.2" +rxbinding = "4.0.0" +rxjava = "3.1.8" +sonarqube = "4.0.0.2929" +statesaver = "1.4.1" +stetho = "1.6.0" +swiperefreshlayout = "1.1.0" +# Newer version specified to prevent accessibility regressions with RecyclerView +# see: https://developer.android.com/jetpack/androidx/releases/viewpager2#1.1.0-alpha01 +viewpager2 = "1.1.0-beta02" +webkit = "1.9.0" +work = "2.8.1" + +[libraries] +acra-core = { module = "ch.acra:acra-core", version.ref = "acra" } +android-desugar = { module = "com.android.tools:desugar_jdk_libs_nio", version.ref = "desugar" } +androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } +androidx-cardview = { module = "androidx.cardview:cardview", version.ref = "cardview" } +androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout" } +androidx-core = { module = "androidx.core:core-ktx", version.ref = "core" } +androidx-documentfile = { module = "androidx.documentfile:documentfile", version.ref = "documentfile" } +androidx-fragment = { module = "androidx.fragment:fragment-ktx", version.ref = "fragment" } +androidx-junit = { module = "androidx.test.ext:junit", version.ref = "junit-ext" } +androidx-lifecycle-livedata = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "lifecycle" } +androidx-lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" } +androidx-localbroadcastmanager = { module = "androidx.localbroadcastmanager:localbroadcastmanager", version.ref = "localbroadcastmanager" } +androidx-media = { module = "androidx.media:media", version.ref = "media" } +androidx-preference = { module = "androidx.preference:preference", version.ref = "preference" } +androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" } +androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } +androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } +androidx-room-rxjava3 = { module = "androidx.room:room-rxjava3", version.ref = "room" } +androidx-room-testing = { module = "androidx.room:room-testing", version.ref = "room" } +androidx-runner = { module = "androidx.test:runner", version.ref = "runner" } +androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "swiperefreshlayout" } +androidx-viewpager2 = { module = "androidx.viewpager2:viewpager2", version.ref = "viewpager2" } +androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } +androidx-work-runtime = { module = "androidx.work:work-runtime-ktx", version.ref = "work" } +androidx-work-rxjava3 = { module = "androidx.work:work-rxjava3", version.ref = "work" } +assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertj" } +evernote-statesaver-compiler = { module = "com.evernote:android-state-processor", version.ref = "statesaver" } +evernote-statesaver-core = { module = "com.evernote:android-state", version.ref = "statesaver" } +facebook-stetho-core = { module = "com.facebook.stetho:stetho", version.ref = "stetho" } +facebook-stetho-okhttp3 = { module = "com.facebook.stetho:stetho-okhttp3", version.ref = "stetho" } +google-android-material = { module = "com.google.android.material:material", version.ref = "material" } +google-autoservice-annotations = { module = "com.google.auto.service:auto-service-annotations", version.ref = "autoservice" } +google-autoservice-compiler = { module = "com.google.auto.service:auto-service", version.ref = "autoservice" } +google-exoplayer-core = { module = "com.google.android.exoplayer:exoplayer-core", version.ref = "exoplayer" } +google-exoplayer-dash = { module = "com.google.android.exoplayer:exoplayer-dash", version.ref = "exoplayer" } +google-exoplayer-database = { module = "com.google.android.exoplayer:exoplayer-database", version.ref = "exoplayer" } +google-exoplayer-datasource = { module = "com.google.android.exoplayer:exoplayer-datasource", version.ref = "exoplayer" } +google-exoplayer-hls = { module = "com.google.android.exoplayer:exoplayer-hls", version.ref = "exoplayer" } +google-exoplayer-mediasession = { module = "com.google.android.exoplayer:extension-mediasession", version.ref = "exoplayer" } +google-exoplayer-smoothstreaming = { module = "com.google.android.exoplayer:exoplayer-smoothstreaming", version.ref = "exoplayer" } +google-exoplayer-ui = { module = "com.google.android.exoplayer:exoplayer-ui", version.ref = "exoplayer" } +jakewharton-phoenix = { module = "com.jakewharton:process-phoenix", version.ref = "phoenix" } +jakewharton-rxbinding = { module = "com.jakewharton.rxbinding4:rxbinding", version.ref = "rxbinding" } +jsoup = { module = "org.jsoup:jsoup", version.ref = "jsoup" } +junit = { module = "junit:junit", version.ref = "junit" } +lisawray-groupie-core = { module = "com.github.lisawray.groupie:groupie", version.ref = "groupie" } +lisawray-groupie-viewbinding = { module = "com.github.lisawray.groupie:groupie-viewbinding", version.ref = "groupie" } +livefront-bridge = { module = "com.github.livefront:bridge", version.ref = "bridge" } +mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockitoCore" } +newpipe-extractor = { module = "com.github.TeamNewPipe:NewPipeExtractor", version.ref = "extractor" } +newpipe-filepicker = { module = "com.github.TeamNewPipe:NoNonsense-FilePicker", version.ref = "filepicker" } +newpipe-nanojson = { module = "com.github.TeamNewPipe:nanojson", version.ref = "nanojson" } +noties-markwon-core = { module = "io.noties.markwon:core", version.ref = "markwon" } +noties-markwon-linkify = { module = "io.noties.markwon:linkify", version.ref = "markwon" } +ocpsoft-prettytime = { module = "org.ocpsoft.prettytime:prettytime", version.ref = "prettytime" } +pinterest-ktlint = { module = "com.pinterest:ktlint", version.ref = "ktlint" } +puppycrawl-checkstyle = { module = "com.puppycrawl.tools:checkstyle", version.ref = "checkstyle" } +reactivex-rxandroid = { module = "io.reactivex.rxjava3:rxandroid", version.ref = "rxandroid" } +reactivex-rxjava = { module = "io.reactivex.rxjava3:rxjava", version.ref = "rxjava" } +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" } +squareup-leakcanary-watcher = { module = "com.squareup.leakcanary:leakcanary-object-watcher-android", version.ref = "leakcanary" } +squareup-okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } +squareup-picasso = { module = "com.squareup.picasso:picasso", version.ref = "picasso" } + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +jetbrains-kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } +jetbrains-kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } +sonarqube = { id = "org.sonarqube", version.ref = "sonarqube" } From 061ce870aca24005e4fbd301887aceb1ac6eeb72 Mon Sep 17 00:00:00 2001 From: Jie Li Date: Tue, 26 Nov 2024 18:32:44 +0000 Subject: [PATCH 010/190] Gradle script to enforce dependencies order Signed-off-by: Aayush Gupta --- app/build.gradle.kts | 4 ++- app/check-dependencies.gradle.kts | 59 +++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 app/check-dependencies.gradle.kts diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e5f9ce3e4..8dd1594f2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -12,6 +12,8 @@ plugins { checkstyle } +apply(from = "check-dependencies.gradle.kts") + val gitWorkingBranch = providers.exec { commandLine("git", "rev-parse", "--abbrev-ref", "HEAD") }.standardOutput.asText.map { it.trim() } @@ -180,7 +182,7 @@ afterEvaluate { if (!System.getProperties().containsKey("skipFormatKtlint")) { dependsOn("formatKtlint") } - dependsOn("runCheckstyle", "runKtlint") + dependsOn("runCheckstyle", "runKtlint", "checkDependenciesOrder") } } diff --git a/app/check-dependencies.gradle.kts b/app/check-dependencies.gradle.kts new file mode 100644 index 000000000..fc77148db --- /dev/null +++ b/app/check-dependencies.gradle.kts @@ -0,0 +1,59 @@ +/* + * SPDX-FileCopyrightText: 2024 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +tasks.register("checkDependenciesOrder") { + group = "verification" + description = "Checks that each section in libs.versions.toml is sorted alphabetically" + + val tomlFile = file("../gradle/libs.versions.toml") + + doLast { + if (!tomlFile.exists()) { + throw GradleException("TOML file not found") + } + + val lines = tomlFile.readLines() + val nonSortedBlocks = mutableListOf>() + var currentBlock = mutableListOf() + var prevLine = "" + var prevIndex = 0 + + lines.forEachIndexed { lineIndex, line -> + if (line.trim().isNotEmpty() && !line.startsWith("#")) { + if (line.startsWith("[")) { + prevLine = "" + } else { + val currIndex = lineIndex + 1 + if (prevLine > line) { + if (currentBlock.isNotEmpty() && currentBlock.last() == "$prevIndex: $prevLine") { + currentBlock.add("$currIndex: $line") + } else { + if (currentBlock.isNotEmpty()) { + nonSortedBlocks.add(currentBlock) + currentBlock = mutableListOf() + } + currentBlock.add("$prevIndex: $prevLine") + currentBlock.add("$currIndex: $line") + } + } + prevLine = line + prevIndex = lineIndex + 1 + } + } + } + + if (currentBlock.isNotEmpty()) { + nonSortedBlocks.add(currentBlock) + } + + if (nonSortedBlocks.isNotEmpty()) { + throw GradleException( + "The following lines were not sorted:\n" + + nonSortedBlocks.joinToString("\n\n") { it.joinToString("\n") } + ) + } + } +} From 1bef2fdc253c5d7a6574258a06f6da071ed4f5ad Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 16 Oct 2025 22:27:56 +0800 Subject: [PATCH 011/190] Drop deprecated non-working archivesBaseName property Signed-off-by: Aayush Gupta --- app/build.gradle.kts | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8dd1594f2..e4c186e50 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -60,7 +60,6 @@ android { } else { applicationIdSuffix = ".debug.$normalizedWorkingBranch" resValue("string", "app_name", "NewPipe $workingBranch") - setProperty("archivesBaseName", "NewPipe_$normalizedWorkingBranch") } } @@ -68,12 +67,10 @@ android { System.getProperty("packageSuffix")?.let { suffix -> applicationIdSuffix = suffix resValue("string", "app_name", "NewPipe $suffix") - setProperty("archivesBaseName", "NewPipe_" + System.getProperty("packageSuffix")) } isMinifyEnabled = true isShrinkResources = false // disabled to fix F-Droid"s reproducible build proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") - setProperty("archivesBaseName", "app") } } From 22ee01bcfbb8655a65fb6ee6f8373cec54987a4f Mon Sep 17 00:00:00 2001 From: TransZAllen Date: Thu, 18 Sep 2025 20:43:14 +0800 Subject: [PATCH 012/190] refactor(ttml): improve extractText() to preserve spaces and special characters - Replaced `text()` with `getWholeText()`: - avoids losing whitespaces at the beginning, end, or within the text; - avoids merging two or more consecutive spaces into a single space ' '; - avoids converting '\r', '\n', and '\r\n' within the text into a single space ' '; For subtitle conversion, the goal is to preserve every character exactly as intended by the subtitle author. - Normalized tabs, line breaks, and other special characters for SRT-safe output. - Added comprehensive unit tests in `SrtFromTtmlWriterTest.java`, including cases for simple and nested tags. --- .../newpipe/streams/SrtFromTtmlWriter.java | 169 ++++++++- .../streams/SrtFromTtmlWriterTest.java | 320 ++++++++++++++++++ 2 files changed, 488 insertions(+), 1 deletion(-) create mode 100644 app/src/test/java/org/schabi/newpipe/streams/SrtFromTtmlWriterTest.java diff --git a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java index 5f43185c6..ad1e4d13a 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java +++ b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java @@ -54,6 +54,157 @@ public class SrtFromTtmlWriter { out.write(text.getBytes(charset)); } + /** + * Decode XML or HTML entities into their actual (literal) characters. + * + * TTML is XML-based, so text nodes may contain escaped entities + * instead of direct characters. For example: + * + * "&" → "&" + * "<" → "<" + * ">" → ">" + * " " → "\t" (TAB) + * " " ( ) → "\n" (LINE FEED) + * + * XML files cannot contain characters like "<", ">", "&" directly, + * so they must be represented using their entity-encoded forms. + * + * Jsoup sometimes leaves nested or encoded entities unresolved + * (e.g. inside

text nodes in TTML files), so this function + * acts as a final “safety net” to ensure all entities are decoded + * before further normalization. + * + * Character representation layers for reference: + * - Literal characters: <, >, & + * → appear in runtime/output text (e.g. final SRT output) + * - Escaped entities: <, >, & + * → appear in XML/HTML/TTML source files + * - Numeric entities:  , , + * → appear mainly in XML/TTML files (also valid in HTML) + * for non-printable or special characters + * - Unicode escapes: \u00A0 (Java/Unicode internal form) + * → appear only in Java source code (NOT valid in XML) + * + * XML entities include both named (&, <) and numeric + * ( ,  ) forms. + * + * @param encodedEntities The raw text fragment possibly containing + * encoded XML entities. + * @return A decoded string where all entities are replaced by their + * actual (literal) characters. + */ + private String decodeXmlEntities(final String encodedEntities) { + final String decoded = Parser.unescapeEntities(encodedEntities, true); + return decoded; + } + + /** + * Handle rare XML entity characters like LF: (`\n`) + * , CR: (`\r`) and CRLF: (`\r\n`). + * + * These are technically valid in TTML (XML allows them) + * but unusual in practice, since most TTML line breaks + * are represented as
tags instead. + * As a defensive approach, we normalize them: + * + * - Windows (\r\n), macOS (\r), and Unix (\n) → unified SRT NEW_LINE (\r\n) + * + * Although well-formed TTML normally encodes line breaks + * as
tags, some auto-generated or malformed TTML files + * may embed literal newline entities ( , ). This + * normalization ensures these cases render properly in SRT + * players instead of breaking the subtitle structure. + * + * @param text To be normalized text with actual characters. + * @return Unified SRT NEW_LINE converted from all kinds of line breaks. + */ + private String normalizeLineBreakForSrt(final String text) { + String cleaned = text; + + // NOTE: + // The order of newline replacements must NOT change, + // or duplicated line breaks (e.g. \r\n → \n\n) will occur. + cleaned = cleaned.replace("\r\n", "\n") + .replace("\r", "\n"); + + cleaned = cleaned.replace("\n", NEW_LINE); + + return cleaned; + } + + private String normalizeForSrt(final String actualText) { + String cleaned = actualText; + + // Replace non-breaking space (\u00A0) with regular space ' '(\u0020). + // - YouTube TTML subtitles use both regular spaces (\u0020) + // and non-breaking spaces (\u00A0). + // - SRT subtitles only support regular spaces (\u0020), + // so \u00A0 may cause display issues. + // - \u00A0 and \u0020 are visually identical (i.e., they both + // appear as spaces ' '), but they differ in Unicode encoding, + // leading to test failures (e.g., ComparisonFailure). + // - Convert \u00A0 to \u0020 to ensure consistency in subtitle + // formatting. + // - References: + // - Unicode General Punctuation: https://unicode.org/charts/PDF/U2000.pdf + // - TTML Spec: https://www.w3.org/TR/ttml2/ + // - SRT Format: https://en.wikipedia.org/wiki/SubRip + cleaned = cleaned.replace('\u00A0', ' ') // Non-breaking space + .replace('\u202F', ' ') // Narrow no-break space + .replace('\u205F', ' ') // Medium mathematical space + .replace('\u3000', ' ') // Ideographic space + // \u2000 ~ \u200A are whitespace characters (e.g., + // en space, em space), replaced with regular space (\u0020). + .replaceAll("[\\u2000-\\u200A]", " "); // Whitespace characters + + // \u200B ~ \u200F are a range of non-spacing characters + // (e.g., zero-width space, zero-width non-joiner, etc.), + // which have no effect in *.SRT files and may cause + // display issues. + // These characters are invisible to the human eye, and + // they still exist in the encoding, so they need to be + // removed. + // After removal, the actual content becomes completely + // empty "", meaning there are no characters left, just + // an empty space, which helps avoid formatting issues + // in subtitles. + cleaned = cleaned.replaceAll("[\\u200B-\\u200F]", ""); // Non-spacing characters + + // Remove control characters (\u0000 ~ \u001F, except + // \n, \r, \t). + // - These are ASCII C0 control codes (e.g. \u0001 SOH, + // \u0008 BS, \u001F US), invisible and irrelevant in + // subtitles, may cause square boxes (?) in players. + // - Reference: + // Unicode Basic Latin (https://unicode.org/charts/PDF/U0000.pdf) + // ASCII Control (https://en.wikipedia.org/wiki/ASCII#Control_characters) + cleaned = cleaned.replaceAll("[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F]", ""); + + // Reasoning: + // - subtitle files generally don't require tabs for alignment. + // - Tabs can be displayed with varying widths across different + // editors or platforms, which may cause display issues. + // - Replace it with a single space for consistent display + // across different editors or platforms. + cleaned = cleaned.replace('\t', ' '); + + cleaned = normalizeLineBreakForSrt(cleaned); + + return cleaned; + } + + private String sanitizeFragment(final String raw) { + if (null == raw) { + return ""; + } + + final String actualCharacters = decodeXmlEntities(raw); + + final String srtSafeText = normalizeForSrt(actualCharacters); + + return srtSafeText; + } + // CHECKSTYLE:OFF checkstyle:JavadocStyle // checkstyle does not understand that span tags are inside a code block /** @@ -67,9 +218,25 @@ public class SrtFromTtmlWriter { * @param node the current node to process * @param text the {@link StringBuilder} to append the extracted text to */ + // -------------------------------------------------------------------- + // [INTERNAL NOTE] TTML text layer explanation + // + // TTML parsing involves multiple text "layers": + // 1. Raw XML entities (e.g., <,  ) are decoded by Jsoup. + // 2. extractText() works on DOM TextNodes (already parsed strings). + // 3. sanitizeFragment() decodes remaining entities and fixes + // Unicode quirks. + // 4. normalizeForSrt() ensures literal text is safe for SRT output. + // + // In short: + // Jsoup handles XML-level syntax, + // our code handles text-level normalization for subtitles. + // -------------------------------------------------------------------- private void extractText(final Node node, final StringBuilder text) { if (node instanceof TextNode textNode) { - text.append((textNode).text()); + String rawTtmlFragment = textNode.getWholeText(); + String srtContent = sanitizeFragment(rawTtmlFragment); + text.append(srtContent); } else if (node instanceof Element element) { //
is a self-closing HTML tag used to insert a line break. if (element.tagName().equalsIgnoreCase("br")) { diff --git a/app/src/test/java/org/schabi/newpipe/streams/SrtFromTtmlWriterTest.java b/app/src/test/java/org/schabi/newpipe/streams/SrtFromTtmlWriterTest.java new file mode 100644 index 000000000..755724f68 --- /dev/null +++ b/app/src/test/java/org/schabi/newpipe/streams/SrtFromTtmlWriterTest.java @@ -0,0 +1,320 @@ +package org.schabi.newpipe.streams; + +import org.junit.Test; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.nodes.Node; +import org.jsoup.parser.Parser; +import java.io.ByteArrayInputStream; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; +import static org.junit.Assert.assertEquals; + +/** + * Unit tests for {@link SrtFromTtmlWriter}. + * + * Tests focus on {@code extractText()} and its handling of TTML

elements. + * Note: + * - Uses reflection to call the private {@code extractText()} method. + * - Update {@code EXTRACT_TEXT_METHOD} if renamed. + * + * --- + * NOTE ABOUT ENTITIES VS UNICODE ESCAPES + * + * - In short: + * * UNICODE ESCAPES → used in Java source (e.g. SrtFromTtmlWriter.java) + * * ENTITIES → used in TTML strings (this test file) + * + * - TTML is an XML-based format. Real TTML subtitles often encode special + * characters as XML entities (named or numeric), e.g.: + * & → '&' (\u0026) + * < → '<' (\u003C) + * → tab (\u0009) + * → line feed (\u000A) + * → carriage return (\u000D) + * + * - Java source code uses **Unicode escapes** (e.g. "\u00A0") which are resolved + * at compile time, so they do not represent real XML entities. + * + * - Purpose of these tests: + * We simulate *real TTML input* as NewPipe receives it — i.e., strings that + * still contain encoded XML entities ( , , , etc.). + * The production code (`decodeXmlEntities()`) must convert these into their + * actual Unicode characters before normalization. + */ +public class SrtFromTtmlWriterTest { + private static final String TTML_WRAPPER_START = "

"; + private static final String TTML_WRAPPER_END = "
"; + private static final String EXTRACT_TEXT_METHOD = "extractText"; + // Please keep the same definition from `SrtFromTtmlWriter` class. + private static final String NEW_LINE = "\r\n"; + + /* + * TTML example for simple paragraph

without nested tags. + *

Hello World!

+ */ + private static final String SIMPLE_TTML = "

Hello World!

"; + /** + * TTML example with nested tags with
. + *

Hello
World!

+ */ + private static final String NESTED_TTML = "

" + + "Hello
World!

"; + + /** + * TTML example with HTML entities. + * < → <, > → >, & → &, " → ", ' → ' + * ' → ' + *   → ' ' + */ + private static final String ENTITY_TTML = "

" + + "<tag> & "text"''''" + + "  " + + "

"; + /** + * TTML example with special characters: + * - Spaces appear at the beginning and end of the text. + * - Spaces are also present within the text (not just at the edges). + * - The text includes various HTML entities such as  , + * &, <, >, etc. + *   → non-breaking space (Unicode: '\u00A0', Entity: ' ') + */ + private static final String SPECIAL_TTML = "

" + + " ~~-Hello  &&<<>>World!! " + + "

"; + + /** + * TTML example with characters: tab. + * → \t + * They are separated by '+' for clarity. + */ + private static final String TAB_TTML = "

" + + " + + " + + "

"; + + /** + * TTML example with line endings. + * → \r + */ + private static final String LINE_ENDING_0_TTML = "

" + + " + + " + + "

"; + // → \n + private static final String LINE_ENDING_1_TTML = "

" + + " + + " + + "

"; + private static final String LINE_ENDING_2_TTML = + "

" + + " + + " + + "

"; + + /** + * TTML example with control characters. + * For example: + *  → \u0001 + *  → \u001F + * + * These control characters, if included as raw Unicode(e.g. '\u0001'), + * are either invalid in XML or rendered as '?' when processed. + * To avoid issues, they should be encoded(e.g. '') in TTML file. + * + * - Reference: + * Unicode Basic Latin (https://unicode.org/charts/PDF/U0000.pdf), + * ASCII Control (https://en.wikipedia.org/wiki/ASCII#Control_characters). + * and the defination of these characters can be known. + */ + private static final String CONTROL_CHAR_TTML = "

" + + "++ + ++" + + "

"; + + + + private static final String EMPTY_TTML = "

" + + "" + + "

"; + + /** + * TTML example with Unicode space characters. + * These characters are encoded using character references + * (&#xXXXX;). + * + * Includes: + * ( ) '\u202F' → Narrow no-break space + * ( ) '\u205F' → Medium mathematical space + * ( ) '\u3000' → Ideographic space + * '\u2000' ~ '\u200A' are whitespace characters: + * ( ) '\u2000' → En quad + * ( ) '\u2002' → En space + * ( ) '\u200A' → Hair space + * + * Each character is separated by '+' for clarity. + */ + private static final String UNICODE_SPACE_TTML = "

" + + " + + + + + " + + "

"; + + /** + * TTML example with non-spacing (invisible) characters. + * These are encoded using character references (&#xXXXX;). + * + * Includes: + * (​)'\u200B' → Zero-width space (ZWSP) + * (‎)'\u200E' → Left-to-right mark (LRM) + * (‏)'\u200F' → Right-to-left mark (RLM) + * + * They don't display any characters to the human eye. + * '+' is used between them for clarity in test output. + */ + private static final String NON_SPACING_TTML = "

" + + "​+‎+‏" + + "

"; + + /** + * Parses TTML string into a JSoup Document and selects the first

element. + * + * @param ttmlContent TTML content (e.g.,

...

) + * @return the first

element + * @throws Exception if parsing or reflection fails + */ + private Element parseTtmlParagraph(final String ttmlContent) throws Exception { + final String ttml = TTML_WRAPPER_START + ttmlContent + TTML_WRAPPER_END; + final Document doc = Jsoup.parse( + new ByteArrayInputStream(ttml.getBytes(StandardCharsets.UTF_8)), + "UTF-8", "", Parser.xmlParser()); + return doc.select("body > div > p").first(); + } + + /** + * Invokes private extractText method via reflection. + * + * @param writer SrtFromTtmlWriter instance + * @param paragraph

element to extract text from + * @param text StringBuilder to store extracted text + * @throws Exception if reflection fails + */ + private void invokeExtractText(final SrtFromTtmlWriter writer, final Element paragraph, + final StringBuilder text) throws Exception { + final Method method = writer.getClass() + .getDeclaredMethod(EXTRACT_TEXT_METHOD, Node.class, StringBuilder.class); + method.setAccessible(true); + method.invoke(writer, paragraph, text); + } + + private String extractTextFromTtml(final String ttmlInput) throws Exception { + final Element paragraph = parseTtmlParagraph(ttmlInput); + final StringBuilder text = new StringBuilder(); + final SrtFromTtmlWriter writer = new SrtFromTtmlWriter(null, false); + invokeExtractText(writer, paragraph, text); + + final String actualText = text.toString(); + return actualText; + } + + @Test + public void testExtractTextSimpleParagraph() throws Exception { + final String expected = "Hello World!"; + final String actual = extractTextFromTtml(SIMPLE_TTML); + assertEquals(expected, actual); + } + + @Test + public void testExtractTextNestedTags() throws Exception { + final String expected = "Hello\r\nWorld!"; + final String actual = extractTextFromTtml(NESTED_TTML); + assertEquals(expected, actual); + } + + @Test + public void testExtractTextWithEntity() throws Exception { + final String expected = " & \"text\"'''' "; + final String actual = extractTextFromTtml(ENTITY_TTML); + assertEquals(expected, actual); + } + + @Test + public void testExtractTextWithSpecialCharacters() throws Exception { + final String expected = " ~~-Hello &&<<>>World!! "; + final String actual = extractTextFromTtml(SPECIAL_TTML); + assertEquals(expected, actual); + } + + @Test + public void testExtractTextWithTab() throws Exception { + final String expected = " + + "; + final String actual = extractTextFromTtml(TAB_TTML); + assertEquals(expected, actual); + } + + @Test + public void testExtractTextWithLineEnding0() throws Exception { + final String expected = NEW_LINE + NEW_LINE + "+" + + NEW_LINE + NEW_LINE + "+" + + NEW_LINE + NEW_LINE; + final String actual = extractTextFromTtml(LINE_ENDING_0_TTML); + assertEquals(expected, actual); + } + + @Test + public void testExtractTextWithLineEnding1() throws Exception { + final String expected = NEW_LINE + NEW_LINE + "+" + + NEW_LINE + NEW_LINE + "+" + + NEW_LINE + NEW_LINE; + final String actual = extractTextFromTtml(LINE_ENDING_1_TTML); + assertEquals(expected, actual); + } + + @Test + public void testExtractTextWithLineEnding2() throws Exception { + final String expected = NEW_LINE + "+" + + NEW_LINE + "+" + + NEW_LINE; + final String actual = extractTextFromTtml(LINE_ENDING_2_TTML); + assertEquals(expected, actual); + } + + @Test + public void testExtractTextWithControlCharacters() throws Exception { + final String expected = "+++++"; + final String actual = extractTextFromTtml(CONTROL_CHAR_TTML); + assertEquals(expected, actual); + } + + /** + * Test case to ensure that extractText() does not throw an exception + * when there are no text in the TTML paragraph (i.e., the paragraph + * is empty). + * + * Note: + * In the NewPipe, *.srt files will contain empty text lines by default. + */ + @Test + public void testExtractTextWithEmpty() throws Exception { + final String expected = ""; + final String actual = extractTextFromTtml(EMPTY_TTML); + assertEquals(expected, actual); + } + + @Test + public void testExtractTextWithUnicodeSpaces() throws Exception { + final String expected = " + + + + + "; + final String actual = extractTextFromTtml(UNICODE_SPACE_TTML); + assertEquals(expected, actual); + } + + @Test + public void testExtractTextWithNonSpacingCharacters() throws Exception { + final String expected = "++"; + final String actual = extractTextFromTtml(NON_SPACING_TTML); + assertEquals(expected, actual); + } +} From 35166676716c4e84f57977945651d99b0d5f0859 Mon Sep 17 00:00:00 2001 From: TransZAllen Date: Fri, 17 Oct 2025 12:04:02 +0800 Subject: [PATCH 013/190] refactor(ttml): extract recursion into `traverseChildNodesForNestedTags()` - Extracted child-node traversal logic from `extractText()` into a helper method `traverseChildNodesForNestedTags()`. - No functional change. --- .../schabi/newpipe/streams/SrtFromTtmlWriter.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java index ad1e4d13a..bea3422fc 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java +++ b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java @@ -205,6 +205,15 @@ public class SrtFromTtmlWriter { return srtSafeText; } + // Recursively process all child nodes to ensure text inside + // nested tags (e.g., ) is also extracted. + private void traverseChildNodesForNestedTags(final Node parent, + final StringBuilder text) { + for (final Node child : parent.childNodes()) { + extractText(child, text); + } + } + // CHECKSTYLE:OFF checkstyle:JavadocStyle // checkstyle does not understand that span tags are inside a code block /** @@ -244,10 +253,8 @@ public class SrtFromTtmlWriter { text.append(NEW_LINE); } } - // Recursively process child nodes - for (final Node child : node.childNodes()) { - extractText(child, text); - } + + traverseChildNodesForNestedTags(node, text); } // CHECKSTYLE:ON From ee01ba32099558c35bf4279bd771ab8616142622 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Fri, 17 Oct 2025 16:25:51 +0800 Subject: [PATCH 014/190] Specify JDK toolchain directly Specifying JDK toolchain in the java block lets us avoid specifying same version again and again for different options while ensuring everything is on the same version Ref: https://developer.android.com/build/jdks#toolchain Signed-off-by: Aayush Gupta --- app/build.gradle.kts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e4c186e50..037c3cb53 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -18,6 +18,12 @@ val gitWorkingBranch = providers.exec { commandLine("git", "rev-parse", "--abbrev-ref", "HEAD") }.standardOutput.asText.map { it.trim() } +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + android { compileSdk = 36 namespace = "org.schabi.newpipe" @@ -87,16 +93,9 @@ android { compileOptions { // Flag to enable support for the new language APIs isCoreLibraryDesugaringEnabled = true - - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 encoding = "utf-8" } - kotlinOptions { - jvmTarget = "17" - } - sourceSets { getByName("androidTest") { assets.srcDir("$projectDir/schemas") From 1014dd563f2a2369c80a4326ff852ae6c187dcc1 Mon Sep 17 00:00:00 2001 From: litetex <40789489+litetex@users.noreply.github.com> Date: Fri, 17 Oct 2025 19:08:49 +0200 Subject: [PATCH 015/190] Correctly format player.xml Otherwise it constantly switches the attributes which makes (re) viewing changes next to impossible --- app/src/main/res/layout/player.xml | 34 +++++++++++++++--------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 4e5cd8533..9c70732f2 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -109,13 +109,13 @@ android:layout_marginEnd="8dp" android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" + android:contentDescription="@string/close" android:focusable="true" android:padding="@dimen/player_main_buttons_padding" android:scaleType="fitXY" android:src="@drawable/ic_close" android:visibility="gone" app:tint="@color/white" - android:contentDescription="@string/close" tools:ignore="RtlHardcoded" /> + tools:text="English (Original)" + tools:visibility="visible" /> @@ -371,11 +371,11 @@ android:layout_height="40dp" android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" + android:contentDescription="@string/toggle_fullscreen" android:focusable="true" android:padding="@dimen/player_main_buttons_padding" android:scaleType="fitCenter" android:src="@drawable/ic_fullscreen" - android:contentDescription="@string/toggle_fullscreen" android:visibility="gone" app:tint="@color/white" tools:ignore="RtlHardcoded" @@ -495,13 +495,13 @@ android:layout_marginStart="4dp" android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" + android:contentDescription="@string/toggle_screen_orientation" android:focusable="true" android:nextFocusUp="@id/playbackSeekBar" android:padding="@dimen/player_main_buttons_padding" android:scaleType="fitCenter" android:src="@drawable/ic_fullscreen" android:visibility="gone" - android:contentDescription="@string/toggle_screen_orientation" app:tint="@color/white" tools:ignore="RtlHardcoded" tools:visibility="visible" /> @@ -523,10 +523,10 @@ android:layout_weight="1" android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" + android:contentDescription="@string/previous_stream" android:focusable="true" android:scaleType="fitCenter" android:src="@drawable/ic_previous" - android:contentDescription="@string/previous_stream" app:tint="@color/white" /> @@ -536,9 +536,9 @@ android:layout_height="60dp" android:layout_weight="1" android:background="?attr/selectableItemBackgroundBorderless" + android:contentDescription="@string/pause" android:scaleType="fitCenter" android:src="@drawable/ic_pause" - android:contentDescription="@string/pause" app:tint="@color/white" /> @@ -599,12 +599,12 @@ android:layout_marginLeft="40dp" android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" + android:contentDescription="@string/notification_action_repeat" android:focusable="true" android:padding="10dp" android:scaleType="fitXY" android:src="@drawable/exo_controls_repeat_off" android:tint="?attr/colorAccent" - android:contentDescription="@string/notification_action_repeat" tools:ignore="RtlHardcoded" /> Date: Fri, 17 Oct 2025 19:10:10 +0200 Subject: [PATCH 016/190] Correctly name the preview --- app/src/main/res/layout/player.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 9c70732f2..321d07d3c 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -174,7 +174,7 @@ android:textStyle="bold" android:visibility="gone" tools:ignore="HardcodedText,RtlHardcoded" - tools:text="English (Original)" + tools:text="English (United States) original" tools:visibility="visible" /> Date: Fri, 17 Oct 2025 19:28:52 +0200 Subject: [PATCH 017/190] Improve the alignment of `titleTextView` and `audioTrackTextView` This fulfills the following: * both should never push content outside of the view * there should be no wasted space * `audioTrackTextView` is always aligned to the right * both should grow equally but also respect their respective contents size first Caveats: * Currently the layout weight is distributed using "NestedWeights" which require a widget to be measured twice. According to Android Studio this might cause an exponential performane impact, however there is currently just a single nested component so the effect should be not noticeable --- app/src/main/res/layout/player.xml | 117 ++++++++++++++++------------- 1 file changed, 66 insertions(+), 51 deletions(-) diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 321d07d3c..4e69bd9fa 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -119,64 +119,79 @@ tools:ignore="RtlHardcoded" /> + android:orientation="horizontal"> - + android:layout_marginTop="6dp" + android:layout_marginEnd="8dp" + android:layout_weight="1" + android:gravity="top" + android:orientation="vertical" + tools:ignore="NestedWeights,RtlHardcoded"> + + + + + + + + + + + - - - Date: Fri, 17 Oct 2025 20:15:24 +0200 Subject: [PATCH 018/190] Remove not needed viability control This is done by the parent --- .../main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java index b79ef9235..9d2126826 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java @@ -290,8 +290,6 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh binding.topControls.setFocusable(true); binding.metadataView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE); - binding.titleTextView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE); - binding.channelTextView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE); } @Override @@ -936,8 +934,6 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh fragmentListener.onFullscreenStateChanged(isFullscreen); binding.metadataView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE); - binding.titleTextView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE); - binding.channelTextView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE); binding.playerCloseButton.setVisibility(isFullscreen ? View.GONE : View.VISIBLE); setupScreenRotationButton(); } From 41981902ab0107b2c8c98334b6b800103ac53c9c Mon Sep 17 00:00:00 2001 From: litetex <40789489+litetex@users.noreply.github.com> Date: Fri, 17 Oct 2025 20:33:08 +0200 Subject: [PATCH 019/190] Limit height of wrapper --- app/src/main/res/layout/player.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 4e69bd9fa..a6a0884c7 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -167,7 +167,7 @@ Date: Sun, 19 Oct 2025 03:41:52 +1100 Subject: [PATCH 020/190] Notifications are no longer requested again after rotating the phone --- app/src/main/java/org/schabi/newpipe/App.java | 9 +++++++++ .../java/org/schabi/newpipe/util/PermissionHelper.java | 10 +++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index a8827c33e..364f62114 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -66,12 +66,21 @@ public class App extends Application { private boolean isFirstRun = false; private static App app; + private boolean notificationsRequested = false; @NonNull public static App getApp() { return app; } + public boolean getNotificationsRequested() { + return notificationsRequested; + } + + public void setNotificationsRequested() { + notificationsRequested = true; + } + @Override protected void attachBaseContext(final Context base) { super.attachBaseContext(base); diff --git a/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java b/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java index 2785afab0..969d787d7 100644 --- a/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java @@ -17,6 +17,7 @@ import androidx.appcompat.app.AlertDialog; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; +import org.schabi.newpipe.App; import org.schabi.newpipe.R; import org.schabi.newpipe.settings.NewPipeSettings; @@ -89,9 +90,12 @@ public final class PermissionHelper { && ContextCompat.checkSelfPermission(activity, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(activity, - new String[] {Manifest.permission.POST_NOTIFICATIONS}, requestCode); - return false; + if (!App.getApp().getNotificationsRequested()) { + ActivityCompat.requestPermissions(activity, + new String[]{Manifest.permission.POST_NOTIFICATIONS}, requestCode); + App.getApp().setNotificationsRequested(); + return false; + } } return true; } From 42f909936b61b2685c027d454e66c8adfca2cc3e Mon Sep 17 00:00:00 2001 From: tobigr Date: Sun, 5 Oct 2025 21:13:18 +0200 Subject: [PATCH 021/190] Bump checkstyle and make inner classes final Updating checkstyle fixed a vulnerability and fixed a final class check in version 10.12.2 for local classes without constructor. Local classes without a constructor should be marked as final. That is done in this commit. For more info see https://github.com/checkstyle/checkstyle/releases/tag/checkstyle-10.12.2 --- .../newpipe/fragments/list/search/SuggestionListAdapter.java | 3 ++- .../schabi/newpipe/settings/PeertubeInstanceListFragment.java | 3 ++- .../org/schabi/newpipe/settings/SelectChannelFragment.java | 2 +- .../org/schabi/newpipe/settings/SelectFeedGroupFragment.java | 2 +- .../org/schabi/newpipe/settings/SelectPlaylistFragment.java | 2 +- .../settings/preferencesearch/PreferenceSearchAdapter.java | 3 ++- gradle/libs.versions.toml | 2 +- 7 files changed, 10 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java index 856ba22f1..6a330be0f 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java @@ -76,7 +76,8 @@ public class SuggestionListAdapter } } - private static class SuggestionItemCallback extends DiffUtil.ItemCallback { + private static final class SuggestionItemCallback + extends DiffUtil.ItemCallback { @Override public boolean areItemsTheSame(@NonNull final SuggestionItem oldItem, @NonNull final SuggestionItem newItem) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java b/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java index 1158b3d83..81fddbcfb 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java @@ -396,7 +396,8 @@ public class PeertubeInstanceListFragment extends Fragment { } } - private static class PeertubeInstanceCallback extends DiffUtil.ItemCallback { + private static final class PeertubeInstanceCallback + extends DiffUtil.ItemCallback { @Override public boolean areItemsTheSame(@NonNull final PeertubeInstance oldItem, @NonNull final PeertubeInstance newItem) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java index 37335421d..18e0816bb 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java @@ -174,7 +174,7 @@ public class SelectChannelFragment extends DialogFragment { void onCancel(); } - private class SelectChannelAdapter + private final class SelectChannelAdapter extends RecyclerView.Adapter { @NonNull @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectFeedGroupFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectFeedGroupFragment.java index 662379369..c106f5998 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectFeedGroupFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectFeedGroupFragment.java @@ -175,7 +175,7 @@ public class SelectFeedGroupFragment extends DialogFragment { void onCancel(); } - private class SelectFeedGroupAdapter + private final class SelectFeedGroupAdapter extends RecyclerView.Adapter { @NonNull @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java index 36abef9e5..6a5f7c894 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java @@ -138,7 +138,7 @@ public class SelectPlaylistFragment extends DialogFragment { void onRemotePlaylistSelected(int serviceId, String url, String name); } - private class SelectPlaylistAdapter + private final class SelectPlaylistAdapter extends RecyclerView.Adapter { @NonNull @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchAdapter.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchAdapter.java index d6e2021a1..dd59ba86e 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchAdapter.java @@ -69,7 +69,8 @@ class PreferenceSearchAdapter } } - private static class PreferenceCallback extends DiffUtil.ItemCallback { + private static final class PreferenceCallback + extends DiffUtil.ItemCallback { @Override public boolean areItemsTheSame(@NonNull final PreferenceSearchItem oldItem, @NonNull final PreferenceSearchItem newItem) { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f0718d4fb..c83e83393 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ assertj = "3.24.2" autoservice = "1.1.1" bridge = "v2.0.2" cardview = "1.0.0" -checkstyle = "10.12.1" +checkstyle = "10.26.1" constraintlayout = "2.1.4" core = "1.12.0" desugar = "2.0.4" From 729702b420f48cc5d0ff67f4a84ffa62ecfd066a Mon Sep 17 00:00:00 2001 From: tobigr Date: Sun, 5 Oct 2025 21:23:51 +0200 Subject: [PATCH 022/190] Update dependencies androidx.media:media:1.7.0 -> 1.7.1 androidx.viewpager2:viewpager2:1.1.0-beta02 -> 1.1.0 io.reactivex.rxjava3:rxjava:3.1.8 -> 3.1.12 org.jsoup:jsoup:1.17.2 -> 1.21.2 --- gradle/libs.versions.toml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c83e83393..ffbc08128 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -21,7 +21,7 @@ extractor = "0023b22095a2d62a60cdfc87f4b5cd85c8b266c3" filepicker = "5.0.0" fragment = "1.6.2" groupie = "2.10.1" -jsoup = "1.17.2" +jsoup = "1.21.2" junit = "4.13.2" junit-ext = "1.1.5" kotlin = "1.9.25" @@ -31,7 +31,7 @@ lifecycle = "2.6.2" localbroadcastmanager = "1.1.0" markwon = "4.6.2" material = "1.11.0" -media = "1.7.0" +media = "1.7.1" mockitoCore = "5.6.0" nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" okhttp = "4.12.0" @@ -45,14 +45,12 @@ room = "2.6.1" runner = "1.5.2" rxandroid = "3.0.2" rxbinding = "4.0.0" -rxjava = "3.1.8" +rxjava = "3.1.12" sonarqube = "4.0.0.2929" statesaver = "1.4.1" stetho = "1.6.0" swiperefreshlayout = "1.1.0" -# Newer version specified to prevent accessibility regressions with RecyclerView -# see: https://developer.android.com/jetpack/androidx/releases/viewpager2#1.1.0-alpha01 -viewpager2 = "1.1.0-beta02" +viewpager2 = "1.1.0" webkit = "1.9.0" work = "2.8.1" From 300f5abc70c081b9c09fa461b01531f5aee4b082 Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 21 Oct 2025 10:31:32 +0200 Subject: [PATCH 023/190] Update NewPipeExtractor and restore Jitpack/using-locally comments The comments were accidentally removed in #12706 --- gradle/libs.versions.toml | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ffbc08128..f48678867 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,8 +17,6 @@ core = "1.12.0" desugar = "2.0.4" documentfile = "1.0.1" exoplayer = "2.18.7" -extractor = "0023b22095a2d62a60cdfc87f4b5cd85c8b266c3" -filepicker = "5.0.0" fragment = "1.6.2" groupie = "2.10.1" jsoup = "1.21.2" @@ -33,7 +31,6 @@ markwon = "4.6.2" material = "1.11.0" media = "1.7.1" mockitoCore = "5.6.0" -nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" okhttp = "4.12.0" phoenix = "2.1.2" #noinspection NewerVersionAvailable,GradleDependency --> 2.8 is the last version, not 2.71828! @@ -50,6 +47,17 @@ sonarqube = "4.0.0.2929" statesaver = "1.4.1" stetho = "1.6.0" swiperefreshlayout = "1.1.0" +# You can use a local version by uncommenting a few lines in settings.gradle +# Or you can use a commit you pushed to GitHub by just replacing TeamNewPipe with your GitHub +# name and the commit hash with the commit hash of the (pushed) commit you want to test +# This works thanks to JitPack: https://jitpack.io/ +teamnewpipe-filepicker = "5.0.0" +teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" +# WORKAROUND: if you get errors with the NewPipeExtractor dependency, replace `v0.XX.Y` with +# 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 = "3af73262cc60cf555fd5f1d691f6c58e2db38ef5" viewpager2 = "1.1.0" webkit = "1.9.0" work = "2.8.1" @@ -104,9 +112,9 @@ lisawray-groupie-core = { module = "com.github.lisawray.groupie:groupie", versio lisawray-groupie-viewbinding = { module = "com.github.lisawray.groupie:groupie-viewbinding", version.ref = "groupie" } livefront-bridge = { module = "com.github.livefront:bridge", version.ref = "bridge" } mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockitoCore" } -newpipe-extractor = { module = "com.github.TeamNewPipe:NewPipeExtractor", version.ref = "extractor" } -newpipe-filepicker = { module = "com.github.TeamNewPipe:NoNonsense-FilePicker", version.ref = "filepicker" } -newpipe-nanojson = { module = "com.github.TeamNewPipe:nanojson", version.ref = "nanojson" } +newpipe-extractor = { module = "com.github.TeamNewPipe:NewPipeExtractor", version.ref = "teamnewpipe-newpipe-extractor" } +newpipe-filepicker = { module = "com.github.TeamNewPipe:NoNonsense-FilePicker", version.ref = "teamnewpipe-filepicker" } +newpipe-nanojson = { module = "com.github.TeamNewPipe:nanojson", version.ref = "teamnewpipe-nanojson" } noties-markwon-core = { module = "io.noties.markwon:core", version.ref = "markwon" } noties-markwon-linkify = { module = "io.noties.markwon:linkify", version.ref = "markwon" } ocpsoft-prettytime = { module = "org.ocpsoft.prettytime:prettytime", version.ref = "prettytime" } From c81148ae0a5f893c6bbc0ffa109de2e57d3acac1 Mon Sep 17 00:00:00 2001 From: litetex <40789489+litetex@users.noreply.github.com> Date: Mon, 20 Oct 2025 21:06:39 +0200 Subject: [PATCH 024/190] [Popup player] Workaround that UI elements are pushed off screen --- .../main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java | 3 +++ .../main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java index 9d2126826..bfcc82984 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java @@ -290,6 +290,9 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh binding.topControls.setFocusable(true); binding.metadataView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE); + + // Reset workaround changes from popup player + binding.audioTrackTextView.setMaxWidth(Integer.MAX_VALUE); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java index 6c98ab0fa..24b734fe0 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java @@ -40,6 +40,7 @@ import org.schabi.newpipe.player.Player; import org.schabi.newpipe.player.gesture.BasePlayerGestureListener; import org.schabi.newpipe.player.gesture.PopupPlayerGestureListener; import org.schabi.newpipe.player.helper.PlayerHelper; +import org.schabi.newpipe.util.DeviceUtils; public final class PopupPlayerUi extends VideoPlayerUi { private static final String TAG = PopupPlayerUi.class.getSimpleName(); @@ -174,6 +175,8 @@ public final class PopupPlayerUi extends VideoPlayerUi { binding.topControls.setClickable(false); binding.topControls.setFocusable(false); binding.bottomControls.bringToFront(); + // Workaround that UI elements are pushed off screen + binding.audioTrackTextView.setMaxWidth(DeviceUtils.dpToPx(48, context)); super.setupElementsVisibility(); } From 88eb32be3ab461acf9624dc3b25600676c0babc5 Mon Sep 17 00:00:00 2001 From: Isaac Date: Sun, 26 Oct 2025 05:32:12 +1100 Subject: [PATCH 025/190] moved field as requested --- app/src/main/java/org/schabi/newpipe/App.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index 364f62114..cf41aad46 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -65,9 +65,10 @@ public class App extends Application { private static final String TAG = App.class.toString(); private boolean isFirstRun = false; - private static App app; private boolean notificationsRequested = false; + private static App app; + @NonNull public static App getApp() { return app; From 71aa6d52d321110a530e44df38fc4a501de02c2c Mon Sep 17 00:00:00 2001 From: TransZAllen Date: Tue, 28 Oct 2025 17:39:04 +0800 Subject: [PATCH 026/190] Update app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java Co-authored-by: Tobi --- .../java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java index bea3422fc..aaf7bff69 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java +++ b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java @@ -99,8 +99,8 @@ public class SrtFromTtmlWriter { } /** - * Handle rare XML entity characters like LF: (`\n`) - * , CR: (`\r`) and CRLF: (`\r\n`). + * Handle rare XML entity characters like LF: (`\n`), + * CR: (`\r`) and CRLF: (`\r\n`). * * These are technically valid in TTML (XML allows them) * but unusual in practice, since most TTML line breaks From d311faea58a3ee03e95b3473924547c87ccded11 Mon Sep 17 00:00:00 2001 From: TransZAllen Date: Wed, 29 Oct 2025 18:52:57 +0800 Subject: [PATCH 027/190] =?UTF-8?q?improve=20comments=20on=20TTML=20?= =?UTF-8?q?=E2=86=92=20SRT=20conversion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - update class header with proper technical references and remove author tag. - update comments of replacing NBSP('\u00A0'), especially adding examples of rendering incorrectly. --- .../newpipe/streams/SrtFromTtmlWriter.java | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java index aaf7bff69..6f584d055 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java +++ b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java @@ -15,7 +15,11 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; /** - * @author kapodamy + * Converts TTML subtitles to SRT format. + * + * References: + * - TTML 2.0 (W3C): https://www.w3.org/TR/ttml2/ + * - SRT format: https://en.wikipedia.org/wiki/SubRip */ public class SrtFromTtmlWriter { private static final String NEW_LINE = "\r\n"; @@ -135,20 +139,37 @@ public class SrtFromTtmlWriter { private String normalizeForSrt(final String actualText) { String cleaned = actualText; - // Replace non-breaking space (\u00A0) with regular space ' '(\u0020). + // Replace NBSP "non-breaking space" (\u00A0) with regular space ' '(\u0020). + // + // Why: + // - Some viewers render NBSP(\u00A0) incorrectly: + // * MPlayer 1.5: shown as “??” + // * Linux command `cat -A`: displayed as control-like markers + // (M-BM-) + // * Acode (Android editor): displayed as visible replacement + // glyphs (red dots) + // - Other viewers show it as a normal space (e.g., VS Code 1.104.0, + // vlc 3.0.20, mpv 0.37.0, Totem 43.0) + // → Mixed rendering creates inconsistency and may confuse users. + // + // Details: // - YouTube TTML subtitles use both regular spaces (\u0020) // and non-breaking spaces (\u00A0). // - SRT subtitles only support regular spaces (\u0020), // so \u00A0 may cause display issues. // - \u00A0 and \u0020 are visually identical (i.e., they both // appear as spaces ' '), but they differ in Unicode encoding, - // leading to test failures (e.g., ComparisonFailure). - // - Convert \u00A0 to \u0020 to ensure consistency in subtitle - // formatting. - // - References: - // - Unicode General Punctuation: https://unicode.org/charts/PDF/U2000.pdf - // - TTML Spec: https://www.w3.org/TR/ttml2/ - // - SRT Format: https://en.wikipedia.org/wiki/SubRip + // and NBSP (\u00A0) renders differently in different viewers. + // - SRT is a plain-text format and does not interpret + // "non-breaking" behavior. + // + // Conclusion: + // - Ensure uniform behavior, so replace it to a regular space + // without "non-breaking" behavior. + // + // References: + // - Unicode U+00A0 NBSP (Latin-1 Supplement): + // https://unicode.org/charts/PDF/U0080.pdf cleaned = cleaned.replace('\u00A0', ' ') // Non-breaking space .replace('\u202F', ' ') // Narrow no-break space .replace('\u205F', ' ') // Medium mathematical space From 300afde83d7203187d6249cd203a977f8874b5e4 Mon Sep 17 00:00:00 2001 From: TransZAllen Date: Wed, 29 Oct 2025 22:34:47 +0800 Subject: [PATCH 028/190] Update app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java Co-authored-by: Tobi --- .../java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java index 6f584d055..652053e45 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java +++ b/app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java @@ -98,8 +98,7 @@ public class SrtFromTtmlWriter { * actual (literal) characters. */ private String decodeXmlEntities(final String encodedEntities) { - final String decoded = Parser.unescapeEntities(encodedEntities, true); - return decoded; + return Parser.unescapeEntities(encodedEntities, true); } /** From 1314a21f7138a2c097e5bd8b2cba06c4d564a04b Mon Sep 17 00:00:00 2001 From: TransZAllen Date: Sun, 2 Nov 2025 15:44:59 +0800 Subject: [PATCH 029/190] fix: update commented example in `settings.gradle.kts` for Kotlin DSL - Resolves build issue related to local NewPipeExtractor inclusion - Related issue: https://github.com/TeamNewPipe/NewPipe/issues/12763 --- settings.gradle.kts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index d9e899151..60a40c985 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -25,8 +25,9 @@ include (":app") // We assume, that NewPipe and NewPipe Extractor have the same parent directory. // If this is not the case, please change the path in includeBuild(). -//includeBuild('../NewPipeExtractor') { +//includeBuild("../NewPipeExtractor") { // dependencySubstitution { -// substitute module('com.github.TeamNewPipe:NewPipeExtractor') using project(':extractor') +// substitute(module("com.github.TeamNewPipe:NewPipeExtractor")) +// .using(project(":extractor")) // } //} From 4422b55ab402c460fe8984f02375aca02675dbbc Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Fri, 24 Oct 2025 19:05:57 +0800 Subject: [PATCH 030/190] Migrate database logic to Kotlin Room has been convereted into a KMP library in the latest stable releases and annotation processing requires KSP which only generates kotlin classes Signed-off-by: Aayush Gupta --- .../9.json | 2 +- .../org/schabi/newpipe/NewPipeDatabase.java | 72 ---- .../org/schabi/newpipe/NewPipeDatabase.kt | 80 ++++ .../schabi/newpipe/database/AppDatabase.java | 65 ---- .../schabi/newpipe/database/AppDatabase.kt | 68 ++++ .../org/schabi/newpipe/database/BasicDAO.java | 39 -- .../org/schabi/newpipe/database/BasicDAO.kt | 42 ++ .../schabi/newpipe/database/LocalItem.java | 13 - .../org/schabi/newpipe/database/LocalItem.kt | 19 + .../schabi/newpipe/database/Migrations.java | 307 --------------- .../org/schabi/newpipe/database/Migrations.kt | 368 ++++++++++++++++++ .../database/history/dao/HistoryDAO.java | 7 - .../database/history/dao/HistoryDAO.kt | 13 + .../history/dao/SearchHistoryDAO.java | 52 --- .../database/history/dao/SearchHistoryDAO.kt | 42 ++ .../history/dao/StreamHistoryDAO.java | 89 ----- .../database/history/dao/StreamHistoryDAO.kt | 63 +++ .../history/model/SearchHistoryEntry.kt | 31 +- .../history/model/StreamHistoryEntity.java | 81 ---- .../history/model/StreamHistoryEntity.kt | 56 +++ .../playlist/PlaylistDuplicatesEntry.java | 29 -- .../playlist/PlaylistDuplicatesEntry.kt | 40 ++ .../database/playlist/PlaylistLocalItem.java | 18 - .../database/playlist/PlaylistLocalItem.kt | 16 + .../playlist/PlaylistMetadataEntry.java | 82 ---- .../playlist/PlaylistMetadataEntry.kt | 42 ++ .../database/playlist/PlaylistStreamEntry.kt | 31 +- .../database/playlist/dao/PlaylistDAO.java | 53 --- .../database/playlist/dao/PlaylistDAO.kt | 48 +++ .../playlist/dao/PlaylistRemoteDAO.java | 68 ---- .../playlist/dao/PlaylistRemoteDAO.kt | 55 +++ .../playlist/dao/PlaylistStreamDAO.java | 159 -------- .../playlist/dao/PlaylistStreamDAO.kt | 151 +++++++ .../playlist/model/PlaylistEntity.java | 100 ----- .../database/playlist/model/PlaylistEntity.kt | 58 +++ .../playlist/model/PlaylistRemoteEntity.java | 191 --------- .../playlist/model/PlaylistRemoteEntity.kt | 104 +++++ .../playlist/model/PlaylistStreamEntity.java | 76 ---- .../playlist/model/PlaylistStreamEntity.kt | 68 ++++ .../database/stream/StreamStatisticsEntry.kt | 38 +- .../database/stream/dao/StreamStateDAO.java | 48 --- .../database/stream/dao/StreamStateDAO.kt | 45 +++ .../stream/model/StreamStateEntity.java | 112 ------ .../stream/model/StreamStateEntity.kt | 85 ++++ .../subscription/NotificationMode.java | 14 - .../database/subscription/NotificationMode.kt | 18 + .../database/subscription/SubscriptionDAO.kt | 2 +- .../subscription/SubscriptionEntity.java | 200 ---------- .../subscription/SubscriptionEntity.kt | 87 +++++ .../list/channel/ChannelFragment.java | 8 +- .../local/bookmark/BookmarkFragment.java | 14 +- .../local/dialog/PlaylistAppendDialog.java | 11 +- .../schabi/newpipe/local/feed/FeedFragment.kt | 2 +- .../local/holder/LocalPlaylistItemHolder.java | 8 +- .../holder/RemotePlaylistItemHolder.java | 2 +- .../local/playlist/LocalPlaylistManager.java | 4 +- .../local/subscription/SubscriptionManager.kt | 16 +- .../player/mediabrowser/MediaBrowserImpl.kt | 2 +- .../MediaBrowserPlaybackPreparer.kt | 2 +- .../settings/SelectPlaylistFragment.java | 11 +- .../NotificationModeConfigAdapter.kt | 2 +- 61 files changed, 1676 insertions(+), 1953 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java create mode 100644 app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/AppDatabase.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/AppDatabase.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/BasicDAO.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/BasicDAO.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/LocalItem.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/LocalItem.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/Migrations.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/Migrations.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistStreamEntity.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistStreamEntity.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamStateDAO.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamStateDAO.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/subscription/NotificationMode.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/subscription/NotificationMode.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.java create mode 100644 app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt diff --git a/app/schemas/org.schabi.newpipe.database.AppDatabase/9.json b/app/schemas/org.schabi.newpipe.database.AppDatabase/9.json index aced06c0a..b9a618638 100644 --- a/app/schemas/org.schabi.newpipe.database.AppDatabase/9.json +++ b/app/schemas/org.schabi.newpipe.database.AppDatabase/9.json @@ -458,7 +458,7 @@ "notNull": true }, { - "fieldPath": "name", + "fieldPath": "orderingName", "columnName": "name", "affinity": "TEXT", "notNull": false diff --git a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java deleted file mode 100644 index 21c5354f4..000000000 --- a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.schabi.newpipe; - -import static org.schabi.newpipe.database.AppDatabase.DATABASE_NAME; -import static org.schabi.newpipe.database.Migrations.MIGRATION_1_2; -import static org.schabi.newpipe.database.Migrations.MIGRATION_2_3; -import static org.schabi.newpipe.database.Migrations.MIGRATION_3_4; -import static org.schabi.newpipe.database.Migrations.MIGRATION_4_5; -import static org.schabi.newpipe.database.Migrations.MIGRATION_5_6; -import static org.schabi.newpipe.database.Migrations.MIGRATION_6_7; -import static org.schabi.newpipe.database.Migrations.MIGRATION_7_8; -import static org.schabi.newpipe.database.Migrations.MIGRATION_8_9; - -import android.content.Context; -import android.database.Cursor; - -import androidx.annotation.NonNull; -import androidx.room.Room; - -import org.schabi.newpipe.database.AppDatabase; - -public final class NewPipeDatabase { - private static volatile AppDatabase databaseInstance; - - private NewPipeDatabase() { - //no instance - } - - private static AppDatabase getDatabase(final Context context) { - return Room - .databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME) - .addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5, - MIGRATION_5_6, MIGRATION_6_7, MIGRATION_7_8, MIGRATION_8_9) - .build(); - } - - @NonNull - public static AppDatabase getInstance(@NonNull final Context context) { - AppDatabase result = databaseInstance; - if (result == null) { - synchronized (NewPipeDatabase.class) { - result = databaseInstance; - if (result == null) { - databaseInstance = getDatabase(context); - result = databaseInstance; - } - } - } - - return result; - } - - public static void checkpoint() { - if (databaseInstance == null) { - throw new IllegalStateException("database is not initialized"); - } - final Cursor c = databaseInstance.query("pragma wal_checkpoint(full)", null); - if (c.moveToFirst() && c.getInt(0) == 1) { - throw new RuntimeException("Checkpoint was blocked from completing"); - } - } - - public static void close() { - if (databaseInstance != null) { - synchronized (NewPipeDatabase.class) { - if (databaseInstance != null) { - databaseInstance.close(); - databaseInstance = null; - } - } - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt new file mode 100644 index 000000000..c3ce51524 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt @@ -0,0 +1,80 @@ +/* + * SPDX-FileCopyrightText: 2017-2024 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe + +import android.content.Context +import androidx.room.Room.databaseBuilder +import org.schabi.newpipe.database.AppDatabase +import org.schabi.newpipe.database.Migrations.MIGRATION_1_2 +import org.schabi.newpipe.database.Migrations.MIGRATION_2_3 +import org.schabi.newpipe.database.Migrations.MIGRATION_3_4 +import org.schabi.newpipe.database.Migrations.MIGRATION_4_5 +import org.schabi.newpipe.database.Migrations.MIGRATION_5_6 +import org.schabi.newpipe.database.Migrations.MIGRATION_6_7 +import org.schabi.newpipe.database.Migrations.MIGRATION_7_8 +import org.schabi.newpipe.database.Migrations.MIGRATION_8_9 +import kotlin.concurrent.Volatile + +object NewPipeDatabase { + + @Volatile + private var databaseInstance: AppDatabase? = null + + private fun getDatabase(context: Context): AppDatabase { + return databaseBuilder( + context.applicationContext, + AppDatabase::class.java, + AppDatabase.Companion.DATABASE_NAME + ).addMigrations( + MIGRATION_1_2, + MIGRATION_2_3, + MIGRATION_3_4, + MIGRATION_4_5, + MIGRATION_5_6, + MIGRATION_6_7, + MIGRATION_7_8, + MIGRATION_8_9 + ).build() + } + + @JvmStatic + fun getInstance(context: Context): AppDatabase { + var result = databaseInstance + if (result == null) { + synchronized(NewPipeDatabase::class.java) { + result = databaseInstance + if (result == null) { + databaseInstance = getDatabase(context) + result = databaseInstance + } + } + } + + return result!! + } + + @JvmStatic + fun checkpoint() { + checkNotNull(databaseInstance) { "database is not initialized" } + val c = databaseInstance!!.query("pragma wal_checkpoint(full)", null) + if (c.moveToFirst() && c.getInt(0) == 1) { + throw RuntimeException("Checkpoint was blocked from completing") + } + } + + @JvmStatic + fun close() { + if (databaseInstance != null) { + synchronized(NewPipeDatabase::class.java) { + if (databaseInstance != null) { + databaseInstance!!.close() + databaseInstance = null + } + } + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java b/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java deleted file mode 100644 index 04d93a238..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.schabi.newpipe.database; - -import static org.schabi.newpipe.database.Migrations.DB_VER_9; - -import androidx.room.Database; -import androidx.room.RoomDatabase; -import androidx.room.TypeConverters; - -import org.schabi.newpipe.database.feed.dao.FeedDAO; -import org.schabi.newpipe.database.feed.dao.FeedGroupDAO; -import org.schabi.newpipe.database.feed.model.FeedEntity; -import org.schabi.newpipe.database.feed.model.FeedGroupEntity; -import org.schabi.newpipe.database.feed.model.FeedGroupSubscriptionEntity; -import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity; -import org.schabi.newpipe.database.history.dao.SearchHistoryDAO; -import org.schabi.newpipe.database.history.dao.StreamHistoryDAO; -import org.schabi.newpipe.database.history.model.SearchHistoryEntry; -import org.schabi.newpipe.database.history.model.StreamHistoryEntity; -import org.schabi.newpipe.database.playlist.dao.PlaylistDAO; -import org.schabi.newpipe.database.playlist.dao.PlaylistRemoteDAO; -import org.schabi.newpipe.database.playlist.dao.PlaylistStreamDAO; -import org.schabi.newpipe.database.playlist.model.PlaylistEntity; -import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; -import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity; -import org.schabi.newpipe.database.stream.dao.StreamDAO; -import org.schabi.newpipe.database.stream.dao.StreamStateDAO; -import org.schabi.newpipe.database.stream.model.StreamEntity; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; -import org.schabi.newpipe.database.subscription.SubscriptionDAO; -import org.schabi.newpipe.database.subscription.SubscriptionEntity; - -@TypeConverters({Converters.class}) -@Database( - entities = { - SubscriptionEntity.class, SearchHistoryEntry.class, - StreamEntity.class, StreamHistoryEntity.class, StreamStateEntity.class, - PlaylistEntity.class, PlaylistStreamEntity.class, PlaylistRemoteEntity.class, - FeedEntity.class, FeedGroupEntity.class, FeedGroupSubscriptionEntity.class, - FeedLastUpdatedEntity.class - }, - version = DB_VER_9 -) -public abstract class AppDatabase extends RoomDatabase { - public static final String DATABASE_NAME = "newpipe.db"; - - public abstract SearchHistoryDAO searchHistoryDAO(); - - public abstract StreamDAO streamDAO(); - - public abstract StreamHistoryDAO streamHistoryDAO(); - - public abstract StreamStateDAO streamStateDAO(); - - public abstract PlaylistDAO playlistDAO(); - - public abstract PlaylistStreamDAO playlistStreamDAO(); - - public abstract PlaylistRemoteDAO playlistRemoteDAO(); - - public abstract FeedDAO feedDAO(); - - public abstract FeedGroupDAO feedGroupDAO(); - - public abstract SubscriptionDAO subscriptionDAO(); -} diff --git a/app/src/main/java/org/schabi/newpipe/database/AppDatabase.kt b/app/src/main/java/org/schabi/newpipe/database/AppDatabase.kt new file mode 100644 index 000000000..286eddf7b --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/AppDatabase.kt @@ -0,0 +1,68 @@ +/* + * SPDX-FileCopyrightText: 2017-2024 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database + +import androidx.room.Database +import androidx.room.RoomDatabase +import androidx.room.TypeConverters +import org.schabi.newpipe.database.feed.dao.FeedDAO +import org.schabi.newpipe.database.feed.dao.FeedGroupDAO +import org.schabi.newpipe.database.feed.model.FeedEntity +import org.schabi.newpipe.database.feed.model.FeedGroupEntity +import org.schabi.newpipe.database.feed.model.FeedGroupSubscriptionEntity +import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity +import org.schabi.newpipe.database.history.dao.SearchHistoryDAO +import org.schabi.newpipe.database.history.dao.StreamHistoryDAO +import org.schabi.newpipe.database.history.model.SearchHistoryEntry +import org.schabi.newpipe.database.history.model.StreamHistoryEntity +import org.schabi.newpipe.database.playlist.dao.PlaylistDAO +import org.schabi.newpipe.database.playlist.dao.PlaylistRemoteDAO +import org.schabi.newpipe.database.playlist.dao.PlaylistStreamDAO +import org.schabi.newpipe.database.playlist.model.PlaylistEntity +import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity +import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity +import org.schabi.newpipe.database.stream.dao.StreamDAO +import org.schabi.newpipe.database.stream.dao.StreamStateDAO +import org.schabi.newpipe.database.stream.model.StreamEntity +import org.schabi.newpipe.database.stream.model.StreamStateEntity +import org.schabi.newpipe.database.subscription.SubscriptionDAO +import org.schabi.newpipe.database.subscription.SubscriptionEntity + +@TypeConverters(Converters::class) +@Database( + version = Migrations.DB_VER_9, + entities = [ + SubscriptionEntity::class, + SearchHistoryEntry::class, + StreamEntity::class, + StreamHistoryEntity::class, + StreamStateEntity::class, + PlaylistEntity::class, + PlaylistStreamEntity::class, + PlaylistRemoteEntity::class, + FeedEntity::class, + FeedGroupEntity::class, + FeedGroupSubscriptionEntity::class, + FeedLastUpdatedEntity::class + ] +) +abstract class AppDatabase : RoomDatabase() { + abstract fun feedDAO(): FeedDAO + abstract fun feedGroupDAO(): FeedGroupDAO + abstract fun playlistDAO(): PlaylistDAO + abstract fun playlistRemoteDAO(): PlaylistRemoteDAO + abstract fun playlistStreamDAO(): PlaylistStreamDAO + abstract fun searchHistoryDAO(): SearchHistoryDAO + abstract fun streamDAO(): StreamDAO + abstract fun streamHistoryDAO(): StreamHistoryDAO + abstract fun streamStateDAO(): StreamStateDAO + abstract fun subscriptionDAO(): SubscriptionDAO + + companion object { + const val DATABASE_NAME: String = "newpipe.db" + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/BasicDAO.java b/app/src/main/java/org/schabi/newpipe/database/BasicDAO.java deleted file mode 100644 index 255f5ba8d..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/BasicDAO.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.schabi.newpipe.database; - -import androidx.room.Dao; -import androidx.room.Delete; -import androidx.room.Insert; -import androidx.room.Update; - -import java.util.Collection; -import java.util.List; - -import io.reactivex.rxjava3.core.Flowable; - -@Dao -public interface BasicDAO { - /* Inserts */ - @Insert - long insert(Entity entity); - - @Insert - List insertAll(Collection entities); - - /* Searches */ - Flowable> getAll(); - - Flowable> listByService(int serviceId); - - /* Deletes */ - @Delete - void delete(Entity entity); - - int deleteAll(); - - /* Updates */ - @Update - int update(Entity entity); - - @Update - void update(Collection entities); -} diff --git a/app/src/main/java/org/schabi/newpipe/database/BasicDAO.kt b/app/src/main/java/org/schabi/newpipe/database/BasicDAO.kt new file mode 100644 index 000000000..74c7cc87c --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/BasicDAO.kt @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2017-2022 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.Update +import io.reactivex.rxjava3.core.Flowable + +@Dao +interface BasicDAO { + + /* Inserts */ + @Insert + fun insert(entity: Entity): Long + + @Insert + fun insertAll(entities: Collection): List + + /* Searches */ + fun getAll(): Flowable> + + fun listByService(serviceId: Int): Flowable> + + /* Deletes */ + @Delete + fun delete(entity: Entity) + + fun deleteAll(): Int + + /* Updates */ + @Update + fun update(entity: Entity): Int + + @Update + fun update(entities: Collection) +} diff --git a/app/src/main/java/org/schabi/newpipe/database/LocalItem.java b/app/src/main/java/org/schabi/newpipe/database/LocalItem.java deleted file mode 100644 index 54b856b06..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/LocalItem.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.schabi.newpipe.database; - -public interface LocalItem { - LocalItemType getLocalItemType(); - - enum LocalItemType { - PLAYLIST_LOCAL_ITEM, - PLAYLIST_REMOTE_ITEM, - - PLAYLIST_STREAM_ITEM, - STATISTIC_STREAM_ITEM, - } -} diff --git a/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt b/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt new file mode 100644 index 000000000..50529610b --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2018-2020 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database + +interface LocalItem { + val localItemType: LocalItemType + + enum class LocalItemType { + PLAYLIST_LOCAL_ITEM, + PLAYLIST_REMOTE_ITEM, + + PLAYLIST_STREAM_ITEM, + STATISTIC_STREAM_ITEM, + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.java b/app/src/main/java/org/schabi/newpipe/database/Migrations.java deleted file mode 100644 index c9f630869..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/Migrations.java +++ /dev/null @@ -1,307 +0,0 @@ -package org.schabi.newpipe.database; - -import android.util.Log; - -import androidx.annotation.NonNull; -import androidx.room.migration.Migration; -import androidx.sqlite.db.SupportSQLiteDatabase; - -import org.schabi.newpipe.MainActivity; - -public final class Migrations { - - ///////////////////////////////////////////////////////////////////////////// - // Test new migrations manually by importing a database from daily usage // - // and checking if the migration works (Use the Database Inspector // - // https://developer.android.com/studio/inspect/database). // - // If you add a migration point it out in the pull request, so that // - // others remember to test it themselves. // - ///////////////////////////////////////////////////////////////////////////// - - public static final int DB_VER_1 = 1; - public static final int DB_VER_2 = 2; - public static final int DB_VER_3 = 3; - public static final int DB_VER_4 = 4; - public static final int DB_VER_5 = 5; - public static final int DB_VER_6 = 6; - public static final int DB_VER_7 = 7; - public static final int DB_VER_8 = 8; - public static final int DB_VER_9 = 9; - - private static final String TAG = Migrations.class.getName(); - public static final boolean DEBUG = MainActivity.DEBUG; - - public static final Migration MIGRATION_1_2 = new Migration(DB_VER_1, DB_VER_2) { - @Override - public void migrate(@NonNull final SupportSQLiteDatabase database) { - if (DEBUG) { - Log.d(TAG, "Start migrating database"); - } - /* - * Unfortunately these queries must be hardcoded due to the possibility of - * schema and names changing at a later date, thus invalidating the older migration - * scripts if they are not hardcoded. - * */ - - // Not much we can do about this, since room doesn't create tables before migration. - // It's either this or blasting the entire database anew. - database.execSQL("CREATE INDEX `index_search_history_search` " - + "ON `search_history` (`search`)"); - database.execSQL("CREATE TABLE IF NOT EXISTS `streams` " - + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " - + "`service_id` INTEGER NOT NULL, `url` TEXT, `title` TEXT, " - + "`stream_type` TEXT, `duration` INTEGER, `uploader` TEXT, " - + "`thumbnail_url` TEXT)"); - database.execSQL("CREATE UNIQUE INDEX `index_streams_service_id_url` " - + "ON `streams` (`service_id`, `url`)"); - database.execSQL("CREATE TABLE IF NOT EXISTS `stream_history` " - + "(`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, " - + "`repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), " - + "FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) " - + "ON UPDATE CASCADE ON DELETE CASCADE )"); - database.execSQL("CREATE INDEX `index_stream_history_stream_id` " - + "ON `stream_history` (`stream_id`)"); - database.execSQL("CREATE TABLE IF NOT EXISTS `stream_state` " - + "(`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, " - + "PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) " - + "REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )"); - database.execSQL("CREATE TABLE IF NOT EXISTS `playlists` " - + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " - + "`name` TEXT, `thumbnail_url` TEXT)"); - database.execSQL("CREATE INDEX `index_playlists_name` ON `playlists` (`name`)"); - database.execSQL("CREATE TABLE IF NOT EXISTS `playlist_stream_join` " - + "(`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, " - + "`join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), " - + "FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) " - + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, " - + "FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) " - + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)"); - database.execSQL("CREATE UNIQUE INDEX " - + "`index_playlist_stream_join_playlist_id_join_index` " - + "ON `playlist_stream_join` (`playlist_id`, `join_index`)"); - database.execSQL("CREATE INDEX `index_playlist_stream_join_stream_id` " - + "ON `playlist_stream_join` (`stream_id`)"); - database.execSQL("CREATE TABLE IF NOT EXISTS `remote_playlists` " - + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " - + "`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, " - + "`thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)"); - database.execSQL("CREATE INDEX `index_remote_playlists_name` " - + "ON `remote_playlists` (`name`)"); - database.execSQL("CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` " - + "ON `remote_playlists` (`service_id`, `url`)"); - - // Populate streams table with existing entries in watch history - // Latest data first, thus ignoring older entries with the same indices - database.execSQL("INSERT OR IGNORE INTO streams (service_id, url, title, " - + "stream_type, duration, uploader, thumbnail_url) " - - + "SELECT service_id, url, title, 'VIDEO_STREAM', duration, " - + "uploader, thumbnail_url " - - + "FROM watch_history " - + "ORDER BY creation_date DESC"); - - // Once the streams have PKs, join them with the normalized history table - // and populate it with the remaining data from watch history - database.execSQL("INSERT INTO stream_history (stream_id, access_date, repeat_count)" - + "SELECT uid, creation_date, 1 " - + "FROM watch_history INNER JOIN streams " - + "ON watch_history.service_id == streams.service_id " - + "AND watch_history.url == streams.url " - + "ORDER BY creation_date DESC"); - - database.execSQL("DROP TABLE IF EXISTS watch_history"); - - if (DEBUG) { - Log.d(TAG, "Stop migrating database"); - } - } - }; - - public static final Migration MIGRATION_2_3 = new Migration(DB_VER_2, DB_VER_3) { - @Override - public void migrate(@NonNull final SupportSQLiteDatabase database) { - // Add NOT NULLs and new fields - database.execSQL("CREATE TABLE IF NOT EXISTS streams_new " - + "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " - + "service_id INTEGER NOT NULL, url TEXT NOT NULL, title TEXT NOT NULL, " - + "stream_type TEXT NOT NULL, duration INTEGER NOT NULL, " - + "uploader TEXT NOT NULL, thumbnail_url TEXT, view_count INTEGER, " - + "textual_upload_date TEXT, upload_date INTEGER, " - + "is_upload_date_approximation INTEGER)"); - - database.execSQL("INSERT INTO streams_new (uid, service_id, url, title, stream_type, " - + "duration, uploader, thumbnail_url, view_count, textual_upload_date, " - + "upload_date, is_upload_date_approximation) " - - + "SELECT uid, service_id, url, ifnull(title, ''), " - + "ifnull(stream_type, 'VIDEO_STREAM'), ifnull(duration, 0), " - + "ifnull(uploader, ''), ifnull(thumbnail_url, ''), NULL, NULL, NULL, NULL " - - + "FROM streams WHERE url IS NOT NULL"); - - database.execSQL("DROP TABLE streams"); - database.execSQL("ALTER TABLE streams_new RENAME TO streams"); - database.execSQL("CREATE UNIQUE INDEX index_streams_service_id_url " - + "ON streams (service_id, url)"); - - // Tables for feed feature - database.execSQL("CREATE TABLE IF NOT EXISTS feed " - + "(stream_id INTEGER NOT NULL, subscription_id INTEGER NOT NULL, " - + "PRIMARY KEY(stream_id, subscription_id), " - + "FOREIGN KEY(stream_id) REFERENCES streams(uid) " - + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, " - + "FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) " - + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)"); - database.execSQL("CREATE INDEX index_feed_subscription_id ON feed (subscription_id)"); - database.execSQL("CREATE TABLE IF NOT EXISTS feed_group " - + "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL, " - + "icon_id INTEGER NOT NULL, sort_order INTEGER NOT NULL)"); - database.execSQL("CREATE INDEX index_feed_group_sort_order ON feed_group (sort_order)"); - database.execSQL("CREATE TABLE IF NOT EXISTS feed_group_subscription_join " - + "(group_id INTEGER NOT NULL, subscription_id INTEGER NOT NULL, " - + "PRIMARY KEY(group_id, subscription_id), " - + "FOREIGN KEY(group_id) REFERENCES feed_group(uid) " - + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, " - + "FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) " - + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)"); - database.execSQL("CREATE INDEX index_feed_group_subscription_join_subscription_id " - + "ON feed_group_subscription_join (subscription_id)"); - database.execSQL("CREATE TABLE IF NOT EXISTS feed_last_updated " - + "(subscription_id INTEGER NOT NULL, last_updated INTEGER, " - + "PRIMARY KEY(subscription_id), " - + "FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) " - + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)"); - } - }; - - public static final Migration MIGRATION_3_4 = new Migration(DB_VER_3, DB_VER_4) { - @Override - public void migrate(@NonNull final SupportSQLiteDatabase database) { - database.execSQL( - "ALTER TABLE streams ADD COLUMN uploader_url TEXT" - ); - } - }; - - public static final Migration MIGRATION_4_5 = new Migration(DB_VER_4, DB_VER_5) { - @Override - public void migrate(@NonNull final SupportSQLiteDatabase database) { - database.execSQL("ALTER TABLE `subscriptions` ADD COLUMN `notification_mode` " - + "INTEGER NOT NULL DEFAULT 0"); - } - }; - - public static final Migration MIGRATION_5_6 = new Migration(DB_VER_5, DB_VER_6) { - @Override - public void migrate(@NonNull final SupportSQLiteDatabase database) { - database.execSQL("ALTER TABLE `playlists` ADD COLUMN `is_thumbnail_permanent` " - + "INTEGER NOT NULL DEFAULT 0"); - } - }; - - public static final Migration MIGRATION_6_7 = new Migration(DB_VER_6, DB_VER_7) { - @Override - public void migrate(@NonNull final SupportSQLiteDatabase database) { - // Create a new column thumbnail_stream_id - database.execSQL("ALTER TABLE `playlists` ADD COLUMN `thumbnail_stream_id` " - + "INTEGER NOT NULL DEFAULT -1"); - - // Migrate the thumbnail_url to the thumbnail_stream_id - database.execSQL("UPDATE playlists SET thumbnail_stream_id = (" - + " SELECT CASE WHEN COUNT(*) != 0 then stream_uid ELSE -1 END" - + " FROM (" - + " SELECT p.uid AS playlist_uid, s.uid AS stream_uid" - + " FROM playlists p" - + " LEFT JOIN playlist_stream_join ps ON p.uid = ps.playlist_id" - + " LEFT JOIN streams s ON s.uid = ps.stream_id" - + " WHERE s.thumbnail_url = p.thumbnail_url) AS temporary_table" - + " WHERE playlist_uid = playlists.uid)"); - - // Remove the thumbnail_url field in the playlist table - database.execSQL("CREATE TABLE IF NOT EXISTS `playlists_new`" - + "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " - + "name TEXT, " - + "is_thumbnail_permanent INTEGER NOT NULL, " - + "thumbnail_stream_id INTEGER NOT NULL)"); - - database.execSQL("INSERT INTO playlists_new" - + " SELECT uid, name, is_thumbnail_permanent, thumbnail_stream_id " - + " FROM playlists"); - - - database.execSQL("DROP TABLE playlists"); - database.execSQL("ALTER TABLE playlists_new RENAME TO playlists"); - database.execSQL("CREATE INDEX IF NOT EXISTS " - + "`index_playlists_name` ON `playlists` (`name`)"); - } - }; - - public static final Migration MIGRATION_7_8 = new Migration(DB_VER_7, DB_VER_8) { - @Override - public void migrate(@NonNull final SupportSQLiteDatabase database) { - database.execSQL("DELETE FROM search_history WHERE id NOT IN (SELECT id FROM (SELECT " - + "MIN(id) as id FROM search_history GROUP BY trim(search), service_id ) tmp)"); - database.execSQL("UPDATE search_history SET search = trim(search)"); - } - }; - - public static final Migration MIGRATION_8_9 = new Migration(DB_VER_8, DB_VER_9) { - @Override - public void migrate(@NonNull final SupportSQLiteDatabase database) { - try { - database.beginTransaction(); - - // Update playlists. - // Create a temp table to initialize display_index. - database.execSQL("CREATE TABLE `playlists_tmp` " - + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " - + "`name` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL, " - + "`thumbnail_stream_id` INTEGER NOT NULL, " - + "`display_index` INTEGER NOT NULL)"); - database.execSQL("INSERT INTO `playlists_tmp` " - + "(`uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " - + "`display_index`) " - + "SELECT `uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " - + "-1 " - + "FROM `playlists`"); - - // Replace the old table, note that this also removes the index on the name which - // we don't need anymore. - database.execSQL("DROP TABLE `playlists`"); - database.execSQL("ALTER TABLE `playlists_tmp` RENAME TO `playlists`"); - - - // Update remote_playlists. - // Create a temp table to initialize display_index. - database.execSQL("CREATE TABLE `remote_playlists_tmp` " - + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " - + "`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, " - + "`thumbnail_url` TEXT, `uploader` TEXT, " - + "`display_index` INTEGER NOT NULL," - + "`stream_count` INTEGER)"); - database.execSQL("INSERT INTO `remote_playlists_tmp` (`uid`, `service_id`, " - + "`name`, `url`, `thumbnail_url`, `uploader`, `display_index`, " - + "`stream_count`)" - + "SELECT `uid`, `service_id`, `name`, `url`, `thumbnail_url`, `uploader`, " - + "-1, `stream_count` FROM `remote_playlists`"); - - // Replace the old table, note that this also removes the index on the name which - // we don't need anymore. - database.execSQL("DROP TABLE `remote_playlists`"); - database.execSQL("ALTER TABLE `remote_playlists_tmp` RENAME TO `remote_playlists`"); - - // Create index on the new table. - database.execSQL("CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` " - + "ON `remote_playlists` (`service_id`, `url`)"); - - database.setTransactionSuccessful(); - } finally { - database.endTransaction(); - } - } - }; - - private Migrations() { - } -} diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.kt b/app/src/main/java/org/schabi/newpipe/database/Migrations.kt new file mode 100644 index 000000000..8988708e6 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/Migrations.kt @@ -0,0 +1,368 @@ +/* + * SPDX-FileCopyrightText: 2018-2024 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database + +import android.util.Log +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase +import org.schabi.newpipe.MainActivity + +object Migrations { + + // /////////////////////////////////////////////////////////////////////// // + // Test new migrations manually by importing a database from daily usage // + // and checking if the migration works (Use the Database Inspector // + // https://developer.android.com/studio/inspect/database). // + // If you add a migration point it out in the pull request, so that // + // others remember to test it themselves. // + // /////////////////////////////////////////////////////////////////////// // + + const val DB_VER_1 = 1 + const val DB_VER_2 = 2 + const val DB_VER_3 = 3 + const val DB_VER_4 = 4 + const val DB_VER_5 = 5 + const val DB_VER_6 = 6 + const val DB_VER_7 = 7 + const val DB_VER_8 = 8 + const val DB_VER_9 = 9 + + private val TAG = Migrations::class.java.getName() + private val isDebug = MainActivity.DEBUG + + val MIGRATION_1_2 = object : Migration(DB_VER_1, DB_VER_2) { + override fun migrate(db: SupportSQLiteDatabase) { + if (isDebug) { + Log.d(TAG, "Start migrating database") + } + + /* + * Unfortunately these queries must be hardcoded due to the possibility of + * schema and names changing at a later date, thus invalidating the older migration + * scripts if they are not hardcoded. + * */ + + // Not much we can do about this, since room doesn't create tables before migration. + // It's either this or blasting the entire database anew. + db.execSQL( + "CREATE INDEX `index_search_history_search` " + + "ON `search_history` (`search`)" + ) + db.execSQL( + "CREATE TABLE IF NOT EXISTS `streams` " + + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`service_id` INTEGER NOT NULL, `url` TEXT, `title` TEXT, " + + "`stream_type` TEXT, `duration` INTEGER, `uploader` TEXT, " + + "`thumbnail_url` TEXT)" + ) + db.execSQL( + "CREATE UNIQUE INDEX `index_streams_service_id_url` " + + "ON `streams` (`service_id`, `url`)" + ) + db.execSQL( + "CREATE TABLE IF NOT EXISTS `stream_history` " + + "(`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, " + + "`repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), " + + "FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) " + + "ON UPDATE CASCADE ON DELETE CASCADE )" + ) + db.execSQL( + "CREATE INDEX `index_stream_history_stream_id` " + + "ON `stream_history` (`stream_id`)" + ) + db.execSQL( + "CREATE TABLE IF NOT EXISTS `stream_state` " + + "(`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, " + + "PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) " + + "REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )" + ) + db.execSQL( + "CREATE TABLE IF NOT EXISTS `playlists` " + + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`name` TEXT, `thumbnail_url` TEXT)" + ) + db.execSQL("CREATE INDEX `index_playlists_name` ON `playlists` (`name`)") + db.execSQL( + "CREATE TABLE IF NOT EXISTS `playlist_stream_join` " + + "(`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, " + + "`join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), " + + "FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) " + + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, " + + "FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) " + + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" + ) + db.execSQL( + "CREATE UNIQUE INDEX " + + "`index_playlist_stream_join_playlist_id_join_index` " + + "ON `playlist_stream_join` (`playlist_id`, `join_index`)" + ) + db.execSQL( + "CREATE INDEX `index_playlist_stream_join_stream_id` " + + "ON `playlist_stream_join` (`stream_id`)" + ) + db.execSQL( + "CREATE TABLE IF NOT EXISTS `remote_playlists` " + + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, " + + "`thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)" + ) + db.execSQL( + "CREATE INDEX `index_remote_playlists_name` " + + "ON `remote_playlists` (`name`)" + ) + db.execSQL( + "CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` " + + "ON `remote_playlists` (`service_id`, `url`)" + ) + + // Populate streams table with existing entries in watch history + // Latest data first, thus ignoring older entries with the same indices + db.execSQL( + "INSERT OR IGNORE INTO streams (service_id, url, title, " + + "stream_type, duration, uploader, thumbnail_url) " + + + "SELECT service_id, url, title, 'VIDEO_STREAM', duration, " + + "uploader, thumbnail_url " + + + "FROM watch_history " + + "ORDER BY creation_date DESC" + ) + + // Once the streams have PKs, join them with the normalized history table + // and populate it with the remaining data from watch history + db.execSQL( + "INSERT INTO stream_history (stream_id, access_date, repeat_count)" + + "SELECT uid, creation_date, 1 " + + "FROM watch_history INNER JOIN streams " + + "ON watch_history.service_id == streams.service_id " + + "AND watch_history.url == streams.url " + + "ORDER BY creation_date DESC" + ) + + db.execSQL("DROP TABLE IF EXISTS watch_history") + + if (isDebug) { + Log.d(TAG, "Stop migrating database") + } + } + } + + val MIGRATION_2_3 = object : Migration(DB_VER_2, DB_VER_3) { + override fun migrate(db: SupportSQLiteDatabase) { + // Add NOT NULLs and new fields + db.execSQL( + "CREATE TABLE IF NOT EXISTS streams_new " + + "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "service_id INTEGER NOT NULL, url TEXT NOT NULL, title TEXT NOT NULL, " + + "stream_type TEXT NOT NULL, duration INTEGER NOT NULL, " + + "uploader TEXT NOT NULL, thumbnail_url TEXT, view_count INTEGER, " + + "textual_upload_date TEXT, upload_date INTEGER, " + + "is_upload_date_approximation INTEGER)" + ) + + db.execSQL( + "INSERT INTO streams_new (uid, service_id, url, title, stream_type, " + + "duration, uploader, thumbnail_url, view_count, textual_upload_date, " + + "upload_date, is_upload_date_approximation) " + + + "SELECT uid, service_id, url, ifnull(title, ''), " + + "ifnull(stream_type, 'VIDEO_STREAM'), ifnull(duration, 0), " + + "ifnull(uploader, ''), ifnull(thumbnail_url, ''), NULL, NULL, NULL, NULL " + + + "FROM streams WHERE url IS NOT NULL" + ) + + db.execSQL("DROP TABLE streams") + db.execSQL("ALTER TABLE streams_new RENAME TO streams") + db.execSQL( + "CREATE UNIQUE INDEX index_streams_service_id_url " + + "ON streams (service_id, url)" + ) + + // Tables for feed feature + db.execSQL( + "CREATE TABLE IF NOT EXISTS feed " + + "(stream_id INTEGER NOT NULL, subscription_id INTEGER NOT NULL, " + + "PRIMARY KEY(stream_id, subscription_id), " + + "FOREIGN KEY(stream_id) REFERENCES streams(uid) " + + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, " + + "FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) " + + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" + ) + db.execSQL("CREATE INDEX index_feed_subscription_id ON feed (subscription_id)") + db.execSQL( + "CREATE TABLE IF NOT EXISTS feed_group " + + "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL, " + + "icon_id INTEGER NOT NULL, sort_order INTEGER NOT NULL)" + ) + db.execSQL("CREATE INDEX index_feed_group_sort_order ON feed_group (sort_order)") + db.execSQL( + "CREATE TABLE IF NOT EXISTS feed_group_subscription_join " + + "(group_id INTEGER NOT NULL, subscription_id INTEGER NOT NULL, " + + "PRIMARY KEY(group_id, subscription_id), " + + "FOREIGN KEY(group_id) REFERENCES feed_group(uid) " + + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, " + + "FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) " + + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" + ) + db.execSQL( + "CREATE INDEX index_feed_group_subscription_join_subscription_id " + + "ON feed_group_subscription_join (subscription_id)" + ) + db.execSQL( + "CREATE TABLE IF NOT EXISTS feed_last_updated " + + "(subscription_id INTEGER NOT NULL, last_updated INTEGER, " + + "PRIMARY KEY(subscription_id), " + + "FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) " + + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" + ) + } + } + + val MIGRATION_3_4 = object : Migration(DB_VER_3, DB_VER_4) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE streams ADD COLUMN uploader_url TEXT") + } + } + + val MIGRATION_4_5 = object : Migration(DB_VER_4, DB_VER_5) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + "ALTER TABLE `subscriptions` ADD COLUMN `notification_mode` " + + "INTEGER NOT NULL DEFAULT 0" + ) + } + } + + val MIGRATION_5_6 = object : Migration(DB_VER_5, DB_VER_6) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + "ALTER TABLE `playlists` ADD COLUMN `is_thumbnail_permanent` " + + "INTEGER NOT NULL DEFAULT 0" + ) + } + } + + val MIGRATION_6_7 = object : Migration(DB_VER_6, DB_VER_7) { + override fun migrate(db: SupportSQLiteDatabase) { + // Create a new column thumbnail_stream_id + db.execSQL( + "ALTER TABLE `playlists` ADD COLUMN `thumbnail_stream_id` " + + "INTEGER NOT NULL DEFAULT -1" + ) + + // Migrate the thumbnail_url to the thumbnail_stream_id + db.execSQL( + "UPDATE playlists SET thumbnail_stream_id = (" + + " SELECT CASE WHEN COUNT(*) != 0 then stream_uid ELSE -1 END" + + " FROM (" + + " SELECT p.uid AS playlist_uid, s.uid AS stream_uid" + + " FROM playlists p" + + " LEFT JOIN playlist_stream_join ps ON p.uid = ps.playlist_id" + + " LEFT JOIN streams s ON s.uid = ps.stream_id" + + " WHERE s.thumbnail_url = p.thumbnail_url) AS temporary_table" + + " WHERE playlist_uid = playlists.uid)" + ) + + // Remove the thumbnail_url field in the playlist table + db.execSQL( + "CREATE TABLE IF NOT EXISTS `playlists_new`" + + "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "name TEXT, " + + "is_thumbnail_permanent INTEGER NOT NULL, " + + "thumbnail_stream_id INTEGER NOT NULL)" + ) + + db.execSQL( + "INSERT INTO playlists_new" + + " SELECT uid, name, is_thumbnail_permanent, thumbnail_stream_id " + + " FROM playlists" + ) + + db.execSQL("DROP TABLE playlists") + db.execSQL("ALTER TABLE playlists_new RENAME TO playlists") + db.execSQL( + "CREATE INDEX IF NOT EXISTS " + + "`index_playlists_name` ON `playlists` (`name`)" + ) + } + } + + val MIGRATION_7_8 = object : Migration(DB_VER_7, DB_VER_8) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + "DELETE FROM search_history WHERE id NOT IN (SELECT id FROM (SELECT " + + "MIN(id) as id FROM search_history GROUP BY trim(search), service_id ) tmp)" + ) + db.execSQL("UPDATE search_history SET search = trim(search)") + } + } + + val MIGRATION_8_9 = object : Migration(DB_VER_8, DB_VER_9) { + override fun migrate(db: SupportSQLiteDatabase) { + try { + db.beginTransaction() + + // Update playlists. + // Create a temp table to initialize display_index. + db.execSQL( + "CREATE TABLE `playlists_tmp` " + + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`name` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL, " + + "`thumbnail_stream_id` INTEGER NOT NULL, " + + "`display_index` INTEGER NOT NULL)" + ) + db.execSQL( + "INSERT INTO `playlists_tmp` " + + "(`uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " + + "`display_index`) " + + "SELECT `uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " + + "-1 " + + "FROM `playlists`" + ) + + // Replace the old table, note that this also removes the index on the name which + // we don't need anymore. + db.execSQL("DROP TABLE `playlists`") + db.execSQL("ALTER TABLE `playlists_tmp` RENAME TO `playlists`") + + // Update remote_playlists. + // Create a temp table to initialize display_index. + db.execSQL( + "CREATE TABLE `remote_playlists_tmp` " + + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, " + + "`thumbnail_url` TEXT, `uploader` TEXT, " + + "`display_index` INTEGER NOT NULL," + + "`stream_count` INTEGER)" + ) + db.execSQL( + "INSERT INTO `remote_playlists_tmp` (`uid`, `service_id`, " + + "`name`, `url`, `thumbnail_url`, `uploader`, `display_index`, " + + "`stream_count`)" + + "SELECT `uid`, `service_id`, `name`, `url`, `thumbnail_url`, `uploader`, " + + "-1, `stream_count` FROM `remote_playlists`" + ) + + // Replace the old table, note that this also removes the index on the name which + // we don't need anymore. + db.execSQL("DROP TABLE `remote_playlists`") + db.execSQL("ALTER TABLE `remote_playlists_tmp` RENAME TO `remote_playlists`") + + // Create index on the new table. + db.execSQL( + "CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` " + + "ON `remote_playlists` (`service_id`, `url`)" + ) + + db.setTransactionSuccessful() + } finally { + db.endTransaction() + } + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.java b/app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.java deleted file mode 100644 index 1ade08122..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.schabi.newpipe.database.history.dao; - -import org.schabi.newpipe.database.BasicDAO; - -public interface HistoryDAO extends BasicDAO { - T getLatestEntry(); -} diff --git a/app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.kt b/app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.kt new file mode 100644 index 000000000..d986d0c3b --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.kt @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2017 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.history.dao + +import org.schabi.newpipe.database.BasicDAO + +interface HistoryDAO : BasicDAO { + val latestEntry: T +} diff --git a/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.java b/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.java deleted file mode 100644 index 8a281bdb4..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.schabi.newpipe.database.history.dao; - -import androidx.annotation.Nullable; -import androidx.room.Dao; -import androidx.room.Query; - -import org.schabi.newpipe.database.history.model.SearchHistoryEntry; - -import java.util.List; - -import io.reactivex.rxjava3.core.Flowable; - -import static org.schabi.newpipe.database.history.model.SearchHistoryEntry.CREATION_DATE; -import static org.schabi.newpipe.database.history.model.SearchHistoryEntry.ID; -import static org.schabi.newpipe.database.history.model.SearchHistoryEntry.SEARCH; -import static org.schabi.newpipe.database.history.model.SearchHistoryEntry.SERVICE_ID; -import static org.schabi.newpipe.database.history.model.SearchHistoryEntry.TABLE_NAME; - -@Dao -public interface SearchHistoryDAO extends HistoryDAO { - String ORDER_BY_CREATION_DATE = " ORDER BY " + CREATION_DATE + " DESC"; - String ORDER_BY_MAX_CREATION_DATE = " ORDER BY MAX(" + CREATION_DATE + ") DESC"; - - @Query("SELECT * FROM " + TABLE_NAME - + " WHERE " + ID + " = (SELECT MAX(" + ID + ") FROM " + TABLE_NAME + ")") - @Nullable - SearchHistoryEntry getLatestEntry(); - - @Query("DELETE FROM " + TABLE_NAME) - @Override - int deleteAll(); - - @Query("DELETE FROM " + TABLE_NAME + " WHERE " + SEARCH + " = :query") - int deleteAllWhereQuery(String query); - - @Query("SELECT * FROM " + TABLE_NAME + ORDER_BY_CREATION_DATE) - @Override - Flowable> getAll(); - - @Query("SELECT " + SEARCH + " FROM " + TABLE_NAME + " GROUP BY " + SEARCH - + ORDER_BY_MAX_CREATION_DATE + " LIMIT :limit") - Flowable> getUniqueEntries(int limit); - - @Query("SELECT * FROM " + TABLE_NAME - + " WHERE " + SERVICE_ID + " = :serviceId" + ORDER_BY_CREATION_DATE) - @Override - Flowable> listByService(int serviceId); - - @Query("SELECT " + SEARCH + " FROM " + TABLE_NAME + " WHERE " + SEARCH + " LIKE :query || '%'" - + " GROUP BY " + SEARCH + ORDER_BY_MAX_CREATION_DATE + " LIMIT :limit") - Flowable> getSimilarEntries(String query, int limit); -} diff --git a/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt b/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt new file mode 100644 index 000000000..a249721fc --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2017-2021 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.history.dao + +import androidx.room.Dao +import androidx.room.Query +import io.reactivex.rxjava3.core.Flowable +import org.schabi.newpipe.database.history.model.SearchHistoryEntry + +@Dao +interface SearchHistoryDAO : HistoryDAO { + + @get:Query("SELECT * FROM search_history WHERE id = (SELECT MAX(id) FROM search_history)") + override val latestEntry: SearchHistoryEntry + + @Query("DELETE FROM search_history") + override fun deleteAll(): Int + + @Query("DELETE FROM search_history WHERE search = :query") + fun deleteAllWhereQuery(query: String): Int + + @Query("SELECT * FROM search_history ORDER BY creation_date DESC") + override fun getAll(): Flowable> + + @Query("SELECT search FROM search_history GROUP BY search ORDER BY MAX(creation_date) DESC LIMIT :limit") + fun getUniqueEntries(limit: Int): Flowable> + + @Query("SELECT * FROM search_history WHERE service_id = :serviceId ORDER BY creation_date DESC") + override fun listByService(serviceId: Int): Flowable> + + @Query( + """ + SELECT search FROM search_history WHERE search LIKE :query || + '%' GROUP BY search ORDER BY MAX(creation_date) DESC LIMIT :limit + """ + ) + fun getSimilarEntries(query: String, limit: Int): Flowable> +} diff --git a/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.java b/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.java deleted file mode 100644 index 150d4a8e5..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.schabi.newpipe.database.history.dao; - -import androidx.annotation.Nullable; -import androidx.room.Dao; -import androidx.room.Query; -import androidx.room.RewriteQueriesToDropUnusedColumns; - -import org.schabi.newpipe.database.history.model.StreamHistoryEntity; -import org.schabi.newpipe.database.history.model.StreamHistoryEntry; -import org.schabi.newpipe.database.stream.StreamStatisticsEntry; - -import java.util.List; - -import io.reactivex.rxjava3.core.Flowable; - -import static org.schabi.newpipe.database.history.model.StreamHistoryEntity.JOIN_STREAM_ID; -import static org.schabi.newpipe.database.history.model.StreamHistoryEntity.STREAM_ACCESS_DATE; -import static org.schabi.newpipe.database.history.model.StreamHistoryEntity.STREAM_HISTORY_TABLE; -import static org.schabi.newpipe.database.history.model.StreamHistoryEntity.STREAM_REPEAT_COUNT; -import static org.schabi.newpipe.database.stream.StreamStatisticsEntry.STREAM_LATEST_DATE; -import static org.schabi.newpipe.database.stream.StreamStatisticsEntry.STREAM_WATCH_COUNT; -import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_ID; -import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_TABLE; -import static org.schabi.newpipe.database.stream.model.StreamStateEntity.JOIN_STREAM_ID_ALIAS; -import static org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_PROGRESS_MILLIS; -import static org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_STATE_TABLE; - -@Dao -public abstract class StreamHistoryDAO implements HistoryDAO { - @Query("SELECT * FROM " + STREAM_HISTORY_TABLE - + " WHERE " + STREAM_ACCESS_DATE + " = " - + "(SELECT MAX(" + STREAM_ACCESS_DATE + ") FROM " + STREAM_HISTORY_TABLE + ")") - @Override - @Nullable - public abstract StreamHistoryEntity getLatestEntry(); - - @Override - @Query("SELECT * FROM " + STREAM_HISTORY_TABLE) - public abstract Flowable> getAll(); - - @Override - @Query("DELETE FROM " + STREAM_HISTORY_TABLE) - public abstract int deleteAll(); - - @Override - public Flowable> listByService(final int serviceId) { - throw new UnsupportedOperationException(); - } - - @Query("SELECT * FROM " + STREAM_TABLE - + " INNER JOIN " + STREAM_HISTORY_TABLE - + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID - + " ORDER BY " + STREAM_ACCESS_DATE + " DESC") - public abstract Flowable> getHistory(); - - - @Query("SELECT * FROM " + STREAM_TABLE - + " INNER JOIN " + STREAM_HISTORY_TABLE - + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID - + " ORDER BY " + STREAM_ID + " ASC") - public abstract Flowable> getHistorySortedById(); - - @Query("SELECT * FROM " + STREAM_HISTORY_TABLE + " WHERE " + JOIN_STREAM_ID - + " = :streamId ORDER BY " + STREAM_ACCESS_DATE + " DESC LIMIT 1") - @Nullable - public abstract StreamHistoryEntity getLatestEntry(long streamId); - - @Query("DELETE FROM " + STREAM_HISTORY_TABLE + " WHERE " + JOIN_STREAM_ID + " = :streamId") - public abstract int deleteStreamHistory(long streamId); - - @RewriteQueriesToDropUnusedColumns - @Query("SELECT * FROM " + STREAM_TABLE - - // Select the latest entry and watch count for each stream id on history table - + " INNER JOIN " - + "(SELECT " + JOIN_STREAM_ID + ", " - + " MAX(" + STREAM_ACCESS_DATE + ") AS " + STREAM_LATEST_DATE + ", " - + " SUM(" + STREAM_REPEAT_COUNT + ") AS " + STREAM_WATCH_COUNT - + " FROM " + STREAM_HISTORY_TABLE + " GROUP BY " + JOIN_STREAM_ID + ")" - - + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID - - + " LEFT JOIN " - + "(SELECT " + JOIN_STREAM_ID + " AS " + JOIN_STREAM_ID_ALIAS + ", " - + STREAM_PROGRESS_MILLIS - + " FROM " + STREAM_STATE_TABLE + " )" - + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID_ALIAS) - public abstract Flowable> getStatistics(); -} diff --git a/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt b/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt new file mode 100644 index 000000000..dfea41e12 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt @@ -0,0 +1,63 @@ +/* + * SPDX-FileCopyrightText: 2018-2022 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.history.dao + +import androidx.room.Dao +import androidx.room.Query +import androidx.room.RewriteQueriesToDropUnusedColumns +import io.reactivex.rxjava3.core.Flowable +import org.schabi.newpipe.database.history.model.StreamHistoryEntity +import org.schabi.newpipe.database.history.model.StreamHistoryEntry +import org.schabi.newpipe.database.stream.StreamStatisticsEntry + +@Dao +abstract class StreamHistoryDAO : HistoryDAO { + + @get:Query("SELECT * FROM stream_history WHERE access_date = (SELECT MAX(access_date) FROM stream_history)") + abstract override val latestEntry: StreamHistoryEntity + + @Query("SELECT * FROM stream_history") + abstract override fun getAll(): Flowable> + + @Query("DELETE FROM stream_history") + abstract override fun deleteAll(): Int + + override fun listByService(serviceId: Int): Flowable> { + throw UnsupportedOperationException() + } + + @get:Query("SELECT * FROM streams INNER JOIN stream_history ON uid = stream_id ORDER BY access_date DESC") + abstract val history: Flowable> + + @get:Query("SELECT * FROM streams INNER JOIN stream_history ON uid = stream_id ORDER BY uid ASC") + abstract val historySortedById: Flowable> + + @Query("SELECT * FROM stream_history WHERE stream_id = :streamId ORDER BY access_date DESC LIMIT 1") + abstract fun getLatestEntry(streamId: Long): StreamHistoryEntity + + @Query("DELETE FROM stream_history WHERE stream_id = :streamId") + abstract fun deleteStreamHistory(streamId: Long): Int + + // Select the latest entry and watch count for each stream id on history table + @RewriteQueriesToDropUnusedColumns + @Query( + """ + SELECT * FROM streams + + INNER JOIN ( + SELECT stream_id, MAX(access_date) AS latestAccess, SUM(repeat_count) AS watchCount + FROM stream_history + GROUP BY stream_id + ) + ON uid = stream_id + + LEFT JOIN (SELECT stream_id AS stream_id_alias, progress_time FROM stream_state ) + ON uid = stream_id_alias + """ + ) + abstract fun getStatistics(): Flowable> +} diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt index 8cb9a25ca..e6006a069 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt @@ -1,3 +1,9 @@ +/* + * SPDX-FileCopyrightText: 2022 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + package org.schabi.newpipe.database.history.model import androidx.room.ColumnInfo @@ -11,23 +17,24 @@ import java.time.OffsetDateTime tableName = SearchHistoryEntry.TABLE_NAME, indices = [Index(value = [SearchHistoryEntry.SEARCH])] ) -data class SearchHistoryEntry( - @field:ColumnInfo(name = CREATION_DATE) var creationDate: OffsetDateTime?, - @field:ColumnInfo( - name = SERVICE_ID - ) var serviceId: Int, - @field:ColumnInfo(name = SEARCH) var search: String? -) { +data class SearchHistoryEntry @JvmOverloads constructor( + @ColumnInfo(name = CREATION_DATE) + var creationDate: OffsetDateTime?, + + @ColumnInfo(name = SERVICE_ID) + val serviceId: Int, + + @ColumnInfo(name = SEARCH) + val search: String?, + @ColumnInfo(name = ID) @PrimaryKey(autoGenerate = true) - var id: Long = 0 + val id: Long = 0, +) { @Ignore fun hasEqualValues(otherEntry: SearchHistoryEntry): Boolean { - return ( - serviceId == otherEntry.serviceId && - search == otherEntry.search - ) + return serviceId == otherEntry.serviceId && search == otherEntry.search } companion object { diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.java b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.java deleted file mode 100644 index a9d69afe8..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.schabi.newpipe.database.history.model; - -import androidx.annotation.NonNull; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.ForeignKey; -import androidx.room.Index; - -import org.schabi.newpipe.database.stream.model.StreamEntity; - -import java.time.OffsetDateTime; - -import static androidx.room.ForeignKey.CASCADE; -import static org.schabi.newpipe.database.history.model.StreamHistoryEntity.JOIN_STREAM_ID; -import static org.schabi.newpipe.database.history.model.StreamHistoryEntity.STREAM_ACCESS_DATE; -import static org.schabi.newpipe.database.history.model.StreamHistoryEntity.STREAM_HISTORY_TABLE; - -@Entity(tableName = STREAM_HISTORY_TABLE, - primaryKeys = {JOIN_STREAM_ID, STREAM_ACCESS_DATE}, - // No need to index for timestamp as they will almost always be unique - indices = {@Index(value = {JOIN_STREAM_ID})}, - foreignKeys = { - @ForeignKey(entity = StreamEntity.class, - parentColumns = StreamEntity.STREAM_ID, - childColumns = JOIN_STREAM_ID, - onDelete = CASCADE, onUpdate = CASCADE) - }) -public class StreamHistoryEntity { - public static final String STREAM_HISTORY_TABLE = "stream_history"; - public static final String JOIN_STREAM_ID = "stream_id"; - public static final String STREAM_ACCESS_DATE = "access_date"; - public static final String STREAM_REPEAT_COUNT = "repeat_count"; - - @ColumnInfo(name = JOIN_STREAM_ID) - private long streamUid; - - @NonNull - @ColumnInfo(name = STREAM_ACCESS_DATE) - private OffsetDateTime accessDate; - - @ColumnInfo(name = STREAM_REPEAT_COUNT) - private long repeatCount; - - /** - * @param streamUid the stream id this history item will refer to - * @param accessDate the last time the stream was accessed - * @param repeatCount the total number of views this stream received - */ - public StreamHistoryEntity(final long streamUid, - @NonNull final OffsetDateTime accessDate, - final long repeatCount) { - this.streamUid = streamUid; - this.accessDate = accessDate; - this.repeatCount = repeatCount; - } - - public long getStreamUid() { - return streamUid; - } - - public void setStreamUid(final long streamUid) { - this.streamUid = streamUid; - } - - @NonNull - public OffsetDateTime getAccessDate() { - return accessDate; - } - - public void setAccessDate(@NonNull final OffsetDateTime accessDate) { - this.accessDate = accessDate; - } - - public long getRepeatCount() { - return repeatCount; - } - - public void setRepeatCount(final long repeatCount) { - this.repeatCount = repeatCount; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt new file mode 100644 index 000000000..db41e141c --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt @@ -0,0 +1,56 @@ +/* + * SPDX-FileCopyrightText: 2018-2022 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.history.model + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.ForeignKey.Companion.CASCADE +import androidx.room.Index +import org.schabi.newpipe.database.history.model.StreamHistoryEntity.Companion.JOIN_STREAM_ID +import org.schabi.newpipe.database.history.model.StreamHistoryEntity.Companion.STREAM_ACCESS_DATE +import org.schabi.newpipe.database.history.model.StreamHistoryEntity.Companion.STREAM_HISTORY_TABLE +import org.schabi.newpipe.database.stream.model.StreamEntity +import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_ID +import java.time.OffsetDateTime + +/** + * @param streamUid the stream id this history item will refer to + * @param accessDate the last time the stream was accessed + * @param repeatCount the total number of views this stream received + */ +@Entity( + tableName = STREAM_HISTORY_TABLE, + primaryKeys = [JOIN_STREAM_ID, STREAM_ACCESS_DATE], + indices = [Index(value = [JOIN_STREAM_ID])], + foreignKeys = [ + ForeignKey( + entity = StreamEntity::class, + parentColumns = arrayOf(STREAM_ID), + childColumns = arrayOf(JOIN_STREAM_ID), + onDelete = CASCADE, + onUpdate = CASCADE + ) + ] +) +data class StreamHistoryEntity( + @ColumnInfo(name = JOIN_STREAM_ID) + val streamUid: Long, + + @ColumnInfo(name = STREAM_ACCESS_DATE) + var accessDate: OffsetDateTime, + + @ColumnInfo(name = STREAM_REPEAT_COUNT) + var repeatCount: Long +) { + companion object { + const val STREAM_HISTORY_TABLE: String = "stream_history" + const val STREAM_ACCESS_DATE: String = "access_date" + const val JOIN_STREAM_ID: String = "stream_id" + const val STREAM_REPEAT_COUNT: String = "repeat_count" + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.java deleted file mode 100644 index 3be85e6e1..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.schabi.newpipe.database.playlist; - -import androidx.room.ColumnInfo; - -/** - * This class adds a field to {@link PlaylistMetadataEntry} that contains an integer representing - * how many times a specific stream is already contained inside a local playlist. Used to be able - * to grey out playlists which already contain the current stream in the playlist append dialog. - * @see org.schabi.newpipe.local.playlist.LocalPlaylistManager#getPlaylistDuplicates(String) - */ -public class PlaylistDuplicatesEntry extends PlaylistMetadataEntry { - public static final String PLAYLIST_TIMES_STREAM_IS_CONTAINED = "timesStreamIsContained"; - @ColumnInfo(name = PLAYLIST_TIMES_STREAM_IS_CONTAINED) - public final long timesStreamIsContained; - - @SuppressWarnings("checkstyle:ParameterNumber") - public PlaylistDuplicatesEntry(final long uid, - final String name, - final String thumbnailUrl, - final boolean isThumbnailPermanent, - final long thumbnailStreamId, - final long displayIndex, - final long streamCount, - final long timesStreamIsContained) { - super(uid, name, thumbnailUrl, isThumbnailPermanent, thumbnailStreamId, displayIndex, - streamCount); - this.timesStreamIsContained = timesStreamIsContained; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.kt new file mode 100644 index 000000000..f0447df6e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.kt @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2023-2024 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.playlist + +import androidx.room.ColumnInfo + +/** + * This class adds a field to [PlaylistMetadataEntry] that contains an integer representing + * how many times a specific stream is already contained inside a local playlist. Used to be able + * to grey out playlists which already contain the current stream in the playlist append dialog. + * @see org.schabi.newpipe.local.playlist.LocalPlaylistManager.getPlaylistDuplicates + */ +data class PlaylistDuplicatesEntry( + override val uid: Long, + override val thumbnailUrl: String?, + override val isThumbnailPermanent: Boolean?, + override val thumbnailStreamId: Long?, + override var displayIndex: Long?, + override val streamCount: Long, + override val orderingName: String?, + + @ColumnInfo(name = PLAYLIST_TIMES_STREAM_IS_CONTAINED) + val timesStreamIsContained: Long +) : PlaylistMetadataEntry( + uid = uid, + orderingName = orderingName, + thumbnailUrl = thumbnailUrl, + isThumbnailPermanent = isThumbnailPermanent, + thumbnailStreamId = thumbnailStreamId, + displayIndex = displayIndex, + streamCount = streamCount +) { + companion object { + const val PLAYLIST_TIMES_STREAM_IS_CONTAINED: String = "timesStreamIsContained" + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java deleted file mode 100644 index 91f4622e9..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.schabi.newpipe.database.playlist; - -import androidx.annotation.Nullable; - -import org.schabi.newpipe.database.LocalItem; - -public interface PlaylistLocalItem extends LocalItem { - String getOrderingName(); - - long getDisplayIndex(); - - long getUid(); - - void setDisplayIndex(long displayIndex); - - @Nullable - String getThumbnailUrl(); -} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.kt new file mode 100644 index 000000000..4f2f79aa0 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.kt @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: 2018-2025 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.playlist + +import org.schabi.newpipe.database.LocalItem + +interface PlaylistLocalItem : LocalItem { + val orderingName: String? + val displayIndex: Long? + val uid: Long + val thumbnailUrl: String? +} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java deleted file mode 100644 index 8fbadb020..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.schabi.newpipe.database.playlist; - -import androidx.room.ColumnInfo; - -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_DISPLAY_INDEX; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_ID; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_NAME; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_PERMANENT; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_STREAM_ID; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_URL; - -import androidx.annotation.Nullable; - -public class PlaylistMetadataEntry implements PlaylistLocalItem { - public static final String PLAYLIST_STREAM_COUNT = "streamCount"; - - @ColumnInfo(name = PLAYLIST_ID) - private final long uid; - @ColumnInfo(name = PLAYLIST_NAME) - public final String name; - @ColumnInfo(name = PLAYLIST_THUMBNAIL_PERMANENT) - private final boolean isThumbnailPermanent; - @ColumnInfo(name = PLAYLIST_THUMBNAIL_STREAM_ID) - private final long thumbnailStreamId; - @ColumnInfo(name = PLAYLIST_THUMBNAIL_URL) - public final String thumbnailUrl; - @ColumnInfo(name = PLAYLIST_DISPLAY_INDEX) - private long displayIndex; - @ColumnInfo(name = PLAYLIST_STREAM_COUNT) - public final long streamCount; - - public PlaylistMetadataEntry(final long uid, final String name, final String thumbnailUrl, - final boolean isThumbnailPermanent, final long thumbnailStreamId, - final long displayIndex, final long streamCount) { - this.uid = uid; - this.name = name; - this.thumbnailUrl = thumbnailUrl; - this.isThumbnailPermanent = isThumbnailPermanent; - this.thumbnailStreamId = thumbnailStreamId; - this.displayIndex = displayIndex; - this.streamCount = streamCount; - } - - @Override - public LocalItemType getLocalItemType() { - return LocalItemType.PLAYLIST_LOCAL_ITEM; - } - - @Override - public String getOrderingName() { - return name; - } - - public boolean isThumbnailPermanent() { - return isThumbnailPermanent; - } - - public long getThumbnailStreamId() { - return thumbnailStreamId; - } - - @Override - public long getDisplayIndex() { - return displayIndex; - } - - @Override - public long getUid() { - return uid; - } - - @Override - public void setDisplayIndex(final long displayIndex) { - this.displayIndex = displayIndex; - } - - @Nullable - @Override - public String getThumbnailUrl() { - return thumbnailUrl; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.kt new file mode 100644 index 000000000..9b62c1380 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.kt @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2018-2025 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.playlist + +import androidx.room.ColumnInfo +import org.schabi.newpipe.database.LocalItem.LocalItemType +import org.schabi.newpipe.database.playlist.model.PlaylistEntity + +open class PlaylistMetadataEntry( + @ColumnInfo(name = PlaylistEntity.PLAYLIST_ID) + override val uid: Long, + + @ColumnInfo(name = PlaylistEntity.PLAYLIST_NAME) + override val orderingName: String?, + + @ColumnInfo(name = PlaylistEntity.PLAYLIST_THUMBNAIL_URL) + override val thumbnailUrl: String?, + + @ColumnInfo(name = PlaylistEntity.PLAYLIST_DISPLAY_INDEX) + override var displayIndex: Long?, + + @ColumnInfo(name = PlaylistEntity.PLAYLIST_THUMBNAIL_PERMANENT) + open val isThumbnailPermanent: Boolean?, + + @ColumnInfo(name = PlaylistEntity.PLAYLIST_THUMBNAIL_STREAM_ID) + open val thumbnailStreamId: Long?, + + @ColumnInfo(name = PLAYLIST_STREAM_COUNT) + open val streamCount: Long +) : PlaylistLocalItem { + + override val localItemType: LocalItemType + get() = LocalItemType.PLAYLIST_LOCAL_ITEM + + companion object { + const val PLAYLIST_STREAM_COUNT: String = "streamCount" + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt index 1d74c6d31..90fdee2d3 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt @@ -1,3 +1,9 @@ +/* + * SPDX-FileCopyrightText: 2020-2023 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + package org.schabi.newpipe.database.playlist import androidx.room.ColumnInfo @@ -23,18 +29,21 @@ data class PlaylistStreamEntry( val joinIndex: Int ) : LocalItem { + override val localItemType: LocalItem.LocalItemType + get() = LocalItem.LocalItemType.PLAYLIST_STREAM_ITEM + @Throws(IllegalArgumentException::class) fun toStreamInfoItem(): StreamInfoItem { - val item = StreamInfoItem(streamEntity.serviceId, streamEntity.url, streamEntity.title, streamEntity.streamType) - item.duration = streamEntity.duration - item.uploaderName = streamEntity.uploader - item.uploaderUrl = streamEntity.uploaderUrl - item.thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl) - - return item - } - - override fun getLocalItemType(): LocalItem.LocalItemType { - return LocalItem.LocalItemType.PLAYLIST_STREAM_ITEM + return StreamInfoItem( + streamEntity.serviceId, + streamEntity.url, + streamEntity.title, + streamEntity.streamType + ).apply { + duration = streamEntity.duration + uploaderName = streamEntity.uploader + uploaderUrl = streamEntity.uploaderUrl + thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl) + } } } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java deleted file mode 100644 index d8071e0af..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.schabi.newpipe.database.playlist.dao; - -import androidx.room.Dao; -import androidx.room.Query; -import androidx.room.Transaction; - -import org.schabi.newpipe.database.BasicDAO; -import org.schabi.newpipe.database.playlist.model.PlaylistEntity; - -import java.util.List; - -import io.reactivex.rxjava3.core.Flowable; - -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_ID; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_TABLE; - -@Dao -public interface PlaylistDAO extends BasicDAO { - @Override - @Query("SELECT * FROM " + PLAYLIST_TABLE) - Flowable> getAll(); - - @Override - @Query("DELETE FROM " + PLAYLIST_TABLE) - int deleteAll(); - - @Override - default Flowable> listByService(final int serviceId) { - throw new UnsupportedOperationException(); - } - - @Query("SELECT * FROM " + PLAYLIST_TABLE + " WHERE " + PLAYLIST_ID + " = :playlistId") - Flowable> getPlaylist(long playlistId); - - @Query("DELETE FROM " + PLAYLIST_TABLE + " WHERE " + PLAYLIST_ID + " = :playlistId") - int deletePlaylist(long playlistId); - - @Query("SELECT COUNT(*) FROM " + PLAYLIST_TABLE) - Flowable getCount(); - - @Transaction - default long upsertPlaylist(final PlaylistEntity playlist) { - final long playlistId = playlist.getUid(); - - if (playlistId == -1) { - // This situation is probably impossible. - return insert(playlist); - } else { - update(playlist); - return playlistId; - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.kt new file mode 100644 index 000000000..9c2dd89a8 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.kt @@ -0,0 +1,48 @@ +/* + * SPDX-FileCopyrightText: 2018-2022 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.playlist.dao + +import androidx.room.Dao +import androidx.room.Query +import androidx.room.Transaction +import io.reactivex.rxjava3.core.Flowable +import org.schabi.newpipe.database.BasicDAO +import org.schabi.newpipe.database.playlist.model.PlaylistEntity + +@Dao +interface PlaylistDAO : BasicDAO { + + @Query("SELECT * FROM playlists") + override fun getAll(): Flowable> + + @Query("DELETE FROM playlists") + override fun deleteAll(): Int + + override fun listByService(serviceId: Int): Flowable> { + throw UnsupportedOperationException() + } + + @Query("SELECT * FROM playlists WHERE uid = :playlistId") + fun getPlaylist(playlistId: Long): Flowable> + + @Query("DELETE FROM playlists WHERE uid = :playlistId") + fun deletePlaylist(playlistId: Long): Int + + @get:Query("SELECT COUNT(*) FROM playlists") + val count: Flowable + + @Transaction + fun upsertPlaylist(playlist: PlaylistEntity): Long { + if (playlist.uid == -1L) { + // This situation is probably impossible. + return insert(playlist) + } else { + update(playlist) + return playlist.uid + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java deleted file mode 100644 index ef77d5ade..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.schabi.newpipe.database.playlist.dao; - -import androidx.room.Dao; -import androidx.room.Query; -import androidx.room.Transaction; - -import org.schabi.newpipe.database.BasicDAO; -import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; - -import java.util.List; - -import io.reactivex.rxjava3.core.Flowable; - -import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_DISPLAY_INDEX; -import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_ID; -import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_SERVICE_ID; -import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_TABLE; -import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_URL; - -@Dao -public interface PlaylistRemoteDAO extends BasicDAO { - @Override - @Query("SELECT * FROM " + REMOTE_PLAYLIST_TABLE) - Flowable> getAll(); - - @Override - @Query("DELETE FROM " + REMOTE_PLAYLIST_TABLE) - int deleteAll(); - - @Override - @Query("SELECT * FROM " + REMOTE_PLAYLIST_TABLE - + " WHERE " + REMOTE_PLAYLIST_SERVICE_ID + " = :serviceId") - Flowable> listByService(int serviceId); - - @Query("SELECT * FROM " + REMOTE_PLAYLIST_TABLE + " WHERE " - + REMOTE_PLAYLIST_ID + " = :playlistId") - Flowable getPlaylist(long playlistId); - - @Query("SELECT * FROM " + REMOTE_PLAYLIST_TABLE + " WHERE " - + REMOTE_PLAYLIST_URL + " = :url AND " + REMOTE_PLAYLIST_SERVICE_ID + " = :serviceId") - Flowable> getPlaylist(long serviceId, String url); - - @Query("SELECT * FROM " + REMOTE_PLAYLIST_TABLE - + " ORDER BY " + REMOTE_PLAYLIST_DISPLAY_INDEX) - Flowable> getPlaylists(); - - @Query("SELECT " + REMOTE_PLAYLIST_ID + " FROM " + REMOTE_PLAYLIST_TABLE - + " WHERE " + REMOTE_PLAYLIST_URL + " = :url " - + "AND " + REMOTE_PLAYLIST_SERVICE_ID + " = :serviceId") - Long getPlaylistIdInternal(long serviceId, String url); - - @Transaction - default long upsert(final PlaylistRemoteEntity playlist) { - final Long playlistId = getPlaylistIdInternal(playlist.getServiceId(), playlist.getUrl()); - - if (playlistId == null) { - return insert(playlist); - } else { - playlist.setUid(playlistId); - update(playlist); - return playlistId; - } - } - - @Query("DELETE FROM " + REMOTE_PLAYLIST_TABLE - + " WHERE " + REMOTE_PLAYLIST_ID + " = :playlistId") - int deletePlaylist(long playlistId); -} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt new file mode 100644 index 000000000..8e0b80c3b --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt @@ -0,0 +1,55 @@ +/* + * SPDX-FileCopyrightText: 2018-2025 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.playlist.dao + +import androidx.room.Dao +import androidx.room.Query +import androidx.room.Transaction +import io.reactivex.rxjava3.core.Flowable +import org.schabi.newpipe.database.BasicDAO +import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity + +@Dao +interface PlaylistRemoteDAO : BasicDAO { + + @Query("SELECT * FROM remote_playlists") + override fun getAll(): Flowable> + + @Query("DELETE FROM remote_playlists") + override fun deleteAll(): Int + + @Query("SELECT * FROM remote_playlists WHERE service_id = :serviceId") + override fun listByService(serviceId: Int): Flowable> + + @Query("SELECT * FROM remote_playlists WHERE uid = :playlistId") + fun getPlaylist(playlistId: Long): Flowable + + @Query("SELECT * FROM remote_playlists WHERE url = :url AND uid = :serviceId") + fun getPlaylist(serviceId: Long, url: String?): Flowable> + + @get:Query("SELECT * FROM remote_playlists ORDER BY display_index") + val playlists: Flowable> + + @Query("SELECT uid FROM remote_playlists WHERE url = :url AND service_id = :serviceId") + fun getPlaylistIdInternal(serviceId: Long, url: String?): Long? + + @Transaction + fun upsert(playlist: PlaylistRemoteEntity): Long { + val playlistId = getPlaylistIdInternal(playlist.serviceId.toLong(), playlist.url) + + if (playlistId == null) { + return insert(playlist) + } else { + playlist.uid = playlistId + update(playlist) + return playlistId + } + } + + @Query("DELETE FROM remote_playlists WHERE uid = :playlistId") + fun deletePlaylist(playlistId: Long): Int +} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java deleted file mode 100644 index 6b77166ea..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ /dev/null @@ -1,159 +0,0 @@ -package org.schabi.newpipe.database.playlist.dao; - -import androidx.room.Dao; -import androidx.room.Query; -import androidx.room.RewriteQueriesToDropUnusedColumns; -import androidx.room.Transaction; - -import org.schabi.newpipe.database.BasicDAO; -import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry; -import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; -import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; -import org.schabi.newpipe.database.playlist.model.PlaylistEntity; -import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity; - -import java.util.List; - -import io.reactivex.rxjava3.core.Flowable; - -import static org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry.PLAYLIST_TIMES_STREAM_IS_CONTAINED; -import static org.schabi.newpipe.database.playlist.PlaylistMetadataEntry.PLAYLIST_STREAM_COUNT; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_DISPLAY_INDEX; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.DEFAULT_THUMBNAIL; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_ID; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_NAME; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_TABLE; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_PERMANENT; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_STREAM_ID; -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_URL; -import static org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.JOIN_INDEX; -import static org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.JOIN_PLAYLIST_ID; -import static org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.JOIN_STREAM_ID; -import static org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.PLAYLIST_STREAM_JOIN_TABLE; -import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_ID; -import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_TABLE; -import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_THUMBNAIL_URL; -import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_URL; -import static org.schabi.newpipe.database.stream.model.StreamStateEntity.JOIN_STREAM_ID_ALIAS; -import static org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_PROGRESS_MILLIS; -import static org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_STATE_TABLE; - -@Dao -public interface PlaylistStreamDAO extends BasicDAO { - @Override - @Query("SELECT * FROM " + PLAYLIST_STREAM_JOIN_TABLE) - Flowable> getAll(); - - @Override - @Query("DELETE FROM " + PLAYLIST_STREAM_JOIN_TABLE) - int deleteAll(); - - @Override - default Flowable> listByService(final int serviceId) { - throw new UnsupportedOperationException(); - } - - @Query("DELETE FROM " + PLAYLIST_STREAM_JOIN_TABLE - + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId") - void deleteBatch(long playlistId); - - @Query("SELECT COALESCE(MAX(" + JOIN_INDEX + "), -1)" - + " FROM " + PLAYLIST_STREAM_JOIN_TABLE - + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId") - Flowable getMaximumIndexOf(long playlistId); - - @Query("SELECT CASE WHEN COUNT(*) != 0 then " + STREAM_ID - + " ELSE " + PlaylistEntity.DEFAULT_THUMBNAIL_ID + " END" - + " FROM " + STREAM_TABLE - + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE - + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID - + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId " - + " LIMIT 1" - ) - Flowable getAutomaticThumbnailStreamId(long playlistId); - - @RewriteQueriesToDropUnusedColumns - @Transaction - @Query("SELECT * FROM " + STREAM_TABLE + " INNER JOIN " - // get ids of streams of the given playlist - + "(SELECT " + JOIN_STREAM_ID + "," + JOIN_INDEX - + " FROM " + PLAYLIST_STREAM_JOIN_TABLE - + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId)" - - // then merge with the stream metadata - + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID - - + " LEFT JOIN " - + "(SELECT " + JOIN_STREAM_ID + " AS " + JOIN_STREAM_ID_ALIAS + ", " - + STREAM_PROGRESS_MILLIS - + " FROM " + STREAM_STATE_TABLE + " )" - + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID_ALIAS - - + " ORDER BY " + JOIN_INDEX + " ASC") - Flowable> getOrderedStreamsOf(long playlistId); - - @Transaction - @Query("SELECT " + PLAYLIST_ID + ", " + PLAYLIST_NAME + ", " - + PLAYLIST_THUMBNAIL_PERMANENT + ", " + PLAYLIST_THUMBNAIL_STREAM_ID + ", " - + PLAYLIST_DISPLAY_INDEX + ", " - - + " CASE WHEN " + PLAYLIST_THUMBNAIL_STREAM_ID + " = " - + PlaylistEntity.DEFAULT_THUMBNAIL_ID + " THEN " + "'" + DEFAULT_THUMBNAIL + "'" - + " ELSE (SELECT " + STREAM_THUMBNAIL_URL - + " FROM " + STREAM_TABLE - + " WHERE " + STREAM_TABLE + "." + STREAM_ID + " = " + PLAYLIST_THUMBNAIL_STREAM_ID - + " ) END AS " + PLAYLIST_THUMBNAIL_URL + ", " - - + "COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT - + " FROM " + PLAYLIST_TABLE - + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE - + " ON " + PLAYLIST_TABLE + "." + PLAYLIST_ID + " = " + JOIN_PLAYLIST_ID - + " GROUP BY " + PLAYLIST_ID - + " ORDER BY " + PLAYLIST_DISPLAY_INDEX) - Flowable> getPlaylistMetadata(); - - @RewriteQueriesToDropUnusedColumns - @Transaction - @Query("SELECT *, MIN(" + JOIN_INDEX + ")" - + " FROM " + STREAM_TABLE + " INNER JOIN" - + " (SELECT " + JOIN_STREAM_ID + "," + JOIN_INDEX - + " FROM " + PLAYLIST_STREAM_JOIN_TABLE - + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId)" - + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID - + " LEFT JOIN " - + "(SELECT " + JOIN_STREAM_ID + " AS " + JOIN_STREAM_ID_ALIAS + ", " - + STREAM_PROGRESS_MILLIS - + " FROM " + STREAM_STATE_TABLE + " )" - + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID_ALIAS - + " GROUP BY " + STREAM_ID - + " ORDER BY MIN(" + JOIN_INDEX + ") ASC") - Flowable> getStreamsWithoutDuplicates(long playlistId); - - @Transaction - @Query("SELECT " + PLAYLIST_TABLE + "." + PLAYLIST_ID + ", " + PLAYLIST_NAME + ", " - + PLAYLIST_THUMBNAIL_PERMANENT + ", " + PLAYLIST_THUMBNAIL_STREAM_ID + ", " - + PLAYLIST_DISPLAY_INDEX + ", " - - + " CASE WHEN " + PLAYLIST_THUMBNAIL_STREAM_ID + " = " - + PlaylistEntity.DEFAULT_THUMBNAIL_ID + " THEN " + "'" + DEFAULT_THUMBNAIL + "'" - + " ELSE (SELECT " + STREAM_THUMBNAIL_URL - + " FROM " + STREAM_TABLE - + " WHERE " + STREAM_TABLE + "." + STREAM_ID + " = " + PLAYLIST_THUMBNAIL_STREAM_ID - + " ) END AS " + PLAYLIST_THUMBNAIL_URL + ", " - - + "COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT + ", " - + "COALESCE(SUM(" + STREAM_URL + " = :streamUrl), 0) AS " - + PLAYLIST_TIMES_STREAM_IS_CONTAINED - - + " FROM " + PLAYLIST_TABLE - + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE - + " ON " + PLAYLIST_TABLE + "." + PLAYLIST_ID + " = " + JOIN_PLAYLIST_ID - - + " LEFT JOIN " + STREAM_TABLE - + " ON " + STREAM_TABLE + "." + STREAM_ID + " = " + JOIN_STREAM_ID - + " AND :streamUrl = :streamUrl" - - + " GROUP BY " + JOIN_PLAYLIST_ID - + " ORDER BY " + PLAYLIST_DISPLAY_INDEX + ", " + PLAYLIST_NAME) - Flowable> getPlaylistDuplicatesMetadata(String streamUrl); -} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt new file mode 100644 index 000000000..11ad38685 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt @@ -0,0 +1,151 @@ +/* + * SPDX-FileCopyrightText: 2018-2024 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.playlist.dao + +import androidx.room.Dao +import androidx.room.Query +import androidx.room.RewriteQueriesToDropUnusedColumns +import androidx.room.Transaction +import io.reactivex.rxjava3.core.Flowable +import org.schabi.newpipe.database.BasicDAO +import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry +import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry +import org.schabi.newpipe.database.playlist.PlaylistStreamEntry +import org.schabi.newpipe.database.playlist.model.PlaylistEntity.Companion.DEFAULT_THUMBNAIL +import org.schabi.newpipe.database.playlist.model.PlaylistEntity.Companion.DEFAULT_THUMBNAIL_ID +import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity + +@Dao +interface PlaylistStreamDAO : BasicDAO { + + @Query("SELECT * FROM playlist_stream_join") + override fun getAll(): Flowable> + + @Query("DELETE FROM playlist_stream_join") + override fun deleteAll(): Int + + override fun listByService(serviceId: Int): Flowable> { + throw UnsupportedOperationException() + } + + @Query("DELETE FROM playlist_stream_join WHERE playlist_id = :playlistId") + fun deleteBatch(playlistId: Long) + + @Query("SELECT COALESCE(MAX(join_index), -1) FROM playlist_stream_join WHERE playlist_id = :playlistId") + fun getMaximumIndexOf(playlistId: Long): Flowable + + @Query( + """ + SELECT CASE WHEN COUNT(*) != 0 then stream_id ELSE $DEFAULT_THUMBNAIL_ID END + FROM streams + + LEFT JOIN playlist_stream_join + ON uid = stream_id + + WHERE playlist_id = :playlistId LIMIT 1 + """ + ) + fun getAutomaticThumbnailStreamId(playlistId: Long): Flowable + + // get ids of streams of the given playlist then merge with the stream metadata + @RewriteQueriesToDropUnusedColumns + @Transaction + @Query( + """ + SELECT * FROM streams + + INNER JOIN (SELECT stream_id, join_index FROM playlist_stream_join WHERE playlist_id = :playlistId) + ON uid = stream_id + + LEFT JOIN (SELECT stream_id AS stream_id_alias, progress_time FROM stream_state ) + ON uid = stream_id_alias + + ORDER BY join_index ASC + """ + ) + fun getOrderedStreamsOf(playlistId: Long): Flowable> + + @Transaction + @Query( + """ + SELECT uid, name, is_thumbnail_permanent, thumbnail_stream_id, display_index, + + CASE WHEN thumbnail_stream_id = $DEFAULT_THUMBNAIL_ID + THEN :defaultThumbnail + ELSE (SELECT thumbnail_url FROM streams WHERE streams.uid = thumbnail_stream_id) + END AS thumbnail_url, + + COALESCE(COUNT(playlist_id), 0) AS streamCount FROM playlists + + LEFT JOIN playlist_stream_join + ON playlists.uid = playlist_id + + GROUP BY uid + ORDER BY display_index + """ + ) + fun getPlaylistMetadata(defaultThumbnail: String): Flowable> + + // TODO: Remove on migrating classes to Kotlin + fun getPlaylistMetadata(): Flowable> { + return getPlaylistMetadata(DEFAULT_THUMBNAIL) + } + + @RewriteQueriesToDropUnusedColumns + @Transaction + @Query( + """ + SELECT *, MIN(join_index) FROM streams + + INNER JOIN (SELECT stream_id, join_index FROM playlist_stream_join WHERE playlist_id = :playlistId) + ON uid = stream_id + + LEFT JOIN (SELECT stream_id AS stream_id_alias, progress_time FROM stream_state ) + ON uid = stream_id_alias + + GROUP BY uid + ORDER BY MIN(join_index) ASC + """ + ) + fun getStreamsWithoutDuplicates(playlistId: Long): Flowable> + + @RewriteQueriesToDropUnusedColumns + @Transaction + @Query( + """ + SELECT playlists.uid, name, is_thumbnail_permanent, thumbnail_stream_id, display_index, + + CASE WHEN thumbnail_stream_id = $DEFAULT_THUMBNAIL_ID + THEN :defaultThumbnail + ELSE (SELECT thumbnail_url FROM streams WHERE streams.uid = thumbnail_stream_id ) + END AS thumbnail_url, + + COALESCE(COUNT(playlist_id), 0) AS streamCount, + COALESCE(SUM(url = :streamUrl), 0) AS timesStreamIsContained FROM playlists + + LEFT JOIN playlist_stream_join + ON playlists.uid = playlist_id + + LEFT JOIN streams + ON streams.uid = stream_id AND :streamUrl = :streamUrl + + GROUP BY playlist_id + ORDER BY display_index, name + """ + ) + fun getPlaylistDuplicatesMetadata( + streamUrl: String, + defaultThumbnail: String + ): Flowable> + + // TODO: Remove on migrating classes to Kotlin + fun getPlaylistDuplicatesMetadata( + streamUrl: String + ): Flowable> { + return getPlaylistDuplicatesMetadata(streamUrl, DEFAULT_THUMBNAIL) + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java deleted file mode 100644 index e0c1a06b7..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.schabi.newpipe.database.playlist.model; - -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.Ignore; -import androidx.room.PrimaryKey; - -import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_TABLE; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; - -@Entity(tableName = PLAYLIST_TABLE) -public class PlaylistEntity { - - public static final String DEFAULT_THUMBNAIL = "drawable://" - + R.drawable.placeholder_thumbnail_playlist; - public static final long DEFAULT_THUMBNAIL_ID = -1; - - public static final String PLAYLIST_TABLE = "playlists"; - public static final String PLAYLIST_ID = "uid"; - public static final String PLAYLIST_NAME = "name"; - public static final String PLAYLIST_THUMBNAIL_URL = "thumbnail_url"; - public static final String PLAYLIST_DISPLAY_INDEX = "display_index"; - public static final String PLAYLIST_THUMBNAIL_PERMANENT = "is_thumbnail_permanent"; - public static final String PLAYLIST_THUMBNAIL_STREAM_ID = "thumbnail_stream_id"; - - @PrimaryKey(autoGenerate = true) - @ColumnInfo(name = PLAYLIST_ID) - private long uid = 0; - - @ColumnInfo(name = PLAYLIST_NAME) - private String name; - - @ColumnInfo(name = PLAYLIST_THUMBNAIL_PERMANENT) - private boolean isThumbnailPermanent; - - @ColumnInfo(name = PLAYLIST_THUMBNAIL_STREAM_ID) - private long thumbnailStreamId; - - @ColumnInfo(name = PLAYLIST_DISPLAY_INDEX) - private long displayIndex; - - public PlaylistEntity(final String name, final boolean isThumbnailPermanent, - final long thumbnailStreamId, final long displayIndex) { - this.name = name; - this.isThumbnailPermanent = isThumbnailPermanent; - this.thumbnailStreamId = thumbnailStreamId; - this.displayIndex = displayIndex; - } - - @Ignore - public PlaylistEntity(final PlaylistMetadataEntry item) { - this.uid = item.getUid(); - this.name = item.name; - this.isThumbnailPermanent = item.isThumbnailPermanent(); - this.thumbnailStreamId = item.getThumbnailStreamId(); - this.displayIndex = item.getDisplayIndex(); - } - - public long getUid() { - return uid; - } - - public void setUid(final long uid) { - this.uid = uid; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - - public long getThumbnailStreamId() { - return thumbnailStreamId; - } - - public void setThumbnailStreamId(final long thumbnailStreamId) { - this.thumbnailStreamId = thumbnailStreamId; - } - - public boolean getIsThumbnailPermanent() { - return isThumbnailPermanent; - } - - public void setIsThumbnailPermanent(final boolean isThumbnailSet) { - this.isThumbnailPermanent = isThumbnailSet; - } - - public long getDisplayIndex() { - return displayIndex; - } - - public void setDisplayIndex(final long displayIndex) { - this.displayIndex = displayIndex; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt new file mode 100644 index 000000000..a72a1cee5 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt @@ -0,0 +1,58 @@ +/* + * SPDX-FileCopyrightText: 2018-2024 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.playlist.model + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Ignore +import androidx.room.PrimaryKey +import org.schabi.newpipe.R +import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry + +@Entity(tableName = PlaylistEntity.Companion.PLAYLIST_TABLE) +data class PlaylistEntity @JvmOverloads constructor( + @PrimaryKey(autoGenerate = true) + @ColumnInfo(name = PLAYLIST_ID) + var uid: Long = 0, + + @ColumnInfo(name = PLAYLIST_NAME) + var name: String?, + + @ColumnInfo(name = PLAYLIST_THUMBNAIL_PERMANENT) + var isThumbnailPermanent: Boolean, + + @ColumnInfo(name = PLAYLIST_THUMBNAIL_STREAM_ID) + var thumbnailStreamId: Long, + + @ColumnInfo(name = PLAYLIST_DISPLAY_INDEX) + var displayIndex: Long +) { + + @Ignore + constructor(item: PlaylistMetadataEntry) : this( + uid = item.uid, + name = item.orderingName, + isThumbnailPermanent = item.isThumbnailPermanent!!, + thumbnailStreamId = item.thumbnailStreamId!!, + displayIndex = item.displayIndex!!, + ) + + companion object { + @JvmField + val DEFAULT_THUMBNAIL = "drawable://" + R.drawable.placeholder_thumbnail_playlist + + const val DEFAULT_THUMBNAIL_ID = -1L + + const val PLAYLIST_TABLE = "playlists" + const val PLAYLIST_ID = "uid" + const val PLAYLIST_NAME = "name" + const val PLAYLIST_THUMBNAIL_URL = "thumbnail_url" + const val PLAYLIST_DISPLAY_INDEX = "display_index" + const val PLAYLIST_THUMBNAIL_PERMANENT = "is_thumbnail_permanent" + const val PLAYLIST_THUMBNAIL_STREAM_ID = "thumbnail_stream_id" + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java deleted file mode 100644 index 0b0e3605e..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java +++ /dev/null @@ -1,191 +0,0 @@ -package org.schabi.newpipe.database.playlist.model; - -import android.text.TextUtils; - -import androidx.annotation.Nullable; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.Ignore; -import androidx.room.Index; -import androidx.room.PrimaryKey; - -import org.schabi.newpipe.database.playlist.PlaylistLocalItem; -import org.schabi.newpipe.extractor.playlist.PlaylistInfo; -import org.schabi.newpipe.util.Constants; -import org.schabi.newpipe.util.image.ImageStrategy; - -import static org.schabi.newpipe.database.LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM; -import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_NAME; -import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_SERVICE_ID; -import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_TABLE; -import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_URL; - -@Entity(tableName = REMOTE_PLAYLIST_TABLE, - indices = { - @Index(value = {REMOTE_PLAYLIST_SERVICE_ID, REMOTE_PLAYLIST_URL}, unique = true) - }) -public class PlaylistRemoteEntity implements PlaylistLocalItem { - public static final String REMOTE_PLAYLIST_TABLE = "remote_playlists"; - public static final String REMOTE_PLAYLIST_ID = "uid"; - public static final String REMOTE_PLAYLIST_SERVICE_ID = "service_id"; - public static final String REMOTE_PLAYLIST_NAME = "name"; - public static final String REMOTE_PLAYLIST_URL = "url"; - public static final String REMOTE_PLAYLIST_THUMBNAIL_URL = "thumbnail_url"; - public static final String REMOTE_PLAYLIST_UPLOADER_NAME = "uploader"; - public static final String REMOTE_PLAYLIST_DISPLAY_INDEX = "display_index"; - public static final String REMOTE_PLAYLIST_STREAM_COUNT = "stream_count"; - - @PrimaryKey(autoGenerate = true) - @ColumnInfo(name = REMOTE_PLAYLIST_ID) - private long uid = 0; - - @ColumnInfo(name = REMOTE_PLAYLIST_SERVICE_ID) - private int serviceId = Constants.NO_SERVICE_ID; - - @ColumnInfo(name = REMOTE_PLAYLIST_NAME) - private String name; - - @ColumnInfo(name = REMOTE_PLAYLIST_URL) - private String url; - - @ColumnInfo(name = REMOTE_PLAYLIST_THUMBNAIL_URL) - private String thumbnailUrl; - - @ColumnInfo(name = REMOTE_PLAYLIST_UPLOADER_NAME) - private String uploader; - - @ColumnInfo(name = REMOTE_PLAYLIST_DISPLAY_INDEX) - private long displayIndex = -1; // Make sure the new item is on the top - - @ColumnInfo(name = REMOTE_PLAYLIST_STREAM_COUNT) - private Long streamCount; - - public PlaylistRemoteEntity(final int serviceId, final String name, final String url, - final String thumbnailUrl, final String uploader, - final Long streamCount) { - this.serviceId = serviceId; - this.name = name; - this.url = url; - this.thumbnailUrl = thumbnailUrl; - this.uploader = uploader; - this.streamCount = streamCount; - } - - @Ignore - public PlaylistRemoteEntity(final int serviceId, final String name, final String url, - final String thumbnailUrl, final String uploader, - final long displayIndex, final Long streamCount) { - this.serviceId = serviceId; - this.name = name; - this.url = url; - this.thumbnailUrl = thumbnailUrl; - this.uploader = uploader; - this.displayIndex = displayIndex; - this.streamCount = streamCount; - } - - @Ignore - public PlaylistRemoteEntity(final PlaylistInfo info) { - this(info.getServiceId(), info.getName(), info.getUrl(), - // use uploader avatar when no thumbnail is available - ImageStrategy.imageListToDbUrl(info.getThumbnails().isEmpty() - ? info.getUploaderAvatars() : info.getThumbnails()), - info.getUploaderName(), info.getStreamCount()); - } - - @Ignore - public boolean isIdenticalTo(final PlaylistInfo info) { - /* - * Returns boolean comparing the online playlist and the local copy. - * (False if info changed such as playlist name or track count) - */ - return getServiceId() == info.getServiceId() - && getStreamCount() == info.getStreamCount() - && TextUtils.equals(getName(), info.getName()) - && TextUtils.equals(getUrl(), info.getUrl()) - // we want to update the local playlist data even when either the remote thumbnail - // URL changes, or the preferred image quality setting is changed by the user - && TextUtils.equals(getThumbnailUrl(), - ImageStrategy.imageListToDbUrl(info.getThumbnails())) - && TextUtils.equals(getUploader(), info.getUploaderName()); - } - - @Override - public long getUid() { - return uid; - } - - public void setUid(final long uid) { - this.uid = uid; - } - - public int getServiceId() { - return serviceId; - } - - public void setServiceId(final int serviceId) { - this.serviceId = serviceId; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - - @Nullable - @Override - public String getThumbnailUrl() { - return thumbnailUrl; - } - - public void setThumbnailUrl(final String thumbnailUrl) { - this.thumbnailUrl = thumbnailUrl; - } - - public String getUrl() { - return url; - } - - public void setUrl(final String url) { - this.url = url; - } - - public String getUploader() { - return uploader; - } - - public void setUploader(final String uploader) { - this.uploader = uploader; - } - - @Override - public long getDisplayIndex() { - return displayIndex; - } - - @Override - public void setDisplayIndex(final long displayIndex) { - this.displayIndex = displayIndex; - } - - public Long getStreamCount() { - return streamCount; - } - - public void setStreamCount(final Long streamCount) { - this.streamCount = streamCount; - } - - @Override - public LocalItemType getLocalItemType() { - return PLAYLIST_REMOTE_ITEM; - } - - @Override - public String getOrderingName() { - return name; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.kt new file mode 100644 index 000000000..82162e1e4 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.kt @@ -0,0 +1,104 @@ +/* + * SPDX-FileCopyrightText: 2018-2025 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.playlist.model + +import android.text.TextUtils +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Ignore +import androidx.room.Index +import androidx.room.PrimaryKey +import org.schabi.newpipe.database.LocalItem.LocalItemType +import org.schabi.newpipe.database.playlist.PlaylistLocalItem +import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.Companion.REMOTE_PLAYLIST_SERVICE_ID +import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.Companion.REMOTE_PLAYLIST_TABLE +import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.Companion.REMOTE_PLAYLIST_URL +import org.schabi.newpipe.extractor.playlist.PlaylistInfo +import org.schabi.newpipe.util.NO_SERVICE_ID +import org.schabi.newpipe.util.image.ImageStrategy + +@Entity( + tableName = REMOTE_PLAYLIST_TABLE, + indices = [ + Index( + value = [REMOTE_PLAYLIST_SERVICE_ID, REMOTE_PLAYLIST_URL], + unique = true + ) + ] +) +data class PlaylistRemoteEntity( + @PrimaryKey(autoGenerate = true) + @ColumnInfo(name = REMOTE_PLAYLIST_ID) + override var uid: Long = 0, + + @ColumnInfo(name = REMOTE_PLAYLIST_SERVICE_ID) + val serviceId: Int = NO_SERVICE_ID, + + @ColumnInfo(name = REMOTE_PLAYLIST_NAME) + override val orderingName: String?, + + @ColumnInfo(name = REMOTE_PLAYLIST_URL) + val url: String?, + + @ColumnInfo(name = REMOTE_PLAYLIST_THUMBNAIL_URL) + override val thumbnailUrl: String?, + + @ColumnInfo(name = REMOTE_PLAYLIST_UPLOADER_NAME) + val uploader: String?, + + @ColumnInfo(name = REMOTE_PLAYLIST_DISPLAY_INDEX) + override var displayIndex: Long = -1, // Make sure the new item is on the top + + @ColumnInfo(name = REMOTE_PLAYLIST_STREAM_COUNT) + val streamCount: Long? +) : PlaylistLocalItem { + + constructor(playlistInfo: PlaylistInfo) : this( + serviceId = playlistInfo.serviceId, + orderingName = playlistInfo.name, + url = playlistInfo.url, + thumbnailUrl = ImageStrategy.imageListToDbUrl( + if (playlistInfo.thumbnails.isEmpty()) { + playlistInfo.uploaderAvatars + } else { + playlistInfo.thumbnails + } + ), + uploader = playlistInfo.uploaderName, + streamCount = playlistInfo.streamCount + ) + + override val localItemType: LocalItemType + get() = LocalItemType.PLAYLIST_REMOTE_ITEM + + /** + * Returns boolean comparing the online playlist and the local copy. + * (False if info changed such as playlist name or track count) + */ + @Ignore + fun isIdenticalTo(info: PlaylistInfo): Boolean { + return this.serviceId == info.serviceId && this.streamCount == info.streamCount && + TextUtils.equals(this.orderingName, info.name) && + TextUtils.equals(this.url, info.url) && + // we want to update the local playlist data even when either the remote thumbnail + // URL changes, or the preferred image quality setting is changed by the user + TextUtils.equals(thumbnailUrl, ImageStrategy.imageListToDbUrl(info.thumbnails)) && + TextUtils.equals(this.uploader, info.uploaderName) + } + + companion object { + const val REMOTE_PLAYLIST_TABLE = "remote_playlists" + const val REMOTE_PLAYLIST_ID = "uid" + const val REMOTE_PLAYLIST_SERVICE_ID = "service_id" + const val REMOTE_PLAYLIST_NAME = "name" + const val REMOTE_PLAYLIST_URL = "url" + const val REMOTE_PLAYLIST_THUMBNAIL_URL = "thumbnail_url" + const val REMOTE_PLAYLIST_UPLOADER_NAME = "uploader" + const val REMOTE_PLAYLIST_DISPLAY_INDEX = "display_index" + const val REMOTE_PLAYLIST_STREAM_COUNT = "stream_count" + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistStreamEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistStreamEntity.java deleted file mode 100644 index f3208b6d5..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistStreamEntity.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.schabi.newpipe.database.playlist.model; - -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.ForeignKey; -import androidx.room.Index; - -import org.schabi.newpipe.database.stream.model.StreamEntity; - -import static androidx.room.ForeignKey.CASCADE; -import static org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.JOIN_INDEX; -import static org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.JOIN_PLAYLIST_ID; -import static org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.JOIN_STREAM_ID; -import static org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.PLAYLIST_STREAM_JOIN_TABLE; - -@Entity(tableName = PLAYLIST_STREAM_JOIN_TABLE, - primaryKeys = {JOIN_PLAYLIST_ID, JOIN_INDEX}, - indices = { - @Index(value = {JOIN_PLAYLIST_ID, JOIN_INDEX}, unique = true), - @Index(value = {JOIN_STREAM_ID}) - }, - foreignKeys = { - @ForeignKey(entity = PlaylistEntity.class, - parentColumns = PlaylistEntity.PLAYLIST_ID, - childColumns = JOIN_PLAYLIST_ID, - onDelete = CASCADE, onUpdate = CASCADE, deferred = true), - @ForeignKey(entity = StreamEntity.class, - parentColumns = StreamEntity.STREAM_ID, - childColumns = JOIN_STREAM_ID, - onDelete = CASCADE, onUpdate = CASCADE, deferred = true) - }) -public class PlaylistStreamEntity { - public static final String PLAYLIST_STREAM_JOIN_TABLE = "playlist_stream_join"; - public static final String JOIN_PLAYLIST_ID = "playlist_id"; - public static final String JOIN_STREAM_ID = "stream_id"; - public static final String JOIN_INDEX = "join_index"; - - @ColumnInfo(name = JOIN_PLAYLIST_ID) - private long playlistUid; - - @ColumnInfo(name = JOIN_STREAM_ID) - private long streamUid; - - @ColumnInfo(name = JOIN_INDEX) - private int index; - - public PlaylistStreamEntity(final long playlistUid, final long streamUid, final int index) { - this.playlistUid = playlistUid; - this.streamUid = streamUid; - this.index = index; - } - - public long getPlaylistUid() { - return playlistUid; - } - - public void setPlaylistUid(final long playlistUid) { - this.playlistUid = playlistUid; - } - - public long getStreamUid() { - return streamUid; - } - - public void setStreamUid(final long streamUid) { - this.streamUid = streamUid; - } - - public int getIndex() { - return index; - } - - public void setIndex(final int index) { - this.index = index; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistStreamEntity.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistStreamEntity.kt new file mode 100644 index 000000000..6ab1b6ac4 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistStreamEntity.kt @@ -0,0 +1,68 @@ +/* + * SPDX-FileCopyrightText: 2018-2020 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.playlist.model + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.ForeignKey.Companion.CASCADE +import androidx.room.Index +import org.schabi.newpipe.database.LocalItem +import org.schabi.newpipe.database.playlist.model.PlaylistEntity.Companion.PLAYLIST_ID +import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.Companion.JOIN_INDEX +import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.Companion.JOIN_PLAYLIST_ID +import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.Companion.JOIN_STREAM_ID +import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.Companion.PLAYLIST_STREAM_JOIN_TABLE +import org.schabi.newpipe.database.stream.model.StreamEntity + +@Entity( + tableName = PLAYLIST_STREAM_JOIN_TABLE, + primaryKeys = [JOIN_PLAYLIST_ID, JOIN_INDEX], + indices = [ + Index(value = [JOIN_PLAYLIST_ID, JOIN_INDEX], unique = true), + Index(value = [JOIN_STREAM_ID]) + ], + foreignKeys = [ + ForeignKey( + entity = PlaylistEntity::class, + parentColumns = arrayOf(PLAYLIST_ID), + childColumns = arrayOf(JOIN_PLAYLIST_ID), + onDelete = CASCADE, + onUpdate = CASCADE, + deferred = true + ), + ForeignKey( + entity = StreamEntity::class, + parentColumns = arrayOf(StreamEntity.STREAM_ID), + childColumns = arrayOf(JOIN_STREAM_ID), + onDelete = CASCADE, + onUpdate = CASCADE, + deferred = true + ) + ] +) +data class PlaylistStreamEntity( + @ColumnInfo(name = JOIN_PLAYLIST_ID) + val playlistUid: Long, + + @ColumnInfo(name = JOIN_STREAM_ID) + val streamUid: Long, + + @ColumnInfo(name = JOIN_INDEX) + val index: Int +) : LocalItem { + + override val localItemType: LocalItem.LocalItemType + get() = LocalItem.LocalItemType.PLAYLIST_STREAM_ITEM + + companion object { + const val PLAYLIST_STREAM_JOIN_TABLE = "playlist_stream_join" + const val JOIN_PLAYLIST_ID = "playlist_id" + const val JOIN_STREAM_ID = "stream_id" + const val JOIN_INDEX = "join_index" + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt b/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt index 1f3654e7a..3fa281e45 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt @@ -1,16 +1,23 @@ +/* + * SPDX-FileCopyrightText: 2020-2023 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + package org.schabi.newpipe.database.stream import androidx.room.ColumnInfo import androidx.room.Embedded +import androidx.room.Ignore import org.schabi.newpipe.database.LocalItem import org.schabi.newpipe.database.history.model.StreamHistoryEntity import org.schabi.newpipe.database.stream.model.StreamEntity -import org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_PROGRESS_MILLIS +import org.schabi.newpipe.database.stream.model.StreamStateEntity.Companion.STREAM_PROGRESS_MILLIS import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.util.image.ImageStrategy import java.time.OffsetDateTime -class StreamStatisticsEntry( +data class StreamStatisticsEntry( @Embedded val streamEntity: StreamEntity, @@ -26,18 +33,23 @@ class StreamStatisticsEntry( @ColumnInfo(name = STREAM_WATCH_COUNT) val watchCount: Long ) : LocalItem { + + override val localItemType: LocalItem.LocalItemType + get() = LocalItem.LocalItemType.STATISTIC_STREAM_ITEM + + @Ignore fun toStreamInfoItem(): StreamInfoItem { - val item = StreamInfoItem(streamEntity.serviceId, streamEntity.url, streamEntity.title, streamEntity.streamType) - item.duration = streamEntity.duration - item.uploaderName = streamEntity.uploader - item.uploaderUrl = streamEntity.uploaderUrl - item.thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl) - - return item - } - - override fun getLocalItemType(): LocalItem.LocalItemType { - return LocalItem.LocalItemType.STATISTIC_STREAM_ITEM + return StreamInfoItem( + streamEntity.serviceId, + streamEntity.url, + streamEntity.title, + streamEntity.streamType + ).apply { + duration = streamEntity.duration + uploaderName = streamEntity.uploader + uploaderUrl = streamEntity.uploaderUrl + thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl) + } } companion object { diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamStateDAO.java b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamStateDAO.java deleted file mode 100644 index 06371248d..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamStateDAO.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.schabi.newpipe.database.stream.dao; - -import androidx.room.Dao; -import androidx.room.Insert; -import androidx.room.OnConflictStrategy; -import androidx.room.Query; -import androidx.room.Transaction; - -import org.schabi.newpipe.database.BasicDAO; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; - -import java.util.List; - -import io.reactivex.rxjava3.core.Flowable; - -import static org.schabi.newpipe.database.stream.model.StreamStateEntity.JOIN_STREAM_ID; -import static org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_STATE_TABLE; - -@Dao -public interface StreamStateDAO extends BasicDAO { - @Override - @Query("SELECT * FROM " + STREAM_STATE_TABLE) - Flowable> getAll(); - - @Override - @Query("DELETE FROM " + STREAM_STATE_TABLE) - int deleteAll(); - - @Override - default Flowable> listByService(final int serviceId) { - throw new UnsupportedOperationException(); - } - - @Query("SELECT * FROM " + STREAM_STATE_TABLE + " WHERE " + JOIN_STREAM_ID + " = :streamId") - Flowable> getState(long streamId); - - @Query("DELETE FROM " + STREAM_STATE_TABLE + " WHERE " + JOIN_STREAM_ID + " = :streamId") - int deleteState(long streamId); - - @Insert(onConflict = OnConflictStrategy.IGNORE) - void silentInsertInternal(StreamStateEntity streamState); - - @Transaction - default long upsert(final StreamStateEntity stream) { - silentInsertInternal(stream); - return update(stream); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamStateDAO.kt b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamStateDAO.kt new file mode 100644 index 000000000..f3c44f1f2 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamStateDAO.kt @@ -0,0 +1,45 @@ +/* + * SPDX-FileCopyrightText: 2018-2021 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.stream.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import androidx.room.Transaction +import io.reactivex.rxjava3.core.Flowable +import org.schabi.newpipe.database.BasicDAO +import org.schabi.newpipe.database.stream.model.StreamStateEntity + +@Dao +interface StreamStateDAO : BasicDAO { + + @Query("SELECT * FROM " + StreamStateEntity.STREAM_STATE_TABLE) + override fun getAll(): Flowable> + + @Query("DELETE FROM " + StreamStateEntity.STREAM_STATE_TABLE) + override fun deleteAll(): Int + + override fun listByService(serviceId: Int): Flowable> { + throw UnsupportedOperationException() + } + + @Query("SELECT * FROM " + StreamStateEntity.STREAM_STATE_TABLE + " WHERE " + StreamStateEntity.JOIN_STREAM_ID + " = :streamId") + fun getState(streamId: Long): Flowable> + + @Query("DELETE FROM " + StreamStateEntity.STREAM_STATE_TABLE + " WHERE " + StreamStateEntity.JOIN_STREAM_ID + " = :streamId") + fun deleteState(streamId: Long): Int + + @Insert(onConflict = OnConflictStrategy.Companion.IGNORE) + fun silentInsertInternal(streamState: StreamStateEntity) + + @Transaction + fun upsert(stream: StreamStateEntity): Long { + silentInsertInternal(stream) + return update(stream).toLong() + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.java b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.java deleted file mode 100644 index 627acea45..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.schabi.newpipe.database.stream.model; - -import androidx.annotation.Nullable; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.ForeignKey; - -import java.util.Objects; - -import static androidx.room.ForeignKey.CASCADE; -import static org.schabi.newpipe.database.stream.model.StreamStateEntity.JOIN_STREAM_ID; -import static org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_STATE_TABLE; - -@Entity(tableName = STREAM_STATE_TABLE, - primaryKeys = {JOIN_STREAM_ID}, - foreignKeys = { - @ForeignKey(entity = StreamEntity.class, - parentColumns = StreamEntity.STREAM_ID, - childColumns = JOIN_STREAM_ID, - onDelete = CASCADE, onUpdate = CASCADE) - }) -public class StreamStateEntity { - public static final String STREAM_STATE_TABLE = "stream_state"; - public static final String JOIN_STREAM_ID = "stream_id"; - // This additional field is required for the SQL query because 'stream_id' is used - // for some other joins already - public static final String JOIN_STREAM_ID_ALIAS = "stream_id_alias"; - public static final String STREAM_PROGRESS_MILLIS = "progress_time"; - - /** - * Playback state will not be saved, if playback time is less than this threshold (5000ms = 5s). - */ - public static final long PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS = 5000; - - /** - * Stream will be considered finished if the playback time left exceeds this threshold - * (60000ms = 60s). - * @see #isFinished(long) - * @see org.schabi.newpipe.database.feed.dao.FeedDAO#getLiveOrNotPlayedStreams() - * @see org.schabi.newpipe.database.feed.dao.FeedDAO#getLiveOrNotPlayedStreamsForGroup(long) - */ - public static final long PLAYBACK_FINISHED_END_MILLISECONDS = 60000; - - @ColumnInfo(name = JOIN_STREAM_ID) - private long streamUid; - - @ColumnInfo(name = STREAM_PROGRESS_MILLIS) - private long progressMillis; - - public StreamStateEntity(final long streamUid, final long progressMillis) { - this.streamUid = streamUid; - this.progressMillis = progressMillis; - } - - public long getStreamUid() { - return streamUid; - } - - public void setStreamUid(final long streamUid) { - this.streamUid = streamUid; - } - - public long getProgressMillis() { - return progressMillis; - } - - public void setProgressMillis(final long progressMillis) { - this.progressMillis = progressMillis; - } - - /** - * The state will be considered valid, and thus be saved, if the progress is more than {@link - * #PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS} or at least 1/4 of the video length. - * @param durationInSeconds the duration of the stream connected with this state, in seconds - * @return whether this stream state entity should be saved or not - */ - public boolean isValid(final long durationInSeconds) { - return progressMillis > PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS - || progressMillis > durationInSeconds * 1000 / 4; - } - - /** - * The video will be considered as finished, if the time left is less than {@link - * #PLAYBACK_FINISHED_END_MILLISECONDS} and the progress is at least 3/4 of the video length. - * The state will be saved anyway, so that it can be shown under stream info items, but the - * player will not resume if a state is considered as finished. Finished streams are also the - * ones that can be filtered out in the feed fragment. - * @see org.schabi.newpipe.database.feed.dao.FeedDAO#getLiveOrNotPlayedStreams() - * @see org.schabi.newpipe.database.feed.dao.FeedDAO#getLiveOrNotPlayedStreamsForGroup(long) - * @param durationInSeconds the duration of the stream connected with this state, in seconds - * @return whether the stream is finished or not - */ - public boolean isFinished(final long durationInSeconds) { - return progressMillis >= durationInSeconds * 1000 - PLAYBACK_FINISHED_END_MILLISECONDS - && progressMillis >= durationInSeconds * 1000 * 3 / 4; - } - - @Override - public boolean equals(@Nullable final Object obj) { - if (obj instanceof StreamStateEntity) { - return ((StreamStateEntity) obj).streamUid == streamUid - && ((StreamStateEntity) obj).progressMillis == progressMillis; - } else { - return false; - } - } - - @Override - public int hashCode() { - return Objects.hash(streamUid, progressMillis); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.kt b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.kt new file mode 100644 index 000000000..759a2dcec --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.kt @@ -0,0 +1,85 @@ +/* + * SPDX-FileCopyrightText: 2018-2023 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.stream.model + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.ForeignKey.Companion.CASCADE +import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_ID +import org.schabi.newpipe.database.stream.model.StreamStateEntity.Companion.JOIN_STREAM_ID +import org.schabi.newpipe.database.stream.model.StreamStateEntity.Companion.PLAYBACK_FINISHED_END_MILLISECONDS +import org.schabi.newpipe.database.stream.model.StreamStateEntity.Companion.STREAM_STATE_TABLE + +@Entity( + tableName = STREAM_STATE_TABLE, + primaryKeys = [JOIN_STREAM_ID], + foreignKeys = [ + ForeignKey( + entity = StreamEntity::class, + parentColumns = arrayOf(STREAM_ID), + childColumns = arrayOf(JOIN_STREAM_ID), + onDelete = CASCADE, + onUpdate = CASCADE + ) + ] +) +data class StreamStateEntity( + @ColumnInfo(name = JOIN_STREAM_ID) + val streamUid: Long, + + @ColumnInfo(name = STREAM_PROGRESS_MILLIS) + val progressMillis: Long +) { + /** + * The state will be considered valid, and thus be saved, if the progress is more than + * [PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS] or at least 1/4 of the video length. + * @param durationInSeconds the duration of the stream connected with this state, in seconds + * @return whether this stream state entity should be saved or not + */ + fun isValid(durationInSeconds: Long): Boolean { + return progressMillis > PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS || + progressMillis > durationInSeconds * 1000 / 4 + } + + /** + * The video will be considered as finished, if the time left is less than + * [PLAYBACK_FINISHED_END_MILLISECONDS] and the progress is at least 3/4 of the video length. + * The state will be saved anyway, so that it can be shown under stream info items, but the + * player will not resume if a state is considered as finished. Finished streams are also the + * ones that can be filtered out in the feed fragment. + * @param durationInSeconds the duration of the stream connected with this state, in seconds + * @return whether the stream is finished or not + */ + fun isFinished(durationInSeconds: Long): Boolean { + return progressMillis >= durationInSeconds * 1000 - PLAYBACK_FINISHED_END_MILLISECONDS && + progressMillis >= durationInSeconds * 1000 * 3 / 4 + } + + companion object { + const val STREAM_STATE_TABLE = "stream_state" + const val JOIN_STREAM_ID = "stream_id" + + // This additional field is required for the SQL query because 'stream_id' is used + // for some other joins already + const val JOIN_STREAM_ID_ALIAS = "stream_id_alias" + const val STREAM_PROGRESS_MILLIS = "progress_time" + + /** + * Playback state will not be saved, if playback time is less than this threshold + * (5000ms = 5s). + */ + const val PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS = 5000L + + /** + * Stream will be considered finished if the playback time left exceeds this threshold + * (60000ms = 60s). + * @see org.schabi.newpipe.database.stream.model.StreamStateEntity.isFinished + */ + const val PLAYBACK_FINISHED_END_MILLISECONDS = 60000L + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/subscription/NotificationMode.java b/app/src/main/java/org/schabi/newpipe/database/subscription/NotificationMode.java deleted file mode 100644 index 07e0eb7d3..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/subscription/NotificationMode.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.schabi.newpipe.database.subscription; - -import androidx.annotation.IntDef; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@IntDef({NotificationMode.DISABLED, NotificationMode.ENABLED}) -@Retention(RetentionPolicy.SOURCE) -public @interface NotificationMode { - - int DISABLED = 0; - int ENABLED = 1; - //other values reserved for the future -} diff --git a/app/src/main/java/org/schabi/newpipe/database/subscription/NotificationMode.kt b/app/src/main/java/org/schabi/newpipe/database/subscription/NotificationMode.kt new file mode 100644 index 000000000..f9bb18c0c --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/subscription/NotificationMode.kt @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: 2021 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.subscription + +import androidx.annotation.IntDef + +@IntDef(NotificationMode.Companion.DISABLED, NotificationMode.Companion.ENABLED) +@Retention(AnnotationRetention.SOURCE) +annotation class NotificationMode { + companion object { + const val DISABLED = 0 + const val ENABLED = 1 // other values reserved for the future + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionDAO.kt b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionDAO.kt index 47b6f4dd9..e6fdcbf70 100644 --- a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionDAO.kt @@ -99,7 +99,7 @@ abstract class SubscriptionDAO : BasicDAO { if (uidFromInsert != -1L) { entity.uid = uidFromInsert } else { - val subscriptionIdFromDb = getSubscriptionIdInternal(entity.serviceId, entity.url) + val subscriptionIdFromDb = getSubscriptionIdInternal(entity.serviceId, entity.url!!) ?: throw IllegalStateException("Subscription cannot be null just after insertion.") entity.uid = subscriptionIdFromDb diff --git a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.java b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.java deleted file mode 100644 index df5a3067a..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.java +++ /dev/null @@ -1,200 +0,0 @@ -package org.schabi.newpipe.database.subscription; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.Ignore; -import androidx.room.Index; -import androidx.room.PrimaryKey; - -import org.schabi.newpipe.extractor.channel.ChannelInfo; -import org.schabi.newpipe.extractor.channel.ChannelInfoItem; -import org.schabi.newpipe.util.Constants; -import org.schabi.newpipe.util.image.ImageStrategy; - -import static org.schabi.newpipe.database.subscription.SubscriptionEntity.SUBSCRIPTION_SERVICE_ID; -import static org.schabi.newpipe.database.subscription.SubscriptionEntity.SUBSCRIPTION_TABLE; -import static org.schabi.newpipe.database.subscription.SubscriptionEntity.SUBSCRIPTION_URL; - -@Entity(tableName = SUBSCRIPTION_TABLE, - indices = {@Index(value = {SUBSCRIPTION_SERVICE_ID, SUBSCRIPTION_URL}, unique = true)}) -public class SubscriptionEntity { - public static final String SUBSCRIPTION_UID = "uid"; - public static final String SUBSCRIPTION_TABLE = "subscriptions"; - public static final String SUBSCRIPTION_SERVICE_ID = "service_id"; - public static final String SUBSCRIPTION_URL = "url"; - public static final String SUBSCRIPTION_NAME = "name"; - public static final String SUBSCRIPTION_AVATAR_URL = "avatar_url"; - public static final String SUBSCRIPTION_SUBSCRIBER_COUNT = "subscriber_count"; - public static final String SUBSCRIPTION_DESCRIPTION = "description"; - public static final String SUBSCRIPTION_NOTIFICATION_MODE = "notification_mode"; - - @PrimaryKey(autoGenerate = true) - private long uid = 0; - - @ColumnInfo(name = SUBSCRIPTION_SERVICE_ID) - private int serviceId = Constants.NO_SERVICE_ID; - - @ColumnInfo(name = SUBSCRIPTION_URL) - private String url; - - @ColumnInfo(name = SUBSCRIPTION_NAME) - private String name; - - @ColumnInfo(name = SUBSCRIPTION_AVATAR_URL) - private String avatarUrl; - - @ColumnInfo(name = SUBSCRIPTION_SUBSCRIBER_COUNT) - private Long subscriberCount; - - @ColumnInfo(name = SUBSCRIPTION_DESCRIPTION) - private String description; - - @ColumnInfo(name = SUBSCRIPTION_NOTIFICATION_MODE) - private int notificationMode; - - @Ignore - public static SubscriptionEntity from(@NonNull final ChannelInfo info) { - final SubscriptionEntity result = new SubscriptionEntity(); - result.setServiceId(info.getServiceId()); - result.setUrl(info.getUrl()); - result.setData(info.getName(), ImageStrategy.imageListToDbUrl(info.getAvatars()), - info.getDescription(), info.getSubscriberCount()); - return result; - } - - public long getUid() { - return uid; - } - - public void setUid(final long uid) { - this.uid = uid; - } - - public int getServiceId() { - return serviceId; - } - - public void setServiceId(final int serviceId) { - this.serviceId = serviceId; - } - - public String getUrl() { - return url; - } - - public void setUrl(final String url) { - this.url = url; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - - @Nullable - public String getAvatarUrl() { - return avatarUrl; - } - - public void setAvatarUrl(@Nullable final String avatarUrl) { - this.avatarUrl = avatarUrl; - } - - public Long getSubscriberCount() { - return subscriberCount; - } - - public void setSubscriberCount(final Long subscriberCount) { - this.subscriberCount = subscriberCount; - } - - public String getDescription() { - return description; - } - - public void setDescription(final String description) { - this.description = description; - } - - @NotificationMode - public int getNotificationMode() { - return notificationMode; - } - - public void setNotificationMode(@NotificationMode final int notificationMode) { - this.notificationMode = notificationMode; - } - - @Ignore - public void setData(final String n, final String au, final String d, final Long sc) { - this.setName(n); - this.setAvatarUrl(au); - this.setDescription(d); - this.setSubscriberCount(sc); - } - - @Ignore - public ChannelInfoItem toChannelInfoItem() { - final ChannelInfoItem item = new ChannelInfoItem(getServiceId(), getUrl(), getName()); - item.setThumbnails(ImageStrategy.dbUrlToImageList(getAvatarUrl())); - item.setSubscriberCount(getSubscriberCount()); - item.setDescription(getDescription()); - return item; - } - - - // TODO: Remove these generated methods by migrating this class to a data class from Kotlin. - @Override - @SuppressWarnings("EqualsReplaceableByObjectsCall") - public boolean equals(final Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - final SubscriptionEntity that = (SubscriptionEntity) o; - - if (uid != that.uid) { - return false; - } - if (serviceId != that.serviceId) { - return false; - } - if (!url.equals(that.url)) { - return false; - } - if (name != null ? !name.equals(that.name) : that.name != null) { - return false; - } - if (avatarUrl != null ? !avatarUrl.equals(that.avatarUrl) : that.avatarUrl != null) { - return false; - } - if (subscriberCount != null - ? !subscriberCount.equals(that.subscriberCount) - : that.subscriberCount != null) { - return false; - } - return description != null - ? description.equals(that.description) - : that.description == null; - } - - @Override - public int hashCode() { - int result = (int) (uid ^ (uid >>> 32)); - result = 31 * result + serviceId; - result = 31 * result + url.hashCode(); - result = 31 * result + (name != null ? name.hashCode() : 0); - result = 31 * result + (avatarUrl != null ? avatarUrl.hashCode() : 0); - result = 31 * result + (subscriberCount != null ? subscriberCount.hashCode() : 0); - result = 31 * result + (description != null ? description.hashCode() : 0); - return result; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt new file mode 100644 index 000000000..104d0a142 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt @@ -0,0 +1,87 @@ +/* + * SPDX-FileCopyrightText: 2017-2024 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.subscription + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Ignore +import androidx.room.Index +import androidx.room.PrimaryKey +import org.schabi.newpipe.extractor.channel.ChannelInfo +import org.schabi.newpipe.extractor.channel.ChannelInfoItem +import org.schabi.newpipe.util.NO_SERVICE_ID +import org.schabi.newpipe.util.image.ImageStrategy + +@Entity( + tableName = SubscriptionEntity.Companion.SUBSCRIPTION_TABLE, + indices = [ + Index( + value = [SubscriptionEntity.Companion.SUBSCRIPTION_SERVICE_ID, SubscriptionEntity.Companion.SUBSCRIPTION_URL], + unique = true + ) + ] +) +data class SubscriptionEntity( + @PrimaryKey(autoGenerate = true) + var uid: Long = 0, + + @ColumnInfo(name = SUBSCRIPTION_SERVICE_ID) + var serviceId: Int = NO_SERVICE_ID, + + @ColumnInfo(name = SUBSCRIPTION_URL) + var url: String? = null, + + @ColumnInfo(name = SUBSCRIPTION_NAME) + var name: String? = null, + + @ColumnInfo(name = SUBSCRIPTION_AVATAR_URL) + var avatarUrl: String? = null, + + @ColumnInfo(name = SUBSCRIPTION_SUBSCRIBER_COUNT) + var subscriberCount: Long? = null, + + @ColumnInfo(name = SUBSCRIPTION_DESCRIPTION) + var description: String? = null, + + @get:NotificationMode + @ColumnInfo(name = SUBSCRIPTION_NOTIFICATION_MODE) + var notificationMode: Int = 0 +) { + @Ignore + fun toChannelInfoItem(): ChannelInfoItem { + return ChannelInfoItem(this.serviceId, this.url, this.name).apply { + thumbnails = ImageStrategy.dbUrlToImageList(this@SubscriptionEntity.avatarUrl) + subscriberCount = this.subscriberCount + description = this.description + } + } + + companion object { + const val SUBSCRIPTION_UID: String = "uid" + const val SUBSCRIPTION_TABLE: String = "subscriptions" + const val SUBSCRIPTION_SERVICE_ID: String = "service_id" + const val SUBSCRIPTION_URL: String = "url" + const val SUBSCRIPTION_NAME: String = "name" + const val SUBSCRIPTION_AVATAR_URL: String = "avatar_url" + const val SUBSCRIPTION_SUBSCRIBER_COUNT: String = "subscriber_count" + const val SUBSCRIPTION_DESCRIPTION: String = "description" + const val SUBSCRIPTION_NOTIFICATION_MODE: String = "notification_mode" + + @JvmStatic + @Ignore + fun from(info: ChannelInfo): SubscriptionEntity { + return SubscriptionEntity( + serviceId = info.serviceId, + url = info.url, + name = info.name, + avatarUrl = ImageStrategy.imageListToDbUrl(info.avatars), + description = info.description, + subscriberCount = info.subscriberCount + ) + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index d36fc5fc9..d75d14b4a 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -361,10 +361,10 @@ public class ChannelFragment extends BaseStateFragment final SubscriptionEntity channel = new SubscriptionEntity(); channel.setServiceId(info.getServiceId()); channel.setUrl(info.getUrl()); - channel.setData(info.getName(), - ImageStrategy.imageListToDbUrl(info.getAvatars()), - info.getDescription(), - info.getSubscriberCount()); + channel.setName(info.getName()); + channel.setAvatarUrl(ImageStrategy.imageListToDbUrl(info.getAvatars())); + channel.setDescription(info.getDescription()); + channel.setSubscriberCount(info.getSubscriberCount()); channelSubscription = null; updateNotifyButton(null); subscribeButtonMonitor = monitorSubscribeButton(mapOnSubscribe(channel)); diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index a5e1594d1..d15db84c7 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -140,7 +140,7 @@ public final class BookmarkFragment extends BaseLocalListFragment playlists) { return playlists.stream() - .anyMatch(playlist -> playlist.timesStreamIsContained > 0); + .anyMatch(playlist -> playlist.getTimesStreamIsContained() > 0); } private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager, @@ -146,9 +146,9 @@ public final class PlaylistAppendDialog extends PlaylistDialog { @NonNull final List streams) { final String toastText; - if (playlist.timesStreamIsContained > 0) { + if (playlist.getTimesStreamIsContained() > 0) { toastText = getString(R.string.playlist_add_stream_success_duplicate, - playlist.timesStreamIsContained); + playlist.getTimesStreamIsContained()); } else { toastText = getString(R.string.playlist_add_stream_success); } @@ -160,8 +160,9 @@ public final class PlaylistAppendDialog extends PlaylistDialog { .subscribe(ignored -> { successToast.show(); - if (playlist.thumbnailUrl != null - && playlist.thumbnailUrl.equals(PlaylistEntity.DEFAULT_THUMBNAIL)) { + if (playlist.getThumbnailUrl() != null + && playlist.getThumbnailUrl().equals(PlaylistEntity.DEFAULT_THUMBNAIL) + ) { playlistDisposables.add(manager .changePlaylistThumbnail(playlist.getUid(), streams.get(0).getUid(), false) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index 91f98f5d2..bbad7f689 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -507,7 +507,7 @@ class FeedFragment : BaseStateFragment() { .setTitle(R.string.feed_load_error) .setPositiveButton(R.string.unsubscribe) { _, _ -> SubscriptionManager(requireContext()) - .deleteSubscription(subscriptionEntity.serviceId, subscriptionEntity.url) + .deleteSubscription(subscriptionEntity.serviceId, subscriptionEntity.url!!) .subscribe() handleItemsErrors(nextItemsErrors) } diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java index 336f5cfe3..528275d75 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java @@ -35,15 +35,15 @@ public class LocalPlaylistItemHolder extends PlaylistItemHolder { } final PlaylistMetadataEntry item = (PlaylistMetadataEntry) localItem; - itemTitleView.setText(item.name); + itemTitleView.setText(item.getOrderingName()); itemStreamCountView.setText(Localization.localizeStreamCountMini( - itemStreamCountView.getContext(), item.streamCount)); + itemStreamCountView.getContext(), item.getStreamCount())); itemUploaderView.setVisibility(View.INVISIBLE); - PicassoHelper.loadPlaylistThumbnail(item.thumbnailUrl).into(itemThumbnailView); + PicassoHelper.loadPlaylistThumbnail(item.getThumbnailUrl()).into(itemThumbnailView); if (item instanceof PlaylistDuplicatesEntry - && ((PlaylistDuplicatesEntry) item).timesStreamIsContained > 0) { + && ((PlaylistDuplicatesEntry) item).getTimesStreamIsContained() > 0) { itemView.setAlpha(GRAYED_OUT_ALPHA); } else { itemView.setAlpha(1.0f); diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java index 765732063..3a339aec8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java @@ -34,7 +34,7 @@ public class RemotePlaylistItemHolder extends PlaylistItemHolder { } final PlaylistRemoteEntity item = (PlaylistRemoteEntity) localItem; - itemTitleView.setText(item.getName()); + itemTitleView.setText(item.getOrderingName()); itemStreamCountView.setText(Localization.localizeStreamCountMini( itemStreamCountView.getContext(), item.getStreamCount())); // Here is where the uploader name is set in the bookmarked playlists library diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index dd9307675..1480735fb 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -148,7 +148,7 @@ public class LocalPlaylistManager { public boolean getIsPlaylistThumbnailPermanent(final long playlistId) { return playlistTable.getPlaylist(playlistId).blockingFirst().get(0) - .getIsThumbnailPermanent(); + .isThumbnailPermanent(); } public long getAutomaticPlaylistThumbnailStreamId(final long playlistId) { @@ -174,7 +174,7 @@ public class LocalPlaylistManager { } if (thumbnailStreamId != THUMBNAIL_ID_LEAVE_UNCHANGED) { playlist.setThumbnailStreamId(thumbnailStreamId); - playlist.setIsThumbnailPermanent(isPermanent); + playlist.setThumbnailPermanent(isPermanent); } return playlistTable.update(playlist); }).subscribeOn(Schedulers.io()); diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt index 474add4f4..c0783e812 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt @@ -26,7 +26,7 @@ class SubscriptionManager(context: Context) { private val feedDatabaseManager = FeedDatabaseManager(context) fun subscriptionTable(): SubscriptionDAO = subscriptionTable - fun subscriptions() = subscriptionTable.all + fun subscriptions() = subscriptionTable.getAll() fun getSubscriptions( currentGroupId: Long = FeedGroupEntity.GROUP_ALL_ID, @@ -44,7 +44,7 @@ class SubscriptionManager(context: Context) { } } showOnlyUngrouped -> subscriptionTable.getSubscriptionsOnlyUngrouped(currentGroupId) - else -> subscriptionTable.all + else -> subscriptionTable.getAll() } } @@ -71,12 +71,12 @@ class SubscriptionManager(context: Context) { subscriptionTable.getSubscription(info.serviceId, info.url) .flatMapCompletable { Completable.fromRunnable { - it.setData( - info.name, - ImageStrategy.imageListToDbUrl(info.avatars), - info.description, - info.subscriberCount - ) + it.apply { + name = info.name + avatarUrl = ImageStrategy.imageListToDbUrl(info.avatars) + description = info.description + subscriberCount = info.subscriberCount + } subscriptionTable.update(it) } } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt index b7d57657d..d221d704b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt @@ -315,7 +315,7 @@ class MediaBrowserImpl( } private fun populateHistory(): Single> { - val history = database.streamHistoryDAO().getHistory().firstOrError() + val history = database.streamHistoryDAO().history.firstOrError() return history.map { items -> items.map { this.createHistoryMediaItem(it) } } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt index 4815965a3..072a8f332 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt @@ -215,7 +215,7 @@ class MediaBrowserPlaybackPreparer( } val streamId = path[0].toLong() - return database.streamHistoryDAO().getHistory() + return database.streamHistoryDAO().history .firstOrError() .map { items -> val infoItems = items diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java index 6a5f7c894..880cbb282 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java @@ -118,12 +118,12 @@ public class SelectPlaylistFragment extends DialogFragment { if (selectedItem instanceof PlaylistMetadataEntry) { final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem); - onSelectedListener.onLocalPlaylistSelected(entry.getUid(), entry.name); + onSelectedListener.onLocalPlaylistSelected(entry.getUid(), entry.getOrderingName()); } else if (selectedItem instanceof PlaylistRemoteEntity) { final PlaylistRemoteEntity entry = ((PlaylistRemoteEntity) selectedItem); onSelectedListener.onRemotePlaylistSelected( - entry.getServiceId(), entry.getUrl(), entry.getName()); + entry.getServiceId(), entry.getUrl(), entry.getOrderingName()); } } dismiss(); @@ -157,14 +157,15 @@ public class SelectPlaylistFragment extends DialogFragment { if (selectedItem instanceof PlaylistMetadataEntry) { final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem); - holder.titleView.setText(entry.name); + holder.titleView.setText(entry.getOrderingName()); holder.view.setOnClickListener(view -> clickedItem(position)); - PicassoHelper.loadPlaylistThumbnail(entry.thumbnailUrl).into(holder.thumbnailView); + PicassoHelper.loadPlaylistThumbnail(entry.getThumbnailUrl()) + .into(holder.thumbnailView); } else if (selectedItem instanceof PlaylistRemoteEntity) { final PlaylistRemoteEntity entry = ((PlaylistRemoteEntity) selectedItem); - holder.titleView.setText(entry.getName()); + holder.titleView.setText(entry.getOrderingName()); holder.view.setOnClickListener(view -> clickedItem(position)); PicassoHelper.loadPlaylistThumbnail(entry.getThumbnailUrl()) .into(holder.thumbnailView); diff --git a/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigAdapter.kt b/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigAdapter.kt index f61aa72ab..fd8abfa16 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigAdapter.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigAdapter.kt @@ -31,7 +31,7 @@ class NotificationModeConfigAdapter( fun update(newData: List) { val items = newData.map { - SubscriptionItem(it.uid, it.name, it.notificationMode, it.serviceId, it.url) + SubscriptionItem(it.uid, it.name!!, it.notificationMode, it.serviceId, it.url!!) } submitList(items) } From 05b9ff49a2e9f35f4851ffc74ef527f558a5d4ec Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 27 Oct 2025 23:04:01 +0800 Subject: [PATCH 031/190] Migrate from KAPT to KSP Ref: https://developer.android.com/build/migrate-to-ksp Signed-off-by: Aayush Gupta --- app/build.gradle.kts | 19 +++++++++---------- build.gradle.kts | 2 +- gradle/libs.versions.toml | 3 ++- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 037c3cb53..e4f318f65 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -6,7 +6,7 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.jetbrains.kotlin.android) - alias(libs.plugins.jetbrains.kotlin.kapt) + alias(libs.plugins.google.ksp) alias(libs.plugins.jetbrains.kotlin.parcelize) alias(libs.plugins.sonarqube) checkstyle @@ -40,12 +40,6 @@ android { System.getProperty("versionNameSuffix")?.let { versionNameSuffix = it } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - - javaCompileOptions { - annotationProcessorOptions { - arguments["room.schemaLocation"] = "$projectDir/schemas" - } - } } buildTypes { @@ -124,6 +118,11 @@ android { } } +ksp { + arg("room.schemaLocation", "$projectDir/schemas") +} + + // Custom dependency configuration for ktlint val ktlint by configurations.creating @@ -218,7 +217,7 @@ dependencies { implementation(libs.androidx.recyclerview) implementation(libs.androidx.room.runtime) implementation(libs.androidx.room.rxjava3) - kapt(libs.androidx.room.compiler) + ksp(libs.androidx.room.compiler) implementation(libs.androidx.swiperefreshlayout) implementation(libs.androidx.viewpager2) implementation(libs.androidx.work.runtime) @@ -229,7 +228,7 @@ dependencies { /** Third-party libraries **/ implementation(libs.livefront.bridge) implementation(libs.evernote.statesaver.core) - kapt(libs.evernote.statesaver.compiler) + ksp(libs.evernote.statesaver.compiler) // HTML parser implementation(libs.jsoup) @@ -249,7 +248,7 @@ dependencies { // Metadata generator for service descriptors compileOnly(libs.google.autoservice.annotations) - kapt(libs.google.autoservice.compiler) + ksp(libs.google.autoservice.compiler) // Manager for complex RecyclerView layouts implementation(libs.lisawray.groupie.core) diff --git a/build.gradle.kts b/build.gradle.kts index e79ccc3e0..d16afb3af 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.jetbrains.kotlin.android) apply false - alias(libs.plugins.jetbrains.kotlin.kapt) apply false + alias(libs.plugins.google.ksp) apply false alias(libs.plugins.jetbrains.kotlin.parcelize) apply false alias(libs.plugins.sonarqube) apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f48678867..cd54e5ef4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,6 +23,7 @@ jsoup = "1.21.2" junit = "4.13.2" junit-ext = "1.1.5" kotlin = "1.9.25" +ksp = "1.9.25-1.0.20" ktlint = "0.45.2" leakcanary = "2.12" lifecycle = "2.6.2" @@ -130,7 +131,7 @@ squareup-picasso = { module = "com.squareup.picasso:picasso", version.ref = "pic [plugins] android-application = { id = "com.android.application", version.ref = "agp" } +google-ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } -jetbrains-kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } jetbrains-kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } sonarqube = { id = "org.sonarqube", version.ref = "sonarqube" } From 995a92b7a44a770d3f85604eafdcd1c5ff9b54f7 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 28 Oct 2025 00:16:36 +0800 Subject: [PATCH 032/190] Migrate & adapt database tests to Kotlin as well Signed-off-by: Aayush Gupta --- .../newpipe/database/DatabaseMigrationTest.kt | 28 +++-- .../local/history/HistoryRecordManagerTest.kt | 67 ++++++----- .../playlist/LocalPlaylistManagerTest.kt | 2 +- .../playlist/PlaylistLocalItemTest.java | 106 ------------------ .../playlist/PlaylistLocalItemTest.kt | 102 +++++++++++++++++ 5 files changed, 155 insertions(+), 150 deletions(-) delete mode 100644 app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java create mode 100644 app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.kt diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt index a34cfece6..4327271f4 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt @@ -129,7 +129,7 @@ class DatabaseMigrationTest { ) val migratedDatabaseV3 = getMigratedDatabase() - val listFromDB = migratedDatabaseV3.streamDAO().all.blockingFirst() + val listFromDB = migratedDatabaseV3.streamDAO().getAll().blockingFirst() // Only expect 2, the one with the null url will be ignored assertEquals(2, listFromDB.size) @@ -217,7 +217,7 @@ class DatabaseMigrationTest { ) val migratedDatabaseV8 = getMigratedDatabase() - val listFromDB = migratedDatabaseV8.searchHistoryDAO().all.blockingFirst() + val listFromDB = migratedDatabaseV8.searchHistoryDAO().getAll().blockingFirst() assertEquals(2, listFromDB.size) assertEquals("abc", listFromDB[0].search) @@ -283,8 +283,8 @@ class DatabaseMigrationTest { ) val migratedDatabaseV9 = getMigratedDatabase() - var localListFromDB = migratedDatabaseV9.playlistDAO().all.blockingFirst() - var remoteListFromDB = migratedDatabaseV9.playlistRemoteDAO().all.blockingFirst() + var localListFromDB = migratedDatabaseV9.playlistDAO().getAll().blockingFirst() + var remoteListFromDB = migratedDatabaseV9.playlistRemoteDAO().getAll().blockingFirst() assertEquals(1, localListFromDB.size) assertEquals(localUid2, localListFromDB[0].uid) @@ -294,17 +294,27 @@ class DatabaseMigrationTest { assertEquals(-1, remoteListFromDB[0].displayIndex) val localUid3 = migratedDatabaseV9.playlistDAO().insert( - PlaylistEntity(DEFAULT_NAME + "3", false, -1, -1) + PlaylistEntity( + name = "${DEFAULT_NAME}3", + isThumbnailPermanent = false, + thumbnailStreamId = -1, + displayIndex = -1 + ) ) val remoteUid3 = migratedDatabaseV9.playlistRemoteDAO().insert( PlaylistRemoteEntity( - DEFAULT_THIRD_SERVICE_ID, DEFAULT_NAME, DEFAULT_THIRD_URL, - DEFAULT_THUMBNAIL, DEFAULT_UPLOADER_NAME, -1, 10 + serviceId = DEFAULT_THIRD_SERVICE_ID, + orderingName = DEFAULT_NAME, + url = DEFAULT_THIRD_URL, + thumbnailUrl = DEFAULT_THUMBNAIL, + uploader = DEFAULT_UPLOADER_NAME, + displayIndex = -1, + streamCount = 10 ) ) - localListFromDB = migratedDatabaseV9.playlistDAO().all.blockingFirst() - remoteListFromDB = migratedDatabaseV9.playlistRemoteDAO().all.blockingFirst() + localListFromDB = migratedDatabaseV9.playlistDAO().getAll().blockingFirst() + remoteListFromDB = migratedDatabaseV9.playlistRemoteDAO().getAll().blockingFirst() assertEquals(2, localListFromDB.size) assertEquals(localUid3, localListFromDB[1].uid) assertEquals(-1, localListFromDB[1].displayIndex) diff --git a/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt b/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt index 24be0f868..0de9dd268 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt @@ -41,7 +41,7 @@ class HistoryRecordManagerTest { // For some reason the Flowable returned by getAll() never completes, so we can't assert // that the number of Lists it returns is exactly 1, we can only check if the first List is // correct. Why on earth has a Flowable been used instead of a Single for getAll()?!? - val entities = database.searchHistoryDAO().all.blockingFirst() + val entities = database.searchHistoryDAO().getAll().blockingFirst() assertThat(entities).hasSize(1) assertThat(entities[0].id).isEqualTo(1) assertThat(entities[0].serviceId).isEqualTo(0) @@ -51,50 +51,50 @@ class HistoryRecordManagerTest { @Test fun deleteSearchHistory() { val entries = listOf( - SearchHistoryEntry(time.minusSeconds(1), 0, "A"), - SearchHistoryEntry(time.minusSeconds(2), 2, "A"), - SearchHistoryEntry(time.minusSeconds(3), 1, "B"), - SearchHistoryEntry(time.minusSeconds(4), 0, "B"), + SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 0, search = "A"), + SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 2, search = "A"), + SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 1, search = "B"), + SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 0, search = "B"), ) // make sure all 4 were inserted database.searchHistoryDAO().insertAll(entries) - assertThat(database.searchHistoryDAO().all.blockingFirst()).hasSameSizeAs(entries) + assertThat(database.searchHistoryDAO().getAll().blockingFirst()).hasSameSizeAs(entries) // try to delete only "A" entries, "B" entries should be untouched manager.deleteSearchHistory("A").test().await().assertValue(2) - val entities = database.searchHistoryDAO().all.blockingFirst() + val entities = database.searchHistoryDAO().getAll().blockingFirst() assertThat(entities).hasSize(2) assertThat(entities).usingElementComparator { o1, o2 -> if (o1.hasEqualValues(o2)) 0 else 1 } .containsExactly(*entries.subList(2, 4).toTypedArray()) // assert that nothing happens if we delete a search query that does exist in the db manager.deleteSearchHistory("A").test().await().assertValue(0) - val entities2 = database.searchHistoryDAO().all.blockingFirst() + val entities2 = database.searchHistoryDAO().getAll().blockingFirst() assertThat(entities2).hasSize(2) assertThat(entities2).usingElementComparator { o1, o2 -> if (o1.hasEqualValues(o2)) 0 else 1 } .containsExactly(*entries.subList(2, 4).toTypedArray()) // delete all remaining entries manager.deleteSearchHistory("B").test().await().assertValue(2) - assertThat(database.searchHistoryDAO().all.blockingFirst()).isEmpty() + assertThat(database.searchHistoryDAO().getAll().blockingFirst()).isEmpty() } @Test fun deleteCompleteSearchHistory() { val entries = listOf( - SearchHistoryEntry(time.minusSeconds(1), 1, "A"), - SearchHistoryEntry(time.minusSeconds(2), 2, "B"), - SearchHistoryEntry(time.minusSeconds(3), 0, "C"), + SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 1, search = "A"), + SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 2, search = "B"), + SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 0, search = "C"), ) // make sure all 3 were inserted database.searchHistoryDAO().insertAll(entries) - assertThat(database.searchHistoryDAO().all.blockingFirst()).hasSameSizeAs(entries) + assertThat(database.searchHistoryDAO().getAll().blockingFirst()).hasSameSizeAs(entries) // should remove everything manager.deleteCompleteSearchHistory().test().await().assertValue(entries.size) - assertThat(database.searchHistoryDAO().all.blockingFirst()).isEmpty() + assertThat(database.searchHistoryDAO().getAll().blockingFirst()).isEmpty() } private fun insertShuffledRelatedSearches(relatedSearches: Collection) { @@ -107,7 +107,7 @@ class HistoryRecordManagerTest { // make sure all entries were inserted assertEquals( relatedSearches.size, - database.searchHistoryDAO().all.blockingFirst().size + database.searchHistoryDAO().getAll().blockingFirst().size ) } @@ -127,19 +127,18 @@ class HistoryRecordManagerTest { @Test fun getRelatedSearches_emptyQuery_manyDuplicates() { - insertShuffledRelatedSearches( - listOf( - SearchHistoryEntry(time.minusSeconds(9), 3, "A"), - SearchHistoryEntry(time.minusSeconds(8), 3, "AB"), - SearchHistoryEntry(time.minusSeconds(7), 3, "A"), - SearchHistoryEntry(time.minusSeconds(6), 3, "A"), - SearchHistoryEntry(time.minusSeconds(5), 3, "BA"), - SearchHistoryEntry(time.minusSeconds(4), 3, "A"), - SearchHistoryEntry(time.minusSeconds(3), 3, "A"), - SearchHistoryEntry(time.minusSeconds(2), 0, "A"), - SearchHistoryEntry(time.minusSeconds(1), 2, "AA"), - ) + val relatedSearches = listOf( + SearchHistoryEntry(creationDate = time.minusSeconds(9), serviceId = 3, search = "A"), + SearchHistoryEntry(creationDate = time.minusSeconds(8), serviceId = 3, search = "AB"), + SearchHistoryEntry(creationDate = time.minusSeconds(7), serviceId = 3, search = "A"), + SearchHistoryEntry(creationDate = time.minusSeconds(6), serviceId = 3, search = "A"), + SearchHistoryEntry(creationDate = time.minusSeconds(5), serviceId = 3, search = "BA"), + SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 3, search = "A"), + SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 3, search = "A"), + SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 0, search = "A"), + SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 2, search = "AA"), ) + insertShuffledRelatedSearches(relatedSearches) val searches = manager.getRelatedSearches("", 9, 3).blockingFirst() assertThat(searches).containsExactly("AA", "A", "BA") @@ -166,13 +165,13 @@ class HistoryRecordManagerTest { private val time = OffsetDateTime.of(LocalDateTime.of(2000, 1, 1, 1, 1), ZoneOffset.UTC) private val RELATED_SEARCHES_ENTRIES = listOf( - SearchHistoryEntry(time.minusSeconds(7), 2, "AC"), - SearchHistoryEntry(time.minusSeconds(6), 0, "ABC"), - SearchHistoryEntry(time.minusSeconds(5), 1, "BA"), - SearchHistoryEntry(time.minusSeconds(4), 3, "A"), - SearchHistoryEntry(time.minusSeconds(2), 0, "B"), - SearchHistoryEntry(time.minusSeconds(3), 2, "AA"), - SearchHistoryEntry(time.minusSeconds(1), 1, "A"), + SearchHistoryEntry(creationDate = time.minusSeconds(7), serviceId = 2, search = "AC"), + SearchHistoryEntry(creationDate = time.minusSeconds(6), serviceId = 0, search = "ABC"), + SearchHistoryEntry(creationDate = time.minusSeconds(5), serviceId = 1, search = "BA"), + SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 3, search = "A"), + SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 0, search = "B"), + SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 2, search = "AA"), + SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 1, search = "A"), ) } } diff --git a/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt b/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt index c392d8d3d..ce3aeb84a 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt @@ -72,6 +72,6 @@ class LocalPlaylistManagerTest { val result = manager.createPlaylist("name", listOf(stream, upserted)) result.test().await().assertComplete() - database.streamDAO().all.test().awaitCount(1).assertValue(listOf(stream, upserted)) + database.streamDAO().getAll().test().awaitCount(1).assertValue(listOf(stream, upserted)) } } diff --git a/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java b/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java deleted file mode 100644 index 847c54aa8..000000000 --- a/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.schabi.newpipe.database.playlist; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; -import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; -import org.schabi.newpipe.local.bookmark.MergedPlaylistManager; - -import java.util.ArrayList; -import java.util.List; - -public class PlaylistLocalItemTest { - @Test - public void emptyPlaylists() { - final List localPlaylists = new ArrayList<>(); - final List remotePlaylists = new ArrayList<>(); - final List mergedPlaylists = - MergedPlaylistManager.merge(localPlaylists, remotePlaylists); - - assertEquals(0, mergedPlaylists.size()); - } - - @Test - public void onlyLocalPlaylists() { - final List localPlaylists = new ArrayList<>(); - final List remotePlaylists = new ArrayList<>(); - localPlaylists.add(new PlaylistMetadataEntry(1, "name1", "", false, -1, 0, 1)); - localPlaylists.add(new PlaylistMetadataEntry(2, "name2", "", false, -1, 1, 1)); - localPlaylists.add(new PlaylistMetadataEntry(3, "name3", "", false, -1, 3, 1)); - final List mergedPlaylists = - MergedPlaylistManager.merge(localPlaylists, remotePlaylists); - - assertEquals(3, mergedPlaylists.size()); - assertEquals(0, mergedPlaylists.get(0).getDisplayIndex()); - assertEquals(1, mergedPlaylists.get(1).getDisplayIndex()); - assertEquals(3, mergedPlaylists.get(2).getDisplayIndex()); - } - - @Test - public void onlyRemotePlaylists() { - final List localPlaylists = new ArrayList<>(); - final List remotePlaylists = new ArrayList<>(); - remotePlaylists.add(new PlaylistRemoteEntity( - 1, "name1", "url1", "", "", 1, 1L)); - remotePlaylists.add(new PlaylistRemoteEntity( - 2, "name2", "url2", "", "", 2, 1L)); - remotePlaylists.add(new PlaylistRemoteEntity( - 3, "name3", "url3", "", "", 4, 1L)); - final List mergedPlaylists = - MergedPlaylistManager.merge(localPlaylists, remotePlaylists); - - assertEquals(3, mergedPlaylists.size()); - assertEquals(1, mergedPlaylists.get(0).getDisplayIndex()); - assertEquals(2, mergedPlaylists.get(1).getDisplayIndex()); - assertEquals(4, mergedPlaylists.get(2).getDisplayIndex()); - } - - @Test - public void sameIndexWithDifferentName() { - final List localPlaylists = new ArrayList<>(); - final List remotePlaylists = new ArrayList<>(); - localPlaylists.add(new PlaylistMetadataEntry(1, "name1", "", false, -1, 0, 1)); - localPlaylists.add(new PlaylistMetadataEntry(2, "name2", "", false, -1, 1, 1)); - remotePlaylists.add(new PlaylistRemoteEntity( - 1, "name3", "url1", "", "", 0, 1L)); - remotePlaylists.add(new PlaylistRemoteEntity( - 2, "name4", "url2", "", "", 1, 1L)); - final List mergedPlaylists = - MergedPlaylistManager.merge(localPlaylists, remotePlaylists); - - assertEquals(4, mergedPlaylists.size()); - assertTrue(mergedPlaylists.get(0) instanceof PlaylistMetadataEntry); - assertEquals("name1", ((PlaylistMetadataEntry) mergedPlaylists.get(0)).name); - assertTrue(mergedPlaylists.get(1) instanceof PlaylistRemoteEntity); - assertEquals("name3", ((PlaylistRemoteEntity) mergedPlaylists.get(1)).getName()); - assertTrue(mergedPlaylists.get(2) instanceof PlaylistMetadataEntry); - assertEquals("name2", ((PlaylistMetadataEntry) mergedPlaylists.get(2)).name); - assertTrue(mergedPlaylists.get(3) instanceof PlaylistRemoteEntity); - assertEquals("name4", ((PlaylistRemoteEntity) mergedPlaylists.get(3)).getName()); - } - - @Test - public void sameNameWithDifferentIndex() { - final List localPlaylists = new ArrayList<>(); - final List remotePlaylists = new ArrayList<>(); - localPlaylists.add(new PlaylistMetadataEntry(1, "name1", "", false, -1, 1, 1)); - localPlaylists.add(new PlaylistMetadataEntry(2, "name2", "", false, -1, 3, 1)); - remotePlaylists.add(new PlaylistRemoteEntity( - 1, "name1", "url1", "", "", 0, 1L)); - remotePlaylists.add(new PlaylistRemoteEntity( - 2, "name2", "url2", "", "", 2, 1L)); - final List mergedPlaylists = - MergedPlaylistManager.merge(localPlaylists, remotePlaylists); - - assertEquals(4, mergedPlaylists.size()); - assertTrue(mergedPlaylists.get(0) instanceof PlaylistRemoteEntity); - assertEquals("name1", ((PlaylistRemoteEntity) mergedPlaylists.get(0)).getName()); - assertTrue(mergedPlaylists.get(1) instanceof PlaylistMetadataEntry); - assertEquals("name1", ((PlaylistMetadataEntry) mergedPlaylists.get(1)).name); - assertTrue(mergedPlaylists.get(2) instanceof PlaylistRemoteEntity); - assertEquals("name2", ((PlaylistRemoteEntity) mergedPlaylists.get(2)).getName()); - assertTrue(mergedPlaylists.get(3) instanceof PlaylistMetadataEntry); - assertEquals("name2", ((PlaylistMetadataEntry) mergedPlaylists.get(3)).name); - } -} diff --git a/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.kt b/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.kt new file mode 100644 index 000000000..ace51e7e2 --- /dev/null +++ b/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.kt @@ -0,0 +1,102 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.database.playlist + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Test +import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity +import org.schabi.newpipe.local.bookmark.MergedPlaylistManager + +class PlaylistLocalItemTest { + + @Test + fun emptyPlaylists() { + val localPlaylists = listOf() + val remotePlaylists = listOf() + val mergedPlaylists = MergedPlaylistManager.merge(localPlaylists, remotePlaylists) + assertEquals(0, mergedPlaylists.size) + } + + @Test + fun onlyLocalPlaylists() { + val localPlaylists = listOf( + PlaylistMetadataEntry(1, "name1", "", 0, false, -1, 1), + PlaylistMetadataEntry(2, "name2", "", 1, false, -1, 1), + PlaylistMetadataEntry(3, "name3", "", 3, false, -1, 1) + ) + val remotePlaylists = listOf() + val mergedPlaylists = MergedPlaylistManager.merge(localPlaylists, remotePlaylists) + + assertEquals(3, mergedPlaylists.size) + assertEquals(0L, mergedPlaylists[0]!!.displayIndex) + assertEquals(1L, mergedPlaylists[1]!!.displayIndex) + assertEquals(3L, mergedPlaylists[2]!!.displayIndex) + } + + @Test + fun onlyRemotePlaylists() { + val localPlaylists = listOf() + val remotePlaylists = listOf( + PlaylistRemoteEntity(1, 1, "name1", "url1", "", "", 1, 1), + PlaylistRemoteEntity(2, 2, "name2", "url2", "", "", 2, 1), + PlaylistRemoteEntity(3, 3, "name3", "url3", "", "", 4, 1) + ) + val mergedPlaylists = MergedPlaylistManager.merge(localPlaylists, remotePlaylists) + + assertEquals(3, mergedPlaylists.size) + assertEquals(1L, mergedPlaylists[0]!!.displayIndex) + assertEquals(2L, mergedPlaylists[1]!!.displayIndex) + assertEquals(4L, mergedPlaylists[2]!!.displayIndex) + } + + @Test + fun sameIndexWithDifferentName() { + val localPlaylists = listOf( + PlaylistMetadataEntry(1, "name1", "", 0, false, -1, 1), + PlaylistMetadataEntry(2, "name2", "", 1, false, -1, 1) + ) + val remotePlaylists = listOf( + PlaylistRemoteEntity(1, 1, "name3", "url1", "", "", 0, 1), + PlaylistRemoteEntity(2, 2, "name4", "url2", "", "", 1, 1) + ) + val mergedPlaylists = MergedPlaylistManager.merge(localPlaylists, remotePlaylists) + + assertEquals(4, mergedPlaylists.size) + assertTrue(mergedPlaylists[0] is PlaylistMetadataEntry) + assertEquals("name1", (mergedPlaylists[0] as PlaylistMetadataEntry).orderingName) + assertTrue(mergedPlaylists[1] is PlaylistRemoteEntity) + assertEquals("name3", (mergedPlaylists[1] as PlaylistRemoteEntity).orderingName) + assertTrue(mergedPlaylists[2] is PlaylistMetadataEntry) + assertEquals("name2", (mergedPlaylists[2] as PlaylistMetadataEntry).orderingName) + assertTrue(mergedPlaylists[3] is PlaylistRemoteEntity) + assertEquals("name4", (mergedPlaylists[3] as PlaylistRemoteEntity).orderingName) + } + + @Test + fun sameNameWithDifferentIndex() { + val localPlaylists = listOf( + PlaylistMetadataEntry(1, "name1", "", 1, false, -1, 1), + PlaylistMetadataEntry(2, "name2", "", 3, false, -1, 1) + ) + val remotePlaylists = listOf( + PlaylistRemoteEntity(1, 1, "name1", "url1", "", "", 0, 1), + PlaylistRemoteEntity(2, 2, "name2", "url2", "", "", 2, 1) + ) + val mergedPlaylists = MergedPlaylistManager.merge(localPlaylists, remotePlaylists) + + assertEquals(4, mergedPlaylists.size) + assertTrue(mergedPlaylists[0] is PlaylistRemoteEntity) + assertEquals("name1", (mergedPlaylists[0] as PlaylistRemoteEntity).orderingName) + assertTrue(mergedPlaylists[1] is PlaylistMetadataEntry) + assertEquals("name1", (mergedPlaylists[1] as PlaylistMetadataEntry).orderingName) + assertTrue(mergedPlaylists[2] is PlaylistRemoteEntity) + assertEquals("name2", (mergedPlaylists[2] as PlaylistRemoteEntity).orderingName) + assertTrue(mergedPlaylists[3] is PlaylistMetadataEntry) + assertEquals("name2", (mergedPlaylists[3] as PlaylistMetadataEntry).orderingName) + } +} From 7c76791db3976c907e14001e703bb9b6143a17a5 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 28 Oct 2025 15:10:07 +0800 Subject: [PATCH 033/190] Handle null-safety error in FeedDao The lastUpdated parameter can be null, adjust return types to signal that too Signed-off-by: Aayush Gupta --- .../main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt | 4 ++-- .../java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt | 2 +- .../main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt index e7ed93497..d756df8b1 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt @@ -168,10 +168,10 @@ abstract class FeedDAO { ON fgs.subscription_id = lu.subscription_id AND fgs.group_id = :groupId """ ) - abstract fun oldestSubscriptionUpdate(groupId: Long): Flowable> + abstract fun oldestSubscriptionUpdate(groupId: Long): Flowable> @Query("SELECT MIN(last_updated) FROM feed_last_updated") - abstract fun oldestSubscriptionUpdateFromAll(): Flowable> + abstract fun oldestSubscriptionUpdateFromAll(): Flowable> @Query("SELECT COUNT(*) FROM feed_last_updated WHERE last_updated IS NULL") abstract fun notLoadedCount(): Flowable diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt index ed65d4048..aacc6757e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt @@ -177,7 +177,7 @@ class FeedDatabaseManager(context: Context) { .observeOn(AndroidSchedulers.mainThread()) } - fun oldestSubscriptionUpdate(groupId: Long): Flowable> { + fun oldestSubscriptionUpdate(groupId: Long): Flowable> { return when (groupId) { FeedGroupEntity.GROUP_ALL_ID -> feedTable.oldestSubscriptionUpdateFromAll() else -> feedTable.oldestSubscriptionUpdate(groupId) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt index 728570b17..f916db2b5 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt @@ -65,7 +65,7 @@ class FeedViewModel( feedDatabaseManager.oldestSubscriptionUpdate(groupId), Function6 { t1: FeedEventManager.Event, t2: Boolean, t3: Boolean, t4: Boolean, - t5: Long, t6: List -> + t5: Long, t6: List -> return@Function6 CombineResultEventHolder(t1, t2, t3, t4, t5, t6.firstOrNull()) } ) From 97e7272151fe40a6576af8d5b8d0315d05fac1ca Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 6 Nov 2025 15:43:07 +0800 Subject: [PATCH 034/190] Removed badly hacked default playlist thumbnail icon The defaults should be supplied to the image loading software not the database library. This would also break when we shrink resources as that would rename the resources. Signed-off-by: Aayush Gupta --- .../playlist/dao/PlaylistStreamDAO.kt | 32 +++---------------- .../database/playlist/model/PlaylistEntity.kt | 4 --- .../local/dialog/PlaylistAppendDialog.java | 7 ++-- 3 files changed, 8 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt index 11ad38685..7edb15526 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt @@ -15,7 +15,6 @@ import org.schabi.newpipe.database.BasicDAO import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry import org.schabi.newpipe.database.playlist.PlaylistStreamEntry -import org.schabi.newpipe.database.playlist.model.PlaylistEntity.Companion.DEFAULT_THUMBNAIL import org.schabi.newpipe.database.playlist.model.PlaylistEntity.Companion.DEFAULT_THUMBNAIL_ID import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity @@ -73,11 +72,7 @@ interface PlaylistStreamDAO : BasicDAO { @Query( """ SELECT uid, name, is_thumbnail_permanent, thumbnail_stream_id, display_index, - - CASE WHEN thumbnail_stream_id = $DEFAULT_THUMBNAIL_ID - THEN :defaultThumbnail - ELSE (SELECT thumbnail_url FROM streams WHERE streams.uid = thumbnail_stream_id) - END AS thumbnail_url, + (SELECT thumbnail_url FROM streams WHERE streams.uid = thumbnail_stream_id) AS thumbnail_url, COALESCE(COUNT(playlist_id), 0) AS streamCount FROM playlists @@ -88,12 +83,7 @@ interface PlaylistStreamDAO : BasicDAO { ORDER BY display_index """ ) - fun getPlaylistMetadata(defaultThumbnail: String): Flowable> - - // TODO: Remove on migrating classes to Kotlin - fun getPlaylistMetadata(): Flowable> { - return getPlaylistMetadata(DEFAULT_THUMBNAIL) - } + fun getPlaylistMetadata(): Flowable> @RewriteQueriesToDropUnusedColumns @Transaction @@ -118,11 +108,7 @@ interface PlaylistStreamDAO : BasicDAO { @Query( """ SELECT playlists.uid, name, is_thumbnail_permanent, thumbnail_stream_id, display_index, - - CASE WHEN thumbnail_stream_id = $DEFAULT_THUMBNAIL_ID - THEN :defaultThumbnail - ELSE (SELECT thumbnail_url FROM streams WHERE streams.uid = thumbnail_stream_id ) - END AS thumbnail_url, + (SELECT thumbnail_url FROM streams WHERE streams.uid = thumbnail_stream_id) AS thumbnail_url, COALESCE(COUNT(playlist_id), 0) AS streamCount, COALESCE(SUM(url = :streamUrl), 0) AS timesStreamIsContained FROM playlists @@ -137,15 +123,5 @@ interface PlaylistStreamDAO : BasicDAO { ORDER BY display_index, name """ ) - fun getPlaylistDuplicatesMetadata( - streamUrl: String, - defaultThumbnail: String - ): Flowable> - - // TODO: Remove on migrating classes to Kotlin - fun getPlaylistDuplicatesMetadata( - streamUrl: String - ): Flowable> { - return getPlaylistDuplicatesMetadata(streamUrl, DEFAULT_THUMBNAIL) - } + fun getPlaylistDuplicatesMetadata(streamUrl: String): Flowable> } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt index a72a1cee5..4ea4eb3a7 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt @@ -10,7 +10,6 @@ import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.Ignore import androidx.room.PrimaryKey -import org.schabi.newpipe.R import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry @Entity(tableName = PlaylistEntity.Companion.PLAYLIST_TABLE) @@ -42,9 +41,6 @@ data class PlaylistEntity @JvmOverloads constructor( ) companion object { - @JvmField - val DEFAULT_THUMBNAIL = "drawable://" + R.drawable.placeholder_thumbnail_playlist - const val DEFAULT_THUMBNAIL_ID = -1L const val PLAYLIST_TABLE = "playlists" diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index 00b03513d..48d17d1d8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.local.dialog; +import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.DEFAULT_THUMBNAIL_ID; + import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -14,7 +16,6 @@ import androidx.recyclerview.widget.RecyclerView; import org.schabi.newpipe.NewPipeDatabase; import org.schabi.newpipe.R; -import org.schabi.newpipe.database.playlist.model.PlaylistEntity; import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry; import org.schabi.newpipe.database.stream.model.StreamEntity; import org.schabi.newpipe.local.LocalItemListAdapter; @@ -160,8 +161,8 @@ public final class PlaylistAppendDialog extends PlaylistDialog { .subscribe(ignored -> { successToast.show(); - if (playlist.getThumbnailUrl() != null - && playlist.getThumbnailUrl().equals(PlaylistEntity.DEFAULT_THUMBNAIL) + if (playlist.getThumbnailStreamId() != null + && playlist.getThumbnailStreamId() == DEFAULT_THUMBNAIL_ID ) { playlistDisposables.add(manager .changePlaylistThumbnail(playlist.getUid(), streams.get(0).getUid(), From 4826e5b3c5ebf52b80f4970ba73db7d9d1f3d771 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 6 Nov 2025 16:08:40 +0800 Subject: [PATCH 035/190] Add missing annotations for columnInfo in PlaylistDuplicatesEntry Fixes [ksp] app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt:140: The columns returned by the query does not have the fields [thumbnailUrl,isThumbnailPermanent,thumbnailStreamId,displayIndex,orderingName] in org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry even though they are annotated as non-null or primitive. Columns returned by the query: [uid,streamCount,timesStreamIsContained] Signed-off-by: Aayush Gupta --- .../database/playlist/PlaylistDuplicatesEntry.kt | 14 ++++++++++++++ .../database/playlist/dao/PlaylistStreamDAO.kt | 1 - 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.kt index f0447df6e..84972a89e 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.kt @@ -7,6 +7,7 @@ package org.schabi.newpipe.database.playlist import androidx.room.ColumnInfo +import org.schabi.newpipe.database.playlist.model.PlaylistEntity /** * This class adds a field to [PlaylistMetadataEntry] that contains an integer representing @@ -15,12 +16,25 @@ import androidx.room.ColumnInfo * @see org.schabi.newpipe.local.playlist.LocalPlaylistManager.getPlaylistDuplicates */ data class PlaylistDuplicatesEntry( + @ColumnInfo(name = PlaylistEntity.PLAYLIST_ID) override val uid: Long, + + @ColumnInfo(name = PlaylistEntity.PLAYLIST_THUMBNAIL_URL) override val thumbnailUrl: String?, + + @ColumnInfo(name = PlaylistEntity.PLAYLIST_THUMBNAIL_PERMANENT) override val isThumbnailPermanent: Boolean?, + + @ColumnInfo(name = PlaylistEntity.PLAYLIST_THUMBNAIL_STREAM_ID) override val thumbnailStreamId: Long?, + + @ColumnInfo(name = PlaylistEntity.PLAYLIST_DISPLAY_INDEX) override var displayIndex: Long?, + + @ColumnInfo(name = PLAYLIST_STREAM_COUNT) override val streamCount: Long, + + @ColumnInfo(name = PlaylistEntity.PLAYLIST_NAME) override val orderingName: String?, @ColumnInfo(name = PLAYLIST_TIMES_STREAM_IS_CONTAINED) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt index 7edb15526..8bf26d754 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt @@ -103,7 +103,6 @@ interface PlaylistStreamDAO : BasicDAO { ) fun getStreamsWithoutDuplicates(playlistId: Long): Flowable> - @RewriteQueriesToDropUnusedColumns @Transaction @Query( """ From a4cc1d1ddfa31a24813f17e53935501035ddb574 Mon Sep 17 00:00:00 2001 From: Alex Popov Date: Mon, 10 Nov 2025 02:22:56 +0700 Subject: [PATCH 036/190] feat(player): Remember and restore orientation on fullscreen exit - Store the original screen orientation when entering fullscreen. - Restore the saved orientation when exiting fullscreen. - On tablets, continue to just toggle the fullscreen UI without changing the device orientation. --- .../fragments/detail/VideoDetailFragment.java | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 7b8705565..7c1d46945 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -206,6 +206,8 @@ public final class VideoDetailFragment int lastStableBottomSheetState = BottomSheetBehavior.STATE_EXPANDED; @State protected boolean autoPlayEnabled = true; + @State + private int originalOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; @Nullable private StreamInfo currentInfo = null; @@ -1900,22 +1902,29 @@ public final class VideoDetailFragment @Override public void onScreenRotationButtonClicked() { - // In tablet user experience will be better if screen will not be rotated - // from landscape to portrait every time. - // Just turn on fullscreen mode in landscape orientation - // or portrait & unlocked global orientation - final boolean isLandscape = DeviceUtils.isLandscape(requireContext()); - if (DeviceUtils.isTablet(activity) - && (!globalScreenOrientationLocked(activity) || isLandscape)) { - player.UIs().get(MainPlayerUi.class).ifPresent(MainPlayerUi::toggleFullscreen); + final Optional playerUi = player != null + ? player.UIs().get(MainPlayerUi.class) + : Optional.empty(); + if (playerUi.isEmpty()) { return; } - final int newOrientation = isLandscape - ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT - : ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE; + // On tablets, just toggle fullscreen UI without orientation change. + if (DeviceUtils.isTablet(activity)) { + playerUi.get().toggleFullscreen(); + return; + } - activity.setRequestedOrientation(newOrientation); + if (playerUi.get().isFullscreen()) { + // EXITING FULLSCREEN + playerUi.get().toggleFullscreen(); + activity.setRequestedOrientation(originalOrientation); + } else { + // ENTERING FULLSCREEN + originalOrientation = activity.getRequestedOrientation(); + playerUi.get().toggleFullscreen(); + activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); + } } /* From eaafdb2570c301b07daae72fa798ac74648b0a3e Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 14 Nov 2025 21:09:20 +0100 Subject: [PATCH 037/190] Translated using Weblate (Turkish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 50.0% (43 of 86 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Spanish) Currently translated at 98.6% (754 of 764 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Lombard) Currently translated at 0.2% (2 of 764 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 72.0% (62 of 86 strings) Added translation using Weblate (Lombard) Translated using Weblate (Korean) Currently translated at 97.6% (84 of 86 strings) Translated using Weblate (Danish) Currently translated at 97.9% (748 of 764 strings) Translated using Weblate (Romanian) Currently translated at 97.9% (748 of 764 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (86 of 86 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Latvian) Currently translated at 95.6% (731 of 764 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.8% (763 of 764 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 73.8% (564 of 764 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Portuguese) Currently translated at 99.8% (763 of 764 strings) Translated using Weblate (Georgian) Currently translated at 92.8% (709 of 764 strings) Translated using Weblate (Georgian) Currently translated at 89.5% (77 of 86 strings) Translated using Weblate (Thai) Currently translated at 3.4% (3 of 86 strings) Translated using Weblate (Thai) Currently translated at 37.1% (284 of 764 strings) Translated using Weblate (Catalan) Currently translated at 96.3% (736 of 764 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Slovenian) Currently translated at 53.0% (405 of 764 strings) Translated using Weblate (Thai) Currently translated at 36.7% (281 of 764 strings) Translated using Weblate (Thai) Currently translated at 2.3% (2 of 86 strings) Translated using Weblate (Croatian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Belarusian) Currently translated at 98.9% (756 of 764 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Bulgarian) Currently translated at 5.8% (5 of 86 strings) Translated using Weblate (Bulgarian) Currently translated at 5.8% (5 of 86 strings) Translated using Weblate (Bosnian) Currently translated at 100.0% (86 of 86 strings) Translated using Weblate (Bosnian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 90.6% (78 of 86 strings) Translated using Weblate (Serbian) Currently translated at 16.2% (14 of 86 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Croatian) Currently translated at 95.4% (729 of 764 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Serbian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Italian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Icelandic) Currently translated at 98.4% (752 of 764 strings) Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 36.0% (31 of 86 strings) Translated using Weblate (German) Currently translated at 100.0% (86 of 86 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Belarusian) Currently translated at 97.1% (742 of 764 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Hebrew) Currently translated at 99.0% (757 of 764 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Polish) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Czech) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Greek) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Korean) Currently translated at 98.6% (754 of 764 strings) Translated using Weblate (Russian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Serbian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (French) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (German) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (French) Currently translated at 100.0% (86 of 86 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (86 of 86 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 69.7% (60 of 86 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (French) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Polish) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Czech) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Greek) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (French) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (German) Currently translated at 100.0% (759 of 759 strings) Translated using Weblate (Kabyle) Currently translated at 28.1% (212 of 754 strings) Translated using Weblate (Russian) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Icelandic) Currently translated at 99.2% (748 of 754 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (86 of 86 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (86 of 86 strings) Translated using Weblate (German) Currently translated at 100.0% (86 of 86 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Vietnamese) Currently translated at 99.6% (751 of 754 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Italian) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Vietnamese) Currently translated at 99.6% (751 of 754 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Russian) Currently translated at 99.3% (749 of 754 strings) Translated using Weblate (Tigrinya) Currently translated at 20.1% (152 of 754 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (86 of 86 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Tigrinya) Currently translated at 18.1% (137 of 754 strings) Translated using Weblate (Czech) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (German) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (German) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Tigrinya) Currently translated at 17.3% (131 of 754 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Polish) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Polish) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Greek) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (French) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (French) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (German) Currently translated at 99.8% (753 of 754 strings) Translated using Weblate (German) Currently translated at 99.8% (753 of 754 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Czech) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Tigrinya) Currently translated at 15.6% (118 of 754 strings) Translated using Weblate (English (United Kingdom)) Currently translated at 9.3% (8 of 86 strings) Translated using Weblate (English (United Kingdom)) Currently translated at 8.8% (67 of 754 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 98.8% (85 of 86 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (86 of 86 strings) Translated using Weblate (Vietnamese) Currently translated at 79.0% (68 of 86 strings) Translated using Weblate (Portuguese) Currently translated at 98.8% (85 of 86 strings) Translated using Weblate (Greek) Currently translated at 36.0% (31 of 86 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Sardinian) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Vietnamese) Currently translated at 97.3% (734 of 754 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 99.2% (748 of 754 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Polish) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Czech) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Czech) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Greek) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Greek) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (French) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (754 of 754 strings) Translated using Weblate (Russian) Currently translated at 100.0% (86 of 86 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (748 of 748 strings) Co-authored-by: 404px Co-authored-by: 439JBYL80IGQTF25UXNR0X1BG <439JBYL80IGQTF25UXNR0X1BG@users.noreply.hosted.weblate.org> Co-authored-by: Agnieszka C Co-authored-by: Ajeje Brazorf Co-authored-by: Alex25820 Co-authored-by: ButterflyOfFire Co-authored-by: CJ Montero Co-authored-by: DB L Co-authored-by: Daniel Mantilla Co-authored-by: Dizro Co-authored-by: Drugi Sapog Co-authored-by: EESF-2 Co-authored-by: Emin Tufan Çetin Co-authored-by: Femini Co-authored-by: Fjuro Co-authored-by: FrederikFinckh Co-authored-by: Ghost of Sparta Co-authored-by: Hasan Co-authored-by: Hosted Weblate Co-authored-by: Hoàng Sơn Co-authored-by: Igor Rückert Co-authored-by: Ihor Hordiichuk Co-authored-by: J. Lavoie Co-authored-by: Jeff Huang Co-authored-by: Linerly Co-authored-by: MS-PC Co-authored-by: Maria Dimitrova Co-authored-by: Matija Šuklje Co-authored-by: Mickaël Binos Co-authored-by: Milan Co-authored-by: Mona Lisa Co-authored-by: NEXI Co-authored-by: Nick Wick Co-authored-by: Nikoloz Co-authored-by: Philip Goto Co-authored-by: Priit Jõerüüt Co-authored-by: Random Co-authored-by: René Co-authored-by: Rex_sa Co-authored-by: Ricard Rodríguez Co-authored-by: Sarah O Co-authored-by: SecularSteve Co-authored-by: Sveinn í Felli Co-authored-by: ThaiWithNoBraincell Co-authored-by: The Cats Co-authored-by: Trunars Co-authored-by: Tấn Lực Trương Co-authored-by: Valer <122545522+Valer100@users.noreply.github.com> Co-authored-by: Vasilis K Co-authored-by: VfBFan Co-authored-by: VisionR1 <25982450+VisionR1@users.noreply.github.com> Co-authored-by: Xiao Ping Co-authored-by: Yaron Shahrabani Co-authored-by: cat Co-authored-by: delvani Co-authored-by: fool Co-authored-by: gbpu Co-authored-by: ikanakova Co-authored-by: justcontributor Co-authored-by: late Co-authored-by: nafanz Co-authored-by: rehork Co-authored-by: ssantos Co-authored-by: sudo-py-dev Co-authored-by: tct123 Co-authored-by: yummysheepouo Co-authored-by: Максим Горпиніч Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) Co-authored-by: 大王叫我来巡山 Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/bg/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/bs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/el/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/en_GB/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/es/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/id/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ka/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ko/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_PT/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ru/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/th/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/tr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/vi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant_HK/ Translation: NewPipe/Metadata --- app/src/main/res/values-ar/strings.xml | 20 + app/src/main/res/values-az/strings.xml | 33 +- app/src/main/res/values-be/strings.xml | 42 +- app/src/main/res/values-bg/strings.xml | 30 +- app/src/main/res/values-bs/strings.xml | 717 +++++++++++++++++- app/src/main/res/values-ca/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 24 +- app/src/main/res/values-da/strings.xml | 11 +- app/src/main/res/values-de/strings.xml | 20 + app/src/main/res/values-el/strings.xml | 22 +- app/src/main/res/values-en-rGB/strings.xml | 10 + app/src/main/res/values-es/strings.xml | 15 + app/src/main/res/values-et/strings.xml | 22 +- app/src/main/res/values-fr/strings.xml | 71 +- app/src/main/res/values-he/strings.xml | 24 +- app/src/main/res/values-hr/strings.xml | 74 +- app/src/main/res/values-hu/strings.xml | 34 +- app/src/main/res/values-in/strings.xml | 20 + app/src/main/res/values-is/strings.xml | 12 + app/src/main/res/values-it/strings.xml | 20 + app/src/main/res/values-ka/strings.xml | 56 ++ app/src/main/res/values-kab/strings.xml | 6 +- app/src/main/res/values-ko/strings.xml | 31 +- app/src/main/res/values-lmo/strings.xml | 4 + app/src/main/res/values-lv/strings.xml | 2 +- app/src/main/res/values-nl-rBE/strings.xml | 2 + app/src/main/res/values-nl/strings.xml | 25 + app/src/main/res/values-pl/strings.xml | 26 +- app/src/main/res/values-pt-rBR/strings.xml | 24 +- app/src/main/res/values-pt-rPT/strings.xml | 23 + app/src/main/res/values-pt/strings.xml | 23 + app/src/main/res/values-ro/strings.xml | 4 + app/src/main/res/values-ru/strings.xml | 20 + app/src/main/res/values-sc/strings.xml | 14 + app/src/main/res/values-sk/strings.xml | 24 +- app/src/main/res/values-sl/strings.xml | 2 +- app/src/main/res/values-sr/strings.xml | 102 ++- app/src/main/res/values-sv/strings.xml | 31 +- app/src/main/res/values-th/strings.xml | 19 + app/src/main/res/values-ti/strings.xml | 78 +- app/src/main/res/values-tr/strings.xml | 20 + app/src/main/res/values-uk/strings.xml | 20 + app/src/main/res/values-vi/strings.xml | 24 +- app/src/main/res/values-zh-rCN/strings.xml | 20 + app/src/main/res/values-zh-rTW/strings.xml | 153 ++-- .../metadata/android/bg/changelogs/1000.txt | 13 + .../metadata/android/bs/changelogs/1000.txt | 13 + .../metadata/android/bs/changelogs/1001.txt | 6 + .../metadata/android/bs/changelogs/1002.txt | 4 + .../metadata/android/bs/changelogs/1003.txt | 6 + .../metadata/android/bs/changelogs/1004.txt | 3 + .../metadata/android/bs/changelogs/1005.txt | 17 + .../metadata/android/bs/changelogs/64.txt | 8 + .../metadata/android/bs/changelogs/65.txt | 26 + .../metadata/android/bs/changelogs/66.txt | 33 + .../metadata/android/bs/changelogs/68.txt | 31 + .../metadata/android/bs/changelogs/69.txt | 19 + .../metadata/android/bs/changelogs/70.txt | 25 + .../metadata/android/bs/changelogs/71.txt | 10 + .../metadata/android/bs/changelogs/730.txt | 2 + .../metadata/android/bs/changelogs/740.txt | 1 + .../metadata/android/bs/changelogs/750.txt | 21 + .../metadata/android/bs/changelogs/760.txt | 40 + .../metadata/android/bs/changelogs/770.txt | 4 + .../metadata/android/bs/changelogs/780.txt | 12 + .../metadata/android/bs/changelogs/790.txt | 14 + .../metadata/android/bs/changelogs/800.txt | 27 + .../metadata/android/bs/changelogs/810.txt | 20 + .../metadata/android/bs/changelogs/820.txt | 1 + .../metadata/android/bs/changelogs/830.txt | 1 + .../metadata/android/bs/changelogs/840.txt | 22 + .../metadata/android/bs/changelogs/850.txt | 1 + .../metadata/android/bs/changelogs/860.txt | 7 + .../metadata/android/bs/changelogs/870.txt | 2 + .../metadata/android/bs/changelogs/900.txt | 15 + .../metadata/android/bs/changelogs/910.txt | 1 + .../metadata/android/bs/changelogs/920.txt | 9 + .../metadata/android/bs/changelogs/930.txt | 20 + .../metadata/android/bs/changelogs/940.txt | 16 + .../metadata/android/bs/changelogs/950.txt | 4 + .../metadata/android/bs/changelogs/951.txt | 17 + .../metadata/android/bs/changelogs/952.txt | 7 + .../metadata/android/bs/changelogs/953.txt | 1 + .../metadata/android/bs/changelogs/954.txt | 10 + .../metadata/android/bs/changelogs/955.txt | 3 + .../metadata/android/bs/changelogs/956.txt | 1 + .../metadata/android/bs/changelogs/957.txt | 10 + .../metadata/android/bs/changelogs/958.txt | 15 + .../metadata/android/bs/changelogs/959.txt | 3 + .../metadata/android/bs/changelogs/960.txt | 3 + .../metadata/android/bs/changelogs/961.txt | 12 + .../metadata/android/bs/changelogs/962.txt | 2 + .../metadata/android/bs/changelogs/963.txt | 1 + .../metadata/android/bs/changelogs/964.txt | 8 + .../metadata/android/bs/changelogs/965.txt | 6 + .../metadata/android/bs/changelogs/966.txt | 14 + .../metadata/android/bs/changelogs/967.txt | 1 + .../metadata/android/bs/changelogs/968.txt | 7 + .../metadata/android/bs/changelogs/969.txt | 8 + .../metadata/android/bs/changelogs/970.txt | 11 + .../metadata/android/bs/changelogs/971.txt | 3 + .../metadata/android/bs/changelogs/972.txt | 14 + .../metadata/android/bs/changelogs/973.txt | 4 + .../metadata/android/bs/changelogs/974.txt | 5 + .../metadata/android/bs/changelogs/975.txt | 17 + .../metadata/android/bs/changelogs/976.txt | 10 + .../metadata/android/bs/changelogs/977.txt | 10 + .../metadata/android/bs/changelogs/978.txt | 1 + .../metadata/android/bs/changelogs/979.txt | 2 + .../metadata/android/bs/changelogs/980.txt | 13 + .../metadata/android/bs/changelogs/981.txt | 2 + .../metadata/android/bs/changelogs/982.txt | 1 + .../metadata/android/bs/changelogs/983.txt | 9 + .../metadata/android/bs/changelogs/984.txt | 7 + .../metadata/android/bs/changelogs/985.txt | 1 + .../metadata/android/bs/changelogs/986.txt | 17 + .../metadata/android/bs/changelogs/987.txt | 12 + .../metadata/android/bs/changelogs/988.txt | 2 + .../metadata/android/bs/changelogs/989.txt | 3 + .../metadata/android/bs/changelogs/990.txt | 15 + .../metadata/android/bs/changelogs/991.txt | 14 + .../metadata/android/bs/changelogs/992.txt | 17 + .../metadata/android/bs/changelogs/993.txt | 12 + .../metadata/android/bs/changelogs/994.txt | 15 + .../metadata/android/bs/changelogs/995.txt | 16 + .../metadata/android/bs/changelogs/996.txt | 2 + .../metadata/android/bs/changelogs/997.txt | 17 + .../metadata/android/bs/changelogs/998.txt | 4 + .../metadata/android/bs/changelogs/999.txt | 12 + .../metadata/android/de/changelogs/1002.txt | 2 +- .../metadata/android/de/changelogs/972.txt | 19 +- .../metadata/android/de/short_description.txt | 2 +- .../metadata/android/el/changelogs/1004.txt | 3 + .../metadata/android/el/changelogs/1005.txt | 17 + .../metadata/android/el/changelogs/70.txt | 25 + .../metadata/android/el/changelogs/71.txt | 10 + .../android/en_GB/changelogs/1005.txt | 17 + .../metadata/android/en_GB/changelogs/63.txt | 8 + .../metadata/android/en_GB/changelogs/64.txt | 8 + .../metadata/android/es/changelogs/1005.txt | 17 + .../metadata/android/fr/changelogs/66.txt | 4 +- .../metadata/android/fr/changelogs/68.txt | 2 +- .../metadata/android/fr/changelogs/740.txt | 6 +- .../metadata/android/fr/changelogs/760.txt | 6 +- .../metadata/android/fr/changelogs/800.txt | 6 +- .../metadata/android/fr/changelogs/810.txt | 4 +- .../metadata/android/fr/changelogs/840.txt | 2 +- .../metadata/android/fr/changelogs/958.txt | 8 +- .../metadata/android/fr/changelogs/968.txt | 2 +- .../metadata/android/fr/changelogs/980.txt | 2 +- .../metadata/android/fr/changelogs/983.txt | 2 +- .../metadata/android/fr/changelogs/986.txt | 2 +- .../metadata/android/fr/changelogs/987.txt | 4 +- .../metadata/android/fr/changelogs/990.txt | 4 +- .../metadata/android/fr/changelogs/992.txt | 2 +- .../metadata/android/fr/changelogs/995.txt | 2 +- .../metadata/android/fr/changelogs/997.txt | 4 +- .../metadata/android/id/changelogs/1005.txt | 17 + .../metadata/android/ka/changelogs/1000.txt | 12 + .../metadata/android/ka/changelogs/1001.txt | 5 + .../metadata/android/ka/changelogs/1002.txt | 4 + .../metadata/android/ka/changelogs/1003.txt | 6 + .../metadata/android/ka/changelogs/1004.txt | 4 +- .../metadata/android/ka/changelogs/1005.txt | 15 + .../metadata/android/ka/changelogs/63.txt | 13 +- .../metadata/android/ka/changelogs/65.txt | 23 + .../metadata/android/ka/changelogs/996.txt | 2 + .../metadata/android/ko/changelogs/1000.txt | 13 + .../android/pt-BR/changelogs/1005.txt | 17 + .../metadata/android/pt-BR/changelogs/966.txt | 14 + .../metadata/android/pt-BR/changelogs/967.txt | 1 + .../android/pt-PT/changelogs/1005.txt | 15 + .../metadata/android/pt/changelogs/1005.txt | 15 + .../metadata/android/ru/changelogs/1000.txt | 2 +- .../metadata/android/ru/changelogs/1001.txt | 10 +- .../metadata/android/ru/changelogs/1002.txt | 5 +- .../metadata/android/ru/changelogs/1003.txt | 7 +- .../metadata/android/ru/changelogs/1004.txt | 4 +- .../metadata/android/ru/changelogs/930.txt | 2 +- .../metadata/android/ru/changelogs/999.txt | 13 +- .../metadata/android/sr/changelogs/994.txt | 2 +- .../metadata/android/sv/changelogs/1005.txt | 17 + .../metadata/android/th/changelogs/1000.txt | 13 + .../metadata/android/th/full_description.txt | 1 + .../metadata/android/th/short_description.txt | 1 + .../metadata/android/tr/changelogs/1005.txt | 17 + .../metadata/android/vi/changelogs/1000.txt | 2 +- .../metadata/android/vi/changelogs/1004.txt | 4 +- .../metadata/android/vi/changelogs/1005.txt | 17 + .../metadata/android/vi/changelogs/64.txt | 2 +- .../metadata/android/vi/changelogs/65.txt | 7 +- .../metadata/android/vi/full_description.txt | 2 +- .../android/zh-Hans/changelogs/1002.txt | 5 +- .../android/zh-Hans/changelogs/1003.txt | 7 +- .../android/zh-Hans/changelogs/1004.txt | 4 +- .../android/zh-Hans/changelogs/998.txt | 5 +- .../android/zh-Hans/changelogs/999.txt | 13 +- .../android/zh_Hant_HK/changelogs/1005.txt | 17 + .../android/zh_Hant_HK/changelogs/64.txt | 8 + .../android/zh_Hant_HK/changelogs/65.txt | 26 + .../android/zh_Hant_HK/changelogs/66.txt | 33 + .../android/zh_Hant_HK/changelogs/68.txt | 31 + 202 files changed, 3164 insertions(+), 306 deletions(-) create mode 100644 app/src/main/res/values-lmo/strings.xml create mode 100644 fastlane/metadata/android/bg/changelogs/1000.txt create mode 100644 fastlane/metadata/android/bs/changelogs/1000.txt create mode 100644 fastlane/metadata/android/bs/changelogs/1001.txt create mode 100644 fastlane/metadata/android/bs/changelogs/1002.txt create mode 100644 fastlane/metadata/android/bs/changelogs/1003.txt create mode 100644 fastlane/metadata/android/bs/changelogs/1004.txt create mode 100644 fastlane/metadata/android/bs/changelogs/1005.txt create mode 100644 fastlane/metadata/android/bs/changelogs/64.txt create mode 100644 fastlane/metadata/android/bs/changelogs/65.txt create mode 100644 fastlane/metadata/android/bs/changelogs/66.txt create mode 100644 fastlane/metadata/android/bs/changelogs/68.txt create mode 100644 fastlane/metadata/android/bs/changelogs/69.txt create mode 100644 fastlane/metadata/android/bs/changelogs/70.txt create mode 100644 fastlane/metadata/android/bs/changelogs/71.txt create mode 100644 fastlane/metadata/android/bs/changelogs/730.txt create mode 100644 fastlane/metadata/android/bs/changelogs/740.txt create mode 100644 fastlane/metadata/android/bs/changelogs/750.txt create mode 100644 fastlane/metadata/android/bs/changelogs/760.txt create mode 100644 fastlane/metadata/android/bs/changelogs/770.txt create mode 100644 fastlane/metadata/android/bs/changelogs/780.txt create mode 100644 fastlane/metadata/android/bs/changelogs/790.txt create mode 100644 fastlane/metadata/android/bs/changelogs/800.txt create mode 100644 fastlane/metadata/android/bs/changelogs/810.txt create mode 100644 fastlane/metadata/android/bs/changelogs/820.txt create mode 100644 fastlane/metadata/android/bs/changelogs/830.txt create mode 100644 fastlane/metadata/android/bs/changelogs/840.txt create mode 100644 fastlane/metadata/android/bs/changelogs/850.txt create mode 100644 fastlane/metadata/android/bs/changelogs/860.txt create mode 100644 fastlane/metadata/android/bs/changelogs/870.txt create mode 100644 fastlane/metadata/android/bs/changelogs/900.txt create mode 100644 fastlane/metadata/android/bs/changelogs/910.txt create mode 100644 fastlane/metadata/android/bs/changelogs/920.txt create mode 100644 fastlane/metadata/android/bs/changelogs/930.txt create mode 100644 fastlane/metadata/android/bs/changelogs/940.txt create mode 100644 fastlane/metadata/android/bs/changelogs/950.txt create mode 100644 fastlane/metadata/android/bs/changelogs/951.txt create mode 100644 fastlane/metadata/android/bs/changelogs/952.txt create mode 100644 fastlane/metadata/android/bs/changelogs/953.txt create mode 100644 fastlane/metadata/android/bs/changelogs/954.txt create mode 100644 fastlane/metadata/android/bs/changelogs/955.txt create mode 100644 fastlane/metadata/android/bs/changelogs/956.txt create mode 100644 fastlane/metadata/android/bs/changelogs/957.txt create mode 100644 fastlane/metadata/android/bs/changelogs/958.txt create mode 100644 fastlane/metadata/android/bs/changelogs/959.txt create mode 100644 fastlane/metadata/android/bs/changelogs/960.txt create mode 100644 fastlane/metadata/android/bs/changelogs/961.txt create mode 100644 fastlane/metadata/android/bs/changelogs/962.txt create mode 100644 fastlane/metadata/android/bs/changelogs/963.txt create mode 100644 fastlane/metadata/android/bs/changelogs/964.txt create mode 100644 fastlane/metadata/android/bs/changelogs/965.txt create mode 100644 fastlane/metadata/android/bs/changelogs/966.txt create mode 100644 fastlane/metadata/android/bs/changelogs/967.txt create mode 100644 fastlane/metadata/android/bs/changelogs/968.txt create mode 100644 fastlane/metadata/android/bs/changelogs/969.txt create mode 100644 fastlane/metadata/android/bs/changelogs/970.txt create mode 100644 fastlane/metadata/android/bs/changelogs/971.txt create mode 100644 fastlane/metadata/android/bs/changelogs/972.txt create mode 100644 fastlane/metadata/android/bs/changelogs/973.txt create mode 100644 fastlane/metadata/android/bs/changelogs/974.txt create mode 100644 fastlane/metadata/android/bs/changelogs/975.txt create mode 100644 fastlane/metadata/android/bs/changelogs/976.txt create mode 100644 fastlane/metadata/android/bs/changelogs/977.txt create mode 100644 fastlane/metadata/android/bs/changelogs/978.txt create mode 100644 fastlane/metadata/android/bs/changelogs/979.txt create mode 100644 fastlane/metadata/android/bs/changelogs/980.txt create mode 100644 fastlane/metadata/android/bs/changelogs/981.txt create mode 100644 fastlane/metadata/android/bs/changelogs/982.txt create mode 100644 fastlane/metadata/android/bs/changelogs/983.txt create mode 100644 fastlane/metadata/android/bs/changelogs/984.txt create mode 100644 fastlane/metadata/android/bs/changelogs/985.txt create mode 100644 fastlane/metadata/android/bs/changelogs/986.txt create mode 100644 fastlane/metadata/android/bs/changelogs/987.txt create mode 100644 fastlane/metadata/android/bs/changelogs/988.txt create mode 100644 fastlane/metadata/android/bs/changelogs/989.txt create mode 100644 fastlane/metadata/android/bs/changelogs/990.txt create mode 100644 fastlane/metadata/android/bs/changelogs/991.txt create mode 100644 fastlane/metadata/android/bs/changelogs/992.txt create mode 100644 fastlane/metadata/android/bs/changelogs/993.txt create mode 100644 fastlane/metadata/android/bs/changelogs/994.txt create mode 100644 fastlane/metadata/android/bs/changelogs/995.txt create mode 100644 fastlane/metadata/android/bs/changelogs/996.txt create mode 100644 fastlane/metadata/android/bs/changelogs/997.txt create mode 100644 fastlane/metadata/android/bs/changelogs/998.txt create mode 100644 fastlane/metadata/android/bs/changelogs/999.txt create mode 100644 fastlane/metadata/android/el/changelogs/1004.txt create mode 100644 fastlane/metadata/android/el/changelogs/1005.txt create mode 100644 fastlane/metadata/android/el/changelogs/70.txt create mode 100644 fastlane/metadata/android/el/changelogs/71.txt create mode 100644 fastlane/metadata/android/en_GB/changelogs/1005.txt create mode 100644 fastlane/metadata/android/en_GB/changelogs/63.txt create mode 100644 fastlane/metadata/android/en_GB/changelogs/64.txt create mode 100644 fastlane/metadata/android/es/changelogs/1005.txt create mode 100644 fastlane/metadata/android/id/changelogs/1005.txt create mode 100644 fastlane/metadata/android/ka/changelogs/1000.txt create mode 100644 fastlane/metadata/android/ka/changelogs/1001.txt create mode 100644 fastlane/metadata/android/ka/changelogs/1002.txt create mode 100644 fastlane/metadata/android/ka/changelogs/1003.txt create mode 100644 fastlane/metadata/android/ka/changelogs/1005.txt create mode 100644 fastlane/metadata/android/ka/changelogs/65.txt create mode 100644 fastlane/metadata/android/ka/changelogs/996.txt create mode 100644 fastlane/metadata/android/ko/changelogs/1000.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/1005.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/966.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/967.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/1005.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1005.txt create mode 100644 fastlane/metadata/android/sv/changelogs/1005.txt create mode 100644 fastlane/metadata/android/th/changelogs/1000.txt create mode 100644 fastlane/metadata/android/th/full_description.txt create mode 100644 fastlane/metadata/android/th/short_description.txt create mode 100644 fastlane/metadata/android/tr/changelogs/1005.txt create mode 100644 fastlane/metadata/android/vi/changelogs/1005.txt create mode 100644 fastlane/metadata/android/zh_Hant_HK/changelogs/1005.txt create mode 100644 fastlane/metadata/android/zh_Hant_HK/changelogs/64.txt create mode 100644 fastlane/metadata/android/zh_Hant_HK/changelogs/65.txt create mode 100644 fastlane/metadata/android/zh_Hant_HK/changelogs/66.txt create mode 100644 fastlane/metadata/android/zh_Hant_HK/changelogs/68.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index f5c8efb0d..895314ad5 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -886,4 +886,24 @@ البحث %1$s (%2$s) تمت إزالة صفحة أفضل 50 من SoundCloud أوقفت SoundCloud صفحة أفضل 50 الأصلية. تمت إزالة علامة التبويب المقابلة من صفحتك الرئيسية. + تمت إزالة تريندات YouTube المجمعة + أوقف YouTube صفحة الترند المدمجة اعتبارًا من 21 يوليو 2025. استبدلت NewPipe صفحة الموضوعات المتداولة الافتراضية بصفحة الموضوعات المتداولة الشائعة مع البث المباشر المتداول.\n\nيمكنك أيضًا تحديد صفحات رائجة مختلفة في \"الإعدادات > المحتوى > محتوى الصفحة الرئيسية\". + توجهات الألعاب + توجهات البث الصوتي + الأفلام والعروض الأكثر رواجاً + الموسيقى الرائجة + %s الف + %s مليون + %sمليار + لاستخدام المشغل المنبثق، يرجى تحديد %1$s في قائمة إعدادات اندرويد التالية وتمكين %2$s. + “السماح بالعرض فوق التطبيقات الاخرى” + حذف ملف + حذف المدخلات + تم إنهاء الحساب\n\n%1$s يقدم هذا السبب: %2$s + تم حذف المدخلات + تم تلقي خطأ HTTP 403 من الخادم أثناء التشغيل، ويرجح أن يكون السبب هو انتهاء صلاحية عنوان URL للبث أو حظر عنوان IP + حدث خطأ HTTP %1$s من الخادم أثناء التشغيل + تم تلقي خطأ HTTP 403 من الخادم أثناء التشغيل، ويرجح أن يكون السبب هو حظر عنوان IP أو مشكلات في إزالة التعتيم عن عنوان URL للبث + رفض %1$s تقديم البيانات، وطلب تسجيل الدخول للتأكد من أن الطالب ليس روبوتًا.\n\nربما تم حظر عنوان IP الخاص بك مؤقتًا من قبل %1$s، يمكنك الانتظار بعض الوقت أو التبديل إلى عنوان IP مختلف (على سبيل المثال عن طريق تشغيل/إيقاف تشغيل VPN، أو التبديل من WiFi إلى بيانات الهاتف المحمول). + هذا المحتوى غير متاح للبلد المحدد حاليًا.\n\nقم بتغيير اختيارك من ”الإعدادات > المحتوى > البلد الافتراضي للمحتوى“. diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 0e0135c71..6f14202e1 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -192,10 +192,10 @@ Sil Hələ ki, kanal abunəliyi yoxdur Kanal seç - Kanal Səhifəsi + Kanal səhifəsi Standart Bölmə - Kənar Səhifə - Boş Səhifə + Kənar səhifə + Boş səhifə Əsas səhifədə hansı tablar göstərilir Əsas səhifə məzmunu Yeni versiya mövcud olduqda tətbiq yeniləməsini xatırlatmaq üçün bildiriş göstər @@ -295,7 +295,7 @@ Nə baş verdi: Yükləyənin avatar miniatürü Bəyən - Bəyənmə + Bəyənməmə Yenidən sıralamaq üçün sürüklə Xidməti dəyiş, hazırda seçilmiş: Abunəçi yoxdur @@ -803,4 +803,29 @@ Axın qrupu seçin Hələ heç bir axın qrupu yaradılmayıb Kanal qrupu səhifəsi + %1$s axtar + %1$s (%2$s) axtar + Bəyənmə + SoundCloud Top 50 səhifəsi silindi + SoundCloud ilk Ən yaxşı 50 siyahısın ləğv etdi. Uyğun səhifə əsas səhifənizdən silindi. + %sMin + %sMln + %sMlrd + YouTube birləşmiş trend silindi + YouTube 21 iyul 2025-ci il tarixindən birləşmiş trend səhifəsini ləğv etdi. NewPipe ilkin trend səhifəsini trend olan canlı yayımlarla əvəz etdi. \n\nHəmçinin \"Tənzimləmələr > Məzmun > Əsas səhifə məzmunu\" bölməsində müxtəlif trendli səhifələri seçə bilərsiniz. + Trenddə olan Oyun + Trenddə olan podkastlar + Trend film və tamaşalar + Trenddə olan musiqilər + Ani oynadıcı istifadə etmək üçün lütfən, aşağıdakı Android tənzimləmələr menyusunda %1$s seçin və %2$s-ı aktivləşdirin. + \"Digər tətbiqlər üzərində göstərməyə icazə verin\" + Faylı sil + Girişi silin + Giriş silindi + Hesab ləğv edilib\n\n %1$s bu səbəbi təmin edir: %2$s + Oynadarkən serverdən alınan HTTP xətası 403, çox güman ki, yayım URL-si müddətinin bitməsi və ya IP qadağası ilə bağlıdır + HTTP xətası %1$s oynadarkən serverdən alındı + HTTP xətası 403 oynadarkən serverdən alındı, ehtimal ki, IP qadağası və ya yayım URL-nin deobfuscation problemləri ilə bağlıdır + %1$s sorğuçunun bot olmadığını təsdiqləmək üçün giriş tələb edərək data təmin etməkdən imtina etdi.\n\nIP-niz %1$s tərəfindən müvəqqəti şəkildə qadağan oluna bilər, bir müddət gözləyə və ya başqa IP-yə keçə bilərsiniz (məsələn, VPN-i açıb/qapatmaqla və ya WiFi-dan mobil dataya keçməklə). + Bu məzmun hazırda seçilən məzmun ölkəsi üçün əlçatan deyil. \n\nSeçiminizi \"Tənzimləmələr > Məzmun > İlkin məzmun ölkəsi\"- dən dəyişin. diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 72b08414e..8732e45d9 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -85,7 +85,7 @@ Прайграванне ў фонавым рэжыме Прайграванне ва ўсплывальным акне Кантэнт - Паказваць кантэнт 18+ + Кантэнт з ўзроставым абмежаваннем Ужывую Спампоўкі Спампоўкі @@ -106,8 +106,8 @@ Апавяшчэнне NewPipe Апавяшчэнні для прайгравальніка NewPipe [Невядома] - Перайсці ў фон - Перайсці ў акно + Перайсці ў фонавы рэжым + Перайсці ў аконны рэжым Перайсці ў галоўнае акно Імпартаваць даныя Экспартаваць даныя @@ -427,7 +427,7 @@ Уключыць гук Адключыць гук Дадаць у чаргу - Даданае ў чаргу + Дададзена у чаргу Чарга прайгравання Найбольш папулярнае Лакальнае @@ -576,7 +576,7 @@ Шукайце серверы, якія вам даспадобы, на %s Паказваць метаданыя Ігнараваць падзеі апаратных медыякнопак - Паказваць змесціва, магчыма непрыдатнае для дзяцей, таму што яно мае ўзроставыя абмежаванні (напрыклад, 18+) + Паказваць змесціва, якое можа быць непрыдатным для дзяцей, бо мае ўзроставыя абмежаванні (напрыклад, 18+) Праверце, ці не існуе заяўкі з абмеркаваннем вашай праблемы. Дублікаты марнуюць наш час і праз гэта адцягваецца вырашэнне сапраўдных задач. Адбылася памылка, глядзіце апавяшчэнне Збой плэера @@ -597,8 +597,8 @@ %s новых трансляцый Каментарыі - У чаргу далей - У чарзе наступны + Дадаць у чаргу наступным + Дададзена у чаргу (наступным) Загрузка звестак аб стрыме… Ідзе апрацоўка… Крыху пачакайце Дублікат дададзены %d раз(ы) @@ -692,22 +692,20 @@ Радыё Паказваць наступныя патокі Паказаць/схаваць трансляцыі - Гэты кантэнт яшчэ не падтрымліваецца NewPipe. -\n -\nСпадзяюся, ён будзе падтрымлівацца ў наступных версіях. + Гэты кантэнт яшчэ не падтрымліваецца NewPipe.\n\nСпадзяёмся, што падтрымка з\'явіцца ў наступных версіях. Старонка плэй-ліста Паказваць мініяцюру Выкарыстоўваць мініяцюру як фон для экрана блакіроўкі і апавяшчэнняў Для гэтага дзеяння не знойдзены прыдатны файлавы менеджар. \nУсталюйце файлавы менеджар або паспрабуйце адключыць «%s» у наладах спампоўвання Гэты кантэнт недаступны ў вашай краіне. - Гэта трэк SoundCloud Go+, прынамсі ў вашай краіне, таму NewPipe не можа трансляваць ці спампоўваць яго. - Гэта змесціва з\'яўляецца прыватным, таму NewPipe не можа яго трансляваць або спампоўваць. - Гэта відэа даступна толькі для падпісчыкаў YouTube Music Premium, таму NewPipe не можа яго трансляваць або спампоўваць. + Гэта трэк SoundCloud Go+ (прынамсі ў вашай краіне), таму NewPipe не можа яго прайграць або спампаваць. + Гэты кантэнт прыватны, таму NewPipe не можа яго прайграць або спампаваць. + Гэта відэа даступна толькі для падпісчыкаў YouTube Music Premium, таму NewPipe не можа яго прайграць або спампаваць. Уліковы запіс спынены Вартае ўвагі Унутраная Прагледжаныя цалкам - Гэты кантэнт даступны толькі для аплачаных карыстальнікаў, таму NewPipe не можа яго трансляваць або спампоўваць. + Гэты кантэнт даступны карыстальнікам толькі за плату, таму NewPipe не можа яго прайграць або спампаваць. Даступна для некаторых сэрвісаў, звычайна значна хутчэй, але можа перадаваць абмежаваную колькасць элементаў і не ўсю інфармацыю (можа адсутнічаць працягласць, тып элемента, паказчык трансляцыі) Узроставае абмежаванне Для гэтага дзеяння не знойдзены прыдатны файлавы менеджар. \nУсталюйце файлавы менеджар, сумяшчальны з Storage Access Framework @@ -729,7 +727,7 @@ Аддаваць перавагу арыгінальнаму гуку Аддаваць перавагу апісальнаму гуку Выбіраць гукавую дарожку з апісаннем для людзей са слабым зрокам, калі яна ёсць - Аўдыя: %s + Аўдыядарожка: %s Гукавая дарожка Выберыце гукавую дарожку для знешніх прайгравальнікаў Невядомая @@ -819,4 +817,18 @@ Пошук %1$s Пошук %1$s (%2$s) Спадабалася + «Дазволіць паказ па-над астатнімі праграмамі» + %s тыс. + %s млн + %s млрд + Выдаліць файл + Выдаліць запіс + Старонка SoundCloud Top 50 выдалена + Трэнды – музыка + Запіс выдалены + Трэнды – гульні + Трэнды – падкасты + Трэнды – фільмы і перадачы + Гэты кантэнт недаступны для цяперашняй краіны кантэнту.\n\nЯе можна змяніць праз «Налады > Кантэнт > Прадвызначаная краіна кантэнту». + 21 ліпеня 2025 года YouTube спыніў падтрымку аб\'яднанай старонкі трэндаў. NewPipe замяніў старонку трэндаў на трэнды трансляцый.\n\nТаксама можна выбраць іншыя старонкі трэндаў праз «Налады > Кантэнт > Змесціва галоўнай старонкі». diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 870b6be79..69f8a8e9b 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -163,8 +163,8 @@ Само веднъж Файл Мини във фонов режим - Мини към нов прозорец - Мини в основен режим + Мини в нов прозорец + Мини към основен режим Внасяне на база данни Изнасяне на база данни Замества текущата ви история, абонаменти, списъци за възпроизвеждане и (по избор) настройки @@ -258,7 +258,7 @@ Нов Плейлист Преименувай Име - Добави Към Плейлист + Добави към плейлист Задай като миниатюра на плейлиста Миниатюрата на плейлиста е сменена Премахни отметката @@ -277,7 +277,7 @@ Докладвай за извънредни грешки Внасяне Внасяне от - Изнеси в + Изнасяне във Внасяне… Изнасяне… Файл с данни за внасяне @@ -660,7 +660,7 @@ Въведете URL адреса на инстанцията Аудио: %s Покажи информация за канала - Автоматично генерирани (не е намерен ъплоудер) + Авто-генерирани (не е намерен ъплоудер) Създай известие за грешка NewPipe може автоматично да проверява за нови версии от време на време и да ви известява при наличие. \nИскате ли да го включите? @@ -815,4 +815,24 @@ Харесвания Страница SoundCloud Top 50 е премахната SoundCloud преустанови оригиналните класации Топ 50. Съответният раздел е премахнат от главната ви страница. + YouTube преустанови комбинираната страница с популярни от 21 юли 2025 г. NewPipe замени стандартната страница с популярни с популярни предавания на живо.\n\nМожете също да изберете различни популярни страници в „Настройки > Съдържание > Съдържание на главната страница“. + YouTube комбинирани популярни са премахнати + Популярни игри + Популярни подкасти + Популярни филми и сериали + Популярна музика + %s хил. + %s млн. + %s млрд. + За да използвате изскачащия плейър, моля, изберете %1$s в следното меню с настройки на Android и активирайте %2$s. + “Разреши показване върху други приложения” + Изтриване на файл + Изтриване на запис + Записът е изтрит + Профилът е прекратен\n\n%1$s предоставя тази причина: %2$s + HTTP грешка 403, получена от сървъра по време на възпроизвеждане, вероятно причинена от изтичане на URL адреса за стрийминг или забрана на IP адреса + HTTP грешка %1$s получена от сървъра по време на възпроизвеждане + HTTP грешка 403, получена от сървъра по време на възпроизвеждане, вероятно причинена от забрана на IP адреса или проблеми с деобфускацията на URL адреси за стрийминг + %1$s отказа да предостави данни, като поиска вход, за да потвърди, че заявителят не е бот.\n\nВашият IP адрес може да е временно забранен от %1$s. Можете да изчакате известно време или да превключите към друг IP адрес (например като включите/изключите VPN или като превключите от WiFi към мобилни данни). + Това съдържание не е налично за текущо избраната държава на съдържанието.\n\nПроменете избора си от \"Настройки > Съдържание > Държава на съдържанието по подразбиране\". diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 4921a6aa8..ff0b7003a 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -28,7 +28,7 @@ Otkazana pratnja kanala Nije moguće promijeniti pratnju Nije moguće ažurirati pratnju - Instalirajte nedostajeću Kode aplikaciju\? + Instalirati nedostajuću Kore aplikaciju? Obilježeni Popisi Iskačni prozor Izaberite Podprozor @@ -43,9 +43,9 @@ Zadani režim za iskačući prozor Prekinite pokretač Prikažite postavku da biste video preko KODI medijskog centra video pokrenuli - Skalirajte sličicu na 1:1 omjer + Izrežite sličicu na omjer slike 1:1 Prvo radno dugme - Skalirajte video sličicu prikazanu u obavijesti sa 16:9 na 1:1 omjer (može uvesti poremećaje) + Izrežite sličicu videa prikazanu u obavještenju sa omjera stranica 16:9 na 1:1 Drugo radno dugme Treće radno dugme Četvrto radno dugme @@ -53,7 +53,7 @@ Možete najviše tri radnje odabrati za prikaz u kompaktnom obavještaju! Ponovi Pomiješajte - Uredite svaku radnju obavještenja ispod pri dodiru na nju. Odaberite bar tri od njih za prikaz u kompaktnom obavještenju koristeći potvrdne okvire s desne strane + Uredite svaku radnju obavještenja ispod dodirom na nju. Odaberite do tri od njih koje će biti prikazane u kompaktnom obavještenju pomoću potvrdnih okvira s desne strane. Ništa Obojite obavještenje Učitavanje @@ -62,7 +62,7 @@ Zvuk Zadani video format Tema - Noćna Tema + Noćna tema Svijetla Tamna Zapamtite podešavanja za iskočne prozore @@ -114,4 +114,709 @@ Pokrenite s KODI-jem Vrijeme premotavanja naprijed/nazad Aktivni pokretni red će biti zamijenjen - \ No newline at end of file + Da + Ne + Pretraži %1$s + Pretraži %1$s (%2$s) + Plejliste + Uredite svaku radnju obavještenja ispod dodirom na nju. Prve tri radnje (reprodukcija/pauza, prethodno i sljedeće) postavlja sistem i ne mogu se prilagođavati. + Veličina intervala učitavanja reprodukcije + Promijenite veličinu intervala učitavanja progresivnog sadržaja (trenutno %s). Niža vrijednost može ubrzati njihovo početno učitavanje + Zanemari događaje hardverskih medijskih tipki + Korisno, na primjer, ako koristite slušalice s pokvarenim fizičkim tipkama + Preferiraj originalni audio + Odaberite originalni audio zapis bez obzira na jezik + Preferiraj opisni audio + Odaberite audio zapis s opisima za osobe s oštećenim vidom ako su dostupni + Odaberite gestu za lijevu polovinu ekrana igrača + Radnja lijevog pokreta + Odaberite gestu za desnu polovinu ekrana igrača + Radnja desnog gesta + Svjetlina + Volumen + Nema + Prikaži savjet \"Drži za dodavanje u red\" + Prikaži savjet prilikom pritiska na pozadinu ili iskačuće dugme u videu \"Detalji:\" + Nepodržani URL + URL nije prepoznat. Otvoriti s drugom aplikacijom? + Zadana zemlja sadržaja + Zadani jezik sadržaja + PeerTube instance + Odaberite svoje omiljene PeerTube instance + Pronađite instance koje vam se sviđaju na %s + Dodaj instancu + Unesite URL instance + Nije moguće validirati instancu + Podržani su samo HTTPS URL-ovi + Instanca već postoji + Pokretač + Ponašanje + Video i audio + Historija i keš memorija + Izgled + Debug + Nadogradnje + Obavještenje za igrača + Konfigurišite obavještenja o trenutno reprodukovanom toku + Sigurnosna kopija i vraćanje + Reprodukcija u pozadini + Reprodukcija u skočnom modu + Sadržaj + Prikaži sadržaj s ograničenjem za uzrast + Prikaži sadržaj koji je možda neprikladan za djecu jer ima starosno ograničenje (npr. 18+) + Uključite \"Ograničeni način rada\" na YouTubeu + YouTube nudi \"Ograničeni način rada\" koji skriva potencijalno sadržaj za odrasle + Ovaj video ima dobno ograničenje.\n\nUključite \"%1$s\" u postavkama ako ga želite pogledati. + Ovaj video ima dobno ograničenje. \nZbog novih YouTube pravila o videozapisima s dobnim ograničenjem, NewPipe ne može pristupiti nijednom od svojih video tokova i stoga ga ne može reproducirati. + Uživo + Preuzimanja + Preuzimanja + Učitavanje metapodataka… + Izvještaj o grešci + Sve + Kanali + Plejliste + Videozapisi + Snimke + Korisnici + Događanja + Pjesme + Albuma + Umjetnici + Onemogućeno + Rasčisti + Najbolja rezolucija + Poništi + Datoteka je izbrisana + Reproduciraj sve + Uvijek + Samo jednom + Datoteka + Obavijesti + Obavještenje o novoj cijevi + Obavještenja za NewPipeovog igrača + Obavještenje o ažuriranju aplikacije + Obavještenja za nove verzije NewPipe-a + Obavještenje o hešu videa + Obavještenja o napretku heširanja videa + Novi tokovi + Obavještenja o novim tokovima za pretplatnike + Obavještenje o grešci + Obavještenja za prijavu grešaka + [Nepoznato] + Prebaci na pozadinu + Prebaci na skočni prozor + Prebaci na glavni + Uvoz baze podataka + Izvoz baze podataka + Obriši reCAPTCHA kolačiće + reCAPTCHA kolačići su obrisani + Zaobilazi vašu trenutnu historiju, pretplate, liste pjesama i (opcionalno) postavke + Izvoz historije, pretplata, plejlista i postavki + Obrišite kolačiće koje NewPipe pohranjuje kada riješite reCAPTCHA + Obriši historiju gledanja + Briše historiju reprodukovanih tokova i pozicije reprodukcije + Izbrisati cijelu historiju gledanja? + Historija gledanja je izbrisana + Brisanje pozicija reprodukcije + Briše sve pozicije reprodukcije + Izbrisati sve pozicije reprodukcije? + Pozicije reprodukcije su izbrisane + Obriši historiju pretraživanja + Briše historiju ključnih riječi pretrage + Izbrisati cijelu historiju pretraživanja? + Historija pretrage je izbrisana + Brzi način rada + Pomakni glavni birač kartica na dno + Položaj glavnih kartica + Greška + Vanjska pohrana nije dostupna + Preuzimanje na eksternu SD karticu nije moguće. Poništiti lokaciju mape za preuzimanje? + Greška mreže + Nije moguće učitati sve sličice + Nije moguće analizirati web stranicu + Sadržaj nije dostupan + Nije moguće postaviti meni za preuzimanje + Aplikacija/korisnički interfejs se srušio/la + Nije moguće reproducirati ovaj tok + Došlo je do nepopravljive greške igrača + Oporavak od greške igrača + Vanjski playeri ne podržavaju ove vrste linkova + Nisu pronađeni video tokovi + Nisu pronađeni audio tokovi + Datoteka je premještena ili izbrisana + Fascikla sa popisima + Nema takve datoteke/izvora sadržaja + Datoteka ne postoji ili nedostaje dozvola za čitanje ili pisanje u nju + Naziv datoteke ne može biti prazan + Došlo je do greške: %1$s + Nema dostupnih tokova za preuzimanje + Nije moguće pročitati sačuvane kartice, pa se koriste zadane + Vrati zadane postavke + Želite li vratiti zadane postavke? + Dozvoli prikaz preko drugih aplikacija + Da biste koristili Popup Player, odaberite %1$s u sljedećem meniju postavki Androida i omogućite %2$s. + \"Dozvoli prikaz preko drugih aplikacija\" + NewPipe je naišao na grešku, dodirnite za prijavu + Došlo je do greške, pogledajte obavještenje + Žao mi je, to se nije trebalo desiti. + Prijavi putem e-pošte + Kopiraj formatirani izvještaj + Izvještaj na GitHubu + Molimo Vas da provjerite da li već postoji problem koji se odnosi na Vaš pad sistema. Prilikom kreiranja duplikata tiketa, oduzimate nam vrijeme koje bismo mogli posvetiti ispravljanju samog problema. + Izvinite, ali nešto je pošlo po zlu. + Prijavi + Info: + Šta se dogodilo: + Šta:\\nZahtjev:\\nJezik sadržaja:\\nZemlja sadržaja:\\nJezik aplikacije:\\nUsluga:\\nVremenska oznaka:\\nPaket:\\nVerzija:\\nVerzija OS-a: + Vaš komentar (na engleskom): + Detalji: + Reproduciraj video, trajanje: + Sličica avatara osobe koja je postavila sliku + Sviđanja + Nesviđa mi se + Komentari + Povezane stavke + Opis + Bez rezultata + Ovdje nema ničega osim cvrčaka + Uvoz ili izvoz pretplata iz menija s tri tačke + Prevucite da promijenite redoslijed + Video + Audio + Pokušaj ponovo + %sK + %sM + %sB + Uključi/isključi uslugu, trenutno odabrana: + Nema pretplatnika + Broj pretplatnika nije dostupan + Nema pregleda + Niko ne gleda + Niko ne sluša + Nema videozapisa + 100+ videa + ∞ videozapisi + Nema komentara + Komentari su onemogućeni + Nema tokova + Nema prijenosa uživo + Početak + Pauziraj + Napravi + Izbriši + Izbriši datoteku + Izbriši unos + Kontrolni zbir + Raspusti + Preimenuj + Naziv datoteke + Teme + Greška + Preuzimanje NewPipe-a + Dodirnite za detalje + Izračunavanje heša + Molimo pričekajte… + Kopirano u međuspremnik + Kopiranje u međuspremnik nije uspjelo + Molimo vas da kasnije u postavkama definišete folder za preuzimanje + Još nije postavljen folder za preuzimanje, odaberite zadani folder za preuzimanje sada + Ova dozvola je potrebna za \notvaranje u skočnom prozoru + 1 stavka je izbrisana. + reCAPTCHA izazov + Pritisnite \"Gotovo\" kada riješite problem + Zatražen je reCAPTCHA izazov + Riješi + Gotovo + Preuzimanje + Dozvoljeni znakovi u nazivima datoteka + Nevažeći znakovi se zamjenjuju ovom vrijednošću + Zamjenski lik + Slova i brojevi + Većina specijalnih znakova + O NewPipe-u + Licence trećih strana + © %1$s od %2$s pod %3$s + Dozvole + Besplatno lagano tokanje na Androidu. + Doprinesite + Bez obzira da li imate ideje za: prevod, promjene dizajna, čišćenje koda ili zaista velike promjene koda - pomoć je uvijek dobrodošla. Što se više uradi, to bolje postaje! + Pogledajte na GitHubu + Donirajte + NewPipe je razvijen od strane volontera koji svoje slobodno vrijeme provode pružajući vam najbolje korisničko iskustvo. Doprinesite programerima kako biste ih učinili još boljim dok uživaju u šoljici kafe. + Vratite + Web stranica + Posjetite web stranicu NewPipe za više informacija i novosti. + Politika privatnosti kompanije NewPipe + Projekat NewPipe veoma ozbiljno shvata vašu privatnost. Stoga aplikacija ne prikuplja nikakve podatke bez vašeg pristanka.\nPolitika privatnosti NewPipe-a detaljno objašnjava koji se podaci šalju i pohranjuju kada pošaljete izvještaj o padu sistema. + Pročitajte politiku privatnosti + NewPipe-ova licenca + NewPipe je copyleft libre softver: Možete ga koristiti, proučavati, dijeliti i poboljšavati po volji. Konkretno, možete ga redistribuirati i/ili mijenjati pod uvjetima GNU Opće javne licence koju je objavila Fondacija za slobodni softver, bilo verzije 3 Licence ili (po vašem izboru) bilo koje kasnije verzije. + Pročitaj licencu + Često postavljana pitanja + Ako imate problema s korištenjem aplikacije, obavezno pogledajte ove odgovore na česta pitanja! + Pogledajte na web stranici + Historija + Historija + Želite li izbrisati ovu stavku iz historije pretrage? + Posljednje igrano + Najigranije + Sadržaj glavne stranice + Koje kartice se prikazuju na glavnoj stranici + Prevucite stavke da biste ih uklonili + Prazna stranica + Stranica kioska + Zadani kiosk + Stranica kanala + Odaberite kanal + Još nema pretplata na kanale + Odaberite listu za reprodukciju + Još nema oznaka za plejlistu + Odaberite kiosk + Izvezeno + Uvezeno + Nema važeće ZIP datoteke + Upozorenje: Nije moguće uvesti sve datoteke. + Ovo će poništiti vašu trenutnu postavku. + Želite li uvesti i postavke? + Nije moguće učitati komentare + Odaberite grupu feedova + Još nije kreirana nijedna grupa feedova + U trendu + Top 50 + Novo i popularno + Lokalno + Nedavno dodano + Najpopularnije + Konferencije + Red za reprodukciju + Ukloni + Detalji + Postavke zvuka + Audio: %s + Zvučni zapis + Držite za dodavanje u red + Prikaži detalje kanala + Stavi u red + Stavljeno u red čekanja + Stavi sljedeće u red + Sljedeće u redu čekanja + Počni reprodukciju u pozadini + Počnite igrati u iskačućem prozoru + Učitavanje detalja toka… + Otvori ladicu + Zatvori ladicu + Preferirana akcija \'otvaranja\' + Zadana radnja pri otvaranju sadržaja — %s + Video plejer + Pozadinski plejer + Iskačući plejer + Uvijek pitajte + Dobijanje informacija… + Učitavanje traženog sadržaja + Nova plejlista + Liste za reprodukciju koje su sive već sadrže ovu stavku. + Preimenuj + Ime + Dodaj na listu pjesama + Obrada… Može potrajati trenutak + Isključi zvuk + Uključi zvuk + Postavi kao sličicu za reprodukciju + Poništi trajnu sličicu + Označi plejlistu + Ukloni oznaku + Izbrisati ovaj popis? + Plejlista je kreirana + Plejlista + Duplikat dodan %d puta + Sličica plejliste je promijenjena. + Automatski generirano (nije pronađen korisnik koji je otpremio) + Nema titlova + Prilagođeno + Popuni + Uvećanje + Automatski generirano + Titlovi + Izmijenite veličinu teksta titlova i stilove pozadine za player. Za primjenu je potrebno ponovno pokretanje aplikacije + LeakCanary nije dostupan + Praćenje curenja memorije može uzrokovati da aplikacija prestane reagirati prilikom ispisa heap memorije + Prikaži curenje memorije + Prijavi greške izvan životnog ciklusa + Prisilno prijavljivanje izuzetaka neisporučenih Rx zahtjeva izvan životnog ciklusa fragmenta ili aktivnosti nakon odlaganja + Prikaži originalno vrijeme prije stavki + Originalni tekstovi iz usluga bit će vidljivi u stavkama toka + Onemogući tuneliranje medija + Onemogućite tuneliranje medija ako se pojavi crni ekran ili se prilikom reprodukcije videa pojavi prekid. + Tuneliranje medija je onemogućeno prema zadanim postavkama na vašem uređaju jer je poznato da vaš model uređaja to ne podržava. + Prikaži indikatore slike + Prikažite Picasso obojene trake preko slika koje označavaju njihov izvor: crvena za mrežu, plava za disk i zelena za memoriju + Prikaži \"Sruši plejer\" + Prikazuje opciju pada sistema prilikom korištenja plejera + Pokreni provjeru za nove tokove + Sruši aplikaciju + Prikaži traku s upozorenjem o grešci + Kreiraj obavještenje o grešci + Uvoz + Uvoz iz + Izvoz u + Uvoz… + Izvoz… + Uvoz datoteke + Prethodni izvoz + Nije moguće uvesti pretplate + Nije moguće izvesti pretplate + Uvoz YouTube pretplata iz Google arhive:\n\n1. Idite na ovaj URL: %1$s\n2. Prijavite se kada se to od vas zatraži\n3. Kliknite na \"Svi podaci uključeni\", zatim na \"Poništi odabir svih\", a zatim odaberite samo \"pretplate\" i kliknite na \"U redu\"\n4. Kliknite na \"Sljedeći korak\", a zatim na \"Kreiraj izvoz\"\n5. Kliknite na dugme \"Preuzmi\" nakon što se pojavi\n6. Kliknite na UVOZ DATOTEKE ispod i odaberite preuzetu .zip datoteku\n7. [Ako uvoz .zip datoteke ne uspije] Izvucite .csv datoteku (obično pod \"YouTube i YouTube Music/pretplate/pretplate.csv\"), kliknite na UVOZ DATOTEKE ispod i odaberite izvučenu csv datoteku + Uvezite SoundCloud profil unosom URL-a ili vašeg ID-a:\n\n1. Omogućite \"desktop mode\" u web pregledniku (stranica nije dostupna za mobilne uređaje)\n2. Idite na ovaj URL: %1$s\n3. Prijavite se kada se to od vas zatraži\n4. Kopirajte URL profila na koji ste preusmjereni. + tvoj ID, soundcloud.com/tvojID + Imajte na umu da ova operacija može biti skupa za mrežu.\n\nŽelite li nastaviti? + Kontrole brzine reprodukcije + Brzina + Točka glasa + Otkačite (može uzrokovati distorziju) + Premotavanje unaprijed tokom tišine + Korak + Resetuj + Postotak + Poluton + Kako bismo se pridržavali Opće uredbe o zaštiti podataka (GDPR), ovim putem skrećemo vašu pažnju na politiku privatnosti kompanije NewPipe. Molimo vas da je pažljivo pročitate.\nMorate je prihvatiti da biste nam poslali izvještaj o grešci. + Prihvati + Odbij + Bez ograničenja + Ograničenje rezolucije prilikom korištenja mobilnih podataka + Obavještenja o novim tokovima + Obavijesti me o novim tokovima s pretplata + Učestalost provjere + Potrebna mrežna veza + Bilo koja mreža + Nadogradnje + Prikaži obavještenje za podsticanje ažuriranja aplikacije kada je dostupna nova verzija + Provjeri ažuriranja + NewPipe može automatski provjeravati nove verzije s vremena na vrijeme i obavijestiti vas kada budu dostupne.\nŽelite li ovo omogućiti? + Ručno provjerite nove verzije + Minimiziraj pri prebacivanju aplikacija + Radnja prilikom prelaska na drugu aplikaciju iz glavnog video plejera — %s + Nema + Minimiziraj na pozadinski plejer + Minimiziraj da bi se player pojavio u skočnom prozoru + Automatski pokreni reprodukciju — %s + Samo na Wi-Fi mreži + Nikad + Način prikaza liste + Spisak + Rešetka + Kartica + Automatski + Pregled sličice trake za pretraživanje + Visok kvalitet (veći) + Nizak kvalitet (manji) + Ne prikazuj + Koristite najnoviju verziju NewPipe-a + Ažuriranje NewPipe-a je dostupno! + Dodirnite za preuzimanje %s + Završeno + Na čekanju + pauzirano + u redu čekanja + naknadna obrada + oporavlja se + Stavi u red + Sistem je odbio akciju + Provjera ažuriranja… + Preuzimanje nije uspjelo + Resetiraj postavke + Resetujte sve postavke na njihove zadane vrijednosti + Resetovanjem svih postavki poništit ćete sve svoje željene postavke i ponovo pokrenuti aplikaciju.\n\nJeste li sigurni da želite nastaviti? + Generiraj jedinstveno ime + Prebriši + Datoteka s ovim imenom već postoji + Preuzeta datoteka s ovim nazivom već postoji + ne može prepisati datoteku + U toku je preuzimanje s ovim imenom + Postoji preuzimanje s ovim nazivom na čekanju + Prikaži grešku + Datoteka ne može biti kreirana + Nije moguće kreirati odredišnu mapu + Nije moguće uspostaviti sigurnu vezu + Nije moguće pronaći server + Ne mogu se povezati sa serverom + Server ne šalje podatke + Server ne prihvata višenitna preuzimanja, pokušajte ponovo sa @string/msg_threads = 1 + Nije pronađeno + Naknadna obrada nije uspjela + NewPipe je zatvoren tokom rada na datoteci + Nema dovoljno slobodnog prostora na uređaju + Nema više prostora na uređaju + Napredak je izgubljen jer je datoteka izbrisana + Vremensko ograničenje veze + Nije moguće oporaviti ovo preuzimanje + Obriši historiju preuzimanja + Želite li obrisati historiju preuzimanja ili izbrisati sve preuzete datoteke? + Izbriši preuzete datoteke + Izbrisati sve preuzete datoteke s diska? + Zaustavi + Maksimalan broj ponovnih pokušaja + Maksimalan broj pokušaja prije otkazivanja preuzimanja + Prekid na mrežama s ograničenim pristupom + Korisno prilikom prelaska na mobilne podatke, iako se neka preuzimanja ne mogu obustaviti + Zatvori + Ograniči red čekanja za preuzimanje + Jedno preuzimanje će se pokrenuti istovremeno + Započni preuzimanja + Pauziraj preuzimanja + Pitaj gdje preuzeti + Bit ćete upitani gdje želite sačuvati svako preuzimanje.\nOmogućite birač sistemskih foldera (SAF) ako želite preuzeti na eksternu SD karticu + Bit ćete upitani gdje sačuvati svako preuzimanje + Koristi birač sistemskih foldera (SAF) + \'Okvir za pristup pohrani\' omogućava preuzimanje na eksternu SD karticu + Počevši od Androida 10, podržan je samo \'Storage Access Framework\' + Odaberite instancu + Jezik aplikacije + Zadano sistemsko + Ukloni gledano + Ukloniti gledane videozapise? + Ukloni duplikate + Ukloniti duplikate? + Želite li ukloniti sve duplikatne tokove na ovoj listi za reprodukciju? + Videozapisi koji su pregledani prije i poslije dodavanja na listu za reprodukciju bit će uklonjeni.\nJeste li sigurni? Ovo se ne može poništiti! + Da, i djelimično odgledani videozapisi + Zbog ograničenja ExoPlayera, trajanje pretraživanja je postavljeno na %d sekundi + Šta je novo + Stranica grupe kanala + Grupe kanala + Sažetak zadnji put ažuriran: %s + Nije učitano: %d + Učitavanje feeda… + Obrada feeda… + Nove stavke feeda + Odaberite pretplate + Nije odabrana pretplata + Prazan naziv grupe + Želite li izbrisati ovu grupu? + Novo + Prikaži samo negrupirane pretplate + Sažetak + Prag ažuriranja feeda + Vrijeme nakon posljednjeg ažuriranja prije nego što se pretplata smatra zastarjelom — %s + Uvijek ažuriraj + Greška pri učitavanju feeda + Nije moguće učitati feed za \'%s\'. + Autorov račun je ukinut. \nNewPipe ubuduće neće moći učitavati ovaj sažetak. \nŽeliš li ukinuti pretplatu za ovaj kanal? + Režim brzog hranjenja ne pruža više informacija o ovome. + Preuzmi iz namjenskog feeda kada je dostupan + Dostupno u nekim servisima, obično je mnogo brže, ali može vratiti ograničen broj artikala i često nepotpune informacije (npr. bez trajanja, vrste artikla, bez aktivnog statusa) + Omogući brzi način rada + Onemogući brzi način rada + Mislite li da je učitavanje feeda previše sporo? Ako je tako, pokušajte omogućiti brzo učitavanje (možete ga promijeniti u postavkama ili pritiskom na dugme ispod).\n\nNewPipe nudi dvije strategije učitavanja feeda:\n• Preuzimanje cijelog pretplatničkog kanala, što je sporo, ali potpuno.\n• Korištenje namjenske krajnje tačke usluge, što je brzo, ali obično nije potpuno.\n\nRazlika između ove dvije je u tome što brza obično nema neke informacije, poput trajanja ili vrste stavke (ne može razlikovati videozapise uživo od normalnih) i može vratiti manje stavki.\n\nYouTube je primjer usluge koja nudi ovu brzu metodu sa svojim RSS feedom.\n\nDakle, izbor se svodi na to šta preferirate: brzinu ili precizne informacije. + Prikaži sljedeće tokove + Prikaži/Sakrij tokove + Dohvati kartice kanala + Kartice koje treba preuzeti prilikom ažuriranja feeda. Ova opcija nema efekta ako se kanal ažurira pomoću brzog načina rada. + Ovaj sadržaj još uvijek nije podržan od strane NewPipe-a.\n\nNadamo se da će biti podržan u budućoj verziji. + Sličica avatara kanala + Kreirao/la %s + Napisao %s + Stranica s popisom za reprodukciju + Prikaži sličicu + Koristite sličicu i za pozadinu zaključanog ekrana i za obavještenja + Nedavno + Poglavlja + Nijedna aplikacija na vašem uređaju ne može ovo otvoriti + Nije pronađen odgovarajući upravitelj datoteka za ovu radnju.\nMolimo instalirajte upravitelj datoteka ili pokušajte onemogućiti \'%s\' u postavkama preuzimanja + Nije pronađen odgovarajući upravitelj datoteka za ovu radnju.\nMolimo instalirajte upravitelj datoteka kompatibilan sa Storage Access Frameworkom + Ovaj sadržaj nije dostupan u vašoj zemlji. + Ovo je pjesma na SoundCloud Go+ platformi, barem u vašoj zemlji, tako da je NewPipe ne može strimovati ili preuzeti. + Ovaj sadržaj je privatan, tako da ga NewPipe ne može strimovati ili preuzimati. + Ovaj video je dostupan samo članovima YouTube Music Premium-a, tako da ga NewPipe ne može strimovati ili preuzeti. + Račun ukinut + Račun ukinut\n\n%1$s navodi ovaj razlog: %2$s + Ovaj sadržaj je dostupan samo korisnicima koji su platili, tako da ga NewPipe ne može strimovati ili preuzimati. + Istaknuto + Radio + Automatski (tema uređaja) + Odaberite svoju omiljenu noćnu temu — %s + Možete odabrati svoju omiljenu noćnu temu ispod + Ova opcija je dostupna samo ako je za temu odabrana %s + Preuzimanje je počelo + Sada možete odabrati tekst unutar opisa. Imajte na umu da stranica može treperiti i da linkovi možda neće biti dostupni za klikanje dok ste u načinu odabira. + Omogući odabir teksta u opisu + Onemogući odabir teksta u opisu + Kategorija + Oznake + Dozvola + Privatnost + Starosna granica + Jezik + Podrška + Domaćin + Sličice + Avatari koji su postavili profil + Avatari podkanala + Avatari + Baneri + Javno + Nije navedeno + Privatno + Unutrašnje + Pretplatnici + Zakačen komentar + Srce od strane kreatora + Otvori web stranicu + Tabletni način rada + Upaljeno + Ugašeno + Zadano za ExoPlayer + Obavještenja su onemogućena + Primajte obavještenja + Sada ste pretplaćeni na ovaj kanal + , + Prikaži/Uključi sve + Strimovi koje program za preuzimanje još ne podržava nisu prikazani + Zvučni zapis bi već trebao biti prisutan u ovom toku + Odabrani tok nije podržan od strane eksternih plejera + Nema dostupnih audio tokova za vanjske uređaje za reprodukciju + Nema video tokova dostupnih za vanjske uređaje za reprodukciju + Odaberite kvalitet za vanjske uređaje za reprodukciju + Odaberite audio zapis za vanjske uređaje za reprodukciju + Nepoznati format + Nepoznat kvalitet + Nepoznato + Potpuno odgledano + Djelomično gledano + Nadolazeći + Sortiraj + Postavke ExoPlayera + Upravljajte nekim postavkama ExoPlayera. Ove promjene zahtijevaju ponovno pokretanje plejera da bi stupile na snagu + Koristite ExoPlayer-ovu rezervnu funkciju dekodera + Omogućite ovu opciju ako imate problema s inicijalizacijom dekodera, koja se vraća na dekodere nižeg prioriteta ako inicijalizacija primarnih dekodera ne uspije. Ovo može rezultirati lošijim performansama reprodukcije nego kada se koriste primarni dekoderi + Uvijek koristite ExoPlayer-ovo rješenje za podešavanje površine video izlaza + Ovo zaobilazno rješenje oslobađa i ponovo instancira video kodeke kada dođe do promjene površine, umjesto direktnog postavljanja površine na kodek. Već korištena od strane ExoPlayera na nekim uređajima s ovim problemom, ova postavka ima učinak samo na Androidu 6 i novijim verzijama.\n\nOmogućavanje ove opcije može spriječiti greške u reprodukciji prilikom prebacivanja trenutnog video playera ili prelaska na cijeli ekran + %1$s %2$s + original + sinhronizovano + opisni + sekundarni + Videozapisi + Snimke + Kratke hlače + Uživo + Kanali + Plejliste + Albuma + Sviđanja + O tome + Kartice kanala + Koje kartice se prikazuju na stranicama kanala + Otvori red za reprodukciju + Prikaz preko cijelog ekrana + Uključi/isključi orijentaciju ekrana + Prethodni tok + Sljedeći tok + Pokrenuti + Ponovna reprodukcija + Više opcija + Trajanje + Premotavanje unazad + Naprijed + Kvalitet slike + Odaberite kvalitet slika i da li će se slike uopće učitavati kako biste smanjili potrošnju podataka i memorije. Promjene brišu keš memoriju slika i u memoriji i na disku — %s + Ne učitavaj slike + Niska kvaliteta + Srednji kvalitet + Visoka kvaliteta + \? + Dijeli plejlistu + Podijeli s naslovima + Podijeli listu URL-ova + Podijeli kao privremenu YouTube plejlistu + - %1$s: %2$s + %1$s\n%2$s + Prikaži više + Prikaži manje + Postavke u izvozu koji se uvozi koriste ranjivi format koji je zastario od verzije NewPipe 0.27.0. Provjerite da izvoz koji se uvozi dolazi iz pouzdanog izvora i u budućnosti preferirajte korištenje samo izvoza dobivenih iz NewPipe 0.27.0 ili novije verzije. Podrška za uvoz postavki u ovom ranjivom formatu uskoro će biti potpuno uklonjena, a zatim stare verzije NewPipe-a više neće moći uvoziti postavke izvoza iz novih verzija. + Stranica SoundCloud Top 50 uklonjena + SoundCloud je ukinuo originalne Top 50 liste. Odgovarajuća kartica je uklonjena sa vaše glavne stranice. + Uklonjen je kombinovani prikaz trendova na YouTubeu + Trendovi u igrama + Trendovi podcasti + Popularni filmovi i serije + Popularna muzika + Unos izbrisan + HTTP greška 403 primljena od servera tokom reprodukcije, vjerovatno uzrokovana istekom URL-a za tokove ili zabranom IP adrese + HTTP greška %1$s primljena od servera tokom reprodukcije + HTTP greška 403 primljena od servera tokom reprodukcije, vjerovatno uzrokovana zabranom IP adrese ili problemima s deobfuskacijom URL-a za tokove + %1$s je odbio dati podatke, tražeći prijavu kako bi potvrdio da podnosilac zahtjeva nije bot.\n\nVašu IP adresu je možda privremeno zabranio %1$s, možete pričekati neko vrijeme ili preći na drugu IP adresu (na primjer uključivanjem/isključivanjem VPN-a ili prelaskom s WiFi-ja na mobilne podatke). + + %s pretplatnik + %s pretplatnika + %s pretplatnika + + + %s pregled + %s pregleda + %s pregleda + + + %s gledatelj + %s gledatelja + %s gledatelja + + + %s slušatelj + %s slušatelja + %s slušatelja + + + %s video + %s videozapisa + %s videozapisa + + + %s novi tok + %s nova toka + %s novih tokova + + O aplikaciji i pitanja + + %s preuzimanje je gotovo + %s preuzimanja su gotova + %s preuzimanja je gotovo + + + Izbrisano %1$s preuzimanje + Izbrisana %1$s preuzimanja + Izbrisano %1$s preuzimanja + + + %d sekunda + %d sekunde + %d sekundi + + + %d minut + %d minute + %d minuta + + + %d sat + %d sata + %d sati + + + %d dan + %d dana + %d dana + + + %d odabrana + %d odabrane + %d odabranih + + + %s odgovor + %s odgovora + %s odgovora + + YouTube je ukinuo kombinovanu stranicu s trendovima od 21. jula 2025. NewPipe je zamijenio zadanu stranicu s trendovima s trendovima uživo prijenosa.\n\nTakođer možete odabrati različite stranice s trendovima u \"Postavke > Sadržaj > Sadržaj glavne stranice\". + Ovaj sadržaj nije dostupan za trenutno odabranu zemlju sadržaja.\n\nPromijenite svoj odabir u \"Postavke > Sadržaj > Zadana zemlja sadržaja\". + diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index dadac3c3f..31183d15b 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -215,7 +215,7 @@ Controls de la velocitat de reproducció Tempo To - Toca \"Cerca\" per començar. + Toqueu la lupa per començar. Elimina l\'àudio en algunes resolucions Reproductor d\'àudio extern Emmagatzema les cerques localment diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 756cf17cf..853b8c1cb 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -486,7 +486,7 @@ Prázdné jméno skupiny Přejete si odstranit tuto skupinu? - Nová + Nový Novinky Limit aktualizace novinek Doba po poslední aktualizaci, po níž je odběr považován za zastaralý — %s @@ -719,7 +719,7 @@ Klepnutím stáhnete %s Rychlý režim Používáte nejnovější verzi NewPipe - Import nebo export odběrů z 3-tečkové nabídky + Importujte nebo exportujte odběry z 3tečkové nabídky Tato možnost je dostupná pouze při vybraném motivu %s Zrušení nastavení trvalého náhledu Karta @@ -844,4 +844,24 @@ Líbí se Stránka SoundCloud Top 50 odstraněna SoundCloud zrušil původní žebříčky Top 50. Příslušná karta byla odstraněna z vaší hlavní stránky. + YouTube kombinované trendy odstraněny + YouTube ukončil provoz kombinované stránky s trendy k 21. červenci 2025. NewPipe nahradil výchozí stránku s trendy stránkou s trendy živými přenosy.\n\nMůžete také vybrat různé stránky s trendy v části „Nastavení > Obsah > Obsah úvodní stránky“. + Populární hry + Populární podcasty + Populární filmy a seriály + Populární hudba + %s tis. + %s mil. + %s mld. + Pro používání Popup Playeru vyberte v následující nabídce nastavení Androidu možnost %1$s a povolte %2$s. + \"Povolit zobrazení přes jiné aplikace\" + Vymazat soubor + Vymazat položku + Položka vymazána + Ukončení účtu\n\n%1$s uvádí tento důvod: %2$s + Během přehrávání byla ze serveru přijata chyba HTTP 403, pravděpodobně způsobená vypršením platnosti streamingové adresy URL nebo zákazem IP adresy + Chyba HTTP %1$s obdržená ze serveru během přehrávání + Chyba HTTP 403 obdržená od serveru během přehrávání, pravděpodobně způsobená zákazem IP adresy nebo problémy s deobfuskací streamovací adresy URL + %1$s odmítl poskytnout data, žádá o přihlášení k potvrzení, že žadatel není bot.\n\nVaše IP adresa mohla být dočasně zakázána %1$s, můžete nějakou dobu počkat nebo přepnout na jinou IP adresu (například zapnutím/vypnutím VPN nebo přepnutím z WiFi na mobilní data). + Tento obsah není pro aktuálně vybranou zemi obsahu dostupný.\n\nZměňte výběr v nabídce \"Nastavení > Obsah > Výchozí země obsahu\". diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 5354bb7ad..62d89d60b 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -232,7 +232,7 @@ Mest Afspillet Indhold af hovedside Hvilke faner vises på hovedsiden - Tom Side + Tom side Kioskside Kanalside Vælg en kanal @@ -825,4 +825,13 @@ Kanalgruppeside Vælg en feed-gruppe Ingen feed-gruppe oprettet endnu + Søg %1$s + Søg %1$s (%2$s) + For at kunne bruge pop op-afspilleren skal du vælge %1$s i følgende Android-indstillingsmenu og aktivere %2$s. + “Tillad visning over andre apps” + %sK + %sM + %sB + Slet fil + Kontoen er blevet lukket\n\n%1$s angiver følgende årsag: %2$s diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index b99209f0f..627e755f6 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -830,4 +830,24 @@ Gefällt mir SoundCloud-Top-50-Seite entfernt SoundCloud hat die ursprünglichen Top-50-Charts abgeschafft. Der entsprechende Tab wurde von deiner Hauptseite entfernt. + %sMio. + %sMrd. + %sTsd. + Gaming-Trends + Beliebte Filme und Shows + Beliebte Musik + Beliebte Podcasts + YouTube hat den geteilten Feed entfernt + YouTube hat die kombinierte Trending-Seite ab dem 21. Juli 2025 eingestellt. NewPipe hat die Standard-Trending-Seite durch die Trending-Livestreams ersetzt.\n\nDu kannst auch verschiedene Trendseiten unter „Einstellungen > Inhalt > Inhalt der Hauptseite“ auswählen. + Um den Pop-up-Player zu verwenden, bitte in den folgenden Android-Einstellungen %1$s auswählen und %2$s aktivieren. + „Über anderen Apps einblenden“ + Datei löschen + Eintrag löschen + Eintrag gelöscht + Konto geschlossen\n\n%1$s gibt folgenden Grund an: %2$s + HTTP-Fehler 403 vom Server während der Wiedergabe erhalten, wahrscheinlich verursacht durch Ablauf der Streaming-URL oder eine IP-Sperre + HTTP-Fehler %1$s vom Server während der Wiedergabe erhalten + HTTP-Fehler 403 vom Server während der Wiedergabe erhalten, wahrscheinlich verursacht durch eine IP-Sperre oder Probleme beim Entschlüsseln der Streaming-URL + %1$s hat die Datenbereitstellung verweigert und verlangt eine Anmeldung, um zu bestätigen, dass es sich bei dem Anfragenden nicht um einen Bot handelt.\n\nDeine IP-Adresse wurde möglicherweise vorübergehend von %1$s gesperrt. Du kannst einige Zeit warten oder zu einer anderen IP-Adresse wechseln (z. B. durch Ein- und Ausschalten eines VPNs oder durch Wechseln von WLAN zu mobilen Daten). + Dieser Inhalt ist für das aktuell ausgewählte Land des Inhalts nicht verfügbar.\n\nÄndere die Auswahl unter „Einstellungen > Inhalt > Bevorzugtes Land des Inhalts“. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 5cb645bfa..02bf75b30 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -827,7 +827,27 @@ Σελίδα καναλιού ομάδας Αναζήτηση %1$s Αναζήτηση %1$s (%2$s) - Likes + Μου αρέσει Η σελίδα των SoundCloud Top 50 αφαιρέθηκε Το SoundCloud έχει καταργήσει τα αρχικά charts με τα Top 50. Η αντίστοιχη καρτέλα έχει αφαιρεθεί από την κύρια σελίδα σας. + Οι συνδυασμένες τάσεις στο YouTube καταργήθηκαν + Το YouTube έχει καταργήσει τη συνδυασμένη σελίδα με τάσεις από την 21 Ιουλίου 2025. Το NewPipe αντικατέστησε την προεπιλεγμένη σελίδα τάσεων με τις ζωντανές ροές τάσεων.\n\nΜπορείτε επίσης να επιλέξετε διαφορετικές σελίδες με τάσεις στις \"Ρυθμίσεις > Περιεχόμενο > Περιεχόμενο κύριας σελίδας\". + Τάσεις παιχνιδιών + Τάσεις podcasts + Τάσεις ταινιών και εκπομπών + Μουσικές τάσεις + %sK + %sM + %sB + Για να χρησιμοποιήσετε το Αναδυόμενο Πρόγραμμα Αναπαραγωγής, επιλέξτε %1$s στο ακόλουθο μενού ρυθμίσεων Android και ενεργοποιήστε το %2$s. + «Να επιτρέπεται η εμφάνιση πάνω από άλλες εφαρμογές» + Διαγραφή αρχείου + Διαγραφή καταχώρησης + Η καταχώρηση διαγράφηκε + Ο λογαριασμός έκλεισε\n\n%1$s παρέχει αυτήν την αιτία: %2$s + Σφάλμα HTTP 403 που ελήφθη από τον διακομιστή κατά την αναπαραγωγή, πιθανώς λόγω λήξης διεύθυνσης URL ροής ή αποκλεισμού IP + Σφάλμα HTTP %1$s ελήφθη από τον διακομιστή κατά την αναπαραγωγή + Σφάλμα HTTP 403 ελήφθη από τον διακομιστή κατά την αναπαραγωγή, πιθανώς λόγω αποκλεισμού IP ή προβλημάτων απεμπλοκής URL ροής + Ο %1$s αρνήθηκε να παράσχει δεδομένα, ζητώντας σύνδεση για να επιβεβαιώσει ότι ο αιτών δεν είναι bot.\n\nΗ IP σας ενδέχεται να έχει αποκλειστεί προσωρινά από τον %1$s. Μπορείτε να περιμένετε λίγο ή να αλλάξετε IP (για παράδειγμα, ενεργοποιώντας/απενεργοποιώντας ένα VPN ή αλλάζοντας από WiFi σε δεδομένα κινητής τηλεφωνίας). + Αυτό το περιεχόμενο δεν είναι διαθέσιμο για την τρέχουσα επιλεγμένη χώρα περιεχομένου.\n\nΑλλάξτε την επιλογή σας από \"Ρυθμίσεις > Περιεχόμενο > Προεπιλεγμένη χώρα περιεχομένου\". diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 8b022bcff..1a80eefd9 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -84,4 +84,14 @@ Okay Open in browser No stream player found (you can install VLC to play it). + Yes + No + Mark as watched + Open in popup mode + Open with + Share + Download + Download stream file + Search + Settings diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c88da0a2f..ffa8ad4f0 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -829,4 +829,19 @@ Selecciona un grupo de feed Aún no se ha creado ningún grupo de feed Página de grupo de canales + Buscar %1$s + Buscar %1$s (%2$s) + Me gusta + Página Top 50 de SoundCloud eliminada + SoundCloud ha descontinuado las listas originales del Top 50. La pestaña correspondiente se ha eliminado de la página principal. + YouTube tendencias combinadas eliminado + YouTube ha descontinuado la página de tendencias combinadas a partir del 21 de julio de 2025. NewPipe reemplazó la página de tendencias predeterminada con tendencias en directo.\n\nTambién puedes seleccionar diferentes páginas de tendencias en \"Ajustes > Contenido > Contenido de la página principal\". + Tendencias videojuegos + Tendencias pódcasts + Tendencias películas y programas + Tendencias música + “Permitir mostrar sobre otras aplicaciones” + Eliminar archivo + %sM + %sM diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index dc9643678..05f4cf505 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -603,7 +603,7 @@ Hangi võimalusel spetsiaalsest voost Kiirvoo režiim ei paku selle kohta täiendavat teavet. Autori konto on suletud. \nTulevikus ei saa NewPipe seda meediavoogu laadida. \nKas soovid tühistada selle kanali tellimuse? - Voo \'%s\' laadimine nurjus. + Voo \'%s\' laadimine ei õnnestnud. Via voo laadimisel Värskenda alati Aeg pärast viimast värskendust, mille möödudes loetakse tellimus aegunuks — %s @@ -815,4 +815,24 @@ Meeldimisi SoundCloudi „Top 50“ leht on eemaldatud SoundCloud on lõpetanud oma algse „Top 50“ edetabeli pidamise. Seega on ka vastav vahekaart meie rakenduse põhivaatest eemaldatud. + YouTube\'i kombineeritud populaarsust koguvad videovoog on eemaldatud + YouTube on alates 21.07.25 lõpetanud ühendatud populaarsust koguvate videote lehe kasutamise. Mistõttu ka NewPipe on asendanud vaikimisi populaarsust koguvate videote lehe sarnase otse-eetri lehega.\n\n„Seadistused -> Sisu -> Avalehe sisu“ alt saad ka muid sarnaseid lehti seadistada. + Populaarsust koguvad taskuhäälingud + Populaarsust koguvad filmid ja telesarjad + Populaarsust koguv muusika + Populaarsust koguvad mängud + %s tuh + %s mln + %s mld + Kasutamaks meediaesitajat hüpikaknas palun vali järgnevast Androidi seadistuste valikust „%1$s“ ja lülita sisse „%2$s“. + Luba kuvamine teiste rakenduste peal + Kustuta fail + Kustuta kirje + Kirje on kustutatud + Kasutajakonto on suletud\n\n%1$s on märkinud põhjuseks: %2$s + Esitamise ajal lisas server andmevoogu HTTP oleku 403 ning tavaliselt tähendab see, et voogedastuse võrguaadress on aegunud või sinu seadme IP-aadress on keelatud + Esitamise ajal lisas server andmevoogu HTTP oleku %1$s + Esitamise ajal lisas server andmevoogu HTTP oleku 403 ning tavaliselt tähendab see, et sinu seadme IP-aadress on keelatud või voogedastuse võrguaadressi hägustamisvastastes meetmetes on viga + See sisu pole saadaval hetkel kehtvas riigis.\n\nRiiki saad muuta: Seadistused > Sisu > Sisu vaikimisi riik. + %1$s keeldus andmete edastamisest ning eeldab sisselogimist tuvastamaks, et tegemist pole robotiga.\n\nLisaks võib olla juhtunud, et %1$s on lisanud sinu seadme ip-aadressi ajutisse keelunimekirja. Sa võid oodata natuke aega või vahetada võrguühendus viisi (näiteks lülitades VPN sisse/välja või kasutades WiFi asemel mobiilset internetiühendust). diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ffb78e19f..e587a301d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -207,15 +207,15 @@ Chargement du contenu demandé Importer la base de données Exporter la base de données - Remplace votre historique, vos abonnements, vos listes de lecture et (en option) vos paramètres - Exporte l’historique, les abonnements, les listes de lecture et les paramètres + Remplace votre historique, vos abonnements, vos playlists et (en option) vos paramètres + Exporte l’historique, les abonnements, les playlists et les paramètres Exporté Importé Fichier ZIP non valide Avertissement : impossible d’importer tous les fichiers. Cela effacera vos paramètres actuels. Afficher les informations - Listes de lecture enregistrées + Playlists enregistrées Ajouter à Glisser pour réordonner Créer @@ -224,17 +224,17 @@ Dernière lecture Vidéos les plus vues Toujours demander - Nouvelle liste de lecture + Nouvelle playlist Renommer Nom - Ajouter à la liste de lecture - Définir comme miniature de la liste de lecture - Enregister la liste de lecture + Ajouter à la playlist + Définir comme miniature de la playlist + Enregister la playlist Supprimer le signet - Voulez-vous supprimer cette liste de lecture \? - Liste de lecture créée - Ajouté à la liste de lecture - Miniature de la liste de lecture changée. + Voulez-vous supprimer cette playlist ? + Playlist créée + Ajouté à la playlist + Miniature de la playlist changée. Aucun sous-titre Ajuster Zoomer @@ -318,7 +318,7 @@ Aucune limite Limiter la définition lors de l’utilisation des données mobiles Chaînes - Listes de lecture + Playlists Morceaux Utilisateurs Accélérer pendant les silences @@ -355,7 +355,7 @@ Téléchargement échoué Délai de connexion expiré Conférences - ajouté à la liste de lecture + ajouté à la playlist Générer un nom unique Écraser Un fichier avec ce nom existe déjà @@ -386,7 +386,7 @@ Aucun commentaire Impossible de charger les commentaires Fermer - Reprendre la liste de lecture + Reprendre la playlist Effacer les données Fichier déplacé ou supprimé impossible d’écraser le fichier @@ -522,8 +522,7 @@ \nActivez « %1$s » dans les paramètres si vous voulez la voir. Supprimer les vidéos visionnées Oui ainsi que les vidéos partiellement visionnées - Les vidéos qui ont été visionnées avant et après avoir été ajoutées à la liste de lecture seront supprimées. -\nÊtes-vous certain(e)  \? Cette action est irréversible ! + Les vidéos qui ont été visionnées avant et après avoir été ajoutées à la playlist seront supprimées. \nÊtes-vous certain(e) ? Cette action est irréversible ! Supprimer les vidéos visionnées \? Miniature de l\'avatar de la chaine De %s @@ -532,9 +531,9 @@ Afficher la date originelle sur les items Activer le « Mode restreint » de YouTube Afficher uniquement les abonnements non groupés - Page des listes de lecture - Aucune liste de lecture encore enregistrée - Sélectionner une liste de lecture + Page des playlists + Aucune playlist encore enregistrée + Sélectionner une playlist Veuillez vérifier si un ticket concernant votre problème existe déjà. Lorsque vous créez des tickets dupliqués, cela nous prend du temps que nous pourrions passer à résoudre effectivement le problème. Signaler sur GitHub Copier le rapport formaté @@ -724,7 +723,7 @@ Appuyez pour télécharger %s Échec de la copie dans le presse-papiers Cette option est disponible seulement si %s est sélectionné pour le thème - Les listes de lecture grisées contiennent déjà cet élément. + Les playlists grisées contiennent déjà cet élément. Carte Utile si, par exemple, vous utilisez un casque avec des boutons dysfonctionnels Effacer les doublons @@ -785,7 +784,7 @@ Albums Qualité moyenne Bannières - Listes de lecture + Playlists Plus d’options Miniatures Pistes @@ -801,7 +800,7 @@ Partager une liste d\'URLs %1$s \n%2$s - Partager la liste de lecture + Partager la playlist - %1$s : %2$s Choisir quels onglets seront visibles sur les pages de chaîne Changer l’orientation de l’écran @@ -836,14 +835,34 @@ Pas assez d\'espace disponible sur l\'appareil Les paramètres de l\'export en cours d\'importation utilisent un format vulnérable qui a été déprécié depuis NewPipe 0.27.0. Assurez-vous que l\'export en cours d\'importation provient d\'une source fiable. Privilégiez les exports obtenues à partir de NewPipe 0.27.0 ou des versions plus récentes à l\'avenir. Le support pour l\'importation des paramètres dans ce format vulnérable sera bientôt complètement supprimé et les anciennes versions de NewPipe ne pourront plus importer les paramètres des exports des nouvelles versions. secondaire - Partager comme liste de lecture YouTube temporaire - Listes de lecture + Partager comme playlist YouTube temporaire + Playlists Sélectionnez un groupe de flux - Aucun groupe de flux n\'a encore été créé + Encore aucun groupe de flux créé Page du groupe de chaînes Rechercher %1$s Rechercher %1$s (%2$s) - Likes + J’aime Page SoundCloud Top 50 supprimée SoundCloud a abandonné le classement original du Top 50. L\'onglet correspondant a été supprimé de votre page d\'accueil. + Suppression des tendances combinées sur YouTube + YouTube a supprimé la page des tendances combinées depuis le 21 juillet 2025. NewPipe a remplacé la page des tendances par défaut par les diffusions en direct les plus populaires.\n\nVous pouvez également sélectionner différentes pages de tendances dans « Paramètres > Contenu > Contenu de la page principale ». + Tendances jeu vidéo + Tendances podcasts + Tendances films et séries + Tendances musique + %sK + %sM + %sB + Pour utiliser le lecteur contextuel, veuillez sélectionner %1$s dans le menu des paramètres Android suivant et activer %2$s. + « Autoriser l\'affichage sur d\'autres applications » + Supprimer le fichier + Supprimer l\'entrée + Entrée supprimée + Compte fermé\n\n%1$s fournit la raison suivante : %2$s + Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par l\'expiration de l\'URL de streaming ou une interdiction d\'IP + Erreur HTTP %1$s reçue du serveur pendant la lecture + Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par une interdiction d\'IP ou des problèmes de désobfuscation d\'URL de streaming. + %1$s a refusé de fournir des données et a demandé un identifiant pour confirmer que le demandeur n\'est pas un robot.\n\nVotre adresse IP a peut-être été temporairement bannie par %1$s. Vous pouvez patienter un peu ou changer d\'adresse IP (par exemple en activant/désactivant un VPN, ou en passant du Wi-Fi aux données mobiles). + Ce contenu n\'est pas disponible pour le pays actuellement sélectionné.\n\nModifiez votre sélection dans « Paramètres > Contenu > Pays par défaut ». diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 2131dc9c0..c35281207 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -595,7 +595,7 @@ פתיחה באמצעות אין יישומון על המכשיר שלך שיכול לפתוח את זה להקריס את היישומון - תוכן זה זמין רק למשתמשים ששילמו, לכן לא ניתן להזרים או להוריד אותו עם NewPipe. + התוכן הזה זמין רק למשתמשים ששילמו, לכן לא ניתן להזרים או להוריד אותו עם NewPipe. סרטון זה זמין רק למנויי YouTube Music Premium, לכן לא ניתן להזרים או להוריד אותו עם NewPipe. זה תוכן פרטי, לכן לא ניתן להזרים או להוריד אותו עם NewPipe. רצועה זו של SoundCloud Go+‎ מוגבלת, לפחות במדינה שלך, לכן לא ניתן להזרים או להוריד אותה עם NewPipe. @@ -855,4 +855,26 @@ חיפוש ב־%1$s חיפוש ב־%1$s‏ (%2$s) לייקים + חשבון הושמד\n\n%1$s מספק את הסיבה הבאה: %2$s + כדי להשתמש בנגן צף, נא לבחור ב־%1$s בתפריט ההגדרות הבא של Android ולהפעיל את %2$s. + „תמיד להציג מעל יישומונים אחרים” + %s אלף + %s מיליון + %s מיליארד + המובילים המשולבים של YouTube הוסרו + מחיקת קובץ + מחיקת רשומה + עמוד 50 המובילים ב־SoundCloud הוסר + מגמות במשחקים + פודקאסטים מובילים + סרטים וסדרות מובילים + מוזיקה מובילה + הרשומה נמחקה + SoundCloud הפסיקו את מצעדי 50 הלהיטים המקוריים. הלשונית התואמת הוסרה מהעמוד הראשי שלך. + ב־YouTube הושבת עמוד המובילים המשולב החל מ־21 ביולי 2025. NewPipe החליפה את עמוד המובילים המוגדר כברירת מחדל בשידורים חיים מובילים.\n\nניתן גם לבחור עמודי מובילים שונים תחת „הגדרות > תוכן > תוכן הדף הראשי”. + שגיאת HTTP 403 שהתקבלה מהשרת בזמן השמעה, ככל הנראה נגרמת עקב פקיעת כתובת URL של סטרימינג או חסימת IP + שגיאת HTTP %1$s התקבלה מהשרת בזמן הניגון + שגיאת HTTP‏ 403 שהתקבלה מהשרת בזמן הניגון, ככל הנראה נגרמה עקב חסימת IP או בעיות בהסרת ערפול כתובת תזרים + %1$s סירב לספק נתונים, וביקש התחברות כדי לאשר שהמבקש אינו בוט.\n\nכנראה שה־IP שלך נחסם זמנית על ידי %1$s, ניתן להמתין זמן מה או לעבור ל־IP אחר (לדוגמה על ידי הפעלה/כיבוי של VPN, או על ידי מעבר מרשת אלחוטית לתקשורת נתונים סלולרית). + תוכן זה אינו זמין עבור מדינת התוכן שנבחרה כעת.\n\nניתן לשנות את בחירתך דרך „הגדרות > תוכן > מדינת תוכן ברירת מחדל”. diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 77a256ba4..0eafb2930 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -2,7 +2,7 @@ Počni dodirom na povećalo. Objavljeno %1$s - Nije pronađen nijedan player streamova. Želiš li instalirati VLC\? + Nije pronađen nijedan player tokova. Želiš li instalirati VLC? Instaliraj Odustani Otvori u pregledniku @@ -125,7 +125,7 @@ © %1$s od %2$s pod %3$s O aplikaciji i ČPP Licence - Slobodan i mali streaming na Android uređaju. + Slobodan i mali tok na Android uređaju. Pogledaj na GitHubu NewPipe licenca 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! @@ -160,7 +160,7 @@ %s videa Reproduciraj sve - Nije bilo moguće reproducirati ovaj stream + Nije bilo moguće reproducirati ovaj tok Dogodila se neoporavljiva greška playera Oporavljanje od greške playera Prikaži savjet za držanje @@ -231,7 +231,7 @@ Poništava tvoju trenutačnu povijest, pretplate, playliste i (opcionalno) postavke Izvezi povijest, pretplate, playliste i postavke Izbriši povijest gledanja - Briše povijest reproduciranih streamova i pozicije reprodukcije + Briše povijest reproduciranih tokova i pozicije reprodukcije Izbrisati cijelu povijest gledanja\? Povijest gledanja je izbrisana Izbriši povijest pretraživanja @@ -288,8 +288,8 @@ Bez ograničenja Ograniči rezoluciju tijekom korištenja mobilnih podataka Nijedan - Nije pronađen nijedan player streamova (možeš instalirati VLC za reprodukciju). - Preuzmi datoteku streama + Nije pronađen nijedan player tokova (možeš instalirati VLC za reprodukciju). + Preuzmi datoteku toka Koristi brzo netočno premotavanje Netočno premotavanje omogućuje playeru brže premotavanje uz manju točnost. Premotavanje od 5, 15 ili 25 sekundi s ovime ne radi Otkaži pretplatu @@ -309,8 +309,8 @@ Prikaži pogrešku Izbriši sve podatke web-stranica iz predmemorije Metapodaci su izbrisani - Automatski dodaj sljedeći stream u popisa izvođenja - Nastavi završavati (ne ponavljajući) popis reprodukcija dodavanjem povezanog streama + Automatski dodaj sljedeći tok u popisa izvođenja + Nastavi završavati (ne ponavljajući) popis reprodukcija dodavanjem povezanog toka Zadana zemlja sadržaja Otkrivanje grešaka Obavijest o novoj verziji aplikacije @@ -574,7 +574,7 @@ Obavijest šifriranja videa Obavijesti o napretku šifriranja videa Nedavni - Isključi za skrivanje polja metapodataka s dodatnim podacima o autoru streama, sadržaju streama ili zahtjevu za pretraživanje + Isključi za skrivanje polja metapodataka s dodatnim podacima o autoru toka, sadržaju toka ili zahtjevu za pretraživanje Prikaži metapodatke Povezane stavke Nijedna aplikacija na tvom uređaju ovo ne može otvoriti @@ -643,9 +643,9 @@ Za ukljanjanje stavki povuci ih Prikaži indikatore slike - Preuzimanje je gotovo + %s preuzimanje je gotovo %s preuzimanja su gotova - %s preuzimanja su gotova + %s preuzimanja je gotovo Pokreni glavni player u cjeloekranskom prikazu Dodaj u popis kao sljedeći @@ -670,23 +670,23 @@ Došlo je do greške, pogledaj obavijest Prekini rad playera Obavijest playera - Konfiguriraj obavijest trenutačno reproduciranog streama + Konfiguriraj obavijest trenutačno reproduciranog toka Obavijesti Novi videozapisi - Obavijesti novih streamova od pretplaćenih kanala + Obavijesti novih tokova od pretplaćenih kanala Želiš li izbrisati sve preuzete datoteke\? Obavijesti su isljučene Pretplatio/la si se na ovaj kanal , Uključi/isključi sve Bilo kakva mreža - Obavijesti novih streamova pretplaćenih kanala + Obavijesti novih tokova pretplaćenih kanala Prikaži kratku poruku greške - Učitavanje pojedinosti streama … - Pokreni traženje novih streamova + Učitavanje pojedinosti toka … + Pokreni traženje novih tokova Prvjeravanje učestalosti Biblioteka „LeakCanary” nije dostupna - Obavijesti o novim streamovima + Obavijesti o novim tokovima Potrebna mrežna veza Primaj obavijesti Za ovu radnju nije pronađen odgovarajući upravljač datoteka. @@ -698,12 +698,12 @@ Posto Poluton Streamovi koje aplikacija za preuzimanje još ne podržava se ne prikazuju - Eksterni playeri ne podržavaju odabrani stream + Eksterni playeri ne podržavaju odabrani tok Promijenite veličinu intervala učitavanja progresivnog sadržaja (trenutno %s). Niža vrijednost može ubrzati učitavanje - %s novi stream - %s nova streama - %s novih streamova + %s novi tok + %s nova toka + %s novih tokova Veličina intervala učitavanja reprodukcije Nepoznat format @@ -830,4 +830,36 @@ Uvijek koristi ExoPlayer postavku zaobilaženja videa za izlaznu površinu Kartice za dohvaćanje prilikom aktualiziranja feeda. Ova opcija nema učinka ako se kanal aktualizira pomoću brzog modusa. sekundarno + Pretraži %1$s + Pretraži %1$s (%2$s) + Popisi izvođenja + Da biste koristili Popup Player, odaberite %1$s u sljedećem izborniku postavki Androida i omogućite %2$s. + \"Dopusti prikaz preko drugih aplikacija\" + %sK + %sM + %sB + Izbriši datoteku + Obriši unos + Odaberite grupu feedova + Još nije stvorena nijedna grupa feedova + Stranica grupe kanala + Račun ukinut\n\n%1$s navodi ovaj razlog: %2$s + Ovo zaobilazno rješenje oslobađa i ponovno instancira video kodeke kada dođe do promjene površine, umjesto da se površina izravno postavlja na kodek. Već se koristi od strane ExoPlayera na nekim uređajima s ovim problemom, ova postavka ima učinak samo na Androidu 6 i novijim verzijama.\n\nOmogućavanje ove opcije može spriječiti pogreške reprodukcije prilikom prebacivanja trenutnog video playera ili prebacivanja na cijeli zaslon + Lajkovi + Podijeli kao privremenu playlistu na YouTubeu + Postavke u izvozu koji se uvozi koriste ranjivi format koji je zastario od verzije NewPipe 0.27.0. Provjerite je li izvoz koji se uvozi iz pouzdanog izvora i u budućnosti radije koristite samo izvoze dobivene iz NewPipe 0.27.0 ili novije verzije. Podrška za uvoz postavki u ovom ranjivom formatu uskoro će biti potpuno uklonjena, a zatim stare verzije NewPipea više neće moći uvoziti postavke izvoza iz novih verzija. + Stranica SoundCloud Top 50 uklonjena + SoundCloud je ukinuo originalne Top 50 ljestvice. Odgovarajuća kartica je uklonjena s vaše glavne stranice. + Uklonjeni kombinirani trendovi na YouTubeu + YouTube je ukinuo kombiniranu stranicu s trendovima od 21. srpnja 2025. NewPipe je zamijenio zadanu stranicu s trendovima s trendovima prijenosa uživo.\n\nTakođer možete odabrati različite stranice s trendovima u \"Postavke > Sadržaj > Sadržaj glavne stranice\". + Trendovi u igrama + Trendovi podcasti + Trendovi u filmovima i serijama + Glazba u trendu + Unos izbrisan + HTTP greška 403 primljena od poslužitelja tijekom reprodukcije, vjerojatno uzrokovana istekom URL-a za streaming ili zabranom IP adrese + HTTP greška %1$s primljena od poslužitelja tijekom reprodukcije + HTTP greška 403 primljena od poslužitelja tijekom reprodukcije, vjerojatno uzrokovana zabranom IP adrese ili problemima s deobfuskacijom URL-a za streaming + %1$s je odbio dati podatke, tražeći prijavu kako bi potvrdio da podnositelj zahtjeva nije bot.\n\nVašu IP adresu je možda privremeno zabranio %1$s, možete pričekati neko vrijeme ili se prebaciti na drugu IP adresu (na primjer uključivanjem/isključivanjem VPN-a ili prebacivanjem s WiFi-ja na mobilne podatke). + Ovaj sadržaj nije dostupan za trenutno odabranu zemlju sadržaja.\n\nPromijenite odabir u \"Postavke > Sadržaj > Zadana zemlja sadržaja\". diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index cf0e9da04..d114a2d33 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -49,7 +49,7 @@ Jelentés Információ: Ez történt: - Saját hozzászólás (angolul): + Saját megjegyzés (angolul): Részletek: Elnézést, valami balul sült el. Elnézést, ennek nem kellett volna megtörténnie. @@ -90,7 +90,7 @@ Néhány felbontásnál eltávolítja a hangot Feliratkozás Feliratkozva - További infó + További információ Felugró ablak alapértelmezett felbontása Magasabb felbontások megjelenítése Csak bizonyos eszközök tudnak 2K/4K-s videókat lejátszani @@ -219,11 +219,11 @@ Legtöbbet lejátszott Főoldal tartalma Üres oldal - Kioszk oldal + Témagyűjtemények Csatornaoldal Válasszon egy csatornát Még nincs csatornafeliratkozás - Válasszon egy kioszkot + Válasszon egy témagyűjteményt Exportálva Importálva Nem érvényes ZIP-fájl @@ -529,13 +529,13 @@ Fiók megnyitása Csatorna részleteinek megjelenítése Tartsa a sorba állításhoz - Alapértelmezett kioszk + Alapértelmezett témagyűjtemény A NewPipe egy copyleft szabad szoftver: tetszése szerint felhasználhatja, tanulmányozhatja, megoszthatja és fejlesztheti. Egész pontosan a Free Software Foundation által kiadott GNU General Public License 3-as, vagy (választható módon) újabb verziójának feltételei szerint módosíthatja vagy adhatja tovább. Megoldás Nyomja meg a „Kész” gombot, ha megoldotta Ujjlenyomat számítása Kapcsolódó elemek - Ellenőrizze, hogy létezik-e már olyan jegy, amely az összeomlásával foglalkozik. Ha duplikált jegyet ad fel, akkor olyan időt vesz el tőlünk, amelyet a hiba javítására tudnánk fordítani. + Ellenőrizze, hogy létezik-e már hibajegy a leírt összeomlással kapcsolatban. Az ismétlődő hibajegyek létrehozása feleslegesen elvonja az erőforrásokat a hiba tényleges javításától. Minimalizálás alkalmazásváltáskor Helyi keresési javaslatok Távoli keresési javaslatok @@ -724,7 +724,7 @@ Eltávolítja az összes ismétlődő közvetítést ebből a lejátszólistáról\? eredeti Kezdőlap pozíciója - A médiacsatornázás alapértelmezés szerint le van tiltva a saját eszközén, mivel a saját eszközmodellje nem támogatja azt. + A médiacsatornázás alapértelmezetten le van tiltva az eszközén, mivel a saját eszközmodellje nem támogatja azt. Kezdőlapválasztó alulra helyezése Nincs élő közvetítés Nincs adatfolyam @@ -801,4 +801,24 @@ Kedvelések SoundCloud Top 50 oldal eltávolítva A SoundCloud megszüntette az eredeti Top 50-es listákat. A megfelelő lap el lett távolítva a főoldalról. + YouTube „felkapott lapok” eltávolítva + A YouTube 2025. július 21-től megszüntette a „felkapott” oldalt. A NewPipe a korábbi alapértelmezett „felkapott” oldalt felkapott élő közvetítésekkel helyettesítette.\n\nA „Beállítások > Tartalom > Főoldal tartalma” menüpontban különböző felkapott lapokat is kiválaszthat. + Felkapott játékok + Felkapott podcastok + Felkapott filmek és sorozatok + Felkapott zenék + %se + %sm + %sM + A felugró ablakos lejátszó használatához válassza ki a(z) %1$s elemet a következő Android beállítások menüben, és engedélyezze a(z) %2$s elemet. + „Megjelenítés a többi alkalmazás fölött” engedélyezése + Fájl törlése + Bejegyzés törlése + Bejegyzés törölve + Fiók megszüntetve\n\n%1$s az alábbi ok miatt: %2$s + A lejátszás közben a kiszolgáló 403-as HTTP-hibát adott vissza, valószínűleg a közvetítési hivatkozás érvényessége lejárt vagy a IP-tiltás miatt + HTTP-hiba %1$s érkezett a kiszolgáltól a lejátszás közben + HTTP 403-as hiba érkezett a kiszolgálótól a lejátszás közben, valószínűleg IP-tiltás vagy a közvetítési hivatkozás feloldási problémák miatt + %1$s visszautasította az adatok szolgáltatását, és bejelentkezést kér annak megerősítésére, hogy a kérés nem robot által érkezik.\n\nElőfordulhat, hogy az IP-címét ideiglenesen letiltotta %1$s, várhat egy keveset, vagy váltson egy másik IP-címre (például VPN be-/kikapcsolásával, vagy Wi-Fi-ről mobiladat-forgalomra váltva). + Ez a tartalom a jelenleg kiválasztott tartalom országában nem elérhető.\n\nVáltoztassa meg a „Beállítások > Tartalom >Tartalom alapértelmezett országa” menüpontban. diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 3c3f03192..bb9286dab 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -816,4 +816,24 @@ Suka Halaman Top 50 SoundCloud dihapus SoundCloud telah menghentikan dukungan tangga lagu Top 50. Tab terkait telah dihapus dari halaman utama Anda. + Untuk menggunakan Pemutar Sembul, silakan pilih %1$s dalam menu pengaturan Android berikut dan aktifkan %2$s. + \"Izinkan menampilkan di atas aplikasi\" + Hapus berkas + Hapus entri + Akun dihapus\n\n%1$s menyediakan alasan ini: %2$s + Tren terpadu YouTube dihilangkan + YouTube telah mengakhiri halaman tren terpadu pada 21 Juli 2025. NewPipe mengganti halaman tren bawaan dengan tren siaran langsung.\n\nAnda juga dapat memilih halaman tren berbeda dalam \"Pengaturan > Konten > Konten di halaman utama\". + Tren permainan + Tren siniar + Tren film dan acara + Tren musik + Entri dihapus + Kesalahan HTTP 403 diterima dari server saat memutar, dapat disebabkan oleh URL streaming kedaluwarsa atau pemblokiran IP + Kesalahan HTTP %1$s diterima dari server saat memutar + Kesalahan HTTP 403 diterima dari server saat memutar, dapat disebabkan oleh pemblokiran IP atau masalah deobfuskasi URL streaming + %1$s menolak memberikan data, meminta login untuk memastikan peminta bukan bot.\n\nAlamat IP Anda mungkin telah diblokir sementara oleh %1$s, Anda dapat menunggu beberapa saat atau beralih ke alamat IP yang berbeda (misalnya dengan mengaktifkan/menonaktifkan VPN, atau beralih dari WiFi ke data seluler). + Konten ini tidak tersedia untuk negara konten yang saat ini dipilih.\n\nUbah pilihan Anda dari “Pengaturan > Konten > Negara konten bawaan”. + %sK + %sM + %sB diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 9daa67dbf..387bce955 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -809,4 +809,16 @@ Líkar við Topp 50 síða SoundCloud fjarlægð SoundCloud er hætt með Topp 50 vinsældalistann. Viðkomandi flipi hefur verið fjarlægður af aðalsíðunni þinni. + %sK + %sM + %sB + Vinsælir leikir + Vinsæl hlaðvörp + Vinsælar kvikmyndir og þættir + Vinsæl tónlist + \"Leyfa birtingu ofan á öðrum forritum\" + Eyða skrá + Eyða færslu + Aðgangi lokað\n\n%1$s gefur þessa ástæðu: %2$s + Færslu eytt diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 459bab3d3..f73e7437a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -844,4 +844,24 @@ Mi piace Pagina Top 50 di SoundCloud rimossa SoundCloud ha dismesso i grafici Top 50 originali. La scheda relativa è stata rimossa dalla pagina principale. + %sK + %sMilio. + %sMilia. + Rimosse tendenze combinate YouTube + YouTube ha interrotto la pagina di tendenza combinata il 21 luglio 2025. NewPipe ha sostituito la pagina di tendenza predefinita con le dirette in tendenza.\n\nPuoi anche selezionare diverse pagine di tendenza in \"Impostazioni > Contenuto > Contenuto della pagina principale\". + Giochi in tendenza + Podcast in tendenza + Film e spettacoli in tendenza + Musica in tendenza + Per usare il riproduttore popup, seleziona %1$s nel seguente menu delle impostazioni Android e attiva %2$s. + “Consenti la visualizzazione sopra altre app” + Elimina file + Elimina voce + Account eliminato\n\n%1$s fornisce questa motivazione: %2$s + Voce eliminata + Errore HTTP 403 ricevuto dal server durante la riproduzione, probabilmente causato dalla scadenza dell\'URL in streaming o da un divieto dell\'IP + Errore HTTP %1$s ricevuto dal server durante la riproduzione + Errore HTTP 403 ricevuto dal server durante la riproduzione, probabilmente causato da un divieto dell\'IP o problemi di de-offuscamento dell\'URL in streaming + %1$s ha rifiutato di fornire i dati, chiedendo un accesso per confermare che il richiedente non sia un bot.\n\nIl tuo IP potrebbe essere stato temporaneamente vietato da %1$s, puoi aspettare un po\' di tempo o passare ad un IP diverso (ad esempio accendendo/spegnendo una VPN, o passando dal WiFi ai dati mobili). + Questo contenuto non è disponibile per il Paese dei contenuti attualmente selezionato.\n\nModifica la selezione da \"Impostazioni > Contenuti > Paese dei contenuti predefinito\". diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index b27443344..819517ba4 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -737,4 +737,60 @@ არჩიე თავდაპირველი ხმის ჩანაწერი ხმა: %s ხმის ჩანაწერი + დიახ + არა + %1$s-ის ძიება + მოძებნეთ %1$s %2$s + დასაკრავი სიები + ქვემოთ მოცემული თითოეული შეტყობინების მოქმედების რედაქტირებისთვის მასზე შეხებით აირჩიეთ. პირველი სამი მოქმედება (დაკვრა/პაუზა, წინა და შემდეგი) სისტემის მიერ არის დაყენებული და მათი მორგება შეუძლებელია. + აღწერილობითი აუდიოს უპირატესობა + სარეზერვო ასლის შექმნა და აღდგენა + მთავარი ჩანართის ამომრჩევის ქვემოთ გადატანა + მთავარი ჩანართების პოზიცია + ამომხტარი ფანჯრის გამოსაყენებლად, გთხოვთ, აირჩიოთ %1$s შემდეგ Android პარამეტრების მენიუში და ჩართოთ %2$s. + “სხვა აპლიკაციებზე ჩვენების დაშვება“ + %sათასი + %sმლნ + %sმლრდ + ნაკადები არ არის + პირდაპირი ტრანსლაციები არ არის + ფაილის წაშლა + ჩანაწერის წაშლა + აირჩიეთ არხის ჯგუფი + არხის ჯგუფი ჯერ არ შექმნილა + მედიის გვირაბირება თქვენს მოწყობილობაზე ნაგულისხმევად გამორთულია, რადგან თქვენი მოწყობილობის მოდელი, როგორც ცნობილია, მას არ უჭერს მხარს. + NewPipe-ს შეუძლია დროდადრო ავტომატურად შეამოწმოს ახალი ვერსიები და შეგატყობინოთ, როგორც კი ისინი ხელმისაწვდომი გახდება.\nგსურთ ამის ჩართვა? + პარამეტრების გადაყენება + ყველა პარამეტრის ნაგულისხმევ მნიშვნელობებზე დაბრუნება + ყველა პარამეტრის გადატვირთვა გააუქმებს თქვენს მიერ არჩეულ ყველა პარამეტრს და გადატვირთავს აპლიკაციას.\n\nდარწმუნებული ხართ, რომ გსურთ გაგრძელება? + მოწყობილობაზე საკმარისი თავისუფალი ადგილი არ არის + არხის ჯგუფის გვერდი + არხის ჩანართების მოძიება + არხის განახლებისას გამოსატანი ჩანართები. ამ პარამეტრს არანაირი ეფექტი არ აქვს, თუ არხი სწრაფი რეჟიმის გამოყენებით განახლდება. + ანგარიში შეწყვეტილია\n\n%1$s ამ მიზეზს იძლევა: %2$s + მინიატურები + ამტვირთავის ავატარები + ქვეარხის ავატარები + ავატარები + ბანერები + გამომწერები + ამ ნაკადში აუდიო ჩანაწერი უკვე უნდა იყოს წარმოდგენილი + გარე პლეერებისთვის აუდიო ჩანაწერის არჩევა + უცნობი + ExoPlayer-ის პარამეტრები + ExoPlayer-ის ზოგიერთი პარამეტრის მართვა. ამ ცვლილებების ძალაში შესასვლელად მოთამაშის გადატვირთვაა საჭირო. + გამოიყენეთ ExoPlayer-ის დეკოდერის სარეზერვო ფუნქცია + ჩართეთ ეს პარამეტრი, თუ დეკოდერის ინიციალიზაციის პრობლემები გაქვთ, რაც, თუ პირველადი დეკოდერების ინიციალიზაცია ვერ მოხერხდა, დაბალი პრიორიტეტის მქონე დეკოდერებს ეხება. ამან შეიძლება გამოიწვიოს დაკვრის დაბალი შესრულება, ვიდრე პირველადი დეკოდერების გამოყენებისას. + ყოველთვის გამოიყენეთ ExoPlayer-ის ვიდეო გამომავალი ზედაპირის პარამეტრების ალტერნატიული გადაწყვეტა + ეს გამოსავალი ათავისუფლებს და ხელახლა ააქტიურებს ვიდეო კოდეკებს ზედაპირის ცვლილებისას, ზედაპირის პირდაპირ კოდეკზე დაყენების ნაცვლად. ეს პარამეტრი უკვე გამოიყენება ExoPlayer-ის მიერ ზოგიერთ მოწყობილობაზე, რომელსაც ეს პრობლემა აქვს, და მოქმედებს მხოლოდ Android 6-ზე და უფრო მაღალ ვერსიებზე.\n\nამ პარამეტრის ჩართვამ შეიძლება თავიდან აიცილოს დაკვრის შეცდომები მიმდინარე ვიდეო პლეერის გადართვისას ან სრულ ეკრანზე გადართვისას. + თამაშების ტრენდები + ტრენდული პოდკასტები + ტრენდული ფილმები და შოუები + ტრენდული მუსიკა + ჩანაწერი წაშლილია + დაკვრის დროს სერვერიდან მიღებული HTTP შეცდომა 403, სავარაუდოდ, გამოწვეული სტრიმინგის URL-ის ვადის გასვლით ან IP აკრძალვით. + დაკვრის დროს სერვერიდან მიღებული HTTP შეცდომა %1$s + დაკვრის დროს სერვერიდან მიღებული HTTP შეცდომა 403, სავარაუდოდ, გამოწვეულია IP აკრძალვით ან სტრიმინგის URL-ის დებფუსკაციის პრობლემებით. + %1$s-მა უარი თქვა მონაცემების მიწოდებაზე და ითხოვა შესვლა იმის დასადასტურებლად, რომ მომთხოვნი რობოტი არ არის.\n\nშესაძლოა, თქვენი IP მისამართი დროებით აიკრძალა %1$s-ის მიერ, შეგიძლიათ დაელოდოთ ცოტა ხანს ან გადახვიდეთ სხვა IP მისამართზე (მაგალითად, VPN-ის ჩართვით/გამორთვით, ან WiFi-დან მობილურ მონაცემებზე გადართვით). + ეს კონტენტი ამჟამად არჩეული კონტენტის ქვეყნისთვის მიუწვდომელია.\n\nშეცვალეთ თქვენი არჩევანი „პარამეტრები > კონტენტი > ნაგულისხმევი კონტენტის ქვეყანა“-დან. diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 0ded7974c..29db74172 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -7,9 +7,9 @@ Sbedd asnas n Kore yexxuṣen\? Sbedd Asider - Isidar - Isidar - Iɣewwaṛen + Isadaren + Isadaren + Iɣewwaren Akter… Tulya n telɣut… Awurman diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 6a7e463a1..39f854d35 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -24,7 +24,7 @@ 다운로드 다음/유사한 비디오 표시 지원하지 않는 URL입니다 - 기본 컨텐츠 언어 + 기본 콘텐츠 언어 비디오 및 오디오 비디오 재생, 구간: 업로더 썸네일 @@ -42,13 +42,13 @@ 백그라운드에서 재생 중 네트워크 오류 돋보기를 탭하여 시작합니다. - 컨텐츠 - 연령 제한 컨텐츠 보여주기 + 콘텐츠 + 연령 제한 콘텐츠 보여주기 라이브 오류 모든 썸네일을 불러올 수 없습니다 웹사이트를 가져올 수 없습니다 - 컨텐츠를 사용할 수 없습니다 + 콘텐츠를 사용할 수 없습니다 다운로드 메뉴를 설정할 수 없습니다 죄송합니다. 오류가 발생했습니다. 이메일을 통해 보고 @@ -284,7 +284,7 @@ 영상과 소리 분리 (왜곡이 발생할 수 있음) 다운로드 가능한 스트림이 없습니다 선호하는 열기 동작 - 컨텐츠를 열 때 사용할 기본 동작 — %s + 콘텐츠를 열 때 사용할 기본 동작 — %s 자막 플레이어 자막 글자 크기와 배경 스타일을 수정합니다. 적용하려면 앱을 다시 시작해야 합니다 채널 @@ -805,4 +805,25 @@ 설정 초기화 모든 설정을 기본값으로 초기화 + YouTube 임시 재생목록으로 공유 + SoundCloud Top 50 페이지가 삭제되었습니다 + SoundCloud에서 더 이상 기존 Top 50 차트를 제공하지 않습니다. 해당하는 탭이 메인 페이지에서 제거되었습니다. + %s천 + %s백만 + %s십억 + 파일 삭제 + 피드 그룹 선택 + 피드 그룹을 생성하지 않았습니다 + 채널 그룹 페이지 + 계정 정지됨\n\n%1$s에서 제공한 이유: %2$s + 재생목록 + %1$s 검색 + %1$s 검색 (%2$s) + \"다른 앱 위에 표시 허용\" + YouTube 통합 인기 급상승 동영상이 삭제되었습니다 + YouTube에서 2025년 7월 21일부로 더 이상 통합 인기 급상승 동영상을 제공하지 않습니다. NewPipe에서는 기본 인기 급상승 페이지를 인기 급상승 실시간 페이지로 교체했습니다.\n\n\"설정 > 콘텐츠 > 메인 화면의 내용\"에서 다른 인기 급상승 페이지를 선택할 수 있습니다. + 인기 급상승 게임 + 인기 급상승 팟캐스트 + 인기 급상승 영화 및 쇼 + 인기 급상승 음악 diff --git a/app/src/main/res/values-lmo/strings.xml b/app/src/main/res/values-lmo/strings.xml new file mode 100644 index 000000000..6f681ac08 --- /dev/null +++ b/app/src/main/res/values-lmo/strings.xml @@ -0,0 +1,4 @@ + + + Pigia la lente per inziaa. + diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index c769392cf..0eb6e4201 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -527,7 +527,7 @@ Netika atrasts video atskaņotājs. Uzstādīt VLC? Publicēts %1$s Nospiediet uz meklēšanas ikonas, lai sāktu. - Iekrāsot paziņojumu + Pielāgot paziņojumu krāsu Nekas Ielādējas Sajaukt diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 3b3277307..02d772023 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -635,4 +635,6 @@ Verkies beschrijvende audio Verkies originele audio Selecteer het oorspronkelijke audiospoor, ongeacht de taal + Zoeken%1$s + Zoeken%1$s(%2$s) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 9f99e3a70..4c8a28745 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -825,4 +825,29 @@ Selecteer een feedgroep Kanaalgroep­pagina Nog geen feedgroep geselecteerd + Zoeken met %1$s + Zoeken met %1$s (%2$s) + Vind-ik-leuks + Trending podcasts + Trending games + Trending films en series + Trending muziek + ‘SoundCloud Top 50’-pagina verwijderd + SoundCloud heeft de originele Top 50-hitlijsten stopgezet. Het bijbehorende tabblad is van uw hoofdpagina verwijderd. + YouTube gecombineerde trending verwijderd + YouTube heeft de gecombineerde trending­pagina per 21 juli 2025 stopgezet. NewPipe heeft de standaard­trendingpagina vervangen door de trending livestreams.\n\nU kunt ook andere trending­pagina\'s selecteren via \'Instellingen > Inhoud > Inhoud van de hoofdpagina\'. + %s dznd. + %s mln. + %s mld. + Bestand verwijderen + Item verwijderen + Item verwijderd + Om de Pop-up-speler te gebruiken, selecteert u %1$s in het volgende Android-instellingenmenu en schakelt u %2$s in. + ‘Weergeven vóór andere apps toestaan’ + Account beëindigd\n\n%1$s geeft de volgende reden: %2$s + HTTP-fout 403 ontvangen van de server tijdens het afspelen, waarschijnlijk veroorzaakt door het verlopen van de streaming-url of een ip-blokkade + HTTP-fout %1$s ontvangen van de server tijdens het afspelen + HTTP-fout 403 ontvangen van de server tijdens het afspelen, waarschijnlijk veroorzaakt door een ip-blokkade of problemen met de deobfuscatie van de streaming-url + %1$s weigerde gegevens te verstrekken en vroeg om een login om te bevestigen dat de aanvrager geen bot is.\n\nUw ip-adres is mogelijk tijdelijk geblokkeerd door %1$s. U kunt even wachten of overschakelen naar een ander ip-adres (bijvoorbeeld door een vpn in of uit te schakelen, of door over te schakelen van wifi naar mobiele data). + Deze inhoud is niet beschikbaar voor het momenteel geselecteerde inhouds­land.\n\nWijzig uw selectie via ‘Instellingen > Inhoud > Standaard­land voor inhoud’. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 0a95609cd..3eee59c46 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -592,8 +592,8 @@ Zepsuj aplikację Ta treść dostępna jest tylko dla użytkowników, którzy za nią zapłacili. Nie może być strumieniowana ani pobierana przez NewPipe. To wideo dostępne jest tylko dla subskrybentów usługi YouTube Music Premium. Nie może być strumieniowane ani pobierane przez NewPipe. - Ta treść jest prywatna, więc nie może być strumieniowana ani pobierana przez NewPipe - Ta treść nie jest dostępna w Twoim kraju + Ta treść jest prywatna, więc nie może być strumieniowana ani pobierana przez NewPipe. + Ta treść nie jest dostępna w Twoim kraju. To wideo jest objęte ograniczeniem wiekowym. \nZe względu na nowe zasady YouTube dotyczące wideo z ograniczeniami wiekowymi NewPipe nie może uzyskać dostępu do żadnego z jego strumieni wideo i dlatego nie jest w stanie go odtworzyć. To jest utwór SoundCloud Go+ (przynajmniej w Twoim kraju). Nie może być strumieniowany ani pobierany przez NewPipe. @@ -623,7 +623,7 @@ Kategoria Otwórz stronę Teraz możesz zaznaczyć tekst wewnątrz opisu. Pamiętaj, że w trybie zaznaczania strona może migotać i linki nie będą klikalne. - Konto zamknięte + Konto zamknięte. Tryb szybki dla ładowania kanału nie dostarcza więcej informacji na ten temat. Konto autora zostało zawieszone. \nNewPipe nie będzie w stanie załadować tego kanału w przyszłości. @@ -853,4 +853,24 @@ Polubienia Usunięto stronę SoundCloud 50 najlepszych SoundCloud wycofał oryginalną listę 50 najlepszych. Odpowiadająca karta została usunięta ze strony głównej. + Usunięto połączone Na czasie YouTube + Od 21 lipca 2025 r. YouTube zaprzestał korzystania z połączonego Na czasie. NewPipe zastąpił domyślną stronę Na czasie popularnymi transmisjami na żywo.\n\nMożesz także wybrać różne strony Na czasie w „Ustawienia > Zawartość > Zawartość strony głównej”. + Gry na czasie + Podcasty na czasie + Filmy i programy na czasie + Muzyka na czasie + %stys. + %smln + %smld + Usuń plik + Usuń wpis + Usunięto wpis + Aby korzystać z odtwarzacza w trybie okienkowym, wybierz %1$s w następującym menu ustawień Androida i włącz %2$s. + „Zezwól na wyświetlanie nad innymi aplikacjami” + Konto zamknięte.\n\n%1$s podaje następujący powód: %2$s + Podczas odtwarzania otrzymano od serwera błąd HTTP 403, prawdopodobnie spowodowany wygaśnięciem adresu URL strumienia lub blokadą adresu IP. + Podczas odtwarzania otrzymano od serwera błąd HTTP %1$s. + Podczas odtwarzania otrzymano od serwera błąd HTTP 403, prawdopodobnie spowodowany blokadą adresu IP lub problemami z odszyfrowaniem adresu URL strumienia. + %1$s odmówił dostarczenia danych, prosząc o zalogowanie się w celu potwierdzenia, że nie jest się botem.\n\nTwoje IP mogło zostać tymczasowo zablokowane przez %1$s. Możesz chwilę poczekać lub zmienić adres IP (na przykład włączając/wyłączając VPN lub przełączając się z sieci Wi-Fi na dane komórkowe). + Ta treść nie jest dostępna dla aktualnie wybranego kraju treści.\n\nZmień swój wybór w „Ustawienia > Zawartość > Domyślny kraj treści”. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 30fc565c6..a0ec8127e 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -839,9 +839,29 @@ Selecione um grupo de feeds Nenhum grupo de feeds criado ainda Página do grupo do canal - Pesquisar %1$s - Pesquisar %1$s (%2$s) + Buscar %1$s + Buscar %1$s (%2$s) Curtidas Página Top 50 do SoundCloud removida O SoundCloud descontinuou as paradas originais do Top 50. A aba correspondente foi removida da sua página principal. + Para usar o Popup Player, selecione %1$s no seguinte menu de configurações do Android e ative %2$s. + “Permitir exibição sobre outros aplicativos” + %sK + %sM + %sB + Excluir arquivo + Excluir entrada + Tendências combinadas do YouTube removidas + O YouTube descontinuou a página de tendências combinadas em 21 de julho de 2025. O NewPipe substituiu a página de tendências padrão pelas transmissões ao vivo em alta.\n\nVocê também pode selecionar páginas de tendências diferentes em \"Configurações > Conteúdo > Conteúdo da página principal\". + Jogos em alta + Podcasts em alta + Filmes e programas em alta + Músicas em alta + Entrada excluída + Conta encerrada\n\n%1$s informa este motivo: %2$s + Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por URL de streaming expirado ou IP banido + Erro HTTP %1$s recebido do servidor durante reprodução + Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por um banimento de IP ou problemas de desofuscação de URL de streaming + %1$s se recusou a fornecer dados, solicitando um login para confirmar que o solicitante não é um bot.\n\nSeu IP pode ter sido temporariamente banido por %1$s. Você pode esperar um pouco ou mudar para um IP diferente (por exemplo, ativando/desativando uma VPN ou alternando de Wi-Fi para dados móveis). + Este conteúdo não está disponível para o país selecionado atualmente.\n\nAltere sua seleção acessando “Configurações > Conteúdo > País padrão do conteúdo”. diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 6783327ec..1ec01b0d7 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -841,4 +841,27 @@ Página do grupo do canal Pesquisar %1$s Pesquisar %1$s (%2$s) + Gostos + Página Top 50 do SoundCloud removida + O SoundCloud descontinuou os gráficos originais do Top 50. A guia correspondente foi removida da sua página principal. + Tendência combinada do YouTube removida + O YouTube descontinuou a página de tendência combinada a partir de 21 de julho de 2025. O NewPipe substituiu a página de tendência predefinida com as streams ao vivo de tendência.\n\nTambém pode escolher páginas de tendência diferentes em \"Definições > Conteúdo > Conteúdo da página principal\". + Tendências de jogos + Tendências de podcasts + Tendências de filmes e shows + Tendências de música + %sK + %sM + %sB + Para usar o reprodutor pop-up, escolhe %1$s no menu seguinte de configurações do Android e ative %2$s. + “Permitir exibição sobre outras apps” + Apagar ficheiro + Apagar entrada + Entrada apagada + Conta terminada\n\n%1$s fornece esta razão: %2$s + Erro HTTP %1$s recebido do servidor ao reproduzir + %1$s recusou fornecer dados, pedindo por um login para confirmar que o solicitante não é um bot.\n\nO seu IP pode ter sido temporariamente banido por %1$s, pode esperar algum tempo ou mudar para um IP diferente (por exemplo, a ligar / desligar uma VPN, ou a alternar de Wi-Fi para dados móveis). + Este conteúdo não está disponível para o país de conteúdo atualmente selecionado.\n\nAltere a sua seleção de \"Configurações > Conteúdo > País predefinido de conteúdo\". + Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado pela URL de streaming expirado ou IP banido + Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por um bloqueio de IP ou problemas de desofuscação da URL de streaming diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index d4b35fa55..da54067e7 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -841,4 +841,27 @@ Página do grupo do canal Pesquisar %1$s Pesquisar %1$s (%2$s) + Gostos + Página Top 50 do SoundCloud removida + O SoundCloud descontinuou os gráficos originais do Top 50. A guia correspondente foi removida da sua página principal. + Tendência combinada do YouTube removida + O YouTube descontinuou a página de tendência combinada a partir de 21 de julho de 2025. O NewPipe substituiu a página de tendência predefinida com as streams ao vivo de tendência.\n\nTambém pode escolher páginas de tendência diferentes em \"Definições > Conteúdo > Conteúdo da página principal\". + Tendências de jogos + Tendências de podcasts + Tendências de filmes e shows + Tendências de música + %sK + %sM + %sB + Para usar o reprodutor pop-up, escolhe %1$s no menu seguinte de configurações do Android e ative %2$s. + “Permitir exibição sobre outras apps” + Apagar ficheiro + Apagar entrada + Entrada apagada + Conta terminada\n\n%1$s fornece esta razão: %2$s + Erro HTTP %1$s recebido do servidor ao reproduzir + %1$s recusou fornecer dados, pedindo por um login para confirmar que o solicitante não é um bot.\n\nO seu IP pode ter sido temporariamente banido por %1$s, pode esperar algum tempo ou mudar para um IP diferente (por exemplo, a ligar / desligar uma VPN, ou a alternar de Wi-Fi para dados móveis). + Este conteúdo não está disponível para o país de conteúdo atualmente selecionado.\n\nAltere a sua seleção de \"Configurações > Conteúdo > País predefinido de conteúdo\". + Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado pela URL de streaming expirado ou IP banido + Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por um bloqueio de IP ou problemas de desofuscação da URL de streaming diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 17106ed45..1b7210e58 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -844,4 +844,8 @@ Aprecieri Pagina SoundCloud Top 50 a fost eliminată SoundCloud a eliminat Top 50. Fila corespunzătoare a fost eliminată din pagina principală. + „Permite afișarea deasupra altor aplicații” + %s mii + %s mil. + %s mld. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4e7428b3c..e3ca674a2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -849,4 +849,24 @@ Лайки Страница SoundCloud Top 50 удалена SoundCloud прекратил поддерживать оригинальные чарты Top 50. Соответствующая вкладка была удалена с вашей главной страницы. + %sК + %sмлн + %sмлрд + Игровые тренды + Удалены объединённые тренды YouTube + YouTube прекратил поддержку объединённой страницы трендов 21 июля 2025 года. NewPipe заменил страницу трендов по умолчанию на тренды в прямых трансляциях.\n\nВы также можете выбрать другие страницы трендов в \"Настройки > Контент > Главная страница\". + Тренды в подкастах + Тренды в фильмах и шоу + Тренды в музыке + Чтобы использовать Popup Player, выберите %1$s в следующем меню настроек Android и включите %2$s. + «Разрешить отображение поверх других приложений» + Удалить файл + Удалить запись + Учётная запись закрыта\n\n%1$s указал причину: %2$s + Запись удалена + Во время воспроизведения получена ошибка HTTP 403 от сервера, вероятно, вызванная истечением срока действия URL-адреса потоковой передачи или блокировкой IP-адреса + Ошибка HTTP %1$s получена от сервера во время воспроизведения + Во время воспроизведения получена ошибка HTTP 403 от сервера, вероятно, вызванная блокировкой IP-адреса или проблемами деобфускации URL-адреса потоковой передачи + %1$s отказался предоставить данные, запросив логин для подтверждения, что запросчик не бот.\n\nВозможно, ваш IP-адрес временно заблокирован %1$s. Вы можете подождать некоторое время или переключиться на другой IP-адрес (например, включив/выключив VPN или переключившись с Wi-Fi на мобильный интернет). + Этот контент недоступен для выбранной страны контента.\n\nИзмените свой выбор в разделе «Настройки > Контент > Страна контента по умолчанию». diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index ac694bba9..091001ae6 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -822,4 +822,18 @@ Iscalitas Cumpartzi comente un\'iscalita temporànea de YouTube segundàriu + Chirca in %1$s + Chirca %1$s (%2$s) + Seletziona unu grupu de flussos + Galu perunu grupu de flussos creadu + Pàgina de grupu de canales + Agradessimentos + Pàgina Top 50 de SoundCloud bogada + SoundCloud at abbandonadu sos gràficos Top 50 originales. S\'ischeda currispondente est istada bogada dae sa pàgina printzipale tua. + Tendèntzias cumbinadas de YouTube bogadas + YouTube at abbandonadu sa pàgina de sas tendèntzias cumbinadas in su 21 de trìulas de su 2025. NewPipe at sostituidu sa pàgina de sas tendèntzias printzipales cun sas diretas de tendèntzia.\n\nPodes fintzas seletzionare pàginas de sas tendèntzias diferentes in \"Impostatziones > Cuntenutos > Cuntenutu de sa pàgina printzipale\". + Giogos de tendèntzia + Podcasts de tendèntzia + Films e programmas de tendèntzia + Mùsica de tendèntzia diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index f725965e2..b41d9fff9 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -486,7 +486,7 @@ Bez názvu skupiny Chcete zmazať vybranú skupinu\? - Nová + Nový Zdroj Interval obnovy zdroja Čas od poslednej aktualizácie, kedy sa odber považuje za neaktuálny - %s @@ -724,7 +724,7 @@ Používate najnovšiu verziu NewPipe Táto možnosť je dostupná len pre motív %s Rýchly režim - Import alebo export odberov z 3-bodkovej ponuky + Importujte alebo exportujte odbery v menu s 3-mi bodkami Akcia gesta vľavo Vyberte gesto pre pravú polovicu obrazovky prehrávača Akcia gesta vpravo @@ -843,4 +843,24 @@ Páči sa SoundCloud Top 50 stránka odstránená SoundCloud prestal používať pôvodnú Top 50. Daná stránka bola odstránená z hlavnej stránky. + Odstránené kombinované trendy na YouTube + YouTube ukončil prevádzku kombinovanej stránky s trendmi k 21. júlu 2025. NewPipe nahradil predvolenú stránku s trendmi stránkou s trendovými živými prenosmi.\n\nV nastaveniach „Nastavenia > Obsah > Obsah hlavnej stránky“ môžete vybrať aj iné stránky s trendmi. + Ttendy v hrách + Trendové podcasty + Trendové filmy a seriály + Trendová hudba + %stis. + %smil. + %smld. + Položka vymazaná + Vymazať položku + \"Povoliť zobrazenie cez iné aplikácie\" + Vymazať súbor + Ak chcete používať Popup Player, vyberte %1$s v nasledujúcej ponuke nastavení Androidu a povoľte %2$s. + Účet bol zrušený\n\n%1$s uvádza tento dôvod: %2$s + Počas prehrávania bola zo servera prijatá chyba HTTP 403, pravdepodobne spôsobená vypršaním platnosti streamingovej adresy URL alebo zákazom IP adresy + Chyba HTTP %1$s prijatá zo servera počas prehrávania + Chyba HTTP 403 prijatá zo servera počas prehrávania, pravdepodobne spôsobená zákazom IP adresy alebo problémami s deobfuskáciou streamingovej URL adresy + %1$s odmietol poskytnúť údaje, žiada o prihlásenie na potvrdenie, že žiadateľ nie je bot.\n\nVaša IP adresa mohla byť dočasne zakázaná %1$s, môžete nejaký čas počkať alebo prejsť na inú IP adresu (napríklad zapnutím/vypnutím VPN alebo prepnutím z WiFi na mobilné dáta). + Tento obsah nie je dostupný pre aktuálne zvolenú krajinu obsahu.\n\nZmeňte výber v ponuke \"Nastavenia > Obsah > Predvolená krajina obsahu\". diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 474be8127..8b4ba8f7b 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -261,7 +261,7 @@ NewPipe-ovi pravilnik zasebnosti Obiščite spletno mesto od NewPipe za več informacij in novic. Končano - Ni komantarjev + Ni komentarjev Nobeden ne posluša Nobeden ne gleda Zgodila se je napaka: %1$s diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 722ce6855..02711dac2 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -78,7 +78,7 @@ Преузимања Извештај о грешци Програм је отказао - Шта:\\nЗахтев:\\nЈезик садржаја:\\nЗемља садржаја:\\nЈезик апликације:\\nУслуга:\\nGMT време:\\nПакет:\\nВерзија:\\nВерзија ОС-а: + Шта:\\nЗахтев:\\nЈезик садржаја:\\nДржава садржаја:\\nЈезик апликације:\\nУслуга:\\nGMT време:\\nПакет:\\nВерзија:\\nВерзија ОС-а: „reCAPTCHA“ задатак Решите „reCAPTCHA“ задатак Црна @@ -114,7 +114,7 @@ О NewPipe О нама и ЧПП Лиценце - Слободно и лагано стримовање на Android-у. + Слободно и лагано токовање на Android-у. Погледај на GitHub-у Прочитај лиценцу Допринос @@ -161,7 +161,7 @@ Без обзира имате ли идеје; превод, промене дизајна, чишћење кода или праве, озбиљне, промене кода—помоћ је увек добродошла. Што се више уради, то је боље! Прикажите савет када притиснете позадину или искачуће дугме у видео снимку „Детаљи:“ Пусти све - Није могуће пустити овај стрим + Није могуће пустити овај ток Дошло је до непоправљиве грешке плејера Опорављање од грешке плејера Желите ли да избришете ову ставку из историје претраге\? @@ -179,11 +179,11 @@ Детаљи Подешавања аудио снимка Није пронађен ниједан извођач довода (можете уградити ВЛЦ ради извођења садржаја). - Преузимање фајла стрима + Преузимање фајла тока Прикажи информације Обележене плејлисте Додај на - Подразумевана држава за садржај + Подразумевана држава садржаја Исправљање грешака Увек Само једном @@ -319,7 +319,7 @@ Увоз из Увоз Срушите апликацију - Изворни текстови са услуга биће видљиви у ставкама стрима + Изворни текстови са услуга биће видљиви у ставкама тока Прикажи изворно време ставки Присилно извештавање о „Rx“ изузецима који се не могу испоручити ван фрагмента или животног циклуса активности након одлагања Пријави грешке ван животног циклуса @@ -418,15 +418,15 @@ Врати подразумеване вредности Желите ли да вратите подразумеване вредности\? Није могуће прочитати сачуване картице, тако да се користе подразумеване - Нема стримова доступних за преузимање + Нема токова доступних за преузимање Дошло је до грешке: %1$s Фајл не постоји или нема дозволе за читање или писање Назив фајла не може бити празан Нема таквог фајла/извора садржаја Нема таквог фолдера Фајл је премештен или избрисан - Нису пронађени видео стримови - Нису пронађени аудио стримови + Нису пронађени видео токови + Нису пронађени аудио токови Спољни плејери не подржавају ове врсте линкова Преузимање на спољну, SD (меморијску), картицу није могуће. Ресетовати локацију фолдера за преузимање\? Спољна меморија није доступна @@ -440,7 +440,7 @@ Избриши позиције репродукције Историја гледања је избрисана Избрисати целу историју гледања\? - Брише историју пуштаних стримова и позиције репродукције + Брише историју пуштаних токова и позиције репродукције Очисти историју гледања Чисти колачиће које NewPipe чува када решите „reCAPTCHA“ Извоз историје, праћења, плејлисти и подешавања @@ -492,10 +492,10 @@ Вратите последњу позицију репродукције Настави репродукцију Аутоматско стављање у редослед - Наставите да завршавате (непонављајући) редослед репродукције додавањем сродног стрима - Аутоматски стави у редослед следећи стрим + Наставите да завршавате (непонављајући) редослед репродукције додавањем сродног тока + Аутоматски стави у редослед следећи ток Кеш метаподатака обрисан - Искључите да бисте сакрили поља за метаподатке са додатним информацијама о креатору стрима, садржају стрима или захтеву за претрагу + Искључите да бисте сакрили поља за метаподатке са додатним информацијама о креатору тока, садржају тока или захтеву за претрагу Прикажи метаподатке Искључите да бисте сакрили опис видео снимка и додатне информације Прикажи опис @@ -527,10 +527,10 @@ Аутоматски (тема уређаја) Радио Истакнуто - Овај садржај је доступан само корисницима који су платили, тако да га NewPipe не може стримовати или преузимати. - Овај видео снимак је доступан само премијум YouTube Music члановима, тако да га NewPipe не може стримовати или преузимати. - Овај садржај је приватан, тако да га NewPipe не може стримовати или преузимати. - Ово је SoundCloud Go+ нумера, барем у вашој земљи, тако да је NewPipe не може стримовати или преузимати. + Овај садржај је доступан само корисницима који су платили, тако да га NewPipe не може токовати или преузимати. + Овај видео снимак је доступан само премијум YouTube Music члановима, тако да га NewPipe не може токовати или преузимати. + Овај садржај је приватан, тако да га NewPipe не може токовати или преузимати. + Ово је SoundCloud Go+ нумера, барем у вашој земљи, тако да је NewPipe не може токовати или преузимати. Овај садржај није доступан у вашој земљи. Ниједна апликација на вашем уређају не може да отвори ово Поглавља @@ -649,7 +649,7 @@ %s преузимања је завршено %1$s %2$s - Обавештења о новим стримовима + Обавештења о новим токовима Обавештења Погледај на веб-сајту Ако имате проблема са коришћењем апликације, обавезно погледајте ове одговоре на честа питања! @@ -662,7 +662,7 @@ Поништи трајну сличицу Било која мрежа Ручно проверите постоје ли нове верзије - Спољни плејери не подржавају изабрани стрим + Спољни плејери не подржавају изабрани ток Померите главни бирач картице на дно Положај главних картица Дошло је до грешке, погледајте обавештење @@ -671,34 +671,34 @@ Учесталост провере Картица Уклонити дупликате\? - Желите ли да уклоните све дупликате стримова на овој плејлисти\? + Желите ли да уклоните све дупликате токова на овој плејлисти? Предстојеће Подешавања ExoPlayer-а Увек користи заобилазно решење ExoPlayer-а за подешавање површине излаза видео снимка Изабери квалитет за спољне плејере - Нема стримова - Нема стримова уживо + Нема токова + Нема токова уживо - %s нови стрим - %s нова стрима - %s нових стримова + %s нови ток + %s нова тока + %s нових токова - Учитавање детаља стрима… + Учитавање детаља тока… Прикажи „Сруши плејер“ - Покрени проверу нових стримова + Покрени проверу нових токова Тунеловање медија је подразумевано онемогућено на вашем уређају, јер је познато да ваш уређај то не подржава. Полутон - Обавештавање о новим стримовима из праћења + Обавештавање о новим токовима из праћења Провера ажурирања… Избрисати све преузете фајлове са диска\? Уклони дупликате Прикачен коментар ExoPlayer подразумевано Изабери све - Не приказују се стримови које програм за преузимање још увек не подржава - Аудио снимак би већ требало да буде присутан у овом стриму - Нема доступних аудио стримова за спољне плејере - Нема доступних видео стримова за спољне плејере + Не приказују се токови које програм за преузимање још увек не подржава + Аудио снимак би већ требало да буде присутан у овом току + Нема доступних аудио токова за спољне плејере + Нема доступних видео токова за спољне плејере Непознати формат Непознати квалитет Непознато @@ -712,8 +712,8 @@ Додирните да бисте преузели %s Провера ажурирања Преглед сличице траке за претрагу - Приказ следећих стримова - Прикажи/сакриј стримове + Приказ следећих токова + Прикажи/сакриј токове Користи резервну функцију декодера ExoPlayer-а оригинални Промените величину интервала учитавања на прогресивним садржајима (тренутно %s). Нижа вредност може убрзати њихово почетно учитавање @@ -722,8 +722,8 @@ Радња покретом улево Изаберите покрет за десну половину екрана плејера Обавештење плејера - Обавештења о новим стримовима за праћења - Конфигуришите обавештење о тренутно репродукованом стриму + Обавештења о новим токовима за праћења + Конфигуришите обавештење о тренутно репродукованом току Изаберите оригинални аудио снимак, без обзира на језик Изаберите аудио снимак са описима за особе са оштећеним видом, ако је доступан Преферирај описни аудио снимак @@ -731,7 +731,7 @@ Осветљеност Јачина звука Ниједно - Нови стримови + Нови токови Обавештења за пријаву грешака Увезите или извезите праћења из менија са 3 тачке Аудио снимак @@ -790,7 +790,7 @@ Низак квалитет Укључи цео екран Аватари - Следећи стрим + Следећи ток Аватари потканала Отвори редослед пуштања Не учитавај слике @@ -806,7 +806,7 @@ Више опција Сличице Трајање - Претходни стрим + Претходни ток Дели листу URL адреса Дели са насловима %1$s @@ -840,4 +840,28 @@ Изаберите групу фидова Страница групе канала Ликовања + Претрага %1$s + Претрага %1$s (%2$s) + Да бисте користили искачући плејер, изаберите %1$s у следећем менију подешавања Android-а и омогућите %2$s. + „Дозволи приказ преко других апликација“ + %sк + %sмлн. + %sмлрд. + Избриши фајл + Избриши унос + Налог је укинут\n\n%1$s наводи овај разлог: %2$s + Страница SoundCloud Top 50 је уклоњена + SoundCloud је укинуо оригиналне топ 50 листе. Одговарајућа картица је уклоњена са ваше главне странице. + Уклоњен је комбиновану страницу у тренду на YouTube-у + YouTube је укинуо комбиновану страницу у тренду од 21. јула 2025. NewPipe је заменио подразумевану страницу у тренду са страницом уживо у тренду.\n\nТакође можете одабрати различите странице у тренду у „Подешавања > Садржај > Садржај главне странице“. + Игре у тренду + Подкасти у тренду + Филмови и серије у тренду + Музика у тренду + Унос избрисан + HTTP грешка 403 примљена са сервера током репродукције, вероватно узрокована истеком URL-а за токовање или забраном IP адресе + HTTP грешка %1$s примљена са сервера током репродукције + HTTP грешка 403 примљена са сервера током репродукције, вероватно узрокована забраном IP адресе или проблемима са деобфускацијом URL-а за токовање + %1$s је одбио да пружи податке, тражећи пријаву како би се потврдило да подносилац захтева није бот.\n\nВаша IP адреса је можда привремено забрањена од стране %1$s, можете сачекати неко време или прећи на другу IP адресу (на пример, укључивањем/искључивањем VPN-а или преласком са WiFi-ја на мобилне податке). + Овај садржај није доступан за тренутно изабрану земљу садржаја.\n\nПромените свој избор у „Подешавања > Садржај > Подразумевана држава садржаја“. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index f3703ea87..7893eae19 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -144,7 +144,7 @@ \nöppna i popup-läge reCAPTCHA utmaning reCAPTCHA utmaning begärd - Hämta + Hämtning Tillåtna tecken i filnamn Ogiltiga tecken ersätts med detta värde Ersättningstecken @@ -166,8 +166,8 @@ Vill du ta bort det här objektet från sökhistoriken? Huvudsidans innehåll Tom sida - Kiosk sida - Kanal-sida + Kiosksida + Kanalsida Välj en kanal Inga kanal prenumerationer ännu Välj en kiosk @@ -825,4 +825,29 @@ Välj en flödesgrupp Ingen flödesgrupp har skapats ännu Kanalgruppsida + Sök %1$s + Sök %1$s (%2$s) + %sK + %sM + %sB + Gillar + SoundCloud Topp 50-sida borttagen + SoundCloud har lagt ner de ursprungliga topp 50-listorna. Motsvarande flik har tagits bort från din startsida. + YouTubes kombinerade trender har tagits bort + YouTube har upphört med den kombinerade trendsidan från och med den 21 juli 2025. NewPipe ersatte standardtrendsidan med trendiga livestreams.\n\nDu kan också välja olika trendsidor i \"Inställningar > Innehåll > Innehåll på huvudsidan\". + Speltrender + Trendiga poddar + Trendiga filmer och serier + Trendig musik + För att använda Popup Player, välj %1$s i följande Android-inställningsmeny och aktivera %2$s. + \"Tillåt visning över andra appar\" + Ta bort fil + Ta bort post + Konto avslutat\n\n%1$s anger denna anledning: %2$s + Posten borttagen + 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 + HTTP-fel %1$s mottogs från servern under spelning + HTTP-fel 403 mottogs från servern under spelning, troligen orsakat av en IP-avstängning eller problem med deobfuskering av streaming-URL:er + %1$s vägrade att tillhandahålla data och bad om en inloggning för att bekräfta att den som begärde detta inte är en bot.\n\nDin IP-adress kan ha blivit tillfälligt avstängd av %1$s. Du kan vänta en stund eller byta till en annan IP-adress (till exempel genom att slå på/av ett VPN eller genom att byta från WiFi till mobildata). + Detta innehåll är inte tillgängligt för det valda innehållslandet.\n\nÄndra ditt val från \"Inställningar > Innehåll > Standardinnehållsland\". diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index c2cb4669e..01be8d1d2 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -409,4 +409,23 @@ ไม่มี ไม่ ใช่/ตกลง + วิดีโอ + ปิดเสียง + เลิกปิดเสียง + ใหม่ + ฟีด + เพลง + อัลบั้ม + ไม่ต้อง + ล่าสุด + ความคิดเห็น + คำอธิบาย + แนะนำ + หมวดหมู่ + แท็ก + ลิขสิทธิ์ + ภาษา + จัดเรียง + การ์ด + กำลังจะมา diff --git a/app/src/main/res/values-ti/strings.xml b/app/src/main/res/values-ti/strings.xml index f25b86cc1..50a20f494 100644 --- a/app/src/main/res/values-ti/strings.xml +++ b/app/src/main/res/values-ti/strings.xml @@ -52,7 +52,7 @@ ቀዳማይ ወሰን ተጠዋቃ ደገመ ድምጺ ምውራድ ማህደር - ቦኦክማርከድ ዝርዝር-ጸወታ + ዝርዝር-ጸወታት ናይ ድምጺ ፋይል ኣራግፍ ምረጽ ዝጎደለ ኮረ ኣፕፕ ኣውራድ፧ ነባሪ ቅርጺ ድምጺ @@ -94,4 +94,80 @@ ደርፍታት ኣልበማት ስነ-ጥበባውያን + %1$s ድለ + ድለ %1$sን %2$s + ዝርዝር-ጸወታት + ራብዓይ ስጉምቲ መጠወቒ + ሕንፍሽፍሽ + ታሪኽ + ዞባዊ + ኣኼባ + ኣወግድ + ዝርዝር ሓበሬታ + መስርዕ + ተሰሪዑ + ስም ቀያር + ስም + ዓባስ + ኣብ ዝርዝር-ጸወታ ኮነ + ግጡም + ሙሉእ + ስጉሚ + ተቐበል + ንጸግ + ዋላ-ሓደ + ብፍጹም + ዝርዝር + ብዘይ መግለጺ ጽሑፍ + + %s ተራእዩ + %s ተራእዩ + + + %s ተኸታሊ + %s ተኸታተልቲ + + ሓድሽ ዝርዝር ጸወታ + ፍጠር + + %d ሰዓት + %d ሰዓታት + + + %d መዓልቲ + %d መዓልታት + + + %d ካልኢት + %d ካልኢት + + + %d ደቒቕ + %d ደቓይቕ + + እንታይ ሓድሽ ኣሎ + ሓድሽ + ጉጅለታት መስመር + ኩሉ ተጻወቶ + ኣብ ዝመጺእ + ብኸፊል ዝተራእየ + ብምሉእ ዝተራእየ + እዞም ዝስዕቡ ውሕጅታት ኣርእዩ + ዝተሓደሰ ዕለት: %s + ቅልጡፍ ኣገባብ ኣንቅሕ + ዝርዝራት: + ፈተውቲ + ጸላእቲ + ርእይቶታት + መብርሂ + ብድምጺ + እንደገና ፈትን + %sሽ + %sሚ + %sቢ + ጀምር + ደምስስ + ሰሩዞ + ስም ቀያር + ስሕተት diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c1d364226..947d0bcf9 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -830,4 +830,24 @@ %1$s İle Ara (%2$s) SoundCloud Top 50 sayfası kaldırıldı SoundCloud, özgün Top 50 listesini artık yayınlamıyor. İlgili sekme ana sayfanızdan kaldırıldı. + %sK + %sM + %sB + YouTube birleşik trendler kaldırıldı + YouTube, 21 Temmuz 2025\'ten sonra birleşik trendler sayfasını kaldırdı. NewPipe, öntanımlı trendler sayfasını trend canlı akışlarla değiştirdi.\n\n\"Ayarlar > İçerik > Ana sayfanın içeriği\"nden başka trend sayfalar seçebilirsiniz. + Oyun trendleri + Trend podcastler + Trend film ve gösteriler + Trend müzik + Açılır Oynatıcıyı kullanmak için Android ayarlar menüsünden %1$s seçilmeli ve %2$s etkinleştirilmeli. + “Diğer uygulamaların üstünde göstermeye izin ver” + Dosyayı sil + Girdiyi sil + Girdi silindi + Hesap sonlandırıldı\n\n%1$s şu nedeni sağladı: %2$s + Oynatırken sunucudan HTTP 403 hatası alındı, akış URL’si bitmiş ya da IP engellenmiş olabilir + Oynatırken sunucudan HTTP %1$s hatası alındı + Oynatırken sunucudan HTTP 403 hatası alındı, IP engeli ya da akış URL’si çözme sorunları olabilir + %1$s veri sağlamayı geri çevirdi, istekçinin robot olmadığını doğrulaması için oturum açmasını istiyor.\n\n%1$s, IP adresinizi geçici olarak engellemiş olabilir, bir süre bekleyebilir ya da başka IP\'ye geçebilirsiniz (örneğin VPN\'i açıp/kapatarak ya da WiFi\'den mobil veriye geçerek). + Bu içerik şu anda seçili içerik ülkesinde kullanılamıyor.\n\nSeçiminizi \"Ayarlar > İçerik > Öntanımlı içerik ülkesi\"nden değiştirin. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index c0bc903a0..58e62c0d8 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -849,4 +849,24 @@ Пошук %1$s (%2$s) Сторінку SoundCloud Top 50 видалено SoundCloud припинив підтримку оригінальних чартів Топ-50. Відповідну вкладку видалено з вашої головної сторінки. + Видалено об’єднаний тренд YouTube + YouTube припинив підтримку об’єднаної сторінки трендів з 21 липня 2025 року. NewPipe замінив стандартну сторінку трендів на сторінку трендових прямих трансляцій.\n\nВи також можете вибрати різні сторінки трендів у розділі «Налаштування» > «Контент» > «Контент головної сторінки». + Ігрові тренди + Популярні подкасти + Популярні фільми та шоу + Популярна музика + %sтис + %sмлн + %sмлрд + Щоб використовувати спливаючий програвач, виберіть %1$s у наступному меню налаштувань Android та увімкніть %2$s. + “Дозволити показ поверх інших програм” + Видалити файл + Видалити запис + Запис видалено + Обліковий запис заблоковано\n\n%1$s вказує таку причину: %2$s + Під час відтворення від сервера отримано помилку HTTP 403, ймовірно, через закінчення терміну дії URL-адреси потокової передачі або заборону IP-адреси + Помилка HTTP %1$s отримана від сервера під час відтворення + Під час відтворення від сервера отримано помилку HTTP 403, ймовірно, через заборону IP-адреси або проблеми з деобфускацією URL-адреси потокової передачі + %1$s відмовився надати дані, запитуючи логін для підтвердження того, що запитувач не є ботом.\n\nВаша IP-адреса могла бути тимчасово заблокована %1$s. Ви можете почекати деякий час або перейти на іншу IP-адресу (наприклад, увімкнувши/вимкнувши VPN або переключившись з Wi-Fi на мобільні дані). + Цей контент недоступний для вибраної країни контенту.\n\nЗмініть свій вибір у розділі \"Налаштування > Контент > Країна контенту за замовчуванням\". diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index d145991bc..29dcb8c4d 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -6,7 +6,7 @@ Cài đặt Hủy Mở trong trình duyệt - Mở trong chế độ bật lên + Mở trong cửa sổ bật lên Chia sẻ Tải xuống Tìm kiếm @@ -120,7 +120,7 @@ Đã hủy đăng ký kênh Không thể thay đổi tình trạng đăng ký Không thể cập nhật tình trạng đăng ký - Không tìm thấy trình phát trực tuyến nào (bạn có thể cài đặt VLC để phát nó). + Không tìm thấy trình phát trực tuyến nào (bạn có thể cài đặt VLC để phát). Tải tệp luồng về Hiện thông tin Kênh đăng ký @@ -805,4 +805,24 @@ \nBạn có muốn kích hoạt tính năng này không? Cài đặt trong xuất đang được nhập sử dụng định dạng dễ bị tấn công và không được dùng nữa kể từ NewPipe 0.27.0. Đảm bảo rằng bản xuất đang được nhập là từ một nguồn đáng tin cậy và chỉ ưu tiên sử dụng các bản xuất lấy từ NewPipe 0.27.0 hoặc mới hơn trong tương lai. Hỗ trợ nhập cài đặt ở định dạng dễ bị tấn công này sẽ sớm bị xóa hoàn toàn và khi đó các phiên bản cũ của NewPipe sẽ không thể nhập cài đặt xuất từ phiên bản mới nữa. + Tìm kiếm %1$s + Tìm kiếm %1$s (%2$s) + Danh sách phát + %sN + %sTr + %sTỷ + Chọn một nhóm nguồn cấp dữ liệu + Chưa có nhóm nguồn cấp dữ liệu nào được tạo + Trang nhóm kênh + phụ + Thích + Chia sẻ dưới dạng danh sách phát tạm thời của YouTube + SoundCloud 50 trang hàng đầu đã xóa + SoundCloud đã ngừng hiển thị bảng xếp hạng Top 50 ban đầu. Tab tương ứng đã bị xóa khỏi trang chính của bạn. + Đã xóa kết hợp đang thịnh hành của YouTube + YouTube đã ngừng cung cấp trang thịnh hành kết hợp kể từ ngày 21 tháng 7 năm 2025. NewPipe đã thay thế trang xu hướng mặc định bằng các buổi phát trực tiếp theo thịnh hành.\n\nBạn cũng có thể chọn các trang thịnh hành khác nhau trong \"Cài đặt > Nội dung > Nội dung của trang chính\". + Trò chơi thịnh hành + Podcasts đang thịnh hành + Phim và chương trình đang thịnh hành + Âm nhạc đang thịnh hành diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c6e1538ec..0a8c8a944 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -816,4 +816,24 @@ 搜索 %1$s (%2$s) 移除了 SoundCloud Top 50 页面 SoundCloud 已停止发布原创 Top 50 榜单。相应的标签页已从你的主页移除。 + 移除了 Youtube 合并的“时下流行”标签页 + 自 2025.7.21 起, Youtube 下线了合并的“时下流行”标签页。Newpipe 用“时下流行”的直播替代了默认的“时下流行”页。\n\n你也可以在 “设置 > 内容> 主页内容”中选择不同的“时下流行”页。 + “时下流行”的游戏视频 + “时下流行”的播客 + “时下流行”的电影和娱乐节目 + “时下流行”的音乐 + %s千 + %s百万 + %s十亿 + 要使用弹窗播放器,请在接下来的安卓设置中选择 %1$s 并开启 %2$s。 + “允许显示在其他应用上方” + 删除文件 + 删除条目 + 删除了条目 + 账户终止\n\n%1$s 提供了这个原因:%2$s + 播放时从服务器收到 HTTP 403 错误,可能因串流 URL 过期或 IP 封锁导致 + 播放时从服务器收到 HTTP %1$s 错误 + 播放时从服务器收到 HTTP 403 错误,可能因 IP 封锁或串流 URL 解密问题导致 + %1$s 拒绝提供数据, 要求登录确认请求方不是机器人。\n\n你的 IP 可能已经暂时被 %1$s 封禁,你可以等待一段时间或切换到不同 IP (比如开/关 VPN, 或者从 WiFi 连接切换到移动数据)。 + 此内容对当前选中的内容地区不可用。\n\n要更改选择,请前往 “设置 > 内容 > 默认内容地区”。 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 22dd24a33..2ceb296b0 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1,7 +1,7 @@ 發佈於 %1$s - 未找到串流播放器。安裝 VLC? + 找不到串流播放器。是否安裝 VLC? 安裝 取消 以瀏覽器開啟 @@ -14,14 +14,14 @@ 使用外部影片播放器 使用外部音訊播放器 影片下載資料夾 - 下載好的影片檔案會儲存在這裡 + 下載完的影片檔案會儲存在這裡 選擇視訊檔案的下載資料夾 預設解析度 - 用 Kodi 播放 - 顯示用 Kodi 媒體中心播放影片的選項 + 使用 Kodi 播放 + 顯示使用 Kodi 媒體中心播放影片的選項 聲音 要安裝缺少的 Kore 應用程式嗎? - 顯示「用 Kodi 播放」的選項 + 顯示「使用 Kodi 播放」的選項 預設音訊格式 主題 深色 @@ -40,8 +40,8 @@ 不喜歡 音訊下載資料夾 下載好的音訊檔案會儲存在這裡 - 選擇音訊檔的下載資料夾 - 點選放大鏡即可開始。 + 選擇音訊檔案的下載資料夾 + 輕觸放大鏡即可開始。 以懸浮視窗開啟 移除某些解析度的音訊 背景播放 @@ -77,7 +77,7 @@ 資訊: 發生了什麼事: 發生了什麼:\\n請求:\\n內容語言:\\n內容國家:\\n應用程式語言:\\n服務:\\nGMT 時間:\\n套件:\\n版本:\\n系統版本: - 您的留言(請用英語): + 您的留言 (請用英語): 詳細資訊: 影片 音訊 @@ -111,9 +111,9 @@ 搜尋記錄 在本機儲存搜尋記錄 觀看記錄 - 記錄觀看過的影片 + 記錄已觀看的影片 恢復播放 - 在干擾結束後繼續播放(例如有來電) + 在干擾結束後繼續播放 (例如有來電) 播放器 行為 歷史記錄與快取 @@ -133,8 +133,8 @@ 沒有影片 下載 檔案名稱中允許的字元 - 不符合設定的字元將會被替換為此字串 - 替換為 + 無效字元將會被替換為此值 + 替換字元 字母與數字 大部分的特殊字元 關於 NewPipe @@ -145,13 +145,13 @@ Android 上自由且輕巧的串流播放器。 在 GitHub 上檢視 NewPipe 使用的授權條款 - 不管你有什麼點子──翻譯、設計、程式碼整理,或者程式碼撰寫──我們永遠歡迎你來幫忙。完成的越多,NewPipe 也會更好! + 不管您有什麼點子 ── 翻譯、設計、清理或撰寫大量程式碼 ── 我們永遠歡迎您來幫忙。做得越多,NewPipe 就會更好! 閱讀授權條款 貢獻 歷史記錄 歷史記錄 確定要刪除此項搜尋記錄嗎? - 找不到串流播放器(您可以安裝 VLC 來播放)。 + 找不到串流播放器 (您可以安裝 VLC 來播放)。 顯示「長按以新增」提示 預設內容國家 全部播放 @@ -172,7 +172,7 @@ 網站 匯入資料庫 匯出資料庫 - 覆蓋您目前的歷史記錄、訂閱與設定(選用) + 覆寫您目前的歷史記錄、訂閱與設定 (選用) 匯出歷史記錄、訂閱內容、播放清單、設定 回饋 如欲了解更多有關 NewPipe 的資訊和新聞,請造訪我們的網站。 @@ -207,7 +207,7 @@ 正在載入要求的內容 下載串流檔案 顯示資訊 - 書籤播放列表 + 書籤播放清單 新增至 拖曳以重新排序 建立 @@ -238,8 +238,8 @@ 強制報告在處理完片段或活動週期外發生的無法傳遞的 Rx 異常 使用粗略但快速的尋找 粗略的尋找能讓播放器以降低的精確度更快找到影片的進度位置。尋找 5、15 或 25 秒無法與其一同使用 - 自動排序下一個串流 - 透過加入相關的串流來繼續結束的(未重複)播放佇列 + 自動佇列至下一個串流 + 透過加入相關的串流來繼續結束的 (未重複) 播放佇列 檔案 無效的資料夾 無效的檔案或內容來源 @@ -254,17 +254,9 @@ 無法匯入訂閱內容 無法匯出訂閱內容 之前的匯出 - 檔案不存在或讀取或寫入權限不足 - 從 Google Takeout 匯入您的 YouTube 訂閱: -\n -\n1. 移至此網址:%1$s -\n2. 當被提示時登入帳號 -\n3. 按一下「包含所有資料」,接著「取消選取全部」,然後僅勾選「訂閱」並按一下「確定」 -\n4. 按一下「下一步」然後「建立匯出」 -\n5. 在「下載」按鈕出現後按一下它 -\n6. 點擊下方的「匯入檔案」並選取已下載的 zip 檔案 -\n7. [若 zip 匯入失敗] 擷取 .csv 檔案(通常位於「YouTube 與 YouTube Music/訂閱/訂閱.csv」),按一下下方的「匯入檔案」並選取擷取的 csv 檔案 - yourID, soundcloud.com/yourid + 檔案不存在或缺少讀寫檔案的權限 + 從 Google Takeout 匯入您的 YouTube 訂閱: \n \n1. 移至此網址:%1$s \n2. 當被提示時登入帳號 \n3. 按一下「包含所有資料」,接著「取消選取全部」,然後僅勾選「訂閱」並按一下「確定」 \n4. 按一下「下一步」然後「建立匯出」 \n5. 在「下載」按鈕出現後按一下它 \n6. 點擊下方的「匯入檔案」並選取已下載的 zip 檔案 \n7. [若 zip 匯入失敗] 擷取 .csv 檔案 (通常位於「YouTube 與 YouTube Music/訂閱/訂閱.csv」),按一下下方的「匯入檔案」並選取擷取的 csv 檔案 + 您的 ID, soundcloud.com/yourid 請記住,此操作可造成昂貴網路花費。 \n \n您是否希望繼續? @@ -275,13 +267,13 @@ \n3. 當被提示時登入帳號 \n4. 複製您被重新導向到的個人設定檔網址。 已清除圖片快取 - 清除已快取的後設資料 + 清除已快取的詮釋資料 移除所有已快取的網頁資料 - 已清除後設資料快取 + 已清除詮釋資料快取 播放速度控制 節奏 音高 - 解除掛鉤(可能導致失真) + 解除掛鉤 (可能導致失真) 偏好的「開啟」動作 開啟內容時的預設動作 ─ %s 沒有可供下載的串流 @@ -350,7 +342,7 @@ 下載失敗 生成獨特的名稱 覆寫 - 已有此名稱的已下載檔案 + 有已下載的同名檔案 已有進行中的下載與此同名 顯示錯誤 無法建立檔案 @@ -366,7 +358,7 @@ 最大重試次數 在取消下載前的最大嘗試數 在計量收費網路上時中斷 - 在切換到行動數據時很有用(雖然某些下載無法暫停) + 切換到行動數據時很有用,雖然某些下載無法暫停 事件 會議 連線已逾時 @@ -382,8 +374,8 @@ 在清單中顯示播放位置指示器 清除資料 播放位置已刪除 - 檔案已遭移動或刪除 - 與此同名的檔案已存在 + 檔案已被移動或刪除 + 同名的檔案已存在 無法覆寫檔案 已有擱置中的下載與此同名 NewPipe 在處理檔案時被關閉 @@ -416,21 +408,21 @@ %s 位聽眾 快轉/快退搜尋持續時間 - PeerTube 站臺 - 選取您最愛的 PeerTube 站臺 - 在 %s 上找到您喜愛的站臺 - 新增站臺 - 輸入站臺網址 - 無法驗證站臺 + PeerTube 實例 + 選取您最愛的 PeerTube 實例 + 在 %s 上找到您喜歡的實例 + 新增實例 + 輸入實例網址 + 無法驗證實例 僅支援 HTTPS 網址 - 站臺已存在 + 實例已存在 本機 最近新增 最喜歡 - 自動生成(未找到上傳者) + 自動生成 (未找到上傳者) 正在恢復 無法恢復此下載 - 選擇一個站臺 + 選擇一個實例 清除下載歷史記錄 刪除已下載的檔案 給予顯示在其他應用程式上層的權限 @@ -472,20 +464,10 @@ 上次更新後,訂閱被視為過時的時間 ─ %s 總是更新 在可用時從專用 feed 擷取 - 其在某些服務中可用,且通常較快速,但可能只會回傳有限的項目,而且資訊通常不完整(例如:沒有持續時間、項目類型、沒有即時狀態) + 其在某些服務中可用,且通常較快速,但可能只會回傳有限的項目,而且資訊通常不完整 (例如:沒有持續時間、項目類型、沒有即時狀態) 啟用快速模式 停用快速模式 - 您覺得 feed 載入太慢了嗎?如果是的話,試著啟用快速載入(您可以在設定中變更或按下下方的按鈕)。 -\n -\nNewPipe 提供兩個 feed 載入策略: -\n• 擷取整個訂閱頻道,慢但是完整。 -\n• 使用專用的伺服器端點,較快速但是通常不完整。 -\n -\n兩者之間的差別是,較快速的通常缺少部份資訊,如項目的持續時間或類型(無法區分直播影片或一般影片),而且其可能會回傳較少項目。 -\n -\nYouTube 是一種透過其 RSS feed 提供這種快速方式的例子。 -\n -\n因此,請選取您較偏好的:速度或準確的資訊。 + 您覺得 feed 載入太慢了嗎?如果是的話,試著啟用快速載入 (您可以在設定中變更或按下下方的按鈕)。 \n \nNewPipe 提供兩個 feed 載入策略: \n• 擷取整個訂閱頻道,慢但是完整。 \n• 使用專用的伺服器端點,較快速但是通常不完整。 \n \n兩者之間的差別是,較快速的通常缺少部份資訊,如項目的持續時間或類型(無法區分直播影片或一般影片),而且其可能會回傳較少項目。 \n \nYouTube 是一種透過其 RSS feed 提供這種快速方式的例子。 \n \n因此,請選取您較偏好的:速度或準確的資訊。 NewPipe 尚未支援此內容。 \n \n希望它會在未來的版本中支援。 @@ -498,10 +480,9 @@ \n \n如果您想要觀看,請在設定中開啟「%1$s」。 是的,包括已部份觀看的影片 - 在新增到播放清單前和後已觀看的影片將被移除。 -\n您確定嗎?此動作無法復原! + 已觀看過的影片在加入播放清單後將被移除。\n您確定嗎?此動作無法復原! 移除已觀看的影片? - 移除已觀看 + 移除已觀看的影片 來自服務的原始文字將在串流項目中可見 在項目上顯示原始時間 開啟 YouTube 的「嚴格篩選模式」 @@ -530,7 +511,7 @@ 隨機 循環 您可以選取最多三個動作來顯示在簡潔通知中! - 透過輕觸下方的通知來編輯它。使用右側的勾選框,最多可以選取三個在簡潔通知中顯示。 + 透過輕觸下方的通知動作來編輯它們。使用右側的勾選框,最多可以選取三個在簡潔通知中顯示。 第五動作按鈕 第四動作按鈕 第三動作按鈕 @@ -545,8 +526,8 @@ reCAPTCHA cookies 已被清除 清除 reCAPTCHA cookies YouTube 有提供「嚴格篩選模式」,可以隱藏潛在的成人內容 - 顯示可能不適於兒童的內容,因為其有年齡限制(如 18 歲以上等) - 讓 Android 根據縮圖中的主要色彩來自訂通知的顏色(請注意,此功能不是在所有裝置上都能正常運作) + 顯示可能不適於兒童的內容,因為其有年齡限制 (例如 18 歲以上) + 讓 Android 根據縮圖中的主要色彩來自訂通知的顏色 (請注意,此功能並不是在所有裝置上都能正常運作) 彩色通知 於鎖定畫面背景與通知使用縮圖 顯示縮圖 @@ -578,7 +559,7 @@ 下載已經開始 您可以在下方選取您最愛的夜間佈景主題 選取您最愛的夜間佈景主題 ─ %s - 自動(裝置佈景主題) + 自動 (裝置佈景主題) 深色主題 顯示頻道詳細資訊 如果您遇到黑畫面或影片播放停頓的現象,請停用媒體隧道。 @@ -614,11 +595,11 @@ 平板電腦模式 留言已停用 不要顯示 - 低品質(較小) - 高品質(較大) + 低品質 (較小) + 高品質 (較大) 拖動列縮圖預覽 被創作者加心號 - 標記為已看 + 標記為已觀看 在圖片頂部顯示畢卡索彩色絲帶,指示其來源:紅色代表網路、藍色代表磁碟、綠色代表記憶體 顯示圖片指示器 遠端搜尋建議 @@ -646,11 +627,9 @@ 回報錯誤的通知 顯示錯誤 SnackBar 建立錯誤通知 - 找不到適合此動作的檔案管理程式。 -\n請安裝相容於儲存空間存取框架的檔案管理員 - 找不到適合此動作的檔案管理程式。 -\n請安裝檔案管理程式或在下載設定嘗試停用「%s」 - NewPipe 遇到錯誤,點擊以回報 + 找不到適合此動作的檔案管理員。 \n請安裝相容於儲存空間存取框架的檔案管理員 + 找不到適合此動作的檔案管理員。 \n請安裝檔案管理員或在下載設定裡嘗試停用「%s」 + NewPipe 遭遇了一個錯誤,輕觸以回報 發生錯誤,請查看通知 釘選的留言 LeakCanary 無法使用 @@ -691,7 +670,7 @@ 排序 若您在使用此應用程式時遇到任何問題,請務必先看看常見問題的答案! 您正在執行最新版本的 NewPipe - 輕點以下載 %s + 輕觸以下載 %s 快速模式 從三點式選單匯入或匯出訂閱 此選項僅在主題選擇為 %s 時可用 @@ -705,7 +684,7 @@ 移除重複的? 顯示以下串流 顯示/隱藏串流 - 完全觀看 + 完全看完 部份觀看 即將到來 移除重複的 @@ -729,7 +708,7 @@ 原始 配音 描述性 - 變更漸進式內容的載入間隔大小(目前為 %s)。較低的值可能會加速初始載入速度 + 變更漸進式內容的載入間隔大小 (目前為 %s)。較低的值可能會加速初始載入速度 偏好描述性的音訊 若可用,為視障人士選取帶有描述的音訊軌道 無論語言都選取原始音訊軌道 @@ -749,7 +728,7 @@ 頻道頁面上顯示哪些分頁 頻道分頁 短片 - 正在載入後設資料…… + 正在載入詮釋資料…… 擷取頻道分頁 關於 專輯 @@ -792,7 +771,7 @@ 顯示更多 顯示較少 - 透過點擊下面的每個通知操作來編輯它。前三個動作(播放/暫停、上一個與下一個)由系統設定,無法自訂。 + 透過輕觸下方的通知動作來編輯它們。前三個動作 (播放/暫停、上一個與下一個) 由系統設定,無法自訂。 裝置上沒有足夠的空間 備份與還原 重設設定 @@ -816,4 +795,24 @@ 搜尋 %1$s (%2$s) 已移除 SoundCloud Top 50 頁面 SoundCloud 已停止原有的 Top 50 排行榜。對應的標籤已從您的首頁移除。 + %sK + %sM + %sB + 已移除 YouTube 合併熱門 + YouTube 自2025年7月21日起停止使用合併熱門頁面。NewPipe 用熱門直播取代預設熱門頁面。\n\n您也可以在「設定」→「內容」→「首頁內容」中選擇不同的熱門頁面。 + 遊戲熱門 + 熱門 podcast + 熱門電影與節目 + 熱門音樂 + 若要使用彈出式播放器,請在以下 Android 設定選單中選取 %1$s,並啟用 %2$s。 + 「顯示在其他應用程式上層」 + 刪除檔案 + 刪除條目 + 已刪除條目 + 帳號已終止\n\n%1$s 提供了理由:%2$s + 播放時收到來自伺服器的 HTTP 錯誤 403,可能因串流網址過期或 IP 封鎖所致 + 播放時收到來自伺服器的 HTTP 錯誤 %1$s + 播放時收到來自伺服器的 HTTP 錯誤 403,可能因 IP 封鎖或串流網址去混淆化問題所致 + %1$s 拒絕提供資料,要求登入以確認請求者並非機器人。\n\n您的 IP 位址可能已被 %1$s 暫時封鎖,您可稍候片刻或切換至其他 IP 位址(例如開啟/關閉 VPN,或從 Wi-Fi 切換至行動數據)。 + 此內容目前無法於您所選的國家/地區提供。\n\n請至「設定」→「內容」→「預設內容國家」變更您的選擇。 diff --git a/fastlane/metadata/android/bg/changelogs/1000.txt b/fastlane/metadata/android/bg/changelogs/1000.txt new file mode 100644 index 000000000..fea57c3d5 --- /dev/null +++ b/fastlane/metadata/android/bg/changelogs/1000.txt @@ -0,0 +1,13 @@ +Подобрено +• Направи описанието на плейлиста възможно за избиране за показване на повече/по-малко съдържание +• [PeerTube] Поддръжка +`subscribeto.me` инстанцията се свързва автоматично +• Пускай само един обект в екрана за история +Поправено +• Поправи видимостта на RSS бутона +• Поправи сриване на предварителния преглед на полето за търсене +• Поправи показването на обект без обложка +• Поправено е излизането от диалоговия прозорец за изтегляне, преди да се появи +• Поправка на изскачащ прозорец за добавяне в опашката на списък със свързани елементи +• Поправка на реда в диалоговия прозорец за добавяне към плейлиста +• Регулиране на оформлението на елементите от отметките в плейлиста diff --git a/fastlane/metadata/android/bs/changelogs/1000.txt b/fastlane/metadata/android/bs/changelogs/1000.txt new file mode 100644 index 000000000..41bcd963e --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/1000.txt @@ -0,0 +1,13 @@ +Poboljšano +• Opis liste za reprodukciju učinite klikom za prikaz više/manje sadržaja +• [PeerTube] Automatski obrađuje linkove instanci `subscribeto.me` +• Pokreni reprodukciju samo jedne stavke na ekranu historije + +Ispravljeno +• Ispravljena vidljivost RSS dugmeta +• Ispravljeno rušenje pregleda trake za pretraživanje +• Ispravljena stavka bez sličice prilikom dodavanja na listu za reprodukciju +• Ispravljeno izlaženje iz dijaloga za preuzimanje prije nego što se pojavi +• Ispravljen skočni prozor za dodavanje u red čekanja za povezane stavke +• Ispravljen redoslijed u dijalogu za dodavanje na listu za reprodukciju +• Prilagodite raspored stavki označenih na listi za reprodukciju diff --git a/fastlane/metadata/android/bs/changelogs/1001.txt b/fastlane/metadata/android/bs/changelogs/1001.txt new file mode 100644 index 000000000..f798a0a78 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/1001.txt @@ -0,0 +1,6 @@ +Poboljšano +• Uvijek dozvoli promjenu postavki obavještenja igrača na Androidu 13+ + +Ispravljeno +• Ispravljena greška izvoza baze podataka/pretplata koja nije skraćivala već postojeću datoteku, što je moglo dovesti do oštećenja izvoza +• Ispravljeno ponovno pokretanje igrača od početka klikom na vremensku oznaku diff --git a/fastlane/metadata/android/bs/changelogs/1002.txt b/fastlane/metadata/android/bs/changelogs/1002.txt new file mode 100644 index 000000000..5fc0b843a --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/1002.txt @@ -0,0 +1,4 @@ +Ispravljena greška zbog koje YouTube nije reproducirao nijedan tok. + +Ovo izdanje rješava samo najhitniju grešku koja sprječava učitavanje detalja YouTube videa. +Svjesni smo da postoje i drugi problemi i uskoro ćemo objaviti zasebno izdanje kako bismo ih riješili. diff --git a/fastlane/metadata/android/bs/changelogs/1003.txt b/fastlane/metadata/android/bs/changelogs/1003.txt new file mode 100644 index 000000000..45a0e5739 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/1003.txt @@ -0,0 +1,6 @@ +Ovo je hitna ispravka koja ispravlja greške na YouTubeu: +• [YouTube] Ispravljeno neučitavanje informacija o videozapisu, ispravljene greške HTTP 403 prilikom reprodukcije videozapisa i vraćanje reprodukcije nekih videozapisa s ograničenjem za uzrast +• Ispravljena veličina titlova koja se nije mijenjala +• Ispravljeno dvostruko preuzimanje informacija prilikom otvaranja toka +• [Soundcloud] Uklonjeni nereproducirani tokovi zaštićeni DRM-om +• Ažurirani prijevodi diff --git a/fastlane/metadata/android/bs/changelogs/1004.txt b/fastlane/metadata/android/bs/changelogs/1004.txt new file mode 100644 index 000000000..bbd4fb0a0 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/1004.txt @@ -0,0 +1,3 @@ +Ovo izdanje ispravlja problem sa YouTube-om koji pruža samo 360p tok. + +Imajte na umu da je rješenje korišteno u ovoj verziji vjerovatno privremeno i da dugoročno gledano treba implementirati SABR video protokol, ali članovi TeamNewPipe-a su trenutno zauzeti, tako da bi svaka pomoć bila veoma cijenjena! https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/bs/changelogs/1005.txt b/fastlane/metadata/android/bs/changelogs/1005.txt new file mode 100644 index 000000000..4d98c6dac --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/1005.txt @@ -0,0 +1,17 @@ +Novo +• Dodata podrška za Android Auto +• Omogućeno postavljanje grupa feedova kao kartica na glavnom ekranu +• [YouTube] Dijeli kao privremenu listu za reprodukciju +• [SoundCloud] Kartica kanala sa sviđanjima + +Poboljšano +• Bolji savjeti u traci za pretragu +• Prikaz datuma preuzimanja u Preuzimanjema +• Korištenje jezika Androida 13 po aplikaciji + +Ispravljeno +• Ispravljene boje teksta koje ne rade u tamnom režimu +• [YouTube] Ispravljeno liste za reprodukciju koje ne učitavaju više od 100 stavki +• [YouTube] Ispravljeni nedostajući preporučeni videozapisi +• Ispravljeni rušenja u prikazu liste historije +• Ispravljene vremenske oznake u odgovorima na komentare diff --git a/fastlane/metadata/android/bs/changelogs/64.txt b/fastlane/metadata/android/bs/changelogs/64.txt new file mode 100644 index 000000000..f0fff6468 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/64.txt @@ -0,0 +1,8 @@ +### Poboljšanja +- Dodata je mogućnost ograničavanja kvalitete videa ako se koriste mobilni podaci. #1339 +- Zapamti svjetlinu za sesiju #1442 +- Poboljšane performanse preuzimanja za slabije procesore #1431 +- dodana (funkcionalna) podrška za medijsku sesiju #1433 + +### Ispravka +- Ispravljen pad sistema prilikom otvaranja preuzimanja (ispravka je sada dostupna za izdane verzije) #1441 diff --git a/fastlane/metadata/android/bs/changelogs/65.txt b/fastlane/metadata/android/bs/changelogs/65.txt new file mode 100644 index 000000000..9efa1420b --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/65.txt @@ -0,0 +1,26 @@ +### Poboljšanja + +- Onemogućavanje animacije ikone burgermenuja #1486 +- poništavanje brisanja preuzimanja #1472 +- Opcija preuzimanja u meniju za dijeljenje #1498 +- Dodata opcija dijeljenja u meni s dugim dodirom #1454 +- Minimiziranje glavnog playera pri izlasku #1354 +- Ispravka ažuriranja verzije biblioteke i sigurnosne kopije baze podataka #1510 +- Ažuriranje ExoPlayera 2.8.2 #1392 +- Prerađen dijalog za kontrolu brzine reprodukcije radi podrške za različite veličine koraka za bržu promjenu brzine. +- Dodan je prekidač za premotavanje unaprijed tokom tišina u kontroli brzine reprodukcije. Ovo bi trebalo biti korisno za audio knjige i određene muzičke žanrove, a može donijeti zaista besprijekorno iskustvo (i može prekinuti pjesmu s puno tišina =\\). +- Refaktorisana rezolucija izvora medija kako bi se omogućilo interno prosljeđivanje metapodataka uz medije u playeru, umjesto ručnog. Sada imamo jedan izvor metapodataka i direktno je dostupan kada reprodukcija počne. +- Ispravljeni metapodaci udaljene liste za reprodukciju koji se ne ažuriraju kada su novi metapodaci dostupni kada se otvori fragment liste za reprodukciju. +- Razne ispravke korisničkog interfejsa: #1383, kontrole obavještenja u pozadini playera sada su uvijek bijele, lakše je isključiti iskačući player prebacivanjem. +- Koristi se novi ekstraktor s refaktoriranom arhitekturom za više servisa. + +### Ispravke + +- Ispravka #1440 Neispravan raspored informacija o videu #1491 +- Ispravka historije pregleda #1497 +- #1495, ažuriranjem metapodataka (sličica, naslov i broj videa) čim korisnik pristupi listi za reprodukciju. +- #1475, registracijom pregleda u bazi podataka kada korisnik pokrene video na vanjskom playeru na fragmentu detalja. +- Ispravljeno vremensko ograničenje ekrana u slučaju iskačućeg načina rada. #1463 (Ispravljeno #640) +- Ispravka glavnog video playera #1509 +- [#1412] Ispravljen je način ponavljanja koji je uzrokovao NPE playera kada se primi nova namjera dok je aktivnost playera u pozadini. +- Ispravljena je greška minimiziranja playera u iskačući prozor koja ne uništava player kada nije odobrena dozvola za iskačući prozor. diff --git a/fastlane/metadata/android/bs/changelogs/66.txt b/fastlane/metadata/android/bs/changelogs/66.txt new file mode 100644 index 000000000..0562b9059 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/66.txt @@ -0,0 +1,33 @@ +# Dnevnik promjena v0.13.7 + +### Ispravljeno +- Ispravljeni problemi sa filterom sortiranja iz v0.13.6 + +# Dnevnik promjena v0.13.6 + +### Poboljšanja + +- Onemogućena animacija ikone burger menija #1486 +- poništavanje brisanja preuzimanja #1472 +- Opcija preuzimanja u meniju za dijeljenje #1498 +- Dodata opcija dijeljenja u meni dugog dodira #1454 +- Minimiziranje glavnog playera pri izlasku #1354 +- Ispravka ažuriranja verzije biblioteke i sigurnosne kopije baze podataka #1510 +- Ažuriranje ExoPlayera 2.8.2 #1392 +- Prerađen dijalog za kontrolu brzine reprodukcije kako bi se podržale različite veličine koraka za bržu promjenu brzine. +- Dodan je prekidač za premotavanje unaprijed tokom tišina u kontroli brzine reprodukcije. Ovo bi trebalo biti korisno za audio knjige i određene muzičke žanrove i može donijeti zaista besprijekorno iskustvo (i može prekinuti pjesmu s puno tišina =\\). +- Refaktorisana rezolucija izvora medija kako bi se omogućilo interno prosljeđivanje metapodataka zajedno s medijima u playeru, umjesto ručnog. Sada imamo jedan izvor metapodataka i on je direktno dostupan kada počne reprodukcija. +- Ispravljeni metapodaci udaljene liste za reprodukciju koji se nisu ažurirali kada su novi metapodaci dostupni prilikom otvaranja fragmenta liste za reprodukciju. +- Razne ispravke korisničkog interfejsa: #1383, kontrole obavještenja u pozadini playera sada su uvijek bijele, lakše je isključiti iskačući player prebacivanjem. +- Koristi se novi ekstraktor s refaktorisanom arhitekturom za više servisa. + +### Ispravke + +- Ispravka #1440 Neispravan raspored informacija o videu #1491 +- Ispravka historije pregleda #1497 +- #1495, ažuriranjem metapodataka (sličica, naslov i broj videa) čim korisnik pristupi listi za reprodukciju. +- #1475, registracijom pregleda u bazi podataka kada korisnik pokrene video na vanjskom playeru na fragmentu detalja. +- Ispravljeno vremensko ograničenje ekrana u slučaju iskačućeg načina rada. #1463 (Ispravljeno #640) +- Ispravka glavnog video plejera #1509 +- [#1412] Ispravljen je način ponavljanja koji je uzrokovao NPE plejera kada se primi nova namjera dok je aktivnost plejera u pozadini. +- Ispravljeno je minimiziranje plejera u skočni prozor koje nije uništilo plejer kada nije odobrena dozvola za skočni prozor. diff --git a/fastlane/metadata/android/bs/changelogs/68.txt b/fastlane/metadata/android/bs/changelogs/68.txt new file mode 100644 index 000000000..8d1b80a9e --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/68.txt @@ -0,0 +1,31 @@ +# promjene v0.14.1 + +### Ispravljeno +- Ispravljeno neuspješno dešifriranje URL-a videa #1659 +- Ispravljeno nije dobro izdvajanje linka opisa #1657 + +# promjene v0.14.0 + +### Novo +- Novi dizajn ladice #1461 +- Nova prilagodljiva početna stranica #1461 + +### Poboljšanja +- Prerađene kontrole gestikulacije #1604 +- Novi način zatvaranja iskačućeg playera #1597 + +### Ispravljeno +- Ispravljena greška kada broj pretplata nije dostupan. Zatvara se #1649. +- Prikaži "Broj pretplatnika nije dostupan" u tim slučajevima +- Ispravljen NPE kada je YouTube lista za reprodukciju prazna +- Brzo rješenje za kioske u SoundCloudu +- Refaktoriranje i ispravka greške #1623 +- Ispravljen ciklički rezultat pretrage #1562 +- Ispravljena traka za pretraživanje koja nije statički postavljena +- Ispravljeno YT Premium videozapisi nisu ispravno blokirani +- Ispravljeno videozapisi koji se ponekad ne učitavaju (zbog DASH parsiranja) +- Ispravljeni linkovi u opisu videozapisa +- Prikaži upozorenje kada neko pokuša preuzeti na eksternu sd karticu +- ispravljen izuzetak koji se ne prikazuje, a pokreće izvještaj +- sličica se ne prikazuje u pozadinskom playeru za Android 8.1 [pogledajte ovdje](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Ispravljeno registracija prijemnika emitiranja. Zatvoreno #1641. diff --git a/fastlane/metadata/android/bs/changelogs/69.txt b/fastlane/metadata/android/bs/changelogs/69.txt new file mode 100644 index 000000000..27172b680 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/69.txt @@ -0,0 +1,19 @@ +### Novo +- Dugi dodir za brisanje i dijeljenje u pretplatama #1516 +- Korisnički interfejs tableta i raspored mreže #1617 + +### Poboljšanja +- pohranjivanje i ponovno učitavanje posljednjeg korištenog omjera širine i visine #1748 +- Omogućavanje linearnog rasporeda u aktivnosti preuzimanja s punim nazivima videozapisa #1771 +- Brisanje i dijeljenje pretplata direktno iz kartice pretplata #1516 +- Stavljanje u red čekanja sada pokreće reprodukciju videozapisa ako je red čekanja za reprodukciju već završen #1783 +- Odvojene postavke za geste jačine zvuka i svjetline #1644 +- Dodana podrška za lokalizaciju #1792 + +### Ispravke +- Ispravljeno raščlanjivanje vremena za . format, tako da se NewPipe može koristiti u Finskoj +- Ispravljen broj pretplata +- Dodana dozvola za uslugu u prvom planu za API 28+ uređaje #1830 + +### Poznate greške +- Stanje reprodukcije se ne može sačuvati na Android P diff --git a/fastlane/metadata/android/bs/changelogs/70.txt b/fastlane/metadata/android/bs/changelogs/70.txt new file mode 100644 index 000000000..d72ac7a04 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/70.txt @@ -0,0 +1,25 @@ +PAŽNJA: Ova verzija je vjerovatno puna grešaka, baš kao i prethodna. Međutim, zbog potpunog gašenja od verzije 17, bolja je i pokvarena verzija nego nikakva. Zar ne? ¯\_(ツ)_/¯ + +### Poboljšanja +* preuzete datoteke se sada mogu otvoriti jednim klikom #1879 +* ukidanje podrške za Android 4.1 - 4.3 #1884 +* uklanjanje starog plejera #1884 +* uklanjanje tokova iz trenutnog reda čekanja prevlačenjem prsta udesno #1915 +* uklanjanje automatski dodanog toka u red čekanja kada se novi tok ručno doda u red čekanja #1878 +* Naknadna obrada preuzimanja i implementacija nedostajućih funkcija #1759 od @kapodamy +* Infrastruktura naknadne obrade +* Ispravna "infrastruktura" za rukovanje greškama (za program za preuzimanje) +* Stavljanje u red čekanja umjesto više preuzimanja +* Premještanje serijaliziranih preuzimanja na čekanju (`.giga` datoteke) u podatke aplikacije +* Implementacija maksimalnog broja ponovnih pokušaja preuzimanja +* Ispravno pauziranje preuzimanja u više niti +* Zaustavljanje preuzimanja prilikom prebacivanja na mobilnu mrežu (nikada ne radi, pogledajte 2. tačku) +* Sačuvanje broja niti za sljedeća preuzimanja +* Mnogo nedosljednosti ispravljeno + +### Ispravljeno +* Ispravljen pad sistema sa zadanom rezolucijom postavljenom na najbolju i ograničenom rezolucijom mobilnih podataka #1835 +* Ispravljen pad sistema prilikom iskačućeg plejera #1874 +* NPE pri pokušaju otvaranja pozadinskog plejera #1901 +* Ispravljeno umetanje novih tokova kada je omogućeno automatsko stavljanje u red #1878 +* Ispravljen problem sa dešifriranjem i isključivanjem sistema diff --git a/fastlane/metadata/android/bs/changelogs/71.txt b/fastlane/metadata/android/bs/changelogs/71.txt new file mode 100644 index 000000000..28a8ba733 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/71.txt @@ -0,0 +1,10 @@ +### Poboljšanja +* Dodana obavijest o ažuriranju aplikacije za GitHub verziju (#1608 od @krtkush) +* Različita poboljšanja programa za preuzimanje (#1944 od @kapodamy): +* dodane nedostajuće bijele ikone i korištenje ugrađenog načina za promjenu boja ikona +* provjera da li je iterator inicijaliziran (ispravke #2031) +* omogućava ponovni pokušaj preuzimanja s greškom "naknadna obrada nije uspjela" u novom multiplekseru +* novi MPEG-4 multiplekser ispravlja nesinhrone video i audio tokove (#2039) + +### Ispravljeno +* YouTube tokovi uživo prestaju s reprodukcijom nakon kratkog vremena (#1996 od @yausername) diff --git a/fastlane/metadata/android/bs/changelogs/730.txt b/fastlane/metadata/android/bs/changelogs/730.txt new file mode 100644 index 000000000..581435b63 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/730.txt @@ -0,0 +1,2 @@ +# Ispravljeno +- Ispravljena greška funkcije dešifriranja. diff --git a/fastlane/metadata/android/bs/changelogs/740.txt b/fastlane/metadata/android/bs/changelogs/740.txt new file mode 100644 index 000000000..ad72fe828 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/740.txt @@ -0,0 +1 @@ +

Poboljšanja

  • učinite linkove u komentarima klikabilnim, povećajte veličinu teksta
  • traži klikom na linkove vremenskih oznaka u komentarima
  • prikaži preferiranu karticu na osnovu nedavno odabranog stanja
  • dodaje listu pjesama u red čekanja kada se dugo klikne na 'Pozadina' u prozoru liste pjesama
  • traži dijeljeni tekst kada nije URL
  • Dodajte dugme "podijeli u trenutno vrijeme" u glavni video plejer
  • dodajte dugme za zatvaranje u glavni plejer kada se završi red čekanja za video
  • Dodajte "Reproduciraj direktno u pozadini" u meni s dugim pritiskom za stavke liste videozapisa
  • poboljšati engleske prijevode za naredbe Play/Enqueue
  • mala poboljšanja performansi
  • uklonite nekorištene datoteke
  • Ažurirajte ExoPlayer na verziju 2.9.6
  • dodajte podršku za Invidious linkove

Fiksno

  • Ispravljeno skrolovanje sa onemogućenim komentarima i povezanim tokovima
  • ispravljena greška prilikom izvršavanja CheckForNewAppVersionTask-a kada ne bi trebalo
  • Ispravljen uvoz pretplata na YouTube: ignorišite one sa nevažećim URL-om i zadržite one sa praznim naslovom
  • Ispravljen nevažeći YouTube URL: naziv oznake potpisa nije uvijek "potpis", što sprječava učitavanje tokova
diff --git a/fastlane/metadata/android/bs/changelogs/750.txt b/fastlane/metadata/android/bs/changelogs/750.txt new file mode 100644 index 000000000..dd043ae61 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/750.txt @@ -0,0 +1,21 @@ +Novo +Nastavak reprodukcije #2288 +• Nastavite tokove tamo gdje ste prošli put stali +Poboljšanja programa za preuzimanje #2149 +• Koristite okvir za pristup pohrani za pohranu preuzimanja na eksterne SD kartice +• Novi mp4 muxer +• Opcionalno promijenite direktorij za preuzimanje prije početka preuzimanja +• Poštujte mjerene mreže + +Poboljšano +• Uklonjeni gema stringovi #2295 +• Obrađuje promjene (automatske) rotacije tokom životnog ciklusa aktivnosti #2444 +• Učinite menije s dugim pritiskom konzistentnim #2368 + +Ispravljeno +• Ispravljeno neprikazivanje naziva odabrane pjesme s titlovima #2394 +• Nije došlo do pada programa kada provjera ažuriranja aplikacije ne uspije (GitHub verzija) #2423 +• Ispravljena preuzimanja zaglavljena na 99,9% #2440 +• Ažuriranje metapodataka reda čekanja za reprodukciju #2453 +• [SoundCloud] Ispravljen pad programa prilikom učitavanja lista za reprodukciju TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Fiksno trajanje se ne može parsirati TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/bs/changelogs/760.txt b/fastlane/metadata/android/bs/changelogs/760.txt new file mode 100644 index 000000000..ba5f26b1e --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/760.txt @@ -0,0 +1,40 @@ +Promjene u verziji 0.17.1 + +Novo +• Tajlandska lokalizacija + +Poboljšano + +• Ponovo dodana akcija "počni reprodukciju ovdje" u menijima dugog pritiska za liste za reprodukciju #2518 +• Dodan prekidač za SAF / birač starih datoteka #2521 + +Ispravljeno +• Ispravljeni dugmad koja nestaju u prikazu preuzimanja prilikom prebacivanja aplikacija #2487 +• Ispravljena je greška u poziciji reprodukcije koja se pohranjuje iako je historija gledanja onemogućena +• Ispravljene smanjene performanse uzrokovane pozicijom reprodukcije u prikazima liste #2517 +• [Extractor] Ispravljena je ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor #186 +• [Extractor] [YouTube] Ispravljena je slučajna greška u pretrazi kada su liste za reprodukciju u rezultatima TeamNewPipe/NewPipeExtractor #185 + +Promjene u verziji 0.17.0 + +Novo +Nastavak reprodukcije #2288 +• Nastavite tokove tamo gdje ste zadnji put stali +Poboljšanja programa za preuzimanje #2149 +• Koristite okvir za pristup pohrani za pohranjivanje preuzimanja na eksterne SD kartice +• Novi mp4 muxer +• Opcionalno promijenite direktorij za preuzimanje prije početka preuzimanja +• Poštujte mjerene mreže + +Poboljšano +• Uklonjeni gema stringovi #2295 +• Obrađuje promjene (automatske) rotacije tokom životnog ciklusa aktivnosti #2444 +• Učinite menije s dugim pritiskom konzistentnim #2368 + +Ispravljeno +• Ispravljeno ime odabrane numere titlova koje se ne prikazuje #2394 +• Nije došlo do pada programa kada provjera ažuriranja aplikacije ne uspije (GitHub verzija) #2423 +• Ispravljena preuzimanja zaglavljena na 99,9% #2440 +• Ažuriranje metapodataka reda za reprodukciju #2453 +• [SoundCloud] Ispravljen pad programa prilikom učitavanja lista za reprodukciju TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Fiksno trajanje se ne može parsirati TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/bs/changelogs/770.txt b/fastlane/metadata/android/bs/changelogs/770.txt new file mode 100644 index 000000000..e7d35d207 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/770.txt @@ -0,0 +1,4 @@ +Promjene u verziji 0.17.2 + +Ispravka +• Ispravka da nijedan video nije bio dostupan diff --git a/fastlane/metadata/android/bs/changelogs/780.txt b/fastlane/metadata/android/bs/changelogs/780.txt new file mode 100644 index 000000000..6a1074369 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/780.txt @@ -0,0 +1,12 @@ +Promjene u verziji 0.17.3 + +Poboljšano +• Dodata opcija za brisanje stanja reprodukcije #2550 +• Prikaz skrivenih direktorija u biraču datoteka #2591 +• Podrška za otvaranje URL-ova iz instanci `invidio.us` pomoću NewPipe #2488 +• Dodata podrška za URL-ove `music.youtube.com` TeamNewPipe/NewPipeExtractor#194 + +Ispravljeno +• [YouTube] Ispravljen 'java.lang.IllegalArgumentException #192 +• [YouTube] Ispravljen prenos uživo koji nije radio TeamNewPipe/NewPipeExtractor#195 +• Ispravljen problem s performansama u android pie-u prilikom preuzimanja prenosa #2592 diff --git a/fastlane/metadata/android/bs/changelogs/790.txt b/fastlane/metadata/android/bs/changelogs/790.txt new file mode 100644 index 000000000..28ec38810 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/790.txt @@ -0,0 +1,14 @@ +Poboljšano +• Dodavanje više naslova radi poboljšanja pristupačnosti za slijepe osobe #2655 +• Učiniti jezik postavki mape za preuzimanje konzistentnijim i manje dvosmislenim #2637 + +Ispravljeno +• Provjera da li je posljednji bajt u bloku preuzet #2646 +• Ispravljeno pomicanje u fragmentu detalja videa #2672 +• Uklanjanje dvostrukih animacija okvira za brisanje pretrage u jednu #2695 +• [SoundCloud] Ispravljanje ekstrakcije client_id-a #2745 + +Razvoj +• Dodavanje nedostajućih zavisnosti naslijeđenih iz NewPipeExtractor-a u NewPipe #2535 +• Migracija na AndroidX #2685 +• Ažuriranje na ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/bs/changelogs/800.txt b/fastlane/metadata/android/bs/changelogs/800.txt new file mode 100644 index 000000000..d3f8d5736 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/800.txt @@ -0,0 +1,27 @@ +Novo +• Podrška za PeerTube bez P2P-a (#2201) [Beta]: +◦ Gledajte i preuzimajte videozapise s PeerTube instanci +◦ Dodajte instance u postavkama za pristup cijelom PeerTube svijetu +◦ Moguće je da postoje problemi s SSL handshake-ovima na Androidu 4.4 i 7.1 prilikom pristupa određenim instancama, što rezultira mrežnom greškom. + +• Downloader (#2679): +◦ Izračunaj etalon preuzimanja (ETA) +◦ Preuzmi opus (webm datoteke) kao ogg +◦ Oporavi istekle linkove za preuzimanje kako bi se nastavilo preuzimanje nakon duge pauze + +Poboljšano +• Učini KioskFragment svjesnim promjena u željenoj zemlji sadržaja i poboljšaj performanse svih glavnih kartica #2742 +• Koristi nove implementacije lokalizacije i downloadera iz ekstraktora #2713 +• Učini niz "Default kiosk" prevodivim +• Crna navigacijska traka za crnu temu #2569 + +Ispravljeno +• Ispravljena greška koja nije mogla pomicati popup player ako je drugi prst postavljen tokom pomicanja popup playera #2772 +• Omogući liste za reprodukciju kojima nedostaje uploader i ispravi padove povezane s ovim problemom #2724, TeamNewPipe/NewPipeExtractor#219 +• Omogući TLS1.1/1.2 na Android 4.4 uređajima (API 19/KitKat) za ispravljanje TLS rukovanja s MediaCCC i nekim PeerTube instance #2792 +• [SoundCloud] Ispravljena ekstrakcija client_id-a TeamNewPipe/NewPipeExtractor #217 +• [SoundCloud] Ispravljena ekstrakcija audio toka + +Razvoj +• Ažuriranje ExoPlayera na 2.10.8 #2791, #2816 +• Ažuriranje Gradlea na 3.5.1 i dodavanje podrške za Kotlin #2714 diff --git a/fastlane/metadata/android/bs/changelogs/810.txt b/fastlane/metadata/android/bs/changelogs/810.txt new file mode 100644 index 000000000..52d9defbf --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/810.txt @@ -0,0 +1,20 @@ +Novo +• Prikaz minijature videa na zaključanom ekranu prilikom reprodukcije u pozadini + +Poboljšano + +• Dodavanje lokalne liste za reprodukciju u red čekanja prilikom dugog pritiska na dugme za pozadinu / skočni prozor +• Omogućavanje pomicanja kartica glavne stranice i njihovo skrivanje kada postoji samo jedna kartica +• Ograničavanje broja ažuriranja minijatura obavještenja u pozadinskom playeru +• Dodavanje lažne minijature za prazne lokalne liste za reprodukciju +• Korištenje ekstenzije datoteke *.opus umjesto *.webm i prikaz "opus" u oznaci formata umjesto "WebM Opus" u padajućem izborniku za preuzimanje +• Dodavanje dugmeta za brisanje preuzetih datoteka ili historije preuzimanja u "Preuzimanja" +• [YouTube] Dodana podrška za linkove kanala /c/shortened_url + +Ispravljeno +• Ispravljeno više problema prilikom dijeljenja videa na NewPipe i direktnog preuzimanja njegovih tokova +• Ispravljen pristup playeru izvan teme njegovog kreiranja +• Ispravljeno podjeljivanje rezultata pretrage +• [YouTube] Ispravljeno prebacivanje na null što je uzrokovalo NPE +• [YouTube] Ispravljeno pregledavanje komentara prilikom otvaranja invidio.us URL-a +• [SoundCloud] Ažuriran client_id diff --git a/fastlane/metadata/android/bs/changelogs/820.txt b/fastlane/metadata/android/bs/changelogs/820.txt new file mode 100644 index 000000000..ad9f1a5c2 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/820.txt @@ -0,0 +1 @@ +Ispravljen je regularni izraz naziva funkcije dešifriranja koji je YouTube činio neupotrebljivim. diff --git a/fastlane/metadata/android/bs/changelogs/830.txt b/fastlane/metadata/android/bs/changelogs/830.txt new file mode 100644 index 000000000..b4ba761fe --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/830.txt @@ -0,0 +1 @@ +Ažuriran je SoundCloud client_id kako bi se riješili problemi sa SoundCloudom. diff --git a/fastlane/metadata/android/bs/changelogs/840.txt b/fastlane/metadata/android/bs/changelogs/840.txt new file mode 100644 index 000000000..7820b4d05 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/840.txt @@ -0,0 +1,22 @@ +Novo +• Dodan je birač jezika za promjenu jezika aplikacije +• Dodano je dugme "pošalji na Kodi" u sklopivi meni plejera +• Dodana je mogućnost kopiranja komentara dugim pritiskom + +Poboljšano +• Ispravljena je ReCaptcha aktivnost i ispravno spremanje dobijenih kolačića +• Uklonjen je meni s tačkama u korist dugmeta "ladica" i "sakrivanje historije" kada historija gledanja nije omogućena u postavkama +• Ispravno traženje dozvole za prikaz preko drugih aplikacija u postavkama na Androidu 6 i novijim verzijama +• Preimenovanje lokalne liste za reprodukciju dugim klikom u BookmarkFragmentu +• Različita poboljšanja PeerTubea +• Poboljšano je nekoliko izvornih nizova na engleskom jeziku + +Ispravljeno +• Ispravljeno je ponovno pokretanje plejera iako je pauziran kada je omogućena opcija "minimiziraj pri prebacivanju aplikacija" i NewPipe je minimiziran +• Ispravljena je početna vrijednost svjetline za gestu +• Ispravljena su preuzimanja .srt titlova koja nisu sadržavala sve prijelome reda +• Ispravljeno je neuspješno preuzimanje na SD karticu jer neki Android 5 uređaji nisu kompatibilni sa CTF-om +• Ispravljeno je preuzimanje na Android KitKat-u +• Ispravljena je oštećena video .mp4 datoteka koja se prepoznaje kao audio datoteka +• Ispravljeni su višestruki problemi s lokalizacijom, uključujući pogrešne kineske jezičke kodove +• [YouTube] Vremenske oznake u opisu su ponovo dostupne za klikanje diff --git a/fastlane/metadata/android/bs/changelogs/850.txt b/fastlane/metadata/android/bs/changelogs/850.txt new file mode 100644 index 000000000..4f8c080f9 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/850.txt @@ -0,0 +1 @@ +U ovom izdanju ažurirana je verzija YouTube web stranice. Stara verzija web stranice bit će ukinuta u martu i stoga je potrebno nadograditi NewPipe. diff --git a/fastlane/metadata/android/bs/changelogs/860.txt b/fastlane/metadata/android/bs/changelogs/860.txt new file mode 100644 index 000000000..a2f051bb6 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/860.txt @@ -0,0 +1,7 @@ +Poboljšano +• Spremanje i vraćanje bez obzira da li su visina tona i tempo otkačeni ili ne +• Podrška za izrezivanje ekrana u playeru +• Kružni prikaz i broj pretplatnika +• Optimizovan YouTube za korištenje manje podataka + +U ovom izdanju ispravljeno je više od 15 grešaka povezanih s YouTubeom. diff --git a/fastlane/metadata/android/bs/changelogs/870.txt b/fastlane/metadata/android/bs/changelogs/870.txt new file mode 100644 index 000000000..3706dc130 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/870.txt @@ -0,0 +1,2 @@ +Ovo je hitna ispravka koja ažurira NewPipe kako bi se ponovo omogućilo korištenje SoundClouda bez većih problema. +SoundCloudov v2 API se sada koristi u ekstraktoru, a detekcija nevažećih ID-ova klijenata je poboljšana. diff --git a/fastlane/metadata/android/bs/changelogs/900.txt b/fastlane/metadata/android/bs/changelogs/900.txt new file mode 100644 index 000000000..c9a2c544d --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/900.txt @@ -0,0 +1,15 @@ +Novo +• Grupe pretplata i sortirani feedovi +• Dugme za isključivanje zvuka u playerima + +Poboljšano + +• Omogućeno otvaranje linkova music.youtube.com i media.ccc.de u NewPipe-u +• Premještanje dvije postavke iz Izgled u Sadržaj +• Sakrivanje opcija pretraživanja od 5, 15, 25 sekundi ako je omogućeno neprecizno pretraživanje + +Ispravljeno +• neki WebM videozapisi se ne mogu pretraživati +• sigurnosna kopija baze podataka na Android P +• rušenje prilikom dijeljenja preuzete datoteke +• mnoštvo problema s ekstrakcijom YouTubea i još mnogo toga ... diff --git a/fastlane/metadata/android/bs/changelogs/910.txt b/fastlane/metadata/android/bs/changelogs/910.txt new file mode 100644 index 000000000..d287ea12e --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/910.txt @@ -0,0 +1 @@ +Ispravljena migracija baze podataka koja je u nekim rijetkim slučajevima sprečavala pokretanje NewPipe-a. diff --git a/fastlane/metadata/android/bs/changelogs/920.txt b/fastlane/metadata/android/bs/changelogs/920.txt new file mode 100644 index 000000000..b79042d51 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/920.txt @@ -0,0 +1,9 @@ +Poboljšano + +• Dodan datum otpremanja i broj pregleda za stavke mreže toka +• Poboljšanja za raspored zaglavlja ladice + +Ispravljeno + +• Ispravljeno dugme za isključivanje zvuka koje je uzrokovalo pad sistema na API 19 +• Ispravljeno preuzimanje dugih 1080p 60fps videa diff --git a/fastlane/metadata/android/bs/changelogs/930.txt b/fastlane/metadata/android/bs/changelogs/930.txt new file mode 100644 index 000000000..3ab5b5d04 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/930.txt @@ -0,0 +1,20 @@ +Novo +• Pretraga na YouTube Musicu +• Osnovna podrška za Android TV + +Poboljšano + +• Dodana je mogućnost uklanjanja svih gledanih videa s lokalne liste za reprodukciju +• Prikaz poruke kada sadržaj još nije podržan umjesto rušenja +• Poboljšana promjena veličine skočnog playera gestama štipanja +• Stavljanje tokova u red čekanja dugim pritiskom na pozadinu i skočne dugmad u kanalu +• Poboljšano rukovanje veličinom naslova zaglavlja ladice + +Ispravljeno +• Ispravljena postavka sadržaja s ograničenjem prema dobi koja nije radila +• Ispravljene određene vrste reCAPTCHA-a +• Ispravljen pad prilikom otvaranja oznaka dok je lista za reprodukciju `null` +• Ispravljeno otkrivanje izuzetaka povezanih s mrežom +• Ispravljena vidljivost dugmeta za sortiranje grupe u fragmentu pretplata + +i više diff --git a/fastlane/metadata/android/bs/changelogs/940.txt b/fastlane/metadata/android/bs/changelogs/940.txt new file mode 100644 index 000000000..28f0ab256 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/940.txt @@ -0,0 +1,16 @@ +Novo +• Dodana podrška za komentare na SoundCloudu +• Dodana postavka ograničenog načina rada na YouTubeu +• Prikaz detalja nadređenog kanala na PeerTubeu + +Poboljšano +• Prikaz dugmeta Kore samo za podržane usluge +• Blokiranje gestova igrača koji počinju na navigacijskoj traci ili statusnoj traci +• Promjena boje pozadine dugmadi za ponovni pokušaj i pretplatu na osnovu boje usluge + +Ispravljeno +• Ispravljeno zamrzavanje dijaloga za preuzimanje +• Dugme "Otvori u pregledniku" sada se zaista otvara u pregledniku +• Ispravljeno rušenje sistema pri otvaranju videa i "Nije moguće reproducirati ovaj tok" + +i još mnogo toga diff --git a/fastlane/metadata/android/bs/changelogs/950.txt b/fastlane/metadata/android/bs/changelogs/950.txt new file mode 100644 index 000000000..d3dc135a1 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/950.txt @@ -0,0 +1,4 @@ +Ovo izdanje donosi tri male ispravke: +• Ispravljen pristup pohrani na Androidu 10+ +• Ispravljeno otvaranje kioska +• Ispravljeno parsiranje dužih videa diff --git a/fastlane/metadata/android/bs/changelogs/951.txt b/fastlane/metadata/android/bs/changelogs/951.txt new file mode 100644 index 000000000..72077d172 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/951.txt @@ -0,0 +1,17 @@ +Novo +• Dodan je alat za odabir pretplata u dijalogu grupe feedova +• Dodan je filter u dijalog grupe feedova kako bi se prikazale samo negrupirane pretplate +• Dodana je kartica liste za reprodukciju na glavnu stranicu +• Premotavanje naprijed/nazad u pozadini/u redu čekanja playera +• Prikaz prijedloga za pretragu: da li ste mislili na & prikaz rezultata za + +Poboljšano +• Izostavljanje metapodataka aplikacije za pisanje u multipliciranim datotekama +• Ne uklanjanje neuspjelih tokova iz reda čekanja +• Ažuriranje boje statusne trake da odgovara boji alatne trake + +Ispravljeno +• Ispravljena je desinkronizacija zvuka/videa uzrokovana kumulativnim greškama s pomičnim zarezom +• [PeerTube] Obrada izbrisanih komentara + +i više diff --git a/fastlane/metadata/android/bs/changelogs/952.txt b/fastlane/metadata/android/bs/changelogs/952.txt new file mode 100644 index 000000000..9c8b5c617 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/952.txt @@ -0,0 +1,7 @@ +Poboljšano +• Automatska reprodukcija je dostupna za sve usluge (umjesto samo za YouTube) + +Ispravljeno +• Ispravljeni povezani tokovi podrškom za nove YouTube nastavke +• Ispravljeni YouTube videozapisi s ograničenjem za određene uzraste +• [Android TV] Ispravljeno dugotrajno preklapanje istaknutog fokusa diff --git a/fastlane/metadata/android/bs/changelogs/953.txt b/fastlane/metadata/android/bs/changelogs/953.txt new file mode 100644 index 000000000..075e3f47e --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/953.txt @@ -0,0 +1 @@ +Ispravljena ekstrakcija funkcije dešifriranja na YouTubeu. diff --git a/fastlane/metadata/android/bs/changelogs/954.txt b/fastlane/metadata/android/bs/changelogs/954.txt new file mode 100644 index 000000000..7a57794fa --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/954.txt @@ -0,0 +1,10 @@ +• novi tijek rada aplikacije: reproducirajte videozapise na stranici s detaljima, prevucite prema dolje da biste minimizirali player + +• MediaStyle obavještenja: prilagodljive radnje u obavještenjima, poboljšanja performansi +• osnovna promjena veličine pri korištenju NewPipe-a kao desktop aplikacije + +• prikaži dijalog s otvorenim opcijama u slučaju nepodržanog URL tosta +• Poboljšano iskustvo prijedloga za pretraživanje kada se udaljeni URL-ovi ne mogu dohvatiti +• Povećan zadani kvalitet videozapisa na 720p60 (player u aplikaciji) i 480p (skočni player) + +• mnoštvo ispravki grešaka i još mnogo toga diff --git a/fastlane/metadata/android/bs/changelogs/955.txt b/fastlane/metadata/android/bs/changelogs/955.txt new file mode 100644 index 000000000..560aac290 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/955.txt @@ -0,0 +1,3 @@ +[YouTube] Ispravljena pretraga za neke korisnike +[YouTube] Ispravljeni izuzeci slučajnog dešifriranja +[SoundCloud] URL-ovi koji završavaju kosom crtom sada se ispravno parsiraju diff --git a/fastlane/metadata/android/bs/changelogs/956.txt b/fastlane/metadata/android/bs/changelogs/956.txt new file mode 100644 index 000000000..b153534eb --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/956.txt @@ -0,0 +1 @@ +[YouTube] Ispravljen pad aplikacije prilikom učitavanja bilo kojeg videa diff --git a/fastlane/metadata/android/bs/changelogs/957.txt b/fastlane/metadata/android/bs/changelogs/957.txt new file mode 100644 index 000000000..9bfe5ddd9 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/957.txt @@ -0,0 +1,10 @@ +• Ujedinite specifične radnje stavljanja u red u jednu +• Gesta dva prsta za zatvaranje playera +• Omogućite brisanje reCAPTCHA kolačića +• Opcija da se obavještenja ne oboje +• Poboljšajte način otvaranja detalja videa kako biste riješili beskonačno baferovanje, greške prilikom dijeljenja na NewPipe i druge nedosljednosti +• Ubrzajte YouTube videozapise i ispravite one s ograničenjem po uzrastu +• Ispravite pad sistema prilikom premotavanja unaprijed/unazad +• Nemojte preuređivati liste povlačenjem sličica +• Uvijek pamtite svojstva skočnih prozora +• Dodan je santalski jezik diff --git a/fastlane/metadata/android/bs/changelogs/958.txt b/fastlane/metadata/android/bs/changelogs/958.txt new file mode 100644 index 000000000..381065d98 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/958.txt @@ -0,0 +1,15 @@ +Novo i poboljšano: +• Ponovno dodana opcija za skrivanje sličice na zaključanom ekranu +• Povlačenje za osvježavanje feeda +• Poboljšane performanse prilikom preuzimanja lokalnih lista + +Ispravljeno: +• Ispravljen pad sistema prilikom pokretanja NewPipe-a nakon što je uklonjen iz RAM-a +• Ispravljen pad sistema prilikom pokretanja kada nema internet veze +• Ispravljeno u vezi s postavkama gestova za svjetlinu i jačinu zvuka +• [YouTube] Ispravljene duge liste reprodukcije + +Ostalo: +• Čišćenje koda i nekoliko internih poboljšanja +• Ažuriranja zavisnosti +• Ažuriranja prevoda diff --git a/fastlane/metadata/android/bs/changelogs/959.txt b/fastlane/metadata/android/bs/changelogs/959.txt new file mode 100644 index 000000000..4764f3fea --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/959.txt @@ -0,0 +1,3 @@ +Ispravljen beskonačan niz rušenja sistema nakon otvaranja izvještaja o greškama. +Ažurirana lista PeerTube instanci koje NewPipe može automatski otvoriti. +Ažurirani prijevodi. diff --git a/fastlane/metadata/android/bs/changelogs/960.txt b/fastlane/metadata/android/bs/changelogs/960.txt new file mode 100644 index 000000000..8c503be87 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/960.txt @@ -0,0 +1,3 @@ +• Poboljšan opis opcije izvoza baze podataka u postavkama. +• Ispravljeno parsiranje komentara na YouTubeu. +• Ispravljeno ime za prikaz servisa media.ccc.de. • Ažurirani prijevodi. diff --git a/fastlane/metadata/android/bs/changelogs/961.txt b/fastlane/metadata/android/bs/changelogs/961.txt new file mode 100644 index 000000000..dfe9db359 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/961.txt @@ -0,0 +1,12 @@ +• [YouTube] Podrška za Mix +• [YouTube] Prikaz informacija o javnim emiterima i Covid-19 +• [media.ccc.de] Dodani nedavni videozapisi +• Dodan prijevod na somalski jezik + +• Mnoga interna poboljšanja + +• Ispravljeno dijeljenje videozapisa iz playera +• Ispravljen prazan ReCaptcha web prikaz +• Ispravljen pad aplikacije koji se javljao prilikom uklanjanja toka s liste +• [PeerTube] Ispravljeni povezani tokovi +• [YouTube] Ispravljena pretraga YouTube muzike diff --git a/fastlane/metadata/android/bs/changelogs/962.txt b/fastlane/metadata/android/bs/changelogs/962.txt new file mode 100644 index 000000000..72c26f1be --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/962.txt @@ -0,0 +1,2 @@ +Dodani "nedavni" videozapisi na servis media.ccc.de. +Dodani su prijenosi uživo na servis media.ccc.de, kao i podrška za prijenos uživo. diff --git a/fastlane/metadata/android/bs/changelogs/963.txt b/fastlane/metadata/android/bs/changelogs/963.txt new file mode 100644 index 000000000..1799936e5 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/963.txt @@ -0,0 +1 @@ +• [YouTube] Ispravljen nastavak kanala diff --git a/fastlane/metadata/android/bs/changelogs/964.txt b/fastlane/metadata/android/bs/changelogs/964.txt new file mode 100644 index 000000000..3fd416ae6 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/964.txt @@ -0,0 +1,8 @@ +• Dodana podrška za poglavlja u kontrolama playera +• [PeerTube] Dodana pretraga u sepia boji +• Ponovo dodano dugme za dijeljenje u detaljnom prikazu videa i opis toka premješten u raspored kartica +• Onemogućeno vraćanje svjetline ako je gesta za svjetlinu onemogućena +• Dodana stavka liste za reprodukciju videa na Kodiju +• Ispravljen pad sistema kada na nekim uređajima nije postavljen zadani preglednik i poboljšani su dijalozi za dijeljenje +• Uključivanje/isključivanje reprodukcije/pauze pomoću hardverskog dugmeta za razmak u playeru preko cijelog ekrana +• [media.ccc.de] Razne ispravke i poboljšanja diff --git a/fastlane/metadata/android/bs/changelogs/965.txt b/fastlane/metadata/android/bs/changelogs/965.txt new file mode 100644 index 000000000..f010b66cb --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/965.txt @@ -0,0 +1,6 @@ +Ispravljen pad sistema koji se javljao prilikom promjene redoslijeda grupa kanala. +Ispravljeno dobijanje više YouTube videa sa kanala i plejlista. +Ispravljeno dobijanje YouTube komentara. +Dodana je podrška za podputanje /watch/, /v/ i /w/ u YouTube URL-ovima. +Ispravljeno izdvajanje SoundCloud klijentskog ID-a i geo-ograničenog sadržaja. +Dodana je lokalizacija za sjeverni kurdski jezik. diff --git a/fastlane/metadata/android/bs/changelogs/966.txt b/fastlane/metadata/android/bs/changelogs/966.txt new file mode 100644 index 000000000..7f47d9ac9 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/966.txt @@ -0,0 +1,14 @@ +Novo: +• Dodana nova usluga: Bandcamp + +Poboljšano: +• Dodana opcija da aplikacija prati temu uređaja +• Spriječeni su neki rušenji prikazivanjem poboljšane ploče s greškama +• Prikaz više informacija o tome zašto sadržaj nije dostupan +• Dugme za razmak na hardveru pokreće reprodukciju/pauzu +• Prikaz tosta "Preuzimanje započeto" + +Ispravljeno: +• Ispravljena je vrlo mala sličica u detaljima videa tokom reprodukcije u pozadini +• Ispravljen je prazan naslov u minimiziranom playeru +• Ispravljena je greška zbog koje se posljednji način promjene veličine nije ispravno vraćao diff --git a/fastlane/metadata/android/bs/changelogs/967.txt b/fastlane/metadata/android/bs/changelogs/967.txt new file mode 100644 index 000000000..039051547 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/967.txt @@ -0,0 +1 @@ +Ispravljen je problem sa neispravnim radom YouTubea u EU. Uzrok tome je bio novi sistem za pristanak na kolačiće i privatnost koji zahtijeva da NewPipe postavi kolačić PRISTANAK. diff --git a/fastlane/metadata/android/bs/changelogs/968.txt b/fastlane/metadata/android/bs/changelogs/968.txt new file mode 100644 index 000000000..d7e5be7b4 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/968.txt @@ -0,0 +1,7 @@ +Dodana je opcija za detalje kanala u meni s dugim pritiskom. +Dodana je funkcionalnost preimenovanja naziva liste za reprodukciju iz sučelja liste za reprodukciju. +Omogućeno korisniku pauziranje dok se video učitava. +Dotjerana je bijela tema. +Ispravljeno preklapanje fontova pri korištenju veće veličine fonta. +Ispravljen je problem s nedostatkom videa na Formuler i Zephier uređajima. +Ispravljeni su razni padovi sistema. diff --git a/fastlane/metadata/android/bs/changelogs/969.txt b/fastlane/metadata/android/bs/changelogs/969.txt new file mode 100644 index 000000000..804873f1e --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/969.txt @@ -0,0 +1,8 @@ +• Dozvoljena instalacija na eksternu memoriju +• [Bandcamp] Dodata podrška za prikaz prva tri komentara na toku +• Prikaži samo obavijest 'preuzimanje je počelo' kada je preuzimanje pokrenuto +• Ne postavljaj reCaptcha kolačić kada nema pohranjenih kolačića +• [Player] Poboljšane performanse keša +• [Player] Ispravljena greška u reprodukciji u plejeru +• Odbaci prethodne Snackbarove prilikom brisanja preuzimanja +• Ispravljen pokušaj brisanja objekta koji nije na listi diff --git a/fastlane/metadata/android/bs/changelogs/970.txt b/fastlane/metadata/android/bs/changelogs/970.txt new file mode 100644 index 000000000..414f6c9c6 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/970.txt @@ -0,0 +1,11 @@ +Novo +• Prikaz metapodataka sadržaja (oznake, kategorije, licenca, ...) ispod opisa +• Dodana opcija "Prikaži detalje kanala" u udaljenim (nelokalnim) listama za reprodukciju +• Dodana opcija "Otvori u pregledniku" u meni s dugim pritiskom + +Ispravljeno +• Ispravljen pad sistema prilikom rotacije na stranici s detaljima videa +• Ispravljeno dugme "Reproduciraj s Kodijem" u playeru koje uvijek traži instalaciju Kore-a +• Ispravljeno i poboljšano podešavanje putanja uvoza i izvoza +• [YouTube] Ispravljen broj lajkova za komentare +I još mnogo toga diff --git a/fastlane/metadata/android/bs/changelogs/971.txt b/fastlane/metadata/android/bs/changelogs/971.txt new file mode 100644 index 000000000..f49116929 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/971.txt @@ -0,0 +1,3 @@ +Hitna ispravka +• Povećanje bafera za reprodukciju nakon ponovnog baferovanja +• Ispravljen pad sistema na tabletima i televizorima prilikom klika na ikonu reda za reprodukciju u plejeru diff --git a/fastlane/metadata/android/bs/changelogs/972.txt b/fastlane/metadata/android/bs/changelogs/972.txt new file mode 100644 index 000000000..e422201cf --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/972.txt @@ -0,0 +1,14 @@ +Novo +Prepoznavanje vremenskih oznaka i hashtagova u opisu +Dodano ručno podešavanje tablet režima +Dodana mogućnost skrivanja reprodukovanih stavki u feedu + +Poboljšano +Ispravno podržavanje okvira za pristup pohrani +Bolje rukovanje greškama nedostupnih i prekinutih kanala +Android tabela za dijeljenje za korisnike Androida 10+ sada prikazuje naslov sadržaja. +Ažurirane su Invidious instance i podrška za preusmjerene linkove. + +Ispravljeno +[YouTube] Sadržaj ograničen prema dobi +Spriječen izuzetak curenja prozora prilikom otvaranja dijaloga za izbor diff --git a/fastlane/metadata/android/bs/changelogs/973.txt b/fastlane/metadata/android/bs/changelogs/973.txt new file mode 100644 index 000000000..0e78a352e --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/973.txt @@ -0,0 +1,4 @@ +Hitna ispravka +• Ispravljene sličice i naslovi koji su se skraćivali u rasporedu mreže, zbog pogrešnog izračuna koliko videozapisa može stati u jedan red +• Ispravljen dijalog za preuzimanje koji je nestajao bez ikakve radnje ako se otvori iz menija za dijeljenje +• Ažurirana biblioteka povezana s otvaranjem vanjskih aktivnosti kao što je birač datoteka Storage Access Frameworka diff --git a/fastlane/metadata/android/bs/changelogs/974.txt b/fastlane/metadata/android/bs/changelogs/974.txt new file mode 100644 index 000000000..991a16e09 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/974.txt @@ -0,0 +1,5 @@ +Hitna ispravka +• Ispravljeni problemi s baferovanjem uzrokovani ograničavanjem YouTubea +• Ispravljeno izdvajanje komentara na YouTubeu i rušenja aplikacije s onemogućenim komentarima +• Ispravljena pretraga muzike na YouTubeu +• Ispravljeni prenosi uživo na PeerTubeu diff --git a/fastlane/metadata/android/bs/changelogs/975.txt b/fastlane/metadata/android/bs/changelogs/975.txt new file mode 100644 index 000000000..ab5edb692 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/975.txt @@ -0,0 +1,17 @@ +Novo +• Prikaz pregleda sličice tokom pretraživanja +• Detekcija onemogućenih komentara +• Omogućeno označavanje stavke feeda kao gledane +• Prikaz srca u komentarima + +Poboljšano +• Poboljšan raspored metapodataka i oznaka +• Primjena boje usluge na UI komponente + +Ispravljeno +• Ispravljena sličica u mini playeru +• Ispravljeno beskonačno baferovanje duplih stavki reda čekanja +• Neke ispravke playera poput rotacije i bržeg zatvaranja +• Ispravljena ReCAPTCHA koja ostaje učitana u pozadini +• Onemogući klikove prilikom osvježavanja feeda +• Ispravljeni neki padovi preuzimanja diff --git a/fastlane/metadata/android/bs/changelogs/976.txt b/fastlane/metadata/android/bs/changelogs/976.txt new file mode 100644 index 000000000..86abfacf2 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/976.txt @@ -0,0 +1,10 @@ +• Dodana je opcija za direktno otvaranje playera preko cijelog ekrana +• Omogućen je odabir vrsta prijedloga za pretragu koji će se prikazivati +• Tamna tema je sada tamnija + dodan je tamniji početni ekran +• Poboljšan birač datoteka za sivo označavanje neželjenih datoteka +• Ispravljen uvoz YouTube pretplata +• Ponovna reprodukcija toka zahtijeva ponovni dodir dugmeta za reprodukciju +• Ispravljeno zatvaranje audio sesije +• [Android TV] Ispravljeni su dugi skokovi na traci za pretraživanje prilikom korištenja DPad-a + +Da biste vidjeli daljnje promjene, pogledajte dnevnik promjena (i objavu na blogu) na kartici Linkovi ispod. diff --git a/fastlane/metadata/android/bs/changelogs/977.txt b/fastlane/metadata/android/bs/changelogs/977.txt new file mode 100644 index 000000000..da79b791f --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/977.txt @@ -0,0 +1,10 @@ +• Dodano dugme "reproduciraj sljedeće" u meni dugog pritiska +• Dodan prefiks putanje YouTube kratkih videozapisa u filter namjere +• Ispravljen uvoz postavki +• Zamjena pozicije trake za pretraživanje s dugmadima playera na ekranu reda čekanja +• Razne ispravke vezane za MediasessionManager +• Ispravljena traka za pretraživanje koja se nije dovršila nakon završetka videa +• Onemogućeno tuneliranje medija na RealtekATV-u +• Prošireno područje za klik na minimizirana dugmad playera + +Da biste vidjeli daljnje promjene, pogledajte dnevnik promjena (i objavu na blogu) na kartici Linkovi ispod. diff --git a/fastlane/metadata/android/bs/changelogs/978.txt b/fastlane/metadata/android/bs/changelogs/978.txt new file mode 100644 index 000000000..132fa5cd4 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/978.txt @@ -0,0 +1 @@ +Ispravljeno izvršavanje provjere za novu verziju NewPipe-a. Ova provjera se ponekad izvršavala prerano i stoga je dovodila do pada aplikacije. To bi sada trebalo biti ispravljeno. diff --git a/fastlane/metadata/android/bs/changelogs/979.txt b/fastlane/metadata/android/bs/changelogs/979.txt new file mode 100644 index 000000000..50a39f3c7 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/979.txt @@ -0,0 +1,2 @@ +- Ispravljeno nastavljanje reprodukcije +- Poboljšanja kako bi se osiguralo da servis koji određuje da li NewPipe treba provjeravati nove verzije nije pokrenut u pozadini diff --git a/fastlane/metadata/android/bs/changelogs/980.txt b/fastlane/metadata/android/bs/changelogs/980.txt new file mode 100644 index 000000000..58fe99af8 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/980.txt @@ -0,0 +1,13 @@ +Novo +• Dodana je opcija "Dodaj na listu za reprodukciju" u meni za dijeljenje +• Dodana je podrška za kratke linkove na y2u.be i PeerTube + +Poboljšano +• Kontrole brzine reprodukcije su kompaktnije +• Feed sada ističe nove stavke +• Opcija "Prikaži gledane stavke" u feedu je sada sačuvana + +Ispravljeno +• Ispravljeno izdvajanje lajkova i nesviđanja na YouTubeu +• Ispravljena je automatska reprodukcija nakon povratka iz pozadine +I još mnogo toga diff --git a/fastlane/metadata/android/bs/changelogs/981.txt b/fastlane/metadata/android/bs/changelogs/981.txt new file mode 100644 index 000000000..d832a5ba0 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/981.txt @@ -0,0 +1,2 @@ +Uklonjena je podrška za MediaParser kako bi se riješio problem neuspjelog nastavka reprodukcije nakon baferovanja na Androidu 11+. +Onemogućeno je tuneliranje medija na Philips QM16XE uređaju kako bi se riješili problemi s reprodukcijom. diff --git a/fastlane/metadata/android/bs/changelogs/982.txt b/fastlane/metadata/android/bs/changelogs/982.txt new file mode 100644 index 000000000..39ccdd3e6 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/982.txt @@ -0,0 +1 @@ +Ispravljena greška zbog koje YouTube nije reprodukovao nijedan tok. diff --git a/fastlane/metadata/android/bs/changelogs/983.txt b/fastlane/metadata/android/bs/changelogs/983.txt new file mode 100644 index 000000000..ebf3841e1 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/983.txt @@ -0,0 +1,9 @@ +Dodati novi korisnički interfejs i ponašanje za pretraživanje dvostrukim dodirom +Omogućiti pretraživanje postavki +Istaknuti zakačene komentare kao takve +Dodati podršku za otvaranje s aplikacijom za FSFE-ovu PeerTube instancu +Dodati obavještenja o greškama +Ispraviti ponavljanje prve stavke reda čekanja pri promjeni igrača +Duže čekati prilikom učitavanja u međuspremniku tokom prijenosa uživo prije nego što dođe do greške +Ispraviti redoslijed lokalnih rezultata pretrage +Ispraviti prazna polja stavki u redu čekanja za reprodukciju diff --git a/fastlane/metadata/android/bs/changelogs/984.txt b/fastlane/metadata/android/bs/changelogs/984.txt new file mode 100644 index 000000000..300013d5e --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/984.txt @@ -0,0 +1,7 @@ +Učitajte dovoljno početnih stavki u listama da popune cijeli ekran i da se riješi problem skrolovanja na tabletima i televizorima +Ispravite nasumična rušenja prilikom skrolovanja kroz liste +Neka se luk preklapanja brzog pretraživanja plejera nalazi ispod sistemskog korisničkog interfejsa +Vratite promjene izreza prilikom reprodukcije u više prozora, što je uzrokovalo regresiju pogrešno postavljenog plejera na nekim telefonima +Povećajte compileSdk sa 30 na 31 +Ažurirajte biblioteku za prijavljivanje grešaka +Refaktorišite dio koda u plejeru diff --git a/fastlane/metadata/android/bs/changelogs/985.txt b/fastlane/metadata/android/bs/changelogs/985.txt new file mode 100644 index 000000000..acd29e47c --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/985.txt @@ -0,0 +1 @@ +Ispravljeno je da YouTube ne reprodukuje nijedan tok diff --git a/fastlane/metadata/android/bs/changelogs/986.txt b/fastlane/metadata/android/bs/changelogs/986.txt new file mode 100644 index 000000000..f7a82bf00 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/986.txt @@ -0,0 +1,17 @@ +Novo +• Obavještenja za nove tokove +• Besprijekoran prijelaz između pozadinskog i video playera +• Promjena visine tona za polutone +• Dodavanje reda čekanja glavnog playera na listu za reprodukciju + +Poboljšano + +• Zapamti brzinu/veličinu koraka visine tona +• Ublaži početno dugo baferovanje u video playeru +• Poboljšan korisnički interfejs playera za Android TV +• Potvrdi prije brisanja svih preuzetih datoteka + +Ispravljeno +• Ispravljeno dugme za medije koje nije skrivalo kontrole playera +• Ispravljeno resetovanje reprodukcije pri promjeni tipa playera +• Ispravljeno rotiranje dijaloga liste za reprodukciju diff --git a/fastlane/metadata/android/bs/changelogs/987.txt b/fastlane/metadata/android/bs/changelogs/987.txt new file mode 100644 index 000000000..d14bfa7ee --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/987.txt @@ -0,0 +1,12 @@ +Novo +• Podrška za metode isporuke osim progresivnog HTTP-a: brže vrijeme učitavanja reprodukcije, ispravke za PeerTube i SoundCloud, reprodukcija nedavno završenih YouTube prijenosa uživo +• Dodano dugme za dodavanje udaljene liste za reprodukciju na lokalnu +• Pregled slike u Android 10+ listu za dijeljenje + +Poboljšano +• Poboljšan dijalog parametara reprodukcije +• Dugmad za uvoz/izvoz pretplate premještena u meni s tri tačke + +Ispravljeno +• Ispravljeno uklanjanje potpuno pregledanih videozapisa s liste za reprodukciju +• Ispravljena tema menija za dijeljenje i unos "dodaj na listu za reprodukciju" diff --git a/fastlane/metadata/android/bs/changelogs/988.txt b/fastlane/metadata/android/bs/changelogs/988.txt new file mode 100644 index 000000000..fa0f905ba --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Ispravljena greška "Nije moguće dobiti tok" prilikom pokušaja reprodukcije bilo kojeg videa +[YouTube] Ispravljena poruka "Sljedeći sadržaj nije dostupan u ovoj aplikaciji" koja se prikazuje umjesto traženog videa diff --git a/fastlane/metadata/android/bs/changelogs/989.txt b/fastlane/metadata/android/bs/changelogs/989.txt new file mode 100644 index 000000000..6c80f717e --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] Ispravljeno beskonačno učitavanje pri pokušaju reprodukcije bilo kojeg videa +• [YouTube] Ispravljeno ograničavanje reprodukcije nekih videa +• Nadogradite biblioteku jsoup na verziju 1.15.3, što uključuje sigurnosnu ispravku diff --git a/fastlane/metadata/android/bs/changelogs/990.txt b/fastlane/metadata/android/bs/changelogs/990.txt new file mode 100644 index 000000000..49f7ffe95 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/990.txt @@ -0,0 +1,15 @@ +Ovo izdanje ukida podršku za Android 4.4 KitKat, sada je minimalna verzija Android 5 Lollipop! + +Novo +• Preuzimanje iz menija s dugim pritiskom +• Skrivanje budućih videa u feedu +• Dijeljenje lokalnih lista za reprodukciju + +Poboljšano +• Refaktorisanje koda playera u male komponente: manje RAM-a se koristi, manje grešaka +• Poboljšan način skaliranja sličica +• Vektorska konverzija rezerviranih mjesta za slike + +Ispravljeno +• Ispravljeni razni problemi s obavještenjima playera: zastarjele/nedostajuće informacije o medijima, iskrivljena sličica +• Ispravljen prikaz preko cijelog ekrana koristeći 1/4 ekrana diff --git a/fastlane/metadata/android/bs/changelogs/991.txt b/fastlane/metadata/android/bs/changelogs/991.txt new file mode 100644 index 000000000..bdbb7a5b7 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/991.txt @@ -0,0 +1,14 @@ +Novo +• Dodano dugme "Otvori u pregledniku" u panelu s greškama +• Dodana opcija za prikaz grupa kanala kao liste +• [YouTube] Dugi klik na segmente toka za dijeljenje URL-a vremenske oznake +• Dodano dugme za red čekanja za reprodukciju u mini player + +Poboljšano + +• Dodana lokalizacija za islandski jezik i ažurirani mnogi drugi prijevodi +• Mnoga interna poboljšanja + +Ispravljeno +• Ispravljeno višestruko rušenje sistema +• [YouTube] Ispravljeno učitavanje kanala, nenamjenski feed i zaobilazno rješenje problema s reprodukcijom u nekim zemljama diff --git a/fastlane/metadata/android/bs/changelogs/992.txt b/fastlane/metadata/android/bs/changelogs/992.txt new file mode 100644 index 000000000..f101f68f0 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/992.txt @@ -0,0 +1,17 @@ +Novo +• Broj pretplatnika u detaljima videa +• Preuzimanje iz reda čekanja +• Trajno postavljanje sličice liste za reprodukciju +• Dugi pritisak na hashtagove i linkove +• Način prikaza kartice + +Poboljšano +• Veće dugme za zatvaranje mini-playera +• Glatko smanjenje sličica +• Ciljano za Android 13 (API 33) +• Traženje više ne pauzira player + +Ispravljeno +• Ispravljen prekrivač na DeX-u/mišu +• Omogućen pozadinski player bez odvojenih audio tokova +• Razne ispravke za YouTube i još mnogo toga… diff --git a/fastlane/metadata/android/bs/changelogs/993.txt b/fastlane/metadata/android/bs/changelogs/993.txt new file mode 100644 index 000000000..4677738e9 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/993.txt @@ -0,0 +1,12 @@ +Novo +• Dodano upozorenje prilikom dodavanja duplikata liste za reprodukciju i dodavanje dugmeta za njihovo uklanjanje +• Omogućeno ignorisanje hardverskih dugmadi +• Omogućeno skrivanje djelomično pregledanih videa u feedu + +Poboljšano +• Koristiti više kolona mreže na velikim ekranima +• Usaglasiti indikatore napretka s postavkama + +Ispravljeno +• Ispravljeno otvaranje URL-ova preglednika, preuzimanja i vanjskih playera na Androidu 11+ +• Ispravljena interakcija s cijelim ekranom koja zahtijeva dva dodira na MIUI-ju diff --git a/fastlane/metadata/android/bs/changelogs/994.txt b/fastlane/metadata/android/bs/changelogs/994.txt new file mode 100644 index 000000000..0440a2c94 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/994.txt @@ -0,0 +1,15 @@ +Novo +• Podrška za više audio zapisa/jezika +• Omogućeno podešavanje jačine zvuka i svjetline gestama sa bilo koje strane ekrana +• Podrška za prikaz glavnih kartica na dnu ekrana + +Poboljšano +• [Bandcamp] Rukovanje zapisima iza paywalla + +Ispravljeno +• [YouTube] 403 HTTP greške za tokove +• Crni plejer pri prelasku na glavni plejer sa prikaza liste za reprodukciju +• Curenje memorije servisa plejera +• [PeerTube] Avatari za uploader i podkanal su zamijenjeni + +i više diff --git a/fastlane/metadata/android/bs/changelogs/995.txt b/fastlane/metadata/android/bs/changelogs/995.txt new file mode 100644 index 000000000..68912e20d --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/995.txt @@ -0,0 +1,16 @@ +Novo +• Podrška za kartice kanala +• Odabir kvalitete slike +• Dobijanje URL-ova za sve slike + +Poboljšano +• Pristupačnost interfejsa playera +• Bolji odabir zvuka za preuzimanja samo videozapisa +• Opcija za uključivanje naziva popisa za reprodukciju i videozapisa u dijeljeni sadržaj popisa za reprodukciju + +Ispravljeno +• [YouTube] Ispravljeno dobijanje broja lajkova +• Ispravljeni skočni prozori i padovi sustava koji ne reagiraju na player +• Odabir pogrešnih jezika u biraču jezika +• Fokus zvuka playera nije poštovao zvuk +• Dodavanje stavki popisa za reprodukciju povremeno nije radilo diff --git a/fastlane/metadata/android/bs/changelogs/996.txt b/fastlane/metadata/android/bs/changelogs/996.txt new file mode 100644 index 000000000..0fa343ba2 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/996.txt @@ -0,0 +1,2 @@ +Ispravljen je NullPointerException prilikom otvaranja kanala/konferencije u media.ccc.de. +Grinch je pokušao da vam pokvari naš božićni poklon, ali smo ga ispravili. diff --git a/fastlane/metadata/android/bs/changelogs/997.txt b/fastlane/metadata/android/bs/changelogs/997.txt new file mode 100644 index 000000000..1703a1f7c --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/997.txt @@ -0,0 +1,17 @@ +Novo +• Dodajte odgovore na komentare +• Omogućite promjenu redoslijeda lista za reprodukciju +• Prikažite opis i trajanje liste za reprodukciju +• Omogućite resetiranje postavki + +Poboljšano +• [Android 13+] Vratite prilagođene radnje obavještenja +• Zatražite saglasnost za provjeru ažuriranja +• Omogućite reprodukciju/pauziranje obavještenja tokom učitavanja u međuspremnik +• Promijenite redoslijed nekih postavki + +Ispravljeno +• [YouTube] Ispravljen komentari koji se ne učitavaju, plus druge ispravke i poboljšanja +• Rješite ranjivost u uvozu postavki i prebacite se na JSON +• Razne ispravke preuzimanja +• Skratite tekst pretrage diff --git a/fastlane/metadata/android/bs/changelogs/998.txt b/fastlane/metadata/android/bs/changelogs/998.txt new file mode 100644 index 000000000..6a8cecc00 --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/998.txt @@ -0,0 +1,4 @@ +Ispravljena greška zbog koje YouTube nije reproducirao nijedan tok zbog HTTP 403 greške. + +Povremene HTTP 403 greške usred YouTube videa još nisu ispravljene. +Taj problem će biti riješen u drugom izdanju hitne ispravke što je prije moguće. diff --git a/fastlane/metadata/android/bs/changelogs/999.txt b/fastlane/metadata/android/bs/changelogs/999.txt new file mode 100644 index 000000000..864bf68ec --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/999.txt @@ -0,0 +1,12 @@ +Ovo izdanje hitne ispravke ispravlja HTTP 403 greške usred YouTube videa. + +Novo +• [SoundCloud] Dodata podrška za on.soundcloud.com URL-ove + +Poboljšano +• [Bandcamp] Prikaz dodatnih informacija u radio kiosku + +Ispravljeno +• [YouTube] Ispravljene povremene HTTP 403 greške na početku ili usred videa +• [YouTube] Izdvajanje avatara i banera iz više tipova zaglavlja kanala +• [Bandcamp] Ispravljene razne greške i uvijek korištenje HTTPS-a diff --git a/fastlane/metadata/android/de/changelogs/1002.txt b/fastlane/metadata/android/de/changelogs/1002.txt index 6c6dc761a..23be04e80 100644 --- a/fastlane/metadata/android/de/changelogs/1002.txt +++ b/fastlane/metadata/android/de/changelogs/1002.txt @@ -1,4 +1,4 @@ Behoben: YouTube spielt keinen Stream ab. -Diese Version behebt nur den dringendsten Fehler, der das Laden von YouTube-Videodetails verhindert. +Diese Version behebt nur den dringenden Fehler, der das Laden von YouTube-Videodetails verhindert. Wir sind uns bewusst, dass es andere Probleme gibt, und wir werden bald eine separate Version erstellen, um sie zu lösen. diff --git a/fastlane/metadata/android/de/changelogs/972.txt b/fastlane/metadata/android/de/changelogs/972.txt index c05cf182f..0d5be70e8 100644 --- a/fastlane/metadata/android/de/changelogs/972.txt +++ b/fastlane/metadata/android/de/changelogs/972.txt @@ -1,11 +1,14 @@ Neu -Erkennung von Zeitstempeln und Hashtags in der Beschreibung -Manuelle Einstellung des Tablet-Modus hinzugefügt -Abgespielte Elemente können nun in einem Feed ausgeblendet werden +Erkennung von Zeitstempeln/Hashtags in der Beschreibung +Manuelle Einstellung des Tablet-Modus +Abgespielte Elemente können nun im Feed ausgeblendet werden Verbessert -Korrekte Unterstützung des Storage Access Framework -Bessere Fehlerbehandlung von nicht verfügbaren und beendeten Kanälen -Das Android Share Sheet für Android >=10 Nutzer zeigt nun den Titel des Inhalts an. -Aktualisierte Invidious Instanzen und Unterstützung von Piped Links. -... +Korrekte Unterstützung des Storage-Access-Frameworks +Bessere Fehlerbehandlung von nicht verfügbaren und geschlossenen Kanälen +Das Android-Freigabefenster für Nutzer von Android 10+ zeigt nun den Titel des Inhalts an +Invidious-Instanzen aktualisiert und Unterstützung von Piped-Links + +Behoben +[YouTube] Altersbeschränkte Inhalte +… diff --git a/fastlane/metadata/android/de/short_description.txt b/fastlane/metadata/android/de/short_description.txt index ec47872eb..6afdb21ea 100644 --- a/fastlane/metadata/android/de/short_description.txt +++ b/fastlane/metadata/android/de/short_description.txt @@ -1 +1 @@ -Eine freie, leichte YouTube-App für Android. +Eine kostenlose, leichte YouTube-App für Android. diff --git a/fastlane/metadata/android/el/changelogs/1004.txt b/fastlane/metadata/android/el/changelogs/1004.txt new file mode 100644 index 000000000..d00799cfd --- /dev/null +++ b/fastlane/metadata/android/el/changelogs/1004.txt @@ -0,0 +1,3 @@ +Αυτή η έκδοση διορθώνει το πρόβλημα που παρουσίαζε το YouTube μόνο σε ροή 360p. + +Σημειώστε ότι η λύση που χρησιμοποιείται σε αυτήν την έκδοση είναι πιθανώς προσωρινή και μακροπρόθεσμα πρέπει να εφαρμοστεί το πρωτόκολλο βίντεο SABR, αλλά τα μέλη του TeamNewPipe είναι απασχολημένα αυτήν τη στιγμή, επομένως οποιαδήποτε βοήθεια θα εκτιμηθεί ιδιαίτερα! https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/el/changelogs/1005.txt b/fastlane/metadata/android/el/changelogs/1005.txt new file mode 100644 index 000000000..286239c25 --- /dev/null +++ b/fastlane/metadata/android/el/changelogs/1005.txt @@ -0,0 +1,17 @@ +Νέο +• Προσθήκη υποστήριξης για το Android Auto +• Επιτρέπεται ο ορισμός ομάδων ροών ως καρτέλες κύριας οθόνης +• [YouTube] Κοινή χρήση ως προσωρινή λίστα αναπαραγωγής +• [SoundCloud] Καρτέλα καναλιού "Μου αρέσει" + +Βελτιωμένη +• Καλύτερες υποδείξεις γραμμής αναζήτησης +• Εμφάνιση ημερομηνίας λήψης στις Λήψεις +• Χρήση γλώσσας Android 13 ανά εφαρμογή + +Διορθώθηκε +• Διόρθωση σπασμένων χρωμάτων κειμένου σε σκοτεινή λειτουργία +• [YouTube] Διόρθωση λιστών αναπαραγωγής που δεν φόρτωναν περισσότερα από 100 στοιχεία +• [YouTube] Διόρθωση προτεινόμενων βίντεο που λείπουν +• Διόρθωση σφαλμάτων στην προβολή λίστας ιστορικού +• Διόρθωση χρονικών σημάνσεων στις απαντήσεις σχολίων diff --git a/fastlane/metadata/android/el/changelogs/70.txt b/fastlane/metadata/android/el/changelogs/70.txt new file mode 100644 index 000000000..7d1be05ff --- /dev/null +++ b/fastlane/metadata/android/el/changelogs/70.txt @@ -0,0 +1,25 @@ +ΠΡΟΣΟΧΗ: Αυτή η έκδοση πιθανότατα έχει πολλά bugs, όπως και η προηγούμενη. Ωστόσο, λόγω του πλήρους τερματισμού λειτουργίας από την έκδοση 17, μια προβληματική έκδοση είναι καλύτερη από καμία έκδοση. Σωστά; ¯\_(ツ)_/¯ + +### Βελτιώσεις +* τα ληφθέντα αρχεία μπορούν πλέον να ανοιχτούν με ένα κλικ #1879 +* κατάργηση υποστήριξης για android 4.1 - 4.3 #1884 +* κατάργηση παλιού προγράμματος αναπαραγωγής #1884 +* κατάργηση ροών από την τρέχουσα ουρά αναπαραγωγής σύροντάς τες προς τα δεξιά #1915 +* κατάργηση της αυτόματης ροής σε ουρά όταν μια νέα ροή μπαίνει στην ουρά χειροκίνητα #1878 +* Επεξεργασία μετά την επεξεργασία για λήψεις και εφαρμογή ελλειπουσών λειτουργιών #1759 από @kapodamy +* Υποδομή μετεπεξεργασίας +* Σωστός χειρισμός σφαλμάτων "υποδομής" (για πρόγραμμα λήψης) +* Ουρά αντί για πολλαπλές λήψεις +* Μετακίνηση σειριοποιημένων εκκρεμών λήψεων (αρχεία `.giga`) στα δεδομένα εφαρμογής +* Εφαρμογή μέγιστης επανάληψης λήψης +* Σωστή παύση λήψης πολλαπλών νημάτων +* Διακοπή λήψεων κατά τη μετάβαση σε δίκτυο κινητής τηλεφωνίας (δεν λειτουργεί ποτέ, δείτε το 2ο σημείο) +* Αποθήκευση του αριθμού νημάτων για τις επόμενες λήψεις +* Πολλά Διορθώθηκαν οι ασυνέπειες + +### Διορθώθηκε +* Διορθώθηκε το σφάλμα με την προεπιλεγμένη ανάλυση να έχει οριστεί στην καλύτερη και την περιορισμένη ανάλυση δεδομένων κινητής τηλεφωνίας #1835 +* διορθώθηκε το σφάλμα του αναδυόμενου προγράμματος αναπαραγωγής #1874 +* NPE κατά την προσπάθεια ανοίγματος του προγράμματος αναπαραγωγής φόντου #1901 +* Διορθώθηκε η εισαγωγή νέων ροών όταν είναι ενεργοποιημένη η αυτόματη ουρά #1878 +* Διορθώθηκε το πρόβλημα αποκρυπτογράφησης του shuttown diff --git a/fastlane/metadata/android/el/changelogs/71.txt b/fastlane/metadata/android/el/changelogs/71.txt new file mode 100644 index 000000000..30163bcb0 --- /dev/null +++ b/fastlane/metadata/android/el/changelogs/71.txt @@ -0,0 +1,10 @@ +### Βελτιώσεις +* Προσθήκη ειδοποίησης ενημέρωσης εφαρμογής για την έκδοση GitHub (#1608 από @krtkush) +* Διάφορες βελτιώσεις στο πρόγραμμα λήψης (#1944 από @kapodamy): +* προσθήκη λευκών εικονιδίων που λείπουν και χρήση σκληροπυρηνικής μεθόδου για αλλαγή των χρωμάτων των εικονιδίων +* έλεγχος εάν ο επαναλήπτης έχει αρχικοποιηθεί (διορθώσεις #2031) +* δυνατότητα επανάληψης λήψεων με σφάλμα "αποτυχία μετα-επεξεργασίας" στον νέο πολυπλέκτη +* νέος πολυπλέκτης MPEG-4 που διορθώνει μη σύγχρονες ροές βίντεο και ήχου (#2039) + +### Διορθώθηκε +* Οι ζωντανές ροές YouTube σταματούν να αναπαράγονται μετά από σύντομο χρονικό διάστημα (#1996 από @yausername) diff --git a/fastlane/metadata/android/en_GB/changelogs/1005.txt b/fastlane/metadata/android/en_GB/changelogs/1005.txt new file mode 100644 index 000000000..7d76f491a --- /dev/null +++ b/fastlane/metadata/android/en_GB/changelogs/1005.txt @@ -0,0 +1,17 @@ +New +• Add support for Android Auto +• Allow setting feed groups as main screen tabs +• [YouTube] Share as temporary playlist +• [SoundCloud] Likes channel tab + +Improved +• Better search bar hints +• Show download date in Downloads +• Use Android 13 per-app language + +Fixed +• Fix broken text colours in dark mode +• [YouTube] Fix playlists not loading more than 100 items +• [YouTube] Fix missing recommended videos +• Fix crashes in History list view +• Fix timestamps in comment replies diff --git a/fastlane/metadata/android/en_GB/changelogs/63.txt b/fastlane/metadata/android/en_GB/changelogs/63.txt new file mode 100644 index 000000000..9044e96bf --- /dev/null +++ b/fastlane/metadata/android/en_GB/changelogs/63.txt @@ -0,0 +1,8 @@ +### Improvements +- Import/export settings #1333 +- Reduce overdraw (performance improvement) #1371 +- Small code improvements #1375 +- Add everything about GDPR #1420 + +### Fixed +- Downloader: Fix crash on loading unfinished downloads from .giga files #1407 diff --git a/fastlane/metadata/android/en_GB/changelogs/64.txt b/fastlane/metadata/android/en_GB/changelogs/64.txt new file mode 100644 index 000000000..d2ab61203 --- /dev/null +++ b/fastlane/metadata/android/en_GB/changelogs/64.txt @@ -0,0 +1,8 @@ +### Improvements +- Added the ability to limit video quality if using mobile data. #1339 +- Remember brightness for the session #1442 +- Improve download performance for weaker CPUs #1431 +- add (working) support for media session #1433 + +### Fix +- Fix crash on opening downloads (fix now available for release builds) #1441 diff --git a/fastlane/metadata/android/es/changelogs/1005.txt b/fastlane/metadata/android/es/changelogs/1005.txt new file mode 100644 index 000000000..b60b51760 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/1005.txt @@ -0,0 +1,17 @@ +New +Añadido soporte a Android Auto +Pemitir configurar grupos de feeds como pestaña en la pantalla principal +[YouTube] Compartir como playlist temporal +[SoundCloud] Pestaña de likes en el canal + +Mejoras +Mejores sugerencias en la barra de busqueda +Mostrar la fecha de descargas en Descargas +Usar el idioma por aplicacion en Android 13 + +Arreglos +Arreglado texto de colores rotos en el modo oscuro +[YouTube] Solucionado el problema que las playlist con mas de 100 elementos no cargaban +[YouTube] Solucionado problema de no mostrar los videos recomendados +Solucionado cierres inesperados en vista de listas en Historial +Arreglado marcas de tiempo en respuestas de comentarios diff --git a/fastlane/metadata/android/fr/changelogs/66.txt b/fastlane/metadata/android/fr/changelogs/66.txt index 3a94c81e0..33ba1fe25 100644 --- a/fastlane/metadata/android/fr/changelogs/66.txt +++ b/fastlane/metadata/android/fr/changelogs/66.txt @@ -13,14 +13,14 @@ - Ajout d'une option d'avance rapide pendant les silences dans le contrôle de la vitesse de lecture. Cela devrait être utile pour les livres audio et certains genres musicaux, et peut apporter une véritable expérience transparente (et peut casser une chanson avec beaucoup de silences =\\). - Refonte de la résolution des sources de médias pour permettre le passage des métadonnées avec les médias en interne dans le lecteur, plutôt que de le faire manuellement. Maintenant, nous avons une seule source de métadonnées et elles sont directement disponibles lorsque la lecture commence. - Correction des métadonnées des listes de lecture distantes qui ne sont pas mises à jour lorsque de nouvelles métadonnées sont disponibles lors de l'ouverture du fragment de liste de lecture. - - Diverses corrections de l'interface utilisateur : #1383, les contrôles de notification du lecteur en arrière-plan sont maintenant toujours blancs, il est plus facile de fermer le lecteur popup en le lançant. + - Diverses corrections de l'interface utilisateur : #1383, les contrôles de notification du lecteur en arrière-plan sont maintenant toujours blancs, il est plus facile de fermer le lecteur popup en le lançant. - Utilisation d'un nouvel extracteur avec une architecture remaniée pour le multiservice. ### Corrections - Correction #1440 Disposition des informations vidéo cassée #1491 - Correction de l'historique des vues #1497 - - #1495, en mettant à jour les métadonnées (vignette, titre et nombre de vidéos) dès que l'utilisateur accède à la liste de lecture. + - #1495, en mettant à jour les métadonnées (vignette, titre et nombre de vidéos) dès que l'utilisateur accède à la playlist. - #1475, en enregistrant une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe sur le fragment de détail. - Correction du timeout de la fenêtre en cas de mode popup. #1463 (Corrigé #640) - Correction du lecteur vidéo principal #1509 diff --git a/fastlane/metadata/android/fr/changelogs/68.txt b/fastlane/metadata/android/fr/changelogs/68.txt index 9b2760c35..b1735214a 100644 --- a/fastlane/metadata/android/fr/changelogs/68.txt +++ b/fastlane/metadata/android/fr/changelogs/68.txt @@ -17,7 +17,7 @@ ### Corrections - Erreur lorsque le nombre d'abonnements n'est pas disponible. Ferme #1649. - Affiche "le nombre d'abonnés non disponible" dans ces cas. -- NPE lorsqu'une liste de lecture YouTube est vide. +- NPE lorsqu'une playlist YouTube est vide. - Kiosques dans SoundCloud - Refactor et correction du bug #1623 - Résultat de recherche cyclique #1562 diff --git a/fastlane/metadata/android/fr/changelogs/740.txt b/fastlane/metadata/android/fr/changelogs/740.txt index da4bdc2f8..167608b66 100644 --- a/fastlane/metadata/android/fr/changelogs/740.txt +++ b/fastlane/metadata/android/fr/changelogs/740.txt @@ -3,7 +3,7 @@
  • Rendre les liens dans les commentaires cliquables, augmenter la taille du texte
  • Rechercher en cliquant sur les liens d'horodatage dans les commentaires
  • Afficher l'onglet préféré en fonction de l'état récemment sélectionné
  • -
  • Ajouter la liste de lecture à la file d'attente lors d'un clic long sur 'Arrière-plan' dans la fenêtre de la liste de lecture
  • +
  • Ajouter la playlist à la file d'attente lors d'un clic long sur 'Arrière-plan' dans la fenêtre de la playlist
  • Rechercher le texte partagé lorsqu'il ne s'agit pas d'une URL
  • Ajouter "partager à l'heure actuelle" bouton au lecteur vidéo principal lecteur vidéo principal
  • Ajouter un bouton de fermeture du lecteur principal lorsque la file d'attente vidéo est terminée
  • @@ -18,6 +18,6 @@
    • Défilement avec les commentaires et les flux associés désactivés
    • CheckForNewAppVersionTask qui est exécuté alors qu'il ne devrait pas l'être'
    • -
    • Importation des abonnements YouTube : ignorer ceux dont l’URL est invalide et conserver ceux dont le titre est vide
    • -
    • URL YouTube invalide : le nom de la balise signature n'est pas toujours "signature", ce qui empêche le chargement des flux.
    • +
    • Importation des abonnements YouTube : ignorer ceux dont l’URL est invalide et conserver ceux dont le titre est vide
    • +
    • URL YouTube invalide : le nom de la balise signature n'est pas toujours "signature", ce qui empêche le chargement des flux.
    diff --git a/fastlane/metadata/android/fr/changelogs/760.txt b/fastlane/metadata/android/fr/changelogs/760.txt index 2f74c57b4..e0a225fce 100644 --- a/fastlane/metadata/android/fr/changelogs/760.txt +++ b/fastlane/metadata/android/fr/changelogs/760.txt @@ -5,7 +5,7 @@ Nouveauté Améliorations -• Ajout de l'action "Commencer à jouer ici" dans les menus qui s'appuient longuement pour les listes de lecture #2518 +• Ajout de l'action "Commencer à jouer ici" dans les menus qui s'appuient longuement pour les playlists #2518 • Ajout d'un commutateur pour le sélecteur de fichiers SAF / hérité #2521 Corrections @@ -13,7 +13,7 @@ Corrections • Correction de la position de lecture qui est enregistrée même si l'historique de visionnage est désactivé • Correction des performances réduites causées par la position de lecture dans les vues de liste #2517 • [Extractor] Correction de ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 -• [Extractor] [YouTube] Correction de l'erreur de recherche occasionnelle lorsque les listes de lecture sont dans les résultats TeamNewPipe/NewPipeExtractor#185 +• [Extractor] [YouTube] Correction de l'erreur de recherche occasionnelle lorsque les playlists sont dans les résultats TeamNewPipe/NewPipeExtractor#185 @@ -39,5 +39,5 @@ Corrections • Ne plante pas lorsque la vérification de la mise à jour de l'application échoue (version GitHub) #2423 • Correction des téléchargements bloqués à 99,9 % #2440 • Mise à jour des métadonnées de la file de lecture #2453 -• [SoundCloud] Correction du plantage lors du chargement des listes de lecture TeamNewPipe/NewPipeExtractor#170 +• [SoundCloud] Correction du plantage lors du chargement des playlists TeamNewPipe/NewPipeExtractor#170 • [YouTube] Correction de la durée qui ne peut pas être analysée TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/fr/changelogs/800.txt b/fastlane/metadata/android/fr/changelogs/800.txt index 91bd24d54..46fe1504e 100644 --- a/fastlane/metadata/android/fr/changelogs/800.txt +++ b/fastlane/metadata/android/fr/changelogs/800.txt @@ -1,10 +1,10 @@ Nouveau -- Support de PeerTube sans P2P (#2201) [Beta] : +- Support de PeerTube sans P2P (#2201) [Beta] : ◦ Regarder et télécharger des vidéos depuis des instances PeerTube ◦ Ajouter des instances dans les paramètres pour accéder à l'ensemble du monde PeerTube ◦ Il peut y avoir des problèmes avec les handshakes SSL sur Android 4.4 et 7.1 lors de l'accès à certaines instances, ce qui entraîne une erreur de réseau. -- Téléchargeur (#2679) : +- Téléchargeur (#2679) : ◦ Calculer l'heure d'arrivée du téléchargement ◦ Télécharger les opus (fichiers webm) en ogg ◦ Récupération des liens de téléchargement expirés pour reprendre les téléchargements après une longue pause @@ -17,7 +17,7 @@ Amélioré Correction - Correction d'un bogue qui ne permettait pas de déplacer le lecteur popup si un autre doigt était placé pendant le déplacement du lecteur popup #2772 -- Autorise les listes de lecture sans uploader et corrige les crashs liés à ce problème #2724, TeamNewPipe/NewPipeExtractor#219 +- Autorise les playlists sans uploader et corrige les crashs liés à ce problème #2724, TeamNewPipe/NewPipeExtractor#219 - Activation de TLS1.1/1.2 sur les appareils Android 4.4 (API 19/KitKat) pour corriger le handshake TLS avec MediaCCC et certaines instances PeerTube #2792 - SoundCloud] Correction de l'extraction de l'identifiant client TeamNewPipe/NewPipeExtractor#217 - [SoundCloud] Correction de l'extraction du flux audio diff --git a/fastlane/metadata/android/fr/changelogs/810.txt b/fastlane/metadata/android/fr/changelogs/810.txt index c40bea4af..573ea9889 100644 --- a/fastlane/metadata/android/fr/changelogs/810.txt +++ b/fastlane/metadata/android/fr/changelogs/810.txt @@ -2,10 +2,10 @@ Nouveautée : • Affiche la miniature de la vidéo sur l'écran de verrouillage lorsqu'elle est lu en arrière-plan Améliorations : -• Ajout de la liste de lecture locale à la file d'attente lors d'une pression longue sur le bouton arrière-plan / flottant +• Ajout de la playlist locale à la file d'attente lors d'une pression longue sur le bouton arrière-plan / flottant • Possibilité de faire défiler les onglets de la page principale et les masquent lorsqu'il n'y a qu'un seul onglet • Limite le nombre de mises à jour de la miniature des notifications avec le lecteur en arrière-plan -• Ajout d'une miniature fictive pour les listes de lecture locales vides +• Ajout d'une miniature fictive pour les playlists locales vides • Utilisation de l'extension de fichier *.opus au lieu de *.webm et affiche « opus » pour le nom du format au lieu de « WebM Opus » dans la liste déroulante de téléchargement. • Ajout d'un bouton pour supprimer les fichiers téléchargés ou l'historique de téléchargements dans les « Téléchargements » • [YouTube] Ajout de la prise en charge des liens de chaînes /c/shortened_url diff --git a/fastlane/metadata/android/fr/changelogs/840.txt b/fastlane/metadata/android/fr/changelogs/840.txt index fa7cf4986..240b77824 100644 --- a/fastlane/metadata/android/fr/changelogs/840.txt +++ b/fastlane/metadata/android/fr/changelogs/840.txt @@ -7,7 +7,7 @@ Amélioré • Corriger l'activité ReCaptcha et enregistrer correctement les cookies obtenus • Suppression du menu à points au profit du tiroir et du bouton Masquer l'historique lorsque l'historique de visionnage n'est pas activé dans les paramètres • Demander correctement l'autorisation d'affichage sur d'autres applications dans les paramètres sur Android 6 et versions ultérieures -• Renommer la liste de lecture locale en cliquant longuement dans BookmarkFragment +• Renommer la playlist locale en cliquant longuement dans BookmarkFragment • Diverses améliorations de PeerTube • Amélioration de plusieurs chaînes sources en anglais diff --git a/fastlane/metadata/android/fr/changelogs/958.txt b/fastlane/metadata/android/fr/changelogs/958.txt index 9f857d470..27908767f 100644 --- a/fastlane/metadata/android/fr/changelogs/958.txt +++ b/fastlane/metadata/android/fr/changelogs/958.txt @@ -1,13 +1,13 @@ -Nouveautés : +Nouveautés : • Tirer pour actualiser les abonnements • Option pour masquer la miniature sur l'écran de verrouillage de nouveau dispo. • Amélioration du chargement des listes locales (playlists, historique…) -Corrigé : +Corrigé : • Crash au démarrage quand NewPipe n'était plus dans la RAM • Crash au démarrage quand l'appareil n'était pas connecté à internet • Paramètres de luminosité et de volume -• [YouTube] Listes de lecture longues +• [YouTube] Playlists longues -Autres : +Autres : • Mise à jour des traductions diff --git a/fastlane/metadata/android/fr/changelogs/968.txt b/fastlane/metadata/android/fr/changelogs/968.txt index 06b84c7fd..abf53af53 100644 --- a/fastlane/metadata/android/fr/changelogs/968.txt +++ b/fastlane/metadata/android/fr/changelogs/968.txt @@ -1,5 +1,5 @@ Ajout d'une option de détails sur les chaînes dans le menu de pression longue. -Ajout d'une fonctionnalité permettant de renommer le nom de la liste de lecture à partir de l'interface de la liste de lecture. +Ajout d'une fonctionnalité permettant de renommer le nom de la playlist à partir de l'interface de la playlist. Permet à l'utilisateur de faire une pause pendant la mise en mémoire tampon d'une vidéo. Le thème blanc a été amélioré. Correction du chevauchement des polices lors de l'utilisation d'une taille de police plus grande. diff --git a/fastlane/metadata/android/fr/changelogs/980.txt b/fastlane/metadata/android/fr/changelogs/980.txt index 6835f70c8..149ff2eeb 100644 --- a/fastlane/metadata/android/fr/changelogs/980.txt +++ b/fastlane/metadata/android/fr/changelogs/980.txt @@ -1,5 +1,5 @@ Nouveautés -• Ajout option "Ajouter à la liste de lecture" au menu de partage +• Ajout option "Ajouter à la playlist" au menu de partage • Ajout prise en charge des liens courts y2u.be et PeerTube Améliorations diff --git a/fastlane/metadata/android/fr/changelogs/983.txt b/fastlane/metadata/android/fr/changelogs/983.txt index b9760a8a1..5079132f0 100644 --- a/fastlane/metadata/android/fr/changelogs/983.txt +++ b/fastlane/metadata/android/fr/changelogs/983.txt @@ -6,4 +6,4 @@ Ajoute les notifications d’erreur Corrige la relecture du premier item de la file lorsque le lecteur change Attend plus longtemps lors des directs avant d’échouer Corrige l’ordre des résultats d’une recherche locale -Corrige les champs d’item vides dans la liste de lecture +Corrige les champs d’item vides dans la playlist diff --git a/fastlane/metadata/android/fr/changelogs/986.txt b/fastlane/metadata/android/fr/changelogs/986.txt index b5f2af821..af6901a0a 100644 --- a/fastlane/metadata/android/fr/changelogs/986.txt +++ b/fastlane/metadata/android/fr/changelogs/986.txt @@ -2,7 +2,7 @@ Ajouts • Notifications pour les nouveaux flux • Transition fluide entre les lecteurs vidéo et en arrière-plan • Modification de la hauteur de son par demi-tons -• Ajout de la file du lecteur principal dans une liste de lecture +• Ajout de la file du lecteur principal dans une playlist Améliorations • Enregistrement du pas de la vitesse et de la hauteur audios diff --git a/fastlane/metadata/android/fr/changelogs/987.txt b/fastlane/metadata/android/fr/changelogs/987.txt index 1641d9a00..00000725d 100644 --- a/fastlane/metadata/android/fr/changelogs/987.txt +++ b/fastlane/metadata/android/fr/changelogs/987.txt @@ -1,6 +1,6 @@ Nouveautés -• Prise en charge d'autres méthodes de diffusion que le HTTP progressif : temps de chargement plus rapide, corrections pour PeerTube et SoundCloud, lecture des nouveaux flux en directs de YouTube -• Bouton pour ajouter une liste de lecture distante à une locale +• Prise en charge d'autres méthodes de diffusion que le HTTP progressif : temps de chargement plus rapide, corrections pour PeerTube et SoundCloud, lecture des nouveaux flux en directs de YouTube +• Bouton pour ajouter une playlist distante à une locale • Prévisualisation d'images lors d'un partage pour Andoid 10+ Améliorations diff --git a/fastlane/metadata/android/fr/changelogs/990.txt b/fastlane/metadata/android/fr/changelogs/990.txt index fcab79c3c..b941066e2 100644 --- a/fastlane/metadata/android/fr/changelogs/990.txt +++ b/fastlane/metadata/android/fr/changelogs/990.txt @@ -1,9 +1,9 @@ -Cette mise à jour abandonne la prise en charge d'Android 4.4 KitKat, la nouvelle version minimum est Android 5 Lollipop ! +Cette mise à jour abandonne la prise en charge d'Android 4.4 KitKat, la nouvelle version minimum est Android 5 Lollipop ! Nouveautés • Télécharger depuis le menu d'appuis long • Cacher les futures vidéos dans le flux -• Partager des listes de lecture locales +• Partager des playlists locales Améliorations • Réusinage du code du lecteur en petits composants : moins de mémoire vive utilisée, moins de bogues diff --git a/fastlane/metadata/android/fr/changelogs/992.txt b/fastlane/metadata/android/fr/changelogs/992.txt index 88e58db96..dc1fad35b 100644 --- a/fastlane/metadata/android/fr/changelogs/992.txt +++ b/fastlane/metadata/android/fr/changelogs/992.txt @@ -1,7 +1,7 @@ Nouveau • Nombre d'abonnés dans les détails de la vidéo • Télécharger depuis la file d'attente -• Définir de manière permanente une miniature de liste de lecture +• Définir de manière permanente une miniature de playlist • Hashtags et liens à appui long • Mode d'affichage de la carte diff --git a/fastlane/metadata/android/fr/changelogs/995.txt b/fastlane/metadata/android/fr/changelogs/995.txt index f8b55f3fd..b91f83875 100644 --- a/fastlane/metadata/android/fr/changelogs/995.txt +++ b/fastlane/metadata/android/fr/changelogs/995.txt @@ -13,4 +13,4 @@ Corrigé • Correction des fenêtres contextuelles et des plantages du lecteur • Sélection de mauvaises langues dans le sélecteur de langue • Le focus audio du lecteur ne respectait pas la fonction muet -• L'ajout d'éléments de liste de lecture ne fonctionnait parfois pas +• L'ajout d'éléments de playlist ne fonctionnait parfois pas diff --git a/fastlane/metadata/android/fr/changelogs/997.txt b/fastlane/metadata/android/fr/changelogs/997.txt index 87ca55570..b1a550577 100644 --- a/fastlane/metadata/android/fr/changelogs/997.txt +++ b/fastlane/metadata/android/fr/changelogs/997.txt @@ -1,7 +1,7 @@ Nouveau • Ajouter des réponses aux commentaires -• Autoriser la réorganisation des listes de lecture -• Afficher la description et la durée de la liste de lecture +• Autoriser la réorganisation des playlists +• Afficher la description et la durée de la playlist • Autoriser la réinitialisation des paramètres Amélioré diff --git a/fastlane/metadata/android/id/changelogs/1005.txt b/fastlane/metadata/android/id/changelogs/1005.txt new file mode 100644 index 000000000..885f25ddb --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/1005.txt @@ -0,0 +1,17 @@ +Baru +• Dukungan untuk Android Auto +• Grup umpan sebagai tab layar utama +• [YouTube] Bagikan sebagai daftar putar sementara +• [SoundCloud] Tab saluran suka + +Ditingkatkan +• Petunjuk bilah pencarian lebih baik +• Tanggal unduhan di Unduhan +• Bahasa per aplikasi Android 13 + +Diperbaiki +• Warna teks rusak di mode gelap +• [YouTube] Daftar putar tidak lebih dari 100 item +• [YouTube] Video rekomendasi hilang +• Kerusakan di tampilan Riwayat +• Cap waktu dalam balasan komentar diff --git a/fastlane/metadata/android/ka/changelogs/1000.txt b/fastlane/metadata/android/ka/changelogs/1000.txt new file mode 100644 index 000000000..c59dcdbd0 --- /dev/null +++ b/fastlane/metadata/android/ka/changelogs/1000.txt @@ -0,0 +1,12 @@ +გაუმჯობესებულია +• დასაკრავი სიის აღწერა დაწკაპუნებით გახდა შესაძლებელი მეტი/ნაკლები კონტენტის საჩვენებლად +• [PeerTube] `subscribeto.me` ეგზემპლარის ბმულების ავტომატურად დამუშავება +• ისტორიის ეკრანზე მხოლოდ ერთი ერთეულის დაკვრა იწყება +გამოსწორებულია +• RSS ღილაკის ხილვადობის გამოსწორება +• ძიების ზოლის გადახედვის შეცდომის გამოსწორება +• გამოსწორდა დასაკრავი სიის მინიატურების გარეშე ელემენტის პრობლემა +• გამოსწორდა ჩამოტვირთვის დიალოგური ფანჯრის გამოჩენამდე გამორთვის პრობლემა +• დაკავშირებული ერთეულების სიის რიგში ჩასმის ამომხტარი ფანჯარა გამოსწორდა +• დასაკრავ სიაში დამატების დიალოგში თანმიმდევრობა გამოსწორდა +• დასაკრავი სიის სანიშნეების ელემენტის განლაგების კორექტირება diff --git a/fastlane/metadata/android/ka/changelogs/1001.txt b/fastlane/metadata/android/ka/changelogs/1001.txt new file mode 100644 index 000000000..63574fa11 --- /dev/null +++ b/fastlane/metadata/android/ka/changelogs/1001.txt @@ -0,0 +1,5 @@ +გაუმჯობესებულია +• Android 13+-ზე მოთამაშის შეტყობინებების პარამეტრების შეცვლის ყოველთვის დაშვება +გამოსწორებულია +• გამოსწორდა მონაცემთა ბაზის/გამოწერების ექსპორტირებისას არსებული ფაილის შეკვეცა, რამაც შესაძლოა ექსპორტის დაზიანება გამოიწვიოს. +• დროის ნიშნულზე გამოსწორდა დაწკაპუნებისას მოთამაშის თავიდან განახლება diff --git a/fastlane/metadata/android/ka/changelogs/1002.txt b/fastlane/metadata/android/ka/changelogs/1002.txt new file mode 100644 index 000000000..5b2eb01a8 --- /dev/null +++ b/fastlane/metadata/android/ka/changelogs/1002.txt @@ -0,0 +1,4 @@ +გამოსწორდა YouTube-ის არცერთი სტრიმინგის ჩატვირთვის პრობლემა. + +ეს ვერსია მხოლოდ ყველაზე აქტუალურ შეცდომას აგვარებს, რომელიც YouTube ვიდეოს დეტალების ჩატვირთვას ხელს უშლიდა. +ჩვენ ვიცით, რომ არსებობს სხვა პრობლემებიც და მალე გამოვაქვეყნებთ ცალკე ვერსიას მათ გადასაჭრელად. diff --git a/fastlane/metadata/android/ka/changelogs/1003.txt b/fastlane/metadata/android/ka/changelogs/1003.txt new file mode 100644 index 000000000..209362e25 --- /dev/null +++ b/fastlane/metadata/android/ka/changelogs/1003.txt @@ -0,0 +1,6 @@ +ეს არის ცხელი შესწორების ვერსია, რომელიც ასწორებს YouTube-ის შეცდომებს: +• [YouTube] გამოსწორდა ვიდეოს ინფორმაციის ჩატვირთვის შეუძლებლობა, გამოსწორდა HTTP 403 შეცდომები ვიდეოების დაკვრის დროს და აღდგა ასაკობრივი შეზღუდვის მქონე ზოგიერთი ვიდეოს დაკვრა +• გამოსწორდა სუბტიტრების ზომის შეუცვლელობა +• გამოსწორდა ინფორმაციის ორჯერ ჩამოტვირთვის პრობლემა ნაკადის გახსნისას +• [Soundcloud] წაიშალა დაუკრავი DRM-ით დაცული ნაკადები +• განახლდა თარგმანები diff --git a/fastlane/metadata/android/ka/changelogs/1004.txt b/fastlane/metadata/android/ka/changelogs/1004.txt index d20512f17..31f488a16 100644 --- a/fastlane/metadata/android/ka/changelogs/1004.txt +++ b/fastlane/metadata/android/ka/changelogs/1004.txt @@ -1 +1,3 @@ -გაასწორა YouTube არ უკრავს არცერთ ნაკადს +ეს ვერსია ასწორებს YouTube-ი აჩვებებს მხოლოდ 360p სტრიმინგის პრობლემას. + +გაითვალისწინეთ, რომ ამ ვერსიაში გამოყენებული გადაწყვეტა, სავარაუდოდ, დროებითია და გრძელვადიან პერსპექტივაში SABR ვიდეო პროტოკოლის დანერგვაა საჭირო, თუმცა TeamNewPipe-ის წევრები ამჟამად დაკავებულები არიან, ამიტომ ნებისმიერი დახმარება დიდად დასაფასებელი იქნება! https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/ka/changelogs/1005.txt b/fastlane/metadata/android/ka/changelogs/1005.txt new file mode 100644 index 000000000..e08f2639f --- /dev/null +++ b/fastlane/metadata/android/ka/changelogs/1005.txt @@ -0,0 +1,15 @@ +ახალი +• დაემატა Android Auto-ს მხარდაჭერა +• არხების ჯგუფების მთავარი ეკრანის ჩანართებად დაყენების დაშვება +• [YouTube] გაზიარება, როგორც დროებითი დასაკრავი სია +• [SoundCloud] მოწონებების არხის ჩანართი +გაუმჯობესებულია +• უკეთესი მინიშნებები ძიების ზოლში +• ჩამოტვირთვის თარიღის ჩვენება ჩამოტვირთვებში +• Android 13-ის თითოეული აპლიკაციის ენის გამოყენება +.გამოსწორებულია +• გამოსწორდა ტექსტის ფერების დარღვევა ბნელ რეჟიმში +• [YouTube] გამოსწორდა დასაკრავი სიების 100-ზე მეტი ერთეულს არ აჩვენებს +• [YouTube] გამოსწორდა დაკარგული რეკომენდებული ვიდეოები +• გამოსწორდა ისტორიის სიის ხედში ავარიების გამოსწორება +• გამოსწორდა დროის ნიშნულები კომენტარების პასუხებში diff --git a/fastlane/metadata/android/ka/changelogs/63.txt b/fastlane/metadata/android/ka/changelogs/63.txt index 185bfd650..76d878325 100644 --- a/fastlane/metadata/android/ka/changelogs/63.txt +++ b/fastlane/metadata/android/ka/changelogs/63.txt @@ -1,8 +1,7 @@ ### გაუმჯობესებები - - იმპორტი/ექსპორტის პარამეტრები #1333 - - ზედრევის შემცირება (შესრულების გაუმჯობესება) #1371 - - მცირე კოდის გაუმჯობესება #1375 - - დაამატეთ ყველაფერი GDPR #1420-ის შესახებ - - ### გამოსწორდა - - Downloader: შეასწორეთ ავარია დაუმთავრებელი ჩამოტვირთვების ჩატვირთვისას .giga ფაილებიდან #1407 +- იმპორტის/ექსპორტის პარამეტრები #1333 +- ზედმეტად დიდი მოცულობის შეცდომის შემცირება (შესრულების გაუმჯობესება) #1371 +- კოდის მცირე გაუმჯობესებები #1375 +- GDPR-ის შესახებ ყველაფრის დამატება #1420 +### გამოსწორებულია +- ჩამომტვირთავი: გამოასწორეთ შეცდომის პრობლემა .giga ფაილებიდან დაუმთავრებელი ჩამოტვირთვების ჩატვირთვისას#1407 diff --git a/fastlane/metadata/android/ka/changelogs/65.txt b/fastlane/metadata/android/ka/changelogs/65.txt new file mode 100644 index 000000000..8ddbda2b7 --- /dev/null +++ b/fastlane/metadata/android/ka/changelogs/65.txt @@ -0,0 +1,23 @@ +### გაუმჯობესებები +- ბურგერის მენიუს ხატულას ანიმაციის გამორთვა #1486 +- ჩამოტვირთვების წაშლის გაუქმების ღილაკი #1472 +- ჩამოტვირთვის ღილაკი გაზიარების მენიუში #1498 +- ხანგრძლივი შეხების მენიუში #1454 დაემატა გაზიარების ღილაკი +- მთავარი პლეერის მინიმიზაცია გასვლისას #1354 +- ბიბლიოთეკის ვერსიის განახლება და მონაცემთა ბაზის სარეზერვო ასლის შესწორება #1510 +- ExoPlayer 2.8.2 განახლება #1392 +- გადამუშავდა დაკვრის სიჩქარის კონტროლის დიალოგი, რათა მხარდაჭერილიყო სხვადასხვა ნაბიჯების ზომები სიჩქარის უფრო სწრაფი ცვლილებისთვის. +- დაკვრის სიჩქარის კონტროლში დაემატა გადამრთველი სიჩუმის დროს წინ გადასართავად. ეს უნდა იყოს სასარგებლო აუდიოწიგნებისა და გარკვეული მუსიკალური ჟანრებისთვის და შეიძლება უზრუნველყოს ჭეშმარიტად შეუფერხებელი გამოცდილება (და შეიძლება დაარღვიოს სიმღერა, რომელსაც ბევრი სიჩუმე აქვს =\\). +- გადაკეთდა მედია წყაროს გარჩევადობა, რათა მეტამონაცემების გადაცემა მედიასთან ერთად პლეერში შიდა რეჟიმში მოხდეს, ხელით გაკეთების ნაცვლად. ახლა ჩვენ გვაქვს მეტამონაცემების ერთი წყარო და ის პირდაპირ ხელმისაწვდომია დაკვრის დაწყებისას. + - გამოსწორდა დისტანციური დასაკრავი სიის მეტამონაცემების განახლება, როდესაც ახალი მეტამონაცემები ხელმისაწვდომია დასაკრავი სიის ფრაგმენტის გახსნისას. +- სხვადასხვა ინტერფეისის გამოსწორება: #1383, ფონური პლეერის შეტყობინებების კონტროლი ახლა ყოველთვის თეთრია, უფრო ადვილია ამომხტარი პლეერის გამორთვა გადახვევით. +- გამოიყენეთ ახალი ექსტრაქტორი განახლებული არქიტექტურით მრავალსერვისისთვის. +### გამოსწორებები +- გამოსწორდა #1440 ვიდეო ინფორმაციის გაფუჭებული განლაგება #1491 +- გამოსწორდა ნახვის ისტორია#1497 +- #1495, მეტამონაცემების (მინიატურების, სათაურის და ვიდეოების რაოდენობის) განახლებით, როგორც კი მომხმარებელი წვდება დასაკრავ სიას. +- #1475, ხედვის რეგისტრაციით მონაცემთა ბაზაში, როდესაც მომხმარებელი იწყებს ვიდეოს გარე პლეერზე დეტალების ფრაგმენტზე. +- გამოსწორდა ეკრანის დროის ამოწურვა ამომხტარი რეჟიმის შემთხვევაში. #1463 (გამოსწორდა #640) +- მთავარი ვიდეო პლეერის გამოსწორება #1509 +- [#1412] გამოსწორდა გამეორების რეჟიმი, რომელიც იწვევდა პლეერის NPE-ს, როდესაც ახალი განზრახვა მიიღება, როდესაც მოთამაშის აქტივობა ფონურ რეჟიმშია. + - გამოსწორდა მოთამაშის ამომხტარ ფანჯარაში მინიმიზაციის შეცდომა, როდესაც ამომხტარ ფანჯარაში ნებართვა არ არის მინიჭებული. diff --git a/fastlane/metadata/android/ka/changelogs/996.txt b/fastlane/metadata/android/ka/changelogs/996.txt new file mode 100644 index 000000000..7da3ca0ed --- /dev/null +++ b/fastlane/metadata/android/ka/changelogs/996.txt @@ -0,0 +1,2 @@ +media.ccc.de-ზე არხის/კონფერენციის გახსნისას გამოსწორდა NullPointerException. +გრინჩმა სცადა თქვენთვის საშობაო საჩუქრის გატეხვა, მაგრამ ჩვენ გამოვასწორეთ. diff --git a/fastlane/metadata/android/ko/changelogs/1000.txt b/fastlane/metadata/android/ko/changelogs/1000.txt new file mode 100644 index 000000000..d2f5bf58a --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/1000.txt @@ -0,0 +1,13 @@ +개선됨 (Improved) +• 재생목록 설명을 클릭하여 더 보기 / 간단히 보기 전환 가능 +• [PeerTube] `subscribeto.me` 인스턴스 링크 자동 처리 +• 기록 화면에서 단일 항목만 재생 시작 + +수정됨 (Fixed) +• RSS 버튼 표시 문제 수정 +• 탐색바 미리보기 충돌 수정 +• 썸네일이 없는 항목 재생목록 추가 문제 수정 +• 다운로드 대화상자가 나타나기 전에 종료되는 문제 수정 +• 관련 항목 목록의 대기열 팝업 수정 +• 재생목록에 추가 대화상자의 순서 문제 수정 +• 재생목록 북마크 항목 레이아웃 조정 diff --git a/fastlane/metadata/android/pt-BR/changelogs/1005.txt b/fastlane/metadata/android/pt-BR/changelogs/1005.txt new file mode 100644 index 000000000..3ef1f3e2e --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/1005.txt @@ -0,0 +1,17 @@ +New +• Suporte adicionado para Android Auto +• Permitir configuração de grupos de feed como abas da tela principal +• [YouTube] Compartilhe como playlist temporária +• [SoundCloud] Aba de curtidas do canal + +Melhorado +• Melhor sugestão na barra de busca +• Mostra data do download em Downloads +• Usar idioma por aplicativo no Android 13 + +Consertado +• Texto no modo escuro consertado +• [YouTube] Conserta playlists não carregando mais do que 100 itens +• [YouTube] Conserta videos recomendados faltando +• Conserta lista de visualização do histórico +• Conserta registro de tempo na resposta de comentários diff --git a/fastlane/metadata/android/pt-BR/changelogs/966.txt b/fastlane/metadata/android/pt-BR/changelogs/966.txt new file mode 100644 index 000000000..13722dc34 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/966.txt @@ -0,0 +1,14 @@ +Novo: +- Acrescentado um novo serviço: Bandcamp + +Melhorado: +- Adicionada uma opção para que a aplicação siga o tema do dispositivo +- Previne alguns travamentos mostrando um painel de erros melhorado +- Mostra mais informações sobre as causas da indisponibilidade do conteúdo +- A tecla de espaço de hardware ativa play/pausa +- Mostra "Download iniciado" + +Resolvido: +- Miniaturas muito pequenas em detalhes de vídeo enquanto se reproduz em fundo +- Corrige título vazio em tocador minimizado +- O último modo de redimensionamento do tamanho não estava sendo restaurado corretamente diff --git a/fastlane/metadata/android/pt-BR/changelogs/967.txt b/fastlane/metadata/android/pt-BR/changelogs/967.txt new file mode 100644 index 000000000..96ce3c07f --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/967.txt @@ -0,0 +1 @@ +Corrigido o YouTube que não funcionava corretamente na UE. Foi causado por um novo cookie e sistema de consentimento de privacidade que requer que a NewPipe configure um cookie CONSENT. diff --git a/fastlane/metadata/android/pt-PT/changelogs/1005.txt b/fastlane/metadata/android/pt-PT/changelogs/1005.txt new file mode 100644 index 000000000..ea0f44608 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/1005.txt @@ -0,0 +1,15 @@ +Novo +• Adicionado apoio para Android Auto +• Permite definir grupos de feeds como guias do ecrã principal +• [YouTube] Partilhar como lista de reprodução temporária +• [SoundCloud] Separador de gostos do canal + +Melhorado +• Melhores sugestões na barra de pesquisa +• Mostrar data da descarga em descargas +• Usar idioma por app do Android 13 + +Corrigido +• Corrigir cores de texto incorretas no modo escuro +• [YouTube] Corrigir listas de reprodução que não carregam mais de 100 elementos +... diff --git a/fastlane/metadata/android/pt/changelogs/1005.txt b/fastlane/metadata/android/pt/changelogs/1005.txt new file mode 100644 index 000000000..ea0f44608 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1005.txt @@ -0,0 +1,15 @@ +Novo +• Adicionado apoio para Android Auto +• Permite definir grupos de feeds como guias do ecrã principal +• [YouTube] Partilhar como lista de reprodução temporária +• [SoundCloud] Separador de gostos do canal + +Melhorado +• Melhores sugestões na barra de pesquisa +• Mostrar data da descarga em descargas +• Usar idioma por app do Android 13 + +Corrigido +• Corrigir cores de texto incorretas no modo escuro +• [YouTube] Corrigir listas de reprodução que não carregam mais de 100 elementos +... diff --git a/fastlane/metadata/android/ru/changelogs/1000.txt b/fastlane/metadata/android/ru/changelogs/1000.txt index 90c03f3cf..776041988 100644 --- a/fastlane/metadata/android/ru/changelogs/1000.txt +++ b/fastlane/metadata/android/ru/changelogs/1000.txt @@ -10,4 +10,4 @@ • Исправить выход из диалогового окна загрузки до его появления. • Исправить всплывающее окно с списком связанных элементов. • Исправлена последовательность в диалоговом окне добавления в плейлист. -• Настроена компоновка элементов закладок плейлиста. +• Настроена компоновка элементов закладок плейлиста diff --git a/fastlane/metadata/android/ru/changelogs/1001.txt b/fastlane/metadata/android/ru/changelogs/1001.txt index 11c3a1061..7b9f2be2f 100644 --- a/fastlane/metadata/android/ru/changelogs/1001.txt +++ b/fastlane/metadata/android/ru/changelogs/1001.txt @@ -1,10 +1,6 @@ Улучшенный - -- Всегда можно изменить настройки уведомлений игрока на Android 13+ - +• Всегда можно изменить настройки уведомлений игрока на Android 13+ Исправлено - -- Исправление экспорта базы данных/подписок, который не обрезал уже существующий файл, что могло привести к повреждению экспорта - -- Исправлено возобновление работы плеера с самого начала при нажатии на временную метку +• Исправление экспорта базы данных/подписок, который не обрезал уже существующий файл, что могло привести к повреждению экспорта +• Исправлено возобновление работы плеера с самого начала при нажатии на временную метку diff --git a/fastlane/metadata/android/ru/changelogs/1002.txt b/fastlane/metadata/android/ru/changelogs/1002.txt index d3978869d..efa895dbf 100644 --- a/fastlane/metadata/android/ru/changelogs/1002.txt +++ b/fastlane/metadata/android/ru/changelogs/1002.txt @@ -1 +1,4 @@ -Исправлено: YouTube не воспроизводил никакие потоки +Исправлена ошибка, из-за которой YouTube не воспроизводил ни одного потока. + +В этом выпуске исправлена только самая серьёзная ошибка, препятствующая загрузке информации о видео YouTube. +Мы знаем о существовании других проблем и вскоре выпустим отдельный выпуск для их решения. diff --git a/fastlane/metadata/android/ru/changelogs/1003.txt b/fastlane/metadata/android/ru/changelogs/1003.txt index d3978869d..4b8843d5c 100644 --- a/fastlane/metadata/android/ru/changelogs/1003.txt +++ b/fastlane/metadata/android/ru/changelogs/1003.txt @@ -1 +1,6 @@ -Исправлено: YouTube не воспроизводил никакие потоки +Это релиз исправления, исправляющий ошибки YouTube: +• [YouTube] Исправлена проблема с загрузкой видеоинформации, исправлены ошибки HTTP 403 при воспроизведении видео и восстановлено воспроизведение некоторых видео с возрастными ограничениями +• Исправлена проблема с отсутствием изменения размера субтитров +• Исправлена проблема с двойной загрузкой информации при открытии трансляции +• [Soundcloud] Удалены невоспроизводимые трансляции с защитой DRM +• Обновлены переводы diff --git a/fastlane/metadata/android/ru/changelogs/1004.txt b/fastlane/metadata/android/ru/changelogs/1004.txt index d3978869d..e6bef35b9 100644 --- a/fastlane/metadata/android/ru/changelogs/1004.txt +++ b/fastlane/metadata/android/ru/changelogs/1004.txt @@ -1 +1,3 @@ -Исправлено: YouTube не воспроизводил никакие потоки +В этом выпуске YouTube теперь поддерживает только трансляцию в формате 360p. + +Обратите внимание, что решение, используемое в этой версии, вероятно, временное, и в долгосрочной перспективе потребуется внедрение видеопротокола SABR. Участники TeamNewPipe сейчас заняты, поэтому любая помощь будет высоко оценена! https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/ru/changelogs/930.txt b/fastlane/metadata/android/ru/changelogs/930.txt index 58a849bf4..0ad761f55 100644 --- a/fastlane/metadata/android/ru/changelogs/930.txt +++ b/fastlane/metadata/android/ru/changelogs/930.txt @@ -7,7 +7,7 @@ • Показывать сообщение, когда контент еще не поддерживается, вместо сбоя • Улучшено изменение размера всплывающего проигрывателя с помощью пинч-жестов • Постановка потоков в очередь при длительном нажатии на фоновые и всплывающие кнопки в канале -• Улучшена обработка размера заголовка заголовка ящика +• Улучшена обработка размера заголовка Исправления • Исправлена ошибка, из-за которой не работает настройка контента с ограничением по возрасту diff --git a/fastlane/metadata/android/ru/changelogs/999.txt b/fastlane/metadata/android/ru/changelogs/999.txt index d3978869d..bf6e1c375 100644 --- a/fastlane/metadata/android/ru/changelogs/999.txt +++ b/fastlane/metadata/android/ru/changelogs/999.txt @@ -1 +1,12 @@ -Исправлено: YouTube не воспроизводил никакие потоки +Этот выпуск исправления исправляет ошибки HTTP 403 в середине видео на YouTube. + +Новое +• [SoundCloud] Добавлена поддержка URL-адресов on.soundcloud.com + +Улучшено +• [Bandcamp] Отображение дополнительной информации в радиокиоске + +Исправлено +• [YouTube] Исправлены случайные ошибки HTTP 403 в начале или середине видео +• [YouTube] Извлечение аватара и баннера из большего количества типов заголовков каналов +• [Bandcamp] Исправлены различные ошибки и всегда используется HTTPS diff --git a/fastlane/metadata/android/sr/changelogs/994.txt b/fastlane/metadata/android/sr/changelogs/994.txt index 3ed14410d..4fa4f102b 100644 --- a/fastlane/metadata/android/sr/changelogs/994.txt +++ b/fastlane/metadata/android/sr/changelogs/994.txt @@ -7,7 +7,7 @@ • [Bandcamp] Управљање нумерама иза платног зида Поправљено -• [YouTube] 403 HTTP грешке за стримове +• [YouTube] 403 HTTP грешке за токове • Црни плејер при преласку на главни плејер са приказа плејлисте • Цурење сервисне меморије плејера • [PeerTube] Аватари отпремаоца и подканала су замењени diff --git a/fastlane/metadata/android/sv/changelogs/1005.txt b/fastlane/metadata/android/sv/changelogs/1005.txt new file mode 100644 index 000000000..203cac267 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/1005.txt @@ -0,0 +1,17 @@ +Nytt +• Stöd för Android Auto +• Flödesgrupper kan ställas in som flikar på huvudskärmen +• [YouTube] Dela som tillfällig spellista +• [SoundCloud] Gilla-kanalflik + +Förbättrat +• Bättre tips för sökfältet +• Visa hämtningsdatum i Hämtningar +• Använd Android 13 per- app språk + +Fixat +• Fixade textfärger i mörkt läge +• [YouTube] Fixade att spellistor inte laddade mer än 100 objekt +• [YouTube] Fixade saknade rekommenderade videor +• Fixade krascher i historiklistvyn +• Fixade tidsstämplar i kommentarsvar diff --git a/fastlane/metadata/android/th/changelogs/1000.txt b/fastlane/metadata/android/th/changelogs/1000.txt new file mode 100644 index 000000000..f80fa2800 --- /dev/null +++ b/fastlane/metadata/android/th/changelogs/1000.txt @@ -0,0 +1,13 @@ +ที่มีการปรับปรุง +• สร้างรายการเพลงที่สามารถคลิกให้แสดงได้โดยมีเนื้อหาเพื่มขึ้น/ลดลง +• [PeerTube] แฮนเดิล `subscribeto.me` ลิงค์ของอินสแตนส์จะขึ้นอัตโนมัติ +• • • เริ่มต้นด้วยรายการเดียวในประวัติของหน้าจอ + +ที่มีการปรับปรุง +• ปุ่มการมองเห็นของ RSS +• พรีวิวแท็บตัวอย่างที่มีการขัดข้อง +• แก้ไขหน้าปกของเพลย์ลิสต์ที่ไม่ขึ้น +• แก้ไขการตั้งค่าการดาวน์โหลดก่อนที่จะปรากฏ +• แก้ไขรายการที่เกี่ยวข้องกับคิวป๊อปอัป +• แก้ไขลำดับในเพลย์ลิสต์ลงในรายการที่จะเล่น +• ปรับแต่งเค้าโครงรายการบุ๊กมาร์กของเพลย์ลิสต์ diff --git a/fastlane/metadata/android/th/full_description.txt b/fastlane/metadata/android/th/full_description.txt new file mode 100644 index 000000000..e75af94af --- /dev/null +++ b/fastlane/metadata/android/th/full_description.txt @@ -0,0 +1 @@ +NewPipe จะไม่ใช้เฟรมเวิร์กของกูเกิลที่มีหรือ API ของยูทูบ โดยแค่นำโครงสร้างของเว็บไซต์เพื่อนำข้อมูลที่ต้องการ ยังไงก็ตามตัวแอปก็สามารถใช้งานได้โดยไม่ต้องติดตั้งบริการของกูเกิล คุณไม่ต้องมีบัญชียูทูปเพื่อใช้ NewPipe, และตัว FLOSS diff --git a/fastlane/metadata/android/th/short_description.txt b/fastlane/metadata/android/th/short_description.txt new file mode 100644 index 000000000..211644bbc --- /dev/null +++ b/fastlane/metadata/android/th/short_description.txt @@ -0,0 +1 @@ +ยูทูปแบบฟรีที่เบาสําหรับแอนดรอยด์ diff --git a/fastlane/metadata/android/tr/changelogs/1005.txt b/fastlane/metadata/android/tr/changelogs/1005.txt new file mode 100644 index 000000000..82b3e2e9c --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/1005.txt @@ -0,0 +1,17 @@ +Yeni +• Android Auto desteği eklendi +• Akış gruplarını ana ekran sekmeleri olarak ayarlama özelliği eklendi +• [YouTube] Geçici oynatma listesi olarak paylaşma özelliği eklendi +• [SoundCloud] Beğeniler kanalı sekmesi eklendi + +Geliştirildi +• Arama çubuğu ipuçları iyileştirildi +• İndirilenler bölümünde indirme tarihi gösteriliyor +• Android 13 uygulama başına dil ayarı desteği eklendi + +Düzeltildi +• Karanlık modda bozuk metin renkleri düzeltildi +• [YouTube] 100’den fazla öğe yüklenmeyen oynatma listeleri sorunu giderildi +• [YouTube] Eksik önerilen videolar düzeltildi +• Geçmiş liste görünümünde oluşan çökme sorunu giderildi +• Yorum yanıtlarındaki zaman damgaları düzeltildi diff --git a/fastlane/metadata/android/vi/changelogs/1000.txt b/fastlane/metadata/android/vi/changelogs/1000.txt index 209bef6f0..e812a4fea 100644 --- a/fastlane/metadata/android/vi/changelogs/1000.txt +++ b/fastlane/metadata/android/vi/changelogs/1000.txt @@ -1,4 +1,4 @@ -Đã cải thiện +Những cải thiện • Làm cho mô tả của danh sách phát có thể nhấp vào để hiển thị nhiều / ít nội dung hơn • [PeerTube] Tự động xử lý các liên kết như 'subscribeto.me' • Chỉ bắt đầu phát một mục trong màn hình lịch sử diff --git a/fastlane/metadata/android/vi/changelogs/1004.txt b/fastlane/metadata/android/vi/changelogs/1004.txt index d2086b62c..f3f9865f2 100644 --- a/fastlane/metadata/android/vi/changelogs/1004.txt +++ b/fastlane/metadata/android/vi/changelogs/1004.txt @@ -1 +1,3 @@ -Đã sửa lỗi YouTube không phát bất kỳ luồng nào +Bản phát hành này khắc phục lỗi YouTube chỉ cung cấp luồng 360p. + +Lưu ý rằng giải pháp được sử dụng trong phiên bản này có thể chỉ là tạm thời, và về lâu dài, giao thức video SABR cần được triển khai, nhưng hiện tại các thành viên TeamNewPipe đang rất bận rộn nên chúng tôi rất mong nhận được sự giúp đỡ! https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/vi/changelogs/1005.txt b/fastlane/metadata/android/vi/changelogs/1005.txt new file mode 100644 index 000000000..7eeb567b7 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/1005.txt @@ -0,0 +1,17 @@ +Mới +• Hỗ trợ cho Android Auto +• Cho phép đặt nhóm nguồn cấp dữ liệu làm tab màn hình chính +• [YouTube] Chia sẻ dưới dạng danh sách phát tạm thời +• [SoundCloud] Tab kênh thích + +Cải thiện +• Gợi ý thanh tìm kiếm tốt hơn +• Hiển thị ngày tải xuống trong mục Tải xuống +• Sử dụng cài đặt ngôn ngữ cho từng ứng dụng (Android 13+) + +Đã sửa +• Màu chữ bị hỏng ở chế độ tối +• [YouTube] Danh sách phát không tải được hơn 100 mục +• [YouTube] Thiếu video được đề xuất +• Sập trong Lịch sử +• Dấu thời gian trong phần trả lời bình luận diff --git a/fastlane/metadata/android/vi/changelogs/64.txt b/fastlane/metadata/android/vi/changelogs/64.txt index 3ba81c8e4..bd932e509 100644 --- a/fastlane/metadata/android/vi/changelogs/64.txt +++ b/fastlane/metadata/android/vi/changelogs/64.txt @@ -1,7 +1,7 @@ ### Cải thiện - Thêm tính năng giới hạn độ phân giải video nếu đang sử dụng dữ liệu di động (yêu cầu #1339) - Ghi nhớ độ sáng màn hình trong phiên (yêu cầu #1442) -- Cải thiện hiệu năng của trình tải cho các CPU có hiệu năng yếu (vấn đề #1431) +- Cải thiện tốc độ tải xuống cho các CPU có hiệu năng yếu (vấn đề #1431) - Hỗ trợ cho media session (yêu cầu #1433) ### Sửa lỗi diff --git a/fastlane/metadata/android/vi/changelogs/65.txt b/fastlane/metadata/android/vi/changelogs/65.txt index de47bd38b..3b25b25d7 100644 --- a/fastlane/metadata/android/vi/changelogs/65.txt +++ b/fastlane/metadata/android/vi/changelogs/65.txt @@ -1,10 +1,9 @@ -##Cải thiện: -### Cải tiến +### Cải thiện: - Tắt hoạt ảnh biểu tượng burgermenu #1486 -- hoàn tác xóa các bản tải xuống # 1472 +- Hoàn tác xóa các bản tải xuống # 1472 - Tùy chọn tải xuống trong menu chia sẻ #1498 -- Đã thêm tùy chọn chia sẻ vào menu nhấn dài #1454 +- Đã thêm tùy chọn chia sẻ vào menu nhấn giữ #1454 - Thu nhỏ trình phát chính ở lối ra #1354 - Cập nhật phiên bản thư viện và sửa lỗi sao lưu cơ sở dữ liệu #1510 - Cập nhật ExoPlayer 2.8.2 #1392 diff --git a/fastlane/metadata/android/vi/full_description.txt b/fastlane/metadata/android/vi/full_description.txt index 63f66cb18..81ecf1d63 100644 --- a/fastlane/metadata/android/vi/full_description.txt +++ b/fastlane/metadata/android/vi/full_description.txt @@ -1 +1 @@ -NewPipe không sử dụng bất kì thư viện nào của Google, hay API của YouTube. Nó chỉ đọc và phân tích trang web để lấy thông tin cần thiết. Vì thế, ứng dụng này có thể dùng được trên các thiết bị không có cài đặt Dịch vụ của Google Play. Bạn cũng không cần tài khoản YouTube để sử dụng NewPipe, và ứng dụng này là mã nguồn mở (FLOSS). +NewPipe không sử dụng bất kì thư viện nào của Google, hay API của YouTube. Nó chỉ đọc và phân tích trang web để lấy thông tin cần thiết. Vì thế, ứng dụng này có thể dùng được trên các thiết bị không có cài đặt Dịch vụ của Google. Bạn cũng không cần tài khoản YouTube để sử dụng NewPipe, và ứng dụng này là mã nguồn mở (FLOSS). diff --git a/fastlane/metadata/android/zh-Hans/changelogs/1002.txt b/fastlane/metadata/android/zh-Hans/changelogs/1002.txt index 8a5424c9e..ae42beccc 100644 --- a/fastlane/metadata/android/zh-Hans/changelogs/1002.txt +++ b/fastlane/metadata/android/zh-Hans/changelogs/1002.txt @@ -1 +1,4 @@ -修复YouTube无法播放任何视频 +修复YouTube不播放任何串流的问题 + +此版本只解决了阻止最紧迫的阻止 YouTube 视频详情加载的错误。 +我们知道有其他问题,会在不久后发布另一个版本解决它们。 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/1003.txt b/fastlane/metadata/android/zh-Hans/changelogs/1003.txt index 8a5424c9e..195ffeb58 100644 --- a/fastlane/metadata/android/zh-Hans/changelogs/1003.txt +++ b/fastlane/metadata/android/zh-Hans/changelogs/1003.txt @@ -1 +1,6 @@ -修复YouTube无法播放任何视频 +修复 YouTube 错误的热修复版本: +• [YouTube]修复不加载任何视频的问题,修复播放视频时的 HTTP 403 错误, 恢复某些年龄受限视频的播放 +• 修复字幕尺寸未被更改的问题 +• 修复打开串流时下载两次信息的问题 +• [Soundcloud] 删除不可播放的受 DRM 保护的串流 +• 更新翻译 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/1004.txt b/fastlane/metadata/android/zh-Hans/changelogs/1004.txt index 8a5424c9e..8b667904a 100644 --- a/fastlane/metadata/android/zh-Hans/changelogs/1004.txt +++ b/fastlane/metadata/android/zh-Hans/changelogs/1004.txt @@ -1 +1,3 @@ -修复YouTube无法播放任何视频 +此版本修复 YouTube 只提供 360p 串流的问题。 + +注意此版本部署的解决方案可能是临时性的,长期来看需要使用 SABR 视频协议,但 Newpipe 团队成员目前没空,我们十分感谢任何帮助!https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/998.txt b/fastlane/metadata/android/zh-Hans/changelogs/998.txt index 8a5424c9e..edffb7593 100644 --- a/fastlane/metadata/android/zh-Hans/changelogs/998.txt +++ b/fastlane/metadata/android/zh-Hans/changelogs/998.txt @@ -1 +1,4 @@ -修复YouTube无法播放任何视频 +修复 YouTube 因 HTTP 403 错误不播放任何串流的问题 + +还没修复 YouTube 视频中间偶尔的 403 错误. +该问题会尽快在另一个热修复版本中得以解决。 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/999.txt b/fastlane/metadata/android/zh-Hans/changelogs/999.txt index 8a5424c9e..791c12314 100644 --- a/fastlane/metadata/android/zh-Hans/changelogs/999.txt +++ b/fastlane/metadata/android/zh-Hans/changelogs/999.txt @@ -1 +1,12 @@ -修复YouTube无法播放任何视频 +此热修复版本修复 YouTube 视频播放中的 HTTP 403 错误。 + +新功能 +• [SoundCloud] 支持 on.soundcloud.com URLs + +改进 +• [Bandcamp] 在电台 kiosk 中显示附加信息 + +修复 +• [YouTube] 视频开头或当中偶然的 403 错误 +• [YouTube] 从更多频道标头类型提取头像和横幅 +• [Bandcamp] 多个故障和始终使用 HTTPS diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/1005.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/1005.txt new file mode 100644 index 000000000..8389ad0be --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/1005.txt @@ -0,0 +1,17 @@ +新功能 +• 加入咗對 Android Auto 應用程式嘅支援 +• 允許將資訊提供群組設定為主螢幕標籤 +• 【 YouTube 】可分享為臨時播放清單 +• 【 SoundCloud 】可設定為最喜愛頻道標籤 + +改善 +• 更好嘅搜尋列提示 +• 「下載」介面會顯示下載日期 +• 使用 Android 13為所有應用程式嘅語言 + +修復 +• 修復咗深色模式下破碎嘅文字顏色 +• 修復咗【 YouTube 】播放清單無法載入超過100 個項目嘅問題 +• 修復咗【 YouTube 】推薦影片消失嘅問題 +• 修復咗睇緊播放記錄期間會死機嘅問題 +• 修復咗留言同回覆入面嘅時間戳記 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/64.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/64.txt new file mode 100644 index 000000000..65e8afaf9 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/64.txt @@ -0,0 +1,8 @@ +### 改善 +- 加入咗喺使用流動數據時限制影片質素嘅功能。#1339 +- 會記錄並使用你設定嘅亮度。#1442 +- 改善在較弱CPU上嘅設備嘅下載效能。#1431 +- 加入咗(可用)媒體支援。#1433 + +### 修復 +- 修復咗打開下載時發生死機嘅問題(修復版本已推出)。#1441 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/65.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/65.txt new file mode 100644 index 000000000..eaa087920 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/65.txt @@ -0,0 +1,26 @@ +### 改善 + +- 停用漢堡選單圖示動畫 #1486 +- 還原已刪除嘅下載項目 #1472 +- 喺分享選單中加入下載選項 #1498 +- 喺長按選單中加入分享選項 #1454 +- 離開時最小化主播放器 #1354 +- 更新資料庫版本並修復備份問題 #1510 +- ExoPlayer 2.8.2 更新 #1392 +- 重新設計播放速度控制對話框,支援更細緻嘅速度調整步幅。 +- 加入靜音時快轉嘅切換選項,有助於聽有聲書或某啲音樂類型,提供更流暢嘅體驗(但可能會令某啲有大量靜音段落嘅歌曲播放出現問題 =\\)。 +- 重構媒體來源解析方式,令播放器可以內部傳遞媒體同時附帶嘅中繼資料,而唔需要手動處理。播放一開始就可以直接使用統一來源嘅中繼資料。 +- 修復遠端播放清單中繼資料喺開啟播放清單片段時未能更新嘅問題。 +- 各種 UI 修復:#1383,例如背景播放器通知控制改為固定白色、彈出播放器更容易關閉。 +- 使用新架構重構嘅多服務擷取器 + +### 修復項目 + +- 修復咗 #1440 影片資訊版面錯誤配置 #1491 +- 修復咗無法觀看播放記錄問題 #1497 +- #1495:當使用者打開播放清單時即時更新中繼資料(縮圖、標題、影片數量)。 +- #1475:當使用者喺詳細頁面用外部播放器播放影片時,會喺資料庫中登記一次觀看記錄。 +- 修復咗彈出模式下螢幕逾時問題 #1463(已修復 #640) +- 主播放器修復 #1509 +- [#1412] 修復咗重複播放模式喺接收新指示時,播放器處於背景導致 NPE 嘅問題。 +- 修復咗未授權彈出權限時將播放器最小化到彈出視窗不會關掉播放器嘅問題。 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/66.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/66.txt new file mode 100644 index 000000000..d5a6d607a --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/66.txt @@ -0,0 +1,33 @@ +# v0.13.7 更新日誌 + +### 修復 +- 修復咗 v0.13.6 中排序篩選器嘅問題 + +# v0.13.6 更新日誌 + +### 改善 + +- 停用漢堡選單圖示動畫 #1486 +- 還原已刪除嘅下載項目 #1472 +- 喺分享選單中加入下載選項 #1498 +- 喺長按選單中加入分享選項 #1454 +- 離開時最小化主播放器 #1354 +- 更新資料庫版本並修復備份問題 #1510 +- ExoPlayer 2.8.2 更新 #1392 +- 重新設計播放速度控制對話框,支援更細緻嘅速度調整步幅。 +- 加入靜音時快轉嘅切換選項,有助於聽有聲書或某啲音樂類型,提供更流暢嘅體驗(但可能會令某啲有大量靜音段落嘅歌曲播放出現問題 =\\)。 +- 重構媒體來源解析方式,令播放器可以內部傳遞媒體同時附帶嘅中繼資料,而唔需要手動處理。播放一開始就可以直接使用統一來源嘅中繼資料。 +- 修復遠端播放清單中繼資料喺開啟播放清單片段時未能更新嘅問題。 +- 各種 UI 修復:#1383,例如背景播放器通知控制改為固定白色、彈出播放器更容易關閉。 +- 使用新架構重構嘅多服務擷取器 + +### 修復項目 + +- 修復咗 #1440 影片資訊版面錯誤配置 #1491 +- 修復咗無法觀看播放記錄問題 #1497 +- #1495:當使用者打開播放清單時即時更新中繼資料(縮圖、標題、影片數量)。 +- #1475:當使用者喺詳細頁面用外部播放器播放影片時,會喺資料庫中登記一次觀看記錄。 +- 修復咗彈出模式下螢幕逾時問題 #1463(已修復 #640) +- 主播放器修復 #1509 +- [#1412] 修復咗重複播放模式喺接收新指示時,播放器處於背景導致 NPE 嘅問題。 +- 修復咗未授權彈出權限時將播放器最小化到彈出視窗不會關掉播放器嘅問題。 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/68.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/68.txt new file mode 100644 index 000000000..00b67b1ea --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/68.txt @@ -0,0 +1,31 @@ +# v0.14.1 更新內容 + +### 修復項目 +- 修復咗無法解密影片網址嘅問題 #1659 +- 修復咗影片描述連結擷取唔準確嘅問題 #1657 + +# v0.14.0 更新內容 + +### 新功能 +- 全新抽屜式選單設計 #1461 +- 可自訂嘅主頁介面 #1461 + +### 改善項目 +- 重新設計手勢控制功能 #1604 +- 加入新方式關閉彈出播放器 #1597 + +### 修復項目 +- 修復訂閱人數無法取得時出錯嘅問題。已關閉 #1649 + - 當無法取得訂閱人數時,會顯示「無法取得訂閱人數」 +- 修復 YouTube 播放清單為空時出現 NPE 錯誤 +- 快速修復 SoundCloud 互動資訊站問題 +- 重構並修復錯誤 #1623 + - 修復循環搜尋結果問題 #1562 + - 修復進度條未正確排版問題 + - 修復 YouTube Premium 影片未正確封鎖問題 + - 修復影片有時無法載入(因 DASH 解析問題) + - 修復影片描述中連結無法點擊問題 + - 當使用者嘗試下載至外置 SD 卡時顯示警告 + - 修復「無內容顯示」錯誤觸發回報問題 + - 修復 Android 8.1 背景播放器未顯示縮圖問題 [詳情請參閱](https://github.com/TeamNewPipe/NewPipe/issues/943) +- 修復廣播接收器註冊問題。已關閉 #1641 From b7bf07d5e4d1e4b2861b068f7380988bc56f773e Mon Sep 17 00:00:00 2001 From: Tobi Date: Mon, 17 Nov 2025 01:05:24 -0800 Subject: [PATCH 038/190] Update PR template to specify target branch for features Added a note to target the 'refactor' branch for features. --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 407c00a39..2062e840d 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -2,7 +2,7 @@ #### What is it? - [ ] Bugfix (user facing) -- [ ] Feature (user facing) +- [ ] Feature (user facing) ⚠️ **Your PR must target the [`refactor`](https://github.com/TeamNewPipe/NewPipe/tree/refactor) branch** - [ ] Codebase improvement (dev facing) - [ ] Meta improvement to the project (dev facing) From 85bd7c3351b3787f472a354d0c2376a099b7beb8 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sat, 8 Nov 2025 10:29:43 +0800 Subject: [PATCH 039/190] HistoryDao: latestEntry can be null Signed-off-by: Aayush Gupta --- .../java/org/schabi/newpipe/database/history/dao/HistoryDAO.kt | 2 +- .../org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.kt b/app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.kt index d986d0c3b..fda46073b 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.kt @@ -9,5 +9,5 @@ package org.schabi.newpipe.database.history.dao import org.schabi.newpipe.database.BasicDAO interface HistoryDAO : BasicDAO { - val latestEntry: T + val latestEntry: T? } diff --git a/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt b/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt index a249721fc..e20e10de9 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt @@ -15,7 +15,7 @@ import org.schabi.newpipe.database.history.model.SearchHistoryEntry interface SearchHistoryDAO : HistoryDAO { @get:Query("SELECT * FROM search_history WHERE id = (SELECT MAX(id) FROM search_history)") - override val latestEntry: SearchHistoryEntry + override val latestEntry: SearchHistoryEntry? @Query("DELETE FROM search_history") override fun deleteAll(): Int From 9702189be401708e6f5b4f837adfc3721f6c18b6 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 17 Nov 2025 14:40:38 +0800 Subject: [PATCH 040/190] Move latestEntry into SearchHistoryDao directly The StreamHistoryDao one isn't used, so remove it and streamline the logic Signed-off-by: Aayush Gupta --- .../newpipe/database/history/dao/HistoryDAO.kt | 13 ------------- .../database/history/dao/SearchHistoryDAO.kt | 5 +++-- .../database/history/dao/StreamHistoryDAO.kt | 6 ++---- 3 files changed, 5 insertions(+), 19 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.kt diff --git a/app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.kt b/app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.kt deleted file mode 100644 index fda46073b..000000000 --- a/app/src/main/java/org/schabi/newpipe/database/history/dao/HistoryDAO.kt +++ /dev/null @@ -1,13 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2017 NewPipe contributors - * SPDX-FileCopyrightText: 2025 NewPipe e.V. - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -package org.schabi.newpipe.database.history.dao - -import org.schabi.newpipe.database.BasicDAO - -interface HistoryDAO : BasicDAO { - val latestEntry: T? -} diff --git a/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt b/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt index e20e10de9..ddcb00489 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt @@ -9,13 +9,14 @@ package org.schabi.newpipe.database.history.dao import androidx.room.Dao import androidx.room.Query import io.reactivex.rxjava3.core.Flowable +import org.schabi.newpipe.database.BasicDAO import org.schabi.newpipe.database.history.model.SearchHistoryEntry @Dao -interface SearchHistoryDAO : HistoryDAO { +interface SearchHistoryDAO : BasicDAO { @get:Query("SELECT * FROM search_history WHERE id = (SELECT MAX(id) FROM search_history)") - override val latestEntry: SearchHistoryEntry? + val latestEntry: SearchHistoryEntry? @Query("DELETE FROM search_history") override fun deleteAll(): Int diff --git a/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt b/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt index dfea41e12..432c93a55 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt @@ -10,15 +10,13 @@ import androidx.room.Dao import androidx.room.Query import androidx.room.RewriteQueriesToDropUnusedColumns import io.reactivex.rxjava3.core.Flowable +import org.schabi.newpipe.database.BasicDAO import org.schabi.newpipe.database.history.model.StreamHistoryEntity import org.schabi.newpipe.database.history.model.StreamHistoryEntry import org.schabi.newpipe.database.stream.StreamStatisticsEntry @Dao -abstract class StreamHistoryDAO : HistoryDAO { - - @get:Query("SELECT * FROM stream_history WHERE access_date = (SELECT MAX(access_date) FROM stream_history)") - abstract override val latestEntry: StreamHistoryEntity +abstract class StreamHistoryDAO : BasicDAO { @Query("SELECT * FROM stream_history") abstract override fun getAll(): Flowable> From 93f03bab87343a1a77936f2638ce91955287aa15 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 17 Nov 2025 16:09:45 +0800 Subject: [PATCH 041/190] Call checkpoint creation from an executor java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time. Signed-off-by: Aayush Gupta --- .../newpipe/settings/BackupRestoreSettingsFragment.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java index 321ad65da..2900dee90 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java @@ -40,6 +40,8 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.Objects; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class BackupRestoreSettingsFragment extends BasePreferenceFragment { @@ -155,9 +157,9 @@ public class BackupRestoreSettingsFragment extends BasePreferenceFragment { } private void exportDatabase(final StoredFileHelper file, final Uri exportDataUri) { - try { + try (ExecutorService executor = Executors.newSingleThreadExecutor()) { //checkpoint before export - NewPipeDatabase.checkpoint(); + executor.submit(NewPipeDatabase::checkpoint).get(); final SharedPreferences preferences = PreferenceManager .getDefaultSharedPreferences(requireContext()); From f4d138d06fe0bd5bd277744533e063e2a3fb50c8 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 19 Nov 2025 08:51:38 +0800 Subject: [PATCH 042/190] Partial-revert: Migrate from KAPT to KSP statesaver has been deprecated for ~ 6 years and incompatible with KSP Signed-off-by: Aayush Gupta --- app/build.gradle.kts | 3 ++- build.gradle.kts | 1 + gradle/libs.versions.toml | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e4f318f65..c4cd5aee9 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -6,6 +6,7 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.jetbrains.kotlin.android) + alias(libs.plugins.jetbrains.kotlin.kapt) alias(libs.plugins.google.ksp) alias(libs.plugins.jetbrains.kotlin.parcelize) alias(libs.plugins.sonarqube) @@ -228,7 +229,7 @@ dependencies { /** Third-party libraries **/ implementation(libs.livefront.bridge) implementation(libs.evernote.statesaver.core) - ksp(libs.evernote.statesaver.compiler) + kapt(libs.evernote.statesaver.compiler) // HTML parser implementation(libs.jsoup) diff --git a/build.gradle.kts b/build.gradle.kts index d16afb3af..2c9173f57 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,6 +6,7 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.jetbrains.kotlin.android) apply false + alias(libs.plugins.jetbrains.kotlin.kapt) apply false alias(libs.plugins.google.ksp) apply false alias(libs.plugins.jetbrains.kotlin.parcelize) apply false alias(libs.plugins.sonarqube) apply false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cd54e5ef4..10e60455f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -45,7 +45,7 @@ rxandroid = "3.0.2" rxbinding = "4.0.0" rxjava = "3.1.12" sonarqube = "4.0.0.2929" -statesaver = "1.4.1" +statesaver = "1.4.1" # TODO: Drop because it is deprecated and incompatible with KSP2 stetho = "1.6.0" swiperefreshlayout = "1.1.0" # You can use a local version by uncommenting a few lines in settings.gradle @@ -133,5 +133,6 @@ squareup-picasso = { module = "com.squareup.picasso:picasso", version.ref = "pic android-application = { id = "com.android.application", version.ref = "agp" } google-ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +jetbrains-kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } # Needed for statesaver jetbrains-kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } sonarqube = { id = "org.sonarqube", version.ref = "sonarqube" } From 8f91f21f27af3e08c580f98894d4a16bf7d52a9e Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 Nov 2025 15:14:55 +0800 Subject: [PATCH 043/190] Bump Gradle to latest stable release Also update the wrapper using the ./gradlew wrapper command Signed-off-by: Aayush Gupta --- gradle/wrapper/gradle-wrapper.jar | Bin 62076 -> 45633 bytes gradle/wrapper/gradle-wrapper.properties | 5 ++-- gradlew | 33 ++++++++++++----------- gradlew.bat | 25 ++++++++--------- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c1962a79e29d3e0ab67b14947c167a862655af9b..f8e1ee3125fe0768e9a76ee977ac089eb657005e 100644 GIT binary patch literal 45633 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�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 literal 62076 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 57939822b..8a848873f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,8 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionSha256Sum=72f44c9f8ebcb1af43838f45ee5c4aa9c5444898b3468ab3f4af7b6076c5bc3f +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index aeb74cbb4..adff685a0 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -83,7 +85,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -111,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -130,10 +132,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -141,7 +146,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -149,7 +154,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -166,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -198,16 +202,15 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 6689b85be..e509b2dd8 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,22 +59,21 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell From 4a8592c5ba1b0d01b5fffc9229c50f2454a5dce3 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 Nov 2025 15:17:24 +0800 Subject: [PATCH 044/190] Enable Gradle configuration cache Signed-off-by: Aayush Gupta --- gradle.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gradle.properties b/gradle.properties index ed32303da..01e1aa01f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,3 +4,6 @@ android.nonTransitiveRClass=true android.useAndroidX=true org.gradle.jvmargs=-Xmx2048M --add-opens jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED systemProp.file.encoding=utf-8 + +# https://docs.gradle.org/current/userguide/configuration_cache.html +org.gradle.configuration-cache=true From 0a0f28e801a958c80dad963314e37605163a45b5 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 Nov 2025 15:21:28 +0800 Subject: [PATCH 045/190] Bump dependencies to possible stable releases androidx has bumped minSdk to API 23 which makes us unable to use latest version of: * room * workmanager Signed-off-by: Aayush Gupta --- gradle/libs.versions.toml | 52 +++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 10e60455f..5a2b9cf41 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,47 +4,47 @@ # [versions] -acra = "5.11.3" -agp = "8.13.0" +acra = "5.13.1" +agp = "8.13.1" appcompat = "1.7.1" -assertj = "3.24.2" +assertj = "3.27.6" autoservice = "1.1.1" bridge = "v2.0.2" cardview = "1.0.0" -checkstyle = "10.26.1" -constraintlayout = "2.1.4" -core = "1.12.0" -desugar = "2.0.4" -documentfile = "1.0.1" -exoplayer = "2.18.7" -fragment = "1.6.2" +checkstyle = "12.1.2" +constraintlayout = "2.2.1" +core = "1.17.0" +desugar = "2.1.5" +documentfile = "1.1.0" +exoplayer = "2.19.1" +fragment = "1.8.9" groupie = "2.10.1" jsoup = "1.21.2" junit = "4.13.2" -junit-ext = "1.1.5" -kotlin = "1.9.25" -ksp = "1.9.25-1.0.20" +junit-ext = "1.3.0" +kotlin = "2.2.21" +ksp = "2.3.2" ktlint = "0.45.2" -leakcanary = "2.12" -lifecycle = "2.6.2" +leakcanary = "2.14" +lifecycle = "2.9.4" # Newer versions require minSdk >= 23 localbroadcastmanager = "1.1.0" markwon = "4.6.2" -material = "1.11.0" +material = "1.13.0" media = "1.7.1" -mockitoCore = "5.6.0" -okhttp = "4.12.0" -phoenix = "2.1.2" +mockitoCore = "5.20.0" +okhttp = "5.3.2" +phoenix = "3.0.0" #noinspection NewerVersionAvailable,GradleDependency --> 2.8 is the last version, not 2.71828! picasso = "2.8" preference = "1.2.1" prettytime = "5.0.8.Final" -recyclerview = "1.3.2" -room = "2.6.1" -runner = "1.5.2" +recyclerview = "1.4.0" +room = "2.7.2" # Newer versions require minSdk >= 23 +runner = "1.7.0" rxandroid = "3.0.2" rxbinding = "4.0.0" rxjava = "3.1.12" -sonarqube = "4.0.0.2929" +sonarqube = "7.0.1.6134" statesaver = "1.4.1" # TODO: Drop because it is deprecated and incompatible with KSP2 stetho = "1.6.0" swiperefreshlayout = "1.1.0" @@ -60,8 +60,8 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # to cause jitpack to regenerate the artifact. teamnewpipe-newpipe-extractor = "3af73262cc60cf555fd5f1d691f6c58e2db38ef5" viewpager2 = "1.1.0" -webkit = "1.9.0" -work = "2.8.1" +webkit = "1.14.0" +work = "2.10.5" # Newer versions require minSdk >= 23 [libraries] acra-core = { module = "ch.acra:acra-core", version.ref = "acra" } @@ -87,7 +87,7 @@ androidx-runner = { module = "androidx.test:runner", version.ref = "runner" } androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "swiperefreshlayout" } androidx-viewpager2 = { module = "androidx.viewpager2:viewpager2", version.ref = "viewpager2" } androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } -androidx-work-runtime = { module = "androidx.work:work-runtime-ktx", version.ref = "work" } +androidx-work-runtime = { module = "androidx.work:work-runtime", version.ref = "work" } androidx-work-rxjava3 = { module = "androidx.work:work-rxjava3", version.ref = "work" } assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertj" } evernote-statesaver-compiler = { module = "com.evernote:android-state-processor", version.ref = "statesaver" } From b06b7c35caf5faeb4cf1bb1fb824a13f3864e024 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 5 Nov 2025 12:01:39 +0800 Subject: [PATCH 046/190] Relocate toml lint task to buildSrc and extend against default task Fixes build errors after Gradle 9.x upgrade Ref: https://docs.gradle.org/current/userguide/implementing_custom_tasks.html Signed-off-by: Aayush Gupta --- app/build.gradle.kts | 6 ++-- buildSrc/build.gradle.kts | 12 ++++++++ .../src/main/kotlin/CheckDependenciesOrder.kt | 29 ++++++++++++------- 3 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 buildSrc/build.gradle.kts rename app/check-dependencies.gradle.kts => buildSrc/src/main/kotlin/CheckDependenciesOrder.kt (73%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c4cd5aee9..472e55e5d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,8 +13,6 @@ plugins { checkstyle } -apply(from = "check-dependencies.gradle.kts") - val gitWorkingBranch = providers.exec { commandLine("git", "rev-parse", "--abbrev-ref", "HEAD") }.standardOutput.asText.map { it.trim() } @@ -173,6 +171,10 @@ tasks.register("formatKtlint") { jvmArgs = listOf("--add-opens", "java.base/java.lang=ALL-UNNAMED") } +tasks.register("checkDependenciesOrder") { + tomlFile = layout.projectDirectory.file("../gradle/libs.versions.toml") +} + afterEvaluate { tasks.named("preDebugBuild").configure { if (!System.getProperties().containsKey("skipFormatKtlint")) { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 000000000..713cead4b --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +plugins { + `kotlin-dsl` +} + +repositories { + gradlePluginPortal() +} diff --git a/app/check-dependencies.gradle.kts b/buildSrc/src/main/kotlin/CheckDependenciesOrder.kt similarity index 73% rename from app/check-dependencies.gradle.kts rename to buildSrc/src/main/kotlin/CheckDependenciesOrder.kt index fc77148db..8bf92d8cd 100644 --- a/app/check-dependencies.gradle.kts +++ b/buildSrc/src/main/kotlin/CheckDependenciesOrder.kt @@ -4,18 +4,27 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -tasks.register("checkDependenciesOrder") { - group = "verification" - description = "Checks that each section in libs.versions.toml is sorted alphabetically" +import org.gradle.api.DefaultTask +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.TaskAction - val tomlFile = file("../gradle/libs.versions.toml") +abstract class CheckDependenciesOrder : DefaultTask() { - doLast { - if (!tomlFile.exists()) { - throw GradleException("TOML file not found") - } + @get:InputFile + abstract val tomlFile: RegularFileProperty - val lines = tomlFile.readLines() + init { + group = "verification" + description = "Checks that each section in libs.versions.toml is sorted alphabetically" + } + + @TaskAction + fun run() { + val file = tomlFile.get().asFile + if (!file.exists()) error("TOML file not found") + + val lines = file.readLines() val nonSortedBlocks = mutableListOf>() var currentBlock = mutableListOf() var prevLine = "" @@ -50,7 +59,7 @@ tasks.register("checkDependenciesOrder") { } if (nonSortedBlocks.isNotEmpty()) { - throw GradleException( + error( "The following lines were not sorted:\n" + nonSortedBlocks.joinToString("\n\n") { it.joinToString("\n") } ) From 0131bb227fe5ee72bae10035172c2ab63c976123 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 5 Nov 2025 12:48:08 +0800 Subject: [PATCH 047/190] Silence warnings regarding new annotation property behavior Ref: https://kotlinlang.org/docs/annotations.html#defaults-when-no-use-site-targets-are-specified Signed-off-by: Aayush Gupta --- app/build.gradle.kts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 472e55e5d..5203c3f3c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -23,6 +23,15 @@ java { } } +kotlin { + compilerOptions { + // TODO: Drop annotation default target when it is stable + freeCompilerArgs.addAll( + "-Xannotation-default-target=param-property" + ) + } +} + android { compileSdk = 36 namespace = "org.schabi.newpipe" From e5ed0b529f84bdbc5dd143ca54d3746ea45de8bc Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Fri, 7 Nov 2025 16:09:28 +0800 Subject: [PATCH 048/190] Bump ktlint to latest stable release and maven coordinate Disable all new rules to avoid massive file-changes. All new rules should be enabled one by one as per requirements in separate commit to make review easier. Signed-off-by: Aayush Gupta --- .editorconfig | 44 +++++++++++++++++++++++++++++++++++++++ app/build.gradle.kts | 4 ++-- gradle/libs.versions.toml | 4 ++-- 3 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..77feb3181 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,44 @@ +# +# SPDX-FileCopyrightText: 2025 NewPipe e.V. +# SPDX-License-Identifier: GPL-3.0-or-later +# + +root = true + +[*.{kt,kts}] +ktlint_standard_annotation = disabled +ktlint_standard_argument-list-wrapping = disabled +ktlint_standard_backing-property-naming = disabled +ktlint_standard_blank-line-before-declaration = disabled +ktlint_standard_blank-line-between-when-conditions = disabled +ktlint_standard_chain-method-continuation = disabled +ktlint_standard_class-signature = disabled +ktlint_standard_comment-wrapping = disabled +ktlint_standard_enum-wrapping = disabled +ktlint_standard_function-expression-body = disabled +ktlint_standard_function-literal = disabled +ktlint_standard_function-signature = disabled +ktlint_standard_indent = disabled +ktlint_standard_kdoc = disabled +ktlint_standard_max-line-length = disabled +ktlint_standard_mixed-condition-operators = disabled +ktlint_standard_multiline-expression-wrapping = disabled +ktlint_standard_multiline-if-else = disabled +ktlint_standard_no-blank-line-in-list = disabled +ktlint_standard_no-consecutive-comments = disabled +ktlint_standard_no-empty-first-line-in-class-body = disabled +ktlint_standard_no-empty-first-line-in-method-block = disabled +ktlint_standard_no-line-break-after-else = disabled +ktlint_standard_no-semi = disabled +ktlint_standard_no-single-line-block-comment = disabled +ktlint_standard_package-name = disabled +ktlint_standard_parameter-list-wrapping = disabled +ktlint_standard_property-naming = disabled +ktlint_standard_spacing-between-declarations-with-annotations = disabled +ktlint_standard_spacing-between-declarations-with-comments = disabled +ktlint_standard_statement-wrapping = disabled +ktlint_standard_string-template-indent = disabled +ktlint_standard_trailing-comma-on-call-site = disabled +ktlint_standard_trailing-comma-on-declaration-site = disabled +ktlint_standard_try-catch-finally-spacing = disabled +ktlint_standard_when-entry-bracing = disabled diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5203c3f3c..5cf357c74 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -167,7 +167,7 @@ tasks.register("runKtlint") { outputs.dir(outputDir) mainClass.set("com.pinterest.ktlint.Main") classpath = configurations.getByName("ktlint") - args = listOf("src/**/*.kt") + args = listOf("--editorconfig=../.editorconfig", "src/**/*.kt") jvmArgs = listOf("--add-opens", "java.base/java.lang=ALL-UNNAMED") } @@ -176,7 +176,7 @@ tasks.register("formatKtlint") { outputs.dir(outputDir) mainClass.set("com.pinterest.ktlint.Main") classpath = configurations.getByName("ktlint") - args = listOf("-F", "src/**/*.kt") + args = listOf("--editorconfig=../.editorconfig", "-F", "src/**/*.kt") jvmArgs = listOf("--add-opens", "java.base/java.lang=ALL-UNNAMED") } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5a2b9cf41..38fca9b2e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,7 +24,7 @@ junit = "4.13.2" junit-ext = "1.3.0" kotlin = "2.2.21" ksp = "2.3.2" -ktlint = "0.45.2" +ktlint = "1.8.0" leakcanary = "2.14" lifecycle = "2.9.4" # Newer versions require minSdk >= 23 localbroadcastmanager = "1.1.0" @@ -119,7 +119,7 @@ newpipe-nanojson = { module = "com.github.TeamNewPipe:nanojson", version.ref = " noties-markwon-core = { module = "io.noties.markwon:core", version.ref = "markwon" } noties-markwon-linkify = { module = "io.noties.markwon:linkify", version.ref = "markwon" } ocpsoft-prettytime = { module = "org.ocpsoft.prettytime:prettytime", version.ref = "prettytime" } -pinterest-ktlint = { module = "com.pinterest:ktlint", version.ref = "ktlint" } +pinterest-ktlint = { module = "com.pinterest.ktlint:ktlint-cli", version.ref = "ktlint" } puppycrawl-checkstyle = { module = "com.puppycrawl.tools:checkstyle", version.ref = "checkstyle" } reactivex-rxandroid = { module = "io.reactivex.rxjava3:rxandroid", version.ref = "rxandroid" } reactivex-rxjava = { module = "io.reactivex.rxjava3:rxjava", version.ref = "rxjava" } From 03e963952c1ffc18984bea0d6a9eb2ca40f92902 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Fri, 21 Nov 2025 20:09:57 +0800 Subject: [PATCH 049/190] Ignore Kotlin compiler generated files Signed-off-by: Aayush Gupta --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1352b6917..49267a9f0 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ captures/ *.iml *~ .weblate +.kotlin *.class app/debug/ app/release/ From ebe07596ba00d61a6145b68048f32157aad1c77b Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 27 Nov 2025 14:54:08 +0100 Subject: [PATCH 050/190] Update NewPipeExtractor to fix build (Jitpack failures again) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 38fca9b2e..23765591b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -58,7 +58,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "3af73262cc60cf555fd5f1d691f6c58e2db38ef5" +teamnewpipe-newpipe-extractor = "76eb2008cab3fbbbe547135e7bfa3d2e8e32a7d1" viewpager2 = "1.1.0" webkit = "1.14.0" work = "2.10.5" # Newer versions require minSdk >= 23 From e045251b58af919f3cf79bd7cff7138dbc34cc61 Mon Sep 17 00:00:00 2001 From: shaozheng Date: Fri, 28 Nov 2025 10:42:04 +0800 Subject: [PATCH 051/190] Always do not rotate screen when Android TV --- .../schabi/newpipe/fragments/detail/VideoDetailFragment.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 7b8705565..b5ce07c56 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -1900,12 +1900,13 @@ public final class VideoDetailFragment @Override public void onScreenRotationButtonClicked() { + // On Android TV screen rotation is not supported // In tablet user experience will be better if screen will not be rotated // from landscape to portrait every time. // Just turn on fullscreen mode in landscape orientation // or portrait & unlocked global orientation final boolean isLandscape = DeviceUtils.isLandscape(requireContext()); - if (DeviceUtils.isTablet(activity) + if (DeviceUtils.isTv(activity) || DeviceUtils.isTablet(activity) && (!globalScreenOrientationLocked(activity) || isLandscape)) { player.UIs().get(MainPlayerUi.class).ifPresent(MainPlayerUi::toggleFullscreen); return; From 6055cf29380aef4cc70b2b3a6fc532bf0fb4df8a Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sat, 29 Nov 2025 19:52:17 +0800 Subject: [PATCH 052/190] acra: Switch to ZacSweers's fork of autoservice Google has no plans to officially support KSP for autoservice Ref: https://github.com/google/auto/issues/882 Signed-off-by: Aayush Gupta --- app/build.gradle.kts | 2 +- gradle/libs.versions.toml | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5cf357c74..723b139c2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -260,7 +260,7 @@ dependencies { // Metadata generator for service descriptors compileOnly(libs.google.autoservice.annotations) - ksp(libs.google.autoservice.compiler) + ksp(libs.zacsweers.autoservice.compiler) // Manager for complex RecyclerView layouts implementation(libs.lisawray.groupie.core) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 23765591b..0fc252587 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,7 +8,8 @@ acra = "5.13.1" agp = "8.13.1" appcompat = "1.7.1" assertj = "3.27.6" -autoservice = "1.1.1" +autoservice-google = "1.1.1" +autoservice-zacsweers = "1.2.0" bridge = "v2.0.2" cardview = "1.0.0" checkstyle = "12.1.2" @@ -95,8 +96,7 @@ evernote-statesaver-core = { module = "com.evernote:android-state", version.ref facebook-stetho-core = { module = "com.facebook.stetho:stetho", version.ref = "stetho" } facebook-stetho-okhttp3 = { module = "com.facebook.stetho:stetho-okhttp3", version.ref = "stetho" } google-android-material = { module = "com.google.android.material:material", version.ref = "material" } -google-autoservice-annotations = { module = "com.google.auto.service:auto-service-annotations", version.ref = "autoservice" } -google-autoservice-compiler = { module = "com.google.auto.service:auto-service", version.ref = "autoservice" } +google-autoservice-annotations = { module = "com.google.auto.service:auto-service-annotations", version.ref = "autoservice-google" } google-exoplayer-core = { module = "com.google.android.exoplayer:exoplayer-core", version.ref = "exoplayer" } google-exoplayer-dash = { module = "com.google.android.exoplayer:exoplayer-dash", version.ref = "exoplayer" } google-exoplayer-database = { module = "com.google.android.exoplayer:exoplayer-database", version.ref = "exoplayer" } @@ -128,6 +128,7 @@ squareup-leakcanary-plumber = { module = "com.squareup.leakcanary:plumber-androi squareup-leakcanary-watcher = { module = "com.squareup.leakcanary:leakcanary-object-watcher-android", version.ref = "leakcanary" } squareup-okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } squareup-picasso = { module = "com.squareup.picasso:picasso", version.ref = "picasso" } +zacsweers-autoservice-compiler = { module = "dev.zacsweers.autoservice:auto-service-ksp", version.ref = "autoservice-zacsweers" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } From e91d647b279f29e65d61e7e3b92e445e76891e77 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sat, 29 Nov 2025 19:54:36 +0800 Subject: [PATCH 053/190] acra: Relocate autoservice dependencies under acra block They are only used for ACRA Ref: https://www.acra.ch/docs/Custom-Extensions#by-annotation Signed-off-by: Aayush Gupta --- app/build.gradle.kts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 723b139c2..df8c278c1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -258,10 +258,6 @@ dependencies { implementation(libs.google.exoplayer.smoothstreaming) implementation(libs.google.exoplayer.ui) - // Metadata generator for service descriptors - compileOnly(libs.google.autoservice.annotations) - ksp(libs.zacsweers.autoservice.compiler) - // Manager for complex RecyclerView layouts implementation(libs.lisawray.groupie.core) implementation(libs.lisawray.groupie.viewbinding) @@ -275,6 +271,8 @@ dependencies { // Crash reporting implementation(libs.acra.core) + compileOnly(libs.google.autoservice.annotations) + ksp(libs.zacsweers.autoservice.compiler) // Properly restarting implementation(libs.jakewharton.phoenix) From 5c9ac912ac92129d8aff567ad69e39ceb7d52745 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 3 Dec 2025 16:44:41 +0800 Subject: [PATCH 054/190] StreamHistoryDAO: Latest entry can be null Signed-off-by: Aayush Gupta --- .../org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt b/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt index 432c93a55..916d4e5ed 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt @@ -35,7 +35,7 @@ abstract class StreamHistoryDAO : BasicDAO { abstract val historySortedById: Flowable> @Query("SELECT * FROM stream_history WHERE stream_id = :streamId ORDER BY access_date DESC LIMIT 1") - abstract fun getLatestEntry(streamId: Long): StreamHistoryEntity + abstract fun getLatestEntry(streamId: Long): StreamHistoryEntity? @Query("DELETE FROM stream_history WHERE stream_id = :streamId") abstract fun deleteStreamHistory(streamId: Long): Int From 4a00dbb15d5dcd16a7d7f139f88b9b572a9c722d Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 3 Dec 2025 17:19:28 +0800 Subject: [PATCH 055/190] Don't swallow error when trying to mark stream as watched Signed-off-by: Aayush Gupta --- .../fragments/detail/VideoDetailFragment.java | 8 +++++++- .../info_list/dialog/StreamDialogDefaultEntry.java | 13 +++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index b5ce07c56..a07e9c06e 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -1230,7 +1230,13 @@ public final class VideoDetailFragment disposables.add(recordManager.onViewed(info).onErrorComplete() .subscribe( ignored -> { /* successful */ }, - error -> Log.e(TAG, "Register view failure: ", error) + error -> showSnackBarError( + new ErrorInfo( + error, + UserAction.PLAY_STREAM, + "Got an error when modifying history on viewed" + ) + ) )); } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java b/app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java index c7ac9556f..a2bf4a1ff 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java @@ -13,6 +13,9 @@ import androidx.annotation.StringRes; import org.schabi.newpipe.R; import org.schabi.newpipe.database.stream.model.StreamEntity; import org.schabi.newpipe.download.DownloadDialog; +import org.schabi.newpipe.error.ErrorInfo; +import org.schabi.newpipe.error.ErrorUtil; +import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; import org.schabi.newpipe.local.dialog.PlaylistDialog; import org.schabi.newpipe.local.history.HistoryRecordManager; @@ -132,6 +135,16 @@ public enum StreamDialogDefaultEntry { MARK_AS_WATCHED(R.string.mark_as_watched, (fragment, item) -> new HistoryRecordManager(fragment.getContext()) .markAsWatched(item) + .doOnError(error -> { + ErrorUtil.showSnackbar( + fragment.requireContext(), + new ErrorInfo( + error, + UserAction.OPEN_INFO_ITEM_DIALOG, + "Got an error when trying to mark as watched" + ) + ); + }) .onErrorComplete() .observeOn(AndroidSchedulers.mainThread()) .subscribe() From 7ffc513f46f822fb469a10fcd9aee3d7b4714536 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 10 Dec 2025 14:40:16 +0100 Subject: [PATCH 056/190] Fix deprecation of Bundle.getSerializable(String) by using BundleCompat This fixes the following warning during compilation: file:app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt:36:55 'fun getSerializable(p0: String?): Serializable?' is deprecated. Deprecated in Java. --- .../main/java/org/schabi/newpipe/about/LicenseFragment.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt index 189fa148b..240e2f42b 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt @@ -7,6 +7,7 @@ import android.view.View import android.view.ViewGroup import android.webkit.WebView import androidx.appcompat.app.AlertDialog +import androidx.core.os.BundleCompat import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers @@ -33,7 +34,9 @@ class LicenseFragment : Fragment() { super.onCreate(savedInstanceState) softwareComponents = arguments?.parcelableArrayList(ARG_COMPONENTS)!! .sortedBy { it.name } // Sort components by name - activeSoftwareComponent = savedInstanceState?.getSerializable(SOFTWARE_COMPONENT_KEY) as? SoftwareComponent + activeSoftwareComponent = savedInstanceState?.let { + BundleCompat.getSerializable(it, SOFTWARE_COMPONENT_KEY, SoftwareComponent::class.java) + } } override fun onDestroy() { From d770c6fd880a6a97ba242a2665c423351dde5360 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 10 Dec 2025 14:46:13 +0100 Subject: [PATCH 057/190] Fix state access --- .../schabi/newpipe/fragments/detail/VideoDetailFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 7c1d46945..5ef4b3f1e 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -207,7 +207,7 @@ public final class VideoDetailFragment @State protected boolean autoPlayEnabled = true; @State - private int originalOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; + protected int originalOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; @Nullable private StreamInfo currentInfo = null; From 17ce699037daa8a89387f40c45008ad955b3fd89 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 10 Dec 2025 14:48:08 +0100 Subject: [PATCH 058/190] Do not change orientation on TVs when entering fullscreen --- .../schabi/newpipe/fragments/detail/VideoDetailFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 5ef4b3f1e..c3b7dc8a3 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -1909,8 +1909,8 @@ public final class VideoDetailFragment return; } - // On tablets, just toggle fullscreen UI without orientation change. - if (DeviceUtils.isTablet(activity)) { + // On tablets and TVs, just toggle fullscreen UI without orientation change. + if (DeviceUtils.isTablet(activity) || DeviceUtils.isTv(activity)) { playerUi.get().toggleFullscreen(); return; } From 1212486adb5f0a6779f9fcc98786e72844ddbb81 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sat, 13 Dec 2025 16:30:36 +0800 Subject: [PATCH 059/190] libs: Update dependencies to latest stable releases Signed-off-by: Aayush Gupta --- gradle/libs.versions.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0fc252587..01b64ace9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,14 +5,14 @@ [versions] acra = "5.13.1" -agp = "8.13.1" +agp = "8.13.2" appcompat = "1.7.1" assertj = "3.27.6" autoservice-google = "1.1.1" autoservice-zacsweers = "1.2.0" bridge = "v2.0.2" cardview = "1.0.0" -checkstyle = "12.1.2" +checkstyle = "12.2.0" constraintlayout = "2.2.1" core = "1.17.0" desugar = "2.1.5" @@ -32,7 +32,7 @@ localbroadcastmanager = "1.1.0" markwon = "4.6.2" material = "1.13.0" media = "1.7.1" -mockitoCore = "5.20.0" +mockitoCore = "5.21.0" okhttp = "5.3.2" phoenix = "3.0.0" #noinspection NewerVersionAvailable,GradleDependency --> 2.8 is the last version, not 2.71828! @@ -45,10 +45,10 @@ runner = "1.7.0" rxandroid = "3.0.2" rxbinding = "4.0.0" rxjava = "3.1.12" -sonarqube = "7.0.1.6134" +sonarqube = "7.2.1.6560" statesaver = "1.4.1" # TODO: Drop because it is deprecated and incompatible with KSP2 stetho = "1.6.0" -swiperefreshlayout = "1.1.0" +swiperefreshlayout = "1.2.0" # You can use a local version by uncommenting a few lines in settings.gradle # Or you can use a commit you pushed to GitHub by just replacing TeamNewPipe with your GitHub # name and the commit hash with the commit hash of the (pushed) commit you want to test From 77bea1ac6873fabea8e9e07c5d655966c03d4bda Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sat, 13 Dec 2025 17:03:54 +0800 Subject: [PATCH 060/190] Player: Enqueue next on the existing playQueue Fixes 150649aea9f2cf55b7b006d5538aaecd2ec57f42 Signed-off-by: Aayush Gupta --- app/src/main/java/org/schabi/newpipe/player/Player.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 39f941693..42f6cbf36 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -395,7 +395,7 @@ public final class Player implements PlaybackListener, Listener { return; } final PlayQueueItem newItem = newQueue.getStreams().get(0); - newQueue.enqueueNext(newItem, false); + playQueue.enqueueNext(newItem, false); return; } From f3876d1c4a7b2818600e96856ddaa40ad5045b5d Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 15 Dec 2025 22:02:28 +0100 Subject: [PATCH 061/190] Translated using Weblate (Danish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.8% (755 of 764 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Lithuanian) Currently translated at 99.2% (758 of 764 strings) Translated using Weblate (Bengali) Currently translated at 74.3% (568 of 764 strings) Co-authored-by: Agustín Cantero Co-authored-by: Dual_A Co-authored-by: Hosted Weblate Co-authored-by: MS-PC Co-authored-by: cat Co-authored-by: gymka --- app/src/main/res/values-bn/strings.xml | 6 +++++- app/src/main/res/values-da/strings.xml | 7 +++++++ app/src/main/res/values-es/strings.xml | 10 ++++++++++ app/src/main/res/values-lt/strings.xml | 22 ++++++++++++++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 682b59fe3..8d767a173 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -296,7 +296,7 @@ এক প্লেয়ার থেকে অন্য প্লেয়ারে পরিবর্তন করলে তোমার সারি প্রতিস্থাপিত হতে পারে কিউ মোছার আগে নিশ্চিত করো কমপ্যাক্ট বিজ্ঞপ্তিতে প্রদর্শন করতে তুমি সর্বাধিক তিনটি ক্রিয়া নির্বাচন করতে পারো! - নিচের প্রতিটি প্রজ্ঞাপন ক্রিয়া সম্পাদনা করো। ডান দিকের চেকবাক্স ব্যবহার করে কম্প্যাক্ট নোটিফিকেশনে দেখানোর জন্য তিনটি পর্যন্ত নির্বাচন করো + নিচের প্রতিটি প্রজ্ঞাপন ক্রিয়া সম্পাদনা করুন । ডান দিকের চেকবাক্স ব্যবহার করে কম্প্যাক্ট নোটিফিকেশনে দেখানোর জন্য তিনটি পর্যন্ত নির্বাচন করুন । প্রদর্শিত ভিডিও থাম্বনেইল ১৬:৯ থেকে ১:১অনুপাতে পরিবর্তন করো ফিড ওভাররাইট @@ -628,4 +628,8 @@ ভুক্তি মুছতে ডানে-বামে সরাও সম্প্রচার বিষয়ক তথ্য প্রক্রিয়ারত… প্লেব্যাক লোড বিরতির আকার + হ্যা + না + প্লেলিস্ট + উদাহরণস্বরূপ, যদি আপনি ভাঙা ফিজিক্যাল বোতাম সহ একটি হেডসেট ব্যবহার করেন তবে এটি কার্যকর diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 62d89d60b..78f08ee85 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -834,4 +834,11 @@ %sB Slet fil Kontoen er blevet lukket\n\n%1$s angiver følgende årsag: %2$s + Likes + SoundCloud Top 50-siden fjernet + SoundCloud har udfaset de oprindelige Top 50-hitlister. Den tilhørende fane er blevet fjernet fra din hovedside. + YouTube kombineret trending fjernet + YouTube har udfaset den kombinerede trending-side pr. 21. juli 2025. NewPipe har erstattet standardsiden for trending med trending livestreams.\n\nDu kan også vælge andre trending-sider under \"Indstillinger > Indhold > Indhold på hovedsiden\". + Gaming-trends + Trending podcasts diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ffa8ad4f0..72d1f58b5 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -844,4 +844,14 @@ Eliminar archivo %sM %sM + Eliminar entrada + Cuenta cancelada\n\n%1$s proporciona esta razón: %2$s + Entrada eliminada + Error HTTP 403 recibido del servidor durante la reproducción, probablemente causado por la expiración de la URL de transmisión o una prohibición de IP + Error HTTP %1$s recibido del servidor durante la reproducción + Error HTTP 403 recibido del servidor durante la reproducción, probablemente causado por una prohibición de IP o problemas de desofuscación de la URL de transmisión + %1$s se negó a proporcionar datos y solicitó un inicio de sesión para confirmar que el solicitante no es un bot.\n\nEs posible que tu IP haya sido bloqueada temporalmente por %1$s. Puedes esperar un tiempo o cambiar a una IP diferente (por ejemplo, habilitando o deshabilitando una VPN, o cambiando de WiFi a datos móviles). + %sMM + Este contenido no está disponible para el país seleccionado actualmente.\n\nCambia tu selección en «Ajustes > Contenido > País predefinido del contenido». + Para usar el reproductor emergente, seleccione %1$s en el siguiente menú de la configuración de Android y habilite %2$s. diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 91c8005ce..20419fef6 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -836,4 +836,26 @@ Grojaraščiai Antrinis Dalintis kaip laikinuoju youtube grojaraščiu + Ieškoti %1$s + Ieškoti %1$s (%2$s) + Norėdami įjungti \"Popup Grotuvą\" pasirinkite Android nustatymų meniu pasirinkite %1$s ir įjunkite %2$s. + \"Leisti piešti virš kitų langų\" + %sK + %sM + %sB + Pašalinti failą + Ištrinti įrašą + Pasirinkite kanalo grupę + Dar nėra kanalo grupės + Kanalo grupės puslapis + Paskyra pašalinta\n\n%1$s dėl šios priežasties: %2$s + Mėgsta + SoundCloud Top 50 puslapis pašalintas + SoundCloud nebeteikia Top 50. Šis puslapis pašalintas iš jūsų pagrindinio puslapio. + YouTube sujungti rekomenduojami pašalinti + Žaidimų pasiūlymai + Mėgstami podcasts + Mėgstami filmai ir laidos + Mėgstama muzika + Įrašas pašalintas From 16d02480394a6a619897768fea2bbb7dfc49d4d7 Mon Sep 17 00:00:00 2001 From: tobigr Date: Mon, 15 Dec 2025 21:49:46 +0100 Subject: [PATCH 062/190] Add fastlane changelog for NewPipe 0.28.1 (1006) --- .../metadata/android/en-US/changelogs/1006.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/1006.txt diff --git a/fastlane/metadata/android/en-US/changelogs/1006.txt b/fastlane/metadata/android/en-US/changelogs/1006.txt new file mode 100644 index 000000000..15b974b97 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/1006.txt @@ -0,0 +1,16 @@ +# Improved +Keep current player when clicking on timestamps +Try to recover pending download missions when possible +Add option to delete a download without also deleting file +Overlay Permission: display explanatory dialog for Android > R +Support on.soundcloud link opening +A lot of small improvements and optimizations + +# Fixed +Fix short count formatting for Android versions below 7 +Fix ghost notifications +Fixes for SRT subtitle files +Fixed tons of crashes + +# Development +Internal code modernization \ No newline at end of file From 698187d2d665c95b770115a9fa9d2171eeeac226 Mon Sep 17 00:00:00 2001 From: tobigr Date: Mon, 15 Dec 2025 21:54:54 +0100 Subject: [PATCH 063/190] Update extractor to latest version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 01b64ace9..00c6d1b1b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -59,7 +59,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 = "76eb2008cab3fbbbe547135e7bfa3d2e8e32a7d1" +teamnewpipe-newpipe-extractor = "cde6f875e01357ff74068c42b61e33371b9ea871" viewpager2 = "1.1.0" webkit = "1.14.0" work = "2.10.5" # Newer versions require minSdk >= 23 From 097c643d1be02115ff3595ac59844e1f0d3ad24a Mon Sep 17 00:00:00 2001 From: Tobi Date: Mon, 15 Dec 2025 05:22:00 -0800 Subject: [PATCH 064/190] Add AI policy to contribution guidelines, PR and issue templates The amount of AI generated PRs is increasing while their quality often remains poor. The introduced guidelines aim to reduce the number of poor quality AI PRs while simultaneously increasing the quality of high quality AI PRs. New checkboxes for compliance with the AI policy and to increase the PR quality are introduced to the PR template. Prohibit AI generated issue and PR descriptions --- .github/CONTRIBUTING.md | 13 +++++++++++++ .github/ISSUE_TEMPLATE/bug_report.yml | 2 ++ .github/ISSUE_TEMPLATE/feature_request.yml | 2 ++ .github/PULL_REQUEST_TEMPLATE.md | 2 ++ 4 files changed, 19 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 686ae233a..069f003f4 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -3,6 +3,19 @@ NewPipe contribution guidelines =============================== +## AI policy + +* Using generative AI to develop new features or making larger code changes is generally prohibited. Please refrain from contributions which are heavily depending on AI generated source code because they are usually lacking a fundamental understanding of the overall project structure and thus come with poor quality. However, you are allowed to use gen. AI if you + * are aware of the project structure, + * ensure that the generated code follows the project structure, + * fully understand the generated code, and + * review the generated code completely. +* Using AI to find the root cause of bugs and generating small fixes might be acceptable. However, gen. AI often does not fix the underlying problem but is trying to fix the symptoms. If you are using AI to fix bugs, ensure that the root cause is tackled. +* The use of AI to generate documentation is allowed. We ask you to thoroughly check the quality of generated documentation – wrong, misleading or uninformative documentation is useless and wastes the reader's time. Ensure that reasoning is documented. +* Using generative AI to write or fill in PR or issue templates is prohibited. Those texts are often lengthy and miss critical information. +* PRs and issues that do not follow this AI policy can be closed without further explanation. + + ## Crash reporting Report crashes through the **automated crash report system** of NewPipe. diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 52897f1ac..60c94ad25 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -26,6 +26,8 @@ body: required: true - label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)." required: true + - label: "I have read and understood the [AI policy](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md#ai-policy). The content of this bug report is not generated by AI." + required: true - type: input id: app-version diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 31ef92c44..97a3e38b5 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -25,6 +25,8 @@ body: required: true - label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)." required: true + - label: "I have read and understood the [AI policy](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md#ai-policy). The content of this request is not generated by AI." + required: true - type: textarea diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 2062e840d..2af1556d4 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -32,3 +32,5 @@ The APK can be found by going to the "Checks" tab below the title. On the left p #### Due diligence - [ ] I read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md). +- [ ] The proposed changes follow the [AI policy](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md#ai-policy). +- [ ] I tested the changes using an emulator or a physical device. From 0607b14bb24a4fa8ef4d13d329dbd4d79bbb2306 Mon Sep 17 00:00:00 2001 From: Damien Hardy Date: Wed, 17 Dec 2025 18:52:23 +0100 Subject: [PATCH 065/190] add indymotion.fr peertube instance on AndroidManifest.xml --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3da97f268..20e9a6ca9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -385,6 +385,7 @@ + From 86fb618f616e51e42673a5358a93ca6aabf8736f Mon Sep 17 00:00:00 2001 From: tobigr Date: Fri, 19 Dec 2025 12:01:38 +0100 Subject: [PATCH 066/190] Update NewPipe Extractor --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 00c6d1b1b..02c89fcef 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -59,7 +59,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 = "cde6f875e01357ff74068c42b61e33371b9ea871" +teamnewpipe-newpipe-extractor = "05e0e4ced7b6ff05f3d68d831efed8bdf588f9ac" viewpager2 = "1.1.0" webkit = "1.14.0" work = "2.10.5" # Newer versions require minSdk >= 23 From f7ff5db4b522d5a74f5fde6c54441cffe85c50ca Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 20 Dec 2025 18:06:19 +0100 Subject: [PATCH 067/190] [PlayQueue] Fix incorrect UI states of PlayQueue items onNext() is called after onSubscribe() when creating a PlayQueueAdapter. For that reason the last broadcasted event is applied to the UI state although it is already reflected in the PlayQueue that was used to initialize the adapter. This is the intended behavior of the previously used event broadcaster of the type BehaviorSubject<>. The broadcaster's type was changed to PublishSubject<> which does not emit the last event after onSubscribe(). Ref: https://github.com/TeamNewPipe/NewPipe/issues/9669 --- .../java/org/schabi/newpipe/player/playqueue/PlayQueue.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java index 97196805d..2a1b9d281 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java @@ -23,7 +23,7 @@ import java.util.concurrent.atomic.AtomicInteger; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.BackpressureStrategy; import io.reactivex.rxjava3.core.Flowable; -import io.reactivex.rxjava3.subjects.BehaviorSubject; +import io.reactivex.rxjava3.subjects.PublishSubject; /** * PlayQueue is responsible for keeping track of a list of streams and the index of @@ -46,7 +46,7 @@ public abstract class PlayQueue implements Serializable { private List backup; private List streams; - private transient BehaviorSubject eventBroadcast; + private transient PublishSubject eventBroadcast; private transient Flowable broadcastReceiver; private transient boolean disposed = false; @@ -71,7 +71,7 @@ public abstract class PlayQueue implements Serializable { *

    */ public void init() { - eventBroadcast = BehaviorSubject.create(); + eventBroadcast = PublishSubject.create(); broadcastReceiver = eventBroadcast.toFlowable(BackpressureStrategy.BUFFER) .observeOn(AndroidSchedulers.mainThread()) From acaaec2cdef3d632ec579ffc365ad2d6eb760919 Mon Sep 17 00:00:00 2001 From: Hatake Kakashri Date: Wed, 19 Nov 2025 22:36:54 +0530 Subject: [PATCH 068/190] Add enqueue option to router dialog - This allows users to enqueue a stream directly to the current player queue when sharing a link with the app, improving the user experience for queue management. - The 'Enqueue' option is now available in the action selection dialog and can also be set as the preferred open action in the settings. --- .../java/org/schabi/newpipe/RouterActivity.java | 16 +++++++++++++--- app/src/main/res/values/settings_keys.xml | 3 +++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index 50639c5ae..5e25079b5 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -316,7 +316,8 @@ public class RouterActivity extends AppCompatActivity { if (choiceChecker.isAvailableAndSelected( R.string.video_player_key, R.string.background_player_key, - R.string.popup_player_key)) { + R.string.popup_player_key, + R.string.enqueue_key)) { final String selectedChoice = choiceChecker.getSelectedChoiceKey(); @@ -329,6 +330,8 @@ public class RouterActivity extends AppCompatActivity { || selectedChoice.equals(getString(R.string.popup_player_key)); final boolean isAudioPlayerSelected = selectedChoice.equals(getString(R.string.background_player_key)); + final boolean isEnqueueSelected = + selectedChoice.equals(getString(R.string.enqueue_key)); if (currentLinkType != LinkType.STREAM && ((isExtAudioEnabled && isAudioPlayerSelected) @@ -345,7 +348,9 @@ public class RouterActivity extends AppCompatActivity { // Check if the service supports the choice if ((isVideoPlayerSelected && capabilities.contains(VIDEO)) - || (isAudioPlayerSelected && capabilities.contains(AUDIO))) { + || (isAudioPlayerSelected && capabilities.contains(AUDIO)) + || (isEnqueueSelected && (capabilities.contains(VIDEO) + || capabilities.contains(AUDIO)))) { handleChoice(selectedChoice); } else { handleChoice(getString(R.string.show_info_key)); @@ -544,7 +549,10 @@ public class RouterActivity extends AppCompatActivity { // not be added to a playlist returnedItems.add(new AdapterChoiceItem(getString(R.string.add_to_playlist_key), getString(R.string.add_to_playlist), - R.drawable.ic_add)); + R.drawable.ic_playlist_add)); + + returnedItems.add(new AdapterChoiceItem(getString(R.string.enqueue_key), + getString(R.string.enqueue_stream), R.drawable.ic_add)); } else { // LinkType.NONE is never present because it's filtered out before // channels and playlist can be played as they contain a list of videos @@ -1016,6 +1024,8 @@ public class RouterActivity extends AppCompatActivity { NavigationHelper.playOnBackgroundPlayer(this, playQueue, true); } else if (choice.playerChoice.equals(popupPlayerKey)) { NavigationHelper.playOnPopupPlayer(this, playQueue, true); + } else if (choice.playerChoice.equals(getString(R.string.enqueue_key))) { + NavigationHelper.enqueueOnPlayer(this, playQueue); } }; } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 352e4cec1..ab6e9e345 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -479,6 +479,7 @@ popup_player download add_to_playlist + enqueue always_ask_player @@ -488,6 +489,7 @@ @string/popup_player @string/download @string/add_to_playlist + @string/enqueue_stream @string/always_ask_open_action @@ -498,6 +500,7 @@ @string/download_key @string/add_to_playlist_key @string/always_ask_open_action_key + @string/enqueue_key From 5582eac1c45aa1ce0fc967ae1b437fee5b1beb42 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sun, 14 Dec 2025 13:07:14 +0100 Subject: [PATCH 069/190] Only show enqueue option if play queue is not empty in RouterActivity Make enqueue option avilable for playlists as well --- .../org/schabi/newpipe/RouterActivity.java | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index 5e25079b5..eb5257354 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -531,7 +531,7 @@ public class RouterActivity extends AppCompatActivity { final List capabilities = service.getServiceInfo().getMediaCapabilities(); - if (linkType == LinkType.STREAM) { + if (linkType == LinkType.STREAM || linkType == LinkType.PLAYLIST) { if (capabilities.contains(VIDEO)) { returnedItems.add(videoPlayer); returnedItems.add(popupPlayer); @@ -539,20 +539,28 @@ public class RouterActivity extends AppCompatActivity { if (capabilities.contains(AUDIO)) { returnedItems.add(backgroundPlayer); } - // download is redundant for linkType CHANNEL AND PLAYLIST (till playlist downloading is - // not supported ) - returnedItems.add(new AdapterChoiceItem(getString(R.string.download_key), - getString(R.string.download), - R.drawable.ic_file_download)); - // Add to playlist is not necessary for CHANNEL and PLAYLIST linkType since those can - // not be added to a playlist - returnedItems.add(new AdapterChoiceItem(getString(R.string.add_to_playlist_key), - getString(R.string.add_to_playlist), - R.drawable.ic_playlist_add)); + // Enqueue is only shown if the current queue is not empty. + // However, if the playqueue or the player is cleared after this item was chosen and + // while the item is extracted, it will automatically fall back to background player. + if (PlayerHolder.INSTANCE.getQueueSize() > 0) { + returnedItems.add(new AdapterChoiceItem(getString(R.string.enqueue_key), + getString(R.string.enqueue_stream), R.drawable.ic_add)); + } - returnedItems.add(new AdapterChoiceItem(getString(R.string.enqueue_key), - getString(R.string.enqueue_stream), R.drawable.ic_add)); + if (linkType == LinkType.STREAM) { + // download is redundant for linkType CHANNEL AND PLAYLIST + // (till playlist downloading is not supported ) + returnedItems.add(new AdapterChoiceItem(getString(R.string.download_key), + getString(R.string.download), + R.drawable.ic_file_download)); + + // Add to playlist is not necessary for CHANNEL and PLAYLIST linkType + // since those can not be added to a playlist + returnedItems.add(new AdapterChoiceItem(getString(R.string.add_to_playlist_key), + getString(R.string.add_to_playlist), + R.drawable.ic_playlist_add)); + } } else { // LinkType.NONE is never present because it's filtered out before // channels and playlist can be played as they contain a list of videos From 535f9da42281ce72cf5349814e16ed36b18ac9c3 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 20 Dec 2025 21:23:38 +0100 Subject: [PATCH 070/190] Fix rebase --- app/src/main/java/org/schabi/newpipe/RouterActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index eb5257354..d85fdf7de 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -543,7 +543,7 @@ public class RouterActivity extends AppCompatActivity { // Enqueue is only shown if the current queue is not empty. // However, if the playqueue or the player is cleared after this item was chosen and // while the item is extracted, it will automatically fall back to background player. - if (PlayerHolder.INSTANCE.getQueueSize() > 0) { + if (PlayerHolder.getInstance().getQueueSize() > 0) { returnedItems.add(new AdapterChoiceItem(getString(R.string.enqueue_key), getString(R.string.enqueue_stream), R.drawable.ic_add)); } From 3c0e6adf2eeaefefd6e58467381115e638247b13 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 19 Dec 2025 10:01:50 +0100 Subject: [PATCH 071/190] Translated using Weblate (Hungarian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (French) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (German) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (Italian) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (Polish) Currently translated at 58.6% (51 of 87 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (Czech) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (87 of 87 strings) Co-authored-by: Agnieszka C Co-authored-by: Fjuro Co-authored-by: Ghost of Sparta Co-authored-by: Mickaël Binos Co-authored-by: Milan Co-authored-by: Random Co-authored-by: VfBFan Co-authored-by: tct123 Co-authored-by: 大王叫我来巡山 Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hans/ Translation: NewPipe/Metadata --- .../metadata/android/cs/changelogs/1006.txt | 16 +++++++++++++++ .../metadata/android/de/changelogs/1006.txt | 16 +++++++++++++++ .../metadata/android/de/changelogs/63.txt | 2 +- .../metadata/android/de/changelogs/68.txt | 6 +++--- .../metadata/android/de/changelogs/69.txt | 19 +++++++++--------- .../metadata/android/de/changelogs/70.txt | 2 +- .../metadata/android/de/changelogs/71.txt | 14 +++++++------ .../metadata/android/de/changelogs/730.txt | 2 +- .../metadata/android/de/changelogs/740.txt | 14 ++++++------- .../metadata/android/de/changelogs/750.txt | 20 +++++++++---------- .../metadata/android/de/changelogs/952.txt | 4 ++-- .../metadata/android/fr/changelogs/1006.txt | 17 ++++++++++++++++ .../metadata/android/hu/changelogs/1006.txt | 16 +++++++++++++++ .../metadata/android/it/changelogs/1006.txt | 16 +++++++++++++++ .../metadata/android/pl/changelogs/1006.txt | 16 +++++++++++++++ .../metadata/android/sk/changelogs/1006.txt | 16 +++++++++++++++ .../android/zh-Hans/changelogs/1005.txt | 16 +++++++++++++++ .../android/zh-Hans/changelogs/1006.txt | 16 +++++++++++++++ .../android/zh-Hans/changelogs/991.txt | 13 ++++++++++++ .../android/zh-Hans/changelogs/992.txt | 17 ++++++++++++++++ .../android/zh-Hans/changelogs/993.txt | 12 +++++++++++ .../android/zh-Hans/changelogs/994.txt | 15 ++++++++++++++ .../android/zh-Hans/changelogs/995.txt | 16 +++++++++++++++ .../android/zh-Hans/changelogs/996.txt | 2 ++ .../android/zh-Hans/changelogs/997.txt | 17 ++++++++++++++++ 25 files changed, 280 insertions(+), 40 deletions(-) create mode 100644 fastlane/metadata/android/cs/changelogs/1006.txt create mode 100644 fastlane/metadata/android/de/changelogs/1006.txt create mode 100644 fastlane/metadata/android/fr/changelogs/1006.txt create mode 100644 fastlane/metadata/android/hu/changelogs/1006.txt create mode 100644 fastlane/metadata/android/it/changelogs/1006.txt create mode 100644 fastlane/metadata/android/pl/changelogs/1006.txt create mode 100644 fastlane/metadata/android/sk/changelogs/1006.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/1005.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/1006.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/991.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/992.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/993.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/994.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/995.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/996.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/997.txt diff --git a/fastlane/metadata/android/cs/changelogs/1006.txt b/fastlane/metadata/android/cs/changelogs/1006.txt new file mode 100644 index 000000000..11a6f4cca --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/1006.txt @@ -0,0 +1,16 @@ +# Vylepšení +Ponechání aktuálního přehrávače při klepnutí na časová razítka +Pokus o obnovení čekajících stahování, pokud to jde +Možnost odstranění stahování bez smazání souboru +Oprávnění Zobrazení přes ostatní aplikace: zobrazení vysvětlení pro Android > R +Podpora odkazů on.soundcloud +Spousta malých vylepšení a optimalizací + +# Opravy +Oprava formátování pro verze Androidu nižší než 7 +Oprava falešných oznámení +Opravy souborů titulků SRT +Oprava spousty pádů + +# Vývoj +Interní modernizace kódu diff --git a/fastlane/metadata/android/de/changelogs/1006.txt b/fastlane/metadata/android/de/changelogs/1006.txt new file mode 100644 index 000000000..811138c07 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/1006.txt @@ -0,0 +1,16 @@ +# Verbesserungen +Aktuellen Player beim Klick auf Zeitstempel beibehalten +Wiederherstellen ausstehender Downloadaufträge +Downloads löschen, ohne gleichzeitiges Löschen der Datei +Overlay-Berechtigung: Erklärendes Dialogfeld für Android > R +Unterstützung von on.soundcloud-Links +Viele kleine Verbesserungen und Optimierungen + +# Behoben +Kurzformatierung für Android-Versionen unter 7 +Geisterbenachrichtigungen +SRT-Untertiteldateien +Zahlreiche Abstürze + +# Entwicklung +Modernisierung des internen Codes diff --git a/fastlane/metadata/android/de/changelogs/63.txt b/fastlane/metadata/android/de/changelogs/63.txt index 3ccc56bc0..7ae7873fb 100644 --- a/fastlane/metadata/android/de/changelogs/63.txt +++ b/fastlane/metadata/android/de/changelogs/63.txt @@ -4,5 +4,5 @@ - Kleine Codeverbesserungen #1375 - Alles über DSGVO hinzugefügt #1420 -### Repariert +### Behoben - Downloader: Absturz beim Laden unvollendeter Downloads von .giga-Dateien behoben #1407 diff --git a/fastlane/metadata/android/de/changelogs/68.txt b/fastlane/metadata/android/de/changelogs/68.txt index f700b3d26..9d37a92fc 100644 --- a/fastlane/metadata/android/de/changelogs/68.txt +++ b/fastlane/metadata/android/de/changelogs/68.txt @@ -1,12 +1,12 @@ # Änderungen von v0.14.1 -### Fixed +### Behoben - nicht entschlüsselt Video url #1659 - Beschreibungs Link nicht extrahierbar #1657 # Änderungen von v0.14.0 -### New +### Neu - Neues Schubladendesign #1461 - Neue anpassbare Titelseite #1461 @@ -14,6 +14,6 @@ - Reworked Gesture Controls #1604 - Neue Möglichkeit, den Pop-up-Player #1597 zu schließen -### Fixed +### Behoben - Fehler beheben, wenn die Anzahl der Abonnements nicht verfügbar ist. Schließt #1649. - Zeigen Sie "Abonnentenzählung nicht verfügbar" in diesen Fällen. diff --git a/fastlane/metadata/android/de/changelogs/69.txt b/fastlane/metadata/android/de/changelogs/69.txt index 8802508a3..3e8cb3a6e 100644 --- a/fastlane/metadata/android/de/changelogs/69.txt +++ b/fastlane/metadata/android/de/changelogs/69.txt @@ -1,14 +1,15 @@ -### New -- Long-tap Löschen & Teilen in Abonnements #1516 -- Tablet UI & Rasterlistenlayout #1617 +### Neu +- Langes Tippen zum Löschen/Teilen in Abonnements #1516 +- Tablet-UI und Rasterlistenlayout #1617 ### Verbesserungen -- Speichern und Nachladen des zuletzt verwendeten Seitenverhältnisses #1748 -- Separate Einstellungen für Lautstärke & Helligkeitsgesten #1644 +- Speichern/Neuladen des zuletzt verwendeten Seitenverhältnisses #1748 +- Separate Einstellungen für Lautstärke-/Helligkeitsgesten #1644 +- Unterstützung für Lokalisierung #1792 -### Fixes +### Fehlerbehebungen - Anzahl der Abonnements -- Foreground Service Erlaubnis für API 28+ Geräte #1830 hinzugefügt +- Vordergrund-Dienstberechtigung für Geräte mit API 28+ hinzugefügt #1830 -### Known Bugs -- Wiedergabe kann nicht auf Android P gespeichert werden +### Bekannte Fehler +- Wiedergabestatus wird unter Android P nicht gespeichert diff --git a/fastlane/metadata/android/de/changelogs/70.txt b/fastlane/metadata/android/de/changelogs/70.txt index 59a09b210..b31f83720 100644 --- a/fastlane/metadata/android/de/changelogs/70.txt +++ b/fastlane/metadata/android/de/changelogs/70.txt @@ -5,6 +5,6 @@ ACHTUNG: Diese Version ist wahrscheinlich ein Bugfest. * Drop-Unterstützung für Android 4.1 - 4.3 #1884 * Streams aus der aktuellen Warteschlange entfernt, indem sie nach rechts swipen #1915 -### Fixed +### Behoben * Crash mit Standard-Auflösung eingestellt auf beste und begrenzte mobile Datenauflösung #1835 * Pop-up-Spieler-Absturz behoben #1874 diff --git a/fastlane/metadata/android/de/changelogs/71.txt b/fastlane/metadata/android/de/changelogs/71.txt index 0132de3c3..86d1d52d9 100644 --- a/fastlane/metadata/android/de/changelogs/71.txt +++ b/fastlane/metadata/android/de/changelogs/71.txt @@ -1,8 +1,10 @@ ### Verbesserungen -* App-Update-Benachrichtigung für GitHub build hinzufügen (#1608 von @krtkush) -* Verschiedene Verbesserungen des Downloaders (#1944 von @kapodamy): -* Fügen Sie fehlende weiße Icons hinzu und verwenden Sie hardcored Weg, um die Icon Farben zu ändern -* neue MPEG-4 muxer fixieren nicht-synchrone Video- und Audiostreams (#2039) +* Benachrichtigung über App-Updates für GitHub-Build (#1608 von @krtkush) +* Verschiedene Verbesserungen am Downloader (#1944 von @kapodamy): + * Weiße Symbole und Hardcoded-Methode zum Ändern der Symbolfarben + * Überprüfung, ob der Iterator initialisiert ist (behebt #2031) + * Erlaubt erneute Downloads mit dem Fehler „Nachbearbeitung fehlgeschlagen“ im neuen Muxer + * Neuer MPEG-4-Muxer (#2039) -### Fixed -* YouTube Live-Streams spielen nach kurzer Zeit (#1996 von @yausername) +### Behoben +* YouTube-Livestreams werden nicht abgespielt (#1996 von @yausername) diff --git a/fastlane/metadata/android/de/changelogs/730.txt b/fastlane/metadata/android/de/changelogs/730.txt index 12c5ffb16..dc534fea2 100644 --- a/fastlane/metadata/android/de/changelogs/730.txt +++ b/fastlane/metadata/android/de/changelogs/730.txt @@ -1,2 +1,2 @@ # Behoben -- erneuter Hotfix des Entschlüsselungsfunktionsfehlers. +- Fehler bei der Entschlüsselungsfunktion erneut behoben. diff --git a/fastlane/metadata/android/de/changelogs/740.txt b/fastlane/metadata/android/de/changelogs/740.txt index 0d28a157a..063e5a3c7 100644 --- a/fastlane/metadata/android/de/changelogs/740.txt +++ b/fastlane/metadata/android/de/changelogs/740.txt @@ -1,12 +1,12 @@

    Verbesserungen

      -
    • Make Links in Kommentare klickbar, erhöhen Textgröße
    • -
    • seek zum Klicken von Zeitstempel-Links in Kommentare
    • -
    • Beliebte Registerkarte basierend auf kürzlich ausgewähltem Zustand anzeigen
    • -
    • Add-Unterstützung für Invidious links
    • +
    • Links in Kommentaren anklickbar machen, Textgröße erhöhen
    • +
    • Bei Anklicken von Zeitstempel-Links in Kommentaren suchen
    • +
    • Bevorzugte Registerkarte basierend auf zuletzt ausgewähltem Status anzeigen
    • +
    • Unterstützung für Invidious-Links
    -

    Fixed

    +

    Behoben

      -
    • fixed scroll w/kommentare und verwandten Streams deaktiviert
    • -
    • fixiert CheckForNewAppVersionTask wird ausgeführt, wenn es sollten't
    • +
    • Scrollen mit deaktivierten Kommentaren und verwandten Streams behoben
    • +
    • CheckForNewAppVersionTask wird nicht mehr ausgeführt, wenn es nicht sollte
    diff --git a/fastlane/metadata/android/de/changelogs/750.txt b/fastlane/metadata/android/de/changelogs/750.txt index 78a25282a..5dd4766df 100644 --- a/fastlane/metadata/android/de/changelogs/750.txt +++ b/fastlane/metadata/android/de/changelogs/750.txt @@ -1,15 +1,15 @@ Neu -Playback Lebenslauf #2288 -• Resume Streams, wo Sie letztes Mal aufgehört haben -Downloader Verbesserungen #2149 - +Wiedergabe fortsetzen #2288 +Downloader-Verbesserungen #2149 Verbessert -• Gemaketten entfernen #2295 -• Handle (auto)Rotationsänderungen während des Aktivitätszyklus #2444 +• GEMA-Strings entfernt #2295 +• (Automatische) Rotationsänderungen #2444 +• Menüs bei langem Drücken #2368 Behoben -• Fixed Downloads bei 99,9% #2440 -• Aktualisieren der Spielwarteschlange Metadaten #2453 -• [SoundCloud] Fester Absturz beim Laden von Wiedergabelisten TeamNewPipe/NewPipeExtractor#170 -• [YouTube] Feste Dauer kann nicht paresd TeamNewPipe/NewPipeExtractor#177 +• Untertitelnamenanzeige #2394 +• Absturz, wenn die Überprüfung auf App-Updates fehlschlägt (GitHub-Version) #2423 +• Downloads, die bei 99,9 % hängen bleiben #2440 +• Metadaten der Wiedergabeliste aktualisieren #2453 +• [SoundCloud] Absturz beim Laden von Wiedergabelisten TeamNewPipe/NewPipeExtractor#170 diff --git a/fastlane/metadata/android/de/changelogs/952.txt b/fastlane/metadata/android/de/changelogs/952.txt index 309b02b09..33e1cbc23 100644 --- a/fastlane/metadata/android/de/changelogs/952.txt +++ b/fastlane/metadata/android/de/changelogs/952.txt @@ -1,7 +1,7 @@ -Verbesserungen +Verbessert • Autoplay ist nun für alle Services verfügbar (nicht nur für YouTube) -Reparaturen +Behoben • Verwandte Streams wurden behoben, indem die neuen Streamfortsetzungen von YouTube unterstützt werden • Altersbeschränkte Videos repariert • [Android TV] Überlagerung von Fokus-Hervorhebungen behoben diff --git a/fastlane/metadata/android/fr/changelogs/1006.txt b/fastlane/metadata/android/fr/changelogs/1006.txt new file mode 100644 index 000000000..a9ed2c642 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/1006.txt @@ -0,0 +1,17 @@ +# Améliorations +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 améliorations et optimisations mineures + +# Corrections +Correction du formatage du nombre court pour les versions Android inférieures à 7 +Correction des notifications fantômes +Corrections pour les fichiers de sous-titres SRT +Correction de nombreux plantages + +# Développement +Modernisation du code interne diff --git a/fastlane/metadata/android/hu/changelogs/1006.txt b/fastlane/metadata/android/hu/changelogs/1006.txt new file mode 100644 index 000000000..3d0cba88f --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/1006.txt @@ -0,0 +1,16 @@ +# Továbbfejlesztve +Az aktuális lejátszó megmarad időbélyegre kattintáskor +Függőben lévő letöltések helyreállításának megkísérlése +Letöltés törlése a fájl megtartásával +Overlay engedélyhez magyarázó párbeszédablak (Android 11+) +on.soundcloud hivatkozások támogatása +Sok kisebb fejlesztés és optimalizálás + +# Javítva +Számozás javítása Android 7 alatt +Szellem értesítések javítása +SRT felirat javítások +Sok összeomlás javítva + +# Fejlesztés +Belső kód modernizálása diff --git a/fastlane/metadata/android/it/changelogs/1006.txt b/fastlane/metadata/android/it/changelogs/1006.txt new file mode 100644 index 000000000..f7cbbf868 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/1006.txt @@ -0,0 +1,16 @@ +# Migliorie +Tieni il player attuale se si cliccano le marche temporali +Recupera i download in sospeso se possibile +Opzione per eliminare un download senza anche eliminare il file +Autorizzazione di sovrapposizione: mostra finestra esplicativa per Android > R +Supporto per link on.soundcloud +Tanti piccoli miglioramenti e ottimizzazioni + +# Correzioni +Formattazione breve del conto per Android < 7 +Notifiche fantasma +File di sottotitoli SRT +Crash vari + +# Sviluppo +Ammodernamento del codice interno diff --git a/fastlane/metadata/android/pl/changelogs/1006.txt b/fastlane/metadata/android/pl/changelogs/1006.txt new file mode 100644 index 000000000..a537d7c18 --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/1006.txt @@ -0,0 +1,16 @@ +Ulepszone +- Utrzymyw. bieżącego odtwarzacza przy naciskaniu znaczników czasu +- Próba odzysk. oczekuj. pobierań, jeśli to możliwe +- Dodano opcję usuwania pobierania bez usuwania pliku +- Uprawnienie na nakładkę: wyświetl. okna z objaśnieniami dla Androida powyżej R +- Obsługa otw. linków on.soundcloud +- Wiele drobnych ulepszeń i optymal. + +Naprawione +- Formatow. krótkich liczb na Androidzie poniżej 7 +- Puste powiadomienia +- Pliki napisów SRT +- Mnóstwo awarii + +Rozwój +- Modernizacja wewnętrznego kodu diff --git a/fastlane/metadata/android/sk/changelogs/1006.txt b/fastlane/metadata/android/sk/changelogs/1006.txt new file mode 100644 index 000000000..943b4ff5c --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/1006.txt @@ -0,0 +1,16 @@ +# Vylepšené +Aktuálny prehrávač zostane zachovaný pri kliknutí na časové značky +Ak je to možné, pokúsi sa obnoviť čakajúce úlohy sťahovania +Pridaná možnosť odstrániť sťahovanie bez odstránenia súboru +Oprávnenie zobrazenia cez ostatné aplikácie: zobrazí vysvetlenie pre Android > R +Podpora otvárania odkazov on.soundcloud +Množstvo malých vylepšení a optimalizácií + +# Opravené +Oprava formátovania krátkeho počítania pre verzie Androidu nižšie ako 7 +Oprava klamných oznámení +Oprava súborov titulkov SRT +Oprava množstva zlyhaní + +# Vývoj +Modernizácia interného kódu diff --git a/fastlane/metadata/android/zh-Hans/changelogs/1005.txt b/fastlane/metadata/android/zh-Hans/changelogs/1005.txt new file mode 100644 index 000000000..baf746b18 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/1005.txt @@ -0,0 +1,16 @@ +新增 +• 新增对 Android Auto 的支持 +• 允许将信息流分组设置为主屏幕标签页 +• [YouTube] 以临时播放列表的形式分享 +• [SoundCloud] 新增“喜欢”频道标签页 + +改进 +• 优化搜索栏提示 +• 在“下载”中显示下载日期 +• 使用 Android 13 的应用内语言 +修复 +• 修复深色模式下文本颜色显示错误 +• [YouTube] 修复播放列表加载超过 100 个项目时无法加载的问题 +• [YouTube] 修复推荐视频缺失的问题 +• 修复历史记录列表视图中的崩溃问题 +• 修复评论回复中的时间戳显示错误 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/1006.txt b/fastlane/metadata/android/zh-Hans/changelogs/1006.txt new file mode 100644 index 000000000..a3a089068 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/1006.txt @@ -0,0 +1,16 @@ +# 改进 +单击时间戳时保持当前播放器 +尽可能恢复未完成的下载任务 +新增选项,允许删除下载项而不删除文件 +叠加层权限:在 Android R 及以上版本中显示说明对话框 +支持打开 on.soundcloud 链接 +大量小改进和优化 + +# 修复 +修复 Android 7 以下版本短计数格式问题 +修复幽灵通知 +修复 SRT 字幕文件问题 +修复大量崩溃问题 + +# 开发 +内部代码现代化 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/991.txt b/fastlane/metadata/android/zh-Hans/changelogs/991.txt new file mode 100644 index 000000000..c4ca761f4 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/991.txt @@ -0,0 +1,13 @@ +新增 +• 在错误面板中添加“在浏览器中打开”按钮 +• 新增以列表形式显示频道组的选项 +• [YouTube] 长按视频片段即可分享时间戳 URL +• 在迷你播放器中添加播放队列按钮 + +改进 +• 新增冰岛语本地化并更新了其他多种语言的翻译 +• 多项内部改进 + +修复 +• 修复多个崩溃问题 +• [YouTube] 修复部分国家/地区频道加载、非专用源播放以及播放问题 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/992.txt b/fastlane/metadata/android/zh-Hans/changelogs/992.txt new file mode 100644 index 000000000..ca8e1733d --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/992.txt @@ -0,0 +1,17 @@ +新增 +• 视频详情页显示订阅者数量 +• 从播放队列下载 +• 永久设置播放列表缩略图 +• 长按话题标签和链接 +• 卡片视图模式 + +改进 +• 更大的迷你播放器关闭按钮 +• 更流畅的缩略图缩放 +• 目标平台:Android 13 (API 33) +• 快进/快退操作不再导致播放器暂停 + +修复 +• 修复 DeX/鼠标上的叠加层问题 +• 允许后台播放,无需单独的音频流 +• 其他 YouTube 相关问题修复及更多… diff --git a/fastlane/metadata/android/zh-Hans/changelogs/993.txt b/fastlane/metadata/android/zh-Hans/changelogs/993.txt new file mode 100644 index 000000000..abe5b8f27 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/993.txt @@ -0,0 +1,12 @@ +新增 +• 添加重复播放列表时发出警告,并添加删除按钮 +• 允许忽略硬件按钮 +• 允许在信息流中隐藏已观看但未完成的视频 + +改进 +• 在大屏幕上使用更多网格列 +• 使进度指示器与设置保持一致 + +修复 +• 修复在 Android 11 及更高版本上打开浏览器 URL、下载和外部播放器的问题 +• 修复在 MIUI 系统上全屏交互需要点击两次的问题 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/994.txt b/fastlane/metadata/android/zh-Hans/changelogs/994.txt new file mode 100644 index 000000000..38bfed7d0 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/994.txt @@ -0,0 +1,15 @@ +新增 +• 支持多音轨/多语言 +• 允许在屏幕任意一侧使用手势调节音量和亮度 +• 支持在屏幕底部显示主标签页 + +改进 +• [Bandcamp] 处理付费墙后的曲目 + +修复 +• [YouTube] 修复流媒体播放的 403 HTTP 错误 +• 修复从播放列表视图切换到主播放器时播放器黑屏的问题 +• 修复播放器服务内存泄漏问题 +• [PeerTube] 上传者和子频道头像互换的问题 + +以及更多 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/995.txt b/fastlane/metadata/android/zh-Hans/changelogs/995.txt new file mode 100644 index 000000000..4cd4d2b80 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/995.txt @@ -0,0 +1,16 @@ +新增 +• 支持频道标签页 +• 可选择图像质量 +• 获取所有图像的 URL + +改进 +• 播放器界面更易于访问 +• 改进仅下载视频时的音频选择 +• 可选择在共享播放列表内容中包含播放列表和视频名称 + +修复 +• [YouTube] 修复获取点赞数的问题 +• 修复播放器无响应的弹出窗口和崩溃问题 +• 修复语言选择器中选择错误语言的问题 +• 修复播放器音频焦点未响应静音设置的问题 +• 修复播放列表项目添加功能偶尔失效的问题 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/996.txt b/fastlane/metadata/android/zh-Hans/changelogs/996.txt new file mode 100644 index 000000000..4773b420b --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/996.txt @@ -0,0 +1,2 @@ +修复了在 media.ccc.de 中打开频道/会议时出现的 NullPointerException 异常。 +圣诞怪杰试图破坏我们送给大家的圣诞礼物,但我们已经解决了这个问题。 diff --git a/fastlane/metadata/android/zh-Hans/changelogs/997.txt b/fastlane/metadata/android/zh-Hans/changelogs/997.txt new file mode 100644 index 000000000..a7cd06bd6 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/997.txt @@ -0,0 +1,17 @@ +新增 +• 添加评论回复 +• 允许重新排序播放列表 +• 显示播放列表描述和时长 +• 允许重置设置 + +改进 +• [Android 13+] 恢复自定义通知操作 +• 请求更新检查的同意 +• 允许在缓冲期间播放/暂停通知 +• 重新排序部分设置 + +修复 +• [YouTube] 修复评论无法加载的问题,以及其他修复和改进 +• 修复设置导入中的漏洞并切换到 JSON 格式 +• 修复各种下载问题 +• 精简搜索文本 From 3ffd194f78d7a708b443ff914cf68bb50b0683d1 Mon Sep 17 00:00:00 2001 From: tobigr Date: Sun, 21 Dec 2025 18:30:14 +0100 Subject: [PATCH 072/190] Fix insufficient permissions on opening downloaded streams --- .../giga/ui/adapter/MissionAdapter.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index f245b3dd9..54ae2cfa4 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -2,6 +2,7 @@ package us.shandian.giga.ui.adapter; import static android.content.Intent.FLAG_GRANT_PREFIX_URI_PERMISSION; import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION; +import static android.content.Intent.createChooser; import static us.shandian.giga.get.DownloadMission.ERROR_CONNECT_HOST; import static us.shandian.giga.get.DownloadMission.ERROR_FILE_CREATION; import static us.shandian.giga.get.DownloadMission.ERROR_HTTP_NO_CONTENT; @@ -349,11 +350,15 @@ public class MissionAdapter extends Adapter implements Handler.Callb if (BuildConfig.DEBUG) Log.v(TAG, "Mime: " + mimeType + " package: " + BuildConfig.APPLICATION_ID + ".provider"); - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setDataAndType(resolveShareableUri(mission), mimeType); - intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); - intent.addFlags(FLAG_GRANT_PREFIX_URI_PERMISSION); - ShareUtils.openIntentInApp(mContext, intent); + Intent viewIntent = new Intent(Intent.ACTION_VIEW); + viewIntent.setDataAndType(resolveShareableUri(mission), mimeType); + viewIntent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); + viewIntent.addFlags(FLAG_GRANT_PREFIX_URI_PERMISSION); + + Intent chooserIntent = createChooser(viewIntent, null); + chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | FLAG_GRANT_READ_URI_PERMISSION); + + ShareUtils.openIntentInApp(mContext, chooserIntent); } private void shareFile(Mission mission) { @@ -364,8 +369,7 @@ public class MissionAdapter extends Adapter implements Handler.Callb shareIntent.putExtra(Intent.EXTRA_STREAM, resolveShareableUri(mission)); shareIntent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); - final Intent intent = new Intent(Intent.ACTION_CHOOSER); - intent.putExtra(Intent.EXTRA_INTENT, shareIntent); + final Intent intent = createChooser(shareIntent, null); // unneeded to set a title to the chooser on Android P and higher because the system // ignores this title on these versions if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1) { From a7b226c35439d10d9e1f9b8555b86d3b0adf9087 Mon Sep 17 00:00:00 2001 From: tobigr Date: Mon, 22 Dec 2025 10:15:18 +0100 Subject: [PATCH 073/190] [Player] Use original audio language by default --- app/src/main/java/org/schabi/newpipe/util/ListHelper.java | 2 +- app/src/main/res/xml/video_audio_settings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index ea41f3e81..409fcb30c 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -806,7 +806,7 @@ public final class ListHelper { final Locale preferredLanguage = Localization.getPreferredLocale(context); final boolean preferOriginalAudio = preferences.getBoolean(context.getString(R.string.prefer_original_audio_key), - false); + true); final boolean preferDescriptiveAudio = preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key), false); diff --git a/app/src/main/res/xml/video_audio_settings.xml b/app/src/main/res/xml/video_audio_settings.xml index 727ce4df4..6e8e2979b 100644 --- a/app/src/main/res/xml/video_audio_settings.xml +++ b/app/src/main/res/xml/video_audio_settings.xml @@ -62,7 +62,7 @@ app:useSimpleSummaryProvider="true" /> Date: Fri, 26 Dec 2025 21:57:26 +0100 Subject: [PATCH 074/190] Fix retrieving incomplete data for SubscriptionEntity This fixes a visual bug in which the channels reported the the subscriber count was unavailable although stored in the db. Closes #12953 --- .../newpipe/database/subscription/SubscriptionEntity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt index 104d0a142..7df9830e4 100644 --- a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt @@ -55,8 +55,8 @@ data class SubscriptionEntity( fun toChannelInfoItem(): ChannelInfoItem { return ChannelInfoItem(this.serviceId, this.url, this.name).apply { thumbnails = ImageStrategy.dbUrlToImageList(this@SubscriptionEntity.avatarUrl) - subscriberCount = this.subscriberCount - description = this.description + subscriberCount = this@SubscriptionEntity.subscriberCount ?: -1 + description = this@SubscriptionEntity.description } } From c2f526d5b3137e291d269980f8c289e80ceb10a2 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Fri, 26 Dec 2025 14:15:33 +0200 Subject: [PATCH 075/190] Use context.getString() shorthand instead of context.getResources().getString() Cherry-picked from #12949 / 4360c1b8735c073b95a162324b2814cc5a5b4ecd --- .../org/schabi/newpipe/player/helper/PlayerHelper.java | 6 +++--- .../main/java/org/schabi/newpipe/util/Localization.java | 8 ++++---- .../main/java/org/schabi/newpipe/util/ThemeHelper.java | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index c335e9b7c..0f9579352 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -141,11 +141,11 @@ public final class PlayerHelper { @ResizeMode final int resizeMode) { switch (resizeMode) { case AspectRatioFrameLayout.RESIZE_MODE_FIT: - return context.getResources().getString(R.string.resize_fit); + return context.getString(R.string.resize_fit); case AspectRatioFrameLayout.RESIZE_MODE_FILL: - return context.getResources().getString(R.string.resize_fill); + return context.getString(R.string.resize_fill); case AspectRatioFrameLayout.RESIZE_MODE_ZOOM: - return context.getResources().getString(R.string.resize_zoom); + return context.getString(R.string.resize_zoom); case AspectRatioFrameLayout.RESIZE_MODE_FIXED_HEIGHT: case AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH: default: diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java index b8cc26b41..49e27d108 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -153,9 +153,9 @@ public final class Localization { case (int) ListExtractor.ITEM_COUNT_UNKNOWN: return ""; case (int) ListExtractor.ITEM_COUNT_INFINITE: - return context.getResources().getString(R.string.infinite_videos); + return context.getString(R.string.infinite_videos); case (int) ListExtractor.ITEM_COUNT_MORE_THAN_100: - return context.getResources().getString(R.string.more_than_100_videos); + return context.getString(R.string.more_than_100_videos); default: return getQuantity(context, R.plurals.videos, R.string.no_videos, streamCount, localizeNumber(streamCount)); @@ -168,9 +168,9 @@ public final class Localization { case (int) ListExtractor.ITEM_COUNT_UNKNOWN: return ""; case (int) ListExtractor.ITEM_COUNT_INFINITE: - return context.getResources().getString(R.string.infinite_videos_mini); + return context.getString(R.string.infinite_videos_mini); case (int) ListExtractor.ITEM_COUNT_MORE_THAN_100: - return context.getResources().getString(R.string.more_than_100_videos_mini); + return context.getString(R.string.more_than_100_videos_mini); default: return String.valueOf(streamCount); } diff --git a/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java b/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java index ab74e0305..24a0f457f 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java @@ -263,7 +263,7 @@ public final class ThemeHelper { private static String getSelectedThemeKey(final Context context) { final String themeKey = context.getString(R.string.theme_key); - final String defaultTheme = context.getResources().getString(R.string.default_theme_value); + final String defaultTheme = context.getString(R.string.default_theme_value); return PreferenceManager.getDefaultSharedPreferences(context) .getString(themeKey, defaultTheme); } From 2dde0fef58364382f7f783c80916d8ea226a68b5 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Fri, 26 Dec 2025 11:21:10 +0200 Subject: [PATCH 076/190] Convert newpipe/util/KioskTranslator.java to kotlin Cherry picked from #12947 / 4649e46d1ee4c691f2923c9b5c35c154c77b29a4 --- .../schabi/newpipe/util/KioskTranslator.java | 100 ------------------ .../schabi/newpipe/util/KioskTranslator.kt | 69 ++++++++++++ 2 files changed, 69 insertions(+), 100 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java create mode 100644 app/src/main/java/org/schabi/newpipe/util/KioskTranslator.kt diff --git a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java deleted file mode 100644 index 5aa332159..000000000 --- a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.schabi.newpipe.util; - -import android.content.Context; - -import org.schabi.newpipe.R; - -/** - * Created by Christian Schabesberger on 28.09.17. - * KioskTranslator.java is part of NewPipe. - *

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

    - *

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

    - *

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

    - */ - -public final class KioskTranslator { - private KioskTranslator() { } - - public static String getTranslatedKioskName(final String kioskId, final Context c) { - switch (kioskId) { - case "Trending": - return c.getString(R.string.trending); - case "Top 50": - return c.getString(R.string.top_50); - case "New & hot": - return c.getString(R.string.new_and_hot); - case "Local": - return c.getString(R.string.local); - case "Recently added": - return c.getString(R.string.recently_added); - case "Most liked": - return c.getString(R.string.most_liked); - case "conferences": - return c.getString(R.string.conferences); - case "recent": - return c.getString(R.string.recent); - case "live": - return c.getString(R.string.duration_live); - case "Featured": - return c.getString(R.string.featured); - case "Radio": - return c.getString(R.string.radio); - case "trending_gaming": - return c.getString(R.string.trending_gaming); - case "trending_music": - return c.getString(R.string.trending_music); - case "trending_movies_and_shows": - return c.getString(R.string.trending_movies); - case "trending_podcasts_episodes": - return c.getString(R.string.trending_podcasts); - default: - return kioskId; - } - } - - public static int getKioskIcon(final String kioskId) { - switch (kioskId) { - case "Trending": - case "Top 50": - case "New & hot": - case "conferences": - return R.drawable.ic_whatshot; - case "Local": - return R.drawable.ic_home; - case "Recently added": - case "recent": - return R.drawable.ic_add_circle_outline; - case "Most liked": - return R.drawable.ic_thumb_up; - case "live": - return R.drawable.ic_live_tv; - case "Featured": - return R.drawable.ic_stars; - case "Radio": - return R.drawable.ic_radio; - case "trending_gaming": - return R.drawable.ic_videogame_asset; - case "trending_music": - return R.drawable.ic_music_note; - case "trending_movies_and_shows": - return R.drawable.ic_movie; - case "trending_podcasts_episodes": - return R.drawable.ic_podcasts; - default: - return 0; - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.kt b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.kt new file mode 100644 index 000000000..39167e969 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.kt @@ -0,0 +1,69 @@ +package org.schabi.newpipe.util + +import android.content.Context +import org.schabi.newpipe.R + +/** + * Created by Christian Schabesberger on 28.09.17. + * KioskTranslator.java is part of NewPipe. + * + * + * NewPipe is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see //www.gnu.org/licenses/>. + * + */ +object KioskTranslator { + @JvmStatic + fun getTranslatedKioskName(kioskId: String, c: Context): String { + return when (kioskId) { + "Trending" -> c.getString(R.string.trending) + "Top 50" -> c.getString(R.string.top_50) + "New & hot" -> c.getString(R.string.new_and_hot) + "Local" -> c.getString(R.string.local) + "Recently added" -> c.getString(R.string.recently_added) + "Most liked" -> c.getString(R.string.most_liked) + "conferences" -> c.getString(R.string.conferences) + "recent" -> c.getString(R.string.recent) + "live" -> c.getString(R.string.duration_live) + "Featured" -> c.getString(R.string.featured) + "Radio" -> c.getString(R.string.radio) + "trending_gaming" -> c.getString(R.string.trending_gaming) + "trending_music" -> c.getString(R.string.trending_music) + "trending_movies_and_shows" -> c.getString(R.string.trending_movies) + "trending_podcasts_episodes" -> c.getString(R.string.trending_podcasts) + else -> kioskId + } + } + + @JvmStatic + fun getKioskIcon(kioskId: String): Int { + return when (kioskId) { + "Trending", "Top 50", "New & hot", "conferences" -> R.drawable.ic_whatshot + "Local" -> R.drawable.ic_home + "Recently added", "recent" -> R.drawable.ic_add_circle_outline + "Most liked" -> R.drawable.ic_thumb_up + "live" -> R.drawable.ic_live_tv + "Featured" -> R.drawable.ic_stars + "Radio" -> R.drawable.ic_radio + "trending_gaming" -> R.drawable.ic_videogame_asset + "trending_music" -> R.drawable.ic_music_note + "trending_movies_and_shows" -> R.drawable.ic_movie + "trending_podcasts_episodes" -> R.drawable.ic_podcasts + else -> 0 + } + } +} From 718335d7334522fa208406ea911f7701e22fe376 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Fri, 26 Dec 2025 20:23:15 +0100 Subject: [PATCH 077/190] fix(player): Fix scaleX being NaN on minimize to background app switch This aims to fix the following Exception which might occour when watching a live stream and switching the app while 'minimize to backgorund' is enabled: java.lang.IllegalArgumentException: Cannot set 'scaleX' to Float.NaN at android.view.View.sanitizeFloatPropertyValue(View.java:17479) at android.view.View.sanitizeFloatPropertyValue(View.java:17453) at android.view.View.setScaleX(View.java:16822) at org.schabi.newpipe.views.ExpandableSurfaceView.onLayout(ExpandableSurfaceView.java:71) scaleX is set in onMeasure() in which width could be 0 in theory and this leading to a division by zero of a float which results in an assignment of Float.NaN. --- .../java/org/schabi/newpipe/views/ExpandableSurfaceView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/views/ExpandableSurfaceView.java b/app/src/main/java/org/schabi/newpipe/views/ExpandableSurfaceView.java index 175c81e46..36380b650 100644 --- a/app/src/main/java/org/schabi/newpipe/views/ExpandableSurfaceView.java +++ b/app/src/main/java/org/schabi/newpipe/views/ExpandableSurfaceView.java @@ -35,12 +35,12 @@ public class ExpandableSurfaceView extends SurfaceView { && resizeMode != RESIZE_MODE_FIT && verticalVideo ? maxHeight : baseHeight; - if (height == 0) { + if (width == 0 || height == 0) { return; } final float viewAspectRatio = width / ((float) height); - final float aspectDeformation = videoAspectRatio / viewAspectRatio - 1; + final float aspectDeformation = (videoAspectRatio / viewAspectRatio) - 1; scaleX = 1.0f; scaleY = 1.0f; From 7101aecc98aa80291c231e2c7a9425aef60cece4 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Fri, 26 Dec 2025 23:49:30 +0100 Subject: [PATCH 078/190] Try to prevent invalid aspectRatio of SurfaceView If the video's hieght is 0, the aspectRatio is set to Float.NaN which can cause further issues. Do not assign invalid values for the aspectRatio. --- .../java/org/schabi/newpipe/views/ExpandableSurfaceView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/views/ExpandableSurfaceView.java b/app/src/main/java/org/schabi/newpipe/views/ExpandableSurfaceView.java index 36380b650..7452fff09 100644 --- a/app/src/main/java/org/schabi/newpipe/views/ExpandableSurfaceView.java +++ b/app/src/main/java/org/schabi/newpipe/views/ExpandableSurfaceView.java @@ -100,7 +100,7 @@ public class ExpandableSurfaceView extends SurfaceView { } public void setAspectRatio(final float aspectRatio) { - if (videoAspectRatio == aspectRatio) { + if (videoAspectRatio == aspectRatio || aspectRatio == 0 || !Float.isFinite(aspectRatio)) { return; } From 465979e677beb5bdba7c2c0bd5d1d3f9f24b3cec Mon Sep 17 00:00:00 2001 From: tobigr Date: Mon, 29 Dec 2025 16:36:43 +0100 Subject: [PATCH 079/190] Do not change the aspectRation if the renderer is disabled --- .../java/org/schabi/newpipe/player/ui/VideoPlayerUi.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 7157d6af2..b68d3d94d 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -1554,6 +1554,11 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa @Override public void onVideoSizeChanged(@NonNull final VideoSize videoSize) { super.onVideoSizeChanged(videoSize); + // Starting with ExoPlayer 2.19.0, the VideoSize will report a width and height of 0 + // if the renderer is disabled. In that case, we skip updating the aspect ratio. + if (videoSize.width == 0 || videoSize.height == 0) { + return; + } binding.surfaceView.setAspectRatio(((float) videoSize.width) / videoSize.height); } //endregion From c9339a5a0323a263a4228d1944c961a629a4937a Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 28 Dec 2025 10:10:48 +0100 Subject: [PATCH 080/190] Translated using Weblate (French) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Punjabi) Currently translated at 97.2% (743 of 764 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (87 of 87 strings) Added translation using Weblate (Romany) Translated using Weblate (Korean) Currently translated at 97.7% (85 of 87 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (87 of 87 strings) Co-authored-by: Hosted Weblate Co-authored-by: Madalin Co-authored-by: Mona Lisa Co-authored-by: NormalRandomPeople Co-authored-by: TobiGr Co-authored-by: whistlingwoods <72640314+whistlingwoods@users.noreply.github.com> Co-authored-by: Максим Горпиніч Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ko/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/uk/ Translation: NewPipe/Metadata --- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-pa/strings.xml | 6 ++++++ app/src/main/res/values-rom/strings.xml | 3 +++ fastlane/metadata/android/ko/changelogs/1006.txt | 16 ++++++++++++++++ fastlane/metadata/android/sv/changelogs/1006.txt | 16 ++++++++++++++++ fastlane/metadata/android/uk/changelogs/1006.txt | 16 ++++++++++++++++ 6 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/values-rom/strings.xml create mode 100644 fastlane/metadata/android/ko/changelogs/1006.txt create mode 100644 fastlane/metadata/android/sv/changelogs/1006.txt create mode 100644 fastlane/metadata/android/uk/changelogs/1006.txt diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e587a301d..eb28d0e21 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -862,7 +862,7 @@ Compte fermé\n\n%1$s fournit la raison suivante : %2$s Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par l\'expiration de l\'URL de streaming ou une interdiction d\'IP Erreur HTTP %1$s reçue du serveur pendant la lecture - Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par une interdiction d\'IP ou des problèmes de désobfuscation d\'URL de streaming. + Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par un bannissement d\'IP ou des problèmes de désobfuscation de l\'URL de streaming %1$s a refusé de fournir des données et a demandé un identifiant pour confirmer que le demandeur n\'est pas un robot.\n\nVotre adresse IP a peut-être été temporairement bannie par %1$s. Vous pouvez patienter un peu ou changer d\'adresse IP (par exemple en activant/désactivant un VPN, ou en passant du Wi-Fi aux données mobiles). Ce contenu n\'est pas disponible pour le pays actuellement sélectionné.\n\nModifiez votre sélection dans « Paramètres > Contenu > Pays par défaut ». diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 8b5969c0c..7029dda05 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -828,4 +828,10 @@ ਅਜੇ ਤੱਕ ਕੋਈ ਫੀਡ ਗਰੁੱਪ ਨਹੀਂ ਬਣਾਇਆ ਗਿਆ ਚੈਨਲ ਗਰੁੱਪ ਪੰਨਾ ਪਸੰਦ + + + ਫ਼ਾਈਲ ਮਿਟਾਓ + ਐਂਟਰੀ ਮਿਟਾਓ + ਖ਼ਾਤਾ ਬੰਦ ਕੀਤਾ ਗਿਆ\n\n%1$s ਇਹ ਕਾਰਨ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ: %2$s + ਐਂਟਰੀ ਮਿਟਾ ਦਿੱਤੀ ਗਈ diff --git a/app/src/main/res/values-rom/strings.xml b/app/src/main/res/values-rom/strings.xml new file mode 100644 index 000000000..55344e519 --- /dev/null +++ b/app/src/main/res/values-rom/strings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/fastlane/metadata/android/ko/changelogs/1006.txt b/fastlane/metadata/android/ko/changelogs/1006.txt new file mode 100644 index 000000000..1729e9827 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/1006.txt @@ -0,0 +1,16 @@ +# 개선됨 +타임스탬프를 클릭할 때 현재 플레이어를 유지합니다. +가능한 경우 보류 중인 다운로드 미션을 복구하세요. +파일 삭제 없이 다운로드를 삭제하는 옵션을 추가하세요. +오버레이 권한: Android > R에 대한 설명 대화 상자 표시 +사운드클라우드 링크 열기 지원 +많은 작은 개선과 최적화 + +# 고정 +7 이하의 안드로이드 버전에 대한 짧은 숫자 형식을 수정하세요. +고스트 알림 수정 +SRT 자막 파일 수정 +고정된 수많은 충돌 사고 + +# 개발 +내부 코드 현대화 diff --git a/fastlane/metadata/android/sv/changelogs/1006.txt b/fastlane/metadata/android/sv/changelogs/1006.txt new file mode 100644 index 000000000..90825e8a8 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/1006.txt @@ -0,0 +1,16 @@ +# Förbättrat +Behåll aktuell spelare när du klickar på tidsstämplar +Försök att återställa väntande nedladdningsuppdrag när det är möjligt +Lägg till alternativ för att ta bort en nedladdning utan att också ta bort filen +Överläggsbehörighet: visa förklarande dialogruta för Android > R +Stöd för att öppna on.soundcloud-länkar +Många små förbättringar och optimeringar + +# Åtgärdat +Åtgärdade formatering av korta antal för Android-versioner under 7 +Åtgärdade Ghost Notifications +Åtgärdade för SRT-undertextfiler +Åtgärdade massor av krascher + +# Utveckling +Intern kodmodernisering diff --git a/fastlane/metadata/android/uk/changelogs/1006.txt b/fastlane/metadata/android/uk/changelogs/1006.txt new file mode 100644 index 000000000..6534e9145 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/1006.txt @@ -0,0 +1,16 @@ +# Покращено +Зберігати поточний програвач при натисканні на часові позначки +Намагатися відновлювати місії, що очікують завантаження, коли це можливо +Додано опцію видалення завантаження без одночасного видалення файлу +Дозвіл на накладання: відображення пояснювального діалогового вікна для Android > R +Підтримка відкриття посилання на .soundcloud +Багато дрібних покращень та оптимізацій + +# Виправлено +Виправлено форматування короткого лічильника для версій Android нижче 7 +Виправлено сповіщення-примари +Виправлення для файлів субтитрів SRT +Виправлено безліч збоїв + +# Розробка +Модернізація внутрішнього коду From 0a65c862a36510c8234277e71a7cfd38757ac6ed Mon Sep 17 00:00:00 2001 From: tobigr Date: Tue, 30 Dec 2025 09:16:58 +0100 Subject: [PATCH 081/190] Remove empty translations --- app/src/main/res/values-br/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 2 -- 2 files changed, 3 deletions(-) diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index a0a7744f6..dfff3c2cc 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -117,5 +117,4 @@ Lenn ar video, pad: Titouroù: Video - diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 7029dda05..eb6ee58a2 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -828,8 +828,6 @@ ਅਜੇ ਤੱਕ ਕੋਈ ਫੀਡ ਗਰੁੱਪ ਨਹੀਂ ਬਣਾਇਆ ਗਿਆ ਚੈਨਲ ਗਰੁੱਪ ਪੰਨਾ ਪਸੰਦ - - ਫ਼ਾਈਲ ਮਿਟਾਓ ਐਂਟਰੀ ਮਿਟਾਓ ਖ਼ਾਤਾ ਬੰਦ ਕੀਤਾ ਗਿਆ\n\n%1$s ਇਹ ਕਾਰਨ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ: %2$s From f6085d004497af807101944623605d8338344747 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Tue, 30 Dec 2025 13:30:37 +0200 Subject: [PATCH 082/190] Replace findPreference(getString(resId) with its null safe shortcut --- .../BackupRestoreSettingsFragment.java | 3 +-- .../settings/BasePreferenceFragment.java | 4 ++-- .../settings/DebugSettingsFragment.java | 21 +++++++------------ .../settings/MainSettingsFragment.java | 4 ++-- .../settings/NotificationsSettingsFragment.kt | 7 +++---- .../settings/UpdateSettingsFragment.java | 4 ++-- .../settings/VideoAudioSettingsFragment.java | 15 +++++++------ 7 files changed, 24 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java index 2900dee90..baaa93e44 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java @@ -98,10 +98,9 @@ public class BackupRestoreSettingsFragment extends BasePreferenceFragment { return true; }); - final Preference resetSettings = findPreference(getString(R.string.reset_settings)); + final Preference resetSettings = requirePreference(R.string.reset_settings); // Resets all settings by deleting shared preference and restarting the app // A dialogue will pop up to confirm if user intends to reset all settings - assert resetSettings != null; resetSettings.setOnPreferenceClickListener(preference -> { // Show Alert Dialogue final AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); diff --git a/app/src/main/java/org/schabi/newpipe/settings/BasePreferenceFragment.java b/app/src/main/java/org/schabi/newpipe/settings/BasePreferenceFragment.java index 619579f3a..21cba3daa 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/BasePreferenceFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/BasePreferenceFragment.java @@ -48,8 +48,8 @@ public abstract class BasePreferenceFragment extends PreferenceFragmentCompat { } @NonNull - public final Preference requirePreference(@StringRes final int resId) { - final Preference preference = findPreference(getString(resId)); + public final T requirePreference(@StringRes final int resId) { + final T preference = findPreference(getString(resId)); Objects.requireNonNull(preference); return preference; } diff --git a/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java index d78ade49d..82f2f5bb6 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java @@ -22,27 +22,20 @@ public class DebugSettingsFragment extends BasePreferenceFragment { addPreferencesFromResourceRegistry(); final Preference allowHeapDumpingPreference = - findPreference(getString(R.string.allow_heap_dumping_key)); + requirePreference(R.string.allow_heap_dumping_key); final Preference showMemoryLeaksPreference = - findPreference(getString(R.string.show_memory_leaks_key)); + requirePreference(R.string.show_memory_leaks_key); final Preference showImageIndicatorsPreference = - findPreference(getString(R.string.show_image_indicators_key)); + requirePreference(R.string.show_image_indicators_key); final Preference checkNewStreamsPreference = - findPreference(getString(R.string.check_new_streams_key)); + requirePreference(R.string.check_new_streams_key); final Preference crashTheAppPreference = - findPreference(getString(R.string.crash_the_app_key)); + requirePreference(R.string.crash_the_app_key); final Preference showErrorSnackbarPreference = - findPreference(getString(R.string.show_error_snackbar_key)); + requirePreference(R.string.show_error_snackbar_key); final Preference createErrorNotificationPreference = - findPreference(getString(R.string.create_error_notification_key)); + requirePreference(R.string.create_error_notification_key); - assert allowHeapDumpingPreference != null; - assert showMemoryLeaksPreference != null; - assert showImageIndicatorsPreference != null; - assert checkNewStreamsPreference != null; - assert crashTheAppPreference != null; - assert showErrorSnackbarPreference != null; - assert createErrorNotificationPreference != null; final Optional optBVLeakCanary = getBVDLeakCanary(); diff --git a/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java index 32e33d55b..cb3de39a0 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java @@ -25,7 +25,7 @@ public class MainSettingsFragment extends BasePreferenceFragment { // Check if the app is updatable if (!ReleaseVersionUtil.INSTANCE.isReleaseApk()) { getPreferenceScreen().removePreference( - findPreference(getString(R.string.update_pref_screen_key))); + requirePreference(R.string.update_pref_screen_key)); defaultPreferences.edit().putBoolean(getString(R.string.update_app_key), false).apply(); } @@ -33,7 +33,7 @@ public class MainSettingsFragment extends BasePreferenceFragment { // Hide debug preferences in RELEASE build variant if (!DEBUG) { getPreferenceScreen().removePreference( - findPreference(getString(R.string.debug_pref_screen_key))); + requirePreference(R.string.debug_pref_screen_key)); } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/NotificationsSettingsFragment.kt b/app/src/main/java/org/schabi/newpipe/settings/NotificationsSettingsFragment.kt index 2d3344c09..d6b0a84da 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/NotificationsSettingsFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/NotificationsSettingsFragment.kt @@ -29,8 +29,7 @@ class NotificationsSettingsFragment : BasePreferenceFragment(), OnSharedPreferen override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.notifications_settings) - streamsNotificationsPreference = - findPreference(getString(R.string.enable_streams_notifications)) + streamsNotificationsPreference = requirePreference(R.string.enable_streams_notifications) // main check is done in onResume, but also do it here to prevent flickering updateEnabledState(NotificationHelper.areNotificationsEnabledOnDevice(requireContext())) @@ -125,8 +124,8 @@ class NotificationsSettingsFragment : BasePreferenceFragment(), OnSharedPreferen private fun updateSubscriptions(subscriptions: List) { val notified = subscriptions.count { it.notificationMode != NotificationMode.DISABLED } - val preference = findPreference(getString(R.string.streams_notifications_channels_key)) - preference?.apply { summary = "$notified/${subscriptions.size}" } + val preference = requirePreference(R.string.streams_notifications_channels_key) + preference.summary = "$notified/${subscriptions.size}" } private fun onError(e: Throwable) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java index b8d0aa556..8923972b0 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java @@ -34,9 +34,9 @@ public class UpdateSettingsFragment extends BasePreferenceFragment { public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { addPreferencesFromResourceRegistry(); - findPreference(getString(R.string.update_app_key)) + requirePreference(R.string.update_app_key) .setOnPreferenceChangeListener(updatePreferenceChange); - findPreference(getString(R.string.manual_update_key)) + requirePreference(R.string.manual_update_key) .setOnPreferenceClickListener(manualUpdateClick); } diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java index a1f563724..c5c4c480c 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -90,12 +90,12 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { showHigherResolutions); // get resolution preferences - final ListPreference defaultResolution = findPreference( - getString(R.string.default_resolution_key)); - final ListPreference defaultPopupResolution = findPreference( - getString(R.string.default_popup_resolution_key)); - final ListPreference mobileDataResolution = findPreference( - getString(R.string.limit_mobile_data_usage_key)); + final ListPreference defaultResolution = requirePreference( + R.string.default_resolution_key); + final ListPreference defaultPopupResolution = requirePreference( + R.string.default_popup_resolution_key); + final ListPreference mobileDataResolution = requirePreference( + R.string.limit_mobile_data_usage_key); // update resolution preferences with new resolutions, entries & values for each defaultResolution.setEntries(resolutionListDescriptions.toArray(new String[0])); @@ -161,8 +161,7 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { } } - final ListPreference durations = findPreference( - getString(R.string.seek_duration_key)); + final ListPreference durations = requirePreference(R.string.seek_duration_key); durations.setEntryValues(displayedDurationValues.toArray(new CharSequence[0])); durations.setEntries(displayedDescriptionValues.toArray(new CharSequence[0])); final int selectedDuration = Integer.parseInt(durations.getValue()); From 7806a708c26b41a3386ecb06ecd5ec6a178ce53d Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Wed, 31 Dec 2025 05:23:14 +0200 Subject: [PATCH 083/190] Correct typo in playlist db sql query Solve #12855 --- .../schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt index 8e0b80c3b..36a80bc91 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt @@ -28,7 +28,7 @@ interface PlaylistRemoteDAO : BasicDAO { @Query("SELECT * FROM remote_playlists WHERE uid = :playlistId") fun getPlaylist(playlistId: Long): Flowable - @Query("SELECT * FROM remote_playlists WHERE url = :url AND uid = :serviceId") + @Query("SELECT * FROM remote_playlists WHERE url = :url AND service_id = :serviceId") fun getPlaylist(serviceId: Long, url: String?): Flowable> @get:Query("SELECT * FROM remote_playlists ORDER BY display_index") From 6c238fafbe8907f536cf2a24e83d0f725c1bf358 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 31 Dec 2025 17:05:12 +0800 Subject: [PATCH 084/190] fixup! Convert newpipe/util/KioskTranslator.java to kotlin Copyright and license header are not doc-comments. Move them to the top of the file. Also re-write it to follow the SPDX formatting as we have followed in the recent Kotlin conversion. Additionally, use a better name for the context parameter. Signed-off-by: Aayush Gupta --- .../schabi/newpipe/util/KioskTranslator.kt | 61 +++++++------------ 1 file changed, 22 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.kt b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.kt index 39167e969..1f86f5db7 100644 --- a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.kt +++ b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.kt @@ -1,50 +1,33 @@ +/* + * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors + * SPDX-FileCopyrightText: 2025 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + package org.schabi.newpipe.util import android.content.Context import org.schabi.newpipe.R -/** - * Created by Christian Schabesberger on 28.09.17. - * KioskTranslator.java is part of NewPipe. - * - * - * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * - * - * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * - * - * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see //www.gnu.org/licenses/>. - * - */ object KioskTranslator { @JvmStatic - fun getTranslatedKioskName(kioskId: String, c: Context): String { + fun getTranslatedKioskName(kioskId: String, context: Context): String { return when (kioskId) { - "Trending" -> c.getString(R.string.trending) - "Top 50" -> c.getString(R.string.top_50) - "New & hot" -> c.getString(R.string.new_and_hot) - "Local" -> c.getString(R.string.local) - "Recently added" -> c.getString(R.string.recently_added) - "Most liked" -> c.getString(R.string.most_liked) - "conferences" -> c.getString(R.string.conferences) - "recent" -> c.getString(R.string.recent) - "live" -> c.getString(R.string.duration_live) - "Featured" -> c.getString(R.string.featured) - "Radio" -> c.getString(R.string.radio) - "trending_gaming" -> c.getString(R.string.trending_gaming) - "trending_music" -> c.getString(R.string.trending_music) - "trending_movies_and_shows" -> c.getString(R.string.trending_movies) - "trending_podcasts_episodes" -> c.getString(R.string.trending_podcasts) + "Trending" -> context.getString(R.string.trending) + "Top 50" -> context.getString(R.string.top_50) + "New & hot" -> context.getString(R.string.new_and_hot) + "Local" -> context.getString(R.string.local) + "Recently added" -> context.getString(R.string.recently_added) + "Most liked" -> context.getString(R.string.most_liked) + "conferences" -> context.getString(R.string.conferences) + "recent" -> context.getString(R.string.recent) + "live" -> context.getString(R.string.duration_live) + "Featured" -> context.getString(R.string.featured) + "Radio" -> context.getString(R.string.radio) + "trending_gaming" -> context.getString(R.string.trending_gaming) + "trending_music" -> context.getString(R.string.trending_music) + "trending_movies_and_shows" -> context.getString(R.string.trending_movies) + "trending_podcasts_episodes" -> context.getString(R.string.trending_podcasts) else -> kioskId } } From b4f526c2a5f5cceeea001d1eea653d9aeb3af7c0 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 1 Jan 2026 16:51:56 +0800 Subject: [PATCH 085/190] workflows: Update actions versions Signed-off-by: Aayush Gupta --- .github/workflows/build-release-apk.yml | 6 +++--- .github/workflows/ci.yml | 20 ++++++++++---------- .github/workflows/image-minimizer.yml | 6 +++--- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build-release-apk.yml b/.github/workflows/build-release-apk.yml index 0fad8e169..b558d90dd 100644 --- a/.github/workflows/build-release-apk.yml +++ b/.github/workflows/build-release-apk.yml @@ -7,11 +7,11 @@ jobs: release: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: ref: 'master' - - uses: actions/setup-java@v4 + - uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: '21' @@ -32,7 +32,7 @@ jobs: mv app/build/outputs/apk/release/*.apk "app/build/outputs/apk/release/NewPipe_v$VERSION_NAME.apk" - name: "Upload APK" - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: app path: app/build/outputs/apk/release/*.apk diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a184dd83d..d42c5a0b4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,8 +37,8 @@ jobs: contents: read steps: - - uses: actions/checkout@v4 - - uses: gradle/wrapper-validation-action@v2 + - uses: actions/checkout@v6 + - uses: gradle/actions/wrapper-validation@v4 - name: create and checkout branch # push events already checked out the branch @@ -48,7 +48,7 @@ jobs: run: git checkout -B "$BRANCH" - name: set up JDK - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: 21 distribution: "temurin" @@ -58,7 +58,7 @@ jobs: run: ./gradlew assembleDebug lintDebug testDebugUnitTest --stacktrace -DskipFormatKtlint - name: Upload APK - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: app path: app/build/outputs/apk/debug/*.apk @@ -80,7 +80,7 @@ jobs: contents: read steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Enable KVM run: | @@ -89,7 +89,7 @@ jobs: sudo udevadm trigger --name-match=kvm - name: set up JDK - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: 21 distribution: "temurin" @@ -104,7 +104,7 @@ jobs: script: ./gradlew connectedCheck --stacktrace - name: Upload test report when tests fail # because the printed out stacktrace (console) is too short, see also #7553 - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 if: failure() with: name: android-test-report-api${{ matrix.api-level }} @@ -118,19 +118,19 @@ jobs: contents: read steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Set up JDK - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: 21 distribution: "temurin" cache: 'gradle' - name: Cache SonarCloud packages - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.sonar/cache key: ${{ runner.os }}-sonar diff --git a/.github/workflows/image-minimizer.yml b/.github/workflows/image-minimizer.yml index d9241c33b..264a0ac6c 100644 --- a/.github/workflows/image-minimizer.yml +++ b/.github/workflows/image-minimizer.yml @@ -17,9 +17,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: 16 @@ -27,7 +27,7 @@ jobs: run: npm i probe-image-size@7.2.3 --ignore-scripts - name: Minimize simple images - uses: actions/github-script@v7 + uses: actions/github-script@v8 timeout-minutes: 3 with: script: | From 74cf302bd6c2f706a257be9ef5764c8057d39cf2 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Wed, 31 Dec 2025 08:37:11 +0200 Subject: [PATCH 086/190] Convert newpipe/local/playlist/RemotePlaylistManager to kotlin --- .../local/playlist/RemotePlaylistManager.java | 69 ------------------- .../local/playlist/RemotePlaylistManager.kt | 61 ++++++++++++++++ 2 files changed, 61 insertions(+), 69 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java create mode 100644 app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.kt diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java deleted file mode 100644 index 08b203a7e..000000000 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.schabi.newpipe.local.playlist; - -import org.schabi.newpipe.database.AppDatabase; -import org.schabi.newpipe.database.playlist.dao.PlaylistRemoteDAO; -import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; -import org.schabi.newpipe.extractor.playlist.PlaylistInfo; - -import java.util.List; - -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.Flowable; -import io.reactivex.rxjava3.core.Single; -import io.reactivex.rxjava3.schedulers.Schedulers; - -public class RemotePlaylistManager { - - private final AppDatabase database; - private final PlaylistRemoteDAO playlistRemoteTable; - - public RemotePlaylistManager(final AppDatabase db) { - database = db; - playlistRemoteTable = db.playlistRemoteDAO(); - } - - public Flowable> getPlaylists() { - return playlistRemoteTable.getPlaylists().subscribeOn(Schedulers.io()); - } - - public Flowable getPlaylist(final long playlistId) { - return playlistRemoteTable.getPlaylist(playlistId).subscribeOn(Schedulers.io()); - } - - public Flowable> getPlaylist(final PlaylistInfo info) { - return playlistRemoteTable.getPlaylist(info.getServiceId(), info.getUrl()) - .subscribeOn(Schedulers.io()); - } - - public Single deletePlaylist(final long playlistId) { - return Single.fromCallable(() -> playlistRemoteTable.deletePlaylist(playlistId)) - .subscribeOn(Schedulers.io()); - } - - public Completable updatePlaylists(final List updateItems, - final List deletedItems) { - return Completable.fromRunnable(() -> database.runInTransaction(() -> { - for (final Long uid: deletedItems) { - playlistRemoteTable.deletePlaylist(uid); - } - for (final PlaylistRemoteEntity item: updateItems) { - playlistRemoteTable.upsert(item); - } - })).subscribeOn(Schedulers.io()); - } - - public Single onBookmark(final PlaylistInfo playlistInfo) { - return Single.fromCallable(() -> { - final PlaylistRemoteEntity playlist = new PlaylistRemoteEntity(playlistInfo); - return playlistRemoteTable.upsert(playlist); - }).subscribeOn(Schedulers.io()); - } - - public Single onUpdate(final long playlistId, final PlaylistInfo playlistInfo) { - return Single.fromCallable(() -> { - final PlaylistRemoteEntity playlist = new PlaylistRemoteEntity(playlistInfo); - playlist.setUid(playlistId); - return playlistRemoteTable.update(playlist); - }).subscribeOn(Schedulers.io()); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.kt b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.kt new file mode 100644 index 000000000..6961b6bb4 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.kt @@ -0,0 +1,61 @@ +/* + * SPDX-FileCopyrightText: 2018-2025 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.local.playlist + +import io.reactivex.rxjava3.core.Completable +import io.reactivex.rxjava3.core.Flowable +import io.reactivex.rxjava3.core.Single +import io.reactivex.rxjava3.schedulers.Schedulers +import org.schabi.newpipe.database.AppDatabase +import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity +import org.schabi.newpipe.extractor.playlist.PlaylistInfo + +class RemotePlaylistManager(private val database: AppDatabase) { + private val playlistRemoteTable = database.playlistRemoteDAO() + + val playlists: Flowable> + get() = playlistRemoteTable.playlists.subscribeOn(Schedulers.io()) + + fun getPlaylist(playlistId: Long): Flowable { + return playlistRemoteTable.getPlaylist(playlistId).subscribeOn(Schedulers.io()) + } + + fun getPlaylist(info: PlaylistInfo): Flowable> { + return playlistRemoteTable.getPlaylist(info.serviceId.toLong(), info.url) + .subscribeOn(Schedulers.io()) + } + + fun deletePlaylist(playlistId: Long): Single { + return Single.fromCallable { playlistRemoteTable.deletePlaylist(playlistId) } + .subscribeOn(Schedulers.io()) + } + + fun updatePlaylists( + updateItems: List, + deletedItems: List + ): Completable { + return Completable.fromRunnable { + database.runInTransaction { + deletedItems.forEach { playlistRemoteTable.deletePlaylist(it) } + updateItems.forEach { playlistRemoteTable.upsert(it) } + } + }.subscribeOn(Schedulers.io()) + } + + fun onBookmark(playlistInfo: PlaylistInfo): Single { + return Single.fromCallable { + val playlist = PlaylistRemoteEntity(playlistInfo) + playlistRemoteTable.upsert(playlist) + }.subscribeOn(Schedulers.io()) + } + + fun onUpdate(playlistId: Long, playlistInfo: PlaylistInfo): Single { + return Single.fromCallable { + val playlist = PlaylistRemoteEntity(playlistInfo).apply { uid = playlistId } + playlistRemoteTable.update(playlist) + }.subscribeOn(Schedulers.io()) + } +} From 3398b4cdc939bcab92459452d4b0a67b1d819182 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Mon, 29 Dec 2025 11:59:31 +0200 Subject: [PATCH 087/190] Convert newpipe/fragments/list/search/Suggestion{Item,ListAdapter} to kotlin --- .../fragments/list/search/SuggestionItem.java | 32 ------- .../fragments/list/search/SuggestionItem.kt | 19 ++++ .../list/search/SuggestionListAdapter.java | 94 ------------------- .../list/search/SuggestionListAdapter.kt | 74 +++++++++++++++ 4 files changed, 93 insertions(+), 126 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionItem.java create mode 100644 app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionItem.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java create mode 100644 app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.kt diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionItem.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionItem.java deleted file mode 100644 index 83f68dbb5..000000000 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionItem.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.schabi.newpipe.fragments.list.search; - -import androidx.annotation.NonNull; - -public class SuggestionItem { - final boolean fromHistory; - public final String query; - - public SuggestionItem(final boolean fromHistory, final String query) { - this.fromHistory = fromHistory; - this.query = query; - } - - @Override - public boolean equals(final Object o) { - if (o instanceof SuggestionItem) { - return query.equals(((SuggestionItem) o).query); - } - return false; - } - - @Override - public int hashCode() { - return query.hashCode(); - } - - @NonNull - @Override - public String toString() { - return "[" + fromHistory + "→" + query + "]"; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionItem.kt b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionItem.kt new file mode 100644 index 000000000..1317f9acb --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionItem.kt @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.fragments.list.search + +class SuggestionItem(@JvmField val fromHistory: Boolean, @JvmField val query: String) { + override fun equals(other: Any?): Boolean { + if (other is SuggestionItem) { + return query == other.query + } + return false + } + + override fun hashCode() = query.hashCode() + + override fun toString() = "[$fromHistory→$query]" +} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java deleted file mode 100644 index 6a330be0f..000000000 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.schabi.newpipe.fragments.list.search; - -import android.view.LayoutInflater; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.DiffUtil; -import androidx.recyclerview.widget.ListAdapter; -import androidx.recyclerview.widget.RecyclerView; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.databinding.ItemSearchSuggestionBinding; - -public class SuggestionListAdapter - extends ListAdapter { - private OnSuggestionItemSelected listener; - - public SuggestionListAdapter() { - super(new SuggestionItemCallback()); - } - - public void setListener(final OnSuggestionItemSelected listener) { - this.listener = listener; - } - - @NonNull - @Override - public SuggestionItemHolder onCreateViewHolder(@NonNull final ViewGroup parent, - final int viewType) { - return new SuggestionItemHolder(ItemSearchSuggestionBinding - .inflate(LayoutInflater.from(parent.getContext()), parent, false)); - } - - @Override - public void onBindViewHolder(final SuggestionItemHolder holder, final int position) { - final SuggestionItem currentItem = getItem(position); - holder.updateFrom(currentItem); - holder.itemBinding.suggestionSearch.setOnClickListener(v -> { - if (listener != null) { - listener.onSuggestionItemSelected(currentItem); - } - }); - holder.itemBinding.suggestionSearch.setOnLongClickListener(v -> { - if (listener != null) { - listener.onSuggestionItemLongClick(currentItem); - } - return true; - }); - holder.itemBinding.suggestionInsert.setOnClickListener(v -> { - if (listener != null) { - listener.onSuggestionItemInserted(currentItem); - } - }); - } - - public interface OnSuggestionItemSelected { - void onSuggestionItemSelected(SuggestionItem item); - - void onSuggestionItemInserted(SuggestionItem item); - - void onSuggestionItemLongClick(SuggestionItem item); - } - - public static final class SuggestionItemHolder extends RecyclerView.ViewHolder { - private final ItemSearchSuggestionBinding itemBinding; - - private SuggestionItemHolder(final ItemSearchSuggestionBinding binding) { - super(binding.getRoot()); - this.itemBinding = binding; - } - - private void updateFrom(final SuggestionItem item) { - itemBinding.itemSuggestionIcon.setImageResource(item.fromHistory ? R.drawable.ic_history - : R.drawable.ic_search); - itemBinding.itemSuggestionQuery.setText(item.query); - } - } - - private static final class SuggestionItemCallback - extends DiffUtil.ItemCallback { - @Override - public boolean areItemsTheSame(@NonNull final SuggestionItem oldItem, - @NonNull final SuggestionItem newItem) { - return oldItem.fromHistory == newItem.fromHistory - && oldItem.query.equals(newItem.query); - } - - @Override - public boolean areContentsTheSame(@NonNull final SuggestionItem oldItem, - @NonNull final SuggestionItem newItem) { - return true; // items' contents never change; the list of items themselves does - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.kt b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.kt new file mode 100644 index 000000000..4eb4c1574 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.kt @@ -0,0 +1,74 @@ +/* + * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.fragments.list.search + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import org.schabi.newpipe.R +import org.schabi.newpipe.databinding.ItemSearchSuggestionBinding +import org.schabi.newpipe.fragments.list.search.SuggestionListAdapter.SuggestionItemHolder + +class SuggestionListAdapter : + ListAdapter(SuggestionItemCallback()) { + + var listener: OnSuggestionItemSelected? = null + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SuggestionItemHolder { + return SuggestionItemHolder( + ItemSearchSuggestionBinding.inflate(LayoutInflater.from(parent.context), parent, false) + ) + } + + override fun onBindViewHolder(holder: SuggestionItemHolder, position: Int) { + val currentItem = getItem(position) + holder.updateFrom(currentItem) + holder.binding.suggestionSearch.setOnClickListener { + listener?.onSuggestionItemSelected(currentItem) + } + holder.binding.suggestionSearch.setOnLongClickListener { + listener?.onSuggestionItemLongClick(currentItem) + true + } + holder.binding.suggestionInsert.setOnClickListener { + listener?.onSuggestionItemInserted(currentItem) + } + } + + interface OnSuggestionItemSelected { + fun onSuggestionItemSelected(item: SuggestionItem) + + fun onSuggestionItemInserted(item: SuggestionItem) + + fun onSuggestionItemLongClick(item: SuggestionItem) + } + + class SuggestionItemHolder(val binding: ItemSearchSuggestionBinding) : + RecyclerView.ViewHolder(binding.getRoot()) { + fun updateFrom(item: SuggestionItem) { + binding.itemSuggestionIcon.setImageResource( + if (item.fromHistory) { + R.drawable.ic_history + } else { + R.drawable.ic_search + } + ) + binding.itemSuggestionQuery.text = item.query + } + } + + private class SuggestionItemCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: SuggestionItem, newItem: SuggestionItem): Boolean { + return oldItem.fromHistory == newItem.fromHistory && oldItem.query == newItem.query + } + + override fun areContentsTheSame(oldItem: SuggestionItem, newItem: SuggestionItem): Boolean { + return true // items' contents never change; the list of items themselves does + } + } +} From fef8a2455c2350c794b219d3a36b820d1d27baf7 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Sun, 28 Dec 2025 21:44:19 +0200 Subject: [PATCH 088/190] Convert newpipe/util/image/ImageStrategy to kotlin --- .../newpipe/util/image/ImageStrategy.java | 195 ------------------ .../newpipe/util/image/ImageStrategy.kt | 191 +++++++++++++++++ 2 files changed, 191 insertions(+), 195 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.java create mode 100644 app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt diff --git a/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.java b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.java deleted file mode 100644 index da97179b6..000000000 --- a/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.java +++ /dev/null @@ -1,195 +0,0 @@ -package org.schabi.newpipe.util.image; - -import static org.schabi.newpipe.extractor.Image.HEIGHT_UNKNOWN; -import static org.schabi.newpipe.extractor.Image.WIDTH_UNKNOWN; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.schabi.newpipe.extractor.Image; - -import java.util.Comparator; -import java.util.List; - -public final class ImageStrategy { - - // when preferredImageQuality is LOW or MEDIUM, images are sorted by how close their preferred - // image quality is to these values (H stands for "Height") - private static final int BEST_LOW_H = 75; - private static final int BEST_MEDIUM_H = 250; - - private static PreferredImageQuality preferredImageQuality = PreferredImageQuality.MEDIUM; - - private ImageStrategy() { - } - - public static void setPreferredImageQuality(final PreferredImageQuality preferredImageQuality) { - ImageStrategy.preferredImageQuality = preferredImageQuality; - } - - public static boolean shouldLoadImages() { - return preferredImageQuality != PreferredImageQuality.NONE; - } - - - static double estimatePixelCount(final Image image, final double widthOverHeight) { - if (image.getHeight() == HEIGHT_UNKNOWN) { - if (image.getWidth() == WIDTH_UNKNOWN) { - // images whose size is completely unknown will be in their own subgroups, so - // any one of them will do, hence returning the same value for all of them - return 0; - } else { - return image.getWidth() * image.getWidth() / widthOverHeight; - } - } else if (image.getWidth() == WIDTH_UNKNOWN) { - return image.getHeight() * image.getHeight() * widthOverHeight; - } else { - return image.getHeight() * image.getWidth(); - } - } - - /** - * {@link #choosePreferredImage(List)} contains the description for this function's logic. - * - * @param images the images from which to choose - * @param nonNoneQuality the preferred quality (must NOT be {@link PreferredImageQuality#NONE}) - * @return the chosen preferred image, or {@link null} if the list is empty - * @see #choosePreferredImage(List) - */ - @Nullable - static String choosePreferredImage(@NonNull final List images, - final PreferredImageQuality nonNoneQuality) { - // this will be used to estimate the pixel count for images where only one of height or - // width are known - final double widthOverHeight = images.stream() - .filter(image -> image.getHeight() != HEIGHT_UNKNOWN - && image.getWidth() != WIDTH_UNKNOWN) - .mapToDouble(image -> ((double) image.getWidth()) / image.getHeight()) - .findFirst() - .orElse(1.0); - - final Image.ResolutionLevel preferredLevel = nonNoneQuality.toResolutionLevel(); - final Comparator initialComparator = Comparator - // the first step splits the images into groups of resolution levels - .comparingInt(i -> { - if (i.getEstimatedResolutionLevel() == Image.ResolutionLevel.UNKNOWN) { - return 3; // avoid unknowns as much as possible - } else if (i.getEstimatedResolutionLevel() == preferredLevel) { - return 0; // prefer a matching resolution level - } else if (i.getEstimatedResolutionLevel() == Image.ResolutionLevel.MEDIUM) { - return 1; // the preferredLevel is only 1 "step" away (either HIGH or LOW) - } else { - return 2; // the preferredLevel is the furthest away possible (2 "steps") - } - }) - // then each level's group is further split into two subgroups, one with known image - // size (which is also the preferred subgroup) and the other without - .thenComparing(image -> - image.getHeight() == HEIGHT_UNKNOWN && image.getWidth() == WIDTH_UNKNOWN); - - // The third step chooses, within each subgroup with known image size, the best image based - // on how close its size is to BEST_LOW_H or BEST_MEDIUM_H (with proper units). Subgroups - // without known image size will be left untouched since estimatePixelCount always returns - // the same number for those. - final Comparator finalComparator = switch (nonNoneQuality) { - case NONE -> initialComparator; // unreachable - case LOW -> initialComparator.thenComparingDouble(image -> { - final double pixelCount = estimatePixelCount(image, widthOverHeight); - return Math.abs(pixelCount - BEST_LOW_H * BEST_LOW_H * widthOverHeight); - }); - case MEDIUM -> initialComparator.thenComparingDouble(image -> { - final double pixelCount = estimatePixelCount(image, widthOverHeight); - return Math.abs(pixelCount - BEST_MEDIUM_H * BEST_MEDIUM_H * widthOverHeight); - }); - case HIGH -> initialComparator.thenComparingDouble( - // this is reversed with a - so that the highest resolution is chosen - i -> -estimatePixelCount(i, widthOverHeight)); - }; - - return images.stream() - // using "min" basically means "take the first group, then take the first subgroup, - // then choose the best image, while ignoring all other groups and subgroups" - .min(finalComparator) - .map(Image::getUrl) - .orElse(null); - } - - /** - * Chooses an image amongst the provided list based on the user preference previously set with - * {@link #setPreferredImageQuality(PreferredImageQuality)}. {@code null} will be returned in - * case the list is empty or the user preference is to not show images. - *
    - * These properties will be preferred, from most to least important: - *
      - *
    1. The image's {@link Image#getEstimatedResolutionLevel()} is not unknown and is close - * to {@link #preferredImageQuality}
    2. - *
    3. At least one of the image's width or height are known
    4. - *
    5. The highest resolution image is finally chosen if the user's preference is {@link - * PreferredImageQuality#HIGH}, otherwise the chosen image is the one that has the height - * closest to {@link #BEST_LOW_H} or {@link #BEST_MEDIUM_H}
    6. - *
    - *
    - * Use {@link #imageListToDbUrl(List)} if the URL is going to be saved to the database, to avoid - * saving nothing in case at the moment of saving the user preference is to not show images. - * - * @param images the images from which to choose - * @return the chosen preferred image, or {@link null} if the list is empty or the user disabled - * images - * @see #imageListToDbUrl(List) - */ - @Nullable - public static String choosePreferredImage(@NonNull final List images) { - if (preferredImageQuality == PreferredImageQuality.NONE) { - return null; // do not load images - } - - return choosePreferredImage(images, preferredImageQuality); - } - - /** - * Like {@link #choosePreferredImage(List)}, except that if {@link #preferredImageQuality} is - * {@link PreferredImageQuality#NONE} an image will be chosen anyway (with preferred quality - * {@link PreferredImageQuality#MEDIUM}. - *
    - * To go back to a list of images (obviously with just the one chosen image) from a URL saved in - * the database use {@link #dbUrlToImageList(String)}. - * - * @param images the images from which to choose - * @return the chosen preferred image, or {@link null} if the list is empty - * @see #choosePreferredImage(List) - * @see #dbUrlToImageList(String) - */ - @Nullable - public static String imageListToDbUrl(@NonNull final List images) { - final PreferredImageQuality quality; - if (preferredImageQuality == PreferredImageQuality.NONE) { - quality = PreferredImageQuality.MEDIUM; - } else { - quality = preferredImageQuality; - } - - return choosePreferredImage(images, quality); - } - - /** - * Wraps the URL (coming from the database) in a {@code List} so that it is usable - * seamlessly in all of the places where the extractor would return a list of images, including - * allowing to build info objects based on database objects. - *
    - * To obtain a url to save to the database from a list of images use {@link - * #imageListToDbUrl(List)}. - * - * @param url the URL to wrap coming from the database, or {@code null} to get an empty list - * @return a list containing just one {@link Image} wrapping the provided URL, with unknown - * image size fields, or an empty list if the URL is {@code null} - * @see #imageListToDbUrl(List) - */ - @NonNull - public static List dbUrlToImageList(@Nullable final String url) { - if (url == null) { - return List.of(); - } else { - return List.of(new Image(url, -1, -1, Image.ResolutionLevel.UNKNOWN)); - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt new file mode 100644 index 000000000..aa59b4d0a --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt @@ -0,0 +1,191 @@ +/* + * SPDX-FileCopyrightText: 2023-2025 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.util.image + +import org.schabi.newpipe.extractor.Image +import org.schabi.newpipe.extractor.Image.ResolutionLevel +import kotlin.math.abs + +object ImageStrategy { + // when preferredImageQuality is LOW or MEDIUM, images are sorted by how close their preferred + // image quality is to these values (H stands for "Height") + private const val BEST_LOW_H = 75 + private const val BEST_MEDIUM_H = 250 + + private var preferredImageQuality = PreferredImageQuality.MEDIUM + + @JvmStatic + fun setPreferredImageQuality(preferredImageQuality: PreferredImageQuality) { + ImageStrategy.preferredImageQuality = preferredImageQuality + } + + @JvmStatic + fun shouldLoadImages(): Boolean { + return preferredImageQuality != PreferredImageQuality.NONE + } + + @JvmStatic + fun estimatePixelCount(image: Image, widthOverHeight: Double): Double { + if (image.height == Image.HEIGHT_UNKNOWN) { + if (image.width == Image.WIDTH_UNKNOWN) { + // images whose size is completely unknown will be in their own subgroups, so + // any one of them will do, hence returning the same value for all of them + return 0.0 + } else { + return image.width * image.width / widthOverHeight + } + } else if (image.width == Image.WIDTH_UNKNOWN) { + return image.height * image.height * widthOverHeight + } else { + return (image.height * image.width).toDouble() + } + } + + /** + * [choosePreferredImage] contains the description for this function's logic. + * + * @param images the images from which to choose + * @param nonNoneQuality the preferred quality (must NOT be [PreferredImageQuality.NONE]) + * @return the chosen preferred image, or `null` if the list is empty + * @see [choosePreferredImage] + */ + @JvmStatic + fun choosePreferredImage(images: List, nonNoneQuality: PreferredImageQuality): String? { + // this will be used to estimate the pixel count for images where only one of height or + // width are known + val widthOverHeight = images + .filter { image -> + image.height != Image.HEIGHT_UNKNOWN && image.width != Image.WIDTH_UNKNOWN + } + .map { image -> (image.width.toDouble()) / image.height } + .elementAtOrNull(0) ?: 1.0 + + val preferredLevel = nonNoneQuality.toResolutionLevel() + // TODO: rewrite using kotlin collections API `groupBy` will be handy + val initialComparator = + Comparator // the first step splits the images into groups of resolution levels + .comparingInt { i: Image -> + return@comparingInt when (i.estimatedResolutionLevel) { + // avoid unknowns as much as possible + ResolutionLevel.UNKNOWN -> 3 + + // prefer a matching resolution level + preferredLevel -> 0 + + // the preferredLevel is only 1 "step" away (either HIGH or LOW) + ResolutionLevel.MEDIUM -> 1 + + // the preferredLevel is the furthest away possible (2 "steps") + else -> 2 + } + } + // then each level's group is further split into two subgroups, one with known image + // size (which is also the preferred subgroup) and the other without + .thenComparing { image -> image.height == Image.HEIGHT_UNKNOWN && image.width == Image.WIDTH_UNKNOWN } + + // The third step chooses, within each subgroup with known image size, the best image based + // on how close its size is to BEST_LOW_H or BEST_MEDIUM_H (with proper units). Subgroups + // without known image size will be left untouched since estimatePixelCount always returns + // the same number for those. + val finalComparator = when (nonNoneQuality) { + PreferredImageQuality.NONE -> initialComparator + PreferredImageQuality.LOW -> initialComparator.thenComparingDouble { image -> + val pixelCount = estimatePixelCount(image, widthOverHeight) + abs(pixelCount - BEST_LOW_H * BEST_LOW_H * widthOverHeight) + } + + PreferredImageQuality.MEDIUM -> initialComparator.thenComparingDouble { image -> + val pixelCount = estimatePixelCount(image, widthOverHeight) + abs(pixelCount - BEST_MEDIUM_H * BEST_MEDIUM_H * widthOverHeight) + } + + PreferredImageQuality.HIGH -> initialComparator.thenComparingDouble { image -> + // this is reversed with a - so that the highest resolution is chosen + -estimatePixelCount(image, widthOverHeight) + } + } + + return images.stream() // using "min" basically means "take the first group, then take the first subgroup, + // then choose the best image, while ignoring all other groups and subgroups" + .min(finalComparator) + .map(Image::getUrl) + .orElse(null) + } + + /** + * Chooses an image amongst the provided list based on the user preference previously set with + * [setPreferredImageQuality]. `null` will be returned in + * case the list is empty or the user preference is to not show images. + *
    + * These properties will be preferred, from most to least important: + * + * 1. The image's [Image.estimatedResolutionLevel] is not unknown and is close to [preferredImageQuality] + * 2. At least one of the image's width or height are known + * 3. The highest resolution image is finally chosen if the user's preference is + * [PreferredImageQuality.HIGH], otherwise the chosen image is the one that has the height + * closest to [BEST_LOW_H] or [BEST_MEDIUM_H] + * + *
    + * Use [imageListToDbUrl] if the URL is going to be saved to the database, to avoid + * saving nothing in case at the moment of saving the user preference is to not show images. + * + * @param images the images from which to choose + * @return the chosen preferred image, or `null` if the list is empty or the user disabled + * images + * @see [imageListToDbUrl] + */ + @JvmStatic + fun choosePreferredImage(images: List): String? { + if (preferredImageQuality == PreferredImageQuality.NONE) { + return null // do not load images + } + + return choosePreferredImage(images, preferredImageQuality) + } + + /** + * Like [choosePreferredImage], except that if [preferredImageQuality] is + * [PreferredImageQuality.NONE] an image will be chosen anyway (with preferred quality + * [PreferredImageQuality.MEDIUM]. + *

    + * To go back to a list of images (obviously with just the one chosen image) from a URL saved in + * the database use [dbUrlToImageList]. + * + * @param images the images from which to choose + * @return the chosen preferred image, or `null` if the list is empty + * @see [choosePreferredImage] + * @see [dbUrlToImageList] + */ + @JvmStatic + fun imageListToDbUrl(images: List): String? { + val quality = when (preferredImageQuality) { + PreferredImageQuality.NONE -> PreferredImageQuality.MEDIUM + else -> preferredImageQuality + } + + return choosePreferredImage(images, quality) + } + + /** + * Wraps the URL (coming from the database) in a `List` so that it is usable + * seamlessly in all of the places where the extractor would return a list of images, including + * allowing to build info objects based on database objects. + *

    + * To obtain a url to save to the database from a list of images use [imageListToDbUrl]. + * + * @param url the URL to wrap coming from the database, or `null` to get an empty list + * @return a list containing just one [Image] wrapping the provided URL, with unknown + * image size fields, or an empty list if the URL is `null` + * @see [imageListToDbUrl] + */ + @JvmStatic + fun dbUrlToImageList(url: String?): List { + return when (url) { + null -> listOf() + else -> listOf(Image(url, -1, -1, ResolutionLevel.UNKNOWN)) + } + } +} From 4ef4ed15f1d63d8a8d883f485a5f9b164614e737 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Sun, 28 Dec 2025 19:16:51 +0200 Subject: [PATCH 089/190] Convert newpipe/util/image/PreferredImageQuality to kotlin --- .../util/image/PreferredImageQuality.java | 39 ------------------- .../util/image/PreferredImageQuality.kt | 38 ++++++++++++++++++ 2 files changed, 38 insertions(+), 39 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.java create mode 100644 app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.kt diff --git a/app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.java b/app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.java deleted file mode 100644 index 7106359b3..000000000 --- a/app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.schabi.newpipe.util.image; - -import android.content.Context; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.Image; - -public enum PreferredImageQuality { - NONE, - LOW, - MEDIUM, - HIGH; - - public static PreferredImageQuality fromPreferenceKey(final Context context, final String key) { - if (context.getString(R.string.image_quality_none_key).equals(key)) { - return NONE; - } else if (context.getString(R.string.image_quality_low_key).equals(key)) { - return LOW; - } else if (context.getString(R.string.image_quality_high_key).equals(key)) { - return HIGH; - } else { - return MEDIUM; // default to medium - } - } - - public Image.ResolutionLevel toResolutionLevel() { - switch (this) { - case LOW: - return Image.ResolutionLevel.LOW; - case MEDIUM: - return Image.ResolutionLevel.MEDIUM; - case HIGH: - return Image.ResolutionLevel.HIGH; - default: - case NONE: - return Image.ResolutionLevel.UNKNOWN; - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.kt b/app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.kt new file mode 100644 index 000000000..b90ba87aa --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.kt @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2023-2025 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.util.image + +import android.content.Context +import org.schabi.newpipe.R +import org.schabi.newpipe.extractor.Image.ResolutionLevel + +enum class PreferredImageQuality { + NONE, + LOW, + MEDIUM, + HIGH; + + fun toResolutionLevel(): ResolutionLevel { + return when (this) { + LOW -> ResolutionLevel.LOW + MEDIUM -> ResolutionLevel.MEDIUM + HIGH -> ResolutionLevel.HIGH + NONE -> ResolutionLevel.UNKNOWN + } + } + + companion object { + @JvmStatic + fun fromPreferenceKey(context: Context, key: String?): PreferredImageQuality { + return when (key) { + context.getString(R.string.image_quality_none_key) -> NONE + context.getString(R.string.image_quality_low_key) -> LOW + context.getString(R.string.image_quality_high_key) -> HIGH + else -> MEDIUM // default to medium + } + } + } +} From 873b2be9cae89fccefc031699cb2024e1ea5f75f Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Fri, 26 Dec 2025 18:32:30 +0200 Subject: [PATCH 090/190] Convert newpipe/util/text/TimestampLongPressClickableSpan.java to kotlin Also convert one class used by it into java record --- .../newpipe/util/text/TimestampExtractor.java | 26 +------ .../text/TimestampLongPressClickableSpan.java | 78 ------------------- .../text/TimestampLongPressClickableSpan.kt | 69 ++++++++++++++++ 3 files changed, 70 insertions(+), 103 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.java create mode 100644 app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.kt diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TimestampExtractor.java b/app/src/main/java/org/schabi/newpipe/util/text/TimestampExtractor.java index be603f41a..b1357b943 100644 --- a/app/src/main/java/org/schabi/newpipe/util/text/TimestampExtractor.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/TimestampExtractor.java @@ -54,30 +54,6 @@ public final class TimestampExtractor { return new TimestampMatchDTO(timestampStart, timestampEnd, seconds); } - public static class TimestampMatchDTO { - private final int timestampStart; - private final int timestampEnd; - private final int seconds; - - public TimestampMatchDTO( - final int timestampStart, - final int timestampEnd, - final int seconds) { - this.timestampStart = timestampStart; - this.timestampEnd = timestampEnd; - this.seconds = seconds; - } - - public int timestampStart() { - return timestampStart; - } - - public int timestampEnd() { - return timestampEnd; - } - - public int seconds() { - return seconds; - } + public record TimestampMatchDTO(int timestampStart, int timestampEnd, int seconds) { } } diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.java deleted file mode 100644 index 35a9fd996..000000000 --- a/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.schabi.newpipe.util.text; - -import static org.schabi.newpipe.util.text.InternalUrlsHandler.playOnPopup; - -import android.content.Context; -import android.view.View; - -import androidx.annotation.NonNull; - -import org.schabi.newpipe.extractor.ServiceList; -import org.schabi.newpipe.extractor.StreamingService; -import org.schabi.newpipe.util.external_communication.ShareUtils; - -import io.reactivex.rxjava3.disposables.CompositeDisposable; - -final class TimestampLongPressClickableSpan extends LongPressClickableSpan { - - @NonNull - private final Context context; - @NonNull - private final String descriptionText; - @NonNull - private final CompositeDisposable disposables; - @NonNull - private final StreamingService relatedInfoService; - @NonNull - private final String relatedStreamUrl; - @NonNull - private final TimestampExtractor.TimestampMatchDTO timestampMatchDTO; - - TimestampLongPressClickableSpan( - @NonNull final Context context, - @NonNull final String descriptionText, - @NonNull final CompositeDisposable disposables, - @NonNull final StreamingService relatedInfoService, - @NonNull final String relatedStreamUrl, - @NonNull final TimestampExtractor.TimestampMatchDTO timestampMatchDTO) { - this.context = context; - this.descriptionText = descriptionText; - this.disposables = disposables; - this.relatedInfoService = relatedInfoService; - this.relatedStreamUrl = relatedStreamUrl; - this.timestampMatchDTO = timestampMatchDTO; - } - - @Override - public void onClick(@NonNull final View view) { - playOnPopup(context, relatedStreamUrl, relatedInfoService, - timestampMatchDTO.seconds()); - } - - @Override - public void onLongClick(@NonNull final View view) { - ShareUtils.copyToClipboard(context, getTimestampTextToCopy( - relatedInfoService, relatedStreamUrl, descriptionText, timestampMatchDTO)); - } - - @NonNull - private static String getTimestampTextToCopy( - @NonNull final StreamingService relatedInfoService, - @NonNull final String relatedStreamUrl, - @NonNull final String descriptionText, - @NonNull final TimestampExtractor.TimestampMatchDTO timestampMatchDTO) { - // TODO: use extractor methods to get timestamps when this feature will be implemented in it - if (relatedInfoService == ServiceList.YouTube) { - return relatedStreamUrl + "&t=" + timestampMatchDTO.seconds(); - } else if (relatedInfoService == ServiceList.SoundCloud - || relatedInfoService == ServiceList.MediaCCC) { - return relatedStreamUrl + "#t=" + timestampMatchDTO.seconds(); - } else if (relatedInfoService == ServiceList.PeerTube) { - return relatedStreamUrl + "?start=" + timestampMatchDTO.seconds(); - } - - // Return timestamp text for other services - return descriptionText.subSequence(timestampMatchDTO.timestampStart(), - timestampMatchDTO.timestampEnd()).toString(); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.kt b/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.kt new file mode 100644 index 000000000..a76c5c31a --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.kt @@ -0,0 +1,69 @@ +/* + * SPDX-FileCopyrightText: 2023-2025 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.util.text + +import android.content.Context +import android.view.View +import io.reactivex.rxjava3.disposables.CompositeDisposable +import org.schabi.newpipe.extractor.ServiceList +import org.schabi.newpipe.extractor.StreamingService +import org.schabi.newpipe.util.external_communication.ShareUtils +import org.schabi.newpipe.util.text.TimestampExtractor.TimestampMatchDTO + +class TimestampLongPressClickableSpan( + private val context: Context, + private val descriptionText: String, + private val disposables: CompositeDisposable, + private val relatedInfoService: StreamingService, + private val relatedStreamUrl: String, + private val timestampMatchDTO: TimestampMatchDTO +) : LongPressClickableSpan() { + override fun onClick(view: View) { + InternalUrlsHandler.playOnPopup( + context, + relatedStreamUrl, + relatedInfoService, + timestampMatchDTO.seconds() + ) + } + + override fun onLongClick(view: View) { + ShareUtils.copyToClipboard( + context, + getTimestampTextToCopy( + relatedInfoService, + relatedStreamUrl, + descriptionText, + timestampMatchDTO + ) + ) + } + + companion object { + private fun getTimestampTextToCopy( + relatedInfoService: StreamingService, + relatedStreamUrl: String, + descriptionText: String, + timestampMatchDTO: TimestampMatchDTO + ): String { + // TODO: use extractor methods to get timestamps when this feature will be implemented in it + when (relatedInfoService) { + ServiceList.YouTube -> + return relatedStreamUrl + "&t=" + timestampMatchDTO.seconds() + ServiceList.SoundCloud, ServiceList.MediaCCC -> + return relatedStreamUrl + "#t=" + timestampMatchDTO.seconds() + ServiceList.PeerTube -> + return relatedStreamUrl + "?start=" + timestampMatchDTO.seconds() + } + + // Return timestamp text for other services + return descriptionText.substring( + timestampMatchDTO.timestampStart(), + timestampMatchDTO.timestampEnd() + ) + } + } +} From 84c646713d232a6b787ebc4d19fdfe7afa05ddbb Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Fri, 26 Dec 2025 16:20:26 +0200 Subject: [PATCH 091/190] Convert newpipe/settings/preferencesearch/PreferenceSearchItem.java to kotlin --- .../PreferenceSearchItem.java | 102 ------------------ .../preferencesearch/PreferenceSearchItem.kt | 40 +++++++ 2 files changed, 40 insertions(+), 102 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.java create mode 100644 app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.kt diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.java deleted file mode 100644 index 33856326c..000000000 --- a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.schabi.newpipe.settings.preferencesearch; - -import androidx.annotation.NonNull; -import androidx.annotation.XmlRes; - -import java.util.List; -import java.util.Objects; - -/** - * Represents a preference-item inside the search. - */ -public class PreferenceSearchItem { - /** - * Key of the setting/preference. E.g. used inside {@link android.content.SharedPreferences}. - */ - @NonNull - private final String key; - /** - * Title of the setting, e.g. 'Default resolution' or 'Show higher resolutions'. - */ - @NonNull - private final String title; - /** - * Summary of the setting, e.g. '480p' or 'Only some devices can play 2k/4k'. - */ - @NonNull - private final String summary; - /** - * Possible entries of the setting, e.g. 480p,720p,... - */ - @NonNull - private final String entries; - /** - * Breadcrumbs - a hint where the setting is located e.g. 'Video and Audio > Player' - */ - @NonNull - private final String breadcrumbs; - /** - * The xml-resource where this item was found/built from. - */ - @XmlRes - private final int searchIndexItemResId; - - public PreferenceSearchItem( - @NonNull final String key, - @NonNull final String title, - @NonNull final String summary, - @NonNull final String entries, - @NonNull final String breadcrumbs, - @XmlRes final int searchIndexItemResId - ) { - this.key = Objects.requireNonNull(key); - this.title = Objects.requireNonNull(title); - this.summary = Objects.requireNonNull(summary); - this.entries = Objects.requireNonNull(entries); - this.breadcrumbs = Objects.requireNonNull(breadcrumbs); - this.searchIndexItemResId = searchIndexItemResId; - } - - @NonNull - public String getKey() { - return key; - } - - @NonNull - public String getTitle() { - return title; - } - - @NonNull - public String getSummary() { - return summary; - } - - @NonNull - public String getEntries() { - return entries; - } - - @NonNull - public String getBreadcrumbs() { - return breadcrumbs; - } - - public int getSearchIndexItemResId() { - return searchIndexItemResId; - } - - boolean hasData() { - return !key.isEmpty() && !title.isEmpty(); - } - - public List getAllRelevantSearchFields() { - return List.of(getTitle(), getSummary(), getEntries(), getBreadcrumbs()); - } - - @NonNull - @Override - public String toString() { - return "PreferenceItem: " + title + " " + summary + " " + key; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.kt b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.kt new file mode 100644 index 000000000..750e40eae --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.kt @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2022-2025 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.settings.preferencesearch + +import androidx.annotation.XmlRes + +/** + * Represents a preference-item inside the search. + * + * @param key Key of the setting/preference. E.g. used inside [android.content.SharedPreferences]. + * @param title Title of the setting, e.g. 'Default resolution' or 'Show higher resolutions'. + * @param summary Summary of the setting, e.g. '480p' or 'Only some devices can play 2k/4k'. + * @param entries Possible entries of the setting, e.g. 480p,720p,... + * @param breadcrumbs Breadcrumbs - a hint where the setting is located e.g. 'Video and Audio > Player' + * @param searchIndexItemResId The xml-resource where this item was found/built from. + */ + +data class PreferenceSearchItem( + val key: String, + val title: String, + val summary: String, + val entries: String, + val breadcrumbs: String, + @XmlRes val searchIndexItemResId: Int +) { + fun hasData(): Boolean { + return !key.isEmpty() && !title.isEmpty() + } + + fun getAllRelevantSearchFields(): MutableList { + return mutableListOf(title, summary, entries, breadcrumbs) + } + + override fun toString(): String { + return "PreferenceItem: $title $summary $key" + } +} From f1b111212de9a12d91a26dc055a38f9f8a7a9624 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Fri, 26 Dec 2025 01:57:15 +0200 Subject: [PATCH 092/190] Convert newpipe/util/FilenameUtils.java to kotlin Co-authored-by: Aayush Gupta --- .../schabi/newpipe/util/FilenameUtils.java | 70 ------------------- .../org/schabi/newpipe/util/FilenameUtils.kt | 64 +++++++++++++++++ 2 files changed, 64 insertions(+), 70 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/util/FilenameUtils.java create mode 100644 app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt diff --git a/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.java b/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.java deleted file mode 100644 index bc15f3f02..000000000 --- a/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.schabi.newpipe.util; - -import android.content.Context; -import android.content.SharedPreferences; - -import androidx.preference.PreferenceManager; - -import org.schabi.newpipe.R; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public final class FilenameUtils { - private static final String CHARSET_MOST_SPECIAL = "[\\n\\r|?*<\":\\\\>/']+"; - private static final String CHARSET_ONLY_LETTERS_AND_DIGITS = "[^\\w\\d]+"; - - private FilenameUtils() { } - - /** - * #143 #44 #42 #22: make sure that the filename does not contain illegal chars. - * - * @param context the context to retrieve strings and preferences from - * @param title the title to create a filename from - * @return the filename - */ - public static String createFilename(final Context context, final String title) { - final SharedPreferences sharedPreferences = PreferenceManager - .getDefaultSharedPreferences(context); - - final String charsetLd = context.getString(R.string.charset_letters_and_digits_value); - final String charsetMs = context.getString(R.string.charset_most_special_value); - final String defaultCharset = context.getString(R.string.default_file_charset_value); - - final String replacementChar = sharedPreferences.getString( - context.getString(R.string.settings_file_replacement_character_key), "_"); - String selectedCharset = sharedPreferences.getString( - context.getString(R.string.settings_file_charset_key), null); - - final String charset; - - if (selectedCharset == null || selectedCharset.isEmpty()) { - selectedCharset = defaultCharset; - } - - if (selectedCharset.equals(charsetLd)) { - charset = CHARSET_ONLY_LETTERS_AND_DIGITS; - } else if (selectedCharset.equals(charsetMs)) { - charset = CHARSET_MOST_SPECIAL; - } else { - charset = selectedCharset; // Is the user using a custom charset? - } - - final Pattern pattern = Pattern.compile(charset); - - return createFilename(title, pattern, Matcher.quoteReplacement(replacementChar)); - } - - /** - * Create a valid filename. - * - * @param title the title to create a filename from - * @param invalidCharacters patter matching invalid characters - * @param replacementChar the replacement - * @return the filename - */ - private static String createFilename(final String title, final Pattern invalidCharacters, - final String replacementChar) { - return title.replaceAll(invalidCharacters.pattern(), replacementChar); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt b/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt new file mode 100644 index 000000000..bfa50beef --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt @@ -0,0 +1,64 @@ +/* + * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.util + +import android.content.Context +import androidx.preference.PreferenceManager +import org.schabi.newpipe.R +import org.schabi.newpipe.ktx.getStringSafe +import java.util.regex.Matcher + +object FilenameUtils { + private const val CHARSET_MOST_SPECIAL = "[\\n\\r|?*<\":\\\\>/']+" + private const val CHARSET_ONLY_LETTERS_AND_DIGITS = "[^\\w\\d]+" + + /** + * #143 #44 #42 #22: make sure that the filename does not contain illegal chars. + * + * @param context the context to retrieve strings and preferences from + * @param title the title to create a filename from + * @return the filename + */ + @JvmStatic + fun createFilename(context: Context, title: String): String { + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + + val charsetLd = context.getString(R.string.charset_letters_and_digits_value) + val charsetMs = context.getString(R.string.charset_most_special_value) + val defaultCharset = context.getString(R.string.default_file_charset_value) + + val replacementChar = sharedPreferences.getStringSafe( + context.getString(R.string.settings_file_replacement_character_key), "_" + ) + val selectedCharset = sharedPreferences.getStringSafe( + context.getString(R.string.settings_file_charset_key), "" + ).ifEmpty { defaultCharset } + + val charset = when (selectedCharset) { + charsetLd -> CHARSET_ONLY_LETTERS_AND_DIGITS + charsetMs -> CHARSET_MOST_SPECIAL + else -> selectedCharset // Is the user using a custom charset? + } + + return createFilename(title, charset, Matcher.quoteReplacement(replacementChar)) + } + + /** + * Create a valid filename. + * + * @param title the title to create a filename from + * @param invalidCharacters patter matching invalid characters + * @param replacementChar the replacement + * @return the filename + */ + private fun createFilename( + title: String, + invalidCharacters: String, + replacementChar: String + ): String { + return title.replace(invalidCharacters.toRegex(), replacementChar) + } +} From cd4cb40e6d9eff816f2283e2a74e46495bcce87c Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Thu, 25 Dec 2025 17:36:54 +0200 Subject: [PATCH 093/190] Convert newpipe/error/UserAction.java to kotlin --- .../error/{UserAction.java => UserAction.kt} | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) rename app/src/main/java/org/schabi/newpipe/error/{UserAction.java => UserAction.kt} (86%) diff --git a/app/src/main/java/org/schabi/newpipe/error/UserAction.java b/app/src/main/java/org/schabi/newpipe/error/UserAction.kt similarity index 86% rename from app/src/main/java/org/schabi/newpipe/error/UserAction.java rename to app/src/main/java/org/schabi/newpipe/error/UserAction.kt index d3af9d32e..2d2358310 100644 --- a/app/src/main/java/org/schabi/newpipe/error/UserAction.java +++ b/app/src/main/java/org/schabi/newpipe/error/UserAction.kt @@ -1,9 +1,14 @@ -package org.schabi.newpipe.error; +/* + * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.error /** * The user actions that can cause an error. */ -public enum UserAction { +enum class UserAction(val message: String) { USER_REPORT("user report"), UI_ERROR("ui error"), DATABASE_IMPORT_EXPORT("database import or export"), @@ -36,14 +41,4 @@ public enum UserAction { GETTING_MAIN_SCREEN_TAB("getting main screen tab"), PLAY_ON_POPUP("play on popup"), SUBSCRIPTIONS("loading subscriptions"); - - private final String message; - - UserAction(final String message) { - this.message = message; - } - - public String getMessage() { - return message; - } } From 8379aa0a9d278c1eafbcc04c842ac577b4dffebe Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Wed, 31 Dec 2025 14:28:11 +0200 Subject: [PATCH 094/190] Refactor ExportPlaylist to use more idiomatic kotlin code --- .../newpipe/local/playlist/ExportPlaylist.kt | 27 +++++++++---------- .../local/playlist/ExportPlaylistTest.kt | 18 ++++++------- 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt b/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt index 0d4dcbfd0..8eb3ab3ae 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2025 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + package org.schabi.newpipe.local.playlist import android.content.Context @@ -21,11 +26,7 @@ fun export( } } -fun exportWithTitles( - playlist: List, - context: Context -): String { - +private fun exportWithTitles(playlist: List, context: Context): String { return playlist.asSequence() .map { it.streamEntity } .map { entity -> @@ -38,18 +39,14 @@ fun exportWithTitles( .joinToString(separator = "\n") } -fun exportJustUrls(playlist: List): String { - - return playlist.asSequence() - .map { it.streamEntity.url } - .joinToString(separator = "\n") +private fun exportJustUrls(playlist: List): String { + return playlist.joinToString(separator = "\n") { it.streamEntity.url } } -fun exportAsYoutubeTempPlaylist(playlist: List): String { +private fun exportAsYoutubeTempPlaylist(playlist: List): String { val videoIDs = playlist.asReversed().asSequence() - .map { it.streamEntity.url } - .mapNotNull(::getYouTubeId) + .mapNotNull { getYouTubeId(it.streamEntity.url) } .take(50) // YouTube limitation: temp playlists can't have more than 50 items .toList() .asReversed() @@ -58,7 +55,7 @@ fun exportAsYoutubeTempPlaylist(playlist: List): String { return "https://www.youtube.com/watch_videos?video_ids=$videoIDs" } -val linkHandler: YoutubeStreamLinkHandlerFactory = YoutubeStreamLinkHandlerFactory.getInstance() +private val linkHandler: YoutubeStreamLinkHandlerFactory = YoutubeStreamLinkHandlerFactory.getInstance() /** * Gets the video id from a YouTube URL. @@ -66,7 +63,7 @@ val linkHandler: YoutubeStreamLinkHandlerFactory = YoutubeStreamLinkHandlerFacto * @param url YouTube URL * @return the video id */ -fun getYouTubeId(url: String): String? { +private fun getYouTubeId(url: String): String? { return try { linkHandler.getId(url) } catch (e: ParsingException) { null } } diff --git a/app/src/test/java/org/schabi/newpipe/local/playlist/ExportPlaylistTest.kt b/app/src/test/java/org/schabi/newpipe/local/playlist/ExportPlaylistTest.kt index d9be2271e..de90061a4 100644 --- a/app/src/test/java/org/schabi/newpipe/local/playlist/ExportPlaylistTest.kt +++ b/app/src/test/java/org/schabi/newpipe/local/playlist/ExportPlaylistTest.kt @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2025 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + package org.schabi.newpipe.local.playlist import android.content.Context @@ -9,7 +14,6 @@ import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.local.playlist.PlayListShareMode.JUST_URLS import org.schabi.newpipe.local.playlist.PlayListShareMode.YOUTUBE_TEMP_PLAYLIST -import java.util.stream.Stream class ExportPlaylistTest { @@ -41,9 +45,7 @@ class ExportPlaylistTest { */ val playlist = asPlaylist( - (10..70) - .map { id -> "https://www.youtube.com/watch?v=aaaaaaaaa$id" } // YouTube video IDs are 11 characters long - .stream() + (10..70).map { id -> "https://www.youtube.com/watch?v=aaaaaaaaa$id" } // YouTube video IDs are 11 characters long ) val url = export(YOUTUBE_TEMP_PLAYLIST, playlist, mock(Context::class.java)) @@ -78,13 +80,11 @@ class ExportPlaylistTest { } fun asPlaylist(vararg urls: String): List { - return asPlaylist(Stream.of(*urls)) + return asPlaylist(listOf(*urls)) } -fun asPlaylist(urls: Stream): List { - return urls - .map { url: String -> newPlaylistStreamEntry(url) } - .toList() +fun asPlaylist(urls: List): List { + return urls.map { newPlaylistStreamEntry(it) } } fun newPlaylistStreamEntry(url: String): PlaylistStreamEntry { From 7d1d88fb8769f20b552108c0384bc86a5d44a080 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Thu, 1 Jan 2026 15:08:21 +0200 Subject: [PATCH 095/190] Convert newpipe/local/playlist/PlayListShareMode to kotlin --- .../newpipe/local/playlist/PlayListShareMode.java | 8 -------- .../newpipe/local/playlist/PlayListShareMode.kt | 12 ++++++++++++ 2 files changed, 12 insertions(+), 8 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/local/playlist/PlayListShareMode.java create mode 100644 app/src/main/java/org/schabi/newpipe/local/playlist/PlayListShareMode.kt diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/PlayListShareMode.java b/app/src/main/java/org/schabi/newpipe/local/playlist/PlayListShareMode.java deleted file mode 100644 index f0433aba8..000000000 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/PlayListShareMode.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.schabi.newpipe.local.playlist; - -public enum PlayListShareMode { - - JUST_URLS, - WITH_TITLES, - YOUTUBE_TEMP_PLAYLIST -} diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/PlayListShareMode.kt b/app/src/main/java/org/schabi/newpipe/local/playlist/PlayListShareMode.kt new file mode 100644 index 000000000..5595ce7fa --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/PlayListShareMode.kt @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2025 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.local.playlist + +enum class PlayListShareMode { + JUST_URLS, + WITH_TITLES, + YOUTUBE_TEMP_PLAYLIST +} From ab3314eb1c8644b67546a65c9affb76295e91e51 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Thu, 1 Jan 2026 15:21:14 +0200 Subject: [PATCH 096/190] Convert newpipe/info_list/ItemViewMode to kotlin --- .../info_list/{ItemViewMode.java => ItemViewMode.kt} | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) rename app/src/main/java/org/schabi/newpipe/info_list/{ItemViewMode.java => ItemViewMode.kt} (65%) diff --git a/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.java b/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.kt similarity index 65% rename from app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.java rename to app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.kt index 447c540a0..703191bb9 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.kt @@ -1,9 +1,14 @@ -package org.schabi.newpipe.info_list; +/* + * SPDX-FileCopyrightText: 2023-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.info_list /** * Item view mode for streams & playlist listing screens. */ -public enum ItemViewMode { +enum class ItemViewMode { /** * Default mode. */ From d9682f5e0abb17590bdd5cea483cad332232940e Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Thu, 1 Jan 2026 15:23:21 +0200 Subject: [PATCH 097/190] Convert newpipe/player/PlayerType to kotlin --- .../java/org/schabi/newpipe/player/PlayerType.java | 7 ------- .../java/org/schabi/newpipe/player/PlayerType.kt | 12 ++++++++++++ 2 files changed, 12 insertions(+), 7 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/player/PlayerType.java create mode 100644 app/src/main/java/org/schabi/newpipe/player/PlayerType.kt diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayerType.java b/app/src/main/java/org/schabi/newpipe/player/PlayerType.java deleted file mode 100644 index f74389d79..000000000 --- a/app/src/main/java/org/schabi/newpipe/player/PlayerType.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.schabi.newpipe.player; - -public enum PlayerType { - MAIN, - AUDIO, - POPUP; -} diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayerType.kt b/app/src/main/java/org/schabi/newpipe/player/PlayerType.kt new file mode 100644 index 000000000..42b2e1131 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/PlayerType.kt @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2022-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.player + +enum class PlayerType { + MAIN, + AUDIO, + POPUP +} From 83596ca90789a1c89992def0265a90f0c313953b Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Thu, 1 Jan 2026 15:27:32 +0200 Subject: [PATCH 098/190] Convert newpipe/settings/preferencesearch/PreferenceSearchResultListener to kotlin --- .../PreferenceSearchResultListener.java | 7 ------- .../preferencesearch/PreferenceSearchResultListener.kt | 10 ++++++++++ 2 files changed, 10 insertions(+), 7 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultListener.java create mode 100644 app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultListener.kt diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultListener.java b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultListener.java deleted file mode 100644 index 1f0636454..000000000 --- a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.schabi.newpipe.settings.preferencesearch; - -import androidx.annotation.NonNull; - -public interface PreferenceSearchResultListener { - void onSearchResultClicked(@NonNull PreferenceSearchItem result); -} diff --git a/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultListener.kt b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultListener.kt new file mode 100644 index 000000000..7b7b7884a --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultListener.kt @@ -0,0 +1,10 @@ +/* + * SPDX-FileCopyrightText: 2022-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.settings.preferencesearch + +interface PreferenceSearchResultListener { + fun onSearchResultClicked(result: PreferenceSearchItem) +} From 3ffcf11a3a18bafc5ae58fc950959e10c715b9c1 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Thu, 1 Jan 2026 21:06:04 +0200 Subject: [PATCH 099/190] Merge inheritors of newpipe/player/playqueue/PlayQueueEvent and convert it to kotlin --- .../player/playback/MediaSourceManager.java | 8 +-- .../newpipe/player/playqueue/PlayQueue.java | 17 +++--- .../player/playqueue/PlayQueueAdapter.java | 11 ++-- .../player/playqueue/PlayQueueEvent.kt | 55 +++++++++++++++++++ .../player/playqueue/events/AppendEvent.java | 18 ------ .../player/playqueue/events/ErrorEvent.java | 24 -------- .../player/playqueue/events/InitEvent.java | 8 --- .../player/playqueue/events/MoveEvent.java | 24 -------- .../playqueue/events/PlayQueueEvent.java | 7 --- .../playqueue/events/PlayQueueEventType.java | 27 --------- .../playqueue/events/RecoveryEvent.java | 24 -------- .../player/playqueue/events/RemoveEvent.java | 24 -------- .../player/playqueue/events/ReorderEvent.java | 24 -------- .../player/playqueue/events/SelectEvent.java | 24 -------- 14 files changed, 72 insertions(+), 223 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueEvent.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/player/playqueue/events/AppendEvent.java delete mode 100644 app/src/main/java/org/schabi/newpipe/player/playqueue/events/ErrorEvent.java delete mode 100644 app/src/main/java/org/schabi/newpipe/player/playqueue/events/InitEvent.java delete mode 100644 app/src/main/java/org/schabi/newpipe/player/playqueue/events/MoveEvent.java delete mode 100644 app/src/main/java/org/schabi/newpipe/player/playqueue/events/PlayQueueEvent.java delete mode 100644 app/src/main/java/org/schabi/newpipe/player/playqueue/events/PlayQueueEventType.java delete mode 100644 app/src/main/java/org/schabi/newpipe/player/playqueue/events/RecoveryEvent.java delete mode 100644 app/src/main/java/org/schabi/newpipe/player/playqueue/events/RemoveEvent.java delete mode 100644 app/src/main/java/org/schabi/newpipe/player/playqueue/events/ReorderEvent.java delete mode 100644 app/src/main/java/org/schabi/newpipe/player/playqueue/events/SelectEvent.java diff --git a/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java b/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java index 88d7145bc..5cffc7f62 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java +++ b/app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java @@ -17,10 +17,10 @@ import org.schabi.newpipe.player.mediasource.ManagedMediaSource; import org.schabi.newpipe.player.mediasource.ManagedMediaSourcePlaylist; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueueItem; -import org.schabi.newpipe.player.playqueue.events.MoveEvent; -import org.schabi.newpipe.player.playqueue.events.PlayQueueEvent; -import org.schabi.newpipe.player.playqueue.events.RemoveEvent; -import org.schabi.newpipe.player.playqueue.events.ReorderEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.MoveEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.RemoveEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.ReorderEvent; import java.util.Collection; import java.util.Collections; diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java index 97196805d..d430faf0f 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java @@ -4,15 +4,14 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.schabi.newpipe.MainActivity; -import org.schabi.newpipe.player.playqueue.events.AppendEvent; -import org.schabi.newpipe.player.playqueue.events.ErrorEvent; -import org.schabi.newpipe.player.playqueue.events.InitEvent; -import org.schabi.newpipe.player.playqueue.events.MoveEvent; -import org.schabi.newpipe.player.playqueue.events.PlayQueueEvent; -import org.schabi.newpipe.player.playqueue.events.RecoveryEvent; -import org.schabi.newpipe.player.playqueue.events.RemoveEvent; -import org.schabi.newpipe.player.playqueue.events.ReorderEvent; -import org.schabi.newpipe.player.playqueue.events.SelectEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.AppendEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.ErrorEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.InitEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.MoveEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.RecoveryEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.RemoveEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.ReorderEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.SelectEvent; import java.io.Serializable; import java.util.ArrayList; diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueAdapter.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueAdapter.java index dd95fb4d5..2e19672e5 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueAdapter.java @@ -10,12 +10,11 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import org.schabi.newpipe.R; -import org.schabi.newpipe.player.playqueue.events.AppendEvent; -import org.schabi.newpipe.player.playqueue.events.ErrorEvent; -import org.schabi.newpipe.player.playqueue.events.MoveEvent; -import org.schabi.newpipe.player.playqueue.events.PlayQueueEvent; -import org.schabi.newpipe.player.playqueue.events.RemoveEvent; -import org.schabi.newpipe.player.playqueue.events.SelectEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.AppendEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.ErrorEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.MoveEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.RemoveEvent; +import org.schabi.newpipe.player.playqueue.PlayQueueEvent.SelectEvent; import org.schabi.newpipe.util.FallbackViewHolder; import java.util.List; diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueEvent.kt b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueEvent.kt new file mode 100644 index 000000000..f1952ef95 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueEvent.kt @@ -0,0 +1,55 @@ +/* + * SPDX-FileCopyrightText: 2017-2026 NewPipe contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.player.playqueue + +import java.io.Serializable + +sealed interface PlayQueueEvent : Serializable { + fun type(): Type + + class InitEvent : PlayQueueEvent { + override fun type() = Type.INIT + } + + // sent when the index is changed + class SelectEvent(val oldIndex: Int, val newIndex: Int) : PlayQueueEvent { + override fun type() = Type.SELECT + } + + // sent when more streams are added to the play queue + class AppendEvent(val amount: Int) : PlayQueueEvent { + override fun type() = Type.APPEND + } + + // sent when a pending stream is removed from the play queue + class RemoveEvent(val removeIndex: Int, val queueIndex: Int) : PlayQueueEvent { + override fun type() = Type.REMOVE + } + + // sent when two streams swap place in the play queue + class MoveEvent(val fromIndex: Int, val toIndex: Int) : PlayQueueEvent { + override fun type() = Type.MOVE + } + + // sent when queue is shuffled + class ReorderEvent(val fromSelectedIndex: Int, val toSelectedIndex: Int) : PlayQueueEvent { + override fun type() = Type.REORDER + } + + // sent when recovery record is set on a stream + class RecoveryEvent(val index: Int, val position: Long) : PlayQueueEvent { + override fun type() = Type.RECOVERY + } + + // sent when the item at index has caused an exception + class ErrorEvent(val errorIndex: Int, val queueIndex: Int) : PlayQueueEvent { + override fun type() = Type.ERROR + } + + // It is necessary only for use in java code. Remove it and use kotlin pattern + // matching when all users of this enum are converted to kotlin + enum class Type { INIT, SELECT, APPEND, REMOVE, MOVE, REORDER, RECOVERY, ERROR } +} diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/AppendEvent.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/events/AppendEvent.java deleted file mode 100644 index cc922dbb1..000000000 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/AppendEvent.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.schabi.newpipe.player.playqueue.events; - -public class AppendEvent implements PlayQueueEvent { - private final int amount; - - public AppendEvent(final int amount) { - this.amount = amount; - } - - @Override - public PlayQueueEventType type() { - return PlayQueueEventType.APPEND; - } - - public int getAmount() { - return amount; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/ErrorEvent.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/events/ErrorEvent.java deleted file mode 100644 index 7b7e39212..000000000 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/ErrorEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.schabi.newpipe.player.playqueue.events; - -public class ErrorEvent implements PlayQueueEvent { - private final int errorIndex; - private final int queueIndex; - - public ErrorEvent(final int errorIndex, final int queueIndex) { - this.errorIndex = errorIndex; - this.queueIndex = queueIndex; - } - - @Override - public PlayQueueEventType type() { - return PlayQueueEventType.ERROR; - } - - public int getErrorIndex() { - return errorIndex; - } - - public int getQueueIndex() { - return queueIndex; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/InitEvent.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/events/InitEvent.java deleted file mode 100644 index 559975b35..000000000 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/InitEvent.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.schabi.newpipe.player.playqueue.events; - -public class InitEvent implements PlayQueueEvent { - @Override - public PlayQueueEventType type() { - return PlayQueueEventType.INIT; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/MoveEvent.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/events/MoveEvent.java deleted file mode 100644 index 55d198923..000000000 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/MoveEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.schabi.newpipe.player.playqueue.events; - -public class MoveEvent implements PlayQueueEvent { - private final int fromIndex; - private final int toIndex; - - public MoveEvent(final int oldIndex, final int newIndex) { - this.fromIndex = oldIndex; - this.toIndex = newIndex; - } - - @Override - public PlayQueueEventType type() { - return PlayQueueEventType.MOVE; - } - - public int getFromIndex() { - return fromIndex; - } - - public int getToIndex() { - return toIndex; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/PlayQueueEvent.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/events/PlayQueueEvent.java deleted file mode 100644 index 431053e7b..000000000 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/PlayQueueEvent.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.schabi.newpipe.player.playqueue.events; - -import java.io.Serializable; - -public interface PlayQueueEvent extends Serializable { - PlayQueueEventType type(); -} diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/PlayQueueEventType.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/events/PlayQueueEventType.java deleted file mode 100644 index 1cc710c7b..000000000 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/PlayQueueEventType.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.schabi.newpipe.player.playqueue.events; - -public enum PlayQueueEventType { - INIT, - - // sent when the index is changed - SELECT, - - // sent when more streams are added to the play queue - APPEND, - - // sent when a pending stream is removed from the play queue - REMOVE, - - // sent when two streams swap place in the play queue - MOVE, - - // sent when queue is shuffled - REORDER, - - // sent when recovery record is set on a stream - RECOVERY, - - // sent when the item at index has caused an exception - ERROR -} - diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/RecoveryEvent.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/events/RecoveryEvent.java deleted file mode 100644 index 6f21b36cd..000000000 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/RecoveryEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.schabi.newpipe.player.playqueue.events; - -public class RecoveryEvent implements PlayQueueEvent { - private final int index; - private final long position; - - public RecoveryEvent(final int index, final long position) { - this.index = index; - this.position = position; - } - - @Override - public PlayQueueEventType type() { - return PlayQueueEventType.RECOVERY; - } - - public int getIndex() { - return index; - } - - public long getPosition() { - return position; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/RemoveEvent.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/events/RemoveEvent.java deleted file mode 100644 index a5872906d..000000000 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/RemoveEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.schabi.newpipe.player.playqueue.events; - -public class RemoveEvent implements PlayQueueEvent { - private final int removeIndex; - private final int queueIndex; - - public RemoveEvent(final int removeIndex, final int queueIndex) { - this.removeIndex = removeIndex; - this.queueIndex = queueIndex; - } - - @Override - public PlayQueueEventType type() { - return PlayQueueEventType.REMOVE; - } - - public int getQueueIndex() { - return queueIndex; - } - - public int getRemoveIndex() { - return removeIndex; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/ReorderEvent.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/events/ReorderEvent.java deleted file mode 100644 index 4f4f14756..000000000 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/ReorderEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.schabi.newpipe.player.playqueue.events; - -public class ReorderEvent implements PlayQueueEvent { - private final int fromSelectedIndex; - private final int toSelectedIndex; - - public ReorderEvent(final int fromSelectedIndex, final int toSelectedIndex) { - this.fromSelectedIndex = fromSelectedIndex; - this.toSelectedIndex = toSelectedIndex; - } - - @Override - public PlayQueueEventType type() { - return PlayQueueEventType.REORDER; - } - - public int getFromSelectedIndex() { - return fromSelectedIndex; - } - - public int getToSelectedIndex() { - return toSelectedIndex; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/SelectEvent.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/events/SelectEvent.java deleted file mode 100644 index 95e344211..000000000 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/events/SelectEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.schabi.newpipe.player.playqueue.events; - -public class SelectEvent implements PlayQueueEvent { - private final int oldIndex; - private final int newIndex; - - public SelectEvent(final int oldIndex, final int newIndex) { - this.oldIndex = oldIndex; - this.newIndex = newIndex; - } - - @Override - public PlayQueueEventType type() { - return PlayQueueEventType.SELECT; - } - - public int getOldIndex() { - return oldIndex; - } - - public int getNewIndex() { - return newIndex; - } -} From 0747b3a0a59857fcce69eade2266d9c83271c58e Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Fri, 2 Jan 2026 12:25:25 +0200 Subject: [PATCH 100/190] Use "factory" method for creating db migrations --- .../org/schabi/newpipe/database/Migrations.kt | 606 +++++++++--------- 1 file changed, 295 insertions(+), 311 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.kt b/app/src/main/java/org/schabi/newpipe/database/Migrations.kt index 8988708e6..6566f7e6a 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Migrations.kt +++ b/app/src/main/java/org/schabi/newpipe/database/Migrations.kt @@ -34,335 +34,319 @@ object Migrations { private val TAG = Migrations::class.java.getName() private val isDebug = MainActivity.DEBUG - val MIGRATION_1_2 = object : Migration(DB_VER_1, DB_VER_2) { - override fun migrate(db: SupportSQLiteDatabase) { - if (isDebug) { - Log.d(TAG, "Start migrating database") - } + val MIGRATION_1_2 = Migration(DB_VER_1, DB_VER_2) { db -> + if (isDebug) { + Log.d(TAG, "Start migrating database") + } - /* - * Unfortunately these queries must be hardcoded due to the possibility of - * schema and names changing at a later date, thus invalidating the older migration - * scripts if they are not hardcoded. - * */ + /* + * Unfortunately these queries must be hardcoded due to the possibility of + * schema and names changing at a later date, thus invalidating the older migration + * scripts if they are not hardcoded. + * */ - // Not much we can do about this, since room doesn't create tables before migration. - // It's either this or blasting the entire database anew. + // Not much we can do about this, since room doesn't create tables before migration. + // It's either this or blasting the entire database anew. + db.execSQL( + "CREATE INDEX `index_search_history_search` " + + "ON `search_history` (`search`)" + ) + db.execSQL( + "CREATE TABLE IF NOT EXISTS `streams` " + + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`service_id` INTEGER NOT NULL, `url` TEXT, `title` TEXT, " + + "`stream_type` TEXT, `duration` INTEGER, `uploader` TEXT, " + + "`thumbnail_url` TEXT)" + ) + db.execSQL( + "CREATE UNIQUE INDEX `index_streams_service_id_url` " + + "ON `streams` (`service_id`, `url`)" + ) + db.execSQL( + "CREATE TABLE IF NOT EXISTS `stream_history` " + + "(`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, " + + "`repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), " + + "FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) " + + "ON UPDATE CASCADE ON DELETE CASCADE )" + ) + db.execSQL( + "CREATE INDEX `index_stream_history_stream_id` " + + "ON `stream_history` (`stream_id`)" + ) + db.execSQL( + "CREATE TABLE IF NOT EXISTS `stream_state` " + + "(`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, " + + "PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) " + + "REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )" + ) + db.execSQL( + "CREATE TABLE IF NOT EXISTS `playlists` " + + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`name` TEXT, `thumbnail_url` TEXT)" + ) + db.execSQL("CREATE INDEX `index_playlists_name` ON `playlists` (`name`)") + db.execSQL( + "CREATE TABLE IF NOT EXISTS `playlist_stream_join` " + + "(`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, " + + "`join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), " + + "FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) " + + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, " + + "FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) " + + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" + ) + db.execSQL( + "CREATE UNIQUE INDEX " + + "`index_playlist_stream_join_playlist_id_join_index` " + + "ON `playlist_stream_join` (`playlist_id`, `join_index`)" + ) + db.execSQL( + "CREATE INDEX `index_playlist_stream_join_stream_id` " + + "ON `playlist_stream_join` (`stream_id`)" + ) + db.execSQL( + "CREATE TABLE IF NOT EXISTS `remote_playlists` " + + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, " + + "`thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)" + ) + db.execSQL( + "CREATE INDEX `index_remote_playlists_name` " + + "ON `remote_playlists` (`name`)" + ) + db.execSQL( + "CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` " + + "ON `remote_playlists` (`service_id`, `url`)" + ) + + // Populate streams table with existing entries in watch history + // Latest data first, thus ignoring older entries with the same indices + db.execSQL( + "INSERT OR IGNORE INTO streams (service_id, url, title, " + + "stream_type, duration, uploader, thumbnail_url) " + + + "SELECT service_id, url, title, 'VIDEO_STREAM', duration, " + + "uploader, thumbnail_url " + + + "FROM watch_history " + + "ORDER BY creation_date DESC" + ) + + // Once the streams have PKs, join them with the normalized history table + // and populate it with the remaining data from watch history + db.execSQL( + "INSERT INTO stream_history (stream_id, access_date, repeat_count)" + + "SELECT uid, creation_date, 1 " + + "FROM watch_history INNER JOIN streams " + + "ON watch_history.service_id == streams.service_id " + + "AND watch_history.url == streams.url " + + "ORDER BY creation_date DESC" + ) + + db.execSQL("DROP TABLE IF EXISTS watch_history") + + if (isDebug) { + Log.d(TAG, "Stop migrating database") + } + } + + val MIGRATION_2_3 = Migration(DB_VER_2, DB_VER_3) { db -> + // Add NOT NULLs and new fields + db.execSQL( + "CREATE TABLE IF NOT EXISTS streams_new " + + "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "service_id INTEGER NOT NULL, url TEXT NOT NULL, title TEXT NOT NULL, " + + "stream_type TEXT NOT NULL, duration INTEGER NOT NULL, " + + "uploader TEXT NOT NULL, thumbnail_url TEXT, view_count INTEGER, " + + "textual_upload_date TEXT, upload_date INTEGER, " + + "is_upload_date_approximation INTEGER)" + ) + + db.execSQL( + "INSERT INTO streams_new (uid, service_id, url, title, stream_type, " + + "duration, uploader, thumbnail_url, view_count, textual_upload_date, " + + "upload_date, is_upload_date_approximation) " + + + "SELECT uid, service_id, url, ifnull(title, ''), " + + "ifnull(stream_type, 'VIDEO_STREAM'), ifnull(duration, 0), " + + "ifnull(uploader, ''), ifnull(thumbnail_url, ''), NULL, NULL, NULL, NULL " + + + "FROM streams WHERE url IS NOT NULL" + ) + + db.execSQL("DROP TABLE streams") + db.execSQL("ALTER TABLE streams_new RENAME TO streams") + db.execSQL( + "CREATE UNIQUE INDEX index_streams_service_id_url " + + "ON streams (service_id, url)" + ) + + // Tables for feed feature + db.execSQL( + "CREATE TABLE IF NOT EXISTS feed " + + "(stream_id INTEGER NOT NULL, subscription_id INTEGER NOT NULL, " + + "PRIMARY KEY(stream_id, subscription_id), " + + "FOREIGN KEY(stream_id) REFERENCES streams(uid) " + + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, " + + "FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) " + + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" + ) + db.execSQL("CREATE INDEX index_feed_subscription_id ON feed (subscription_id)") + db.execSQL( + "CREATE TABLE IF NOT EXISTS feed_group " + + "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL, " + + "icon_id INTEGER NOT NULL, sort_order INTEGER NOT NULL)" + ) + db.execSQL("CREATE INDEX index_feed_group_sort_order ON feed_group (sort_order)") + db.execSQL( + "CREATE TABLE IF NOT EXISTS feed_group_subscription_join " + + "(group_id INTEGER NOT NULL, subscription_id INTEGER NOT NULL, " + + "PRIMARY KEY(group_id, subscription_id), " + + "FOREIGN KEY(group_id) REFERENCES feed_group(uid) " + + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, " + + "FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) " + + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" + ) + db.execSQL( + "CREATE INDEX index_feed_group_subscription_join_subscription_id " + + "ON feed_group_subscription_join (subscription_id)" + ) + db.execSQL( + "CREATE TABLE IF NOT EXISTS feed_last_updated " + + "(subscription_id INTEGER NOT NULL, last_updated INTEGER, " + + "PRIMARY KEY(subscription_id), " + + "FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) " + + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" + ) + } + + val MIGRATION_3_4 = Migration(DB_VER_3, DB_VER_4) { db -> + db.execSQL("ALTER TABLE streams ADD COLUMN uploader_url TEXT") + } + + val MIGRATION_4_5 = Migration(DB_VER_4, DB_VER_5) { db -> + db.execSQL( + "ALTER TABLE `subscriptions` ADD COLUMN `notification_mode` " + + "INTEGER NOT NULL DEFAULT 0" + ) + } + + val MIGRATION_5_6 = Migration(DB_VER_5, DB_VER_6) { db -> + db.execSQL( + "ALTER TABLE `playlists` ADD COLUMN `is_thumbnail_permanent` " + + "INTEGER NOT NULL DEFAULT 0" + ) + } + + val MIGRATION_6_7 = Migration(DB_VER_6, DB_VER_7) { db -> + // Create a new column thumbnail_stream_id + db.execSQL( + "ALTER TABLE `playlists` ADD COLUMN `thumbnail_stream_id` " + + "INTEGER NOT NULL DEFAULT -1" + ) + + // Migrate the thumbnail_url to the thumbnail_stream_id + db.execSQL( + "UPDATE playlists SET thumbnail_stream_id = (" + + " SELECT CASE WHEN COUNT(*) != 0 then stream_uid ELSE -1 END" + + " FROM (" + + " SELECT p.uid AS playlist_uid, s.uid AS stream_uid" + + " FROM playlists p" + + " LEFT JOIN playlist_stream_join ps ON p.uid = ps.playlist_id" + + " LEFT JOIN streams s ON s.uid = ps.stream_id" + + " WHERE s.thumbnail_url = p.thumbnail_url) AS temporary_table" + + " WHERE playlist_uid = playlists.uid)" + ) + + // Remove the thumbnail_url field in the playlist table + db.execSQL( + "CREATE TABLE IF NOT EXISTS `playlists_new`" + + "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "name TEXT, " + + "is_thumbnail_permanent INTEGER NOT NULL, " + + "thumbnail_stream_id INTEGER NOT NULL)" + ) + + db.execSQL( + "INSERT INTO playlists_new" + + " SELECT uid, name, is_thumbnail_permanent, thumbnail_stream_id " + + " FROM playlists" + ) + + db.execSQL("DROP TABLE playlists") + db.execSQL("ALTER TABLE playlists_new RENAME TO playlists") + db.execSQL( + "CREATE INDEX IF NOT EXISTS " + + "`index_playlists_name` ON `playlists` (`name`)" + ) + } + + val MIGRATION_7_8 = Migration(DB_VER_7, DB_VER_8) { db -> + db.execSQL( + "DELETE FROM search_history WHERE id NOT IN (SELECT id FROM (SELECT " + + "MIN(id) as id FROM search_history GROUP BY trim(search), service_id ) tmp)" + ) + db.execSQL("UPDATE search_history SET search = trim(search)") + } + + val MIGRATION_8_9 = Migration(DB_VER_8, DB_VER_9) { db -> + try { + db.beginTransaction() + + // Update playlists. + // Create a temp table to initialize display_index. db.execSQL( - "CREATE INDEX `index_search_history_search` " + - "ON `search_history` (`search`)" - ) - db.execSQL( - "CREATE TABLE IF NOT EXISTS `streams` " + + "CREATE TABLE `playlists_tmp` " + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + - "`service_id` INTEGER NOT NULL, `url` TEXT, `title` TEXT, " + - "`stream_type` TEXT, `duration` INTEGER, `uploader` TEXT, " + - "`thumbnail_url` TEXT)" + "`name` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL, " + + "`thumbnail_stream_id` INTEGER NOT NULL, " + + "`display_index` INTEGER NOT NULL)" ) db.execSQL( - "CREATE UNIQUE INDEX `index_streams_service_id_url` " + - "ON `streams` (`service_id`, `url`)" + "INSERT INTO `playlists_tmp` " + + "(`uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " + + "`display_index`) " + + "SELECT `uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " + + "-1 " + + "FROM `playlists`" ) + + // Replace the old table, note that this also removes the index on the name which + // we don't need anymore. + db.execSQL("DROP TABLE `playlists`") + db.execSQL("ALTER TABLE `playlists_tmp` RENAME TO `playlists`") + + // Update remote_playlists. + // Create a temp table to initialize display_index. db.execSQL( - "CREATE TABLE IF NOT EXISTS `stream_history` " + - "(`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, " + - "`repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), " + - "FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) " + - "ON UPDATE CASCADE ON DELETE CASCADE )" - ) - db.execSQL( - "CREATE INDEX `index_stream_history_stream_id` " + - "ON `stream_history` (`stream_id`)" - ) - db.execSQL( - "CREATE TABLE IF NOT EXISTS `stream_state` " + - "(`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, " + - "PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) " + - "REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )" - ) - db.execSQL( - "CREATE TABLE IF NOT EXISTS `playlists` " + - "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + - "`name` TEXT, `thumbnail_url` TEXT)" - ) - db.execSQL("CREATE INDEX `index_playlists_name` ON `playlists` (`name`)") - db.execSQL( - "CREATE TABLE IF NOT EXISTS `playlist_stream_join` " + - "(`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, " + - "`join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), " + - "FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) " + - "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, " + - "FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) " + - "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" - ) - db.execSQL( - "CREATE UNIQUE INDEX " + - "`index_playlist_stream_join_playlist_id_join_index` " + - "ON `playlist_stream_join` (`playlist_id`, `join_index`)" - ) - db.execSQL( - "CREATE INDEX `index_playlist_stream_join_stream_id` " + - "ON `playlist_stream_join` (`stream_id`)" - ) - db.execSQL( - "CREATE TABLE IF NOT EXISTS `remote_playlists` " + + "CREATE TABLE `remote_playlists_tmp` " + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, " + - "`thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)" + "`thumbnail_url` TEXT, `uploader` TEXT, " + + "`display_index` INTEGER NOT NULL," + + "`stream_count` INTEGER)" ) db.execSQL( - "CREATE INDEX `index_remote_playlists_name` " + - "ON `remote_playlists` (`name`)" + "INSERT INTO `remote_playlists_tmp` (`uid`, `service_id`, " + + "`name`, `url`, `thumbnail_url`, `uploader`, `display_index`, " + + "`stream_count`)" + + "SELECT `uid`, `service_id`, `name`, `url`, `thumbnail_url`, `uploader`, " + + "-1, `stream_count` FROM `remote_playlists`" ) + + // Replace the old table, note that this also removes the index on the name which + // we don't need anymore. + db.execSQL("DROP TABLE `remote_playlists`") + db.execSQL("ALTER TABLE `remote_playlists_tmp` RENAME TO `remote_playlists`") + + // Create index on the new table. db.execSQL( "CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` " + "ON `remote_playlists` (`service_id`, `url`)" ) - // Populate streams table with existing entries in watch history - // Latest data first, thus ignoring older entries with the same indices - db.execSQL( - "INSERT OR IGNORE INTO streams (service_id, url, title, " + - "stream_type, duration, uploader, thumbnail_url) " + - - "SELECT service_id, url, title, 'VIDEO_STREAM', duration, " + - "uploader, thumbnail_url " + - - "FROM watch_history " + - "ORDER BY creation_date DESC" - ) - - // Once the streams have PKs, join them with the normalized history table - // and populate it with the remaining data from watch history - db.execSQL( - "INSERT INTO stream_history (stream_id, access_date, repeat_count)" + - "SELECT uid, creation_date, 1 " + - "FROM watch_history INNER JOIN streams " + - "ON watch_history.service_id == streams.service_id " + - "AND watch_history.url == streams.url " + - "ORDER BY creation_date DESC" - ) - - db.execSQL("DROP TABLE IF EXISTS watch_history") - - if (isDebug) { - Log.d(TAG, "Stop migrating database") - } - } - } - - val MIGRATION_2_3 = object : Migration(DB_VER_2, DB_VER_3) { - override fun migrate(db: SupportSQLiteDatabase) { - // Add NOT NULLs and new fields - db.execSQL( - "CREATE TABLE IF NOT EXISTS streams_new " + - "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + - "service_id INTEGER NOT NULL, url TEXT NOT NULL, title TEXT NOT NULL, " + - "stream_type TEXT NOT NULL, duration INTEGER NOT NULL, " + - "uploader TEXT NOT NULL, thumbnail_url TEXT, view_count INTEGER, " + - "textual_upload_date TEXT, upload_date INTEGER, " + - "is_upload_date_approximation INTEGER)" - ) - - db.execSQL( - "INSERT INTO streams_new (uid, service_id, url, title, stream_type, " + - "duration, uploader, thumbnail_url, view_count, textual_upload_date, " + - "upload_date, is_upload_date_approximation) " + - - "SELECT uid, service_id, url, ifnull(title, ''), " + - "ifnull(stream_type, 'VIDEO_STREAM'), ifnull(duration, 0), " + - "ifnull(uploader, ''), ifnull(thumbnail_url, ''), NULL, NULL, NULL, NULL " + - - "FROM streams WHERE url IS NOT NULL" - ) - - db.execSQL("DROP TABLE streams") - db.execSQL("ALTER TABLE streams_new RENAME TO streams") - db.execSQL( - "CREATE UNIQUE INDEX index_streams_service_id_url " + - "ON streams (service_id, url)" - ) - - // Tables for feed feature - db.execSQL( - "CREATE TABLE IF NOT EXISTS feed " + - "(stream_id INTEGER NOT NULL, subscription_id INTEGER NOT NULL, " + - "PRIMARY KEY(stream_id, subscription_id), " + - "FOREIGN KEY(stream_id) REFERENCES streams(uid) " + - "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, " + - "FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) " + - "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" - ) - db.execSQL("CREATE INDEX index_feed_subscription_id ON feed (subscription_id)") - db.execSQL( - "CREATE TABLE IF NOT EXISTS feed_group " + - "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL, " + - "icon_id INTEGER NOT NULL, sort_order INTEGER NOT NULL)" - ) - db.execSQL("CREATE INDEX index_feed_group_sort_order ON feed_group (sort_order)") - db.execSQL( - "CREATE TABLE IF NOT EXISTS feed_group_subscription_join " + - "(group_id INTEGER NOT NULL, subscription_id INTEGER NOT NULL, " + - "PRIMARY KEY(group_id, subscription_id), " + - "FOREIGN KEY(group_id) REFERENCES feed_group(uid) " + - "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, " + - "FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) " + - "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" - ) - db.execSQL( - "CREATE INDEX index_feed_group_subscription_join_subscription_id " + - "ON feed_group_subscription_join (subscription_id)" - ) - db.execSQL( - "CREATE TABLE IF NOT EXISTS feed_last_updated " + - "(subscription_id INTEGER NOT NULL, last_updated INTEGER, " + - "PRIMARY KEY(subscription_id), " + - "FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) " + - "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" - ) - } - } - - val MIGRATION_3_4 = object : Migration(DB_VER_3, DB_VER_4) { - override fun migrate(db: SupportSQLiteDatabase) { - db.execSQL("ALTER TABLE streams ADD COLUMN uploader_url TEXT") - } - } - - val MIGRATION_4_5 = object : Migration(DB_VER_4, DB_VER_5) { - override fun migrate(db: SupportSQLiteDatabase) { - db.execSQL( - "ALTER TABLE `subscriptions` ADD COLUMN `notification_mode` " + - "INTEGER NOT NULL DEFAULT 0" - ) - } - } - - val MIGRATION_5_6 = object : Migration(DB_VER_5, DB_VER_6) { - override fun migrate(db: SupportSQLiteDatabase) { - db.execSQL( - "ALTER TABLE `playlists` ADD COLUMN `is_thumbnail_permanent` " + - "INTEGER NOT NULL DEFAULT 0" - ) - } - } - - val MIGRATION_6_7 = object : Migration(DB_VER_6, DB_VER_7) { - override fun migrate(db: SupportSQLiteDatabase) { - // Create a new column thumbnail_stream_id - db.execSQL( - "ALTER TABLE `playlists` ADD COLUMN `thumbnail_stream_id` " + - "INTEGER NOT NULL DEFAULT -1" - ) - - // Migrate the thumbnail_url to the thumbnail_stream_id - db.execSQL( - "UPDATE playlists SET thumbnail_stream_id = (" + - " SELECT CASE WHEN COUNT(*) != 0 then stream_uid ELSE -1 END" + - " FROM (" + - " SELECT p.uid AS playlist_uid, s.uid AS stream_uid" + - " FROM playlists p" + - " LEFT JOIN playlist_stream_join ps ON p.uid = ps.playlist_id" + - " LEFT JOIN streams s ON s.uid = ps.stream_id" + - " WHERE s.thumbnail_url = p.thumbnail_url) AS temporary_table" + - " WHERE playlist_uid = playlists.uid)" - ) - - // Remove the thumbnail_url field in the playlist table - db.execSQL( - "CREATE TABLE IF NOT EXISTS `playlists_new`" + - "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + - "name TEXT, " + - "is_thumbnail_permanent INTEGER NOT NULL, " + - "thumbnail_stream_id INTEGER NOT NULL)" - ) - - db.execSQL( - "INSERT INTO playlists_new" + - " SELECT uid, name, is_thumbnail_permanent, thumbnail_stream_id " + - " FROM playlists" - ) - - db.execSQL("DROP TABLE playlists") - db.execSQL("ALTER TABLE playlists_new RENAME TO playlists") - db.execSQL( - "CREATE INDEX IF NOT EXISTS " + - "`index_playlists_name` ON `playlists` (`name`)" - ) - } - } - - val MIGRATION_7_8 = object : Migration(DB_VER_7, DB_VER_8) { - override fun migrate(db: SupportSQLiteDatabase) { - db.execSQL( - "DELETE FROM search_history WHERE id NOT IN (SELECT id FROM (SELECT " + - "MIN(id) as id FROM search_history GROUP BY trim(search), service_id ) tmp)" - ) - db.execSQL("UPDATE search_history SET search = trim(search)") - } - } - - val MIGRATION_8_9 = object : Migration(DB_VER_8, DB_VER_9) { - override fun migrate(db: SupportSQLiteDatabase) { - try { - db.beginTransaction() - - // Update playlists. - // Create a temp table to initialize display_index. - db.execSQL( - "CREATE TABLE `playlists_tmp` " + - "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + - "`name` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL, " + - "`thumbnail_stream_id` INTEGER NOT NULL, " + - "`display_index` INTEGER NOT NULL)" - ) - db.execSQL( - "INSERT INTO `playlists_tmp` " + - "(`uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " + - "`display_index`) " + - "SELECT `uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " + - "-1 " + - "FROM `playlists`" - ) - - // Replace the old table, note that this also removes the index on the name which - // we don't need anymore. - db.execSQL("DROP TABLE `playlists`") - db.execSQL("ALTER TABLE `playlists_tmp` RENAME TO `playlists`") - - // Update remote_playlists. - // Create a temp table to initialize display_index. - db.execSQL( - "CREATE TABLE `remote_playlists_tmp` " + - "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + - "`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, " + - "`thumbnail_url` TEXT, `uploader` TEXT, " + - "`display_index` INTEGER NOT NULL," + - "`stream_count` INTEGER)" - ) - db.execSQL( - "INSERT INTO `remote_playlists_tmp` (`uid`, `service_id`, " + - "`name`, `url`, `thumbnail_url`, `uploader`, `display_index`, " + - "`stream_count`)" + - "SELECT `uid`, `service_id`, `name`, `url`, `thumbnail_url`, `uploader`, " + - "-1, `stream_count` FROM `remote_playlists`" - ) - - // Replace the old table, note that this also removes the index on the name which - // we don't need anymore. - db.execSQL("DROP TABLE `remote_playlists`") - db.execSQL("ALTER TABLE `remote_playlists_tmp` RENAME TO `remote_playlists`") - - // Create index on the new table. - db.execSQL( - "CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` " + - "ON `remote_playlists` (`service_id`, `url`)" - ) - - db.setTransactionSuccessful() - } finally { - db.endTransaction() - } + db.setTransactionSuccessful() + } finally { + db.endTransaction() } } } From 49aaaebd861e9637970bff69e364e887d1da3181 Mon Sep 17 00:00:00 2001 From: Mira <27288418+mira-x@users.noreply.github.com> Date: Sat, 3 Jan 2026 11:54:07 +0100 Subject: [PATCH 101/190] Feat: opus metadata encoding (#12974) Feat: Downloading: Add opus audio metadata tags for title, author, date, and a comment tag with the originating URL This removes the DownloadManagerService.EXTRA_SOURCE field, which is always inferred from the StreamInfo. --- .../newpipe/download/DownloadDialog.java | 2 +- .../newpipe/streams/OggFromWebMWriter.java | 97 +++++++++++++++++-- .../postprocessing/OggFromWebmDemuxer.java | 2 +- .../giga/postprocessing/Postprocessing.java | 7 +- .../giga/service/DownloadManagerService.java | 17 ++-- 5 files changed, 107 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 0857fa339..741bda246 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -1133,7 +1133,7 @@ public class DownloadDialog extends DialogFragment } DownloadManagerService.startMission(context, urls, storage, kind, threads, - currentInfo.getUrl(), psName, psArgs, nearLength, new ArrayList<>(recoveryInfo)); + currentInfo, psName, psArgs, nearLength, new ArrayList<>(recoveryInfo)); Toast.makeText(context, getString(R.string.download_has_started), Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/org/schabi/newpipe/streams/OggFromWebMWriter.java b/app/src/main/java/org/schabi/newpipe/streams/OggFromWebMWriter.java index 266cec24a..7cdc84e22 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/OggFromWebMWriter.java +++ b/app/src/main/java/org/schabi/newpipe/streams/OggFromWebMWriter.java @@ -1,8 +1,14 @@ package org.schabi.newpipe.streams; +import static org.schabi.newpipe.MainActivity.DEBUG; + +import android.util.Log; +import android.util.Pair; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.streams.WebMReader.Cluster; import org.schabi.newpipe.streams.WebMReader.Segment; import org.schabi.newpipe.streams.WebMReader.SimpleBlock; @@ -13,6 +19,10 @@ import java.io.Closeable; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; /** * @author kapodamy @@ -52,8 +62,10 @@ public class OggFromWebMWriter implements Closeable { private long segmentTableNextTimestamp = TIME_SCALE_NS; private final int[] crc32Table = new int[256]; + private final StreamInfo streamInfo; - public OggFromWebMWriter(@NonNull final SharpStream source, @NonNull final SharpStream target) { + public OggFromWebMWriter(@NonNull final SharpStream source, @NonNull final SharpStream target, + @Nullable final StreamInfo streamInfo) { if (!source.canRead() || !source.canRewind()) { throw new IllegalArgumentException("source stream must be readable and allows seeking"); } @@ -63,6 +75,7 @@ public class OggFromWebMWriter implements Closeable { this.source = source; this.output = target; + this.streamInfo = streamInfo; this.streamId = (int) System.currentTimeMillis(); @@ -271,12 +284,31 @@ public class OggFromWebMWriter implements Closeable { @Nullable private byte[] makeMetadata() { + if (DEBUG) { + Log.d("OggFromWebMWriter", "Downloading media with codec ID " + webmTrack.codecId); + } + if ("A_OPUS".equals(webmTrack.codecId)) { - return new byte[]{ - 0x4F, 0x70, 0x75, 0x73, 0x54, 0x61, 0x67, 0x73, // "OpusTags" binary string - 0x00, 0x00, 0x00, 0x00, // writing application string size (not present) - 0x00, 0x00, 0x00, 0x00 // additional tags count (zero means no tags) - }; + final var metadata = new ArrayList>(); + if (streamInfo != null) { + metadata.add(Pair.create("COMMENT", streamInfo.getUrl())); + metadata.add(Pair.create("GENRE", streamInfo.getCategory())); + metadata.add(Pair.create("ARTIST", streamInfo.getUploaderName())); + metadata.add(Pair.create("TITLE", streamInfo.getName())); + metadata.add(Pair.create("DATE", streamInfo + .getUploadDate() + .getLocalDateTime() + .format(DateTimeFormatter.ISO_DATE))); + } + + if (DEBUG) { + Log.d("OggFromWebMWriter", "Creating metadata header with this data:"); + metadata.forEach(p -> { + Log.d("OggFromWebMWriter", p.first + "=" + p.second); + }); + } + + return makeOpusTagsHeader(metadata); } else if ("A_VORBIS".equals(webmTrack.codecId)) { return new byte[]{ 0x03, // ¿¿¿??? @@ -290,6 +322,59 @@ public class OggFromWebMWriter implements Closeable { return null; } + /** + * This creates a single metadata tag for use in opus metadata headers. It contains the four + * byte string length field and includes the string as-is. This cannot be used independently, + * but must follow a proper "OpusTags" header. + * + * @param pair A key-value pair in the format "KEY=some value" + * @return The binary data of the encoded metadata tag + */ + private static byte[] makeOpusMetadataTag(final Pair pair) { + final var keyValue = pair.first.toUpperCase() + "=" + pair.second.trim(); + + final var bytes = keyValue.getBytes(); + final var buf = ByteBuffer.allocate(4 + bytes.length); + buf.order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(bytes.length); + buf.put(bytes); + return buf.array(); + } + + /** + * This returns a complete "OpusTags" header, created from the provided metadata tags. + *

    + * You probably want to use makeOpusMetadata(), which uses this function to create + * a header with sensible metadata filled in. + * + * @param keyValueLines A list of pairs of the tags. This can also be though of as a mapping + * from one key to multiple values. + * @return The binary header + */ + private static byte[] makeOpusTagsHeader(final List> keyValueLines) { + final var tags = keyValueLines + .stream() + .filter(p -> !p.second.isBlank()) + .map(OggFromWebMWriter::makeOpusMetadataTag) + .collect(Collectors.toUnmodifiableList()); + + final var tagsBytes = tags.stream().collect(Collectors.summingInt(arr -> arr.length)); + + // Fixed header fields + dynamic fields + final var byteCount = 16 + tagsBytes; + + final var head = ByteBuffer.allocate(byteCount); + head.order(ByteOrder.LITTLE_ENDIAN); + head.put(new byte[]{ + 0x4F, 0x70, 0x75, 0x73, 0x54, 0x61, 0x67, 0x73, // "OpusTags" binary string + 0x00, 0x00, 0x00, 0x00, // vendor (aka. Encoder) string of length 0 + }); + head.putInt(tags.size()); // 4 bytes for tag count + tags.forEach(head::put); // dynamic amount of tag bytes + + return head.array(); + } + private void write(final ByteBuffer buffer) throws IOException { output.write(buffer.array(), 0, buffer.position()); buffer.position(0); diff --git a/app/src/main/java/us/shandian/giga/postprocessing/OggFromWebmDemuxer.java b/app/src/main/java/us/shandian/giga/postprocessing/OggFromWebmDemuxer.java index dc46ced5d..badb5f7ed 100644 --- a/app/src/main/java/us/shandian/giga/postprocessing/OggFromWebmDemuxer.java +++ b/app/src/main/java/us/shandian/giga/postprocessing/OggFromWebmDemuxer.java @@ -34,7 +34,7 @@ class OggFromWebmDemuxer extends Postprocessing { @Override int process(SharpStream out, @NonNull SharpStream... sources) throws IOException { - OggFromWebMWriter demuxer = new OggFromWebMWriter(sources[0], out); + OggFromWebMWriter demuxer = new OggFromWebMWriter(sources[0], out, streamInfo); demuxer.parseSource(); demuxer.selectTrack(0); demuxer.build(); diff --git a/app/src/main/java/us/shandian/giga/postprocessing/Postprocessing.java b/app/src/main/java/us/shandian/giga/postprocessing/Postprocessing.java index 7f5c85d27..1c9143252 100644 --- a/app/src/main/java/us/shandian/giga/postprocessing/Postprocessing.java +++ b/app/src/main/java/us/shandian/giga/postprocessing/Postprocessing.java @@ -4,6 +4,7 @@ import android.util.Log; import androidx.annotation.NonNull; +import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.streams.io.SharpStream; import java.io.File; @@ -30,7 +31,8 @@ public abstract class Postprocessing implements Serializable { public transient static final String ALGORITHM_M4A_NO_DASH = "mp4D-m4a"; public transient static final String ALGORITHM_OGG_FROM_WEBM_DEMUXER = "webm-ogg-d"; - public static Postprocessing getAlgorithm(@NonNull String algorithmName, String[] args) { + public static Postprocessing getAlgorithm(@NonNull String algorithmName, String[] args, + StreamInfo streamInfo) { Postprocessing instance; switch (algorithmName) { @@ -56,6 +58,7 @@ public abstract class Postprocessing implements Serializable { } instance.args = args; + instance.streamInfo = streamInfo; return instance; } @@ -75,8 +78,8 @@ public abstract class Postprocessing implements Serializable { */ private final String name; - private String[] args; + protected StreamInfo streamInfo; private transient DownloadMission mission; diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java index 45211211f..76da18b2d 100755 --- a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java @@ -40,6 +40,7 @@ import androidx.preference.PreferenceManager; import org.schabi.newpipe.R; import org.schabi.newpipe.download.DownloadActivity; +import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.player.helper.LockManager; import org.schabi.newpipe.streams.io.StoredDirectoryHelper; import org.schabi.newpipe.streams.io.StoredFileHelper; @@ -74,12 +75,12 @@ public class DownloadManagerService extends Service { private static final String EXTRA_THREADS = "DownloadManagerService.extra.threads"; private static final String EXTRA_POSTPROCESSING_NAME = "DownloadManagerService.extra.postprocessingName"; private static final String EXTRA_POSTPROCESSING_ARGS = "DownloadManagerService.extra.postprocessingArgs"; - private static final String EXTRA_SOURCE = "DownloadManagerService.extra.source"; private static final String EXTRA_NEAR_LENGTH = "DownloadManagerService.extra.nearLength"; private static final String EXTRA_PATH = "DownloadManagerService.extra.storagePath"; private static final String EXTRA_PARENT_PATH = "DownloadManagerService.extra.storageParentPath"; private static final String EXTRA_STORAGE_TAG = "DownloadManagerService.extra.storageTag"; private static final String EXTRA_RECOVERY_INFO = "DownloadManagerService.extra.recoveryInfo"; + private static final String EXTRA_STREAM_INFO = "DownloadManagerService.extra.streamInfo"; private static final String ACTION_RESET_DOWNLOAD_FINISHED = APPLICATION_ID + ".reset_download_finished"; private static final String ACTION_OPEN_DOWNLOADS_FINISHED = APPLICATION_ID + ".open_downloads_finished"; @@ -353,13 +354,13 @@ public class DownloadManagerService extends Service { * @param kind type of file (a: audio v: video s: subtitle ?: file-extension defined) * @param threads the number of threads maximal used to download chunks of the file. * @param psName the name of the required post-processing algorithm, or {@code null} to ignore. - * @param source source url of the resource + * @param streamInfo stream metadata that may be written into the downloaded file. * @param psArgs the arguments for the post-processing algorithm. * @param nearLength the approximated final length of the file * @param recoveryInfo array of MissionRecoveryInfo, in case is required recover the download */ public static void startMission(Context context, String[] urls, StoredFileHelper storage, - char kind, int threads, String source, String psName, + char kind, int threads, StreamInfo streamInfo, String psName, String[] psArgs, long nearLength, ArrayList recoveryInfo) { final Intent intent = new Intent(context, DownloadManagerService.class) @@ -367,14 +368,14 @@ public class DownloadManagerService extends Service { .putExtra(EXTRA_URLS, urls) .putExtra(EXTRA_KIND, kind) .putExtra(EXTRA_THREADS, threads) - .putExtra(EXTRA_SOURCE, source) .putExtra(EXTRA_POSTPROCESSING_NAME, psName) .putExtra(EXTRA_POSTPROCESSING_ARGS, psArgs) .putExtra(EXTRA_NEAR_LENGTH, nearLength) .putExtra(EXTRA_RECOVERY_INFO, recoveryInfo) .putExtra(EXTRA_PARENT_PATH, storage.getParentUri()) .putExtra(EXTRA_PATH, storage.getUri()) - .putExtra(EXTRA_STORAGE_TAG, storage.getTag()); + .putExtra(EXTRA_STORAGE_TAG, storage.getTag()) + .putExtra(EXTRA_STREAM_INFO, streamInfo); context.startService(intent); } @@ -387,9 +388,9 @@ public class DownloadManagerService extends Service { char kind = intent.getCharExtra(EXTRA_KIND, '?'); String psName = intent.getStringExtra(EXTRA_POSTPROCESSING_NAME); String[] psArgs = intent.getStringArrayExtra(EXTRA_POSTPROCESSING_ARGS); - String source = intent.getStringExtra(EXTRA_SOURCE); long nearLength = intent.getLongExtra(EXTRA_NEAR_LENGTH, 0); String tag = intent.getStringExtra(EXTRA_STORAGE_TAG); + StreamInfo streamInfo = (StreamInfo)intent.getSerializableExtra(EXTRA_STREAM_INFO); final var recovery = IntentCompat.getParcelableArrayListExtra(intent, EXTRA_RECOVERY_INFO, MissionRecoveryInfo.class); Objects.requireNonNull(recovery); @@ -405,11 +406,11 @@ public class DownloadManagerService extends Service { if (psName == null) ps = null; else - ps = Postprocessing.getAlgorithm(psName, psArgs); + ps = Postprocessing.getAlgorithm(psName, psArgs, streamInfo); final DownloadMission mission = new DownloadMission(urls, storage, kind, ps); mission.threadCount = threads; - mission.source = source; + mission.source = streamInfo.getUrl(); mission.nearLength = nearLength; mission.recoveryInfo = recovery.toArray(new MissionRecoveryInfo[0]); From 5cefafa1459112b064fcea2f62c8a87966abd83c Mon Sep 17 00:00:00 2001 From: tobigr Date: Sun, 21 Dec 2025 10:58:01 +0100 Subject: [PATCH 102/190] Prepare for version 0.28.1 (1006) --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index df8c278c1..1aa5297c5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -42,9 +42,9 @@ android { minSdk = 21 targetSdk = 35 - versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1005 + versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1006 - versionName = "0.28.0" + versionName = "0.28.1" System.getProperty("versionNameSuffix")?.let { versionNameSuffix = it } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" From e758b5f890f3f792e89a1279394b121d02cf47af Mon Sep 17 00:00:00 2001 From: whistlingwoods <72640314+whistlingwoods@users.noreply.github.com> Date: Sat, 9 Aug 2025 20:57:42 +0530 Subject: [PATCH 103/190] Adapt header handling changes from other recyclerview adapters to fix... ... Crash in lists (ViewHolder views not attached) in StatisticsPlaylistFragment Co-Authored-By: j-haldane <200528955+j-haldane@users.noreply.github.com> --- .../newpipe/local/BaseLocalListFragment.java | 10 +++-- .../newpipe/local/LocalItemListAdapter.java | 45 +++++++++++-------- .../history/StatisticsPlaylistFragment.java | 6 +-- .../local/playlist/LocalPlaylistFragment.java | 8 ++-- 4 files changed, 40 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java b/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java index 90ef8c352..00a721bcf 100644 --- a/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java @@ -28,6 +28,8 @@ import static org.schabi.newpipe.ktx.ViewUtils.animate; import static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling; import static org.schabi.newpipe.util.ThemeHelper.getItemViewMode; +import java.util.function.Supplier; + /** * This fragment is design to be used with persistent data such as * {@link org.schabi.newpipe.database.LocalItem}, and does not cache the data contained @@ -100,7 +102,7 @@ public abstract class BaseLocalListFragment extends BaseStateFragment //////////////////////////////////////////////////////////////////////////*/ @Nullable - protected ViewBinding getListHeader() { + protected Supplier getListHeaderSupplier() { return null; } @@ -131,9 +133,9 @@ public abstract class BaseLocalListFragment extends BaseStateFragment itemsList = rootView.findViewById(R.id.items_list); refreshItemViewMode(); - headerRootBinding = getListHeader(); - if (headerRootBinding != null) { - itemListAdapter.setHeader(headerRootBinding.getRoot()); + final Supplier listHeaderSupplier = getListHeaderSupplier(); + if (listHeaderSupplier != null) { + itemListAdapter.setHeaderSupplier(listHeaderSupplier); } footerRootBinding = getListFooter(); itemListAdapter.setFooter(footerRootBinding.getRoot()); diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index b33619dea..3f9cc48ab 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -2,6 +2,7 @@ package org.schabi.newpipe.local; import android.content.Context; import android.util.Log; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -37,6 +38,7 @@ import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; /* * Created by Christian Schabesberger on 01.08.16. @@ -82,13 +84,14 @@ public class LocalItemListAdapter extends RecyclerView.Adapter localItems; private final HistoryRecordManager recordManager; private final DateTimeFormatter dateTimeFormatter; private boolean showFooter = false; - private View header = null; + private Supplier headerSupplier = null; private View footer = null; private ItemViewMode itemViewMode = ItemViewMode.LIST; private boolean useItemHandle = false; @@ -97,6 +100,8 @@ public class LocalItemListAdapter extends RecyclerView.Adapter(); + layoutInflater = LayoutInflater.from(context); + dateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) .withLocale(Localization.getPreferredLocale(context)); } @@ -124,7 +129,7 @@ public class LocalItemListAdapter extends RecyclerView.Adapter offsetStart = " + offsetStart + ", " + "localItems.size() = " + localItems.size() + ", " - + "header = " + header + ", footer = " + footer + ", " + + "header = " + hasHeader() + ", footer = " + footer + ", " + "showFooter = " + showFooter); } notifyItemRangeInserted(offsetStart, data.size()); @@ -144,7 +149,7 @@ public class LocalItemListAdapter extends RecyclerView.Adapter headerSupplier) { + final boolean changed = headerSupplier != this.headerSupplier; + this.headerSupplier = headerSupplier; if (changed) { notifyDataSetChanged(); } @@ -201,6 +206,10 @@ public class LocalItemListAdapter extends RecyclerView.Adapter getItemsList() { @@ -232,7 +241,7 @@ public class LocalItemListAdapter extends RecyclerView.Adapter getListHeaderSupplier() { headerBinding = StatisticPlaylistControlBinding.inflate(activity.getLayoutInflater(), itemsList, false); playlistControlBinding = headerBinding.playlistControl; - return headerBinding; + return headerBinding::getRoot; } @Override diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index f5562549c..5f02a5467 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -29,7 +29,6 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; -import androidx.viewbinding.ViewBinding; import com.evernote.android.state.State; import org.reactivestreams.Subscriber; @@ -67,6 +66,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Supplier; import java.util.stream.Collectors; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; @@ -158,14 +158,14 @@ public class LocalPlaylistFragment extends BaseLocalListFragment getListHeaderSupplier() { headerBinding = LocalPlaylistHeaderBinding.inflate(activity.getLayoutInflater(), itemsList, - false); + false); playlistControlBinding = headerBinding.playlistControl; headerBinding.playlistTitleView.setSelected(true); - return headerBinding; + return headerBinding::getRoot; } @Override From 738338d0920f72d670337e3c9533cd6935250fc0 Mon Sep 17 00:00:00 2001 From: whistlingwoods <72640314+whistlingwoods@users.noreply.github.com> Date: Sat, 9 Aug 2025 21:01:55 +0530 Subject: [PATCH 104/190] Remove unneeded LayoutInflater from LocalItemListAdapter Co-Authored-By: j-haldane <200528955+j-haldane@users.noreply.github.com> --- .../java/org/schabi/newpipe/local/LocalItemListAdapter.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index 3f9cc48ab..3bb84e2de 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -2,7 +2,6 @@ package org.schabi.newpipe.local; import android.content.Context; import android.util.Log; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -84,7 +83,6 @@ public class LocalItemListAdapter extends RecyclerView.Adapter localItems; private final HistoryRecordManager recordManager; @@ -100,7 +98,6 @@ public class LocalItemListAdapter extends RecyclerView.Adapter(); - layoutInflater = LayoutInflater.from(context); dateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) .withLocale(Localization.getPreferredLocale(context)); From 23b7f21d7c6582fb82793f06cd94b371e6a1b38a Mon Sep 17 00:00:00 2001 From: Siddhesh Dhainje Date: Sun, 4 Jan 2026 01:06:18 +0530 Subject: [PATCH 105/190] Fix crash on screen rotation while entering SoundCloud import URL --- .../subscription/ImportConfirmationDialog.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java b/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java index 03dd4a1cd..aa15b26d8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java @@ -18,18 +18,17 @@ import org.schabi.newpipe.R; public class ImportConfirmationDialog extends DialogFragment { @State protected Intent resultServiceIntent; + static final String EXTRA_RESULT_SERVICE_INTENT = "extra_result_service_intent"; public static void show(@NonNull final Fragment fragment, @NonNull final Intent resultServiceIntent) { final ImportConfirmationDialog confirmationDialog = new ImportConfirmationDialog(); - confirmationDialog.setResultServiceIntent(resultServiceIntent); + final Bundle args = new Bundle(); + args.putParcelable(EXTRA_RESULT_SERVICE_INTENT, resultServiceIntent); + confirmationDialog.setArguments(args); confirmationDialog.show(fragment.getParentFragmentManager(), null); } - public void setResultServiceIntent(final Intent resultServiceIntent) { - this.resultServiceIntent = resultServiceIntent; - } - @NonNull @Override public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) { @@ -50,6 +49,10 @@ public class ImportConfirmationDialog extends DialogFragment { public void onCreate(@Nullable final Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (getArguments() != null) { + resultServiceIntent = getArguments().getParcelable(EXTRA_RESULT_SERVICE_INTENT); + } + if (resultServiceIntent == null) { throw new IllegalStateException("Result intent is null"); } From 35eb08baf0a5b2a1101acdf2410941b67f268aea Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Sun, 4 Jan 2026 13:53:43 +0200 Subject: [PATCH 106/190] Delete long orphaned file Was oprhaned at 004c2fa55a3eb918825ce1c9d37c42a3f24c607c --- .../local/history/HistoryEntryAdapter.java | 108 ------------------ 1 file changed, 108 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/local/history/HistoryEntryAdapter.java diff --git a/app/src/main/java/org/schabi/newpipe/local/history/HistoryEntryAdapter.java b/app/src/main/java/org/schabi/newpipe/local/history/HistoryEntryAdapter.java deleted file mode 100644 index 709a16b68..000000000 --- a/app/src/main/java/org/schabi/newpipe/local/history/HistoryEntryAdapter.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.schabi.newpipe.local.history; - -import android.content.Context; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.RecyclerView; - -import org.schabi.newpipe.util.Localization; - -import java.text.DateFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; - - -/** - * This is an adapter for history entries. - * - * @param the type of the entries - * @param the type of the view holder - */ -public abstract class HistoryEntryAdapter - extends RecyclerView.Adapter { - private final ArrayList mEntries; - private final DateFormat mDateFormat; - private final Context mContext; - private OnHistoryItemClickListener onHistoryItemClickListener = null; - - public HistoryEntryAdapter(final Context context) { - super(); - mContext = context; - mEntries = new ArrayList<>(); - mDateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, - Localization.getPreferredLocale(context)); - } - - public void setEntries(@NonNull final Collection historyEntries) { - mEntries.clear(); - mEntries.addAll(historyEntries); - notifyDataSetChanged(); - } - - public Collection getItems() { - return mEntries; - } - - public void clear() { - mEntries.clear(); - notifyDataSetChanged(); - } - - protected String getFormattedDate(final Date date) { - return mDateFormat.format(date); - } - - protected String getFormattedViewString(final long viewCount) { - return Localization.shortViewCount(mContext, viewCount); - } - - @Override - public int getItemCount() { - return mEntries.size(); - } - - @Override - public void onBindViewHolder(final VH holder, final int position) { - final E entry = mEntries.get(position); - holder.itemView.setOnClickListener(v -> { - if (onHistoryItemClickListener != null) { - onHistoryItemClickListener.onHistoryItemClick(entry); - } - }); - - holder.itemView.setOnLongClickListener(view -> { - if (onHistoryItemClickListener != null) { - onHistoryItemClickListener.onHistoryItemLongClick(entry); - return true; - } - return false; - }); - - onBindViewHolder(holder, entry, position); - } - - @Override - public void onViewRecycled(@NonNull final VH holder) { - super.onViewRecycled(holder); - holder.itemView.setOnClickListener(null); - } - - abstract void onBindViewHolder(VH holder, E entry, int position); - - public void setOnHistoryItemClickListener( - @Nullable final OnHistoryItemClickListener onHistoryItemClickListener) { - this.onHistoryItemClickListener = onHistoryItemClickListener; - } - - public boolean isEmpty() { - return mEntries.isEmpty(); - } - - public interface OnHistoryItemClickListener { - void onHistoryItemClick(E item); - - void onHistoryItemLongClick(E item); - } -} From a3673f8c3b3152c5fdef7313693ef16654ea3931 Mon Sep 17 00:00:00 2001 From: Siddhesh Dhainje Date: Sun, 4 Jan 2026 21:40:40 +0530 Subject: [PATCH 107/190] Used requireArguments instead of getArguments --- .../local/subscription/ImportConfirmationDialog.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java b/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java index aa15b26d8..b586ad3e1 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java @@ -18,7 +18,7 @@ import org.schabi.newpipe.R; public class ImportConfirmationDialog extends DialogFragment { @State protected Intent resultServiceIntent; - static final String EXTRA_RESULT_SERVICE_INTENT = "extra_result_service_intent"; + private static final String EXTRA_RESULT_SERVICE_INTENT = "extra_result_service_intent"; public static void show(@NonNull final Fragment fragment, @NonNull final Intent resultServiceIntent) { @@ -49,13 +49,7 @@ public class ImportConfirmationDialog extends DialogFragment { public void onCreate(@Nullable final Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (getArguments() != null) { - resultServiceIntent = getArguments().getParcelable(EXTRA_RESULT_SERVICE_INTENT); - } - - if (resultServiceIntent == null) { - throw new IllegalStateException("Result intent is null"); - } + resultServiceIntent = requireArguments().getParcelable(EXTRA_RESULT_SERVICE_INTENT); Bridge.restoreInstanceState(this, savedInstanceState); } From 61c0d134d78816391891d46e81a4e44b28d282d5 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Mon, 5 Jan 2026 22:56:03 +0200 Subject: [PATCH 108/190] Commit all the playlist changes to db immediately + some additional minor code cleanup in the file --- .../local/playlist/LocalPlaylistFragment.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index f5562549c..1efc0a84c 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -111,7 +111,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment() { @Override public void selected(final LocalItem selectedItem) { - if (selectedItem instanceof PlaylistStreamEntry) { - final StreamEntity item = - ((PlaylistStreamEntry) selectedItem).getStreamEntity(); + if (selectedItem instanceof PlaylistStreamEntry entry) { + final StreamEntity item = entry.getStreamEntity(); NavigationHelper.openVideoDetailFragment(requireContext(), getFM(), item.getServiceId(), item.getUrl(), item.getTitle(), null, false); } @@ -496,6 +495,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment items = itemListAdapter.getItemsList(); final List streamIds = new ArrayList<>(items.size()); for (final LocalItem item : items) { - if (item instanceof PlaylistStreamEntry) { - streamIds.add(((PlaylistStreamEntry) item).getStreamId()); + if (item instanceof PlaylistStreamEntry entry) { + streamIds.add(entry.getStreamId()); } } @@ -767,6 +768,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment Date: Tue, 6 Jan 2026 09:01:47 +0200 Subject: [PATCH 109/190] Allow dragging boorkmarked playlist in both directions Ctrl+C/Ctrl+V from newpipe/local/playlist/LocalPlaylistFragment --- .../newpipe/local/bookmark/BookmarkFragment.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index d15db84c7..1f3772dd5 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.local.bookmark; import static org.schabi.newpipe.local.bookmark.MergedPlaylistManager.getMergedOrderedPlaylists; +import static org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout; import android.content.DialogInterface; import android.os.Bundle; @@ -417,10 +418,11 @@ public final class BookmarkFragment extends BaseLocalListFragment Date: Mon, 5 Jan 2026 22:56:03 +0200 Subject: [PATCH 110/190] Commit all the playlist changes to db immediately + some additional minor code cleanup in the file --- .../local/playlist/LocalPlaylistFragment.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index f5562549c..1efc0a84c 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -111,7 +111,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment() { @Override public void selected(final LocalItem selectedItem) { - if (selectedItem instanceof PlaylistStreamEntry) { - final StreamEntity item = - ((PlaylistStreamEntry) selectedItem).getStreamEntity(); + if (selectedItem instanceof PlaylistStreamEntry entry) { + final StreamEntity item = entry.getStreamEntity(); NavigationHelper.openVideoDetailFragment(requireContext(), getFM(), item.getServiceId(), item.getUrl(), item.getTitle(), null, false); } @@ -496,6 +495,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment items = itemListAdapter.getItemsList(); final List streamIds = new ArrayList<>(items.size()); for (final LocalItem item : items) { - if (item instanceof PlaylistStreamEntry) { - streamIds.add(((PlaylistStreamEntry) item).getStreamId()); + if (item instanceof PlaylistStreamEntry entry) { + streamIds.add(entry.getStreamId()); } } @@ -767,6 +768,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment Date: Tue, 6 Jan 2026 12:41:12 +0100 Subject: [PATCH 111/190] Update extractor to latest version fixes media.ccc.de kiosks --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 02c89fcef..ee0fe535e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -59,7 +59,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 = "05e0e4ced7b6ff05f3d68d831efed8bdf588f9ac" +teamnewpipe-newpipe-extractor = "f3e143035f8c2b94e43c6bef0608d2a519914e8f" viewpager2 = "1.1.0" webkit = "1.14.0" work = "2.10.5" # Newer versions require minSdk >= 23 From 08008ca6f958fe9f2768447047b3225292f10ca7 Mon Sep 17 00:00:00 2001 From: Justin L Date: Tue, 6 Jan 2026 09:03:44 -0500 Subject: [PATCH 112/190] Fix download resume corruption when server returns HTTP 200 When resuming a download after interruption, if the server returns HTTP 200 (full resource) instead of HTTP 206 (partial content), the code correctly resets mMission.done but fails to reset the 'start' variable. This causes the subsequent file seek to use a stale offset, writing new data at incorrect positions. This bug causes file corruption for large downloads (>5GB) that are interrupted and resumed, particularly when: - Switching between WiFi networks - Server CDN returning different responses - Connection drops during long downloads The corruption manifests as duplicate data regions in the file, which for MP4 downloads results in multiple MOOV atoms and broken seek functionality. Fix: Reset start=0 when HTTP 200 is received, ensuring the file write position correctly restarts from the beginning of the current resource. --- .../main/java/us/shandian/giga/get/DownloadRunnableFallback.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java b/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java index eed5db463..1d2483e79 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java @@ -85,6 +85,7 @@ public class DownloadRunnableFallback extends Thread { if (mMission.unknownLength || mConn.getResponseCode() == 200) { // restart amount of bytes downloaded mMission.done = mMission.offsets[mMission.current] - mMission.offsets[0]; + start = 0; // reset position to avoid writing at wrong offset } mF = mMission.storage.getStream(); From 20b43b521bc600dddd17ea34593821b968566d14 Mon Sep 17 00:00:00 2001 From: AbsurdlyLongUsername <22662897+absurdlylongusername@users.noreply.github.com> Date: Wed, 7 Jan 2026 07:48:32 +0000 Subject: [PATCH 113/190] Revert Google Material Components to 1.11.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 02c89fcef..a189e6d61 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -30,7 +30,7 @@ leakcanary = "2.14" lifecycle = "2.9.4" # Newer versions require minSdk >= 23 localbroadcastmanager = "1.1.0" markwon = "4.6.2" -material = "1.13.0" +material = "1.11.0" media = "1.7.1" mockitoCore = "5.21.0" okhttp = "5.3.2" From 952a1269c1e204756c88d7eeec15b4a34764c7f0 Mon Sep 17 00:00:00 2001 From: AbsurdlyLongUsername <22662897+absurdlylongusername@users.noreply.github.com> Date: Wed, 7 Jan 2026 07:48:32 +0000 Subject: [PATCH 114/190] Revert Google Material Components to 1.11.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ee0fe535e..35dd808d0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -30,7 +30,7 @@ leakcanary = "2.14" lifecycle = "2.9.4" # Newer versions require minSdk >= 23 localbroadcastmanager = "1.1.0" markwon = "4.6.2" -material = "1.13.0" +material = "1.11.0" media = "1.7.1" mockitoCore = "5.21.0" okhttp = "5.3.2" From 1eeba8daa7079deb09573261ab69e31437e6b6f3 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Wed, 7 Jan 2026 20:33:35 +0200 Subject: [PATCH 115/190] Remove file orphaned for long time It was not deleted by mistake, delete it now Was orphaned at 1d69bd48beb9df0e5761c80f0ab4e7bae38900a4 --- .../schabi/newpipe/views/CollapsibleView.java | 249 ------------------ 1 file changed, 249 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java diff --git a/app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java b/app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java deleted file mode 100644 index 91b5ebd07..000000000 --- a/app/src/main/java/org/schabi/newpipe/views/CollapsibleView.java +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright 2018 Mauricio Colli - * CollapsibleView.java is part of NewPipe - * - * License: GPL-3.0+ - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.schabi.newpipe.views; - -import static org.schabi.newpipe.MainActivity.DEBUG; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.animation.ValueAnimator; -import android.content.Context; -import android.os.Parcelable; -import android.util.AttributeSet; -import android.util.Log; -import android.widget.LinearLayout; - -import androidx.annotation.IntDef; -import androidx.annotation.Nullable; - -import com.evernote.android.state.State; -import com.livefront.bridge.Bridge; - -import org.schabi.newpipe.ktx.ViewUtils; - -import java.lang.annotation.Retention; -import java.util.ArrayList; -import java.util.List; - -/** - * A view that can be fully collapsed and expanded. - */ -public class CollapsibleView extends LinearLayout { - private static final String TAG = CollapsibleView.class.getSimpleName(); - - private static final int ANIMATION_DURATION = 420; - - public static final int COLLAPSED = 0; - public static final int EXPANDED = 1; - - @State - @ViewMode - int currentState = COLLAPSED; - private boolean readyToChangeState; - - private int targetHeight = -1; - private ValueAnimator currentAnimator; - private final List listeners = new ArrayList<>(); - - public CollapsibleView(final Context context) { - super(context); - } - - public CollapsibleView(final Context context, @Nullable final AttributeSet attrs) { - super(context, attrs); - } - - public CollapsibleView(final Context context, @Nullable final AttributeSet attrs, - final int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public CollapsibleView(final Context context, final AttributeSet attrs, final int defStyleAttr, - final int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - } - - /*////////////////////////////////////////////////////////////////////////// - // Collapse/expand logic - //////////////////////////////////////////////////////////////////////////*/ - - /** - * This method recalculates the height of this view so it must be called when - * some child changes (e.g. add new views, change text). - */ - public void ready() { - if (DEBUG) { - Log.d(TAG, getDebugLogString("ready() called")); - } - - measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), - MeasureSpec.UNSPECIFIED); - targetHeight = getMeasuredHeight(); - - getLayoutParams().height = currentState == COLLAPSED ? 0 : targetHeight; - requestLayout(); - broadcastState(); - - readyToChangeState = true; - - if (DEBUG) { - Log.d(TAG, getDebugLogString("ready() *after* measuring")); - } - } - - public void collapse() { - if (DEBUG) { - Log.d(TAG, getDebugLogString("collapse() called")); - } - - if (!readyToChangeState) { - return; - } - - final int height = getHeight(); - if (height == 0) { - setCurrentState(COLLAPSED); - return; - } - - if (currentAnimator != null && currentAnimator.isRunning()) { - currentAnimator.cancel(); - } - currentAnimator = ViewUtils.animateHeight(this, ANIMATION_DURATION, 0); - - setCurrentState(COLLAPSED); - } - - public void expand() { - if (DEBUG) { - Log.d(TAG, getDebugLogString("expand() called")); - } - - if (!readyToChangeState) { - return; - } - - final int height = getHeight(); - if (height == this.targetHeight) { - setCurrentState(EXPANDED); - return; - } - - if (currentAnimator != null && currentAnimator.isRunning()) { - currentAnimator.cancel(); - } - currentAnimator = ViewUtils.animateHeight(this, ANIMATION_DURATION, this.targetHeight); - setCurrentState(EXPANDED); - } - - public void switchState() { - if (!readyToChangeState) { - return; - } - - if (currentState == COLLAPSED) { - expand(); - } else { - collapse(); - } - } - - @ViewMode - public int getCurrentState() { - return currentState; - } - - public void setCurrentState(@ViewMode final int currentState) { - this.currentState = currentState; - broadcastState(); - } - - public void broadcastState() { - for (final StateListener listener : listeners) { - listener.onStateChanged(currentState); - } - } - - /** - * Add a listener which will be listening for changes in this view (i.e. collapsed or expanded). - * @param listener {@link StateListener} to be added - */ - public void addListener(final StateListener listener) { - if (listeners.contains(listener)) { - throw new IllegalStateException("Trying to add the same listener multiple times"); - } - - listeners.add(listener); - } - - /** - * Remove a listener so it doesn't receive more state changes. - * @param listener {@link StateListener} to be removed - */ - public void removeListener(final StateListener listener) { - listeners.remove(listener); - } - - /*////////////////////////////////////////////////////////////////////////// - // State Saving - //////////////////////////////////////////////////////////////////////////*/ - - @Nullable - @Override - public Parcelable onSaveInstanceState() { - return Bridge.saveInstanceState(this, super.onSaveInstanceState()); - } - - @Override - public void onRestoreInstanceState(final Parcelable state) { - super.onRestoreInstanceState(Bridge.restoreInstanceState(this, state)); - - ready(); - } - - /*////////////////////////////////////////////////////////////////////////// - // Internal - //////////////////////////////////////////////////////////////////////////*/ - - public String getDebugLogString(final String description) { - return String.format("%-100s → %s", - description, "readyToChangeState = [" + readyToChangeState + "], " - + "currentState = [" + currentState + "], " - + "targetHeight = [" + targetHeight + "], " - + "mW x mH = [" + getMeasuredWidth() + "x" + getMeasuredHeight() + "], " - + "W x H = [" + getWidth() + "x" + getHeight() + "]"); - } - - @Retention(SOURCE) - @IntDef({COLLAPSED, EXPANDED}) - public @interface ViewMode { } - - /** - * Simple interface used for listening state changes of the {@link CollapsibleView}. - */ - public interface StateListener { - /** - * Called when the state changes. - * - * @param newState the state that the {@link CollapsibleView} transitioned to,
    - * it's an integer being either {@link #COLLAPSED} or {@link #EXPANDED} - */ - void onStateChanged(@ViewMode int newState); - } -} From a7e4afe7f70baf4b44097966791d638142257b21 Mon Sep 17 00:00:00 2001 From: AbsurdlyLongUsername <22662897+absurdlylongusername@users.noreply.github.com> Date: Wed, 7 Jan 2026 21:49:42 +0000 Subject: [PATCH 116/190] Add note to upgrade material components once they fix later versions --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a189e6d61..6bf588242 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -30,7 +30,7 @@ leakcanary = "2.14" lifecycle = "2.9.4" # Newer versions require minSdk >= 23 localbroadcastmanager = "1.1.0" markwon = "4.6.2" -material = "1.11.0" +material = "1.11.0" # TODO: update to newer version after bug is fixed. See https://github.com/TeamNewPipe/NewPipe/pull/13018 media = "1.7.1" mockitoCore = "5.21.0" okhttp = "5.3.2" From 418e34172a8528437c9cd1c6097503dbb053b61f Mon Sep 17 00:00:00 2001 From: Siddhesh Dhainje Date: Thu, 8 Jan 2026 21:31:31 +0530 Subject: [PATCH 117/190] Removed restoreInstanceState and resultServiceIntent condition --- .../local/subscription/ImportConfirmationDialog.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java b/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java index b586ad3e1..0067e1154 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java @@ -10,13 +10,11 @@ import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; -import com.evernote.android.state.State; import com.livefront.bridge.Bridge; import org.schabi.newpipe.R; public class ImportConfirmationDialog extends DialogFragment { - @State protected Intent resultServiceIntent; private static final String EXTRA_RESULT_SERVICE_INTENT = "extra_result_service_intent"; @@ -37,9 +35,7 @@ public class ImportConfirmationDialog extends DialogFragment { .setCancelable(true) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.ok, (dialogInterface, i) -> { - if (resultServiceIntent != null && getContext() != null) { - getContext().startService(resultServiceIntent); - } + requireContext().startService(resultServiceIntent); dismiss(); }) .create(); @@ -50,8 +46,6 @@ public class ImportConfirmationDialog extends DialogFragment { super.onCreate(savedInstanceState); resultServiceIntent = requireArguments().getParcelable(EXTRA_RESULT_SERVICE_INTENT); - - Bridge.restoreInstanceState(this, savedInstanceState); } @Override From d36a9f01d320c518156ba673630c0418b9b53cc8 Mon Sep 17 00:00:00 2001 From: Tobi Date: Thu, 8 Jan 2026 17:06:50 -0800 Subject: [PATCH 118/190] Add workflow to backport PRs to another branch (#12964) The workflow can be triggered by creating a comment on a merged PR: /backport The backport can only be triggered by people with write access to the repository. Co-authored-by: AbsurdlyLongUsername <22662897+absurdlylongusername@users.noreply.github.com> --- .github/workflows/backport-pr.yml | 46 +++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 .github/workflows/backport-pr.yml diff --git a/.github/workflows/backport-pr.yml b/.github/workflows/backport-pr.yml new file mode 100644 index 000000000..c7bcb117e --- /dev/null +++ b/.github/workflows/backport-pr.yml @@ -0,0 +1,46 @@ +name: Backport merged pull request +on: + issue_comment: + types: [created] +permissions: + contents: write # for comment creation on original PR + pull-requests: write +jobs: + backport: + name: Backport pull request + runs-on: ubuntu-latest + + # Only run when the comment starts with the `/backport` command on a PR and + # the commenter has write access to the repository. We do not want to allow + # everybody to trigger backports and create branches in our repository. + if: > + github.event.issue.pull_request && + startsWith(github.event.comment.body, '/backport ') && + ( + github.event.comment.author_association == 'OWNER' || + github.event.comment.author_association == 'COLLABORATOR' || + github.event.comment.author_association == 'MEMBER' + ) + steps: + - uses: actions/checkout@v4 + - name: Get backport metadata + # the target branch is the first argument after `/backport` + run: | + set -euo pipefail + body="${{ github.event.comment.body }}" + + line=${body%%$'\n'*} # Get the first line + if [[ $line =~ ^/backport[[:space:]]+([^[:space:]]+) ]]; then + echo "BACKPORT_TARGET=${BASH_REMATCH[1]}" >> "$GITHUB_ENV" + else + echo "Usage: /backport " >&2 + exit 1 + fi + + - name: Create backport pull request + uses: korthout/backport-action@v4 + with: + add_labels: 'backport' + copy_labels_pattern: '.*' + label_pattern: '' + target_branches: ${{ env.BACKPORT_TARGET }} \ No newline at end of file From dc5c5b6604c582093c1b7b85e28ea6e0c6c49f4d Mon Sep 17 00:00:00 2001 From: Justin L Date: Tue, 6 Jan 2026 09:03:44 -0500 Subject: [PATCH 119/190] Fix download resume corruption when server returns HTTP 200 When resuming a download after interruption, if the server returns HTTP 200 (full resource) instead of HTTP 206 (partial content), the code correctly resets mMission.done but fails to reset the 'start' variable. This causes the subsequent file seek to use a stale offset, writing new data at incorrect positions. This bug causes file corruption for large downloads (>5GB) that are interrupted and resumed, particularly when: - Switching between WiFi networks - Server CDN returning different responses - Connection drops during long downloads The corruption manifests as duplicate data regions in the file, which for MP4 downloads results in multiple MOOV atoms and broken seek functionality. Fix: Reset start=0 when HTTP 200 is received, ensuring the file write position correctly restarts from the beginning of the current resource. (cherry picked from commit 08008ca6f958fe9f2768447047b3225292f10ca7) --- .../main/java/us/shandian/giga/get/DownloadRunnableFallback.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java b/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java index eed5db463..1d2483e79 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java @@ -85,6 +85,7 @@ public class DownloadRunnableFallback extends Thread { if (mMission.unknownLength || mConn.getResponseCode() == 200) { // restart amount of bytes downloaded mMission.done = mMission.offsets[mMission.current] - mMission.offsets[0]; + start = 0; // reset position to avoid writing at wrong offset } mF = mMission.storage.getStream(); From d5d92e83405139f19f5c1fe065558782121779c2 Mon Sep 17 00:00:00 2001 From: Siddhesh Dhainje Date: Sun, 4 Jan 2026 01:06:18 +0530 Subject: [PATCH 120/190] Fix crash on screen rotation while entering SoundCloud import URL (cherry picked from commit 23b7f21d7c6582fb82793f06cd94b371e6a1b38a) --- .../subscription/ImportConfirmationDialog.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java b/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java index 03dd4a1cd..aa15b26d8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java @@ -18,18 +18,17 @@ import org.schabi.newpipe.R; public class ImportConfirmationDialog extends DialogFragment { @State protected Intent resultServiceIntent; + static final String EXTRA_RESULT_SERVICE_INTENT = "extra_result_service_intent"; public static void show(@NonNull final Fragment fragment, @NonNull final Intent resultServiceIntent) { final ImportConfirmationDialog confirmationDialog = new ImportConfirmationDialog(); - confirmationDialog.setResultServiceIntent(resultServiceIntent); + final Bundle args = new Bundle(); + args.putParcelable(EXTRA_RESULT_SERVICE_INTENT, resultServiceIntent); + confirmationDialog.setArguments(args); confirmationDialog.show(fragment.getParentFragmentManager(), null); } - public void setResultServiceIntent(final Intent resultServiceIntent) { - this.resultServiceIntent = resultServiceIntent; - } - @NonNull @Override public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) { @@ -50,6 +49,10 @@ public class ImportConfirmationDialog extends DialogFragment { public void onCreate(@Nullable final Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (getArguments() != null) { + resultServiceIntent = getArguments().getParcelable(EXTRA_RESULT_SERVICE_INTENT); + } + if (resultServiceIntent == null) { throw new IllegalStateException("Result intent is null"); } From 381b383a432a2ca46995bd5e9643634480a72a07 Mon Sep 17 00:00:00 2001 From: Siddhesh Dhainje Date: Sun, 4 Jan 2026 21:40:40 +0530 Subject: [PATCH 121/190] Used requireArguments instead of getArguments (cherry picked from commit a3673f8c3b3152c5fdef7313693ef16654ea3931) --- .../local/subscription/ImportConfirmationDialog.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java b/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java index aa15b26d8..b586ad3e1 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java @@ -18,7 +18,7 @@ import org.schabi.newpipe.R; public class ImportConfirmationDialog extends DialogFragment { @State protected Intent resultServiceIntent; - static final String EXTRA_RESULT_SERVICE_INTENT = "extra_result_service_intent"; + private static final String EXTRA_RESULT_SERVICE_INTENT = "extra_result_service_intent"; public static void show(@NonNull final Fragment fragment, @NonNull final Intent resultServiceIntent) { @@ -49,13 +49,7 @@ public class ImportConfirmationDialog extends DialogFragment { public void onCreate(@Nullable final Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (getArguments() != null) { - resultServiceIntent = getArguments().getParcelable(EXTRA_RESULT_SERVICE_INTENT); - } - - if (resultServiceIntent == null) { - throw new IllegalStateException("Result intent is null"); - } + resultServiceIntent = requireArguments().getParcelable(EXTRA_RESULT_SERVICE_INTENT); Bridge.restoreInstanceState(this, savedInstanceState); } From a83762c4d7ef5b7e2432fe76eb6f1cf47c6be6bf Mon Sep 17 00:00:00 2001 From: Siddhesh Dhainje Date: Thu, 8 Jan 2026 21:31:31 +0530 Subject: [PATCH 122/190] Removed restoreInstanceState and resultServiceIntent condition (cherry picked from commit 418e34172a8528437c9cd1c6097503dbb053b61f) --- .../local/subscription/ImportConfirmationDialog.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java b/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java index b586ad3e1..0067e1154 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java @@ -10,13 +10,11 @@ import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; -import com.evernote.android.state.State; import com.livefront.bridge.Bridge; import org.schabi.newpipe.R; public class ImportConfirmationDialog extends DialogFragment { - @State protected Intent resultServiceIntent; private static final String EXTRA_RESULT_SERVICE_INTENT = "extra_result_service_intent"; @@ -37,9 +35,7 @@ public class ImportConfirmationDialog extends DialogFragment { .setCancelable(true) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.ok, (dialogInterface, i) -> { - if (resultServiceIntent != null && getContext() != null) { - getContext().startService(resultServiceIntent); - } + requireContext().startService(resultServiceIntent); dismiss(); }) .create(); @@ -50,8 +46,6 @@ public class ImportConfirmationDialog extends DialogFragment { super.onCreate(savedInstanceState); resultServiceIntent = requireArguments().getParcelable(EXTRA_RESULT_SERVICE_INTENT); - - Bridge.restoreInstanceState(this, savedInstanceState); } @Override From df92431ee3b1ea3f80069a04f43f62e56a935aa2 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 9 Jan 2026 15:15:58 +0100 Subject: [PATCH 123/190] Translated using Weblate (Bengali (India)) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 39.2% (300 of 764 strings) Translated using Weblate (Lombard) Currently translated at 0.3% (3 of 764 strings) Translated using Weblate (French) Currently translated at 75.8% (66 of 87 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Tigrinya) Currently translated at 21.8% (167 of 764 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Belarusian) Currently translated at 99.0% (757 of 764 strings) Translated using Weblate (Slovak) Currently translated at 77.0% (67 of 87 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Bulgarian) Currently translated at 3.4% (3 of 87 strings) Translated using Weblate (Santali) Currently translated at 1.1% (1 of 87 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (German) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (Turkish) Currently translated at 33.3% (29 of 87 strings) Translated using Weblate (Punjabi) Currently translated at 78.1% (68 of 87 strings) Translated using Weblate (German) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (French) Currently translated at 74.7% (65 of 87 strings) Translated using Weblate (French) Currently translated at 74.7% (65 of 87 strings) Translated using Weblate (Czech) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (Slovak) Currently translated at 74.7% (65 of 87 strings) Translated using Weblate (Hindi) Currently translated at 77.0% (67 of 87 strings) Translated using Weblate (Punjabi) Currently translated at 68.9% (60 of 87 strings) Co-authored-by: 135 <135135@users.noreply.hosted.weblate.org> Co-authored-by: Balázs Meskó Co-authored-by: Ding User Co-authored-by: Dizro Co-authored-by: Erenay Co-authored-by: Femini Co-authored-by: Fjuro Co-authored-by: Hosted Weblate Co-authored-by: Kuko Co-authored-by: MatthieuPh Co-authored-by: Mickaël Binos Co-authored-by: Milan Co-authored-by: Prasanta-Hembram Co-authored-by: STV Co-authored-by: ShareASmile Co-authored-by: Sumon Kayal Co-authored-by: Trunars Co-authored-by: VfBFan Co-authored-by: whistlingwoods <72640314+whistlingwoods@users.noreply.github.com> Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/bg/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pa/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sat/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/tr/ Translation: NewPipe/Metadata --- app/src/main/res/values-az/strings.xml | 2 +- app/src/main/res/values-be/strings.xml | 1 + app/src/main/res/values-bn-rIN/strings.xml | 4 ++ app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-hi/strings.xml | 34 +++++++++-- app/src/main/res/values-hu/strings.xml | 2 +- app/src/main/res/values-lmo/strings.xml | 1 + app/src/main/res/values-pa/strings.xml | 57 +++++++++---------- app/src/main/res/values-sk/strings.xml | 16 +++--- app/src/main/res/values-ti/strings.xml | 15 +++++ .../metadata/android/bg/changelogs/63.txt | 8 --- .../metadata/android/cs/changelogs/1005.txt | 22 +++---- .../metadata/android/de/changelogs/986.txt | 17 +++--- .../metadata/android/de/changelogs/987.txt | 18 +++--- .../metadata/android/de/changelogs/997.txt | 15 +++-- .../metadata/android/de/changelogs/999.txt | 4 +- .../metadata/android/fr/changelogs/1000.txt | 24 ++++---- .../metadata/android/fr/changelogs/1003.txt | 12 ++-- .../metadata/android/fr/changelogs/1005.txt | 18 +++--- .../metadata/android/fr/changelogs/65.txt | 2 +- .../metadata/android/fr/changelogs/70.txt | 2 +- .../metadata/android/hi/changelogs/1000.txt | 4 -- .../metadata/android/hi/changelogs/1002.txt | 1 - .../metadata/android/hi/changelogs/1004.txt | 4 +- .../metadata/android/hi/changelogs/1005.txt | 22 ++++--- .../metadata/android/hi/changelogs/1006.txt | 15 +++++ .../metadata/android/hi/changelogs/65.txt | 29 +++------- .../metadata/android/hi/changelogs/66.txt | 42 +++++--------- .../metadata/android/hi/changelogs/68.txt | 40 +++++-------- .../metadata/android/hi/changelogs/69.txt | 28 ++++----- .../metadata/android/hi/changelogs/70.txt | 34 ++++------- .../metadata/android/hi/changelogs/71.txt | 15 ++--- .../metadata/android/hi/changelogs/740.txt | 29 +++------- .../metadata/android/hi/changelogs/750.txt | 31 ++++------ .../metadata/android/hi/changelogs/760.txt | 50 ++++------------ .../metadata/android/hi/changelogs/790.txt | 21 +++---- .../metadata/android/hi/changelogs/800.txt | 31 +++------- .../metadata/android/hi/changelogs/810.txt | 26 +++------ .../metadata/android/hi/changelogs/840.txt | 28 +++------ .../metadata/android/hi/changelogs/930.txt | 26 ++++----- .../metadata/android/hi/changelogs/940.txt | 24 ++++---- .../metadata/android/hi/changelogs/951.txt | 24 ++++---- .../metadata/android/hi/changelogs/995.txt | 4 +- .../metadata/android/hi/changelogs/997.txt | 3 - .../metadata/android/pa/changelogs/1000.txt | 8 +-- .../metadata/android/pa/changelogs/1004.txt | 4 +- .../metadata/android/pa/changelogs/1005.txt | 21 +++---- .../metadata/android/pa/changelogs/1006.txt | 15 +++++ .../metadata/android/pa/changelogs/65.txt | 14 ++++- .../metadata/android/pa/changelogs/66.txt | 22 ++++++- .../metadata/android/pa/changelogs/68.txt | 20 ++++++- .../metadata/android/pa/changelogs/69.txt | 16 +++++- .../metadata/android/pa/changelogs/70.txt | 11 +++- .../metadata/android/pa/changelogs/71.txt | 9 ++- .../metadata/android/pa/changelogs/740.txt | 9 ++- .../metadata/android/pa/changelogs/750.txt | 10 +++- .../metadata/android/pa/changelogs/760.txt | 11 +++- .../metadata/android/pa/changelogs/780.txt | 12 +++- .../metadata/android/pa/changelogs/790.txt | 12 +++- .../metadata/android/pa/changelogs/800.txt | 11 +++- .../metadata/android/pa/changelogs/810.txt | 12 +++- .../metadata/android/pa/changelogs/840.txt | 11 +++- .../metadata/android/pa/changelogs/920.txt | 10 +++- .../metadata/android/pa/changelogs/930.txt | 15 ++++- .../metadata/android/pa/changelogs/940.txt | 15 ++++- .../metadata/android/pa/changelogs/951.txt | 24 ++++---- .../metadata/android/pa/changelogs/954.txt | 15 ++--- .../metadata/android/pa/changelogs/957.txt | 17 +++--- .../metadata/android/pa/changelogs/964.txt | 7 ++- .../metadata/android/pa/changelogs/975.txt | 5 +- .../metadata/android/pa/changelogs/976.txt | 11 +--- .../metadata/android/pa/changelogs/986.txt | 18 +++--- .../metadata/android/pa/changelogs/987.txt | 4 +- .../metadata/android/pa/changelogs/990.txt | 21 +++---- .../metadata/android/pa/changelogs/995.txt | 8 +-- .../metadata/android/pa/changelogs/997.txt | 2 - .../android/sat/short_description.txt | 1 + .../metadata/android/sk/changelogs/1005.txt | 31 +++++----- .../metadata/android/sk/changelogs/1006.txt | 28 ++++----- .../metadata/android/sk/changelogs/65.txt | 46 +++++++-------- .../metadata/android/sk/changelogs/66.txt | 54 +++++++++--------- .../metadata/android/tr/changelogs/1005.txt | 16 +++--- 82 files changed, 717 insertions(+), 666 deletions(-) delete mode 100644 fastlane/metadata/android/bg/changelogs/63.txt create mode 100644 fastlane/metadata/android/hi/changelogs/1006.txt create mode 100644 fastlane/metadata/android/pa/changelogs/1006.txt create mode 100644 fastlane/metadata/android/sat/short_description.txt diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 6f14202e1..689cf4937 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -585,7 +585,7 @@ Serveri təsdiqləmək mümkün olmadı %s-də bəyəndiyiniz serverləri tapın Video \"Təfsilatlar\" səhifəsində fon və ya ani görüntü düyməsin basarkən ipucu göstər - Oynadıcı titr mətn miqyasını və arxa fon üslublarını dəyişdir. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur + Oynadıcı titr mətn miqyasını və arxa plan üslublarını dəyişdir. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur Xəta baş verdi: %1$s Fayl mövcud deyil, yaxud oxumaq və ya yazmaq icazəsi yoxdur Veb saytı təhlil etmək alınmadı diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 8732e45d9..ef7ef98c3 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -831,4 +831,5 @@ Трэнды – фільмы і перадачы Гэты кантэнт недаступны для цяперашняй краіны кантэнту.\n\nЯе можна змяніць праз «Налады > Кантэнт > Прадвызначаная краіна кантэнту». 21 ліпеня 2025 года YouTube спыніў падтрымку аб\'яднанай старонкі трэндаў. NewPipe замяніў старонку трэндаў на трэнды трансляцый.\n\nТаксама можна выбраць іншыя старонкі трэндаў праз «Налады > Кантэнт > Змесціва галоўнай старонкі». + Аб\'яднаныя трэнды YouTube выдалены diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index e6269b5b9..a79319ee3 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -307,4 +307,8 @@ বিজ্ঞপ্তিতে প্রদর্শিত ভিডিও থাম্বনেল 16:9 থেকে 1:1 অনুপাতের করুন (বিকৃতি দেখা যেতে পারে) অদলবদল কিছু না + হ্যাঁ + না + সার্চ + খুঁজুন diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 627e755f6..b36b8555b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -837,7 +837,7 @@ Beliebte Filme und Shows Beliebte Musik Beliebte Podcasts - YouTube hat den geteilten Feed entfernt + YouTube hat die kombinierten „beliebten Seiten“ entfernt YouTube hat die kombinierte Trending-Seite ab dem 21. Juli 2025 eingestellt. NewPipe hat die Standard-Trending-Seite durch die Trending-Livestreams ersetzt.\n\nDu kannst auch verschiedene Trendseiten unter „Einstellungen > Inhalt > Inhalt der Hauptseite“ auswählen. Um den Pop-up-Player zu verwenden, bitte in den folgenden Android-Einstellungen %1$s auswählen und %2$s aktivieren. „Über anderen Apps einblenden“ diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index dd23cfc08..d2e6a422e 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -74,7 +74,7 @@ देखे गए वीडियोज़ की सूची रखें प्लेबैक फिर से शुरू करें रुकावटें (जैसे कि फ़ोन कॉल) खत्म होने के बाद वीडियो प्ले जारी रखें - \'अगले\' और \'सबंधित\' वीडियो दिखाएं + \'अगला\' और \'संबंधित\' वीडियो दिखाएं \"कतार में जोड़ने के लिए स्पर्श बनाये रखें\" दिखाएं जब बैकग्राउंड और पॉपअप बटन वीडियो के विवरण पन्ने में दबाई जाए तो सलाह दिखाएं असमर्थित URL @@ -93,7 +93,7 @@ बंद किया साफ करें उत्तम रिजॉल्युशन - वापिस + अन-डू करें सभी प्ले करें न्यूपाइप की नोटीफिकेशन न्यूपाइप के प्लेयर के लिए नोटीफिकेशन @@ -104,7 +104,7 @@ वैबसाइट parse नहीं हो सकी विषय वस्तु उपलब्ध नहीं है डाउनलोड मेनू स्थापित नहीं किया जा सका - APP/UI करैश हो गई + ऐप/UI करैश हो गई इस वीडियो को चलाने में असफल हुए अनचाही वीडियो प्लेयर त्रुटी आयी है वीडियो प्लेयर त्रुटी से ठीक हो रहा है @@ -391,7 +391,7 @@ प्लेबैक स्थानों को मिटाएं सारे प्लेबैक स्थानों को मिटाता है सारे प्लेबैक स्थानों को मिटाएं\? - निपटान के बाद खंड या गतिविधि जीवन चक्र के बाहर अविभाज्य आरएक्स अपवादों की रिपोर्टिंग को बलपूर्वक लागू करें + हैंडलिंग के बाद फ्रैगमेंट या एक्टिविटी लूप के बाहर अनहैंडल्ड Rx एक्सेप्शन की रिपोर्टिंग को बलपूर्वक लागू करें साउंडक्लाउड प्रोफाइल निर्यात करने के लिए आईडी या युआरएल दीजिये: \n \n1. अपने वेब ब्राउज़र में \"डेस्कटॉप मोड\" चालू करें (वेबसाइट मोबाइल उपकरणों के लिए उपलब्ध नहीं है) @@ -406,7 +406,7 @@ ग्रिड ऑटो त्रुटि दिखाएं - सर्वर मल्टी थ्रेडेड डाउनलोड स्वीकार नहीं करता, पुनः कोशिश करे @string/msg_threads = 1 के साथ + सर्वर मल्टी थ्रेडेड डाउनलोड स्वीकार नहीं करता, @string/msg_threads = 1 के साथ पुनः कोशिश करें \'स्टोरेज एक्सेस फ्रेमवर्क\' आपको बाहरी एसडी कार्ड पर डाउनलोड करने देता है सेवा चुनें, वर्तमान चुनाव : डिफ़ॉल्ट कियोस्क @@ -502,7 +502,7 @@ अनगिनत विडीओज़ 100+ विडीओज़ विवरण - संबंधित स्ट्रीमस + संबंधित आइटम्स टिप्पणियाँ कृपया जांचें लें कि क्या आपके क्रैश पर चर्चा करने वाला मुद्दा पहले से मौजूद है। डुप्लिकेट टिकट बनाते समय, आप हमसे समय लेते हैं जो हम वास्तविक बग को ठीक करने के लिए खर्च कर सकते हैं। गिटहब पर रिपोर्ट करें @@ -828,4 +828,26 @@ चैनल समूह पेज पसंद यूट्यूब अस्थायी प्लेलिस्ट के रूप में साझा करें + एंटरी मिटा दी गई + फाईल डिलीट करें + एंटरी मिटाऐं + %sहज़ार + पॉपअप प्लेयर इस्तेमाल करने के लिए, कृपया नीचे दिए गए Android सेटिंग्स मेनू में %1$s चुनें और %2$s चालू करें। + “अन्य ऐप्स पर डिस्प्ले की अनुमति दें” + %sमिलीअन + %sअरब + अकाउंट बंद कर दिया गया\n\n%1$s यह कारण बताता है: %2$s + साउंडक्लाउड टॉप 50 पेज हटा दिया गया + साउंडक्लाउड ने ओरिजिनल टॉप 50 चार्ट बंद कर दिए हैं। इससे जुड़ा टैब आपके मेन पेज से हटा दिया गया है। + YouTube कंबाइंड ट्रेंडिंग हटा दी गई + YouTube ने 21 जुलाई 2025 से कंबाइंड ट्रेंडिंग पेज बंद कर दिया है। NewPipe ने डिफ़ॉल्ट ट्रेंडिंग पेज को ट्रेंडिंग लाइवस्ट्रीम से बदल दिया है।\n\nआप \"सेटिंग्स > कंटेंट > मेन पेज कंटेंट\" में अलग-अलग ट्रेंडिंग पेज भी चुन सकते हैं। + गेमिंग ट्रेंडस + ट्रेंडिंग पॉडकास्ट + ट्रेंडिंग फिल्में और शो + ट्रेंडिंग संगीत + पले करते समय सर्वर से HTTP error 403 मिला, शायद स्ट्रीमिंग URL एक्सपायर होने या IP बैन की वजह से हुआ + पले करते समय सर्वर से HTTP error %1$s मिला + पले करते समय सर्वर से HTTP error 403 मिला, जो शायद IP बैन या स्ट्रीमिंग URL डीओबफस्केशन की दिक्कतों की वजह से हुआ है + %1$s ने डेटा देने से मना कर दिया, और यह कन्फर्म करने के लिए लॉगिन मांगा कि रिक्वेस्ट करने वाला बोट नहीं है।\n\nहो सकता है कि %1$s ने आपके IP को कुछ समय के लिए बैन कर दिया हो, आप कुछ समय इंतज़ार कर सकते हैं या किसी दूसरे IP पर स्विच कर सकते हैं (जैसे VPN ऑन/ऑफ करके, या WiFi से मोबाइल डेटा पर स्विच करके)। + यह कंटेंट अभी चुने गए देश के कंटेंट के लिए उपलब्ध नहीं है।\n\n\"सेटिंग्स > कंटेंट > डिफ़ॉल्ट कंटेंट देश\" से अपना चुनाव बदलें। diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index d114a2d33..12778fd32 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -817,7 +817,7 @@ Bejegyzés törölve Fiók megszüntetve\n\n%1$s az alábbi ok miatt: %2$s A lejátszás közben a kiszolgáló 403-as HTTP-hibát adott vissza, valószínűleg a közvetítési hivatkozás érvényessége lejárt vagy a IP-tiltás miatt - HTTP-hiba %1$s érkezett a kiszolgáltól a lejátszás közben + HTTP-hiba (%1$s) érkezett a kiszolgálótól a lejátszás során HTTP 403-as hiba érkezett a kiszolgálótól a lejátszás közben, valószínűleg IP-tiltás vagy a közvetítési hivatkozás feloldási problémák miatt %1$s visszautasította az adatok szolgáltatását, és bejelentkezést kér annak megerősítésére, hogy a kérés nem robot által érkezik.\n\nElőfordulhat, hogy az IP-címét ideiglenesen letiltotta %1$s, várhat egy keveset, vagy váltson egy másik IP-címre (például VPN be-/kikapcsolásával, vagy Wi-Fi-ről mobiladat-forgalomra váltva). Ez a tartalom a jelenleg kiválasztott tartalom országában nem elérhető.\n\nVáltoztassa meg a „Beállítások > Tartalom >Tartalom alapértelmezett országa” menüpontban. diff --git a/app/src/main/res/values-lmo/strings.xml b/app/src/main/res/values-lmo/strings.xml index 6f681ac08..80f3dd9c6 100644 --- a/app/src/main/res/values-lmo/strings.xml +++ b/app/src/main/res/values-lmo/strings.xml @@ -1,4 +1,5 @@ Pigia la lente per inziaa. + Canai diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index eb6ee58a2..a937fbf86 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -29,7 +29,7 @@ ਨਵਾਂ ਕੀ ਹੈ ਬੈਕਗ੍ਰਾਊਂਡ ਪੌਪ-ਅਪ - ਵਿੱਚ ਸ਼ਾਮਿਲ ਕਰੋ + ਦੇ ਵਿੱਚ ਜੋੜ੍ਹੋ ਵੀਡੀਓ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਇੱਥੇ ਜਮ੍ਹਾਂ ਹੁੰਦੀਆਂ ਹਨ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੁਣੋ @@ -93,7 +93,7 @@ ਬੰਦ ਕੀਤਾ ਸਾਫ ਕਰੋ ਵਧੀਆ ਰੈਜ਼ੋਲਿਊਸ਼ਨ - ਵਾਪਿਸ + ਅਣ-ਕੀਤਾ ਕਰੋ ਸਾਰੇ ਚਲਾਓ ਹਮੇਸ਼ਾਂ ਸਿਰਫ਼ ਇਸ ਬਾਰ @@ -184,8 +184,7 @@ ਕ੍ਰਿਪਾ ਕਰਕੇ ਉਡੀਕ ਕਰੋ… ਕਲਿਪ-ਬੋਰਡ ਵਿੱਚ ਕਾਪੀ ਹੋ ਗਿਆ ਹੈ ਬਾਅਦ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਵਿਚੋਂ ਇੱਕ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਨੂੰ ਚੁਣੋ - ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਖੋਲ੍ਹਣ ਵਾਸਤੇ -\nਇਸ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ + ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਖੋਲ੍ਹਣ ਵਾਸਤੇ\nਇਸ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ 1 ਆਈਟਮ ਮਿਟਾਈ ਗਈ। ReCaptcha ਚੁਣੌਤੀ ReCaptcha ਚੁਣੌਤੀ ਲਈ ਬੇਨਤੀ @@ -278,36 +277,19 @@ ਪਿੱਛਲਾ ਐਕਸਪੋਰਟ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਨਹੀਂ ਹੋ ਸਕੀਆਂ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਐਕਸਪੋਰਟ ਨਹੀਂ ਹੋ ਸਕੀਆਂ - ਗੂਗਲ ਟੇਕਅਊਟ ਤੋਂ ਯੂਟਿਊਬ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਐਕਸਪੋਰਟ ਫਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ: -\n -\n1. ਇਸ URL ਤੇ ਜਾਓ: %1$s -\n2. ਮੰਗਣ ਤੇ ਆਪਣੇ ਖਾਤੇ \'ਚ ਲਾਗ-ਇਨ ਕਰੋ -\n3. ਕਲਿੱਕ ਕਰੋ \" All data incuded\" ਤੇ, ਫੇਰ \"Deselect all\" ਤੇ ਫੇਰ ਸਿਰਫ \"subscriprion\" ਚੁਣੋ ਅਤੇ \"OK\" ਕਰੋ -\n4. \"Next step\" ਤੇ ਕਲਿੱਕ ਕਰੋ ਤੇ ਫੇਰ \"create export\" ਤੇ -\n5. ਡਾਊਨਲੋਡ ਬਟਨ ਦਿਖਾਈ ਦੇਣ ਤੇ ਇਸ ਤੇ ਕਲਿੱਕ ਕਰੋ।ਇੱਕ ਡਾਉਨਲੋਡ ਸ਼ੁਰੂ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ (ਇਹੀ ਐਕਸਪੋਰਟ ਫਾਈਲ ਹੈ) -\n6. ਥੱਲੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰੋ ਤੇ ਡਾਊਨਲੋਡ ਕੀਤੀ .zip ਫਾਈਲ ਚੁਣੋ -\n7. [ਜੇ .zip ਤੋਂ ਐਕਸਪੋਰਟ ਫੇਲ ਹੋ ਜਾਂਦੀ ਹੈ] ਤਾਂ .csv ਫਾਈਲ ਐਕਸਟਰੈਕਟ ਕਰੋ (ਆਮ ਤੌਰ ਤੇ \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), ਥੱਲੇ ਦਿੱਤੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰਕੇ ਐਕਸਟਰੈਕਟ ਕੀਤੀ csv ਫਾਈਲ ਚੁਣੋ - URL ਜਾਂ ਆਪਣੀ ID ਟਾਈਪ ਕਰਕੇ ਸਾਉੰਡ ਕਲਾਉਡ ਪ੍ਰੋਫਾਈਲ ਇੰਪੋਰਟ ਕਰੋ: -\n -\n1. ਇੱਕ ਵੈਬ-ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ \"ਡੈਸਕਟਾਪ ਮੋਡ\" ਨੂੰ ਚਾਲੂ ਕਰੋ (ਸਾਈਟ ਮੋਬਾਈਲ ਉਪਕਰਣਾਂ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ) -\n2. ਇਸ URL ਤੇ ਜਾਓ: %1$s -\n3. ਆਪਣੇ ਖਾਤੇ ਚ ਲੌਗ-ਇਨ ਕਰੋ -\n4. ਨਿਰਦੇਸ਼ਤ ਕੀਤੇ ਗਏ ਪ੍ਰੋਫਾਈਲ URL ਨੂੰ ਕਾਪੀ ਕਰੋ. + ਗੂਗਲ ਟੇਕਆਊਟ ਤੋਂ ਯੂਟਿਊਬ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਐਕਸਪੋਰਟ ਫਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ:\n\n1. ਇਸ URL ਤੇ ਜਾਓ: %1$s\n2. ਮੰਗਣ ਤੇ ਆਪਣੇ ਖਾਤੇ \'ਚ ਲਾਗ-ਇਨ ਕਰੋ\n3. ਕਲਿੱਕ ਕਰੋ \" All data incuded\" ਤੇ, ਫੇਰ \"Deselect all\" ਤੇ ਫੇਰ ਸਿਰਫ \"subscriprion\" ਚੁਣੋ ਅਤੇ \"OK\" ਕਰੋ\n4. \"Next step\" ਤੇ ਕਲਿੱਕ ਕਰੋ ਅਤੇ ਫੇਰ \"create export\" ਤੇ\n5. ਡਾਊਨਲੋਡ ਬਟਨ ਦਿਖਾਈ ਦੇਣ ਤੇ ਇਸ ਤੇ ਕਲਿੱਕ ਕਰੋ। ਇੱਕ ਡਾਉਨਲੋਡ ਸ਼ੁਰੂ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ (ਇਹੀ ਐਕਸਪੋਰਟ ਫਾਈਲ ਹੈ)\n6. ਥੱਲੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰੋ ਤੇ ਡਾਊਨਲੋਡ ਕੀਤੀ .zip ਫਾਈਲ ਚੁਣੋ\n7. [ਜੇ .zip ਤੋਂ ਐਕਸਪੋਰਟ ਫੇਲ ਹੋ ਜਾਂਦੀ ਹੈ] ਤਾਂ .csv ਫਾਈਲ ਐਕਸਟਰੈਕਟ ਕਰੋ (ਆਮ ਤੌਰ ਤੇ \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), ਥੱਲੇ ਦਿੱਤੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰਕੇ ਐਕਸਟਰੈਕਟ ਕੀਤੀ csv ਫਾਈਲ ਚੁਣੋ + URL ਜਾਂ ਆਪਣੀ ID ਟਾਈਪ ਕਰਕੇ ਸਾਉੰਡ ਕਲਾਉਡ ਪ੍ਰੋਫਾਈਲ ਇੰਪੋਰਟ ਕਰੋ: \n \n1. ਇੱਕ ਵੈਬ-ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ \"ਡੈਸਕਟਾਪ ਮੋਡ\" ਨੂੰ ਚਾਲੂ ਕਰੋ (ਸਾਈਟ ਮੋਬਾਈਲ ਉਪਕਰਣਾਂ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ) \n2. ਇਸ URL ਤੇ ਜਾਓ: %1$s \n3. ਆਪਣੇ ਖਾਤੇ ਚ ਲੌਗ-ਇਨ ਕਰੋ \n4. ਨਿਰਦੇਸ਼ਤ ਕੀਤੇ ਗਏ ਪ੍ਰੋਫਾਈਲ URL ਨੂੰ ਕਾਪੀ ਕਰੋ। ਤੁਹਾਡੀ ਆਈਡੀ, soundcloud.com/ਤੁਹਾਡੀ ਆਈਡੀ - ਯਾਦ ਰੱਖੋ ਕਿ ਇਸ ਕਾਰਜ ਨਾਲ ਡਾਟਾ ਖਪਤ ਹੋ ਸਕਦਾ ਹੈ। -\n -\nਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਯਾਦ ਰੱਖੋ ਕਿ ਇਸ ਕਾਰਜ ਨਾਲ ਡਾਟਾ ਖਪਤ ਹੋ ਸਕਦਾ ਹੈ।\n\nਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਪਲੇਅਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ ਤਾਲ ਪਿੱਚ ਅਲਹਿਦਾ ਕਰੋ (ਵਿਗਾੜ ਪੈ ਸਕਦਾ ਹੈ) ਕੀ ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਵੀ ਇੰਪੋਰਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ\? ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ - ਨਿਊਪਾਈਪ ਪ੍ਰੋਜੈਕਟ ਤੁਹਾਡੀ ਗੋਪਨੀਯਤਾ ਨੂੰ ਬਹੁਤ ਗੰਭੀਰਤਾ ਨਾਲ ਲੈਂਦਾ ਹੈ। ਇਸ ਲਈ ਐਪ ਤੁਹਾਡੀ ਸਹਿਮਤੀ ਤੋਂ ਬਿਨਾਂ ਕੋਈ ਵੀ ਡਾਟਾ ਇੱਕਠਾ ਨਹੀਂ ਕਰਦਾ। -\nਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵਿਸਥਾਰ ਵਿੱਚ ਦੱਸਦੀ ਹੈ ਕਿ ਜਦੋਂ ਤੁਸੀਂ ਕਰੈਸ਼ ਰਿਪੋਰਟ ਭੇਜਦੇ ਹੋ ਤਾਂ ਕਿਹੜਾ ਡਾਟਾ ਭੇਜਿਆ ਜਾਂ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। + ਨਿਊਪਾਈਪ ਪ੍ਰੋਜੈਕਟ ਤੁਹਾਡੀ ਗੋਪਨੀਯਤਾ ਨੂੰ ਬਹੁਤ ਗੰਭੀਰਤਾ ਨਾਲ ਲੈਂਦਾ ਹੈ। ਇਸ ਲਈ ਐਪ ਤੁਹਾਡੀ ਸਹਿਮਤੀ ਤੋਂ ਬਿਨਾਂ ਕੋਈ ਵੀ ਡਾਟਾ ਇੱਕਠਾ ਨਹੀਂ ਕਰਦਾ।\nਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵਿਸਥਾਰ ਵਿੱਚ ਦੱਸਦੀ ਹੈ ਕਿ ਜਦੋਂ ਤੁਸੀਂ ਕਰੈਸ਼ ਰਿਪੋਰਟ ਭੇਜਦੇ ਹੋ ਤਾਂ ਕਿਹੜਾ ਡਾਟਾ ਭੇਜਿਆ ਜਾਂ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਪੜ੍ਹੋ - ਯੂਰਪੀਅਨ ਜਨਰਲ ਡੇਟਾ ਪ੍ਰੋਟੈਕਸ਼ਨ ਰੈਗੂਲੇਸ਼ਨ (ਜੀਡੀਪੀਆਰ) ਦੀ ਪਾਲਣਾ ਕਰਨ ਲਈ, ਅਸੀਂ ਤੁਹਾਡਾ ਧਿਆਨ ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵੱਲ ਖਿੱਚਦੇ ਹਾਂ। ਕਿਰਪਾ ਕਰਕੇ ਇਸਨੂੰ ਧਿਆਨ ਨਾਲ ਪੜ੍ਹੋ। -\nਸਾਨੂੰ ਨੁਕਸ ਰਿਪੋਰਟ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਸਵੀਕਾਰ ਕਰਨਾ ਹੋਵੇਗਾ। + ਯੂਰਪੀਅਨ ਜਨਰਲ ਡੇਟਾ ਪ੍ਰੋਟੈਕਸ਼ਨ ਰੈਗੂਲੇਸ਼ਨ (ਜੀਡੀਪੀਆਰ) ਦੀ ਪਾਲਣਾ ਕਰਨ ਲਈ, ਅਸੀਂ ਤੁਹਾਡਾ ਧਿਆਨ ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵੱਲ ਖਿੱਚਦੇ ਹਾਂ। ਕਿਰਪਾ ਕਰਕੇ ਇਸਨੂੰ ਧਿਆਨ ਨਾਲ ਪੜ੍ਹੋ।\nਸਾਨੂੰ ਨੁਕਸ ਰਿਪੋਰਟ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਸਵੀਕਾਰ ਕਰਨਾ ਹੋਵੇਗਾ। ਸਵੀਕਾਰ ਕਰੋ ਅਸਵੀਕਾਰ ਕੋਈ ਸੀਮਾ ਨਹੀਂ @@ -512,8 +494,7 @@ %d ਸਕਿੰਟ ਹਾਂ, ਅਤੇ ਅੱਧ-ਪਚੱਧੀਆਂ ਵੇਖੀਆਂ ਹੋਈਆਂ ਵੀ - ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਿਲ, ਪਹਿਲਾਂ ਚਾਹੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੇ ਜਾ ਚੁੱਕੇ ਵੀਡੀਓ ਹਟਾ ਦਿੱਤੇ ਜਾਣਗੇ। -\nਕੀ ਵਾਕਿਆ ਹੀ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਮੋੜਿਆ ਜਾ ਸਕਣਾ! + ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਿਲ ਪਹਿਲਾਂ ਤੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੇ ਜਾ ਚੁੱਕੇ ਵੀਡੀਓ ਹਟਾ ਦਿੱਤੇ ਜਾਣਗੇ। \nਕੀ ਵਾਕਿਆ ਹੀ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਣਾ! ਵੇਖੇ ਹੋਏ ਵੀਡੀਓ ਹਟਾ ਦੇਈਏ\? ਵੇਖੇ ਹੋਏ ਨੂੰ ਹਟਾਓ ਸਿਸਟਮ ਡਿਫ਼ਾਲਟ @@ -554,7 +535,7 @@ ਕੋਈ ਸਰੋਤਾ ਨਹੀਂ ਸੁਣ ਰਿਹਾ ਕੋਈ ਦਰਸ਼ਕ ਨਹੀਂ ਵੇਖ ਰਿਹਾ ਵੇਰਵਾ - ਸਬੰਧਤ ਨਗ + ਸਬੰਧਤ ਆਈਟਮਾਂ ਟਿੱਪਣੀਆਂ ਗਿਟਹੱਬ \'ਤੇ ਜਾ ਕੇ ਇਤਲਾਹ ਦਿਓ ਦੂਜੀਆਂ ਐਪਾਂ ਦੇ ਉੱਤੇ ਵਿਖਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ @@ -832,4 +813,22 @@ ਐਂਟਰੀ ਮਿਟਾਓ ਖ਼ਾਤਾ ਬੰਦ ਕੀਤਾ ਗਿਆ\n\n%1$s ਇਹ ਕਾਰਨ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ: %2$s ਐਂਟਰੀ ਮਿਟਾ ਦਿੱਤੀ ਗਈ + ਪੌਪਅੱਪ ਪਲੇਅਰ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਹੇਠਾਂ ਦਿੱਤੇ Android ਸੈਟਿੰਗ ਮੀਨੂ ਵਿੱਚ %1$s ਚੁਣੋ ਅਤੇ %2$s ਨੂੰ ਇਨੇਬਲ ਕਰੋ। + \"ਹੋਰ ਐਪਾਂ ਉੱਤੇ ਡਿਸਪਲੇ ਦੀ ਆਗਿਆ ਦਿਓ\" + %sਹਜ਼ਾਰ + %sਮਿਲੀਅਨ + %sਅਰਬ + SoundCloud ਟੌਪ 50 ਪੰਨਾ ਹਟਾ ਦਿੱਤਾ ਗਿਆ + SoundCloud ਨੇ ਮੂਲ ਟੌਪ 50 ਚਾਰਟਾਂ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। ਸੰਬੰਧਿਤ ਟੈਬ ਨੂੰ ਤੁਹਾਡੇ ਮੁੱਖ ਪੰਨੇ ਤੋਂ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ। + YouTube ਸੰਯੁਕਤ ਰੁਝਾਨ ਹਟਾਇਆ ਗਿਆ + YouTube ਨੇ 21 ਜੁਲਾਈ 2025 ਤੋਂ ਸੰਯੁਕਤ \"ਰੁਝਾਨ ਵਿੱਚ\" ਪੰਨੇ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। NewPipe ਨੇ ਡਿਫ਼ਾਲਟ \"ਰੁਝਾਨ ਵਿੱਚ\" ਪੰਨੇ ਨੂੰ ਟ੍ਰੈਂਡਿੰਗ ਲਾਈਵਸਟ੍ਰੀਮਾਂ ਨਾਲ ਬਦਲ ਦਿੱਤਾ ਹੈ।\n\nਤੁਸੀਂ \"ਸੈਟਿੰਗਾਂ > ਸਮੱਗਰੀ > ਮੁੱਖ ਪੰਨੇ ਦੀ ਸਮੱਗਰੀ\" ਵਿੱਚ ਵੱਖ-ਵੱਖ ਟ੍ਰੈਂਡਿੰਗ ਪੰਨਿਆਂ ਨੂੰ ਵੀ ਚੁਣ ਸਕਦੇ ਹੋ। + ਗੇਮਿੰਗ ਟ੍ਰੈਂਡਸ + ਟ੍ਰੈਂਡਿੰਗ ਪੌਡਕਾਸਟ + ਟਰੈਂਡਿੰਗ ਫ਼ਿਲਮਾਂ ਅਤੇ ਸ਼ੋਅ + ਟਰੈਂਡਿੰਗ ਸੰਗੀਤ + ਪਲੇਅ ਕਰਦੇ ਸਮੇਂ ਸਰਵਰ ਤੋਂ HTTP error 403 ਪ੍ਰਾਪਤ ਹੋਇਆ, ਜੋ ਸ਼ਾਇਦ ਸਟ੍ਰੀਮਿੰਗ URL ਦੀ ਮਿਆਦ ਪੁੱਗਣ ਜਾਂ IP ਦੀ ਪਾਬੰਦੀ ਕਾਰਨ ਹੋਈ ਹੈ + ਚਲਾਉਣ ਦੌਰਾਨ ਸਰਵਰ ਤੋਂ HTTP error %1$s ਪ੍ਰਾਪਤ ਹੋਇਆ + ਪਲੇਅ ਕਰਦੇ ਸਮੇਂ ਸਰਵਰ ਤੋਂ HTTP error 403 ਪ੍ਰਾਪਤ ਹੋਇਆ, ਜੋ ਸ਼ਾਇਦ IP ਬੈਨ ਜਾਂ ਸਟ੍ਰੀਮਿੰਗ URL ਡੀਔਬਫਸਕੇਸ਼ਨ ਸਮੱਸਿਆਵਾਂ ਕਾਰਨ ਹੋਈ ਹੈ + %1$s ਨੇ ਡੇਟਾ ਪ੍ਰਦਾਨ ਕਰਨ ਤੋਂ ਇਨਕਾਰ ਕਰ ਦਿੱਤਾ, ਅਤੇ ਇਹ ਪੁਸ਼ਟੀ ਕਰਨ ਲਈ ਲੌਗਇਨ ਕਰਨ ਲਈ ਕਿਹਾ ਕਿ ਬੇਨਤੀਕਰਤਾ ਬੋਟ ਨਹੀਂ ਹੈ।\n\nਹੋ ਸਕਦਾ ਹੈ ਕਿ %1$s ਨੇ ਤੁਹਾਡੇ IP ਨੂੰ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾਈ ਹੋਵੇ, ਤੁਸੀਂ ਕੁਝ ਸਮਾਂ ਉਡੀਕ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ ਕਿਸੇ ਵੱਖਰੇ IP \'ਤੇ ਸਵਿੱਚ ਕਰ ਸਕਦੇ ਹੋ (ਉਦਾਹਰਣ ਵਜੋਂ VPN ਨੂੰ ਚਾਲੂ/ਬੰਦ ਕਰਕੇ, ਜਾਂ WiFi ਤੋਂ ਮੋਬਾਈਲ ਡੇਟਾ \'ਤੇ ਸਵਿੱਚ ਕਰਕੇ)। + ਇਹ ਸਮੱਗਰੀ ਵਰਤਮਾਨ ਵਿੱਚ ਚੁਣੇ ਗਏ ਦੇਸ਼ ਦੀ ਸਮੱਗਰੀ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ।\n\n\"ਸੈਟਿੰਗਾਂ > ਸਮੱਗਰੀ > ਡਿਫ਼ਾਲਟ ਸਮੱਗਰੀ ਦੇਸ਼\" ਤੋਂ ਆਪਣੀ ਚੋਣ ਬਦਲੋ। diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index b41d9fff9..601623cb1 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -45,7 +45,7 @@ Náhľad avataru uploadera Lajky Dislajky - Začnite klepnutím na lupu. + Začnite ťuknutím na lupu. Obsah Zobraziť vekovo obmedzený obsah Naživo @@ -74,7 +74,7 @@ Čakajte prosím… Skopírované do schránky Priečinok na sťahovanie zadefinujte prosím neskôr v nastaveniach - Sťahované súbory + Stiahnuté súbory Stiahnuté Hlásenie o chybe Aplikácia/UP zlyhalo @@ -208,7 +208,7 @@ Neplatný ZIP súbor Upozornenie: Nemožno importovať všetky súbory. Toto prepíše vaše aktuálne nastavenie. - Trendy + Populárne Top 50 Nové a horúce Odstrániť @@ -473,7 +473,7 @@ %d dní Skupiny kanálov - Zdroj naposledy aktualizovaný: %s + Zdroj aktualizovaný: %s Nenačítané: %d Načítavanie zdroja… Spracovávanie zdroja… @@ -845,10 +845,10 @@ SoundCloud prestal používať pôvodnú Top 50. Daná stránka bola odstránená z hlavnej stránky. Odstránené kombinované trendy na YouTube YouTube ukončil prevádzku kombinovanej stránky s trendmi k 21. júlu 2025. NewPipe nahradil predvolenú stránku s trendmi stránkou s trendovými živými prenosmi.\n\nV nastaveniach „Nastavenia > Obsah > Obsah hlavnej stránky“ môžete vybrať aj iné stránky s trendmi. - Ttendy v hrách - Trendové podcasty - Trendové filmy a seriály - Trendová hudba + Populárne hry + Populárne podcasty + Populárne filmy a seriály + Populárna hudba %stis. %smil. %smld. diff --git a/app/src/main/res/values-ti/strings.xml b/app/src/main/res/values-ti/strings.xml index 50a20f494..ccce73524 100644 --- a/app/src/main/res/values-ti/strings.xml +++ b/app/src/main/res/values-ti/strings.xml @@ -170,4 +170,19 @@ ሰሩዞ ስም ቀያር ስሕተት + መፍለዪ + ህዝባዊ + ብሕትነት + ፍቓድታት + ፍቓድ ኣንብብ + ምድብ + ፍቓድ + እዋናዊታት + ኣቫታራት + ባነራት + ዘይተዘርዘረ + ብሕታዊ + ውሽጣዊ + ተኸታተልቲ + መርበብ-ቦታ ክፈት diff --git a/fastlane/metadata/android/bg/changelogs/63.txt b/fastlane/metadata/android/bg/changelogs/63.txt deleted file mode 100644 index be8865e6d..000000000 --- a/fastlane/metadata/android/bg/changelogs/63.txt +++ /dev/null @@ -1,8 +0,0 @@ -### Подобрения -- Импорт/ Експорт на настройки #1333 -- Редуциране на надхвърляне (подобрение на производителността) #1371 -- Малки подобрения в кода #1375 -- Добавяне на всичко за GDPR #1420 - -### Поправени -- Изтегляния: Поправен срив при зареждане на неприключени изтегляния от .giga файлове #1407 diff --git a/fastlane/metadata/android/cs/changelogs/1005.txt b/fastlane/metadata/android/cs/changelogs/1005.txt index 2059e43de..e8efaffad 100644 --- a/fastlane/metadata/android/cs/changelogs/1005.txt +++ b/fastlane/metadata/android/cs/changelogs/1005.txt @@ -1,17 +1,17 @@ -Novinky -• Přidána podpora pro Android Auto. -• Možnost nastavit skupiny kanálů jako záložky na hlavní obrazovce. -• [YouTube] Sdílení jako dočasný seznam skladeb. -• [SoundCloud] Záložka Oblíbené kanály +Nově +• Podpora pro Android Auto +• Možnost nastavit skupiny zdrojů jako záložky +• [YouTube] Sdílení jako dočasný playlist +• [SoundCloud] Záložka Oblíbené u kanálů Vylepšeno -• Lepší nápověda pro vyhledávací lištu -• Zobrazení data stažení v sekci Stažené soubory -• Použití jazyka Android 13 pro jednotlivé aplikace +• Lepší našeptávač vyhledávače +• Zobrazení data stažení ve Stažených +• Použití individuálního jazyka Opraveno • Oprava chybných barev textu v tmavém režimu -• [YouTube] Oprava seznamů skladeb, které nenačtou více než 100 položek +• [YouTube] Oprava nenačtení více než 100 položek v playlistech • [YouTube] Oprava chybějících doporučených videí -• Oprava pádů v zobrazení seznamu historie -• Oprava časových značek v odpovědích na komentáře +• Oprava pádů v Historii +• Oprava časů v odpovědích diff --git a/fastlane/metadata/android/de/changelogs/986.txt b/fastlane/metadata/android/de/changelogs/986.txt index 044365eb8..a1bc3217a 100644 --- a/fastlane/metadata/android/de/changelogs/986.txt +++ b/fastlane/metadata/android/de/changelogs/986.txt @@ -1,16 +1,15 @@ -Neu: +Neu • Benachrichtigungen für neue Streams • Nahtloser Übergang zwischen Hintergrund- und Videoplayer -• Änderung der Tonhöhe um Halbtöne +• Ändern der Tonhöhe um Halbtöne • Warteschlange des Hauptplayers an Wiedergabeliste anfügen -Verbessert: -• Geschwindigkeit/Tonhöhenschrittgröße speichern +Verbessert +• Speichern der Geschwindigkeit/Tonhöhenschrittweite • Anfängliche lange Videoplayer-Pufferung verringert • Player-UI für Android TV -• Löschbestätigung für alle heruntergeladenen Dateien +• Löschbestätigung aller heruntergeladenen Dateien -Behoben: -• Medienschaltfläche blendet die Steuerelemente des Players nicht aus -• Rücksetzung der Wiedergabe bei Änderung des Playertyps -• Drehung des Wiedergabelisten-Dialogs +Behoben +• Medienschaltfläche blendet Player-Steuerelemente nicht aus +• … diff --git a/fastlane/metadata/android/de/changelogs/987.txt b/fastlane/metadata/android/de/changelogs/987.txt index f7bc9bd80..a03048973 100644 --- a/fastlane/metadata/android/de/changelogs/987.txt +++ b/fastlane/metadata/android/de/changelogs/987.txt @@ -1,12 +1,12 @@ -Neu: -• Unterstützung anderer Übertragungsmethoden als progressives HTTP: schnellere Ladezeit der Wiedergabe, Korrekturen für PeerTube und SoundCloud, Wiedergabe von kürzlich beendeten YouTube-Livestreams -• Schaltfläche um entfernte Wiedergabeliste einer lokalen Wiedergabeliste hinzuzufügen -• Bildvorschau im Android 10+ Teilen-Dialog +Neu +• Unterstützung anderer Übertragungsmethoden als progressives HTTP: schnellere Ladezeit bei Wiedergabe, Fehlerbehebungen für PeerTube/SoundCloud, Wiedergabe kürzlich beendeter YouTube-Livestreams +• Schaltfläche, um Remote-Wiedergabeliste einer Lokalen hinzuzufügen +• Bildvorschau im Teilen-Dialog von Android 10+ -Verbessert: +Verbessert • Wiedergabewerte-Dialog -• Import/Export-Schaltflächen für Abonnements in das Drei-Punkte-Menü verschoben +• Import/Export-Schaltflächen für Abos in Drei-Punkte-Menü verschoben -Behoben: -• Entfernung von vollständig angesehenen Videos aus der Wiedergabeliste -• Freigabemenü-Design und „Zur Wiedergabeliste hinzufügen“-Eintrag +Behoben +• Entfernen vollständig angesehener Videos aus Wiedergabeliste +• … diff --git a/fastlane/metadata/android/de/changelogs/997.txt b/fastlane/metadata/android/de/changelogs/997.txt index f55e72b05..fbb5727d8 100644 --- a/fastlane/metadata/android/de/changelogs/997.txt +++ b/fastlane/metadata/android/de/changelogs/997.txt @@ -1,17 +1,16 @@ Neu • Antwort auf Kommentar • Wiedergabelisten umordnen -• Wiedergabelisten-Beschreibung und -Dauer +• Wiedergabelisten-Beschreibung/-Dauer • Rücksetzen der Einstellungen Verbessert -• [Android 13+] Wiederherstellen benutzerdef. Benachrichtigungsaktionen -• Zustimmung zur Update-Prüfung -• Während Pufferung Abspielen/Pause über Benachrichtigung -• Neuordnung einiger Einstellungen +• [Android 13+] Wiederherstellen benutzerd. Benachrichtigungsaktionen +• Zustimmung zur Updateprüfung +• Wiedergabe/Pause von Benachrichtigungen während Pufferung +• Neuanordnung einiger Einstellungen Behoben -• [YouTube] Kommentare wurden nicht geladen, weitere Korrekturen und Verbesserungen +• [YouTube] Kommentare wurden nicht geladen, weitere Fehlerbehebungen/Verbesserungen • Sicherheitslücke beim Einstellungsimport und Umstellung auf JSON -• Verschiedene Download-Korrekturen -• Suchtext gekürzt +• … diff --git a/fastlane/metadata/android/de/changelogs/999.txt b/fastlane/metadata/android/de/changelogs/999.txt index 51cf80d3e..059b4e081 100644 --- a/fastlane/metadata/android/de/changelogs/999.txt +++ b/fastlane/metadata/android/de/changelogs/999.txt @@ -4,9 +4,9 @@ Neu • [SoundCloud] Unterstützung für on.soundcloud.com-URLs hinzugefügt Verbessert -• [Bandcamp]Anzeige zusätzlicher Informationen im Radio-Kiosk +• [Bandcamp] Anzeige zusätzlicher Informationen im Radio-Kiosk Behoben -• [YouTube] Behebung gelegentlicher HTTP 403-Fehler am Anfang oder in der Mitte von Videos +• [YouTube] Behebung gelegentlicher HTTP-403-Fehler am Anfang oder in der Mitte von Videos • [YouTube] Extrahieren von Avataren und Banner aus mehr Kanal-Header-Typen • [Bandcamp] Verschiedene Fehler behoben und HTTPS wird stets verwendet diff --git a/fastlane/metadata/android/fr/changelogs/1000.txt b/fastlane/metadata/android/fr/changelogs/1000.txt index d4e706e2e..994b6061d 100644 --- a/fastlane/metadata/android/fr/changelogs/1000.txt +++ b/fastlane/metadata/android/fr/changelogs/1000.txt @@ -1,13 +1,13 @@ -Amélioré -• Rendre la description de la playlist cliquable pour afficher plus / moins de contenu -• [PeerTube] Gérer automatiquement les liens d'instance `subscribeto.me` -• Ne commencer à lire qu'un seul élément dans l'écran d'historique +Améliorations +• La description de la playlist est désormais cliquable pour afficher plus ou moins de contenu. +• [PeerTube] Gestion automatique des liens d'instance `subscribeto.me` +• Lecture d'un seul élément à la fois depuis l'historique -Corrigé -• Correction de la visibilité du bouton RSS -• Correction des plantages de l'aperçu de la barre de recherche -• Correction de la mise en playlist d'un élément sans vignette -• Correction de la sortie de la boîte de dialogue de téléchargement avant qu'elle n'apparaisse -• 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 d'ajout à la playlist -• Ajuster la disposition des éléments de signet de la playlist +Corrections +• Amélioration de la visibilité du bouton RSS +• Correction des plantages liés à l'aperçu de la barre de progression +• Correction de l'ajout d'un élément sans vignette à la playlist +• Correction de la fermeture prématurée de la boîte de dialogue de téléchargement +• Correction de la fenêtre contextuelle d'ajout à la file d'attente de la liste des éléments associés +• Amélioration de l'ordre d'affichage dans la boîte de dialogue « Ajouter à la playlist » +• Ajustement de la mise en page des signets de playlist diff --git a/fastlane/metadata/android/fr/changelogs/1003.txt b/fastlane/metadata/android/fr/changelogs/1003.txt index 161ee7fbb..917714bae 100644 --- a/fastlane/metadata/android/fr/changelogs/1003.txt +++ b/fastlane/metadata/android/fr/changelogs/1003.txt @@ -1,6 +1,6 @@ -Ceci est une version de correction qui résout les erreurs de YouTube : -• [YouTube] Correction du non-chargement des informations des vidéos, correction des erreurs HTTP 403 lors de la lecture des vidéos et restauration de la lecture de certaines vidéos à âge restreint -• Correction des tailles de sous-titres qui ne changent pas -• Correction du téléchargement des informations deux fois lors de l'ouverture d'un stream -• [Soundcloud] Suppression des streams protégés par DRM non lisibles -• Traductions mises à jour +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. diff --git a/fastlane/metadata/android/fr/changelogs/1005.txt b/fastlane/metadata/android/fr/changelogs/1005.txt index b7e5ff49f..269ba2105 100644 --- a/fastlane/metadata/android/fr/changelogs/1005.txt +++ b/fastlane/metadata/android/fr/changelogs/1005.txt @@ -1,17 +1,17 @@ -Nouveau -• Prise en charge d'Android Auto +Nouveautés +• Ajout de la compatibilité avec Android Auto • Possibilité de définir des groupes de flux comme onglets de l'écran principal • [YouTube] Partager comme playlist temporaire -• [SoundCloud] Onglet « J'aime » +• [SoundCloud] Onglet « J'aime » sur les chaînes -Amélioration -• Amélioration des astuces de la barre de recherche +Améliorations +• Amélioration des suggestions de la barre de recherche • Affichage de la date de téléchargement dans Téléchargements • Utilisation de la langue par application d'Android 13 -Corrigé +Corrections • Correction des couleurs de texte défectueuses en mode sombre -• [YouTube] Correction des playlists ne chargeant pas plus de 100 éléments -• [YouTube] Correction des vidéos recommandées manquantes -• Correction des plantages dans la vue Historique +• [YouTube] Correction du chargement des playlists de plus de 100 éléments +• [YouTube] Correction de l'affichage des vidéos recommandées manquantes +• Correction des plantages dans l'historique • Correction des horodatages dans les réponses aux commentaires diff --git a/fastlane/metadata/android/fr/changelogs/65.txt b/fastlane/metadata/android/fr/changelogs/65.txt index bb664a3cb..c5d6d852a 100644 --- a/fastlane/metadata/android/fr/changelogs/65.txt +++ b/fastlane/metadata/android/fr/changelogs/65.txt @@ -11,7 +11,7 @@ - Ajout d'une option d'avance rapide pendant les silences dans le contrôle de la vitesse de lecture. Cela devrait être utile pour les livres audio et certains genres musicaux, et peut apporter une véritable expérience transparente (et peut casser une chanson avec beaucoup de silences =\\). - Refonte de la résolution des sources de médias pour permettre le passage des métadonnées avec les médias en interne dans le lecteur, plutôt que de le faire manuellement. Maintenant, nous avons une seule source de métadonnées et elles sont directement disponibles lorsque la lecture commence. - Correction des métadonnées des listes de lecture distantes qui ne sont pas mises à jour lorsque de nouvelles métadonnées sont disponibles lors de l'ouverture du fragment de liste de lecture. - - Diverses corrections de l'interface utilisateur : #1383, les contrôles de notification du lecteur en arrière-plan sont maintenant toujours blancs, il est plus facile de fermer le lecteur popup en le lançant. + - Diverses corrections de l'interface utilisateur : #1383, les contrôles de notification du lecteur en arrière-plan sont maintenant toujours blancs, il est plus facile de fermer le lecteur popup en le lançant. - Utilisation d'un nouvel extracteur avec une architecture remaniée pour le multiservice. ### Corrections diff --git a/fastlane/metadata/android/fr/changelogs/70.txt b/fastlane/metadata/android/fr/changelogs/70.txt index fccfccd2b..185f98f69 100644 --- a/fastlane/metadata/android/fr/changelogs/70.txt +++ b/fastlane/metadata/android/fr/changelogs/70.txt @@ -1,4 +1,4 @@ -ATTENTION : Cette version est probablement un festival de bugs, tout comme la dernière. Cependant, en raison de la fermeture complète depuis la 17. une version cassée est mieux que pas de version. N'est-ce pas ? ¯\_(ツ)_/¯ +ATTENTION : Cette version est probablement un festival de bugs, tout comme la dernière. Cependant, en raison de la fermeture complète depuis la 17. une version cassée est mieux que pas de version. N'est-ce pas ? ¯\_(ツ)_/¯ ### Améliorations * Les fichiers téléchargés peuvent maintenant être ouverts en un seul clic. diff --git a/fastlane/metadata/android/hi/changelogs/1000.txt b/fastlane/metadata/android/hi/changelogs/1000.txt index 67a819e0f..201a8a970 100644 --- a/fastlane/metadata/android/hi/changelogs/1000.txt +++ b/fastlane/metadata/android/hi/changelogs/1000.txt @@ -7,7 +7,3 @@ • RSS बटन दृश्यता को ठीक करें • सीकबार पूर्वावलोकन क्रैश को ठीक करें • थंबनेल-रहित आइटम को प्लेलिस्ट में डालना ठीक करें -• डाउनलोड डायलॉग के दिखाई देने से पहले बाहर निकलने को ठीक करें -• संबंधित आइटम सूची एनक्यू पॉपअप को ठीक करें -• प्लेलिस्ट में जोड़ें डायलॉग में क्रम को ठीक करें -• प्लेलिस्ट बुकमार्क आइटम लेआउट को समायोजित करें diff --git a/fastlane/metadata/android/hi/changelogs/1002.txt b/fastlane/metadata/android/hi/changelogs/1002.txt index d780f47a6..a0bc033fe 100644 --- a/fastlane/metadata/android/hi/changelogs/1002.txt +++ b/fastlane/metadata/android/hi/changelogs/1002.txt @@ -1,5 +1,4 @@ YouTube द्वारा कोई भी स्ट्रीम न चलाए जाने की समस्या को ठीक किया गया। यह रिलीज़ केवल सबसे ज़्यादा दबाव वाली त्रुटि को संबोधित करती है जो YouTube वीडियो विवरण को लोड होने से रोकती है। - हम जानते हैं कि अन्य समस्याएँ भी हैं, और हम जल्द ही उन्हें हल करने के लिए एक अलग रिलीज़ जारी करेंगे। diff --git a/fastlane/metadata/android/hi/changelogs/1004.txt b/fastlane/metadata/android/hi/changelogs/1004.txt index 071ab64e3..faf98d116 100644 --- a/fastlane/metadata/android/hi/changelogs/1004.txt +++ b/fastlane/metadata/android/hi/changelogs/1004.txt @@ -1 +1,3 @@ -फिक्स्ड YouTube कोई स्ट्रीम नहीं चला रहा है +इस रिलीज़ में YouTube सिर्फ़ 360p स्ट्रीम दे रहा था, इसे ठीक किया गया है। + +ध्यान दें कि इस वर्शन में इस्तेमाल किया गया सॉल्यूशन शायद टेम्पररी है, और लंबे समय में SABR वीडियो प्रोटोकॉल को लागू करने की ज़रूरत है, लेकिन TeamNewPipe के सदस्य अभी बिज़ी हैं, इसलिए किसी भी मदद की बहुत तारीफ़ होगी! https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/hi/changelogs/1005.txt b/fastlane/metadata/android/hi/changelogs/1005.txt index 495894e76..4d72dc68f 100644 --- a/fastlane/metadata/android/hi/changelogs/1005.txt +++ b/fastlane/metadata/android/hi/changelogs/1005.txt @@ -1,17 +1,15 @@ नया -+ • Android Auto के लिए समर्थन जोड़ें -+ • फ़ीड समूहों को मुख्य स्क्रीन टैब के रूप में सेट करने की अनुमति दें -+ • [YouTube] अस्थायी प्लेलिस्ट के रूप में साझा करें -+ • [SoundCloud] "पसंद" चैनल टैब जोङी गई +• Android Auto के लिए समर्थन जोड़ें +• फ़ीड समूहों को मुख्य स्क्रीन टैब के रूप में सेट करने की अनुमति दें +• [YouTube] अस्थायी प्लेलिस्ट के रूप में साझा करें +• [SoundCloud] "पसंद" चैनल टैब जोङी गई बेहतर किए -+ • खोज बार संकेत -+ • डाउनलोडस स्क्रीन में डाउनलोड की तारीख दिखाएं -+ • Android 13+ पर प्रति-ऐप भाषा का उपयोग करें +• खोज बार संकेत +• डाउनलोडस स्क्रीन में डाउनलोड की तारीख दिखाएं +• Android 13+ पर प्रति-ऐप भाषा का उपयोग करें फिक्स किए -+ • डार्क मोड में पाठ के रंग ठीक करें -+ • [YouTube] 100 से अधिक आइटम लोड नहीं करने वाली प्लेलिस्ट को ठीक करें -+ • [YouTube] अनुपलब्ध अनुशंसित वीडियो को ठीक करें -+ • इतिहास सूची दृश्य में क्रैश ठीक करें -+ • टिप्पणी के उत्तरों में टाइमस्टैम्प को ठीक करें +• डार्क मोड में पाठ के रंग ठीक करें +• [YouTube] 100 से अधिक आइटम लोड नहीं करने वाली प्लेलिस्ट को ठीक करें +• टिप्पणी के उत्तरों में टाइमस्टैम्प को ठीक करें diff --git a/fastlane/metadata/android/hi/changelogs/1006.txt b/fastlane/metadata/android/hi/changelogs/1006.txt new file mode 100644 index 000000000..f9656149b --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/1006.txt @@ -0,0 +1,15 @@ +# बेहतर किए +टाइमस्टैम्प पर क्लिक करते समय मौजूदा प्लेयर पर ही दिखाएं +जब हो सके तो पेंडिंग डाउनलोड मिशन को रिकवर करने की कोशिश करें +फ़ाइल डिलीट किए बिना डाउनलोड डिलीट करने का ऑप्शन जोड़ें +.soundcloud लिंक खोलने में सपोर्ट करें +कई छोटे सुधार और ऑप्टिमाइज़ेशन + +# ठीक किया गया +7 से कम Android वर्शन के लिए छोटे नंबर फ़ॉर्मेटिंग को ठीक किया गया +खाली नोटिफ़िकेशन को ठीक किया गया +SRT सबटाइटल फ़ाइलों के लिए ठीक किया गया +कई क्रैश ठीक किए गए + +# डेवलपमेंट +इंटरनल कोड मॉडर्नाइज़ेशन diff --git a/fastlane/metadata/android/hi/changelogs/65.txt b/fastlane/metadata/android/hi/changelogs/65.txt index d2c2b8c71..d870f8d03 100644 --- a/fastlane/metadata/android/hi/changelogs/65.txt +++ b/fastlane/metadata/android/hi/changelogs/65.txt @@ -1,26 +1,13 @@ ### सुधार -- बर्गरमेनू आइकन एनीमेशन को अक्षम करें #1486 -- डाउनलोड को पूर्ववत करें #1472 -- शेयर मेनू में डाउनलोड विकल्प #1498 -- लॉन्ग टैप मेनू में शेयर विकल्प जोड़ा गया #1454 -- बाहर निकलने पर मुख्य प्लेयर को छोटा करें #1354 -- लाइब्रेरी संस्करण अपडेट और डेटाबेस बैकअप फिक्स #1510 -- एक्सोप्लेयर 2.8.2 अपडेट #1392 -- तेज गति परिवर्तन के लिए विभिन्न चरण आकारों का समर्थन करने के लिए प्लेबैक गति नियंत्रण संवाद को फिर से तैयार किया गया। -- प्लेबैक गति नियंत्रण में मौन के दौरान तेजी से आगे बढ़ने के लिए एक टॉगल जोड़ा गया। यह ऑडियोबुक और कुछ संगीत शैलियों के लिए मददगार होना चाहिए, और एक सच्चा सहज अनुभव ला सकता है (और बहुत सारे मौन वाले गीत को तोड़ सकता है =\\)। -- मीडिया स्रोत रिज़ॉल्यूशन को फिर से तैयार किया गया ताकि प्लेयर में आंतरिक रूप से मीडिया के साथ मेटाडेटा को पास किया जा सके, बजाय मैन्युअल रूप से ऐसा करने के। अब हमारे पास मेटाडेटा का एक ही स्रोत है और प्लेबैक शुरू होने पर सीधे उपलब्ध है। -- जब प्लेलिस्ट का टुकड़ा खोला जाता है तो नया मेटाडेटा उपलब्ध होने पर रिमोट प्लेलिस्ट मेटाडेटा अपडेट नहीं होता है। -- विभिन्न UI फ़िक्सेस: #1383, बैकग्राउंड प्लेयर नोटिफिकेशन कंट्रोल अब हमेशा सफ़ेद रहता है, फ़्लिंगिंग के ज़रिए पॉपअप प्लेयर को बंद करना आसान है -- मल्टीसर्विस के लिए रीफ़ैक्टर्ड आर्किटेक्चर के साथ नए एक्सट्रैक्टर का उपयोग करें +- बर्गरमेनू आइकन एनिमेशन को डिसेबल करें #1486 +- डाउनलोड को अनडू करें #1472 +- शेयर मेनू में डाउनलोड ऑप्शन #1498 +- लॉन्ग टैप मेनू में शेयर ऑप्शन जोड़ा गया #1454 +- ExoPlayer 2.8.2 अपडेट #1392 +- कई UI फ़िक्स: #1383 -### फ़िक्सेस +### फ़िक्स -- फ़िक्स #1440 टूटी हुई वीडियो जानकारी लेआउट #1491 - व्यू हिस्ट्री फ़िक्स #1497 -- #1495, जैसे ही उपयोगकर्ता प्लेलिस्ट एक्सेस करता है मेटाडेटा (थंबनेल, शीर्षक और वीडियो काउंट) को अपडेट करके। -- #1475, जब उपयोगकर्ता डिटेल फ़्रैगमेंट पर बाहरी प्लेयर पर वीडियो शुरू करता है तो डेटाबेस में व्यू रजिस्टर करके। -- पॉपअप मोड के मामले में स्क्रीन टाइमआउट को ठीक करें। #1463 (फ़िक्स #640) -- मुख्य वीडियो प्लेयर फ़िक्स #1509 -- [#1412] प्लेयर गतिविधि के बैकग्राउंड में होने पर नया इंटेंट प्राप्त होने पर प्लेयर NPE का कारण बनने वाले रिपीट मोड को ठीक किया गया। -- पॉपअप के लिए प्लेयर को छोटा करने की सुविधा को ठीक किया गया, जब पॉपअप की अनुमति नहीं दी जाती है तो प्लेयर नष्ट नहीं होता है। +- #1495, जैसे ही यूज़र प्लेलिस्ट एक्सेस करता है, मेटाडेटा (थंबनेल, टाइटल और वीडियो काउंट) को अपडेट करके। diff --git a/fastlane/metadata/android/hi/changelogs/66.txt b/fastlane/metadata/android/hi/changelogs/66.txt index 30c20b0e8..e9ec1e3fa 100644 --- a/fastlane/metadata/android/hi/changelogs/66.txt +++ b/fastlane/metadata/android/hi/changelogs/66.txt @@ -1,33 +1,21 @@ -# Changelog of v0.13.7 +# v0.13.7 का चेंजलॉग -### Fixed -- Fix sort filter issues of v0.13.6 +### ठीक किया गया +- v0.13.6 के सॉर्ट फ़िल्टर की दिक्कतें ठीक की गईं -# Changelog of v0.13.6 +# v0.13.6 का चेंजलॉग -### Improvements +### सुधार -- Disable burgermenu icon animation #1486 -- undo delete of downloads #1472 -- Download option in share menu #1498 -- Added share option to long tap menu #1454 -- Minimize main player on exit #1354 -- Library version update and database backup fix #1510 -- ExoPlayer 2.8.2 Update #1392 - - Reworked the playback speed control dialog to support different step sizes for faster speed change. - - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). - - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. - - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. - - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging -- Use new extractor with refactored architecture for multiservice +- बर्गरमेनू आइकन एनिमेशन डिसेबल करें #1486 +- डाउनलोड को अनडू डिलीट करें #1472 +- शेयर मेनू में डाउनलोड ऑप्शन #1498 +- लॉन्ग टैप मेनू में शेयर ऑप्शन जोड़ा गया #1454 +- ExoPlayer 2.8.2 अपडेट #1392 +कई UI फ़िक्स: #1383 -### Fixes +### फ़िक्स -- Fix #1440 Broken Video Info Layout #1491 -- View history fix #1497 - - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. - - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. -- Fix creen timeout in case of popup mode. #1463 (Fixed #640) -- Main video player fix #1509 - - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. - - Fixed minimizing player to popup does not destroy player when popup permission is not granted. +- फ़िक्स #1440 टूटा हुआ वीडियो इन्फ़ो लेआउट #1491 +- व्यू हिस्ट्री फ़िक्स #1497 +- मेन वीडियो प्लेयर फिक्स #1509। diff --git a/fastlane/metadata/android/hi/changelogs/68.txt b/fastlane/metadata/android/hi/changelogs/68.txt index 238b1e0b1..f0cc5bddb 100644 --- a/fastlane/metadata/android/hi/changelogs/68.txt +++ b/fastlane/metadata/android/hi/changelogs/68.txt @@ -1,31 +1,19 @@ -# changes of v0.14.1 +# v0.14.1 में बदलाव -### Fixed -- Fixed failed to decrypt video url #1659 -- Fixed description link not extract well #1657 +### ठीक किया गया +- वीडियो URL डिक्रिप्ट करने में फेल होना ठीक किया गया #1659 +- डिस्क्रिप्शन लिंक ठीक से एक्सट्रेक्ट नहीं हो रहा था, इसे ठीक किया गया #1657 -# changes of v0.14.0 +# v0.14.0 में बदलाव -### New -- New Drawer design #1461 -- New customizable front page #1461 +### नया +- नया ड्रॉअर डिज़ाइन #1461 +- नया कस्टमाइज़ेबल फ्रंट पेज #1461 -### Improvements -- Reworked Gesture controls #1604 -- New way to close the popup player #1597 +### सुधार +- पॉपअप प्लेयर बंद करने का नया तरीका #1597 -### Fixed -- Fix error when subscription count is not available. Closes #1649. - - Show "Subscriber count not available" in those cases -- Fix NPE when a YouTube playlist is empty -- Quick fix for the kiosks in SoundCloud -- Refactor and bugfix #1623 - - Fix Cyclic search result #1562 - - Fix Seek bar not statically lay outed - - Fix YT Premium video are not blocked correctly - - Fix Videos sometimes not loading (due to DASH parsing) - - Fix links in video description - - Show warning when someone tries to download to external sdcard - - fix nothing shown exception triggers report - - thumbnail not shown in background player for android 8.1 [see here](https://github.com/TeamNewPipe/NewPipe/issues/943) -- Fix registering of broadcast receiver. Closes #1641. +### ठीक किया गया +- जब YouTube प्लेलिस्ट खाली हो तो NPE को ठीक करें +- SoundCloud में कियोस्क के लिए क्विक फिक्स +- रीफैक्टर और बगफिक्स #1623। diff --git a/fastlane/metadata/android/hi/changelogs/69.txt b/fastlane/metadata/android/hi/changelogs/69.txt index c8262d1b0..8bdf96c8f 100644 --- a/fastlane/metadata/android/hi/changelogs/69.txt +++ b/fastlane/metadata/android/hi/changelogs/69.txt @@ -1,19 +1,15 @@ -### New -- Long-tap delete and share in subscriptions #1516 -- Tablet UI and grid list layout #1617 +### नया +- सब्सक्रिप्शन में लंबे समय तक टैप करके डिलीट और शेयर करें #1516 +- टैबलेट UI और ग्रिड लिस्ट लेआउट #1617 -### Improvements -- store and reload the last used aspect ratio #1748 -- Enable linear layout in Downloads activity with full video names #1771 -- Delete and share subscriptions directly from within the subscriptions tab #1516 -- Enqueuing now triggers video playing if the play queue has already ended #1783 -- Separate settings for volume and brightness gestures #1644 -- Add support for Localization #1792 +### सुधार +- वॉल्यूम और ब्राइटनेस जेस्चर के लिए अलग सेटिंग्स #1644 +- लोकलाइज़ेशन के लिए सपोर्ट जोड़ें #1792 -### Fixes -- Fix time parsing for . format, so NewPipe can be used in Finland -- Fix subscription count -- Add foreground service permission for API 28+ devices #1830 +### सुधार +- . फ़ॉर्मेट के लिए टाइम पार्सिंग ठीक करें, ताकि फ़िनलैंड में NewPipe का इस्तेमाल किया जा सके +- सब्सक्रिप्शन काउंट ठीक करें +- API 28+ डिवाइस के लिए फ़ोरग्राउंड सर्विस परमिशन जोड़ें #1830 -### Known Bugs -- Playback state can not be saved on Android P +### जाने-पहचाने बग +- Android P पर प्लेबैक स्टेट सेव नहीं किया जा सकता diff --git a/fastlane/metadata/android/hi/changelogs/70.txt b/fastlane/metadata/android/hi/changelogs/70.txt index ad87a4409..cfa334bdb 100644 --- a/fastlane/metadata/android/hi/changelogs/70.txt +++ b/fastlane/metadata/android/hi/changelogs/70.txt @@ -1,25 +1,11 @@ -ATTENTION: This version probably is a bugfest, just like the last one. However due to the full shutdown since the 17. a broken version is better then no version. Right? ¯\_(ツ)_/¯ +### सुधार +* डाउनलोड की गई फ़ाइलें अब एक क्लिक से खोली जा सकती हैं #1879 +* एंड्रॉयड 4.1 - 4.3 के लिए सपोर्ट हटा दिया गया #1884 +* पुराना प्लेयर हटाएँ #1884 +* मौजूदा प्ले क्यू से स्ट्रीम को दाईं ओर स्वाइप करके हटाएँ #1915 +* बहुत सारी डाउनलोड गड़बड़ियाँ ठीक करके सुधार किया गए -### Improvements -* downloaded files can now be opened with one click #1879 -* drop support for android 4.1 - 4.3 #1884 -* remove old player #1884 -* remove streams from current play queue by swiping them to the right #1915 -* remove auto queued stream when a new stream is enqueued manually #1878 -* Postprocessing for downloads and implement missing features #1759 by @kapodamy - * Post-processing infrastructure - * Proper error handling "infrastructure" (for downloader) - * Queue instead of multiple downloads - * Move serialized pending downloads (`.giga` files) to app data - * Implement max download retry - * Proper multi-thread download pausing - * Stop downloads when swicthing to mobile network (never works, see 2nd point) - * Save the thread count for next downloads - * A lot of incoherences fixed - -### Fixed -* Fix crash with default resolution set to best and limited mobile data resolution #1835 -* pop-up player crash fixed #1874 -* NPE when trying to open background player #1901 -* Fix for inserting new streams when auto queuing is enabled #1878 -* Fixed the decypering shuttown issue +### ठीक किया गया +* डिफ़ॉल्ट रिज़ॉल्यूशन को बेस्ट और लिमिटेड मोबाइल डेटा रिज़ॉल्यूशन पर सेट करने पर क्रैश को ठीक किया गया #1835 +* पॉप-अप प्लेयर क्रैश को ठीक किया गया #1874 +* बैकग्राउंड प्लेयर खोलने की कोशिश करते समय NPE #1901 diff --git a/fastlane/metadata/android/hi/changelogs/71.txt b/fastlane/metadata/android/hi/changelogs/71.txt index 5facfc05f..c9b9675b0 100644 --- a/fastlane/metadata/android/hi/changelogs/71.txt +++ b/fastlane/metadata/android/hi/changelogs/71.txt @@ -1,10 +1,7 @@ -### Improvements -* Add app update notification for GitHub build (#1608 by @krtkush) -* Various improvements to the downloader (#1944 by @kapodamy): - * add missing white icons and use hardcored way for change the icon colors - * check if the iterator is initialized (fixes #2031) - * allow retry downloads with "post-processing failed" error in the new muxer - * new MPEG-4 muxer fixing non-synchronous video and audio streams (#2039) +### सुधार +* GitHub बिल्ड के लिए ऐप अपडेट नोटिफ़िकेशन जोड़ें (#1608 @krtkush द्वारा) +* डाउनलोडर में कई सुधार #1944 +* नया MPEG-4 म्यूक्सर नॉन-सिंक्रोनस वीडियो और ऑडियो स्ट्रीम को ठीक करता है (#2039) -### Fixed -* YouTube live streams stop playing after a short time (#1996 by @yausername) +### फिकसड +* YouTube लाइव स्ट्रीम थोड़े समय बाद चलना बंद हो जाती हैं (#1996 @yausername द्वारा) diff --git a/fastlane/metadata/android/hi/changelogs/740.txt b/fastlane/metadata/android/hi/changelogs/740.txt index c795978a8..9380af1b0 100644 --- a/fastlane/metadata/android/hi/changelogs/740.txt +++ b/fastlane/metadata/android/hi/changelogs/740.txt @@ -1,23 +1,12 @@ -

    Improvements

    +

    सुधार

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

    Fixed

    +
  • कमेंट्स में लिंक को क्लिक करने लायक बनाएं, टेक्स्ट का साइज़ बढ़ाएं
  • +
  • कमेंट्स में टाइमस्टैम्प लिंक पर क्लिक करने पर खोजें
  • +
  • जब शेयर किया गया टेक्स्ट URL न हो तो उसे खोजें
  • +
  • मेन वीडियो प्लेयर में "अभी के समय शेयर करें" बटन जोड़ें
  • +
  • ExoPlayer को 2.9.6 पर अपडेट करना
  • +

    फिकसड

    +
      -
    • fixed scroll w/ comments and related streams disabled
    • -
    • fixed CheckForNewAppVersionTask being executed when it shouldn't
    • -
    • fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title
    • -
    • fix invalid YouTube url: signature tag name is not always "signature" preventing streams from loading
    • +
    • गलत YouTube URL ठीक करें: सिग्नेचर टैग का नाम हमेशा "सिग्नेचर" नहीं होता, जिससे स्ट्रीम लोड नहीं हो पातीं
    diff --git a/fastlane/metadata/android/hi/changelogs/750.txt b/fastlane/metadata/android/hi/changelogs/750.txt index 39b77f7c3..13e965311 100644 --- a/fastlane/metadata/android/hi/changelogs/750.txt +++ b/fastlane/metadata/android/hi/changelogs/750.txt @@ -1,22 +1,13 @@ -New -Playback resume #2288 -• Resume streams where you stopped last time -Downloader Enhancements #2149 -• Use Storage Access Framework to store downloads on external SD-cards -• New mp4 muxer -• Optionally change the download directory before starting a download -• Respect metered networks +नया +प्लेबैक फिर से शुरू करें #2288 +• स्ट्रीम वहीं से फिर से शुरू करें जहाँ आपने पिछली बार रोका था +डाउनलोडर एन्हांसमेंट #2149 +• एक्सटर्नल SD-कार्ड पर डाउनलोड स्टोर करने के लिए स्टोरेज एक्सेस फ्रेमवर्क का इस्तेमाल करें +बेहतर +• एक्टिविटी लाइफसाइकल के दौरान (ऑटो) रोटेशन में बदलाव को हैंडल करें #2444 +• लॉन्ग-प्रेस मेनू को एक जैसा बनाएं #2368 -Improved -• Removed gema strings #2295 -• Handle (auto)rotation changes during activity lifecycle #2444 -• Make long-press menus consistent #2368 - -Fixed -• Fixed selected subtitle track name not being shown #2394 -• Do not crash when check for app update fails (GitHub version) #2423 -• Fixed downloads stuck at 99.9% #2440 -• Update play queue metadata #2453 -• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 -• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 +ठीक किया गया +• चुने हुए सबटाइटल ट्रैक का नाम नहीं दिखना ठीक किया गया #2394 +• 99.9% पर अटके डाउनलोड को ठीक किया गया #2440 diff --git a/fastlane/metadata/android/hi/changelogs/760.txt b/fastlane/metadata/android/hi/changelogs/760.txt index 6e000f6d9..c4b6d951f 100644 --- a/fastlane/metadata/android/hi/changelogs/760.txt +++ b/fastlane/metadata/android/hi/changelogs/760.txt @@ -1,43 +1,13 @@ -Changes in 0.17.1 +0.17.1 में बदलाव -New -• Thai localization +नया +• थाई लोकलाइज़ेशन +बेहतर +• प्लेलिस्ट के लिए लॉन्ग-प्रेस मेनू में फिर से 'यहाँ से प्ले करना शुरू करें' एक्शन जोड़ें #2518 +• SAF / लेगेसी फ़ाइल पिकर के लिए स्विच जोड़ें #2521 -Improved -• Add start playing here action in long-press menus for playlists again #2518 -• Add switch for SAF / legacy file picker #2521 - -Fixed -• Fix disappearing buttons in downloads view when switching apps #2487 -• Fix playback position is stored although watch history is disabled -• Fix reduced performance caused by playback position in list views #2517 -• [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 -• [Extractor] [YouTube] Fix casual search error when playlists are in results TeamNewPipe/NewPipeExtractor#185 - - - -Changes in 0.17.0 - -New -Playback resume #2288 -• Resume streams where you stopped last time -Downloader Enhancements #2149 -• Use Storage Access Framework to store downloads on external SD-cards -• New mp4 muxer -• Optionally change the download directory before starting a download -• Respect metered networks - - -Improved -• Removed gema strings #2295 -• Handle (auto)rotation changes during activity lifecycle #2444 -• Make long-press menus consistent #2368 - -Fixed -• Fixed selected subtitle track name not being shown #2394 -• Do not crash when check for app update fails (GitHub version) #2423 -• Fixed downloads stuck at 99.9% #2440 -• Update play queue metadata #2453 -• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 -• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 +ठीक किया गया +• ऐप बदलते समय डाउनलोड व्यू में बटन गायब होने की समस्या ठीक करें #2487 +• लिस्ट व्यू में प्लेबैक पोज़िशन की वजह से परफॉर्मेंस में आई कमी को ठीक करें #2517 +• [एक्सट्रैक्टर] [YouTube] जब प्लेलिस्ट रिज़ल्ट में हों तो कैज़ुअल सर्च एरर को ठीक करें TeamNewPipe/NewPipeExtractor#185 diff --git a/fastlane/metadata/android/hi/changelogs/790.txt b/fastlane/metadata/android/hi/changelogs/790.txt index ec77b2acb..3b322f0af 100644 --- a/fastlane/metadata/android/hi/changelogs/790.txt +++ b/fastlane/metadata/android/hi/changelogs/790.txt @@ -1,14 +1,9 @@ -Improved -• Add more titles to improve accessibility for blind people #2655 -• Make language of download folder setting more consistent and less ambiguous #2637 +ठीक किया गया +• चेक करें कि ब्लॉक में आखिरी बाइट डाउनलोड हुआ है या नहीं #2646 +• वीडियो डिटेल फ़्रैगमेंट में स्क्रॉलिंग को ठीक किया गया #2672 +• [साउंडक्लाउड] client_id एक्सट्रैक्शन को ठीक करें #2745 -Fixed -• Check if last byte in the block is downloaded #2646 -• Fixed scrolling in video detail fragment #2672 -• Remove double search clear box animations to one #2695 -• [SoundCloud] Fix client_id extraction #2745 - -Development -• Add missing dependencies inherited from NewPipeExtractor into NewPipe #2535 -• Migrate to AndroidX #2685 -• Update to ExoPlayer 2.10.6 #2697, #2736 +डेवलपमेंट +• NewPipeExtractor से मिली गायब डिपेंडेंसी को NewPipe में जोड़ें #2535 +• AndroidX पर माइग्रेट करें #2685 +• ExoPlayer 2.10.6 पर अपडेट करें #2697, #2736 diff --git a/fastlane/metadata/android/hi/changelogs/800.txt b/fastlane/metadata/android/hi/changelogs/800.txt index 332b5c994..4df518086 100644 --- a/fastlane/metadata/android/hi/changelogs/800.txt +++ b/fastlane/metadata/android/hi/changelogs/800.txt @@ -1,27 +1,10 @@ -New -• PeerTube support without P2P (#2201) [Beta]: - ◦ Watch and download videos from PeerTube instances - ◦ Add instances in the settings to access the complete PeerTube world - ◦ There might be problems with SSL handshakes on Android 4.4 and 7.1 when accessing certain instances resulting in a network error. +नया +• P2P के बिना PeerTube सपोर्ट (#2201) [बीटा]: -• Downloader (#2679): - ◦ Calculate download ETA - ◦ Download opus (webm files) as ogg - ◦ Recover expired download links to resume downloads after a long pause +◦ लंबे समय तक रुकने के बाद डाउनलोड फिर से शुरू करने के लिए एक्सपायर हो चुके डाउनलोड लिंक रिकवर करें -Improved -• Make the KioskFragment aware of changes in the preferred content country and improve performance of all main tabs #2742 -• Use new Localization and Downloader implementations from extractor #2713 -• Make "Default kiosk" string translatable -• Black navigation bar for black theme #2569 +बेहतर +• KioskFragment को पसंदीदा कंटेंट देश में होने वाले बदलावों के बारे में बताएं और सभी मेन टैब की परफॉर्मेंस को बेहतर बनाएं #2742 -Fixed -• Fixed a bug that could not move the popup player if another finger was placed while moving the popup player #2772 -• Allow playlists missing an uploader and fix crashes related to this problem #2724, TeamNewPipe/NewPipeExtractor#219 -• Enabling TLS1.1/1.2 on Android 4.4 devices (API 19/KitKat) to fix TLS handshake with MediaCCC and some PeerTube instances #2792 -• [SoundCloud] Fixed client_id extraction TeamNewPipe/NewPipeExtractor#217 -• [SoundCloud] Fix audio stream extraction - -Development -• Update ExoPlayer to 2.10.8 #2791, #2816 -• Update Gradle to 3.5.1 and add Kotlin support #2714 +फिक्स किया गया +• Android 4.4 डिवाइस (API 19/KitKat) पर TLS1.1/1.2 इनेबल करें diff --git a/fastlane/metadata/android/hi/changelogs/810.txt b/fastlane/metadata/android/hi/changelogs/810.txt index c75855fd1..b3d4c7bd6 100644 --- a/fastlane/metadata/android/hi/changelogs/810.txt +++ b/fastlane/metadata/android/hi/changelogs/810.txt @@ -1,19 +1,11 @@ -New -• Show video thumbnail on the lock screen when playing in the background +नया +• बैकग्राउंड में चलने पर लॉक स्क्रीन पर वीडियो थंमनेल दिखाएं -Improved -• Add local playlist to queue when long pressing on background / popup button -• Make main page tabs scrollable and hide when there is only a single tab -• Limit amount of notification thumbnail updates in background player -• Add dummy thumbnail for empty local playlists -• Use *.opus file extension instead of *.webm and show "opus" in format label instead of "WebM Opus" in the download dropdown -• Add button to delete downloaded files or download history in "Downloads" -• [YouTube] Add support to /c/shortened_url channel links +बेहतर +• बैकग्राउंड / पॉपअप बटन पर देर तक दबाने पर लोकल प्लेलिस्ट को क्यू में जोड़ें +• [YouTube] /c/shortened_url चैनल लिंक के लिए सपोर्ट जोड़ें -Fixed -• Fixed multiple issues when sharing a video to NewPipe and downloading its streams directly -• Fixed player access out of its creation thread -• Fixed search result paging -• [YouTube] Fixed switching on null causing NPE -• [YouTube] Fixed viewing comments when opening an invidio.us url -• [SoundCloud] Updated client_id +फिकसड +• NewPipe पर वीडियो शेयर करते समय और सीधे उसकी स्ट्रीम डाउनलोड करते समय कई दिक्कतें ठीक की गईं +• सर्च रिज़ल्ट पेजिंग ठीक की गई +• [SoundCloud] client_id अपडेट किया गया diff --git a/fastlane/metadata/android/hi/changelogs/840.txt b/fastlane/metadata/android/hi/changelogs/840.txt index 95dc80844..5be8a8660 100644 --- a/fastlane/metadata/android/hi/changelogs/840.txt +++ b/fastlane/metadata/android/hi/changelogs/840.txt @@ -1,22 +1,10 @@ -New -• Added language selector to change the app language -• Added send to Kodi button to player collapsible menu -• Added ability to copy comments on long press +नया +• ऐप की भाषा बदलने के लिए भाशा सिलेक्टर जोड़ा गया +• प्लेयर कोलैप्सिबल मेनू में कोडी को भेजें बटन जोड़ा गया +• देर तक दबाने पर कमेंट्स कॉपी करने की सुविधा जोड़ी गई -Improved -• Fix ReCaptcha activity and correctly save obtained cookies -• Removed dot-menu in favour of drawer and hide history button when watch history is not enabled in settings -• Ask for display over other apps permission in settings correctly on Android 6 and later -• Rename local playlist by long-clicking in BookmarkFragment -• Various PeerTube improvements -• Improved several English source strings +बेहतर +• ReCaptcha एक्टिविटी को ठीक किया गया और मिली हुई कुकीज़ को सही ढंग से सेव किया गया -Fixed -• Fixed player starting again although it is paused when option "minimize on app switch" enabled and NewPipe is minimized -• Fix initial brightness value for gesture -• Fixed .srt subtitle downloads containing not all line breaks -• Fixed download to SD card failing because some Android 5 devices are not CTF compliant -• Fixed downloading on Android KitKat -• Fixed corrupt video .mp4 file being recognized as audio file -• Fixed multiple localization problems, including wrong Chinese language codes -• [YouTube] Timestamps in description are clickable again +ठीक किया गया +• Android KitKat पर डाउनलोडिंग ठीक की गई diff --git a/fastlane/metadata/android/hi/changelogs/930.txt b/fastlane/metadata/android/hi/changelogs/930.txt index b23b01ea8..457d1745b 100644 --- a/fastlane/metadata/android/hi/changelogs/930.txt +++ b/fastlane/metadata/android/hi/changelogs/930.txt @@ -1,19 +1,13 @@ -New -• Search on YouTube Music -• Basic Android TV support +नया +• YouTube Music पर सर्च करें +• बेसिक Android TV सपोर्ट -Improved -• Added the ability to remove all watched videos from a local playlist -• Show message when content isn't supported yet instead of crashing -• Improved popup player resize with pinch gestures -• Enqueue streams on long press on background and popup buttons in channel -• Improved size handling of the drawer header title +बेहतर +• लोकल प्लेलिस्ट से सभी देखे गए वीडियो हटाने की सुविधा जोड़ी गई +• जब कंटेंट अभी सपोर्टेड न हो, तो क्रैश होने के बजाय मैसेज दिखाएं -Fixed -• Fixed age restricted content setting not working -• Fixed certain kinds of reCAPTCHAs -• Fixed crash when opening bookmarks while playlist is `null` -• Fixed detection of network related exceptions -• Fixed visibility of group sort button in the subscriptions fragment +फिकसड +• उम्र पर रोक वाली कंटेंट सेटिंग काम नहीं कर रही थी, इसे ठीक किया गया +• कुछ तरह के reCAPTCHA को ठीक किया गया -and more +और भी बहुत कुछ diff --git a/fastlane/metadata/android/hi/changelogs/940.txt b/fastlane/metadata/android/hi/changelogs/940.txt index f9530bc68..6f9253a2f 100644 --- a/fastlane/metadata/android/hi/changelogs/940.txt +++ b/fastlane/metadata/android/hi/changelogs/940.txt @@ -1,16 +1,14 @@ -New -• Add support for SoundCloud comments -• Add YouTube restricted mode setting -• Show PeerTube parent channel details +नया +• SoundCloud कमेंट्स के लिए सपोर्ट जोड़ें +• YouTube रेस्ट्रिक्टेड मोड सेटिंग जोड़ें +• PeerTube पेरेंट चैनल की डिटेल्स दिखाएँ -Improved -• Show Kore button only for supported services -• Block player gestures that begin at the NavigationBar or StatusBar -• Change retry & subscribe buttons background color based on service color +बेहतर +• सिर्फ़ सपोर्टेड सर्विसेज़ के लिए Kore बटन दिखाएँ -Fixed -• Fix download dialog freeze -• Open in browser button now really opens in browser -• Fix crash on opening videos and "Could not play this stream" +फिक्स किया गया +• डाउनलोड डायलॉग फ़्रीज़ होने की समस्या को ठीक करें +• ब्राउज़र में खोलें बटन अब सच में ब्राउज़र में खुलता है +• वीडियो खोलने पर क्रैश और "यह स्ट्रीम नहीं चला सका" -and more +और भी बहुत कुछ diff --git a/fastlane/metadata/android/hi/changelogs/951.txt b/fastlane/metadata/android/hi/changelogs/951.txt index e933e5cbd..ffc1f8891 100644 --- a/fastlane/metadata/android/hi/changelogs/951.txt +++ b/fastlane/metadata/android/hi/changelogs/951.txt @@ -1,17 +1,13 @@ -New -• Add search for subscription picker in the feed group dialog -• Add filter to the feed group dialog to show only ungrouped subscriptions -• Add playlist tab to main page -• Fast forward/rewind in background/pop-up player queue -• Display search suggestion: did you mean & showing result for +नया +• फ़ीड ग्रुप डायलॉग में सब्सक्रिप्शन पिकर के लिए सर्च जोड़ें +• फ़ीड ग्रुप डायलॉग में फ़िल्टर जोड़ें ताकि सिर्फ़ अनग्रुप्ड सब्सक्रिप्शन दिखें +• मेन पेज पर प्लेलिस्ट टैब जोड़ें -Improved -• Drop writing application metadata in muxed files -• Do not remove failed streams from the queue -• Update status bar color to match toolbar color +बेहतर +• म्यूक्स की गई फ़ाइलों में एप्लीकेशन मेटाडेटा लिखना बंद करें +• फ़ेल स्ट्रीम को क्यू से न हटाएं -Fixed -• Fixed audio/video desync caused by floating point cumulative errors -• [PeerTube] Handle deleted comments +फिकसड +• फ़्लोटिंग पॉइंट क्यूमुलेटिव एरर के कारण होने वाले ऑडियो/वीडियो डीसिंक को ठीक किया गया -and more +और भी बहुत कुछ diff --git a/fastlane/metadata/android/hi/changelogs/995.txt b/fastlane/metadata/android/hi/changelogs/995.txt index 63ed335a4..7bd7341c2 100644 --- a/fastlane/metadata/android/hi/changelogs/995.txt +++ b/fastlane/metadata/android/hi/changelogs/995.txt @@ -1,16 +1,14 @@ नया • चैनल टैब्स का समर्थन करें • छवि गुणवत्ता का चयन करें -• सभी छवियों के यूआरएल प्राप्त करें सुधार किए • प्लेयर इंटरफ़ेस की पहुंच • केवल-वीडियो डाउनलोड के लिए बेहतर ऑडियो चयन -• साझा प्लेलिस्ट सामग्री में प्लेलिस्ट और वीडियो नाम शामिल करने का विकल्प ठीक किए • [यूट्यूब] लाइक पाने की संख्या ठीक करें • पॉपअप और क्रैश पर प्रतिक्रिया नहीं देने वाले प्लेयर को ठीक करें • भाषा चयनकर्ता में गलत भाषाओं का चयन ठीक करें • प्लेयर ऑडियो फोकस म्यूट का सम्मान नहीं कर रहा था -• प्लेलिस्ट में आइटम जोड़ना कभी-कभी काम नहीं कर रहा था +• प्लेलिस्ट में आइटम ना जुड़ना ठीक किया diff --git a/fastlane/metadata/android/hi/changelogs/997.txt b/fastlane/metadata/android/hi/changelogs/997.txt index 652935884..b47816231 100644 --- a/fastlane/metadata/android/hi/changelogs/997.txt +++ b/fastlane/metadata/android/hi/changelogs/997.txt @@ -6,12 +6,9 @@ सुधार • [एंड्रॉइड 13+] कस्टम अधिसूचना क्रियाएं पुनर्स्थापित करें -• अपडेटस की जांच के लिए सहमति का अनुरोध करें -• बफ़रिंग के दौरान नोटीफिकेशन से चलाने/रोकने की अनुमति दें • कुछ सेटिंग्स पुनः व्यवस्थित करें ठीक किए • [यूट्यूब] लोड न होने वाली टिप्पणियों को ठीक करें, साथ ही अन्य फिक्स और सुधार भी -• सेटिंग्स आयात में भेद्यता को हल करें और JSON पर स्विच करें • विभिन्न डाउनलोड सुधार • खोज पाठ को ट्रिम करें diff --git a/fastlane/metadata/android/pa/changelogs/1000.txt b/fastlane/metadata/android/pa/changelogs/1000.txt index 90d70c151..ddc239f32 100644 --- a/fastlane/metadata/android/pa/changelogs/1000.txt +++ b/fastlane/metadata/android/pa/changelogs/1000.txt @@ -3,11 +3,9 @@ • [PeerTube] `subscribeto.me` ਇੰਸਟੈਂਸ ਲਿੰਕਾਂ ਨੂੰ ਆਟੋਮੈਟਿਕ ਹੀ ਹੈਂਡਲ ਕਰੋ • ਇਤਿਹਾਸ ਸਕਰੀਨ ਵਿੱਚ ਸਿਰਫ਼ ਸਿੰਗਲ ਆਈਟਮ ਨੂੰ ਚਲਾਉਣਾ ਸ਼ੁਰੂ ਕਰੋ -ਠੀਕ ਕਰਿਆ +ਫਿਕਸਡ • RSS ਬਟਨ ਦੀ ਦਿੱਖ ਨੂੰ ਠੀਕ ਕਰੋ • ਸੀਕਬਾਰ ਪੂਰਵਦਰਸ਼ਨ ਕ੍ਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ • ਥੰਮਨੇਲ-ਰਹਿਤ ਆਈਟਮ ਦੀ ਪਲੇਲਿਸਟਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ -• ਡਾਉਨਲੋਡ ਡਾਇਲਾਗ ਦੇ ਦਿਸਣ ਤੋਂ ਪਹਿਲਾਂ ਇਸਨੂੰ ਬਾਹਰ ਕੱਢਣਾ ਠੀਕ ਕਰੋ -• ਸੰਬੰਧਿਤ ਆਈਟਮਾਂ ਦੀ ਸੂਚੀ ਐਨਕਿਊ ਪੌਪਅੱਪ ਨੂੰ ਠੀਕ ਕਰੋ -• ਪਲੇਲਿਸਟ ਡਾਇਲਾਗ ਵਿੱਚ ਜੋੜਨ ਦਾ ਕ੍ਰਮ ਠੀਕ ਕਰੋ -• ਪਲੇਲਿਸਟ ਬੁੱਕਮਾਰਕ ਆਈਟਮ ਖਾਕਾ ਵਿਵਸਥਿਤ ਕਰੋ +• ਸੰਬੰਧਿਤ ਆਈਟਮਾਂ ਦੀ ਸੂਚੀ ਐਨਕਿਊ ਪੌਪ-ਅਪ ਨੂੰ ਠੀਕ ਕਰੋ +• ਅਤੇ ਹੋਰ ਪਲੇਲਿਸਟ ਤੇ ਡਾਊਨਲੋਡ ਸਬੰਧਤ ਫਿਕਸ diff --git a/fastlane/metadata/android/pa/changelogs/1004.txt b/fastlane/metadata/android/pa/changelogs/1004.txt index fe62a1330..6d3d23b2e 100644 --- a/fastlane/metadata/android/pa/changelogs/1004.txt +++ b/fastlane/metadata/android/pa/changelogs/1004.txt @@ -1 +1,3 @@ -ਸਥਿਰ YouTube ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ ਚਲਾ ਰਿਹਾ +ਇਹ ਰੀਲੀਜ਼ ਸਿਰਫ਼ 360p ਸਟ੍ਰੀਮ ਪ੍ਰਦਾਨ ਕਰਨ ਵਾਲੇ YouTube ਨੂੰ ਠੀਕ ਕਰਦੀ ਹੈ। + +ਧਿਆਨ ਦਿਓ ਕਿ ਇਸ ਸੰਸਕਰਣ ਵਿੱਚ ਵਰਤਿਆ ਗਿਆ ਹੱਲ ਸੰਭਾਵਤ ਤੌਰ 'ਤੇ ਅਸਥਾਈ ਹੈ, ਅਤੇ ਲੰਬੇ ਸਮੇਂ ਵਿੱਚ SABR ਵੀਡੀਓ ਪ੍ਰੋਟੋਕੋਲ ਨੂੰ ਲਾਗੂ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ, ਪਰ TeamNewPipe ਮੈਂਬਰ ਇਸ ਸਮੇਂ ਰੁੱਝੇ ਹੋਏ ਹਨ ਇਸ ਲਈ ਕਿਸੇ ਵੀ ਮਦਦ ਦੀ ਬਹੁਤ ਪ੍ਰਸ਼ੰਸਾ ਕੀਤੀ ਜਾਵੇਗੀ! https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/pa/changelogs/1005.txt b/fastlane/metadata/android/pa/changelogs/1005.txt index f1492a1ac..982b092a4 100644 --- a/fastlane/metadata/android/pa/changelogs/1005.txt +++ b/fastlane/metadata/android/pa/changelogs/1005.txt @@ -1,17 +1,10 @@ ਨਵਾਂ -+ • Android Auto ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਿਲ ਕਰੋ -+ • ਫੀਡ ਗਰੁੱਪਾਂ ਨੂੰ ਮੁੱਖ ਸਕ੍ਰੀਨ ਟੈਬਾਂ ਵਜੋਂ ਸੈੱਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ -+ • [YouTube] ਅਸਥਾਈ ਪਲੇਲਿਸਟ ਦੇ ਵਜੋਂ ਸਾਂਝਾ ਕਰੋ -+ • [SoundCloud] "ਪਸੰਦ" ਚੈਨਲ ਟੈਬ ਜੋੜੀ ਗਈ - -ਬਿਹਤਰ ਕੀਤੇ -+ • ਖੋਜ ਬਾਰ ਸੰਕੇਤ -+ • ਡਾਊਨਲੋਡਸ ਸੂਚੀ ਵਿੱਚ ਡਾਊਨਲੋਡ ਤਾਰੀਖ ਦਿਖਾਓ -+ • ਐਂਡਰਾਇਡ 13+ 'ਤੇ ਪ੍ਰਤੀ ਐਪ ਭਾਸ਼ਾ ਦੀ ਵਰਤੋਂ ਕਰੋ +• Android Auto ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਿਲ ਕਰਨ ਸਮੇਤ YouTube ਲਈ ਅਸਥਾਈ ਪਲੇਲਿਸਟ ਵਜੋਂ ਸ਼ੇਅਰ ਫੰਕਸ਼ਨ ਤੇ SoundCloud ਲਈ ਲਾਈਕਸ ਚੈਨਲ ਟੈਬ ਨਵੀਂ ਐਡ ਕੀਤੀ +• ਫੀਡ ਗਰੁੱਪਾਂ ਨੂੰ ਮੁੱਖ ਸਕ੍ਰੀਨ ਟੈਬਾਂ ਵਜੋਂ ਸੈੱਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ ਦਰੁਸਤ ਕੀਤੇ -+ • ਡਾਰਕ ਥੀਮਾਂ 'ਤੇ ਟੈਕਸਟ ਰੰਗਾਂ ਨੂੰ ਠੀਕ ਕਰੋ -+ • [YouTube] ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਠੀਕ ਕਰੋ ਜੋ 100 ਤੋਂ ਵੱਧ ਆਈਟਮਾਂ ਲੋਡ ਨਹੀਂ ਕਰਦੀਆਂ -+ • [YouTube] ਸਿਫਾਰਸ਼ ਕੀਤੀਆਂ ਵੀਡੀਓਜ਼ ਦੀ ਅਣਉਪਲੱਬਧਤਾ ਨੂੰ ਠੀਕ ਕਰੋ -+ • ਇਤਿਹਾਸ ਸੂਚੀ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਕ੍ਰੈਸ਼ ਨੂੰ ਠੀਕ ਕਰੋ -+ • ਟਿੱਪਣੀਆਂ ਦੇ ਜਵਾਬ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +• ਡਾਰਕ ਥੀਮਾਂ 'ਤੇ ਟੈਕਸਟ ਰੰਗਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +• [YouTube] ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਠੀਕ ਕਰੋ ਜੋ 100 ਤੋਂ ਵੱਧ ਆਈਟਮਾਂ ਲੋਡ ਨਹੀਂ ਕਰਦੀਆਂ +• [YouTube] ਸਿਫਾਰਸ਼ ਕੀਤੀਆਂ ਵੀਡੀਓਜ਼ ਦੀ ਅਣਉਪਲੱਬਧਤਾ ਨੂੰ ਠੀਕ ਕਰੋ +• ਟਿੱਪਣੀਆਂ ਦੇ ਜਵਾਬ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +ਪੂਰੇ ਬਦਲਾਵਾਂ ਵਾਸਤੇ ਗਿਟਹੱਬ ਤੇ dev ਸ਼ਾਖਾ ਟੈਗ ਅਨੁਸਾਰ ਬਦਲਾਅ ਵੇਖੋ diff --git a/fastlane/metadata/android/pa/changelogs/1006.txt b/fastlane/metadata/android/pa/changelogs/1006.txt new file mode 100644 index 000000000..2539da187 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/1006.txt @@ -0,0 +1,15 @@ +# ਸੁਧਾਰਿਆ ਗਿਆ +ਟਾਈਮਸਟੈਂਪਾਂ 'ਤੇ ਕਲਿੱਕ ਕਰਦੇ ਸਮੇਂ ਮੌਜੂਦਾ ਪਲੇਅਰ ਰੱਖੋ +ਜਦੋਂ ਸੰਭਵ ਹੋਵੇ ਤਾਂ ਬਕਾਇਆ ਡਾਊਨਲੋਡ ਮਿਸ਼ਨਾਂ ਨੂੰ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ +ਫਾਈਲ ਨੂੰ ਮਿਟਾਏ ਬਿਨਾਂ ਡਾਊਨਲੋਡ ਨੂੰ ਮਿਟਾਉਣ ਦਾ ਵਿਕਲਪ ਸ਼ਾਮਿਲ ਕਰੋ +on.soundcloud ਲਿੰਕ ਖੋਲ੍ਹਣ ਦਾ ਸਮਰਥਨ ਕਰੋ +ਬਹੁਤ ਸਾਰੇ ਛੋਟੇ ਸੁਧਾਰ ਅਤੇ ਅਨੁਕੂਲਤਾ + +# ਫਿਕਸਡ +7 ਤੋਂ ਘੱਟ ਐਂਡਰਾਇਡ ਸੰਸਕਰਣਾਂ ਲਈ ਛੋਟੀ ਗਿਣਤੀ ਫਾਰਮੈਟਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +ਖਾਲੀ ਨੋਟੀਫਿਕੇਸ਼ਨਾਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +SRT ਉਪਸਿਰਲੇਖ ਫਾਈਲਾਂ ਲਈ ਠੀਕ ਕੀਤਾ ਗਿਆ +ਬਹੁਤ ਸਾਰੇ ਕਰੈਸ਼ ਠੀਕ ਕੀਤੇ ਗਏ + +# ਵਿਕਾਸ +ਅੰਦਰੂਨੀ ਕੋਡ ਆਧੁਨਿਕੀਕਰਨ diff --git a/fastlane/metadata/android/pa/changelogs/65.txt b/fastlane/metadata/android/pa/changelogs/65.txt index 0fbf1147e..0f7f8fe7d 100644 --- a/fastlane/metadata/android/pa/changelogs/65.txt +++ b/fastlane/metadata/android/pa/changelogs/65.txt @@ -1 +1,13 @@ -### ਸੁਧਾਰ - ਬਰਗਰਮੇਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ #1486 ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ - ਡਾਉਨਲੋਡਸ #1472 ਨੂੰ ਮਿਟਾਉਣ ਨੂੰ ਅਨਡੂ ਕਰੋ - ਸ਼ੇਅਰ ਮੀਨੂ #1498 ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ - ਲੰਬੇ ਟੈਪ ਮੀਨੂ #1454 ਵਿੱਚ ਸ਼ੇਅਰ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ - ਨਿਕਾਸ #1354 'ਤੇ ਮੁੱਖ ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰੋ - ਲਾਇਬ੍ਰੇਰੀ ਸੰਸਕਰਣ ਅਪਡੇਟ ਅਤੇ ਡੇਟਾਬੇਸ ਬੈਕਅਪ ਫਿਕਸ #1510 - ExoPlayer 2.8.2 ਅੱਪਡੇਟ #1392 - ਤੇਜ਼ ਗਤੀ ਤਬਦੀਲੀ ਲਈ ਵੱਖ-ਵੱਖ ਸਟੈਪ ਸਾਈਜ਼ ਦਾ ਸਮਰਥਨ ਕਰਨ ਲਈ ਪਲੇਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ ਡਾਇਲਾਗ ਨੂੰ ਦੁਬਾਰਾ ਬਣਾਇਆ ਗਿਆ। - ਪਲੇਬੈਕ ਸਪੀਡ ਨਿਯੰਤਰਣ ਵਿੱਚ ਚੁੱਪ ਦੌਰਾਨ ਫਾਸਟ-ਫਾਰਵਰਡ ਕਰਨ ਲਈ ਇੱਕ ਟੌਗਲ ਜੋੜਿਆ ਗਿਆ। ਇਹ ਆਡੀਓਬੁੱਕਾਂ ਅਤੇ ਕੁਝ ਸੰਗੀਤ ਸ਼ੈਲੀਆਂ ਲਈ ਮਦਦਗਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ ਇੱਕ ਸੱਚਾ ਸਹਿਜ ਅਨੁਭਵ ਲਿਆ ਸਕਦਾ ਹੈ (ਅਤੇ ਬਹੁਤ ਸਾਰੀਆਂ ਚੁੱਪ =\\ ਨਾਲ ਗੀਤ ਤੋੜ ਸਕਦਾ ਹੈ)। - ਹੱਥੀਂ ਅਜਿਹਾ ਕਰਨ ਦੀ ਬਜਾਏ, ਪਲੇਅਰ ਵਿੱਚ ਅੰਦਰੂਨੀ ਤੌਰ 'ਤੇ ਮੀਡੀਆ ਦੇ ਨਾਲ-ਨਾਲ ਮੈਟਾਡੇਟਾ ਪਾਸ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ ਰੀਫੈਕਟਰਡ ਮੀਡੀਆ ਸਰੋਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ। ਹੁਣ ਸਾਡੇ ਕੋਲ ਮੈਟਾਡੇਟਾ ਦਾ ਇੱਕ ਸਿੰਗਲ ਸਰੋਤ ਹੈ ਅਤੇ ਪਲੇਬੈਕ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਸਿੱਧਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਸਥਿਰ ਰਿਮੋਟ ਪਲੇਲਿਸਟ ਮੈਟਾਡੇਟਾ ਅੱਪਡੇਟ ਨਹੀਂ ਹੋ ਰਿਹਾ ਹੈ ਜਦੋਂ ਪਲੇਲਿਸਟ ਫਰੈਗਮੈਂਟ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਤਾਂ ਨਵਾਂ ਮੈਟਾਡੇਟਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਕਈ UI ਫਿਕਸ: #1383, ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕੰਟਰੋਲ ਹੁਣ ਹਮੇਸ਼ਾ ਸਫੈਦ, ਫਲਿੰਗਿੰਗ ਰਾਹੀਂ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨਾ ਆਸਾਨ - ਮਲਟੀਸਰਵਿਸ ਲਈ ਰੀਫੈਕਟਰਡ ਆਰਕੀਟੈਕਚਰ ਦੇ ਨਾਲ ਨਵੇਂ ਐਕਸਟਰੈਕਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ ### ਫਿਕਸ - #1440 ਟੁੱਟੇ ਹੋਏ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਲੇਆਉਟ #1491 ਨੂੰ ਠੀਕ ਕਰੋ - ਇਤਿਹਾਸ ਫਿਕਸ #1497 ਦੇਖੋ - #1495, ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਪਲੇਲਿਸਟ ਤੱਕ ਪਹੁੰਚ ਕਰਦਾ ਹੈ, ਮੈਟਾਡੇਟਾ (ਥੰਬਨੇਲ, ਸਿਰਲੇਖ ਅਤੇ ਵੀਡੀਓ ਗਿਣਤੀ) ਨੂੰ ਅਪਡੇਟ ਕਰਕੇ। - #1475, ਜਦੋਂ ਉਪਭੋਗਤਾ ਵੇਰਵੇ ਦੇ ਟੁਕੜੇ 'ਤੇ ਬਾਹਰੀ ਪਲੇਅਰ 'ਤੇ ਵੀਡੀਓ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ ਤਾਂ ਡੇਟਾਬੇਸ ਵਿੱਚ ਇੱਕ ਦ੍ਰਿਸ਼ ਨੂੰ ਰਜਿਸਟਰ ਕਰਕੇ। - ਪੌਪਅੱਪ ਮੋਡ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਕ੍ਰੀਨ ਟਾਈਮਆਊਟ ਫਿਕਸ ਕਰੋ। #1463 (ਸਥਿਰ #640) - ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਫਿਕਸ #1509 - [#1412] ਫਿਕਸਡ ਰੀਪੀਟ ਮੋਡ ਜਿਸ ਨਾਲ ਪਲੇਅਰ ਐਨਪੀਈ ਦਾ ਕਾਰਨ ਬਣਦਾ ਹੈ ਜਦੋਂ ਪਲੇਅਰ ਦੀ ਗਤੀਵਿਧੀ ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵਾਂ ਇਰਾਦਾ ਪ੍ਰਾਪਤ ਹੁੰਦਾ ਹੈ। - ਪੌਪਅੱਪ ਲਈ ਫਿਕਸਡ ਮਿਨੀਮਾਈਜ਼ਿੰਗ ਪਲੇਅਰ ਪਲੇਅਰ ਨੂੰ ਨਸ਼ਟ ਨਹੀਂ ਕਰਦਾ ਹੈ ਜਦੋਂ ਪੌਪਅੱਪ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ। +### ਸੁਧਾਰ + +- ਬਰਗਰ ਮੀਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ ਨੂੰ ਅਯੋਗ ਕਰੋ #1486 +- ਡਾਊਨਲੋਡਸ ਨੂੰ ਅਨਡੂ ਕਰੋ #1472 +- ਸ਼ੇਅਰ ਮੀਨੂ ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ #1498 +- ਲੰਬੇ ਟੈਪ ਮੀਨੂ ਵਿੱਚ ਸਾਂਝਾ ਵਿਕਲਪ ਜੋੜਿਆ ਗਿਆ #1454 +- ਐਕਸੋਪਲੇਅਰ 2.8.2 ਅਪਡੇਟ #1392 +- ਕਈ UI ਫਿਕਸ: #1383 + +### ਫਿਕਸ + +- ਵਿਊ ਹਿਸਟਰੀ ਫਿਕਸ #1497 +- #1495, ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਪਲੇਲਿਸਟ ਤੱਕ ਪਹੁੰਚ ਕਰਦਾ ਹੈ, ਮੈਟਾਡੇਟਾ (ਥੰਬਨੇਲ, ਸਿਰਲੇਖ ਅਤੇ ਵੀਡੀਓ ਗਿਣਤੀ) ਨੂੰ ਅਪਡੇਟ ਕਰਕੇ। diff --git a/fastlane/metadata/android/pa/changelogs/66.txt b/fastlane/metadata/android/pa/changelogs/66.txt index aecf80cbc..f400eb137 100644 --- a/fastlane/metadata/android/pa/changelogs/66.txt +++ b/fastlane/metadata/android/pa/changelogs/66.txt @@ -1 +1,21 @@ -# v0.13.7 ਦਾ ਚੇਂਜਲਾਗ ### ਸਥਿਰ - v0.13.6 ਦੇ ਕ੍ਰਮਬੱਧ ਫਿਲਟਰ ਮੁੱਦਿਆਂ ਨੂੰ ਠੀਕ ਕਰੋ # v0.13.6 ਦਾ ਚੇਂਜਲਾਗ ### ਸੁਧਾਰ - ਬਰਗਰਮੇਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ #1486 ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ - ਡਾਉਨਲੋਡਸ #1472 ਨੂੰ ਮਿਟਾਉਣ ਨੂੰ ਅਨਡੂ ਕਰੋ - ਸ਼ੇਅਰ ਮੀਨੂ #1498 ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ - ਲੰਬੇ ਟੈਪ ਮੀਨੂ #1454 ਵਿੱਚ ਸ਼ੇਅਰ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ - ਨਿਕਾਸ #1354 'ਤੇ ਮੁੱਖ ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰੋ - ਲਾਇਬ੍ਰੇਰੀ ਸੰਸਕਰਣ ਅਪਡੇਟ ਅਤੇ ਡੇਟਾਬੇਸ ਬੈਕਅਪ ਫਿਕਸ #1510 - ExoPlayer 2.8.2 ਅੱਪਡੇਟ #1392 - ਤੇਜ਼ ਗਤੀ ਤਬਦੀਲੀ ਲਈ ਵੱਖ-ਵੱਖ ਸਟੈਪ ਸਾਈਜ਼ ਦਾ ਸਮਰਥਨ ਕਰਨ ਲਈ ਪਲੇਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ ਡਾਇਲਾਗ ਨੂੰ ਦੁਬਾਰਾ ਬਣਾਇਆ ਗਿਆ। - ਪਲੇਬੈਕ ਸਪੀਡ ਨਿਯੰਤਰਣ ਵਿੱਚ ਚੁੱਪ ਦੌਰਾਨ ਫਾਸਟ-ਫਾਰਵਰਡ ਕਰਨ ਲਈ ਇੱਕ ਟੌਗਲ ਜੋੜਿਆ ਗਿਆ। ਇਹ ਆਡੀਓਬੁੱਕਾਂ ਅਤੇ ਕੁਝ ਸੰਗੀਤ ਸ਼ੈਲੀਆਂ ਲਈ ਮਦਦਗਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ ਇੱਕ ਸੱਚਾ ਸਹਿਜ ਅਨੁਭਵ ਲਿਆ ਸਕਦਾ ਹੈ (ਅਤੇ ਬਹੁਤ ਸਾਰੀਆਂ ਚੁੱਪ =\\ ਨਾਲ ਗੀਤ ਤੋੜ ਸਕਦਾ ਹੈ)। - ਹੱਥੀਂ ਅਜਿਹਾ ਕਰਨ ਦੀ ਬਜਾਏ, ਪਲੇਅਰ ਵਿੱਚ ਅੰਦਰੂਨੀ ਤੌਰ 'ਤੇ ਮੀਡੀਆ ਦੇ ਨਾਲ-ਨਾਲ ਮੈਟਾਡੇਟਾ ਪਾਸ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ ਰੀਫੈਕਟਰਡ ਮੀਡੀਆ ਸਰੋਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ। ਹੁਣ ਸਾਡੇ ਕੋਲ ਮੈਟਾਡੇਟਾ ਦਾ ਇੱਕ ਸਿੰਗਲ ਸਰੋਤ ਹੈ ਅਤੇ ਪਲੇਬੈਕ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਸਿੱਧਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਸਥਿਰ ਰਿਮੋਟ ਪਲੇਲਿਸਟ ਮੈਟਾਡੇਟਾ ਅੱਪਡੇਟ ਨਹੀਂ ਹੋ ਰਿਹਾ ਹੈ ਜਦੋਂ ਪਲੇਲਿਸਟ ਫਰੈਗਮੈਂਟ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਤਾਂ ਨਵਾਂ ਮੈਟਾਡੇਟਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਕਈ UI ਫਿਕਸ: #1383, ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕੰਟਰੋਲ ਹੁਣ ਹਮੇਸ਼ਾ ਸਫੈਦ, ਫਲਿੰਗਿੰਗ ਰਾਹੀਂ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨਾ ਆਸਾਨ - ਮਲਟੀਸਰਵਿਸ ਲਈ ਰੀਫੈਕਟਰਡ ਆਰਕੀਟੈਕਚਰ ਦੇ ਨਾਲ ਨਵੇਂ ਐਕਸਟਰੈਕਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ ### ਫਿਕਸ - #1440 ਟੁੱਟੇ ਹੋਏ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਲੇਆਉਟ #1491 ਨੂੰ ਠੀਕ ਕਰੋ - ਇਤਿਹਾਸ ਫਿਕਸ #1497 ਦੇਖੋ - #1495, ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਪਲੇਲਿਸਟ ਤੱਕ ਪਹੁੰਚ ਕਰਦਾ ਹੈ, ਮੈਟਾਡੇਟਾ (ਥੰਬਨੇਲ, ਸਿਰਲੇਖ ਅਤੇ ਵੀਡੀਓ ਗਿਣਤੀ) ਨੂੰ ਅਪਡੇਟ ਕਰਕੇ। - #1475, ਜਦੋਂ ਉਪਭੋਗਤਾ ਵੇਰਵੇ ਦੇ ਟੁਕੜੇ 'ਤੇ ਬਾਹਰੀ ਪਲੇਅਰ 'ਤੇ ਵੀਡੀਓ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ ਤਾਂ ਡੇਟਾਬੇਸ ਵਿੱਚ ਇੱਕ ਦ੍ਰਿਸ਼ ਨੂੰ ਰਜਿਸਟਰ ਕਰਕੇ। - ਪੌਪਅੱਪ ਮੋਡ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਕ੍ਰੀਨ ਟਾਈਮਆਊਟ ਫਿਕਸ ਕਰੋ। #1463 (ਸਥਿਰ #640) - ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਫਿਕਸ #1509 - [#1412] ਫਿਕਸਡ ਰੀਪੀਟ ਮੋਡ ਜਿਸ ਨਾਲ ਪਲੇਅਰ ਐਨਪੀਈ ਦਾ ਕਾਰਨ ਬਣਦਾ ਹੈ ਜਦੋਂ ਪਲੇਅਰ ਦੀ ਗਤੀਵਿਧੀ ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵਾਂ ਇਰਾਦਾ ਪ੍ਰਾਪਤ ਹੁੰਦਾ ਹੈ। - ਪੌਪਅੱਪ ਲਈ ਫਿਕਸਡ ਮਿਨੀਮਾਈਜ਼ਿੰਗ ਪਲੇਅਰ ਪਲੇਅਰ ਨੂੰ ਨਸ਼ਟ ਨਹੀਂ ਕਰਦਾ ਹੈ ਜਦੋਂ ਪੌਪਅੱਪ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ। +# v0.13.7 ਲਈ ਚੇਂਜਲੌਗ + +### ਫਿਕਸ +- v0.13.6 ਤੋਂ ਸੌਰਟ ਫਿਲਟਰ ਨਾਲ ਸਮੱਸਿਆਵਾਂ ਹੱਲ ਕੀਤੀਆਂ ਗਈਆਂ। + +# v0.13.6 ਲਈ ਚੇਂਜਲੌਗ + +### ਸੁਧਾਰ + +- ਬਰਗਰ ਮੀਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ #1486 ਨੂੰ ਅਯੋਗ ਕਰੋ +- ਡਾਊਨਲੋਡਸ ਨੂੰ ਮਿਟਾਓ ਨੂੰ ਅਣਡੂ ਕਰੋ #1472 +- ਸ਼ੇਅਰ ਮੀਨੂ ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ #1498 +- ਲੰਬੇ ਟੈਪ ਮੀਨੂ ਵਿੱਚ ਸ਼ੇਅਰ ਵਿਕਲਪ ਜੋੜਿਆ ਗਿਆ #1454 +- ਐਕਸੋਪਲੇਅਰ 2.8.2 ਅਪਡੇਟ #1392 +ਕਈ UI ਫਿਕਸ: #1383 + +### ਫਿਕਸ + +- ਫਿਕਸ ਕੀਤਾ ਗਿਆ #1440 ਟੁੱਟਿਆ ਹੋਇਆ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਲੇਆਉਟ #1491 +- ਇਤਿਹਾਸ ਦੇਖੋ ਫਿਕਸ #1497 +- ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਫਿਕਸ #1509. diff --git a/fastlane/metadata/android/pa/changelogs/68.txt b/fastlane/metadata/android/pa/changelogs/68.txt index e8e54ea4f..7b98078df 100644 --- a/fastlane/metadata/android/pa/changelogs/68.txt +++ b/fastlane/metadata/android/pa/changelogs/68.txt @@ -1 +1,19 @@ -v0.14.1 ਦੇ # ਬਦਲਾਅ ### ਸਥਿਰ - ਵੀਡੀਓ url #1659 ਨੂੰ ਡੀਕ੍ਰਿਪਟ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ - ਸਥਿਰ ਵਰਣਨ ਲਿੰਕ #1657 ਨੂੰ ਚੰਗੀ ਤਰ੍ਹਾਂ ਐਕਸਟਰੈਕਟ ਨਹੀਂ ਕਰਦਾ ਹੈ v0.14.0 ਦੀਆਂ # ਤਬਦੀਲੀਆਂ ### ਨਵਾਂ - ਨਵਾਂ ਦਰਾਜ਼ ਡਿਜ਼ਾਈਨ #1461 - ਨਵਾਂ ਅਨੁਕੂਲਿਤ ਫਰੰਟ ਪੇਜ #1461 ### ਸੁਧਾਰ - ਮੁੜ ਕੰਮ ਕੀਤਾ ਸੰਕੇਤ ਨਿਯੰਤਰਣ #1604 - ਪੌਪਅੱਪ ਪਲੇਅਰ #1597 ਨੂੰ ਬੰਦ ਕਰਨ ਦਾ ਨਵਾਂ ਤਰੀਕਾ ### ਸਥਿਰ - ਗਾਹਕੀ ਦੀ ਗਿਣਤੀ ਉਪਲਬਧ ਨਾ ਹੋਣ 'ਤੇ ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ। #1649 ਬੰਦ ਹੁੰਦਾ ਹੈ। - ਉਹਨਾਂ ਮਾਮਲਿਆਂ ਵਿੱਚ "ਗਾਹਕ ਗਿਣਤੀ ਉਪਲਬਧ ਨਹੀਂ" ਦਿਖਾਓ - YouTube ਪਲੇਲਿਸਟ ਖਾਲੀ ਹੋਣ 'ਤੇ NPE ਨੂੰ ਠੀਕ ਕਰੋ - SoundCloud ਵਿੱਚ ਕਿਓਸਕ ਲਈ ਤੁਰੰਤ ਫਿਕਸ - ਰਿਫੈਕਟਰ ਅਤੇ ਬੱਗਫਿਕਸ #1623 - ਚੱਕਰੀ ਖੋਜ ਨਤੀਜੇ #1562 ਨੂੰ ਠੀਕ ਕਰੋ - ਸੀਕ ਬਾਰ ਨੂੰ ਸਥਿਰ ਤੌਰ 'ਤੇ ਬਾਹਰ ਨਾ ਕੱਢੋ - ਫਿਕਸ YT ਪ੍ਰੀਮੀਅਮ ਵੀਡੀਓ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਬਲੌਕ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ - ਕਈ ਵਾਰ ਲੋਡ ਨਾ ਹੋਣ ਵਾਲੇ ਵੀਡੀਓ ਨੂੰ ਠੀਕ ਕਰੋ (DASH ਪਾਰਸਿੰਗ ਦੇ ਕਾਰਨ) - ਵੀਡੀਓ ਵਰਣਨ ਵਿੱਚ ਲਿੰਕ ਫਿਕਸ ਕਰੋ - ਜਦੋਂ ਕੋਈ ਬਾਹਰੀ sdcard 'ਤੇ ਡਾਊਨਲੋਡ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦਾ ਹੈ ਤਾਂ ਚੇਤਾਵਨੀ ਦਿਖਾਓ - ਅਪਵਾਦ ਟਰਿੱਗਰ ਰਿਪੋਰਟ ਦਿਖਾਈ ਗਈ ਕੁਝ ਵੀ ਠੀਕ ਨਾ ਕਰੋ - ਐਂਡਰਾਇਡ 8.1 ਲਈ ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ ਥੰਬਨੇਲ ਨਹੀਂ ਦਿਖਾਇਆ ਗਿਆ [ਇੱਥੇ ਦੇਖੋ](https://github.com/TeamNewPipe/NewPipe/issues/943) - ਪ੍ਰਸਾਰਣ ਪ੍ਰਾਪਤ ਕਰਨ ਵਾਲੇ ਦੀ ਰਜਿਸਟਰੇਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ। #1641 ਬੰਦ ਹੁੰਦਾ ਹੈ। +# v0.14.1 ਵਿੱਚ ਬਦਲਾਅ + +### ਠੀਕ ਕੀਤਾ ਗਿਆ +- ਵੀਡੀਓ URL ਨੂੰ ਡੀਕ੍ਰਿਪਟ ਕਰਨ ਵਿੱਚ ਅਸਫਲਤਾ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ #1659 +- ਵਰਣਨ ਲਿੰਕ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਐਕਸਟਰੈਕਟ ਨਾ ਕਰਨ ਦੀ ਸਮੱਸਿਆ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ #1657 + +# v0.14.0 ਵਿੱਚ ਬਦਲਾਅ + +### ਨਵਾਂ +- ਨਵਾਂ ਦਰਾਜ਼ ਡਿਜ਼ਾਈਨ #1461 +- ਨਵਾਂ ਅਨੁਕੂਲਿਤ ਫਰੰਟ ਪੇਜ #1461 + +### ਸੁਧਾਰ +- ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨ ਦਾ ਨਵਾਂ ਤਰੀਕਾ #1597 + +### ਠੀਕ ਕੀਤਾ ਗਿਆ +- YouTube ਪਲੇਲਿਸਟਾਂ ਖਾਲੀ ਹੋਣ 'ਤੇ NPE ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +- SoundCloud ਵਿੱਚ ਕਿਓਸਕ ਲਈ ਤੁਰੰਤ ਠੀਕ ਕੀਤਾ ਗਿਆ +- ਰੀਫੈਕਟਰ ਅਤੇ ਬੱਗਫਿਕਸ #1623. diff --git a/fastlane/metadata/android/pa/changelogs/69.txt b/fastlane/metadata/android/pa/changelogs/69.txt index b6358991b..8956afb54 100644 --- a/fastlane/metadata/android/pa/changelogs/69.txt +++ b/fastlane/metadata/android/pa/changelogs/69.txt @@ -1 +1,15 @@ -### ਨਵਾਂ - ਮਿਟਾਓ ਅਤੇ ਸਬਸਕ੍ਰਿਪਸ਼ਨ #1516 ਵਿੱਚ ਸਾਂਝਾ ਕਰੋ - ਟੈਬਲੇਟ UI ਅਤੇ ਗਰਿੱਡ ਸੂਚੀ ਖਾਕਾ #1617 ### ਸੁਧਾਰ - ਆਖਰੀ ਵਰਤੇ ਗਏ ਆਸਪੈਕਟ ਰੇਸ਼ੋ #1748 ਨੂੰ ਸਟੋਰ ਅਤੇ ਰੀਲੋਡ ਕਰੋ - ਪੂਰੇ ਵੀਡੀਓ ਨਾਮ #1771 ਦੇ ਨਾਲ ਡਾਊਨਲੋਡ ਗਤੀਵਿਧੀ ਵਿੱਚ ਲੀਨੀਅਰ ਲੇਆਉਟ ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ - ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਟੈਬ #1516 ਦੇ ਅੰਦਰੋਂ ਸਿੱਧਾ ਗਾਹਕੀਆਂ ਨੂੰ ਮਿਟਾਓ ਅਤੇ ਸਾਂਝਾ ਕਰੋ - ਜੇਕਰ ਪਲੇ ਕਤਾਰ ਪਹਿਲਾਂ ਹੀ #1783 ਖਤਮ ਹੋ ਗਈ ਹੈ ਤਾਂ ਹੁਣ ਏਨਕਿਊ ਕਰਨਾ ਵੀਡੀਓ ਚਲਾਉਣ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ - ਵਾਲੀਅਮ ਅਤੇ ਚਮਕ ਸੰਕੇਤ #1644 ਲਈ ਵੱਖਰੀ ਸੈਟਿੰਗ - ਸਥਾਨਕਕਰਨ #1792 ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ### ਫਿਕਸ - ਲਈ ਪਾਰਸਿੰਗ ਸਮਾਂ ਫਿਕਸ ਕਰੋ। ਫਾਰਮੈਟ, ਇਸ ਲਈ ਨਿਊ ਪਾਈਪ ਨੂੰ ਫਿਨਲੈਂਡ ਵਿੱਚ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ - ਗਾਹਕੀ ਦੀ ਗਿਣਤੀ ਨੂੰ ਠੀਕ ਕਰੋ - API 28+ ਡਿਵਾਈਸਾਂ #1830 ਲਈ ਫੋਰਗਰਾਉਂਡ ਸੇਵਾ ਅਨੁਮਤੀ ਸ਼ਾਮਲ ਕਰੋ ### ਜਾਣੇ-ਪਛਾਣੇ ਬੱਗ - ਐਂਡ੍ਰਾਇਡ ਪੀ 'ਤੇ ਪਲੇਬੈਕ ਸਟੇਟ ਨੂੰ ਸੇਵ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ +### ਨਵਾਂ +- ਗਾਹਕੀਆਂ 'ਤੇ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਟੈਪ ਕਰਕੇ ਮਿਟਾਓ ਅਤੇ ਸਾਂਝਾ ਕਰੋ #1516 +- ਟੈਬਲੇਟ UI ਅਤੇ ਗਰਿੱਡ ਸੂਚੀ ਲੇਆਉਟ #1617 + +### ਸੁਧਾਰ +- ਵਾਲੀਅਮ ਅਤੇ ਚਮਕ ਸੰਕੇਤਾਂ ਲਈ ਵੱਖਰੀਆਂ ਸੈਟਿੰਗਾਂ #1644 +- ਸਥਾਨਕਕਰਨ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ #1792 + +### ਸੁਧਾਰ +- . ਫਾਰਮੈਟ ਲਈ ਸਮਾਂ ਪਾਰਸਿੰਗ ਠੀਕ ਕਰੋ ਤਾਂ ਜੋ ਫਿਨਲੈਂਡ ਵਿੱਚ ਨਿਊਪਾਈਪ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾ ਸਕੇ +- ਗਾਹਕੀ ਗਿਣਤੀ ਠੀਕ ਕਰੋ +- API 28+ ਡਿਵਾਈਸਾਂ ਲਈ ਫੋਰਗਰਾਉਂਡ ਸੇਵਾ ਅਨੁਮਤੀ ਸ਼ਾਮਲ ਕਰੋ #1830 + +### ਜਾਣੇ-ਪਛਾਣੇ ਬੱਗ +- ਪਲੇਬੈਕ ਸਥਿਤੀ ਨੂੰ ਐਂਡਰਾਇਡ ਪੀ 'ਤੇ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ diff --git a/fastlane/metadata/android/pa/changelogs/70.txt b/fastlane/metadata/android/pa/changelogs/70.txt index 97d781d4a..bedc91496 100644 --- a/fastlane/metadata/android/pa/changelogs/70.txt +++ b/fastlane/metadata/android/pa/changelogs/70.txt @@ -1 +1,10 @@ -ਧਿਆਨ ਦਿਓ: ਇਹ ਸੰਸਕਰਣ ਸ਼ਾਇਦ ਇੱਕ ਬੱਗਫੈਸਟ ਹੈ, ਬਿਲਕੁਲ ਪਿਛਲੇ ਇੱਕ ਵਾਂਗ। ਹਾਲਾਂਕਿ 17 ਤੋਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਬੰਦ ਹੋਣ ਦੇ ਕਾਰਨ. ਇੱਕ ਟੁੱਟਿਆ ਹੋਇਆ ਸੰਸਕਰਣ ਕੋਈ ਸੰਸਕਰਣ ਨਾਲੋਂ ਬਿਹਤਰ ਹੈ. ਸਹੀ? ¯\_(ツ)_/¯ ### ਸੁਧਾਰ * ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਨੂੰ ਹੁਣ ਇੱਕ ਕਲਿੱਕ ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਸਕਦਾ ਹੈ #1879 * ਐਂਡਰਾਇਡ 4.1 - 4.3 #1884 ਲਈ ਸਹਾਇਤਾ ਛੱਡੋ * ਪੁਰਾਣੇ ਪਲੇਅਰ #1884 ਨੂੰ ਹਟਾਓ * ਮੌਜੂਦਾ ਪਲੇ ਕਤਾਰ ਤੋਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸੱਜੇ #1915 'ਤੇ ਸਵਾਈਪ ਕਰਕੇ ਹਟਾਓ * ਆਟੋ ਕਤਾਰਬੱਧ ਸਟ੍ਰੀਮ ਨੂੰ ਹਟਾਓ ਜਦੋਂ ਇੱਕ ਨਵੀਂ ਸਟ੍ਰੀਮ ਹੱਥੀਂ ਕਤਾਰਬੱਧ ਹੁੰਦੀ ਹੈ #1878 * @kapodamy ਦੁਆਰਾ ਡਾਉਨਲੋਡ ਕਰਨ ਅਤੇ ਗੁੰਮ ਹੋਈਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ #1759 ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਪੋਸਟ ਪ੍ਰੋਸੈਸਿੰਗ * ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ ਬੁਨਿਆਦੀ ਢਾਂਚਾ * "ਬੁਨਿਆਦੀ ਢਾਂਚੇ" ਨੂੰ ਸੰਭਾਲਣ ਲਈ ਸਹੀ ਤਰੁੱਟੀ (ਡਾਊਨਲੋਡਰ ਲਈ) * ਮਲਟੀਪਲ ਡਾਉਨਲੋਡਸ ਦੀ ਬਜਾਏ ਕਤਾਰ * ਲੜੀਬੱਧ ਲੰਬਿਤ ਡਾਉਨਲੋਡਸ (`ਗੀਗਾ` ਫਾਈਲਾਂ) ਨੂੰ ਐਪ ਡੇਟਾ ਵਿੱਚ ਮੂਵ ਕਰੋ * ਅਧਿਕਤਮ ਡਾਊਨਲੋਡ ਦੀ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਨੂੰ ਲਾਗੂ ਕਰੋ * ਉਚਿਤ ਮਲਟੀ-ਥ੍ਰੈਡ ਡਾਊਨਲੋਡ ਵਿਰਾਮ * ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ 'ਤੇ ਜਾਣ ਵੇਲੇ ਡਾਊਨਲੋਡ ਬੰਦ ਕਰੋ (ਕਦੇ ਕੰਮ ਨਹੀਂ ਕਰਦਾ, ਦੂਜਾ ਪੁਆਇੰਟ ਦੇਖੋ) * ਅਗਲੇ ਡਾਉਨਲੋਡਸ ਲਈ ਥਰਿੱਡ ਗਿਣਤੀ ਨੂੰ ਸੁਰੱਖਿਅਤ ਕਰੋ * ਬਹੁਤ ਸਾਰੀਆਂ ਅਸੰਗਤੀਆਂ ਹੱਲ ਕੀਤੀਆਂ ਗਈਆਂ ### ਸਥਿਰ * ਪੂਰਵ-ਨਿਰਧਾਰਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਨਾਲ ਕਰੈਸ਼ ਨੂੰ ਬਿਹਤਰ ਅਤੇ ਸੀਮਤ ਮੋਬਾਈਲ ਡਾਟਾ ਰੈਜ਼ੋਲਿਊਸ਼ਨ #1835 'ਤੇ ਸੈੱਟ ਕਰੋ * ਪੌਪ-ਅੱਪ ਪਲੇਅਰ ਕਰੈਸ਼ ਫਿਕਸਡ #1874 * ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ #1901 ਨੂੰ ਖੋਲ੍ਹਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਸਮੇਂ NPE * ਜਦੋਂ ਆਟੋ ਕਤਾਰ ਯੋਗ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸੰਮਿਲਿਤ ਕਰਨ ਲਈ ਠੀਕ ਕਰੋ #1878 * ਡੀਸਾਈਪਰਿੰਗ ਸ਼ੱਟਟਾਊਨ ਮੁੱਦੇ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ +ਸੁਧਾਰ +* ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਹੁਣ ਇੱਕ ਕਲਿੱਕ ਨਾਲ ਖੋਲ੍ਹੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ #1879 +* ਐਂਡਰਾਇਡ 4.1 - 4.3 ਲਈ ਡ੍ਰੌਪ ਸਪੋਰਟ #1884 +* ਪੁਰਾਣੇ ਪਲੇਅਰ ਨੂੰ ਹਟਾਓ #1884 +* ਮੌਜੂਦਾ ਪਲੇ ਕਤਾਰ ਤੋਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਸਵਾਈਪ ਕਰਕੇ ਹਟਾਓ #1915 +* ਜਦੋਂ ਇੱਕ ਨਵੀਂ ਸਟ੍ਰੀਮ ਨੂੰ ਹੱਥੀਂ ਕਤਾਰਬੱਧ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਤਾਂ ਆਟੋ ਕਤਾਰਬੱਧ ਸਟ੍ਰੀਮ ਨੂੰ ਹਟਾਓ #1878 +* ਬਹੁਤ ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਅਸੰਗਤੀਆਂ ਠੀਕ ਕੀਤੀਆਂ ਗਈਆਂ + +ਫਿਕਸਡ +* ਬਹੁਤ ਸਾਰੀਆਂ ਅਸੰਗਤੀਆਂ ਠੀਕ ਕੀਤੀਆਂ ਗਈਆਂ diff --git a/fastlane/metadata/android/pa/changelogs/71.txt b/fastlane/metadata/android/pa/changelogs/71.txt index bafa26f8c..2f11dea82 100644 --- a/fastlane/metadata/android/pa/changelogs/71.txt +++ b/fastlane/metadata/android/pa/changelogs/71.txt @@ -1 +1,8 @@ -### ਸੁਧਾਰ * GitHub ਬਿਲਡ ਲਈ ਐਪ ਅਪਡੇਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਸ਼ਾਮਲ ਕਰੋ (@krtkush ਦੁਆਰਾ #1608) * ਡਾਊਨਲੋਡਰ ਵਿੱਚ ਕਈ ਸੁਧਾਰ (@kapodamy ਦੁਆਰਾ #1944): * ਗੁੰਮ ਹੋਏ ਚਿੱਟੇ ਆਈਕਨ ਸ਼ਾਮਲ ਕਰੋ ਅਤੇ ਆਈਕਨ ਦੇ ਰੰਗਾਂ ਨੂੰ ਬਦਲਣ ਲਈ ਹਾਰਡਕੋਰਡ ਤਰੀਕੇ ਦੀ ਵਰਤੋਂ ਕਰੋ * ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਇਟਰੇਟਰ ਸ਼ੁਰੂ ਕੀਤਾ ਗਿਆ ਹੈ (ਫਿਕਸ #2031) * ਨਵੇਂ ਮੁਕਸਰ ਵਿੱਚ "ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ ਫੇਲ੍ਹ" ਗਲਤੀ ਦੇ ਨਾਲ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ * ਨਵਾਂ MPEG-4 ਮੁਕਸਰ ਫਿਕਸਿੰਗ ਗੈਰ-ਸਿੰਕਰੋਨਸ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਸਟ੍ਰੀਮਜ਼ (#2039) ### ਸਥਿਰ * YouTube ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਥੋੜ੍ਹੇ ਸਮੇਂ ਬਾਅਦ ਚੱਲਣੀਆਂ ਬੰਦ ਹੋ ਜਾਂਦੀਆਂ ਹਨ (@yausername ਦੁਆਰਾ #1996) +ਸੁਧਾਰ +* GitHub ਬਿਲਡ ਲਈ ਐਪ ਅੱਪਡੇਟ ਸੂਚਨਾ ਸ਼ਾਮਲ ਕਰੋ (#1608 @krtkush ਦੁਆਰਾ) +* ਡਾਊਨਲੋਡਰ ਵਿੱਚ ਕਈ ਸੁਧਾਰ (#1944 @kapodamy ਦੁਆਰਾ) +* ਨਵੇਂ ਮਕਸਰ ਵਿੱਚ "ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ ਅਸਫਲ" ਗਲਤੀ ਨਾਲ ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ +* ਨਵਾਂ MPEG-4 ਮਕਸਰ ਗੈਰ-ਸਮਕਾਲੀ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਠੀਕ ਕਰਦਾ ਹੈ (#2039) + +ਫਿਕਸਡ +* YouTube ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਥੋੜ੍ਹੇ ਸਮੇਂ ਬਾਅਦ ਚੱਲਣਾ ਬੰਦ ਕਰ ਦਿੰਦੀਆਂ ਹਨ (#1996 @yausername ਦੁਆਰਾ) diff --git a/fastlane/metadata/android/pa/changelogs/740.txt b/fastlane/metadata/android/pa/changelogs/740.txt index 6a2dbdc86..62da0f9c3 100644 --- a/fastlane/metadata/android/pa/changelogs/740.txt +++ b/fastlane/metadata/android/pa/changelogs/740.txt @@ -1 +1,8 @@ -ਬਦਲਾਅ ਸੂਚੀ ਅਨੁਵਾਦ ਕਰਣਯੋਗ ਨਹੀਂ। ਬਿਲਕੁਲ ਬਕਵਾਸ +

    ਸੁਧਾਰ

    +
      +
    • ਟਿੱਪਣੀਆਂ ਵਿੱਚ ਲਿੰਕਾਂ ਨੂੰ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਬਣਾਓ, ਟੈਕਸਟ ਦਾ ਆਕਾਰ ਵਧਾਓ
    • +
    • ਟਿੱਪਣੀਆਂ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪ ਕੀਤੇ ਲਿੰਕਾਂ 'ਤੇ ਕਲਿੱਕ ਕੀਤੇ ਜਾਣ 'ਤੇ ਖੋਜ ਕਰੋ
    • +
    • ਜਦੋਂ ਸਾਂਝਾ ਕੀਤਾ ਟੈਕਸਟ URL ਨਾ ਹੋਵੇ ਤਾਂ ਖੋਜ ਕਰੋ
    • +
    • ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ "ਹੁਣੇ ਸਾਂਝਾ ਕਰੋ" ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ
    • +
    • ExoPlayer ਨੂੰ 2.9.6 'ਤੇ ਅੱਪਡੇਟ ਕਰਨਾ
    • +
    diff --git a/fastlane/metadata/android/pa/changelogs/750.txt b/fastlane/metadata/android/pa/changelogs/750.txt index 0b875b705..c24183ddb 100644 --- a/fastlane/metadata/android/pa/changelogs/750.txt +++ b/fastlane/metadata/android/pa/changelogs/750.txt @@ -1 +1,9 @@ -ਨਵਾਂ ਪਲੇਬੈਕ ਰੈਜ਼ਿਊਮੇ #2288 • ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ ਜਿੱਥੇ ਤੁਸੀਂ ਪਿਛਲੀ ਵਾਰ ਰੁਕੇ ਸੀ ਡਾਊਨਲੋਡਰ ਸੁਧਾਰ #2149 • ਬਾਹਰੀ SD-ਕਾਰਡਾਂ 'ਤੇ ਡਾਊਨਲੋਡ ਸਟੋਰ ਕਰਨ ਲਈ ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ • ਨਵਾਂ mp4 muxer • ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਡਾਉਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਬਦਲੋ • ਮੀਟਰਡ ਨੈੱਟਵਰਕਾਂ ਦਾ ਆਦਰ ਕਰੋ ਸੁਧਾਰ • gema ਸਤਰ #2295 ਨੂੰ ਹਟਾਇਆ • ਗਤੀਵਿਧੀ ਜੀਵਨ ਚੱਕਰ #2444 ਦੌਰਾਨ ਹੈਂਡਲ (ਆਟੋ) ਰੋਟੇਸ਼ਨ ਤਬਦੀਲੀਆਂ • ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਨੂੰ ਇਕਸਾਰ #2368 ਬਣਾਓ ਸਥਿਰ • ਫਿਕਸਡ ਚੁਣਿਆ ਹੋਇਆ ਉਪਸਿਰਲੇਖ ਟਰੈਕ ਨਾਮ #2394 ਨਹੀਂ ਦਿਖਾਇਆ ਜਾ ਰਿਹਾ ਹੈ • ਐਪ ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਅਸਫਲ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨਾ ਹੋਵੋ (GitHub ਸੰਸਕਰਣ) #2423 • ਸਥਿਰ ਡਾਊਨਲੋਡ 99.9% #2440 'ਤੇ ਅਟਕ ਗਏ • ਪਲੇ ਕਤਾਰ ਮੈਟਾਡੇਟਾ #2453 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ • [SoundCloud] ਪਲੇਲਿਸਟਸ ਲੋਡ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ TeamNewPipe/NewPipeExtractor#170 • [YouTube] ਸਥਿਰ ਅਵਧੀ ਨੂੰ ਪਾਰਸਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ TeamNewPipe/NewPipeExtractor#177 +ਨਵਾਂ +ਪਲੇਬੈਕ ਰੈਜ਼ਿਊਮੇ #2288 +ਡਾਊਨਲੋਡਰ ਸੁਧਾਰ #2149 +• ਬਾਹਰੀ SD-ਕਾਰਡਾਂ 'ਤੇ ਡਾਊਨਲੋਡ ਸਟੋਰ ਕਰਨ ਲਈ ਸਟੋਰੇਜ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ +• ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਡਾਊਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਬਦਲੋ +• ਮੀਟਰ ਕੀਤੇ ਨੈੱਟਵਰਕਾਂ ਦਾ ਸਤਿਕਾਰ ਕਰੋ + +ਸਥਿਰ +• [YouTube] ਸਥਿਰ ਮਿਆਦ ਨੂੰ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pa/changelogs/760.txt b/fastlane/metadata/android/pa/changelogs/760.txt index fd4b8f2a4..6279139d0 100644 --- a/fastlane/metadata/android/pa/changelogs/760.txt +++ b/fastlane/metadata/android/pa/changelogs/760.txt @@ -1 +1,10 @@ -0.17.1 ਵਿੱਚ ਬਦਲਾਅ ਨਵਾਂ • ਥਾਈ ਸਥਾਨਕਕਰਨ ਸੁਧਾਰ • ਦੁਬਾਰਾ #2518 ਪਲੇਲਿਸਟਾਂ ਲਈ ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਵਿੱਚ ਇੱਥੇ ਪਲੇ ਸ਼ੁਰੂ ਕਰੋ ਐਕਸ਼ਨ ਸ਼ਾਮਲ ਕਰੋ • SAF / ਪੁਰਾਤਨ ਫਾਈਲ ਪਿਕਰ #2521 ਲਈ ਸਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • ਐਪਸ #2487 ਨੂੰ ਬਦਲਦੇ ਸਮੇਂ ਡਾਊਨਲੋਡ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਗਾਇਬ ਹੋਣ ਵਾਲੇ ਬਟਨਾਂ ਨੂੰ ਠੀਕ ਕਰੋ • ਫਿਕਸ ਪਲੇਬੈਕ ਸਥਿਤੀ ਸਟੋਰ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਹਾਲਾਂਕਿ ਦੇਖਣ ਦਾ ਇਤਿਹਾਸ ਅਯੋਗ ਹੈ • ਸੂਚੀ ਦ੍ਰਿਸ਼ #2517 ਵਿੱਚ ਪਲੇਬੈਕ ਸਥਿਤੀ ਦੇ ਕਾਰਨ ਘਟੇ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ • [ਐਕਸਟ੍ਰੈਕਟਰ] ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 ਫਿਕਸ • [ਐਕਸਟ੍ਰੈਕਟਰ] [YouTube] ਜਦੋਂ ਪਲੇਲਿਸਟਾਂ ਨਤੀਜੇ ਵਿੱਚ ਹੋਣ ਤਾਂ ਆਮ ਖੋਜ ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ TeamNewPipe/NewPipeExtractor#185 0.17.0 ਵਿੱਚ ਬਦਲਾਅ ਨਵਾਂ ਪਲੇਬੈਕ ਰੈਜ਼ਿਊਮੇ #2288 • ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ ਜਿੱਥੇ ਤੁਸੀਂ ਪਿਛਲੀ ਵਾਰ ਰੁਕੇ ਸੀ ਡਾਊਨਲੋਡਰ ਸੁਧਾਰ #2149 • ਬਾਹਰੀ SD-ਕਾਰਡਾਂ 'ਤੇ ਡਾਊਨਲੋਡ ਸਟੋਰ ਕਰਨ ਲਈ ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ • ਨਵਾਂ mp4 muxer • ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਡਾਉਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਬਦਲੋ • ਮੀਟਰਡ ਨੈੱਟਵਰਕਾਂ ਦਾ ਆਦਰ ਕਰੋ ਸੁਧਾਰ • gema ਸਤਰ #2295 ਨੂੰ ਹਟਾਇਆ • ਗਤੀਵਿਧੀ ਜੀਵਨ ਚੱਕਰ #2444 ਦੌਰਾਨ ਹੈਂਡਲ (ਆਟੋ) ਰੋਟੇਸ਼ਨ ਤਬਦੀਲੀਆਂ • ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਨੂੰ ਇਕਸਾਰ #2368 ਬਣਾਓ ਸਥਿਰ • ਫਿਕਸਡ ਚੁਣਿਆ ਹੋਇਆ ਉਪਸਿਰਲੇਖ ਟਰੈਕ ਨਾਮ #2394 ਨਹੀਂ ਦਿਖਾਇਆ ਜਾ ਰਿਹਾ ਹੈ • ਐਪ ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਅਸਫਲ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨਾ ਹੋਵੋ (GitHub ਸੰਸਕਰਣ) #2423 • ਸਥਿਰ ਡਾਊਨਲੋਡ 99.9% #2440 'ਤੇ ਅਟਕ ਗਏ • ਪਲੇ ਕਤਾਰ ਮੈਟਾਡੇਟਾ #2453 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ • [SoundCloud] ਪਲੇਲਿਸਟਸ ਲੋਡ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ TeamNewPipe/NewPipeExtractor#170 • [YouTube] ਸਥਿਰ ਅਵਧੀ ਨੂੰ ਪਾਰਸਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ TeamNewPipe/NewPipeExtractor#177 +0.17.1 ਵਿੱਚ ਬਦਲਾਅ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਪਲੇਲਿਸਟਾਂ ਲਈ ਦੁਬਾਰਾ ਲੰਬੇ-ਦਬਾਓ ਵਾਲੇ ਮੀਨੂ ਵਿੱਚ ਇੱਥੇ ਚਲਾਉਣਾ ਸ਼ੁਰੂ ਕਰੋ ਐਕਸ਼ਨ ਸ਼ਾਮਲ ਕਰੋ +• SAF / ਲੀਗੇਸੀ ਫਾਈਲ ਪਿਕਰ #2521 ਲਈ ਸਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ +ਫਿਕਸਡ +• ਐਪਸ ਨੂੰ ਸਵਿੱਚ ਕਰਦੇ ਸਮੇਂ ਡਾਊਨਲੋਡ ਵਿਊ ਵਿੱਚ ਗਾਇਬ ਹੋਣ ਵਾਲੇ ਬਟਨਾਂ ਨੂੰ ਠੀਕ ਕਰੋ #2487 +• ਦੇਖਣ ਦੇ ਇਤਿਹਾਸ ਨੂੰ ਅਯੋਗ ਹੋਣ ਦੇ ਬਾਵਜੂਦ ਸਟੋਰ ਕੀਤੀ ਗਈ ਪਲੇਬੈਕ ਸਥਿਤੀ ਨੂੰ ਠੀਕ ਕਰੋ +• ਸੂਚੀ ਵਿਊ ਵਿੱਚ ਪਲੇਬੈਕ ਸਥਿਤੀ ਕਾਰਨ ਘਟੀ ਹੋਈ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ +• [ਐਕਸਟ੍ਰੈਕਟਰ] [YouTube] ਜਦੋਂ ਪਲੇਲਿਸਟਾਂ ਨਤੀਜਿਆਂ ਵਿੱਚ ਹੋਣ ਤਾਂ ਆਮ ਖੋਜ ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/780.txt b/fastlane/metadata/android/pa/changelogs/780.txt index 999a24468..923a0410a 100644 --- a/fastlane/metadata/android/pa/changelogs/780.txt +++ b/fastlane/metadata/android/pa/changelogs/780.txt @@ -1 +1,11 @@ -0.17.3 ਵਿੱਚ ਬਦਲਾਅ ਸੁਧਾਰ • ਪਲੇਬੈਕ ਸਥਿਤੀਆਂ #2550 ਨੂੰ ਸਾਫ਼ ਕਰਨ ਲਈ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਫਾਈਲ ਪਿਕਰ #2591 ਵਿੱਚ ਲੁਕੀਆਂ ਹੋਈਆਂ ਡਾਇਰੈਕਟਰੀਆਂ ਦਿਖਾਓ • NewPipe #2488 ਨਾਲ ਖੋਲ੍ਹੇ ਜਾਣ ਵਾਲੇ `invidio.us` ਉਦਾਹਰਨਾਂ ਤੋਂ ਸਮਰਥਨ URL • `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • [YouTube] ਸਥਿਰ 'java.lang.IllegalArgumentException #192 • [YouTube] ਸਥਿਰ ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀਆਂ TeamNewPipe/NewPipeExtractor#195 • ਇੱਕ ਸਟ੍ਰੀਮ #2592 ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਵੇਲੇ ਐਂਡਰੌਇਡ ਪਾਈ ਵਿੱਚ ਸਥਿਰ ਪ੍ਰਦਰਸ਼ਨ ਸਮੱਸਿਆ +0.17.3 ਵਿੱਚ ਬਦਲਾਅ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਪਲੇਬੈਕ ਸਥਿਤੀਆਂ ਨੂੰ ਸਾਫ਼ ਕਰਨ ਲਈ ਵਿਕਲਪ ਜੋੜਿਆ ਗਿਆ #2550 +• ਫਾਈਲ ਚੋਣਕਾਰ #2591 ਵਿੱਚ ਲੁਕੀਆਂ ਹੋਈਆਂ ਡਾਇਰੈਕਟਰੀਆਂ ਦਿਖਾਓ +• NewPipe #2488 ਨਾਲ ਖੋਲ੍ਹੇ ਜਾਣ ਵਾਲੇ `invidio.us` ਉਦਾਹਰਣਾਂ ਤੋਂ URL ਦਾ ਸਮਰਥਨ ਕਰੋ +• `music.youtube.com` URL ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ + +ਸਥਿਰ +• [YouTube] ਫਿਕਸਡ ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀਆਂ +• ਸਟ੍ਰੀਮ ਡਾਊਨਲੋਡ ਕਰਦੇ ਸਮੇਂ ਐਂਡਰਾਇਡ ਪਾਈ ਵਿੱਚ ਪ੍ਰਦਰਸ਼ਨ ਸਮੱਸਿਆ ਹੱਲ ਕੀਤੀ ਗਈ #2592 diff --git a/fastlane/metadata/android/pa/changelogs/790.txt b/fastlane/metadata/android/pa/changelogs/790.txt index f841801eb..28627c7ec 100644 --- a/fastlane/metadata/android/pa/changelogs/790.txt +++ b/fastlane/metadata/android/pa/changelogs/790.txt @@ -1 +1,11 @@ -ਸੁਧਾਰ • ਅੰਨ੍ਹੇ ਲੋਕਾਂ #2655 ਲਈ ਪਹੁੰਚਯੋਗਤਾ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਹੋਰ ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕਰੋ • ਡਾਉਨਲੋਡ ਫੋਲਡਰ ਸੈਟਿੰਗ ਦੀ ਭਾਸ਼ਾ ਨੂੰ ਵਧੇਰੇ ਇਕਸਾਰ ਅਤੇ ਘੱਟ ਅਸਪਸ਼ਟ #2637 ਬਣਾਓ ਸਥਿਰ • ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਬਲਾਕ ਵਿੱਚ ਆਖਰੀ ਬਾਈਟ #2646 ਡਾਊਨਲੋਡ ਕੀਤੀ ਗਈ ਹੈ • ਵੀਡੀਓ ਡਿਟੇਲ ਫਰੈਗਮੈਂਟ #2672 ਵਿੱਚ ਸਥਿਰ ਸਕ੍ਰੋਲਿੰਗ • ਡਬਲ ਸਰਚ ਕਲੀਅਰ ਬਾਕਸ ਐਨੀਮੇਸ਼ਨ ਨੂੰ ਇੱਕ #2695 ਵਿੱਚ ਹਟਾਓ • [SoundCloud] ਕਲਾਇਟ_ਆਈਡੀ ਐਕਸਟਰੈਕਸ਼ਨ #2745 ਨੂੰ ਠੀਕ ਕਰੋ ਵਿਕਾਸ • NewPipeExtractor ਤੋਂ ਵਿਰਾਸਤ ਵਿੱਚ ਮਿਲੀ ਗੁੰਮ ਨਿਰਭਰਤਾ ਨੂੰ NewPipe #2535 ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ • AndroidX #2685 'ਤੇ ਮਾਈਗ੍ਰੇਟ ਕਰੋ • ExoPlayer 2.10.6 #2697, #2736 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ +ਸੁਧਾਰਿਆ ਗਿਆ +• ਹੋਰ ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕਰੋ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਬਲਾਕ ਵਿੱਚ ਆਖਰੀ ਬਾਈਟ ਡਾਊਨਲੋਡ ਕੀਤਾ ਗਿਆ ਹੈ #2646 +• ਵੀਡੀਓ ਵੇਰਵੇ ਵਾਲੇ ਟੁਕੜੇ #2672 ਵਿੱਚ ਸਕ੍ਰੌਲਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +• [SoundCloud] client_id ਐਕਸਟਰੈਕਸ਼ਨ #2745 ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ + +ਵਿਕਾਸ +• AndroidX 'ਤੇ ਮਾਈਗ੍ਰੇਟ ਕਰੋ +• ExoPlayer 2.10.6 'ਤੇ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/800.txt b/fastlane/metadata/android/pa/changelogs/800.txt index 53868c894..08940d095 100644 --- a/fastlane/metadata/android/pa/changelogs/800.txt +++ b/fastlane/metadata/android/pa/changelogs/800.txt @@ -1 +1,10 @@ -ਨਵਾਂ • P2P (#2201) [ਬੀਟਾ] ਤੋਂ ਬਿਨਾਂ PeerTube ਸਮਰਥਨ: ◦ PeerTube ਉਦਾਹਰਨਾਂ ਤੋਂ ਵੀਡੀਓ ਦੇਖੋ ਅਤੇ ਡਾਊਨਲੋਡ ਕਰੋ ◦ ਪੂਰੀ PeerTube ਸੰਸਾਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਉਦਾਹਰਨਾਂ ਸ਼ਾਮਲ ਕਰੋ ◦ Android 4.4 ਅਤੇ 7.1 'ਤੇ SSL ਹੈਂਡਸ਼ੇਕ ਨਾਲ ਸਮੱਸਿਆਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ ਜਦੋਂ ਕੁਝ ਖਾਸ ਮੌਕਿਆਂ 'ਤੇ ਪਹੁੰਚ ਕਰਦੇ ਸਮੇਂ ਨੈੱਟਵਰਕ ਗੜਬੜ ਹੋ ਜਾਂਦੀ ਹੈ। • ਡਾਊਨਲੋਡਰ (#2679): ◦ ਡਾਊਨਲੋਡ ETA ਦੀ ਗਣਨਾ ਕਰੋ ◦ ਓਪਸ (ਵੈਬ ਫਾਈਲਾਂ) ਨੂੰ ogg ਵਜੋਂ ਡਾਊਨਲੋਡ ਕਰੋ ◦ ਲੰਬੇ ਵਿਰਾਮ ਤੋਂ ਬਾਅਦ ਡਾਊਨਲੋਡ ਮੁੜ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਮਿਆਦ ਪੁੱਗ ਚੁੱਕੇ ਡਾਊਨਲੋਡ ਲਿੰਕਾਂ ਨੂੰ ਮੁੜ-ਹਾਸਲ ਕਰੋ ਸੁਧਾਰ • ਕਿਓਸਕਫ੍ਰੈਗਮੈਂਟ ਨੂੰ ਤਰਜੀਹੀ ਸਮਗਰੀ ਵਾਲੇ ਦੇਸ਼ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਤੋਂ ਜਾਣੂ ਕਰਵਾਓ ਅਤੇ ਸਾਰੀਆਂ ਮੁੱਖ ਟੈਬਾਂ #2742 ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ। • ਐਕਸਟਰੈਕਟਰ #2713 ਤੋਂ ਨਵੇਂ ਸਥਾਨਕਕਰਨ ਅਤੇ ਡਾਉਨਲੋਡਰ ਲਾਗੂਕਰਨ ਦੀ ਵਰਤੋਂ ਕਰੋ • "ਡਿਫੌਲਟ ਕਿਓਸਕ" ਸਤਰ ਨੂੰ ਅਨੁਵਾਦਯੋਗ ਬਣਾਓ • ਬਲੈਕ ਥੀਮ #2569 ਲਈ ਬਲੈਕ ਨੈਵੀਗੇਸ਼ਨ ਪੱਟੀ ਸਥਿਰ • ਇੱਕ ਬੱਗ ਫਿਕਸ ਕੀਤਾ ਗਿਆ ਹੈ ਜੋ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਹਿਲਾ ਨਹੀਂ ਸਕਦਾ ਸੀ ਜੇਕਰ ਪੌਪਅੱਪ ਪਲੇਅਰ #2772 ਨੂੰ ਹਿਲਾਉਂਦੇ ਸਮੇਂ ਕੋਈ ਹੋਰ ਉਂਗਲ ਰੱਖੀ ਜਾਂਦੀ ਹੈ • ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਅਪਲੋਡਰ ਦੀ ਗੁੰਮਸ਼ੁਦਗੀ ਦੀ ਆਗਿਆ ਦਿਓ ਅਤੇ ਇਸ ਸਮੱਸਿਆ ਨਾਲ ਸਬੰਧਤ ਕ੍ਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ #2724, TeamNewPipe/NewPipeExtractor#219 • MediaCCC ਅਤੇ ਕੁਝ PeerTube ਉਦਾਹਰਨਾਂ #2792 ਨਾਲ TLS ਹੈਂਡਸ਼ੇਕ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ Android 4.4 ਡਿਵਾਈਸਾਂ (API 19/KitKat) 'ਤੇ TLS1.1/1.2 ਨੂੰ ਸਮਰੱਥ ਕਰਨਾ • [SoundCloud] ਫਿਕਸਡ ਕਲਾਈਂਟ_ਆਈਡੀ ਐਕਸਟ੍ਰੈਕਸ਼ਨ TeamNewPipe/NewPipeExtractor#217 • [SoundCloud] ਆਡੀਓ ਸਟ੍ਰੀਮ ਕੱਢਣ ਨੂੰ ਠੀਕ ਕਰੋ ਵਿਕਾਸ • ExoPlayer ਨੂੰ 2.10.8 #2791, #2816 'ਤੇ ਅੱਪਡੇਟ ਕਰੋ • Gradle ਨੂੰ 3.5.1 ਵਿੱਚ ਅੱਪਡੇਟ ਕਰੋ ਅਤੇ Kotlin ਸਹਿਯੋਗ #2714 ਸ਼ਾਮਲ ਕਰੋ +ਨਵਾਂ +• P2P ਤੋਂ ਬਿਨਾਂ PeerTube ਸਹਾਇਤਾ (#2201) [ਬੀਟਾ]: + +◦ ਲੰਬੇ ਵਿਰਾਮ ਤੋਂ ਬਾਅਦ ਡਾਊਨਲੋਡ ਮੁੜ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਮਿਆਦ ਪੁੱਗ ਚੁੱਕੇ ਡਾਊਨਲੋਡ ਲਿੰਕਾਂ ਨੂੰ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰੋ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਪਸੰਦੀਦਾ ਸਮੱਗਰੀ ਦੇਸ਼ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਬਾਰੇ KioskFragment ਨੂੰ ਸੂਚਿਤ ਕਰੋ ਅਤੇ ਸਾਰੇ ਮੁੱਖ ਟੈਬਾਂ ਵਿੱਚ ਪ੍ਰਦਰਸ਼ਨ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ #2742 + +ਸਥਿਰ +• Android 4.4 ਡਿਵਾਈਸਾਂ (API 19/KitKat) 'ਤੇ TLS1.1/1.2 ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ diff --git a/fastlane/metadata/android/pa/changelogs/810.txt b/fastlane/metadata/android/pa/changelogs/810.txt index 96a2b9da5..d10bc6913 100644 --- a/fastlane/metadata/android/pa/changelogs/810.txt +++ b/fastlane/metadata/android/pa/changelogs/810.txt @@ -1 +1,11 @@ -ਨਵਾਂ • ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਦੇ ਸਮੇਂ ਲੌਕ ਸਕ੍ਰੀਨ 'ਤੇ ਵੀਡੀਓ ਥੰਬਨੇਲ ਦਿਖਾਓ ਸੁਧਾਰ • ਬੈਕਗ੍ਰਾਉਂਡ / ਪੌਪਅੱਪ ਬਟਨ 'ਤੇ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ 'ਤੇ ਕਤਾਰ ਵਿੱਚ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਸ਼ਾਮਲ ਕਰੋ • ਮੁੱਖ ਪੰਨਾ ਟੈਬਾਂ ਨੂੰ ਸਕ੍ਰੋਲ ਕਰਨ ਯੋਗ ਬਣਾਓ ਅਤੇ ਸਿਰਫ਼ ਇੱਕ ਟੈਬ ਹੋਣ 'ਤੇ ਲੁਕਾਓ • ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ ਸੂਚਨਾ ਥੰਬਨੇਲ ਅੱਪਡੇਟ ਦੀ ਸੀਮਾ ਮਾਤਰਾ • ਖਾਲੀ ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਲਈ ਡਮੀ ਥੰਬਨੇਲ ਸ਼ਾਮਲ ਕਰੋ • *.webm ਦੀ ਬਜਾਏ *.opus ਫਾਈਲ ਐਕਸਟੈਂਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰੋ ਅਤੇ ਡਾਊਨਲੋਡ ਡ੍ਰੌਪਡਾਉਨ ਵਿੱਚ "WebM Opus" ਦੀ ਬਜਾਏ ਫਾਰਮੈਟ ਲੇਬਲ ਵਿੱਚ "opus" ਦਿਖਾਓ • "ਡਾਊਨਲੋਡ" ਵਿੱਚ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਜਾਂ ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਨੂੰ ਮਿਟਾਉਣ ਲਈ ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ • [YouTube] /c/shortened_url ਚੈਨਲ ਲਿੰਕਾਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • NewPipe ਨਾਲ ਵੀਡੀਓ ਸਾਂਝਾ ਕਰਨ ਅਤੇ ਇਸ ਦੀਆਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸਿੱਧੇ ਡਾਊਨਲੋਡ ਕਰਨ ਵੇਲੇ ਕਈ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ • ਇਸ ਦੇ ਸਿਰਜਣ ਥ੍ਰੈਡ ਤੋਂ ਬਾਹਰ ਸਥਿਰ ਪਲੇਅਰ ਪਹੁੰਚ • ਸਥਿਰ ਖੋਜ ਨਤੀਜੇ ਪੇਜਿੰਗ • [YouTube] ਨਿਸ਼ਚਤ ਸਵਿਚਿੰਗ ਚਾਲੂ ਕਰਨ ਨਾਲ NPE ਹੁੰਦਾ ਹੈ • [YouTube] ਇੱਕ invidio.us url ਖੋਲ੍ਹਣ ਵੇਲੇ ਟਿੱਪਣੀਆਂ ਦੇਖਣ ਲਈ ਸਥਿਰ • [SoundCloud] ਅੱਪਡੇਟ ਕੀਤਾ client_id +ਨਵਾਂ +• ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਦੇ ਸਮੇਂ ਲਾਕ ਸਕ੍ਰੀਨ 'ਤੇ ਵੀਡੀਓ ਥੰਬਨੇਲ ਦਿਖਾਓ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਬੈਕਗ੍ਰਾਊਂਡ/ਪੌਪਅੱਪ ਬਟਨ ਨੂੰ ਦੇਰ ਤੱਕ ਦਬਾਉਣ 'ਤੇ ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਕਤਾਰ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ +• [YouTube] /c/shortened_url ਚੈਨਲ ਲਿੰਕਾਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• NewPipe 'ਤੇ ਵੀਡੀਓ ਸਾਂਝੇ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦੀਆਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸਿੱਧਾ ਡਾਊਨਲੋਡ ਕਰਨ ਵੇਲੇ ਕਈ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ +• ਖੋਜ ਨਤੀਜਿਆਂ ਦੀ ਪੇਜਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +• [SoundCloud] client_id ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/840.txt b/fastlane/metadata/android/pa/changelogs/840.txt index 745098496..d05907bd6 100644 --- a/fastlane/metadata/android/pa/changelogs/840.txt +++ b/fastlane/metadata/android/pa/changelogs/840.txt @@ -1 +1,10 @@ -ਨਵਾਂ • ਐਪ ਦੀ ਭਾਸ਼ਾ ਬਦਲਣ ਲਈ ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਪਲੇਅਰ ਸਮੇਟਣਯੋਗ ਮੀਨੂ ਵਿੱਚ ਕੋਡੀ ਬਟਨ 'ਤੇ ਭੇਜੋ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਲੰਬੀ ਪ੍ਰੈਸ 'ਤੇ ਟਿੱਪਣੀਆਂ ਨੂੰ ਕਾਪੀ ਕਰਨ ਦੀ ਸਮਰੱਥਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ ਹੈ ਸੁਧਾਰ • ਰੀਕੈਪਚਾ ਗਤੀਵਿਧੀ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ ਪ੍ਰਾਪਤ ਕੀਤੀਆਂ ਕੂਕੀਜ਼ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕਰੋ • ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਦੇਖਣ ਦਾ ਇਤਿਹਾਸ ਚਾਲੂ ਨਾ ਹੋਣ 'ਤੇ ਦਰਾਜ਼ ਦੇ ਹੱਕ ਵਿੱਚ ਡਾਟ-ਮੀਨੂ ਨੂੰ ਹਟਾਇਆ ਗਿਆ ਅਤੇ ਇਤਿਹਾਸ ਨੂੰ ਲੁਕਾਓ ਬਟਨ • Android 6 ਅਤੇ ਬਾਅਦ ਵਾਲੇ 'ਤੇ ਸਹੀ ਢੰਗ ਨਾਲ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਹੋਰ ਐਪਾਂ ਦੀ ਇਜਾਜ਼ਤ ਦੇ ਉੱਪਰ ਡਿਸਪਲੇ ਲਈ ਪੁੱਛੋ • BookmarkFragment ਵਿੱਚ ਲੰਮਾ-ਕਲਿੱਕ ਕਰਕੇ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਦਾ ਨਾਮ ਬਦਲੋ • ਕਈ PeerTube ਸੁਧਾਰ • ਕਈ ਅੰਗਰੇਜ਼ੀ ਸਰੋਤ ਸਤਰਾਂ ਨੂੰ ਸੁਧਾਰਿਆ ਗਿਆ ਹੈ ਸਥਿਰ • ਫਿਕਸਡ ਪਲੇਅਰ ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਹੋ ਰਿਹਾ ਹੈ ਹਾਲਾਂਕਿ ਇਹ ਉਦੋਂ ਰੋਕਿਆ ਜਾਂਦਾ ਹੈ ਜਦੋਂ ਵਿਕਲਪ "ਐਪ ਸਵਿੱਚ 'ਤੇ ਛੋਟਾ ਕਰੋ" ਯੋਗ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਅਤੇ ਨਿਊ ਪਾਈਪ ਨੂੰ ਛੋਟਾ ਕੀਤਾ ਜਾਂਦਾ ਹੈ • ਸੰਕੇਤ ਲਈ ਸ਼ੁਰੂਆਤੀ ਚਮਕ ਮੁੱਲ ਨੂੰ ਠੀਕ ਕਰੋ • ਸਥਿਰ .srt ਉਪਸਿਰਲੇਖ ਡਾਉਨਲੋਡ ਜਿਸ ਵਿੱਚ ਸਾਰੇ ਲਾਈਨ ਬ੍ਰੇਕ ਨਹੀਂ ਹਨ • SD ਕਾਰਡ 'ਤੇ ਸਥਿਰ ਡਾਊਨਲੋਡ ਅਸਫਲ ਹੋ ਰਿਹਾ ਹੈ ਕਿਉਂਕਿ ਕੁਝ Android 5 ਡਿਵਾਈਸਾਂ CTF ਅਨੁਕੂਲ ਨਹੀਂ ਹਨ • Android KitKat 'ਤੇ ਸਥਿਰ ਡਾਊਨਲੋਡਿੰਗ • ਸਥਿਰ ਭ੍ਰਿਸ਼ਟ ਵੀਡੀਓ .mp4 ਫਾਈਲ ਨੂੰ ਆਡੀਓ ਫਾਈਲ ਵਜੋਂ ਮਾਨਤਾ ਦਿੱਤੀ ਜਾ ਰਹੀ ਹੈ • ਗਲਤ ਚੀਨੀ ਭਾਸ਼ਾ ਕੋਡ ਸਮੇਤ, ਮਲਟੀਪਲ ਸਥਾਨੀਕਰਨ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ ਹੈ • [YouTube] ਵਰਣਨ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪ ਦੁਬਾਰਾ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਹਨ +ਨਵਾਂ +• ਐਪ ਦੀ ਭਾਸ਼ਾ ਬਦਲਣ ਲਈ ਇੱਕ ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਜੋੜਿਆ ਗਿਆ +• ਪਲੇਅਰ ਦੇ ਕੋਲੈਪਸੀਬਲ ਮੀਨੂ ਵਿੱਚ ਕੋਡੀ ਨੂੰ ਭੇਜੋ ਬਟਨ ਜੋੜਿਆ ਗਿਆ +• ਟਿੱਪਣੀਆਂ ਦੀ ਕਾਪੀ ਕਰਨ ਲਈ ਇੱਕ ਲੰਮਾ-ਦਬਾਓ ਵਿਸ਼ੇਸ਼ਤਾ ਜੋੜਿਆ ਗਿਆ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਰੀਕੈਪਚਾ ਗਤੀਵਿਧੀ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ ਅਤੇ ਪ੍ਰਾਪਤ ਕੂਕੀਜ਼ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਐਂਡਰਾਇਡ ਕਿਟਕੈਟ 'ਤੇ ਡਾਊਨਲੋਡਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/920.txt b/fastlane/metadata/android/pa/changelogs/920.txt index 04fc07937..94b1e74a0 100644 --- a/fastlane/metadata/android/pa/changelogs/920.txt +++ b/fastlane/metadata/android/pa/changelogs/920.txt @@ -1 +1,9 @@ -ਸੁਧਾਰ • ਸਟ੍ਰੀਮ ਗਰਿੱਡ ਆਈਟਮਾਂ 'ਤੇ ਅੱਪਲੋਡ ਦੀ ਮਿਤੀ ਅਤੇ ਦੇਖਣ ਦੀ ਗਿਣਤੀ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਦਰਾਜ਼ ਹੈਡਰ ਲੇਆਉਟ ਲਈ ਸੁਧਾਰ ਸਥਿਰ • ਏਪੀਆਈ 19 'ਤੇ ਕ੍ਰੈਸ਼ ਹੋਣ ਕਾਰਨ ਫਿਕਸਡ ਮਿਊਟ ਬਟਨ • ਲੰਬੇ 1080p 60fps ਵੀਡੀਓ ਦੀ ਸਥਿਰ ਡਾਊਨਲੋਡਿੰਗ +ਸੁਧਾਰਿਆ ਗਿਆ + +• ਸਟ੍ਰੀਮ ਗਰਿੱਡ ਆਈਟਮਾਂ 'ਤੇ ਅਪਲੋਡ ਮਿਤੀ ਅਤੇ ਵਿਯੂ ਗਿਣਤੀ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ +• ਦਰਾਜ਼ ਹੈਡਰ ਲੇਆਉਟ ਲਈ ਸੁਧਾਰ + +ਠੀਕ ਕੀਤਾ ਗਿਆ + +• API 19 'ਤੇ ਕਰੈਸ਼ ਹੋਣ ਵਾਲੇ ਮਿਊਟ ਬਟਨ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਲੰਬੇ 1080p 60fps ਵੀਡੀਓਜ਼ ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨਾ ਠੀਕ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/930.txt b/fastlane/metadata/android/pa/changelogs/930.txt index a067bfb58..96fc7d0b5 100644 --- a/fastlane/metadata/android/pa/changelogs/930.txt +++ b/fastlane/metadata/android/pa/changelogs/930.txt @@ -1 +1,14 @@ -ਨਵਾਂ • YouTube ਸੰਗੀਤ 'ਤੇ ਖੋਜੋ • ਬੁਨਿਆਦੀ Android TV ਸਮਰਥਨ ਸੁਧਾਰ • ਇੱਕ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਤੋਂ ਸਾਰੇ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਨੂੰ ਹਟਾਉਣ ਦੀ ਯੋਗਤਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ ਹੈ • ਕ੍ਰੈਸ਼ ਹੋਣ ਦੀ ਬਜਾਏ ਜਦੋਂ ਸਮੱਗਰੀ ਅਜੇ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ ਤਾਂ ਸੁਨੇਹਾ ਦਿਖਾਓ • ਚੁਟਕੀ ਇਸ਼ਾਰਿਆਂ ਨਾਲ ਪੌਪਅੱਪ ਪਲੇਅਰ ਦਾ ਆਕਾਰ ਬਦਲਿਆ ਗਿਆ ਹੈ • ਬੈਕਗ੍ਰਾਊਂਡ 'ਤੇ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਅਤੇ ਚੈਨਲ ਵਿੱਚ ਪੌਪਅੱਪ ਬਟਨਾਂ 'ਤੇ ਸਟ੍ਰੀਮ ਨੂੰ ਐਨਕਿਊ ਕਰੋ • ਦਰਾਜ਼ ਸਿਰਲੇਖ ਦੇ ਸਿਰਲੇਖ ਦੇ ਆਕਾਰ ਨੂੰ ਸੰਭਾਲਣ ਵਿੱਚ ਸੁਧਾਰ ਕੀਤਾ ਗਿਆ ਹੈ ਸਥਿਰ • ਨਿਸ਼ਚਿਤ ਉਮਰ ਪ੍ਰਤਿਬੰਧਿਤ ਸਮੱਗਰੀ ਸੈਟਿੰਗ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀ • ਕੁਝ ਖਾਸ ਕਿਸਮ ਦੇ reCAPTCHA ਫਿਕਸ ਕੀਤੇ ਗਏ ਹਨ • ਪਲੇਲਿਸਟ `ਨੱਲ` ਹੋਣ 'ਤੇ ਬੁੱਕਮਾਰਕ ਖੋਲ੍ਹਣ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ • ਨੈੱਟਵਰਕ ਸੰਬੰਧੀ ਅਪਵਾਦਾਂ ਦੀ ਸਥਿਰ ਖੋਜ • ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫਰੈਗਮੈਂਟ ਵਿੱਚ ਗਰੁੱਪ ਸੌਰਟ ਬਟਨ ਦੀ ਸਥਿਰ ਦਿੱਖ ਅਤੇ ਹੋਰ +ਨਵਾਂ +• YouTube ਸੰਗੀਤ ਖੋਜੋ +• ਮੁੱਢਲਾ Android TV ਸਮਰਥਨ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਤੋਂ ਸਾਰੇ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਹਟਾਉਣ ਦੀ ਯੋਗਤਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ +• ਜਦੋਂ ਸਮੱਗਰੀ ਵਰਤਮਾਨ ਵਿੱਚ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ ਤਾਂ ਕ੍ਰੈਸ਼ ਹੋਣ ਦੀ ਬਜਾਏ ਇੱਕ ਸੁਨੇਹਾ ਦਿਖਾਓ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਉਮਰ-ਪ੍ਰਤੀਬੰਧਿਤ ਸਮੱਗਰੀ ਸੈਟਿੰਗਾਂ ਨਾਲ ਇੱਕ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ। + +ਕੁਝ reCAPTCHA ਗਲਤੀਆਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ। + +ਅਤੇ ਹੋਰ ਵੀ diff --git a/fastlane/metadata/android/pa/changelogs/940.txt b/fastlane/metadata/android/pa/changelogs/940.txt index b9d9b3fdf..3ea03ad03 100644 --- a/fastlane/metadata/android/pa/changelogs/940.txt +++ b/fastlane/metadata/android/pa/changelogs/940.txt @@ -1 +1,14 @@ -ਨਵਾਂ • SoundCloud ਟਿੱਪਣੀਆਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ • YouTube ਪ੍ਰਤਿਬੰਧਿਤ ਮੋਡ ਸੈਟਿੰਗ ਸ਼ਾਮਲ ਕਰੋ • PeerTube ਮੂਲ ਚੈਨਲ ਦੇ ਵੇਰਵੇ ਦਿਖਾਓ ਸੁਧਾਰ • ਸਿਰਫ਼ ਸਮਰਥਿਤ ਸੇਵਾਵਾਂ ਲਈ ਕੋਰ ਬਟਨ ਦਿਖਾਓ • ਨੈਵੀਗੇਸ਼ਨਬਾਰ ਜਾਂ ਸਟੇਟਸਬਾਰ ਤੋਂ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਪਲੇਅਰ ਸੰਕੇਤਾਂ ਨੂੰ ਬਲਾਕ ਕਰੋ • ਸੇਵਾ ਦੇ ਰੰਗ ਦੇ ਆਧਾਰ 'ਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਅਤੇ ਗਾਹਕ ਬਣੋ ਬਟਨਾਂ ਦਾ ਪਿਛੋਕੜ ਰੰਗ ਬਦਲੋ ਸਥਿਰ • ਡਾਉਨਲੋਡ ਡਾਇਲਾਗ ਫ੍ਰੀਜ਼ ਨੂੰ ਠੀਕ ਕਰੋ • ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ ਬਟਨ ਹੁਣ ਅਸਲ ਵਿੱਚ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੁੱਲ੍ਹਦਾ ਹੈ • ਵੀਡੀਓ ਖੋਲ੍ਹਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ "ਇਸ ਸਟ੍ਰੀਮ ਨੂੰ ਚਲਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ" ਅਤੇ ਹੋਰ +ਨਵਾਂ +• SoundCloud ਟਿੱਪਣੀਆਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ +• YouTube ਪ੍ਰਤਿਬੰਧਿਤ ਮੋਡ ਸੈਟਿੰਗ ਸ਼ਾਮਲ ਕਰੋ +• PeerTube ਪੇਰੈਂਟ ਚੈਨਲ ਵੇਰਵੇ ਦਿਖਾਓ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਸਿਰਫ਼ ਸਮਰਥਿਤ ਸੇਵਾਵਾਂ ਲਈ Kore ਬਟਨ ਦਿਖਾਓ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਇੱਕ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ ਜਿੱਥੇ ਡਾਊਨਲੋਡ ਡਾਇਲਾਗ ਫ੍ਰੀਜ਼ ਹੋ ਰਿਹਾ ਸੀ +• ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ ਬਟਨ ਹੁਣ ਅਸਲ ਵਿੱਚ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੁੱਲ੍ਹਦਾ ਹੈ +• ਵੀਡੀਓ ਖੋਲ੍ਹਣ ਵੇਲੇ ਕਰੈਸ਼ ਅਤੇ "ਇਸ ਸਟ੍ਰੀਮ ਨੂੰ ਚਲਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ" + +ਅਤੇ ਹੋਰ diff --git a/fastlane/metadata/android/pa/changelogs/951.txt b/fastlane/metadata/android/pa/changelogs/951.txt index 2b1cd7933..f4dd14071 100644 --- a/fastlane/metadata/android/pa/changelogs/951.txt +++ b/fastlane/metadata/android/pa/changelogs/951.txt @@ -1,13 +1,13 @@ -ਨਵਾਂ -• ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਗਾਹਕੀ ਚੋਣਕਾਰ ਲਈ ਖੋਜ ਸ਼ਾਮਲ ਕਰੋ -• ਸਿਰਫ਼ ਗੈਰ-ਗਰੁੱਪ ਕੀਤੀਆਂ ਗਾਹਕੀਆਂ ਨੂੰ ਦਿਖਾਉਣ ਲਈ ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਫਿਲਟਰ ਸ਼ਾਮਲ ਕਰੋ -• ਪਲੇਲਿਸਟ ਟੈਬ ਨੂੰ ਮੁੱਖ ਪੰਨੇ 'ਤੇ ਸ਼ਾਮਲ ਕਰੋ -• ਬੈਕਗ੍ਰਾਊਂਡ/ਪੌਪ-ਅੱਪ ਪਲੇਅਰ ਕਤਾਰ ਵਿੱਚ ਤੇਜ਼ੀ ਨਾਲ ਅੱਗੇ/ਰਿਵਾਈਂਡ ਕਰੋ -• ਖੋਜ ਸੁਝਾਅ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ: ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਹੈ ਅਤੇ ਇਸ ਲਈ ਨਤੀਜਾ ਦਿਖਾ ਰਿਹਾ ਹੈ -ਸੁਧਾਰ -• ਮਿਕਸਡ ਫਾਈਲਾਂ ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨ ਮੈਟਾਡੇਟਾ ਲਿਖਣਾ ਛੱਡੋ • ਕਤਾਰ ਤੋਂ ਅਸਫਲ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਨਾ ਹਟਾਓ -• ਟੂਲਬਾਰ ਦੇ ਰੰਗ ਨਾਲ ਮੇਲ ਕਰਨ ਲਈ ਸਥਿਤੀ ਪੱਟੀ ਦਾ ਰੰਗ ਅੱਪਡੇਟ ਕਰੋ +ਨਵਾਂ +• ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਚੋਣਕਾਰ ਲਈ ਖੋਜ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ +• ਸਿਰਫ਼ ਅਣ-ਗਰੁੱਪ ਕੀਤੀਆਂ ਗਾਹਕੀਆਂ ਦਿਖਾਉਣ ਲਈ ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਇੱਕ ਫਿਲਟਰ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ +• ਮੁੱਖ ਪੰਨੇ 'ਤੇ ਇੱਕ ਪਲੇਲਿਸਟ ਟੈਬ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ -ਠੀਕ ਕੀਤਾ -• ਫਲੋਟਿੰਗ ਪੁਆਇੰਟ ਸੰਚਤ ਤਰੁੱਟੀਆਂ ਦੇ ਕਾਰਨ ਫਿਕਸਡ ਆਡੀਓ/ਵੀਡੀਓ ਡੀਸਿੰਕ -• [PeerTube] ਮਿਟਾਈਆਂ ਗਈਆਂ ਟਿੱਪਣੀਆਂ ਨੂੰ ਸੰਭਾਲੋ ਅਤੇ ਹੋਰ +ਸੁਧਾਰਿਆ ਗਿਆ +• ਮਕਸਡ ਫਾਈਲਾਂ ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨ ਮੈਟਾਡੇਟਾ ਲਿਖਣਾ ਬੰਦ ਕੀਤਾ ਗਿਆ +• ਕਤਾਰ ਤੋਂ ਅਸਫਲ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਨਾ ਹਟਾਓ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਫਲੋਟਿੰਗ ਪੁਆਇੰਟ ਸੰਚਤ ਗਲਤੀਆਂ ਕਾਰਨ ਆਡੀਓ/ਵੀਡੀਓ ਡੀਸਿੰਕ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ + +ਅਤੇ ਹੋਰ diff --git a/fastlane/metadata/android/pa/changelogs/954.txt b/fastlane/metadata/android/pa/changelogs/954.txt index 3eb8dd68b..b5b0e78d8 100644 --- a/fastlane/metadata/android/pa/changelogs/954.txt +++ b/fastlane/metadata/android/pa/changelogs/954.txt @@ -1,8 +1,9 @@ -• ਨਵਾਂ ਐਪਲੀਕੇਸ਼ਨ ਵਰਕਫਲੋ: ਵੇਰਵੇ ਵਾਲੇ ਪੰਨੇ 'ਤੇ ਵੀਡੀਓ ਚਲਾਓ, ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰਨ ਲਈ ਹੇਠਾਂ ਵੱਲ ਸਵਾਈਪ ਕਰੋ -• ਮੀਡੀਆ ਸਟਾਈਲ ਸੂਚਨਾਵਾਂ: ਸੂਚਨਾਵਾਂ ਵਿੱਚ ਅਨੁਕੂਲਿਤ ਕਾਰਵਾਈਆਂ, ਪ੍ਰਦਰਸ਼ਨ ਸੁਧਾਰ -• ਡੈਸਕਟੌਪ ਐਪ ਦੇ ਤੌਰ 'ਤੇ NewPipe ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਮੂਲ ਰੀਸਾਈਜ਼ ਕਰਨਾ +• ਨਵਾਂ ਐਪ ਵਰਕਫਲੋ: ਵੇਰਵੇ ਵਾਲੇ ਪੰਨੇ 'ਤੇ ਵੀਡੀਓ ਚਲਾਓ, ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰਨ ਲਈ ਹੇਠਾਂ ਵੱਲ ਸਵਾਈਪ ਕਰੋ +• ਮੀਡੀਆਸਟਾਈਲ ਸੂਚਨਾਵਾਂ: ਸੂਚਨਾਵਾਂ ਵਿੱਚ ਅਨੁਕੂਲਿਤ ਕਾਰਵਾਈਆਂ, ਪ੍ਰਦਰਸ਼ਨ ਸੁਧਾਰ +• ਡੈਸਕਟੌਪ ਐਪ ਦੇ ਤੌਰ 'ਤੇ NewPipe ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਮੂਲ ਆਕਾਰ ਬਦਲਣਾ -• ਇੱਕ ਅਸਮਰਥਿਤ URL ਟੋਸਟ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਖੁੱਲੇ ਵਿਕਲਪਾਂ ਨਾਲ ਡਾਇਲਾਗ ਦਿਖਾਓ -• ਜਦੋਂ ਰਿਮੋਟ ਨੂੰ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਤਾਂ ਖੋਜ ਸੁਝਾਅ ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਓ -• ਡਿਫ਼ਾਲਟ ਵੀਡੀਓ ਗੁਣਵੱਤਾ ਨੂੰ 720p60 (ਇਨ-ਐਪ ਪਲੇਅਰ) ਅਤੇ 480p (ਪੌਪ-ਅੱਪ ਪਲੇਅਰ) ਤੱਕ ਵਧਾ ਦਿੱਤਾ ਗਿਆ ਹੈ -• ਬਹੁਤ ਸਾਰੇ ਬੱਗ ਫਿਕਸ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ +• ਇੱਕ ਅਸਮਰਥਿਤ URL ਟੋਸਟ ਦੀ ਸਥਿਤੀ ਵਿੱਚ ਖੁੱਲ੍ਹੇ ਵਿਕਲਪਾਂ ਦੇ ਨਾਲ ਇੱਕ ਡਾਇਲਾਗ ਦਿਖਾਓ +• ਰਿਮੋਟ ਸੁਝਾਅ ਉਪਲਬਧ ਨਾ ਹੋਣ 'ਤੇ ਸੁਧਾਰਾਂ ਦਾ ਅਨੁਭਵ ਕਰੋ +• ਡਿਫੌਲਟ ਵੀਡੀਓ ਗੁਣਵੱਤਾ 720p60 (ਇਨ-ਐਪ ਪਲੇਅਰ) ਅਤੇ 480p (ਪੌਪ-ਅੱਪ ਪਲੇਅਰ) ਤੱਕ ਵਧਾ ਦਿੱਤੀ ਗਈ + +• ਬੱਗ ਫਿਕਸ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ diff --git a/fastlane/metadata/android/pa/changelogs/957.txt b/fastlane/metadata/android/pa/changelogs/957.txt index eb66dacbc..2cf56525d 100644 --- a/fastlane/metadata/android/pa/changelogs/957.txt +++ b/fastlane/metadata/android/pa/changelogs/957.txt @@ -1,10 +1,7 @@ -• ਖਾਸ ਐਨਕਿਊ ਕਿਰਿਆਵਾਂ ਨੂੰ ਇੱਕ ਵਿੱਚ ਜੋੜੋ -• ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ ਦੋ ਉਂਗਲਾਂ ਦੇ ਸੰਕੇਤ -• reCAPTCHA ਕੂਕੀਜ਼ ਨੂੰ ਕਲੀਅਰ ਕਰਨ ਦਿਓ -• ਨੋਟੀਫਿਕੇਸ਼ਨ ਨੂੰ ਰੰਗ ਨਾ ਕਰਨ ਦਾ ਵਿਕਲਪ -• ਅਨੰਤ ਬਫਰਿੰਗ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਵਿਡੀਓ ਵੇਰਵਿਆਂ ਨੂੰ ਕਿਵੇਂ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਇਸ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ, ਨਿਊਪਾਈਪ ਨਾਲ ਸਾਂਝਾ ਕਰਨ ਵੇਲੇ ਬੱਗੀ ਵਿਵਹਾਰ ਅਤੇ ਹੋਰ ਅਸੰਗਤਤਾਵਾਂ -• YouTube ਵੀਡੀਓਜ਼ ਦੀ ਗਤੀ ਵਧਾਓ ਅਤੇ ਉਮਰ ਪ੍ਰਤੀਬੰਧਿਤ ਵੀਡੀਓ ਨੂੰ ਠੀਕ ਕਰੋ -• ਫਾਸਟ ਫਾਰਵਰਡ/ਰਿਵਾਇੰਡ 'ਤੇ ਕਰੈਸ਼ ਨੂੰ ਠੀਕ ਕਰੋ -• ਥੰਬਨੇਲ ਖਿੱਚ ਕੇ ਸੂਚੀਆਂ ਨੂੰ ਮੁੜ ਵਿਵਸਥਿਤ ਨਾ ਕਰੋ -• ਪੌਪਅੱਪ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਹਮੇਸ਼ਾ ਯਾਦ ਰੱਖੋ -• ਸੰਤਾਲੀ ਭਾਸ਼ਾ ਸ਼ਾਮਲ ਕਰੋ +• ਖਾਸ NQE ਕਿਰਿਆਵਾਂ ਨੂੰ ਇੱਕ ਵਿੱਚ ਏਕੀਕ੍ਰਿਤ ਕਰਨਾ। +• ਦੋ-ਉਂਗਲਾਂ ਵਾਲੇ ਇਸ਼ਾਰੇ ਨਾਲ ਵੀਡੀਓ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨਾ। +• reCOPTCHA ਕੂਕੀਜ਼ ਨੂੰ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦੇਣਾ। +• ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੰਗੀਨ ਨਾ ਕਰਨ ਦਾ ਵਿਕਲਪ। +• NewPipe 'ਤੇ ਸਾਂਝਾ ਕਰਦੇ ਸਮੇਂ ਅਨੰਤ ਬਫਰਿੰਗ, ਗਲਤੀਆਂ ਅਤੇ ਹੋਰ ਅਸੰਗਤੀਆਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ। +• YouTube ਵੀਡੀਓ ਨੂੰ ਤੇਜ਼ ਕੀਤਾ ਗਿਆ ਅਤੇ ਉਮਰ-ਪ੍ਰਤੀਬੰਧਿਤ ਵੀਡੀਓ ਨੂੰ ਬਿਹਤਰ ਬਣਾਇਆ ਗਿਆ। +• ਫਾਸਟ ਫਾਰਵਰਡ/ਰਿਵਾਈਂਡ 'ਤੇ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/964.txt b/fastlane/metadata/android/pa/changelogs/964.txt index 85dc2c151..e94595673 100644 --- a/fastlane/metadata/android/pa/changelogs/964.txt +++ b/fastlane/metadata/android/pa/changelogs/964.txt @@ -1 +1,6 @@ -• ਪਲੇਅਰ ਨਿਯੰਤਰਣ ਵਿੱਚ ਅਧਿਆਵਾਂ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ • [PeerTube] ਸੇਪੀਆ ਖੋਜ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਵੀਡੀਓ ਵੇਰਵੇ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਸ਼ੇਅਰ ਬਟਨ ਨੂੰ ਮੁੜ-ਜੋੜਿਆ ਗਿਆ ਅਤੇ ਟੈਬ ਲੇਆਉਟ ਵਿੱਚ ਸਟ੍ਰੀਮ ਵਰਣਨ ਨੂੰ ਤਬਦੀਲ ਕੀਤਾ ਗਿਆ • ਜੇਕਰ ਚਮਕ ਦਾ ਸੰਕੇਤ ਅਸਮਰੱਥ ਹੈ ਤਾਂ ਚਮਕ ਨੂੰ ਬਹਾਲ ਕਰਨਾ ਬੰਦ ਕਰੋ • ਕੋਡੀ 'ਤੇ ਵੀਡੀਓ ਚਲਾਉਣ ਲਈ ਸੂਚੀ ਆਈਟਮ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਕੁਝ ਡਿਵਾਈਸਾਂ 'ਤੇ ਕੋਈ ਡਿਫੌਲਟ ਬ੍ਰਾਊਜ਼ਰ ਸੈੱਟ ਨਾ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਦਾ ਹੱਲ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਸ਼ੇਅਰ ਡਾਇਲਾਗਸ ਨੂੰ ਬਿਹਤਰ ਬਣਾਓ • ਫੁੱਲਸਕ੍ਰੀਨ ਪਲੇਅਰ ਵਿੱਚ ਹਾਰਡਵੇਅਰ ਸਪੇਸ ਬਟਨ ਨਾਲ ਪਲੇ/ਪੌਜ਼ ਨੂੰ ਟੌਗਲ ਕਰੋ • [media.ccc.de] ਕਈ ਫਿਕਸ ਅਤੇ ਸੁਧਾਰ +• ਪਲੇਅਰ ਕੰਟਰੋਲਾਂ ਵਿੱਚ ਚੈਪਟਰਾਂ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ +• [PeerTube] ਸੇਪੀਆ ਖੋਜ ਜੋੜਿਆ ਗਿਆ +• ਵੀਡੀਓ ਵੇਰਵੇ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਸ਼ੇਅਰ ਬਟਨ ਨੂੰ ਦੁਬਾਰਾ ਜੋੜਿਆ ਗਿਆ ਅਤੇ ਸਟ੍ਰੀਮ ਵਰਣਨ ਨੂੰ ਟੈਬ ਲੇਆਉਟ ਵਿੱਚ ਤਬਦੀਲ ਕੀਤਾ ਗਿਆ +• ਜੇਕਰ ਚਮਕ ਸੰਕੇਤ ਅਯੋਗ ਹੈ ਤਾਂ ਚਮਕ ਨੂੰ ਬਹਾਲ ਕਰਨਾ ਅਯੋਗ ਕਰੋ +• ਕੋਡੀ 'ਤੇ ਵੀਡੀਓ ਚਲਾਉਣ ਲਈ ਸੂਚੀ ਆਈਟਮ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ +• ਕੁਝ ਡਿਵਾਈਸਾਂ 'ਤੇ ਕੋਈ ਡਿਫੌਲਟ ਬ੍ਰਾਊਜ਼ਰ ਸੈੱਟ ਨਾ ਹੋਣ 'ਤੇ ਕਰੈਸ਼ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/975.txt b/fastlane/metadata/android/pa/changelogs/975.txt index c866df1e2..fe23991c7 100644 --- a/fastlane/metadata/android/pa/changelogs/975.txt +++ b/fastlane/metadata/android/pa/changelogs/975.txt @@ -3,14 +3,11 @@ • ਅਯੋਗ ਟਿੱਪਣੀਆਂ ਦਾ ਪਤਾ ਲਗਾਓ • ਫੀਡ ਆਈਟਮ ਨੂੰ ਦੇਖੇ ਗਏ ਵਜੋਂ ਨਿਸ਼ਾਨਬੱਧ ਕਰਨ ਦਿਓ • ਟਿੱਪਣੀ ਦਿਲ ਦਿਖਾਓ - ਸੁਧਾਰ • ਮੈਟਾਡੇਟਾ ਅਤੇ ਟੈਗਸ ਲੇਆਉਟ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ • UI ਭਾਗਾਂ 'ਤੇ ਸੇਵਾ ਰੰਗ ਲਾਗੂ ਕਰੋ ਠੀਕ ਕੀਤਾ • ਮਿੰਨੀ ਪਲੇਅਰ ਵਿੱਚ ਥੰਬਨੇਲ ਠੀਕ ਕਰੋ • ਡੁਪਲੀਕੇਟ ਕਤਾਰ ਆਈਟਮਾਂ 'ਤੇ ਬੇਅੰਤ ਬਫਰਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ -• ਕੁਝ ਪਲੇਅਰ ਫਿਕਸ ਜਿਵੇਂ ਰੋਟੇਸ਼ਨ ਅਤੇ ਤੇਜ਼ੀ ਨਾਲ ਬੰਦ ਹੋਣਾ -• ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਲੋਡ ਕੀਤੇ ਬਾਕੀ ਬਚੇ ReCAPTCHA ਨੂੰ ਠੀਕ ਕਰੋ -• ਫੀਡ ਨੂੰ ਤਾਜ਼ਾ ਕਰਨ ਵੇਲੇ ਕਲਿੱਕਾਂ ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ +• ਕੁਝ ਪਲੇਅਰ ਫਿਕਸ • ਕੁਝ ਡਾਊਨਲੋਡਰ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/976.txt b/fastlane/metadata/android/pa/changelogs/976.txt index a1a1354ca..1f2a70887 100644 --- a/fastlane/metadata/android/pa/changelogs/976.txt +++ b/fastlane/metadata/android/pa/changelogs/976.txt @@ -1,10 +1 @@ -• ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਿੱਚ ਪਲੇਅਰ ਨੂੰ ਸਿੱਧਾ ਖੋਲ੍ਹਣ ਲਈ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ -• ਇਹ ਚੁਣਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ ਕਿ ਕਿਸ ਕਿਸਮ ਦੇ ਖੋਜ ਸੁਝਾਅ ਦਿਖਾਉਣੇ ਹਨ -• ਗੂੜ੍ਹਾ ਥੀਮ ਹੁਣ ਗਹਿਰਾ ਗੂੜ੍ਹਾ + ਗੂੜ੍ਹਾ ਸਪਲੈਸ਼ ਸਕ੍ਰੀਨ ਜੋੜਿਆ ਗਿਆ ਹੈ -• ਅਣਚਾਹੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਸਲੇਟੀ ਕਰਨ ਲਈ ਬਿਹਤਰ ਫ਼ਾਈਲ ਚੋਣਕਾਰ -• ਸਥਿਰ YouTube ਗਾਹਕੀ ਆਯਾਤ - -• ਇੱਕ ਸਟ੍ਰੀਮ ਨੂੰ ਮੁੜ ਚਲਾਉਣ ਲਈ ਮੁੜ-ਪਲੇਅ ਬਟਨ 'ਤੇ ਟੈਪ ਕਰਨ ਦੀ ਲੋੜ ਹੈ -• ਸਥਿਰ ਸਮਾਪਤੀ ਆਡੀਓ ਸੈਸ਼ਨ -• [Android TV] DPad ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਸਥਿਰ ਲੰਬੀ ਸੀਕਬਾਰ ਜੰਪ -ਹੋਰ ਤਬਦੀਲੀਆਂ ਦੇਖਣ ਲਈ, ਹੇਠਾਂ ਦਿੱਤੇ ਲਿੰਕ ਟੈਬ ਤੋਂ ਚੇਂਜਲੌਗ (ਅਤੇ ਬਲੌਗ ਪੋਸਟ) ਦੇਖੋ। +• ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਿੱਚ ਪਲੇਅਰ ਨੂੰ ਸਿੱਧਾ ਖੋਲ੍ਹਣ ਲਈ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਇਹ ਚੁਣਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ ਕਿ ਕਿਸ ਕਿਸਮ ਦੇ ਖੋਜ ਸੁਝਾਅ ਦਿਖਾਉਣੇ ਹਨ • ਗੂੜ੍ਹਾ ਥੀਮ ਹੁਣ ਗੂੜ੍ਹਾ + ਗੂੜ੍ਹਾ ਸਪਲੈਸ਼ ਸਕ੍ਰੀਨ ਜੋੜਿਆ ਗਿਆ ਹੈ • ਅਣਚਾਹੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਸਲੇਟੀ ਕਰਨ ਲਈ ਬਿਹਤਰ ਫ਼ਾਈਲ ਚੋਣਕਾਰ • ਸਥਿਰ YouTube ਗਾਹਕੀ ਆਯਾਤ • ਇੱਕ ਸਟ੍ਰੀਮ ਨੂੰ ਮੁੜ ਚਲਾਉਣ ਲਈ ਮੁੜ-ਪਲੇਅ ਬਟਨ 'ਤੇ ਟੈਪ ਕਰਨ ਦੀ ਲੋੜ ਹੈ • ਸਥਿਰ ਸਮਾਪਤੀ ਆਡੀਓ ਸੈਸ਼ਨ • [Android TV] DPad ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਸਥਿਰ ਲੰਬੀ ਸੀਕਬਾਰ ਜੰਪ ਹੋਰ ਤਬਦੀਲੀਆਂ ਦੇਖਣ ਲਈ, ਹੇਠਾਂ ਦਿੱਤੇ ਲਿੰਕ ਟੈਬ ਤੋਂ ਚੇਂਜਲੌਗ (ਅਤੇ ਬਲੌਗ ਪੋਸਟ) ਦੇਖੋ। diff --git a/fastlane/metadata/android/pa/changelogs/986.txt b/fastlane/metadata/android/pa/changelogs/986.txt index b072d6cb9..3766ca8d1 100644 --- a/fastlane/metadata/android/pa/changelogs/986.txt +++ b/fastlane/metadata/android/pa/changelogs/986.txt @@ -1,15 +1,15 @@ ਨਵਾਂ -• ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਲਈ ਸੂਚਨਾਵਾਂ -• ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਵੀਡੀਓ ਪਲੇਅਰਾਂ ਵਿਚਕਾਰ ਅਰਾਮ ਨਾਲ ਤਬਦੀਲੀ -• ਸੈਮੀਟੋਨਸ ਦੁਆਰਾ ਪਿੱਚ ਬਦਲੋ -• ਇੱਕ ਪਲੇਲਿਸਟ ਵਿੱਚ ਮੁੱਖ ਪਲੇਅਰ ਕਤਾਰ ਜੋੜੋ +• ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਲਈ ਸੂਚਨਾਵਾਂ +• ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਵੀਡੀਓ ਪਲੇਅਰਾਂ ਵਿਚਕਾਰ ਅਰਾਮ ਨਾਲ ਤਬਦੀਲੀ +• ਸੈਮੀਟੋਨਸ ਦੁਆਰਾ ਪਿੱਚ ਬਦਲੋ +• ਇੱਕ ਪਲੇਲਿਸਟ ਵਿੱਚ ਮੁੱਖ ਪਲੇਅਰ ਕਤਾਰ ਜੋੜੋ ਸੁਧਾਰ -• ਸਪੀਡ/ਪਿਚ ਸਟੈਪ ਦਾ ਆਕਾਰ ਯਾਦ ਰੱਖੋ -• ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ ਸ਼ੁਰੂਆਤੀ ਲੰਬੇ ਬਫਰਿੰਗ ਨੂੰ ਘੱਟ ਕਰੋ • Android TV ਲਈ ਪਲੇਅਰ UI ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ +• ਸਪੀਡ/ਪਿਚ ਸਟੈਪ ਦਾ ਆਕਾਰ ਯਾਦ ਰੱਖੋ +• ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ ਸ਼ੁਰੂਆਤੀ ਲੰਬੇ ਬਫਰਿੰਗ ਨੂੰ ਘੱਟ ਕਰੋ +• Android TV ਲਈ ਪਲੇਅਰ UI ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ • ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁਸ਼ਟੀ ਕਰੋ -ਠੀਕ ਕੀਤਾ -• ਮੀਡੀਆ ਬਟਨ ਨੂੰ ਫਿਕਸ ਕਰੋ ਜੋ ਪਲੇਅਰ ਨਿਯੰਤਰਣਾਂ ਨੂੰ ਨਹੀਂ ਲੁਕਾਉਂਦਾ ਹੈ +ਫਿਕਸਡ +• ਮੀਡੀਆ ਬਟਨ ਨੂੰ ਫਿਕਸ ਕਰੋ ਜੋ ਪਲੇਅਰ ਨਿਯੰਤਰਣਾਂ ਨੂੰ ਨਹੀਂ ਲੁਕਾਉਂਦਾ ਹੈ • ਪਲੇਅਰ ਦੀ ਕਿਸਮ ਬਦਲਣ 'ਤੇ ਪਲੇਬੈਕ ਰੀਸੈਟ ਨੂੰ ਠੀਕ ਕਰੋ -• ਪਲੇਲਿਸਟ ਡਾਇਲਾਗ ਨੂੰ ਘੁੰਮਾਉਣ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/987.txt b/fastlane/metadata/android/pa/changelogs/987.txt index 93fc77a77..52d0bb828 100644 --- a/fastlane/metadata/android/pa/changelogs/987.txt +++ b/fastlane/metadata/android/pa/changelogs/987.txt @@ -6,6 +6,4 @@ ਸੁਧਾਰ • ਪਲੇਬੈਕ ਪੈਰਾਮੀਟਰ ਡਾਇਲਾਗ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ • ਗਾਹਕੀ ਆਯਾਤ/ਨਿਰਯਾਤ ਬਟਨਾਂ ਨੂੰ ਤਿੰਨ-ਬਿੰਦੀਆਂ ਵਾਲੇ ਮੀਨੂ ਵਿੱਚ ਲੈ ਜਾਓ - -ਠੀਕ ਕੀਤਾ -• ਪਲੇਲਿਸਟ ਤੋਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਨੂੰ ਹਟਾਉਣਾ ਠੀਕ ਕਰੋ • ਸ਼ੇਅਰ ਮੀਨੂ ਥੀਮ ਅਤੇ "ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" ਐਂਟਰੀ ਨੂੰ ਠੀਕ ਕਰੋ +ਠੀਕ ਕੀਤਾ diff --git a/fastlane/metadata/android/pa/changelogs/990.txt b/fastlane/metadata/android/pa/changelogs/990.txt index bd532ecb0..90cd8b35c 100644 --- a/fastlane/metadata/android/pa/changelogs/990.txt +++ b/fastlane/metadata/android/pa/changelogs/990.txt @@ -1,13 +1,10 @@ -ਇਹ ਰੀਲੀਜ਼ Android 4.4 ਕਿਟਕੈਟ ਲਈ ਸਮਰਥਨ ਛੱਡਦੀ ਹੈ, ਹੁਣ ਘੱਟੋ-ਘੱਟ ਸੰਸਕਰਣ Android 5 Lollipop ਹੈ! -ਨਵਾਂ -• ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਵਾਲੇ ਮੀਨੂ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ -• ਫੀਡ ਵਿੱਚ ਭਵਿੱਖ ਦੇ ਵੀਡੀਓ ਲੁਕਾਓ -• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ -ਸੁਧਾਰ -• ਪਲੇਅਰ ਕੋਡ ਨੂੰ ਛੋਟੇ ਹਿੱਸਿਆਂ ਵਿੱਚ ਰੀਫੈਕਟਰ ਕਰੋ: ਘੱਟ RAM ਵਰਤੀ ਗਈ, ਘੱਟ ਬੱਗ -• ਥੰਮਨੇਲ ਦੇ ਸਕੇਲ ਮੋਡ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ -• ਚਿੱਤਰ ਪਲੇਸਹੋਲਡਰ ਨੂੰ ਵੈਕਟਰਾਈਜ਼ ਕਰੋ - -ਠੀਕ ਕੀਤਾ -• ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਾਲ ਵੱਖ-ਵੱਖ ਮੁੱਦਿਆਂ ਨੂੰ ਹੱਲ ਕਰੋ: ਪੁਰਾਣੀ/ਗੁੰਮ ਮੀਡੀਆ ਜਾਣਕਾਰੀ, ਵਿਗੜਿਆ ਥੰਮਨੇਲ +ਇਹ ਰਿਲੀਜ਼ Android 4.4 ਕਿਟਕੈਟ ਲਈ ਸਮਰਥਨ ਛੱਡਦੀ ਹੈ, ਹੁਣ ਘੱਟੋ-ਘੱਟ ਸੰਸਕਰਣ Android 5 Lollipop ਹੈ! +ਨਵਾਂ +• ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਵਾਲੇ ਮੀਨੂ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ +• ਫੀਡ ਵਿੱਚ ਭਵਿੱਖ ਦੇ ਵੀਡੀਓ ਲੁਕਾਓ +• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ +ਸੁਧਾਰ +• ਪਲੇਅਰ ਕੋਡ ਨੂੰ ਛੋਟੇ ਹਿੱਸਿਆਂ ਵਿੱਚ ਰੀਫੈਕਟਰ ਕਰੋ: ਘੱਟ RAM ਵਰਤੇਗੀ, ਘੱਟ ਬੱਗ ਹੋਣਗੇ + +ਠੀਕ ਕੀਤਾ • ਪੂਰੀ ਸਕ੍ਰੀਨ ਦੀ ਥਾਂ ਉਸਦੇ 1/4 ਹਿੱਸੇ ਦੀ ਵਰਤੋਂ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/995.txt b/fastlane/metadata/android/pa/changelogs/995.txt index 0da0a4261..dc9c576c9 100644 --- a/fastlane/metadata/android/pa/changelogs/995.txt +++ b/fastlane/metadata/android/pa/changelogs/995.txt @@ -5,12 +5,10 @@ ਸੁਧਾਰ • ਪਲੇਅਰ ਇੰਟਰਫੇਸ ਦੀ ਪਹੁੰਚਯੋਗਤਾ -• ਸਿਰਫ਼-ਵੀਡੀਓ ਡਾਊਨਲੋਡਾਂ ਲਈ ਬਿਹਤਰ ਆਡੀਓ ਚੋਣ -• ਸਾਂਝੀ ਕੀਤੀ ਪਲੇਲਿਸਟ ਸਮੱਗਰੀ ਵਿੱਚ ਪਲੇਲਿਸਟ ਅਤੇ ਵੀਡੀਓ ਨਾਮ ਸ਼ਾਮਲ ਕਰਨ ਦਾ ਵਿਕਲਪ +• ਪਲੇਲਿਸਟ ਸ਼ੇਅਰਿੰਗ ਸਮੱਗਰੀ ਵਿੱਚ ਪਲੇਲਿਸਟ ਨਾਮ ਅਤੇ ਵੀਡੀਓ ਨਾਮ ਜੋੜਨ ਲਈ ਵਿਕਲਪ +• ਅੰਦਰੂਨੀ ਸੁਧਾਰ ਅਤੇ ਨਿਰਭਰਤਾ ਅੱਪਡੇਟ ਠੀਕ ਕੀਤੇ -• [ਯੂਟਿਊਬ] ਲਾਈਕ ਗਿਣਤੀ ਨੂੰ ਠੀਕ ਕਰੋ -• ਪਲੇਅਰ ਰਿਸਪੌੰਡ ਨਹੀਂ ਕਰ ਰਿਹਾ ਦੇ ਸੁਨੇਹੇ ਦੇਣ ਵਾਲੇ ਪੌਪਅੱਪ ਅਤੇ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ • ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਵਿੱਚ ਗਲਤ ਭਾਸ਼ਾਵਾਂ ਦੀ ਚੋਣ • ਪਲੇਅਰ ਆਡੀਓ ਫੋਕਸ ਮਿਊਟ ਦਾ ਆਦਰ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ -• ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ ਆਈਟਮਾਂ ਨੂੰ ਜੋੜਨਾ ਕਦੇ-ਕਦਾਈਂ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ +• ਖਾਸ ਮਾਮਲਿਆਂ ਵਿੱਚ ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ ਆਈਟਮਾਂ ਨੂੰ ਜੋੜਨਾ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ diff --git a/fastlane/metadata/android/pa/changelogs/997.txt b/fastlane/metadata/android/pa/changelogs/997.txt index 8e0cb85f2..a33ff32af 100644 --- a/fastlane/metadata/android/pa/changelogs/997.txt +++ b/fastlane/metadata/android/pa/changelogs/997.txt @@ -12,6 +12,4 @@ ਠੀਕ ਕੀਤਾ • [ਯੂਟਿਊਬ] ਲੋਡ ਨਾ ਹੋਣ ਵਾਲੀਆਂ ਟਿੱਪਣੀਆਂ ਨੂੰ ਠੀਕ ਕਰੋ, ਨਾਲ ਹੀ ਹੋਰ ਫਿਕਸ ਅਤੇ ਸੁਧਾਰ -• ਸੈਟਿੰਗਾਂ ਆਯਾਤ ਕਰਨ ਵਿੱਚ ਕਮਜ਼ੋਰੀ ਨੂੰ ਹੱਲ ਕਰੋ ਅਤੇ JSON 'ਤੇ ਸਵਿੱਚ ਕਰੋ • ਕਈ ਡਾਊਨਲੋਡ ਫਿਕਸ -• ਖੋਜ ਟੈਕਸਟ ਨੂੰ ਟਰਿੱਮ ਕਰੋ diff --git a/fastlane/metadata/android/sat/short_description.txt b/fastlane/metadata/android/sat/short_description.txt new file mode 100644 index 000000000..9e7874738 --- /dev/null +++ b/fastlane/metadata/android/sat/short_description.txt @@ -0,0 +1 @@ +ᱮᱱᱰᱨᱳᱭᱮᱰ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱫ ᱯᱷᱨᱤ ᱦᱟᱞᱠᱟ ᱚᱡᱚᱱ ᱭᱩᱴᱭᱩᱵᱽ ᱯᱷᱨᱚᱱᱴᱮᱱᱰ ᱾ diff --git a/fastlane/metadata/android/sk/changelogs/1005.txt b/fastlane/metadata/android/sk/changelogs/1005.txt index 8f2bfbfab..2bfdfca0e 100644 --- a/fastlane/metadata/android/sk/changelogs/1005.txt +++ b/fastlane/metadata/android/sk/changelogs/1005.txt @@ -1,18 +1,17 @@ -Novinky -• Pridaná podpora pre Android Auto -• Možnosť nastaviť skupiny kanálov ako hlavné karty na obrazovke -• [YouTube] Zdieľanie ako dočasný playlist +New +• Add support for Android Auto +• Allow setting feed groups as main screen tabs +• [YouTube] Share as temporary playlist +• [SoundCloud] Likes channel tab -• [SoundCloud] Karta „Páči sa“ kanál. +Improved +• Better search bar hints +• Show download date in Downloads +• Use Android 13 per-app language -Vylepšenia -• Lepšia nápoveda v paneli vyhľadávania -• Zobrazenie dátumu stiahnutia v sekcii „Stiahnuté” -• Použitie jazyka Android 13 pre jednotlivé aplikácie - -Opravy -• Oprava chybných farieb textu v tmavom režime -• [YouTube] Oprava playlistov, ktoré nenačítavajú viac ako 100 položiek -• [YouTube] Oprava chýbajúcich odporúčaných videí -• Oprava pádov v zobrazení zoznamu histórie -• Oprava časových značiek v odpovediach na komentáre. +Fixed +• Fix broken text colors in dark mode +• [YouTube] Fix playlists not loading more than 100 items +• [YouTube] Fix missing recommended videos +• Fix crashes in History list view +• Fix timestamps in comment replies diff --git a/fastlane/metadata/android/sk/changelogs/1006.txt b/fastlane/metadata/android/sk/changelogs/1006.txt index 943b4ff5c..6bc6f9a2b 100644 --- a/fastlane/metadata/android/sk/changelogs/1006.txt +++ b/fastlane/metadata/android/sk/changelogs/1006.txt @@ -1,16 +1,16 @@ -# Vylepšené -Aktuálny prehrávač zostane zachovaný pri kliknutí na časové značky -Ak je to možné, pokúsi sa obnoviť čakajúce úlohy sťahovania -Pridaná možnosť odstrániť sťahovanie bez odstránenia súboru -Oprávnenie zobrazenia cez ostatné aplikácie: zobrazí vysvetlenie pre Android > R -Podpora otvárania odkazov on.soundcloud -Množstvo malých vylepšení a optimalizácií +# Improved +Keep current player when clicking on timestamps +Try to recover pending download missions when possible +Add option to delete a download without also deleting file +Overlay Permission: display explanatory dialog for Android > R +Support on.soundcloud link opening +A lot of small improvements and optimizations -# Opravené -Oprava formátovania krátkeho počítania pre verzie Androidu nižšie ako 7 -Oprava klamných oznámení -Oprava súborov titulkov SRT -Oprava množstva zlyhaní +# Fixed +Fix short count formatting for Android versions below 7 +Fix ghost notifications +Fixes for SRT subtitle files +Fixed tons of crashes -# Vývoj -Modernizácia interného kódu +# Development +Internal code modernization diff --git a/fastlane/metadata/android/sk/changelogs/65.txt b/fastlane/metadata/android/sk/changelogs/65.txt index c7cac2626..8570a056a 100644 --- a/fastlane/metadata/android/sk/changelogs/65.txt +++ b/fastlane/metadata/android/sk/changelogs/65.txt @@ -1,26 +1,26 @@ -### Zlepšenia +### Improvements -- Zakázanie animácie ikony burgermenu #1486 -- Zrušenie odstránenia stiahnutých súborov #1472 -- Možnosť sťahovania v ponuke zdieľania #1498 -- Pridaná možnosť zdieľania do ponuky dlhého ťuknutia #1454 -- Minimalizácia hlavného prehrávača pri ukončení #1354 -- Aktualizácia verzie knižnice a oprava zálohovania databázy #1510 -- Aktualizácia ExoPlayer 2.8.2 #1392 - - Prepracované dialógové okno na ovládanie rýchlosti prehrávania tak, aby podporovalo rôzne veľkosti krokov pre rýchlejšiu zmenu rýchlosti. - - Pridaný prepínač na rýchle prevíjanie dopredu počas ticha v ovládaní rýchlosti prehrávania. Toto by malo byť užitočné pre audioknihy a niektoré hudobné žánre a môže priniesť skutočne plynulý zážitok (a môže prerušiť skladbu s množstvom ticha =\). - - Prepracované rozlíšenie zdrojov médií, aby bolo možné odovzdávať metadáta spolu s médiami interne v prehrávači, namiesto toho, aby sa to robilo ručne. Teraz máme jediný zdroj metadát a je priamo k dispozícii pri spustení prehrávania. - - Opravené neaktualizovanie metadát vzdialeného zoznamu skladieb, keď sú k dispozícii nové metadáta pri otvorení fragmentu zoznamu skladieb. - - Rôzne opravy používateľského rozhrania: #1383, ovládacie prvky oznámenia prehrávača na pozadí sú teraz vždy biele, jednoduchšie vypnutie vyskakovacieho prehrávača prostredníctvom hodenia -- Použitie nového extraktora s preformulovanou architektúrou pre multiservis +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). + - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. + - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. + - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging +- Use new extractor with refactored architecture for multiservice -### Opravy +### Fixes -- Oprava #1440 Nefunkčné rozloženie informácií o videu #1491 -- Oprava histórie zobrazenia #1497 - - #1495 aktualizáciou metadát (miniatúry, názov a počet videí) hneď, ako používateľ vstúpi do zoznamu skladieb. - - #1475, zaregistrovaním zobrazenia v databáze, keď používateľ spustí video v externom prehrávači na detailnom fragmente. -- Oprava časového limitu creen v prípade popup režimu. #1463 (Opravené #640) -- Oprava hlavného prehrávača videa č. 1509 - - #1412] Opravený režim opakovania spôsobujúci NPE prehrávača, keď je prijatý nový zámer, zatiaľ čo je činnosť prehrávača na pozadí. - - Opravené minimalizovanie prehrávača na vyskakovacie okno nezničí prehrávač, keď nie je udelené povolenie na vyskakovanie. +- Fix #1440 Broken Video Info Layout #1491 +- View history fix #1497 + - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. + - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. +- Fix creen timeout in case of popup mode. #1463 (Fixed #640) +- Main video player fix #1509 + - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. + - Fixed minimizing player to popup does not destroy player when popup permission is not granted. diff --git a/fastlane/metadata/android/sk/changelogs/66.txt b/fastlane/metadata/android/sk/changelogs/66.txt index ba9808cba..30c20b0e8 100644 --- a/fastlane/metadata/android/sk/changelogs/66.txt +++ b/fastlane/metadata/android/sk/changelogs/66.txt @@ -1,33 +1,33 @@ -# Zoznam zmien verzie v0.13.7 +# Changelog of v0.13.7 -### Opravené -- Oprava problémov s triediacim filtrom vo verzii v0.13.6 +### Fixed +- Fix sort filter issues of v0.13.6 -# Zoznam zmien verzie v0.13.6 +# Changelog of v0.13.6 -### Vylepšenia +### Improvements -- Zakázanie animácie ikony burgermenu #1486 -- Zrušenie odstránenia stiahnutých súborov #1472 -- Možnosť sťahovania v ponuke zdieľania #1498 -- Pridaná možnosť zdieľania do ponuky dlhého ťuknutia #1454 -- Minimalizácia hlavného prehrávača pri ukončení #1354 -- Aktualizácia verzie knižnice a oprava zálohovania databázy #1510 -- Aktualizácia ExoPlayer 2.8.2 #1392 - - Prepracované dialógové okno na ovládanie rýchlosti prehrávania tak, aby podporovalo rôzne veľkosti krokov pre rýchlejšiu zmenu rýchlosti. - - Pridaný prepínač na rýchle prevíjanie dopredu počas ticha v ovládaní rýchlosti prehrávania. Toto by malo byť užitočné pre audioknihy a niektoré hudobné žánre a môže priniesť skutočne plynulý zážitok (a môže prerušiť skladbu s množstvom ticha =\). - - Prepracované rozlíšenie zdrojov médií, aby bolo možné odovzdávať metadáta spolu s médiami interne v prehrávači, namiesto toho, aby sa to robilo ručne. Teraz máme jediný zdroj metadát a je priamo k dispozícii pri spustení prehrávania. - - Opravené neaktualizovanie metadát vzdialeného zoznamu skladieb, keď sú k dispozícii nové metadáta pri otvorení fragmentu zoznamu skladieb. - - Rôzne opravy používateľského rozhrania: #1383, ovládacie prvky oznámenia prehrávača na pozadí sú teraz vždy biele, jednoduchšie vypnutie vyskakovacieho prehrávača prostredníctvom hodenia -- Použitie nového extraktora s preformulovanou architektúrou pre multiservis +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). + - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. + - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. + - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging +- Use new extractor with refactored architecture for multiservice -### Opravy +### Fixes -- Oprava #1440 Nefunkčné rozloženie informácií o videu #1491 -- Oprava histórie zobrazenia #1497 - - #1495 aktualizáciou metadát (miniatúry, názov a počet videí) hneď, ako používateľ vstúpi do zoznamu skladieb. - - #1475, zaregistrovaním zobrazenia v databáze, keď používateľ spustí video v externom prehrávači na detailnom fragmente. -- Oprava časového limitu creen v prípade popup režimu. #1463 (Opravené #640) -- Oprava hlavného prehrávača videa č. 1509 - - #1412] Opravený režim opakovania spôsobujúci NPE prehrávača, keď je prijatý nový zámer, zatiaľ čo je činnosť prehrávača na pozadí. - - Opravené minimalizovanie prehrávača na vyskakovacie okno nezničí prehrávač, keď nie je udelené povolenie na vyskakovanie. +- Fix #1440 Broken Video Info Layout #1491 +- View history fix #1497 + - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. + - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. +- Fix creen timeout in case of popup mode. #1463 (Fixed #640) +- Main video player fix #1509 + - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. + - Fixed minimizing player to popup does not destroy player when popup permission is not granted. diff --git a/fastlane/metadata/android/tr/changelogs/1005.txt b/fastlane/metadata/android/tr/changelogs/1005.txt index 82b3e2e9c..46b3142f7 100644 --- a/fastlane/metadata/android/tr/changelogs/1005.txt +++ b/fastlane/metadata/android/tr/changelogs/1005.txt @@ -1,17 +1,17 @@ Yeni • Android Auto desteği eklendi -• Akış gruplarını ana ekran sekmeleri olarak ayarlama özelliği eklendi -• [YouTube] Geçici oynatma listesi olarak paylaşma özelliği eklendi -• [SoundCloud] Beğeniler kanalı sekmesi eklendi +• Akış gruplarının ana ekran sekmeleri olarak ayarlanmasına izin verme +• [YouTube] Geçici oynatma listesi olarak paylaşma +• [SoundCloud] Beğenilen kanal sekmesi Geliştirildi -• Arama çubuğu ipuçları iyileştirildi -• İndirilenler bölümünde indirme tarihi gösteriliyor -• Android 13 uygulama başına dil ayarı desteği eklendi +• Daha iyi arama çubuğu önerileri +• İndirilenler'de indirme tarihini gösterimi +• Android 13 uygulama başı dil kullanma Düzeltildi • Karanlık modda bozuk metin renkleri düzeltildi -• [YouTube] 100’den fazla öğe yüklenmeyen oynatma listeleri sorunu giderildi +• [YouTube] 100'den fazla öğeyi yüklemeyen oynatma listeleri düzeltildi • [YouTube] Eksik önerilen videolar düzeltildi -• Geçmiş liste görünümünde oluşan çökme sorunu giderildi +• Geçmiş listesi görünümündeki çökmeler düzeltildi • Yorum yanıtlarındaki zaman damgaları düzeltildi From 27b8a72f19de6510e280a7df76b597071d83dc66 Mon Sep 17 00:00:00 2001 From: tobigr Date: Fri, 9 Jan 2026 21:13:57 +0100 Subject: [PATCH 124/190] Fixed length of changelogs --- .../metadata/android/cs/changelogs/1006.txt | 4 ---- .../metadata/android/de/changelogs/1006.txt | 3 --- .../metadata/android/fr/changelogs/1006.txt | 9 --------- .../metadata/android/hi/changelogs/1006.txt | 5 ----- .../metadata/android/hu/changelogs/1006.txt | 3 --- .../metadata/android/pa/changelogs/1006.txt | 6 ------ .../metadata/android/pl/changelogs/1006.txt | 3 --- .../metadata/android/sv/changelogs/1006.txt | 7 ------- .../metadata/android/uk/changelogs/1006.txt | 4 ---- fastlane_check.sh | 19 +++++++++++++++++++ 10 files changed, 19 insertions(+), 44 deletions(-) create mode 100755 fastlane_check.sh diff --git a/fastlane/metadata/android/cs/changelogs/1006.txt b/fastlane/metadata/android/cs/changelogs/1006.txt index 11a6f4cca..88c312e14 100644 --- a/fastlane/metadata/android/cs/changelogs/1006.txt +++ b/fastlane/metadata/android/cs/changelogs/1006.txt @@ -4,13 +4,9 @@ Pokus o obnovení čekajících stahování, pokud to jde Možnost odstranění stahování bez smazání souboru Oprávnění Zobrazení přes ostatní aplikace: zobrazení vysvětlení pro Android > R Podpora odkazů on.soundcloud -Spousta malých vylepšení a optimalizací # Opravy Oprava formátování pro verze Androidu nižší než 7 Oprava falešných oznámení Opravy souborů titulků SRT Oprava spousty pádů - -# Vývoj -Interní modernizace kódu diff --git a/fastlane/metadata/android/de/changelogs/1006.txt b/fastlane/metadata/android/de/changelogs/1006.txt index 811138c07..1a76b6f0e 100644 --- a/fastlane/metadata/android/de/changelogs/1006.txt +++ b/fastlane/metadata/android/de/changelogs/1006.txt @@ -11,6 +11,3 @@ Kurzformatierung für Android-Versionen unter 7 Geisterbenachrichtigungen SRT-Untertiteldateien Zahlreiche Abstürze - -# Entwicklung -Modernisierung des internen Codes diff --git a/fastlane/metadata/android/fr/changelogs/1006.txt b/fastlane/metadata/android/fr/changelogs/1006.txt index a9ed2c642..65fbccfd5 100644 --- a/fastlane/metadata/android/fr/changelogs/1006.txt +++ b/fastlane/metadata/android/fr/changelogs/1006.txt @@ -1,17 +1,8 @@ -# Améliorations 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 améliorations et optimisations mineures - -# Corrections Correction du formatage du nombre court pour les versions Android inférieures à 7 Correction des notifications fantômes Corrections pour les fichiers de sous-titres SRT -Correction de nombreux plantages - -# Développement -Modernisation du code interne diff --git a/fastlane/metadata/android/hi/changelogs/1006.txt b/fastlane/metadata/android/hi/changelogs/1006.txt index f9656149b..4545d60ed 100644 --- a/fastlane/metadata/android/hi/changelogs/1006.txt +++ b/fastlane/metadata/android/hi/changelogs/1006.txt @@ -3,13 +3,8 @@ जब हो सके तो पेंडिंग डाउनलोड मिशन को रिकवर करने की कोशिश करें फ़ाइल डिलीट किए बिना डाउनलोड डिलीट करने का ऑप्शन जोड़ें .soundcloud लिंक खोलने में सपोर्ट करें -कई छोटे सुधार और ऑप्टिमाइज़ेशन -# ठीक किया गया 7 से कम Android वर्शन के लिए छोटे नंबर फ़ॉर्मेटिंग को ठीक किया गया खाली नोटिफ़िकेशन को ठीक किया गया SRT सबटाइटल फ़ाइलों के लिए ठीक किया गया कई क्रैश ठीक किए गए - -# डेवलपमेंट -इंटरनल कोड मॉडर्नाइज़ेशन diff --git a/fastlane/metadata/android/hu/changelogs/1006.txt b/fastlane/metadata/android/hu/changelogs/1006.txt index 3d0cba88f..a5cbf76eb 100644 --- a/fastlane/metadata/android/hu/changelogs/1006.txt +++ b/fastlane/metadata/android/hu/changelogs/1006.txt @@ -11,6 +11,3 @@ Számozás javítása Android 7 alatt Szellem értesítések javítása SRT felirat javítások Sok összeomlás javítva - -# Fejlesztés -Belső kód modernizálása diff --git a/fastlane/metadata/android/pa/changelogs/1006.txt b/fastlane/metadata/android/pa/changelogs/1006.txt index 2539da187..5046eaaa0 100644 --- a/fastlane/metadata/android/pa/changelogs/1006.txt +++ b/fastlane/metadata/android/pa/changelogs/1006.txt @@ -3,13 +3,7 @@ ਜਦੋਂ ਸੰਭਵ ਹੋਵੇ ਤਾਂ ਬਕਾਇਆ ਡਾਊਨਲੋਡ ਮਿਸ਼ਨਾਂ ਨੂੰ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਫਾਈਲ ਨੂੰ ਮਿਟਾਏ ਬਿਨਾਂ ਡਾਊਨਲੋਡ ਨੂੰ ਮਿਟਾਉਣ ਦਾ ਵਿਕਲਪ ਸ਼ਾਮਿਲ ਕਰੋ on.soundcloud ਲਿੰਕ ਖੋਲ੍ਹਣ ਦਾ ਸਮਰਥਨ ਕਰੋ -ਬਹੁਤ ਸਾਰੇ ਛੋਟੇ ਸੁਧਾਰ ਅਤੇ ਅਨੁਕੂਲਤਾ - -# ਫਿਕਸਡ 7 ਤੋਂ ਘੱਟ ਐਂਡਰਾਇਡ ਸੰਸਕਰਣਾਂ ਲਈ ਛੋਟੀ ਗਿਣਤੀ ਫਾਰਮੈਟਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ ਖਾਲੀ ਨੋਟੀਫਿਕੇਸ਼ਨਾਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ SRT ਉਪਸਿਰਲੇਖ ਫਾਈਲਾਂ ਲਈ ਠੀਕ ਕੀਤਾ ਗਿਆ ਬਹੁਤ ਸਾਰੇ ਕਰੈਸ਼ ਠੀਕ ਕੀਤੇ ਗਏ - -# ਵਿਕਾਸ -ਅੰਦਰੂਨੀ ਕੋਡ ਆਧੁਨਿਕੀਕਰਨ diff --git a/fastlane/metadata/android/pl/changelogs/1006.txt b/fastlane/metadata/android/pl/changelogs/1006.txt index a537d7c18..137f996b9 100644 --- a/fastlane/metadata/android/pl/changelogs/1006.txt +++ b/fastlane/metadata/android/pl/changelogs/1006.txt @@ -11,6 +11,3 @@ Naprawione - Puste powiadomienia - Pliki napisów SRT - Mnóstwo awarii - -Rozwój -- Modernizacja wewnętrznego kodu diff --git a/fastlane/metadata/android/sv/changelogs/1006.txt b/fastlane/metadata/android/sv/changelogs/1006.txt index 90825e8a8..5fae37d22 100644 --- a/fastlane/metadata/android/sv/changelogs/1006.txt +++ b/fastlane/metadata/android/sv/changelogs/1006.txt @@ -4,13 +4,6 @@ Försök att återställa väntande nedladdningsuppdrag när det är möjligt Lägg till alternativ för att ta bort en nedladdning utan att också ta bort filen Överläggsbehörighet: visa förklarande dialogruta för Android > R Stöd för att öppna on.soundcloud-länkar -Många små förbättringar och optimeringar - -# Åtgärdat Åtgärdade formatering av korta antal för Android-versioner under 7 Åtgärdade Ghost Notifications Åtgärdade för SRT-undertextfiler -Åtgärdade massor av krascher - -# Utveckling -Intern kodmodernisering diff --git a/fastlane/metadata/android/uk/changelogs/1006.txt b/fastlane/metadata/android/uk/changelogs/1006.txt index 6534e9145..fd79de93a 100644 --- a/fastlane/metadata/android/uk/changelogs/1006.txt +++ b/fastlane/metadata/android/uk/changelogs/1006.txt @@ -4,13 +4,9 @@ Додано опцію видалення завантаження без одночасного видалення файлу Дозвіл на накладання: відображення пояснювального діалогового вікна для Android > R Підтримка відкриття посилання на .soundcloud -Багато дрібних покращень та оптимізацій # Виправлено Виправлено форматування короткого лічильника для версій Android нижче 7 Виправлено сповіщення-примари Виправлення для файлів субтитрів SRT Виправлено безліч збоїв - -# Розробка -Модернізація внутрішнього коду diff --git a/fastlane_check.sh b/fastlane_check.sh new file mode 100755 index 000000000..71bc5b6f7 --- /dev/null +++ b/fastlane_check.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +dir="fastlane" +size="500" +name_filter="${1:-}" + +find_cmd=(find "$dir" -type f -size +"${size}c") +if [[ -n $name_filter ]]; then + find_cmd+=(-name "$name_filter") +fi +find_cmd+=(-print0) + +# find: -type f (files), -size +Nc (N bytes, + means strictly greater) +# print0/xargs -0 to safely handle filenames with spaces/newlines + + # macOS stat: "%z %N" => size and filename +"${find_cmd[@]}"| xargs -0 stat -f "%z %N" + + From 3323868042538d31ba7e14fca518b1e7504bb43d Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 9 Jan 2026 15:15:58 +0100 Subject: [PATCH 125/190] Translated using Weblate (Bengali (India)) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 39.2% (300 of 764 strings) Translated using Weblate (Lombard) Currently translated at 0.3% (3 of 764 strings) Translated using Weblate (French) Currently translated at 75.8% (66 of 87 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Tigrinya) Currently translated at 21.8% (167 of 764 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Belarusian) Currently translated at 99.0% (757 of 764 strings) Translated using Weblate (Slovak) Currently translated at 77.0% (67 of 87 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Bulgarian) Currently translated at 3.4% (3 of 87 strings) Translated using Weblate (Santali) Currently translated at 1.1% (1 of 87 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (German) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (Turkish) Currently translated at 33.3% (29 of 87 strings) Translated using Weblate (Punjabi) Currently translated at 78.1% (68 of 87 strings) Translated using Weblate (German) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (French) Currently translated at 74.7% (65 of 87 strings) Translated using Weblate (French) Currently translated at 74.7% (65 of 87 strings) Translated using Weblate (Czech) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (Slovak) Currently translated at 74.7% (65 of 87 strings) Translated using Weblate (Hindi) Currently translated at 77.0% (67 of 87 strings) Translated using Weblate (Punjabi) Currently translated at 68.9% (60 of 87 strings) Co-authored-by: 135 <135135@users.noreply.hosted.weblate.org> Co-authored-by: Balázs Meskó Co-authored-by: Ding User Co-authored-by: Dizro Co-authored-by: Erenay Co-authored-by: Femini Co-authored-by: Fjuro Co-authored-by: Hosted Weblate Co-authored-by: Kuko Co-authored-by: MatthieuPh Co-authored-by: Mickaël Binos Co-authored-by: Milan Co-authored-by: Prasanta-Hembram Co-authored-by: STV Co-authored-by: ShareASmile Co-authored-by: Sumon Kayal Co-authored-by: Trunars Co-authored-by: VfBFan Co-authored-by: whistlingwoods <72640314+whistlingwoods@users.noreply.github.com> Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/bg/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pa/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sat/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/tr/ Translation: NewPipe/Metadata --- app/src/main/res/values-az/strings.xml | 2 +- app/src/main/res/values-be/strings.xml | 1 + app/src/main/res/values-bn-rIN/strings.xml | 4 ++ app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-hi/strings.xml | 34 +++++++++-- app/src/main/res/values-hu/strings.xml | 2 +- app/src/main/res/values-lmo/strings.xml | 1 + app/src/main/res/values-pa/strings.xml | 57 +++++++++---------- app/src/main/res/values-sk/strings.xml | 16 +++--- app/src/main/res/values-ti/strings.xml | 15 +++++ .../metadata/android/bg/changelogs/63.txt | 8 --- .../metadata/android/cs/changelogs/1005.txt | 22 +++---- .../metadata/android/de/changelogs/986.txt | 17 +++--- .../metadata/android/de/changelogs/987.txt | 18 +++--- .../metadata/android/de/changelogs/997.txt | 15 +++-- .../metadata/android/de/changelogs/999.txt | 4 +- .../metadata/android/fr/changelogs/1000.txt | 24 ++++---- .../metadata/android/fr/changelogs/1003.txt | 12 ++-- .../metadata/android/fr/changelogs/1005.txt | 18 +++--- .../metadata/android/fr/changelogs/65.txt | 2 +- .../metadata/android/fr/changelogs/70.txt | 2 +- .../metadata/android/hi/changelogs/1000.txt | 4 -- .../metadata/android/hi/changelogs/1002.txt | 1 - .../metadata/android/hi/changelogs/1004.txt | 4 +- .../metadata/android/hi/changelogs/1005.txt | 22 ++++--- .../metadata/android/hi/changelogs/1006.txt | 15 +++++ .../metadata/android/hi/changelogs/65.txt | 29 +++------- .../metadata/android/hi/changelogs/66.txt | 42 +++++--------- .../metadata/android/hi/changelogs/68.txt | 40 +++++-------- .../metadata/android/hi/changelogs/69.txt | 28 ++++----- .../metadata/android/hi/changelogs/70.txt | 34 ++++------- .../metadata/android/hi/changelogs/71.txt | 15 ++--- .../metadata/android/hi/changelogs/740.txt | 29 +++------- .../metadata/android/hi/changelogs/750.txt | 31 ++++------ .../metadata/android/hi/changelogs/760.txt | 50 ++++------------ .../metadata/android/hi/changelogs/790.txt | 21 +++---- .../metadata/android/hi/changelogs/800.txt | 31 +++------- .../metadata/android/hi/changelogs/810.txt | 26 +++------ .../metadata/android/hi/changelogs/840.txt | 28 +++------ .../metadata/android/hi/changelogs/930.txt | 26 ++++----- .../metadata/android/hi/changelogs/940.txt | 24 ++++---- .../metadata/android/hi/changelogs/951.txt | 24 ++++---- .../metadata/android/hi/changelogs/995.txt | 4 +- .../metadata/android/hi/changelogs/997.txt | 3 - .../metadata/android/pa/changelogs/1000.txt | 8 +-- .../metadata/android/pa/changelogs/1004.txt | 4 +- .../metadata/android/pa/changelogs/1005.txt | 21 +++---- .../metadata/android/pa/changelogs/1006.txt | 15 +++++ .../metadata/android/pa/changelogs/65.txt | 14 ++++- .../metadata/android/pa/changelogs/66.txt | 22 ++++++- .../metadata/android/pa/changelogs/68.txt | 20 ++++++- .../metadata/android/pa/changelogs/69.txt | 16 +++++- .../metadata/android/pa/changelogs/70.txt | 11 +++- .../metadata/android/pa/changelogs/71.txt | 9 ++- .../metadata/android/pa/changelogs/740.txt | 9 ++- .../metadata/android/pa/changelogs/750.txt | 10 +++- .../metadata/android/pa/changelogs/760.txt | 11 +++- .../metadata/android/pa/changelogs/780.txt | 12 +++- .../metadata/android/pa/changelogs/790.txt | 12 +++- .../metadata/android/pa/changelogs/800.txt | 11 +++- .../metadata/android/pa/changelogs/810.txt | 12 +++- .../metadata/android/pa/changelogs/840.txt | 11 +++- .../metadata/android/pa/changelogs/920.txt | 10 +++- .../metadata/android/pa/changelogs/930.txt | 15 ++++- .../metadata/android/pa/changelogs/940.txt | 15 ++++- .../metadata/android/pa/changelogs/951.txt | 24 ++++---- .../metadata/android/pa/changelogs/954.txt | 15 ++--- .../metadata/android/pa/changelogs/957.txt | 17 +++--- .../metadata/android/pa/changelogs/964.txt | 7 ++- .../metadata/android/pa/changelogs/975.txt | 5 +- .../metadata/android/pa/changelogs/976.txt | 11 +--- .../metadata/android/pa/changelogs/986.txt | 18 +++--- .../metadata/android/pa/changelogs/987.txt | 4 +- .../metadata/android/pa/changelogs/990.txt | 21 +++---- .../metadata/android/pa/changelogs/995.txt | 8 +-- .../metadata/android/pa/changelogs/997.txt | 2 - .../android/sat/short_description.txt | 1 + .../metadata/android/sk/changelogs/1005.txt | 31 +++++----- .../metadata/android/sk/changelogs/1006.txt | 28 ++++----- .../metadata/android/sk/changelogs/65.txt | 46 +++++++-------- .../metadata/android/sk/changelogs/66.txt | 54 +++++++++--------- .../metadata/android/tr/changelogs/1005.txt | 16 +++--- 82 files changed, 717 insertions(+), 666 deletions(-) delete mode 100644 fastlane/metadata/android/bg/changelogs/63.txt create mode 100644 fastlane/metadata/android/hi/changelogs/1006.txt create mode 100644 fastlane/metadata/android/pa/changelogs/1006.txt create mode 100644 fastlane/metadata/android/sat/short_description.txt diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 6f14202e1..689cf4937 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -585,7 +585,7 @@ Serveri təsdiqləmək mümkün olmadı %s-də bəyəndiyiniz serverləri tapın Video \"Təfsilatlar\" səhifəsində fon və ya ani görüntü düyməsin basarkən ipucu göstər - Oynadıcı titr mətn miqyasını və arxa fon üslublarını dəyişdir. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur + Oynadıcı titr mətn miqyasını və arxa plan üslublarını dəyişdir. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur Xəta baş verdi: %1$s Fayl mövcud deyil, yaxud oxumaq və ya yazmaq icazəsi yoxdur Veb saytı təhlil etmək alınmadı diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 8732e45d9..ef7ef98c3 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -831,4 +831,5 @@ Трэнды – фільмы і перадачы Гэты кантэнт недаступны для цяперашняй краіны кантэнту.\n\nЯе можна змяніць праз «Налады > Кантэнт > Прадвызначаная краіна кантэнту». 21 ліпеня 2025 года YouTube спыніў падтрымку аб\'яднанай старонкі трэндаў. NewPipe замяніў старонку трэндаў на трэнды трансляцый.\n\nТаксама можна выбраць іншыя старонкі трэндаў праз «Налады > Кантэнт > Змесціва галоўнай старонкі». + Аб\'яднаныя трэнды YouTube выдалены diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index e6269b5b9..a79319ee3 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -307,4 +307,8 @@ বিজ্ঞপ্তিতে প্রদর্শিত ভিডিও থাম্বনেল 16:9 থেকে 1:1 অনুপাতের করুন (বিকৃতি দেখা যেতে পারে) অদলবদল কিছু না + হ্যাঁ + না + সার্চ + খুঁজুন diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 627e755f6..b36b8555b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -837,7 +837,7 @@ Beliebte Filme und Shows Beliebte Musik Beliebte Podcasts - YouTube hat den geteilten Feed entfernt + YouTube hat die kombinierten „beliebten Seiten“ entfernt YouTube hat die kombinierte Trending-Seite ab dem 21. Juli 2025 eingestellt. NewPipe hat die Standard-Trending-Seite durch die Trending-Livestreams ersetzt.\n\nDu kannst auch verschiedene Trendseiten unter „Einstellungen > Inhalt > Inhalt der Hauptseite“ auswählen. Um den Pop-up-Player zu verwenden, bitte in den folgenden Android-Einstellungen %1$s auswählen und %2$s aktivieren. „Über anderen Apps einblenden“ diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index dd23cfc08..d2e6a422e 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -74,7 +74,7 @@ देखे गए वीडियोज़ की सूची रखें प्लेबैक फिर से शुरू करें रुकावटें (जैसे कि फ़ोन कॉल) खत्म होने के बाद वीडियो प्ले जारी रखें - \'अगले\' और \'सबंधित\' वीडियो दिखाएं + \'अगला\' और \'संबंधित\' वीडियो दिखाएं \"कतार में जोड़ने के लिए स्पर्श बनाये रखें\" दिखाएं जब बैकग्राउंड और पॉपअप बटन वीडियो के विवरण पन्ने में दबाई जाए तो सलाह दिखाएं असमर्थित URL @@ -93,7 +93,7 @@ बंद किया साफ करें उत्तम रिजॉल्युशन - वापिस + अन-डू करें सभी प्ले करें न्यूपाइप की नोटीफिकेशन न्यूपाइप के प्लेयर के लिए नोटीफिकेशन @@ -104,7 +104,7 @@ वैबसाइट parse नहीं हो सकी विषय वस्तु उपलब्ध नहीं है डाउनलोड मेनू स्थापित नहीं किया जा सका - APP/UI करैश हो गई + ऐप/UI करैश हो गई इस वीडियो को चलाने में असफल हुए अनचाही वीडियो प्लेयर त्रुटी आयी है वीडियो प्लेयर त्रुटी से ठीक हो रहा है @@ -391,7 +391,7 @@ प्लेबैक स्थानों को मिटाएं सारे प्लेबैक स्थानों को मिटाता है सारे प्लेबैक स्थानों को मिटाएं\? - निपटान के बाद खंड या गतिविधि जीवन चक्र के बाहर अविभाज्य आरएक्स अपवादों की रिपोर्टिंग को बलपूर्वक लागू करें + हैंडलिंग के बाद फ्रैगमेंट या एक्टिविटी लूप के बाहर अनहैंडल्ड Rx एक्सेप्शन की रिपोर्टिंग को बलपूर्वक लागू करें साउंडक्लाउड प्रोफाइल निर्यात करने के लिए आईडी या युआरएल दीजिये: \n \n1. अपने वेब ब्राउज़र में \"डेस्कटॉप मोड\" चालू करें (वेबसाइट मोबाइल उपकरणों के लिए उपलब्ध नहीं है) @@ -406,7 +406,7 @@ ग्रिड ऑटो त्रुटि दिखाएं - सर्वर मल्टी थ्रेडेड डाउनलोड स्वीकार नहीं करता, पुनः कोशिश करे @string/msg_threads = 1 के साथ + सर्वर मल्टी थ्रेडेड डाउनलोड स्वीकार नहीं करता, @string/msg_threads = 1 के साथ पुनः कोशिश करें \'स्टोरेज एक्सेस फ्रेमवर्क\' आपको बाहरी एसडी कार्ड पर डाउनलोड करने देता है सेवा चुनें, वर्तमान चुनाव : डिफ़ॉल्ट कियोस्क @@ -502,7 +502,7 @@ अनगिनत विडीओज़ 100+ विडीओज़ विवरण - संबंधित स्ट्रीमस + संबंधित आइटम्स टिप्पणियाँ कृपया जांचें लें कि क्या आपके क्रैश पर चर्चा करने वाला मुद्दा पहले से मौजूद है। डुप्लिकेट टिकट बनाते समय, आप हमसे समय लेते हैं जो हम वास्तविक बग को ठीक करने के लिए खर्च कर सकते हैं। गिटहब पर रिपोर्ट करें @@ -828,4 +828,26 @@ चैनल समूह पेज पसंद यूट्यूब अस्थायी प्लेलिस्ट के रूप में साझा करें + एंटरी मिटा दी गई + फाईल डिलीट करें + एंटरी मिटाऐं + %sहज़ार + पॉपअप प्लेयर इस्तेमाल करने के लिए, कृपया नीचे दिए गए Android सेटिंग्स मेनू में %1$s चुनें और %2$s चालू करें। + “अन्य ऐप्स पर डिस्प्ले की अनुमति दें” + %sमिलीअन + %sअरब + अकाउंट बंद कर दिया गया\n\n%1$s यह कारण बताता है: %2$s + साउंडक्लाउड टॉप 50 पेज हटा दिया गया + साउंडक्लाउड ने ओरिजिनल टॉप 50 चार्ट बंद कर दिए हैं। इससे जुड़ा टैब आपके मेन पेज से हटा दिया गया है। + YouTube कंबाइंड ट्रेंडिंग हटा दी गई + YouTube ने 21 जुलाई 2025 से कंबाइंड ट्रेंडिंग पेज बंद कर दिया है। NewPipe ने डिफ़ॉल्ट ट्रेंडिंग पेज को ट्रेंडिंग लाइवस्ट्रीम से बदल दिया है।\n\nआप \"सेटिंग्स > कंटेंट > मेन पेज कंटेंट\" में अलग-अलग ट्रेंडिंग पेज भी चुन सकते हैं। + गेमिंग ट्रेंडस + ट्रेंडिंग पॉडकास्ट + ट्रेंडिंग फिल्में और शो + ट्रेंडिंग संगीत + पले करते समय सर्वर से HTTP error 403 मिला, शायद स्ट्रीमिंग URL एक्सपायर होने या IP बैन की वजह से हुआ + पले करते समय सर्वर से HTTP error %1$s मिला + पले करते समय सर्वर से HTTP error 403 मिला, जो शायद IP बैन या स्ट्रीमिंग URL डीओबफस्केशन की दिक्कतों की वजह से हुआ है + %1$s ने डेटा देने से मना कर दिया, और यह कन्फर्म करने के लिए लॉगिन मांगा कि रिक्वेस्ट करने वाला बोट नहीं है।\n\nहो सकता है कि %1$s ने आपके IP को कुछ समय के लिए बैन कर दिया हो, आप कुछ समय इंतज़ार कर सकते हैं या किसी दूसरे IP पर स्विच कर सकते हैं (जैसे VPN ऑन/ऑफ करके, या WiFi से मोबाइल डेटा पर स्विच करके)। + यह कंटेंट अभी चुने गए देश के कंटेंट के लिए उपलब्ध नहीं है।\n\n\"सेटिंग्स > कंटेंट > डिफ़ॉल्ट कंटेंट देश\" से अपना चुनाव बदलें। diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index d114a2d33..12778fd32 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -817,7 +817,7 @@ Bejegyzés törölve Fiók megszüntetve\n\n%1$s az alábbi ok miatt: %2$s A lejátszás közben a kiszolgáló 403-as HTTP-hibát adott vissza, valószínűleg a közvetítési hivatkozás érvényessége lejárt vagy a IP-tiltás miatt - HTTP-hiba %1$s érkezett a kiszolgáltól a lejátszás közben + HTTP-hiba (%1$s) érkezett a kiszolgálótól a lejátszás során HTTP 403-as hiba érkezett a kiszolgálótól a lejátszás közben, valószínűleg IP-tiltás vagy a közvetítési hivatkozás feloldási problémák miatt %1$s visszautasította az adatok szolgáltatását, és bejelentkezést kér annak megerősítésére, hogy a kérés nem robot által érkezik.\n\nElőfordulhat, hogy az IP-címét ideiglenesen letiltotta %1$s, várhat egy keveset, vagy váltson egy másik IP-címre (például VPN be-/kikapcsolásával, vagy Wi-Fi-ről mobiladat-forgalomra váltva). Ez a tartalom a jelenleg kiválasztott tartalom országában nem elérhető.\n\nVáltoztassa meg a „Beállítások > Tartalom >Tartalom alapértelmezett országa” menüpontban. diff --git a/app/src/main/res/values-lmo/strings.xml b/app/src/main/res/values-lmo/strings.xml index 6f681ac08..80f3dd9c6 100644 --- a/app/src/main/res/values-lmo/strings.xml +++ b/app/src/main/res/values-lmo/strings.xml @@ -1,4 +1,5 @@ Pigia la lente per inziaa. + Canai diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index eb6ee58a2..a937fbf86 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -29,7 +29,7 @@ ਨਵਾਂ ਕੀ ਹੈ ਬੈਕਗ੍ਰਾਊਂਡ ਪੌਪ-ਅਪ - ਵਿੱਚ ਸ਼ਾਮਿਲ ਕਰੋ + ਦੇ ਵਿੱਚ ਜੋੜ੍ਹੋ ਵੀਡੀਓ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਇੱਥੇ ਜਮ੍ਹਾਂ ਹੁੰਦੀਆਂ ਹਨ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੁਣੋ @@ -93,7 +93,7 @@ ਬੰਦ ਕੀਤਾ ਸਾਫ ਕਰੋ ਵਧੀਆ ਰੈਜ਼ੋਲਿਊਸ਼ਨ - ਵਾਪਿਸ + ਅਣ-ਕੀਤਾ ਕਰੋ ਸਾਰੇ ਚਲਾਓ ਹਮੇਸ਼ਾਂ ਸਿਰਫ਼ ਇਸ ਬਾਰ @@ -184,8 +184,7 @@ ਕ੍ਰਿਪਾ ਕਰਕੇ ਉਡੀਕ ਕਰੋ… ਕਲਿਪ-ਬੋਰਡ ਵਿੱਚ ਕਾਪੀ ਹੋ ਗਿਆ ਹੈ ਬਾਅਦ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਵਿਚੋਂ ਇੱਕ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਨੂੰ ਚੁਣੋ - ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਖੋਲ੍ਹਣ ਵਾਸਤੇ -\nਇਸ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ + ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਖੋਲ੍ਹਣ ਵਾਸਤੇ\nਇਸ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ 1 ਆਈਟਮ ਮਿਟਾਈ ਗਈ। ReCaptcha ਚੁਣੌਤੀ ReCaptcha ਚੁਣੌਤੀ ਲਈ ਬੇਨਤੀ @@ -278,36 +277,19 @@ ਪਿੱਛਲਾ ਐਕਸਪੋਰਟ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਨਹੀਂ ਹੋ ਸਕੀਆਂ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਐਕਸਪੋਰਟ ਨਹੀਂ ਹੋ ਸਕੀਆਂ - ਗੂਗਲ ਟੇਕਅਊਟ ਤੋਂ ਯੂਟਿਊਬ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਐਕਸਪੋਰਟ ਫਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ: -\n -\n1. ਇਸ URL ਤੇ ਜਾਓ: %1$s -\n2. ਮੰਗਣ ਤੇ ਆਪਣੇ ਖਾਤੇ \'ਚ ਲਾਗ-ਇਨ ਕਰੋ -\n3. ਕਲਿੱਕ ਕਰੋ \" All data incuded\" ਤੇ, ਫੇਰ \"Deselect all\" ਤੇ ਫੇਰ ਸਿਰਫ \"subscriprion\" ਚੁਣੋ ਅਤੇ \"OK\" ਕਰੋ -\n4. \"Next step\" ਤੇ ਕਲਿੱਕ ਕਰੋ ਤੇ ਫੇਰ \"create export\" ਤੇ -\n5. ਡਾਊਨਲੋਡ ਬਟਨ ਦਿਖਾਈ ਦੇਣ ਤੇ ਇਸ ਤੇ ਕਲਿੱਕ ਕਰੋ।ਇੱਕ ਡਾਉਨਲੋਡ ਸ਼ੁਰੂ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ (ਇਹੀ ਐਕਸਪੋਰਟ ਫਾਈਲ ਹੈ) -\n6. ਥੱਲੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰੋ ਤੇ ਡਾਊਨਲੋਡ ਕੀਤੀ .zip ਫਾਈਲ ਚੁਣੋ -\n7. [ਜੇ .zip ਤੋਂ ਐਕਸਪੋਰਟ ਫੇਲ ਹੋ ਜਾਂਦੀ ਹੈ] ਤਾਂ .csv ਫਾਈਲ ਐਕਸਟਰੈਕਟ ਕਰੋ (ਆਮ ਤੌਰ ਤੇ \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), ਥੱਲੇ ਦਿੱਤੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰਕੇ ਐਕਸਟਰੈਕਟ ਕੀਤੀ csv ਫਾਈਲ ਚੁਣੋ - URL ਜਾਂ ਆਪਣੀ ID ਟਾਈਪ ਕਰਕੇ ਸਾਉੰਡ ਕਲਾਉਡ ਪ੍ਰੋਫਾਈਲ ਇੰਪੋਰਟ ਕਰੋ: -\n -\n1. ਇੱਕ ਵੈਬ-ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ \"ਡੈਸਕਟਾਪ ਮੋਡ\" ਨੂੰ ਚਾਲੂ ਕਰੋ (ਸਾਈਟ ਮੋਬਾਈਲ ਉਪਕਰਣਾਂ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ) -\n2. ਇਸ URL ਤੇ ਜਾਓ: %1$s -\n3. ਆਪਣੇ ਖਾਤੇ ਚ ਲੌਗ-ਇਨ ਕਰੋ -\n4. ਨਿਰਦੇਸ਼ਤ ਕੀਤੇ ਗਏ ਪ੍ਰੋਫਾਈਲ URL ਨੂੰ ਕਾਪੀ ਕਰੋ. + ਗੂਗਲ ਟੇਕਆਊਟ ਤੋਂ ਯੂਟਿਊਬ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਐਕਸਪੋਰਟ ਫਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ:\n\n1. ਇਸ URL ਤੇ ਜਾਓ: %1$s\n2. ਮੰਗਣ ਤੇ ਆਪਣੇ ਖਾਤੇ \'ਚ ਲਾਗ-ਇਨ ਕਰੋ\n3. ਕਲਿੱਕ ਕਰੋ \" All data incuded\" ਤੇ, ਫੇਰ \"Deselect all\" ਤੇ ਫੇਰ ਸਿਰਫ \"subscriprion\" ਚੁਣੋ ਅਤੇ \"OK\" ਕਰੋ\n4. \"Next step\" ਤੇ ਕਲਿੱਕ ਕਰੋ ਅਤੇ ਫੇਰ \"create export\" ਤੇ\n5. ਡਾਊਨਲੋਡ ਬਟਨ ਦਿਖਾਈ ਦੇਣ ਤੇ ਇਸ ਤੇ ਕਲਿੱਕ ਕਰੋ। ਇੱਕ ਡਾਉਨਲੋਡ ਸ਼ੁਰੂ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ (ਇਹੀ ਐਕਸਪੋਰਟ ਫਾਈਲ ਹੈ)\n6. ਥੱਲੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰੋ ਤੇ ਡਾਊਨਲੋਡ ਕੀਤੀ .zip ਫਾਈਲ ਚੁਣੋ\n7. [ਜੇ .zip ਤੋਂ ਐਕਸਪੋਰਟ ਫੇਲ ਹੋ ਜਾਂਦੀ ਹੈ] ਤਾਂ .csv ਫਾਈਲ ਐਕਸਟਰੈਕਟ ਕਰੋ (ਆਮ ਤੌਰ ਤੇ \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), ਥੱਲੇ ਦਿੱਤੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰਕੇ ਐਕਸਟਰੈਕਟ ਕੀਤੀ csv ਫਾਈਲ ਚੁਣੋ + URL ਜਾਂ ਆਪਣੀ ID ਟਾਈਪ ਕਰਕੇ ਸਾਉੰਡ ਕਲਾਉਡ ਪ੍ਰੋਫਾਈਲ ਇੰਪੋਰਟ ਕਰੋ: \n \n1. ਇੱਕ ਵੈਬ-ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ \"ਡੈਸਕਟਾਪ ਮੋਡ\" ਨੂੰ ਚਾਲੂ ਕਰੋ (ਸਾਈਟ ਮੋਬਾਈਲ ਉਪਕਰਣਾਂ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ) \n2. ਇਸ URL ਤੇ ਜਾਓ: %1$s \n3. ਆਪਣੇ ਖਾਤੇ ਚ ਲੌਗ-ਇਨ ਕਰੋ \n4. ਨਿਰਦੇਸ਼ਤ ਕੀਤੇ ਗਏ ਪ੍ਰੋਫਾਈਲ URL ਨੂੰ ਕਾਪੀ ਕਰੋ। ਤੁਹਾਡੀ ਆਈਡੀ, soundcloud.com/ਤੁਹਾਡੀ ਆਈਡੀ - ਯਾਦ ਰੱਖੋ ਕਿ ਇਸ ਕਾਰਜ ਨਾਲ ਡਾਟਾ ਖਪਤ ਹੋ ਸਕਦਾ ਹੈ। -\n -\nਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਯਾਦ ਰੱਖੋ ਕਿ ਇਸ ਕਾਰਜ ਨਾਲ ਡਾਟਾ ਖਪਤ ਹੋ ਸਕਦਾ ਹੈ।\n\nਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਪਲੇਅਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ ਤਾਲ ਪਿੱਚ ਅਲਹਿਦਾ ਕਰੋ (ਵਿਗਾੜ ਪੈ ਸਕਦਾ ਹੈ) ਕੀ ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਵੀ ਇੰਪੋਰਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ\? ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ - ਨਿਊਪਾਈਪ ਪ੍ਰੋਜੈਕਟ ਤੁਹਾਡੀ ਗੋਪਨੀਯਤਾ ਨੂੰ ਬਹੁਤ ਗੰਭੀਰਤਾ ਨਾਲ ਲੈਂਦਾ ਹੈ। ਇਸ ਲਈ ਐਪ ਤੁਹਾਡੀ ਸਹਿਮਤੀ ਤੋਂ ਬਿਨਾਂ ਕੋਈ ਵੀ ਡਾਟਾ ਇੱਕਠਾ ਨਹੀਂ ਕਰਦਾ। -\nਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵਿਸਥਾਰ ਵਿੱਚ ਦੱਸਦੀ ਹੈ ਕਿ ਜਦੋਂ ਤੁਸੀਂ ਕਰੈਸ਼ ਰਿਪੋਰਟ ਭੇਜਦੇ ਹੋ ਤਾਂ ਕਿਹੜਾ ਡਾਟਾ ਭੇਜਿਆ ਜਾਂ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। + ਨਿਊਪਾਈਪ ਪ੍ਰੋਜੈਕਟ ਤੁਹਾਡੀ ਗੋਪਨੀਯਤਾ ਨੂੰ ਬਹੁਤ ਗੰਭੀਰਤਾ ਨਾਲ ਲੈਂਦਾ ਹੈ। ਇਸ ਲਈ ਐਪ ਤੁਹਾਡੀ ਸਹਿਮਤੀ ਤੋਂ ਬਿਨਾਂ ਕੋਈ ਵੀ ਡਾਟਾ ਇੱਕਠਾ ਨਹੀਂ ਕਰਦਾ।\nਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵਿਸਥਾਰ ਵਿੱਚ ਦੱਸਦੀ ਹੈ ਕਿ ਜਦੋਂ ਤੁਸੀਂ ਕਰੈਸ਼ ਰਿਪੋਰਟ ਭੇਜਦੇ ਹੋ ਤਾਂ ਕਿਹੜਾ ਡਾਟਾ ਭੇਜਿਆ ਜਾਂ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਪੜ੍ਹੋ - ਯੂਰਪੀਅਨ ਜਨਰਲ ਡੇਟਾ ਪ੍ਰੋਟੈਕਸ਼ਨ ਰੈਗੂਲੇਸ਼ਨ (ਜੀਡੀਪੀਆਰ) ਦੀ ਪਾਲਣਾ ਕਰਨ ਲਈ, ਅਸੀਂ ਤੁਹਾਡਾ ਧਿਆਨ ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵੱਲ ਖਿੱਚਦੇ ਹਾਂ। ਕਿਰਪਾ ਕਰਕੇ ਇਸਨੂੰ ਧਿਆਨ ਨਾਲ ਪੜ੍ਹੋ। -\nਸਾਨੂੰ ਨੁਕਸ ਰਿਪੋਰਟ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਸਵੀਕਾਰ ਕਰਨਾ ਹੋਵੇਗਾ। + ਯੂਰਪੀਅਨ ਜਨਰਲ ਡੇਟਾ ਪ੍ਰੋਟੈਕਸ਼ਨ ਰੈਗੂਲੇਸ਼ਨ (ਜੀਡੀਪੀਆਰ) ਦੀ ਪਾਲਣਾ ਕਰਨ ਲਈ, ਅਸੀਂ ਤੁਹਾਡਾ ਧਿਆਨ ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵੱਲ ਖਿੱਚਦੇ ਹਾਂ। ਕਿਰਪਾ ਕਰਕੇ ਇਸਨੂੰ ਧਿਆਨ ਨਾਲ ਪੜ੍ਹੋ।\nਸਾਨੂੰ ਨੁਕਸ ਰਿਪੋਰਟ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਸਵੀਕਾਰ ਕਰਨਾ ਹੋਵੇਗਾ। ਸਵੀਕਾਰ ਕਰੋ ਅਸਵੀਕਾਰ ਕੋਈ ਸੀਮਾ ਨਹੀਂ @@ -512,8 +494,7 @@ %d ਸਕਿੰਟ ਹਾਂ, ਅਤੇ ਅੱਧ-ਪਚੱਧੀਆਂ ਵੇਖੀਆਂ ਹੋਈਆਂ ਵੀ - ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਿਲ, ਪਹਿਲਾਂ ਚਾਹੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੇ ਜਾ ਚੁੱਕੇ ਵੀਡੀਓ ਹਟਾ ਦਿੱਤੇ ਜਾਣਗੇ। -\nਕੀ ਵਾਕਿਆ ਹੀ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਮੋੜਿਆ ਜਾ ਸਕਣਾ! + ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਿਲ ਪਹਿਲਾਂ ਤੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੇ ਜਾ ਚੁੱਕੇ ਵੀਡੀਓ ਹਟਾ ਦਿੱਤੇ ਜਾਣਗੇ। \nਕੀ ਵਾਕਿਆ ਹੀ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਣਾ! ਵੇਖੇ ਹੋਏ ਵੀਡੀਓ ਹਟਾ ਦੇਈਏ\? ਵੇਖੇ ਹੋਏ ਨੂੰ ਹਟਾਓ ਸਿਸਟਮ ਡਿਫ਼ਾਲਟ @@ -554,7 +535,7 @@ ਕੋਈ ਸਰੋਤਾ ਨਹੀਂ ਸੁਣ ਰਿਹਾ ਕੋਈ ਦਰਸ਼ਕ ਨਹੀਂ ਵੇਖ ਰਿਹਾ ਵੇਰਵਾ - ਸਬੰਧਤ ਨਗ + ਸਬੰਧਤ ਆਈਟਮਾਂ ਟਿੱਪਣੀਆਂ ਗਿਟਹੱਬ \'ਤੇ ਜਾ ਕੇ ਇਤਲਾਹ ਦਿਓ ਦੂਜੀਆਂ ਐਪਾਂ ਦੇ ਉੱਤੇ ਵਿਖਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ @@ -832,4 +813,22 @@ ਐਂਟਰੀ ਮਿਟਾਓ ਖ਼ਾਤਾ ਬੰਦ ਕੀਤਾ ਗਿਆ\n\n%1$s ਇਹ ਕਾਰਨ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ: %2$s ਐਂਟਰੀ ਮਿਟਾ ਦਿੱਤੀ ਗਈ + ਪੌਪਅੱਪ ਪਲੇਅਰ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਹੇਠਾਂ ਦਿੱਤੇ Android ਸੈਟਿੰਗ ਮੀਨੂ ਵਿੱਚ %1$s ਚੁਣੋ ਅਤੇ %2$s ਨੂੰ ਇਨੇਬਲ ਕਰੋ। + \"ਹੋਰ ਐਪਾਂ ਉੱਤੇ ਡਿਸਪਲੇ ਦੀ ਆਗਿਆ ਦਿਓ\" + %sਹਜ਼ਾਰ + %sਮਿਲੀਅਨ + %sਅਰਬ + SoundCloud ਟੌਪ 50 ਪੰਨਾ ਹਟਾ ਦਿੱਤਾ ਗਿਆ + SoundCloud ਨੇ ਮੂਲ ਟੌਪ 50 ਚਾਰਟਾਂ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। ਸੰਬੰਧਿਤ ਟੈਬ ਨੂੰ ਤੁਹਾਡੇ ਮੁੱਖ ਪੰਨੇ ਤੋਂ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ। + YouTube ਸੰਯੁਕਤ ਰੁਝਾਨ ਹਟਾਇਆ ਗਿਆ + YouTube ਨੇ 21 ਜੁਲਾਈ 2025 ਤੋਂ ਸੰਯੁਕਤ \"ਰੁਝਾਨ ਵਿੱਚ\" ਪੰਨੇ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। NewPipe ਨੇ ਡਿਫ਼ਾਲਟ \"ਰੁਝਾਨ ਵਿੱਚ\" ਪੰਨੇ ਨੂੰ ਟ੍ਰੈਂਡਿੰਗ ਲਾਈਵਸਟ੍ਰੀਮਾਂ ਨਾਲ ਬਦਲ ਦਿੱਤਾ ਹੈ।\n\nਤੁਸੀਂ \"ਸੈਟਿੰਗਾਂ > ਸਮੱਗਰੀ > ਮੁੱਖ ਪੰਨੇ ਦੀ ਸਮੱਗਰੀ\" ਵਿੱਚ ਵੱਖ-ਵੱਖ ਟ੍ਰੈਂਡਿੰਗ ਪੰਨਿਆਂ ਨੂੰ ਵੀ ਚੁਣ ਸਕਦੇ ਹੋ। + ਗੇਮਿੰਗ ਟ੍ਰੈਂਡਸ + ਟ੍ਰੈਂਡਿੰਗ ਪੌਡਕਾਸਟ + ਟਰੈਂਡਿੰਗ ਫ਼ਿਲਮਾਂ ਅਤੇ ਸ਼ੋਅ + ਟਰੈਂਡਿੰਗ ਸੰਗੀਤ + ਪਲੇਅ ਕਰਦੇ ਸਮੇਂ ਸਰਵਰ ਤੋਂ HTTP error 403 ਪ੍ਰਾਪਤ ਹੋਇਆ, ਜੋ ਸ਼ਾਇਦ ਸਟ੍ਰੀਮਿੰਗ URL ਦੀ ਮਿਆਦ ਪੁੱਗਣ ਜਾਂ IP ਦੀ ਪਾਬੰਦੀ ਕਾਰਨ ਹੋਈ ਹੈ + ਚਲਾਉਣ ਦੌਰਾਨ ਸਰਵਰ ਤੋਂ HTTP error %1$s ਪ੍ਰਾਪਤ ਹੋਇਆ + ਪਲੇਅ ਕਰਦੇ ਸਮੇਂ ਸਰਵਰ ਤੋਂ HTTP error 403 ਪ੍ਰਾਪਤ ਹੋਇਆ, ਜੋ ਸ਼ਾਇਦ IP ਬੈਨ ਜਾਂ ਸਟ੍ਰੀਮਿੰਗ URL ਡੀਔਬਫਸਕੇਸ਼ਨ ਸਮੱਸਿਆਵਾਂ ਕਾਰਨ ਹੋਈ ਹੈ + %1$s ਨੇ ਡੇਟਾ ਪ੍ਰਦਾਨ ਕਰਨ ਤੋਂ ਇਨਕਾਰ ਕਰ ਦਿੱਤਾ, ਅਤੇ ਇਹ ਪੁਸ਼ਟੀ ਕਰਨ ਲਈ ਲੌਗਇਨ ਕਰਨ ਲਈ ਕਿਹਾ ਕਿ ਬੇਨਤੀਕਰਤਾ ਬੋਟ ਨਹੀਂ ਹੈ।\n\nਹੋ ਸਕਦਾ ਹੈ ਕਿ %1$s ਨੇ ਤੁਹਾਡੇ IP ਨੂੰ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾਈ ਹੋਵੇ, ਤੁਸੀਂ ਕੁਝ ਸਮਾਂ ਉਡੀਕ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ ਕਿਸੇ ਵੱਖਰੇ IP \'ਤੇ ਸਵਿੱਚ ਕਰ ਸਕਦੇ ਹੋ (ਉਦਾਹਰਣ ਵਜੋਂ VPN ਨੂੰ ਚਾਲੂ/ਬੰਦ ਕਰਕੇ, ਜਾਂ WiFi ਤੋਂ ਮੋਬਾਈਲ ਡੇਟਾ \'ਤੇ ਸਵਿੱਚ ਕਰਕੇ)। + ਇਹ ਸਮੱਗਰੀ ਵਰਤਮਾਨ ਵਿੱਚ ਚੁਣੇ ਗਏ ਦੇਸ਼ ਦੀ ਸਮੱਗਰੀ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ।\n\n\"ਸੈਟਿੰਗਾਂ > ਸਮੱਗਰੀ > ਡਿਫ਼ਾਲਟ ਸਮੱਗਰੀ ਦੇਸ਼\" ਤੋਂ ਆਪਣੀ ਚੋਣ ਬਦਲੋ। diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index b41d9fff9..601623cb1 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -45,7 +45,7 @@ Náhľad avataru uploadera Lajky Dislajky - Začnite klepnutím na lupu. + Začnite ťuknutím na lupu. Obsah Zobraziť vekovo obmedzený obsah Naživo @@ -74,7 +74,7 @@ Čakajte prosím… Skopírované do schránky Priečinok na sťahovanie zadefinujte prosím neskôr v nastaveniach - Sťahované súbory + Stiahnuté súbory Stiahnuté Hlásenie o chybe Aplikácia/UP zlyhalo @@ -208,7 +208,7 @@ Neplatný ZIP súbor Upozornenie: Nemožno importovať všetky súbory. Toto prepíše vaše aktuálne nastavenie. - Trendy + Populárne Top 50 Nové a horúce Odstrániť @@ -473,7 +473,7 @@ %d dní Skupiny kanálov - Zdroj naposledy aktualizovaný: %s + Zdroj aktualizovaný: %s Nenačítané: %d Načítavanie zdroja… Spracovávanie zdroja… @@ -845,10 +845,10 @@ SoundCloud prestal používať pôvodnú Top 50. Daná stránka bola odstránená z hlavnej stránky. Odstránené kombinované trendy na YouTube YouTube ukončil prevádzku kombinovanej stránky s trendmi k 21. júlu 2025. NewPipe nahradil predvolenú stránku s trendmi stránkou s trendovými živými prenosmi.\n\nV nastaveniach „Nastavenia > Obsah > Obsah hlavnej stránky“ môžete vybrať aj iné stránky s trendmi. - Ttendy v hrách - Trendové podcasty - Trendové filmy a seriály - Trendová hudba + Populárne hry + Populárne podcasty + Populárne filmy a seriály + Populárna hudba %stis. %smil. %smld. diff --git a/app/src/main/res/values-ti/strings.xml b/app/src/main/res/values-ti/strings.xml index 50a20f494..ccce73524 100644 --- a/app/src/main/res/values-ti/strings.xml +++ b/app/src/main/res/values-ti/strings.xml @@ -170,4 +170,19 @@ ሰሩዞ ስም ቀያር ስሕተት + መፍለዪ + ህዝባዊ + ብሕትነት + ፍቓድታት + ፍቓድ ኣንብብ + ምድብ + ፍቓድ + እዋናዊታት + ኣቫታራት + ባነራት + ዘይተዘርዘረ + ብሕታዊ + ውሽጣዊ + ተኸታተልቲ + መርበብ-ቦታ ክፈት diff --git a/fastlane/metadata/android/bg/changelogs/63.txt b/fastlane/metadata/android/bg/changelogs/63.txt deleted file mode 100644 index be8865e6d..000000000 --- a/fastlane/metadata/android/bg/changelogs/63.txt +++ /dev/null @@ -1,8 +0,0 @@ -### Подобрения -- Импорт/ Експорт на настройки #1333 -- Редуциране на надхвърляне (подобрение на производителността) #1371 -- Малки подобрения в кода #1375 -- Добавяне на всичко за GDPR #1420 - -### Поправени -- Изтегляния: Поправен срив при зареждане на неприключени изтегляния от .giga файлове #1407 diff --git a/fastlane/metadata/android/cs/changelogs/1005.txt b/fastlane/metadata/android/cs/changelogs/1005.txt index 2059e43de..e8efaffad 100644 --- a/fastlane/metadata/android/cs/changelogs/1005.txt +++ b/fastlane/metadata/android/cs/changelogs/1005.txt @@ -1,17 +1,17 @@ -Novinky -• Přidána podpora pro Android Auto. -• Možnost nastavit skupiny kanálů jako záložky na hlavní obrazovce. -• [YouTube] Sdílení jako dočasný seznam skladeb. -• [SoundCloud] Záložka Oblíbené kanály +Nově +• Podpora pro Android Auto +• Možnost nastavit skupiny zdrojů jako záložky +• [YouTube] Sdílení jako dočasný playlist +• [SoundCloud] Záložka Oblíbené u kanálů Vylepšeno -• Lepší nápověda pro vyhledávací lištu -• Zobrazení data stažení v sekci Stažené soubory -• Použití jazyka Android 13 pro jednotlivé aplikace +• Lepší našeptávač vyhledávače +• Zobrazení data stažení ve Stažených +• Použití individuálního jazyka Opraveno • Oprava chybných barev textu v tmavém režimu -• [YouTube] Oprava seznamů skladeb, které nenačtou více než 100 položek +• [YouTube] Oprava nenačtení více než 100 položek v playlistech • [YouTube] Oprava chybějících doporučených videí -• Oprava pádů v zobrazení seznamu historie -• Oprava časových značek v odpovědích na komentáře +• Oprava pádů v Historii +• Oprava časů v odpovědích diff --git a/fastlane/metadata/android/de/changelogs/986.txt b/fastlane/metadata/android/de/changelogs/986.txt index 044365eb8..a1bc3217a 100644 --- a/fastlane/metadata/android/de/changelogs/986.txt +++ b/fastlane/metadata/android/de/changelogs/986.txt @@ -1,16 +1,15 @@ -Neu: +Neu • Benachrichtigungen für neue Streams • Nahtloser Übergang zwischen Hintergrund- und Videoplayer -• Änderung der Tonhöhe um Halbtöne +• Ändern der Tonhöhe um Halbtöne • Warteschlange des Hauptplayers an Wiedergabeliste anfügen -Verbessert: -• Geschwindigkeit/Tonhöhenschrittgröße speichern +Verbessert +• Speichern der Geschwindigkeit/Tonhöhenschrittweite • Anfängliche lange Videoplayer-Pufferung verringert • Player-UI für Android TV -• Löschbestätigung für alle heruntergeladenen Dateien +• Löschbestätigung aller heruntergeladenen Dateien -Behoben: -• Medienschaltfläche blendet die Steuerelemente des Players nicht aus -• Rücksetzung der Wiedergabe bei Änderung des Playertyps -• Drehung des Wiedergabelisten-Dialogs +Behoben +• Medienschaltfläche blendet Player-Steuerelemente nicht aus +• … diff --git a/fastlane/metadata/android/de/changelogs/987.txt b/fastlane/metadata/android/de/changelogs/987.txt index f7bc9bd80..a03048973 100644 --- a/fastlane/metadata/android/de/changelogs/987.txt +++ b/fastlane/metadata/android/de/changelogs/987.txt @@ -1,12 +1,12 @@ -Neu: -• Unterstützung anderer Übertragungsmethoden als progressives HTTP: schnellere Ladezeit der Wiedergabe, Korrekturen für PeerTube und SoundCloud, Wiedergabe von kürzlich beendeten YouTube-Livestreams -• Schaltfläche um entfernte Wiedergabeliste einer lokalen Wiedergabeliste hinzuzufügen -• Bildvorschau im Android 10+ Teilen-Dialog +Neu +• Unterstützung anderer Übertragungsmethoden als progressives HTTP: schnellere Ladezeit bei Wiedergabe, Fehlerbehebungen für PeerTube/SoundCloud, Wiedergabe kürzlich beendeter YouTube-Livestreams +• Schaltfläche, um Remote-Wiedergabeliste einer Lokalen hinzuzufügen +• Bildvorschau im Teilen-Dialog von Android 10+ -Verbessert: +Verbessert • Wiedergabewerte-Dialog -• Import/Export-Schaltflächen für Abonnements in das Drei-Punkte-Menü verschoben +• Import/Export-Schaltflächen für Abos in Drei-Punkte-Menü verschoben -Behoben: -• Entfernung von vollständig angesehenen Videos aus der Wiedergabeliste -• Freigabemenü-Design und „Zur Wiedergabeliste hinzufügen“-Eintrag +Behoben +• Entfernen vollständig angesehener Videos aus Wiedergabeliste +• … diff --git a/fastlane/metadata/android/de/changelogs/997.txt b/fastlane/metadata/android/de/changelogs/997.txt index f55e72b05..fbb5727d8 100644 --- a/fastlane/metadata/android/de/changelogs/997.txt +++ b/fastlane/metadata/android/de/changelogs/997.txt @@ -1,17 +1,16 @@ Neu • Antwort auf Kommentar • Wiedergabelisten umordnen -• Wiedergabelisten-Beschreibung und -Dauer +• Wiedergabelisten-Beschreibung/-Dauer • Rücksetzen der Einstellungen Verbessert -• [Android 13+] Wiederherstellen benutzerdef. Benachrichtigungsaktionen -• Zustimmung zur Update-Prüfung -• Während Pufferung Abspielen/Pause über Benachrichtigung -• Neuordnung einiger Einstellungen +• [Android 13+] Wiederherstellen benutzerd. Benachrichtigungsaktionen +• Zustimmung zur Updateprüfung +• Wiedergabe/Pause von Benachrichtigungen während Pufferung +• Neuanordnung einiger Einstellungen Behoben -• [YouTube] Kommentare wurden nicht geladen, weitere Korrekturen und Verbesserungen +• [YouTube] Kommentare wurden nicht geladen, weitere Fehlerbehebungen/Verbesserungen • Sicherheitslücke beim Einstellungsimport und Umstellung auf JSON -• Verschiedene Download-Korrekturen -• Suchtext gekürzt +• … diff --git a/fastlane/metadata/android/de/changelogs/999.txt b/fastlane/metadata/android/de/changelogs/999.txt index 51cf80d3e..059b4e081 100644 --- a/fastlane/metadata/android/de/changelogs/999.txt +++ b/fastlane/metadata/android/de/changelogs/999.txt @@ -4,9 +4,9 @@ Neu • [SoundCloud] Unterstützung für on.soundcloud.com-URLs hinzugefügt Verbessert -• [Bandcamp]Anzeige zusätzlicher Informationen im Radio-Kiosk +• [Bandcamp] Anzeige zusätzlicher Informationen im Radio-Kiosk Behoben -• [YouTube] Behebung gelegentlicher HTTP 403-Fehler am Anfang oder in der Mitte von Videos +• [YouTube] Behebung gelegentlicher HTTP-403-Fehler am Anfang oder in der Mitte von Videos • [YouTube] Extrahieren von Avataren und Banner aus mehr Kanal-Header-Typen • [Bandcamp] Verschiedene Fehler behoben und HTTPS wird stets verwendet diff --git a/fastlane/metadata/android/fr/changelogs/1000.txt b/fastlane/metadata/android/fr/changelogs/1000.txt index d4e706e2e..994b6061d 100644 --- a/fastlane/metadata/android/fr/changelogs/1000.txt +++ b/fastlane/metadata/android/fr/changelogs/1000.txt @@ -1,13 +1,13 @@ -Amélioré -• Rendre la description de la playlist cliquable pour afficher plus / moins de contenu -• [PeerTube] Gérer automatiquement les liens d'instance `subscribeto.me` -• Ne commencer à lire qu'un seul élément dans l'écran d'historique +Améliorations +• La description de la playlist est désormais cliquable pour afficher plus ou moins de contenu. +• [PeerTube] Gestion automatique des liens d'instance `subscribeto.me` +• Lecture d'un seul élément à la fois depuis l'historique -Corrigé -• Correction de la visibilité du bouton RSS -• Correction des plantages de l'aperçu de la barre de recherche -• Correction de la mise en playlist d'un élément sans vignette -• Correction de la sortie de la boîte de dialogue de téléchargement avant qu'elle n'apparaisse -• 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 d'ajout à la playlist -• Ajuster la disposition des éléments de signet de la playlist +Corrections +• Amélioration de la visibilité du bouton RSS +• Correction des plantages liés à l'aperçu de la barre de progression +• Correction de l'ajout d'un élément sans vignette à la playlist +• Correction de la fermeture prématurée de la boîte de dialogue de téléchargement +• Correction de la fenêtre contextuelle d'ajout à la file d'attente de la liste des éléments associés +• Amélioration de l'ordre d'affichage dans la boîte de dialogue « Ajouter à la playlist » +• Ajustement de la mise en page des signets de playlist diff --git a/fastlane/metadata/android/fr/changelogs/1003.txt b/fastlane/metadata/android/fr/changelogs/1003.txt index 161ee7fbb..917714bae 100644 --- a/fastlane/metadata/android/fr/changelogs/1003.txt +++ b/fastlane/metadata/android/fr/changelogs/1003.txt @@ -1,6 +1,6 @@ -Ceci est une version de correction qui résout les erreurs de YouTube : -• [YouTube] Correction du non-chargement des informations des vidéos, correction des erreurs HTTP 403 lors de la lecture des vidéos et restauration de la lecture de certaines vidéos à âge restreint -• Correction des tailles de sous-titres qui ne changent pas -• Correction du téléchargement des informations deux fois lors de l'ouverture d'un stream -• [Soundcloud] Suppression des streams protégés par DRM non lisibles -• Traductions mises à jour +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. diff --git a/fastlane/metadata/android/fr/changelogs/1005.txt b/fastlane/metadata/android/fr/changelogs/1005.txt index b7e5ff49f..269ba2105 100644 --- a/fastlane/metadata/android/fr/changelogs/1005.txt +++ b/fastlane/metadata/android/fr/changelogs/1005.txt @@ -1,17 +1,17 @@ -Nouveau -• Prise en charge d'Android Auto +Nouveautés +• Ajout de la compatibilité avec Android Auto • Possibilité de définir des groupes de flux comme onglets de l'écran principal • [YouTube] Partager comme playlist temporaire -• [SoundCloud] Onglet « J'aime » +• [SoundCloud] Onglet « J'aime » sur les chaînes -Amélioration -• Amélioration des astuces de la barre de recherche +Améliorations +• Amélioration des suggestions de la barre de recherche • Affichage de la date de téléchargement dans Téléchargements • Utilisation de la langue par application d'Android 13 -Corrigé +Corrections • Correction des couleurs de texte défectueuses en mode sombre -• [YouTube] Correction des playlists ne chargeant pas plus de 100 éléments -• [YouTube] Correction des vidéos recommandées manquantes -• Correction des plantages dans la vue Historique +• [YouTube] Correction du chargement des playlists de plus de 100 éléments +• [YouTube] Correction de l'affichage des vidéos recommandées manquantes +• Correction des plantages dans l'historique • Correction des horodatages dans les réponses aux commentaires diff --git a/fastlane/metadata/android/fr/changelogs/65.txt b/fastlane/metadata/android/fr/changelogs/65.txt index bb664a3cb..c5d6d852a 100644 --- a/fastlane/metadata/android/fr/changelogs/65.txt +++ b/fastlane/metadata/android/fr/changelogs/65.txt @@ -11,7 +11,7 @@ - Ajout d'une option d'avance rapide pendant les silences dans le contrôle de la vitesse de lecture. Cela devrait être utile pour les livres audio et certains genres musicaux, et peut apporter une véritable expérience transparente (et peut casser une chanson avec beaucoup de silences =\\). - Refonte de la résolution des sources de médias pour permettre le passage des métadonnées avec les médias en interne dans le lecteur, plutôt que de le faire manuellement. Maintenant, nous avons une seule source de métadonnées et elles sont directement disponibles lorsque la lecture commence. - Correction des métadonnées des listes de lecture distantes qui ne sont pas mises à jour lorsque de nouvelles métadonnées sont disponibles lors de l'ouverture du fragment de liste de lecture. - - Diverses corrections de l'interface utilisateur : #1383, les contrôles de notification du lecteur en arrière-plan sont maintenant toujours blancs, il est plus facile de fermer le lecteur popup en le lançant. + - Diverses corrections de l'interface utilisateur : #1383, les contrôles de notification du lecteur en arrière-plan sont maintenant toujours blancs, il est plus facile de fermer le lecteur popup en le lançant. - Utilisation d'un nouvel extracteur avec une architecture remaniée pour le multiservice. ### Corrections diff --git a/fastlane/metadata/android/fr/changelogs/70.txt b/fastlane/metadata/android/fr/changelogs/70.txt index fccfccd2b..185f98f69 100644 --- a/fastlane/metadata/android/fr/changelogs/70.txt +++ b/fastlane/metadata/android/fr/changelogs/70.txt @@ -1,4 +1,4 @@ -ATTENTION : Cette version est probablement un festival de bugs, tout comme la dernière. Cependant, en raison de la fermeture complète depuis la 17. une version cassée est mieux que pas de version. N'est-ce pas ? ¯\_(ツ)_/¯ +ATTENTION : Cette version est probablement un festival de bugs, tout comme la dernière. Cependant, en raison de la fermeture complète depuis la 17. une version cassée est mieux que pas de version. N'est-ce pas ? ¯\_(ツ)_/¯ ### Améliorations * Les fichiers téléchargés peuvent maintenant être ouverts en un seul clic. diff --git a/fastlane/metadata/android/hi/changelogs/1000.txt b/fastlane/metadata/android/hi/changelogs/1000.txt index 67a819e0f..201a8a970 100644 --- a/fastlane/metadata/android/hi/changelogs/1000.txt +++ b/fastlane/metadata/android/hi/changelogs/1000.txt @@ -7,7 +7,3 @@ • RSS बटन दृश्यता को ठीक करें • सीकबार पूर्वावलोकन क्रैश को ठीक करें • थंबनेल-रहित आइटम को प्लेलिस्ट में डालना ठीक करें -• डाउनलोड डायलॉग के दिखाई देने से पहले बाहर निकलने को ठीक करें -• संबंधित आइटम सूची एनक्यू पॉपअप को ठीक करें -• प्लेलिस्ट में जोड़ें डायलॉग में क्रम को ठीक करें -• प्लेलिस्ट बुकमार्क आइटम लेआउट को समायोजित करें diff --git a/fastlane/metadata/android/hi/changelogs/1002.txt b/fastlane/metadata/android/hi/changelogs/1002.txt index d780f47a6..a0bc033fe 100644 --- a/fastlane/metadata/android/hi/changelogs/1002.txt +++ b/fastlane/metadata/android/hi/changelogs/1002.txt @@ -1,5 +1,4 @@ YouTube द्वारा कोई भी स्ट्रीम न चलाए जाने की समस्या को ठीक किया गया। यह रिलीज़ केवल सबसे ज़्यादा दबाव वाली त्रुटि को संबोधित करती है जो YouTube वीडियो विवरण को लोड होने से रोकती है। - हम जानते हैं कि अन्य समस्याएँ भी हैं, और हम जल्द ही उन्हें हल करने के लिए एक अलग रिलीज़ जारी करेंगे। diff --git a/fastlane/metadata/android/hi/changelogs/1004.txt b/fastlane/metadata/android/hi/changelogs/1004.txt index 071ab64e3..faf98d116 100644 --- a/fastlane/metadata/android/hi/changelogs/1004.txt +++ b/fastlane/metadata/android/hi/changelogs/1004.txt @@ -1 +1,3 @@ -फिक्स्ड YouTube कोई स्ट्रीम नहीं चला रहा है +इस रिलीज़ में YouTube सिर्फ़ 360p स्ट्रीम दे रहा था, इसे ठीक किया गया है। + +ध्यान दें कि इस वर्शन में इस्तेमाल किया गया सॉल्यूशन शायद टेम्पररी है, और लंबे समय में SABR वीडियो प्रोटोकॉल को लागू करने की ज़रूरत है, लेकिन TeamNewPipe के सदस्य अभी बिज़ी हैं, इसलिए किसी भी मदद की बहुत तारीफ़ होगी! https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/hi/changelogs/1005.txt b/fastlane/metadata/android/hi/changelogs/1005.txt index 495894e76..4d72dc68f 100644 --- a/fastlane/metadata/android/hi/changelogs/1005.txt +++ b/fastlane/metadata/android/hi/changelogs/1005.txt @@ -1,17 +1,15 @@ नया -+ • Android Auto के लिए समर्थन जोड़ें -+ • फ़ीड समूहों को मुख्य स्क्रीन टैब के रूप में सेट करने की अनुमति दें -+ • [YouTube] अस्थायी प्लेलिस्ट के रूप में साझा करें -+ • [SoundCloud] "पसंद" चैनल टैब जोङी गई +• Android Auto के लिए समर्थन जोड़ें +• फ़ीड समूहों को मुख्य स्क्रीन टैब के रूप में सेट करने की अनुमति दें +• [YouTube] अस्थायी प्लेलिस्ट के रूप में साझा करें +• [SoundCloud] "पसंद" चैनल टैब जोङी गई बेहतर किए -+ • खोज बार संकेत -+ • डाउनलोडस स्क्रीन में डाउनलोड की तारीख दिखाएं -+ • Android 13+ पर प्रति-ऐप भाषा का उपयोग करें +• खोज बार संकेत +• डाउनलोडस स्क्रीन में डाउनलोड की तारीख दिखाएं +• Android 13+ पर प्रति-ऐप भाषा का उपयोग करें फिक्स किए -+ • डार्क मोड में पाठ के रंग ठीक करें -+ • [YouTube] 100 से अधिक आइटम लोड नहीं करने वाली प्लेलिस्ट को ठीक करें -+ • [YouTube] अनुपलब्ध अनुशंसित वीडियो को ठीक करें -+ • इतिहास सूची दृश्य में क्रैश ठीक करें -+ • टिप्पणी के उत्तरों में टाइमस्टैम्प को ठीक करें +• डार्क मोड में पाठ के रंग ठीक करें +• [YouTube] 100 से अधिक आइटम लोड नहीं करने वाली प्लेलिस्ट को ठीक करें +• टिप्पणी के उत्तरों में टाइमस्टैम्प को ठीक करें diff --git a/fastlane/metadata/android/hi/changelogs/1006.txt b/fastlane/metadata/android/hi/changelogs/1006.txt new file mode 100644 index 000000000..f9656149b --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/1006.txt @@ -0,0 +1,15 @@ +# बेहतर किए +टाइमस्टैम्प पर क्लिक करते समय मौजूदा प्लेयर पर ही दिखाएं +जब हो सके तो पेंडिंग डाउनलोड मिशन को रिकवर करने की कोशिश करें +फ़ाइल डिलीट किए बिना डाउनलोड डिलीट करने का ऑप्शन जोड़ें +.soundcloud लिंक खोलने में सपोर्ट करें +कई छोटे सुधार और ऑप्टिमाइज़ेशन + +# ठीक किया गया +7 से कम Android वर्शन के लिए छोटे नंबर फ़ॉर्मेटिंग को ठीक किया गया +खाली नोटिफ़िकेशन को ठीक किया गया +SRT सबटाइटल फ़ाइलों के लिए ठीक किया गया +कई क्रैश ठीक किए गए + +# डेवलपमेंट +इंटरनल कोड मॉडर्नाइज़ेशन diff --git a/fastlane/metadata/android/hi/changelogs/65.txt b/fastlane/metadata/android/hi/changelogs/65.txt index d2c2b8c71..d870f8d03 100644 --- a/fastlane/metadata/android/hi/changelogs/65.txt +++ b/fastlane/metadata/android/hi/changelogs/65.txt @@ -1,26 +1,13 @@ ### सुधार -- बर्गरमेनू आइकन एनीमेशन को अक्षम करें #1486 -- डाउनलोड को पूर्ववत करें #1472 -- शेयर मेनू में डाउनलोड विकल्प #1498 -- लॉन्ग टैप मेनू में शेयर विकल्प जोड़ा गया #1454 -- बाहर निकलने पर मुख्य प्लेयर को छोटा करें #1354 -- लाइब्रेरी संस्करण अपडेट और डेटाबेस बैकअप फिक्स #1510 -- एक्सोप्लेयर 2.8.2 अपडेट #1392 -- तेज गति परिवर्तन के लिए विभिन्न चरण आकारों का समर्थन करने के लिए प्लेबैक गति नियंत्रण संवाद को फिर से तैयार किया गया। -- प्लेबैक गति नियंत्रण में मौन के दौरान तेजी से आगे बढ़ने के लिए एक टॉगल जोड़ा गया। यह ऑडियोबुक और कुछ संगीत शैलियों के लिए मददगार होना चाहिए, और एक सच्चा सहज अनुभव ला सकता है (और बहुत सारे मौन वाले गीत को तोड़ सकता है =\\)। -- मीडिया स्रोत रिज़ॉल्यूशन को फिर से तैयार किया गया ताकि प्लेयर में आंतरिक रूप से मीडिया के साथ मेटाडेटा को पास किया जा सके, बजाय मैन्युअल रूप से ऐसा करने के। अब हमारे पास मेटाडेटा का एक ही स्रोत है और प्लेबैक शुरू होने पर सीधे उपलब्ध है। -- जब प्लेलिस्ट का टुकड़ा खोला जाता है तो नया मेटाडेटा उपलब्ध होने पर रिमोट प्लेलिस्ट मेटाडेटा अपडेट नहीं होता है। -- विभिन्न UI फ़िक्सेस: #1383, बैकग्राउंड प्लेयर नोटिफिकेशन कंट्रोल अब हमेशा सफ़ेद रहता है, फ़्लिंगिंग के ज़रिए पॉपअप प्लेयर को बंद करना आसान है -- मल्टीसर्विस के लिए रीफ़ैक्टर्ड आर्किटेक्चर के साथ नए एक्सट्रैक्टर का उपयोग करें +- बर्गरमेनू आइकन एनिमेशन को डिसेबल करें #1486 +- डाउनलोड को अनडू करें #1472 +- शेयर मेनू में डाउनलोड ऑप्शन #1498 +- लॉन्ग टैप मेनू में शेयर ऑप्शन जोड़ा गया #1454 +- ExoPlayer 2.8.2 अपडेट #1392 +- कई UI फ़िक्स: #1383 -### फ़िक्सेस +### फ़िक्स -- फ़िक्स #1440 टूटी हुई वीडियो जानकारी लेआउट #1491 - व्यू हिस्ट्री फ़िक्स #1497 -- #1495, जैसे ही उपयोगकर्ता प्लेलिस्ट एक्सेस करता है मेटाडेटा (थंबनेल, शीर्षक और वीडियो काउंट) को अपडेट करके। -- #1475, जब उपयोगकर्ता डिटेल फ़्रैगमेंट पर बाहरी प्लेयर पर वीडियो शुरू करता है तो डेटाबेस में व्यू रजिस्टर करके। -- पॉपअप मोड के मामले में स्क्रीन टाइमआउट को ठीक करें। #1463 (फ़िक्स #640) -- मुख्य वीडियो प्लेयर फ़िक्स #1509 -- [#1412] प्लेयर गतिविधि के बैकग्राउंड में होने पर नया इंटेंट प्राप्त होने पर प्लेयर NPE का कारण बनने वाले रिपीट मोड को ठीक किया गया। -- पॉपअप के लिए प्लेयर को छोटा करने की सुविधा को ठीक किया गया, जब पॉपअप की अनुमति नहीं दी जाती है तो प्लेयर नष्ट नहीं होता है। +- #1495, जैसे ही यूज़र प्लेलिस्ट एक्सेस करता है, मेटाडेटा (थंबनेल, टाइटल और वीडियो काउंट) को अपडेट करके। diff --git a/fastlane/metadata/android/hi/changelogs/66.txt b/fastlane/metadata/android/hi/changelogs/66.txt index 30c20b0e8..e9ec1e3fa 100644 --- a/fastlane/metadata/android/hi/changelogs/66.txt +++ b/fastlane/metadata/android/hi/changelogs/66.txt @@ -1,33 +1,21 @@ -# Changelog of v0.13.7 +# v0.13.7 का चेंजलॉग -### Fixed -- Fix sort filter issues of v0.13.6 +### ठीक किया गया +- v0.13.6 के सॉर्ट फ़िल्टर की दिक्कतें ठीक की गईं -# Changelog of v0.13.6 +# v0.13.6 का चेंजलॉग -### Improvements +### सुधार -- Disable burgermenu icon animation #1486 -- undo delete of downloads #1472 -- Download option in share menu #1498 -- Added share option to long tap menu #1454 -- Minimize main player on exit #1354 -- Library version update and database backup fix #1510 -- ExoPlayer 2.8.2 Update #1392 - - Reworked the playback speed control dialog to support different step sizes for faster speed change. - - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). - - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. - - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. - - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging -- Use new extractor with refactored architecture for multiservice +- बर्गरमेनू आइकन एनिमेशन डिसेबल करें #1486 +- डाउनलोड को अनडू डिलीट करें #1472 +- शेयर मेनू में डाउनलोड ऑप्शन #1498 +- लॉन्ग टैप मेनू में शेयर ऑप्शन जोड़ा गया #1454 +- ExoPlayer 2.8.2 अपडेट #1392 +कई UI फ़िक्स: #1383 -### Fixes +### फ़िक्स -- Fix #1440 Broken Video Info Layout #1491 -- View history fix #1497 - - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. - - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. -- Fix creen timeout in case of popup mode. #1463 (Fixed #640) -- Main video player fix #1509 - - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. - - Fixed minimizing player to popup does not destroy player when popup permission is not granted. +- फ़िक्स #1440 टूटा हुआ वीडियो इन्फ़ो लेआउट #1491 +- व्यू हिस्ट्री फ़िक्स #1497 +- मेन वीडियो प्लेयर फिक्स #1509। diff --git a/fastlane/metadata/android/hi/changelogs/68.txt b/fastlane/metadata/android/hi/changelogs/68.txt index 238b1e0b1..f0cc5bddb 100644 --- a/fastlane/metadata/android/hi/changelogs/68.txt +++ b/fastlane/metadata/android/hi/changelogs/68.txt @@ -1,31 +1,19 @@ -# changes of v0.14.1 +# v0.14.1 में बदलाव -### Fixed -- Fixed failed to decrypt video url #1659 -- Fixed description link not extract well #1657 +### ठीक किया गया +- वीडियो URL डिक्रिप्ट करने में फेल होना ठीक किया गया #1659 +- डिस्क्रिप्शन लिंक ठीक से एक्सट्रेक्ट नहीं हो रहा था, इसे ठीक किया गया #1657 -# changes of v0.14.0 +# v0.14.0 में बदलाव -### New -- New Drawer design #1461 -- New customizable front page #1461 +### नया +- नया ड्रॉअर डिज़ाइन #1461 +- नया कस्टमाइज़ेबल फ्रंट पेज #1461 -### Improvements -- Reworked Gesture controls #1604 -- New way to close the popup player #1597 +### सुधार +- पॉपअप प्लेयर बंद करने का नया तरीका #1597 -### Fixed -- Fix error when subscription count is not available. Closes #1649. - - Show "Subscriber count not available" in those cases -- Fix NPE when a YouTube playlist is empty -- Quick fix for the kiosks in SoundCloud -- Refactor and bugfix #1623 - - Fix Cyclic search result #1562 - - Fix Seek bar not statically lay outed - - Fix YT Premium video are not blocked correctly - - Fix Videos sometimes not loading (due to DASH parsing) - - Fix links in video description - - Show warning when someone tries to download to external sdcard - - fix nothing shown exception triggers report - - thumbnail not shown in background player for android 8.1 [see here](https://github.com/TeamNewPipe/NewPipe/issues/943) -- Fix registering of broadcast receiver. Closes #1641. +### ठीक किया गया +- जब YouTube प्लेलिस्ट खाली हो तो NPE को ठीक करें +- SoundCloud में कियोस्क के लिए क्विक फिक्स +- रीफैक्टर और बगफिक्स #1623। diff --git a/fastlane/metadata/android/hi/changelogs/69.txt b/fastlane/metadata/android/hi/changelogs/69.txt index c8262d1b0..8bdf96c8f 100644 --- a/fastlane/metadata/android/hi/changelogs/69.txt +++ b/fastlane/metadata/android/hi/changelogs/69.txt @@ -1,19 +1,15 @@ -### New -- Long-tap delete and share in subscriptions #1516 -- Tablet UI and grid list layout #1617 +### नया +- सब्सक्रिप्शन में लंबे समय तक टैप करके डिलीट और शेयर करें #1516 +- टैबलेट UI और ग्रिड लिस्ट लेआउट #1617 -### Improvements -- store and reload the last used aspect ratio #1748 -- Enable linear layout in Downloads activity with full video names #1771 -- Delete and share subscriptions directly from within the subscriptions tab #1516 -- Enqueuing now triggers video playing if the play queue has already ended #1783 -- Separate settings for volume and brightness gestures #1644 -- Add support for Localization #1792 +### सुधार +- वॉल्यूम और ब्राइटनेस जेस्चर के लिए अलग सेटिंग्स #1644 +- लोकलाइज़ेशन के लिए सपोर्ट जोड़ें #1792 -### Fixes -- Fix time parsing for . format, so NewPipe can be used in Finland -- Fix subscription count -- Add foreground service permission for API 28+ devices #1830 +### सुधार +- . फ़ॉर्मेट के लिए टाइम पार्सिंग ठीक करें, ताकि फ़िनलैंड में NewPipe का इस्तेमाल किया जा सके +- सब्सक्रिप्शन काउंट ठीक करें +- API 28+ डिवाइस के लिए फ़ोरग्राउंड सर्विस परमिशन जोड़ें #1830 -### Known Bugs -- Playback state can not be saved on Android P +### जाने-पहचाने बग +- Android P पर प्लेबैक स्टेट सेव नहीं किया जा सकता diff --git a/fastlane/metadata/android/hi/changelogs/70.txt b/fastlane/metadata/android/hi/changelogs/70.txt index ad87a4409..cfa334bdb 100644 --- a/fastlane/metadata/android/hi/changelogs/70.txt +++ b/fastlane/metadata/android/hi/changelogs/70.txt @@ -1,25 +1,11 @@ -ATTENTION: This version probably is a bugfest, just like the last one. However due to the full shutdown since the 17. a broken version is better then no version. Right? ¯\_(ツ)_/¯ +### सुधार +* डाउनलोड की गई फ़ाइलें अब एक क्लिक से खोली जा सकती हैं #1879 +* एंड्रॉयड 4.1 - 4.3 के लिए सपोर्ट हटा दिया गया #1884 +* पुराना प्लेयर हटाएँ #1884 +* मौजूदा प्ले क्यू से स्ट्रीम को दाईं ओर स्वाइप करके हटाएँ #1915 +* बहुत सारी डाउनलोड गड़बड़ियाँ ठीक करके सुधार किया गए -### Improvements -* downloaded files can now be opened with one click #1879 -* drop support for android 4.1 - 4.3 #1884 -* remove old player #1884 -* remove streams from current play queue by swiping them to the right #1915 -* remove auto queued stream when a new stream is enqueued manually #1878 -* Postprocessing for downloads and implement missing features #1759 by @kapodamy - * Post-processing infrastructure - * Proper error handling "infrastructure" (for downloader) - * Queue instead of multiple downloads - * Move serialized pending downloads (`.giga` files) to app data - * Implement max download retry - * Proper multi-thread download pausing - * Stop downloads when swicthing to mobile network (never works, see 2nd point) - * Save the thread count for next downloads - * A lot of incoherences fixed - -### Fixed -* Fix crash with default resolution set to best and limited mobile data resolution #1835 -* pop-up player crash fixed #1874 -* NPE when trying to open background player #1901 -* Fix for inserting new streams when auto queuing is enabled #1878 -* Fixed the decypering shuttown issue +### ठीक किया गया +* डिफ़ॉल्ट रिज़ॉल्यूशन को बेस्ट और लिमिटेड मोबाइल डेटा रिज़ॉल्यूशन पर सेट करने पर क्रैश को ठीक किया गया #1835 +* पॉप-अप प्लेयर क्रैश को ठीक किया गया #1874 +* बैकग्राउंड प्लेयर खोलने की कोशिश करते समय NPE #1901 diff --git a/fastlane/metadata/android/hi/changelogs/71.txt b/fastlane/metadata/android/hi/changelogs/71.txt index 5facfc05f..c9b9675b0 100644 --- a/fastlane/metadata/android/hi/changelogs/71.txt +++ b/fastlane/metadata/android/hi/changelogs/71.txt @@ -1,10 +1,7 @@ -### Improvements -* Add app update notification for GitHub build (#1608 by @krtkush) -* Various improvements to the downloader (#1944 by @kapodamy): - * add missing white icons and use hardcored way for change the icon colors - * check if the iterator is initialized (fixes #2031) - * allow retry downloads with "post-processing failed" error in the new muxer - * new MPEG-4 muxer fixing non-synchronous video and audio streams (#2039) +### सुधार +* GitHub बिल्ड के लिए ऐप अपडेट नोटिफ़िकेशन जोड़ें (#1608 @krtkush द्वारा) +* डाउनलोडर में कई सुधार #1944 +* नया MPEG-4 म्यूक्सर नॉन-सिंक्रोनस वीडियो और ऑडियो स्ट्रीम को ठीक करता है (#2039) -### Fixed -* YouTube live streams stop playing after a short time (#1996 by @yausername) +### फिकसड +* YouTube लाइव स्ट्रीम थोड़े समय बाद चलना बंद हो जाती हैं (#1996 @yausername द्वारा) diff --git a/fastlane/metadata/android/hi/changelogs/740.txt b/fastlane/metadata/android/hi/changelogs/740.txt index c795978a8..9380af1b0 100644 --- a/fastlane/metadata/android/hi/changelogs/740.txt +++ b/fastlane/metadata/android/hi/changelogs/740.txt @@ -1,23 +1,12 @@ -

    Improvements

    +

    सुधार

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

    Fixed

    +
  • कमेंट्स में लिंक को क्लिक करने लायक बनाएं, टेक्स्ट का साइज़ बढ़ाएं
  • +
  • कमेंट्स में टाइमस्टैम्प लिंक पर क्लिक करने पर खोजें
  • +
  • जब शेयर किया गया टेक्स्ट URL न हो तो उसे खोजें
  • +
  • मेन वीडियो प्लेयर में "अभी के समय शेयर करें" बटन जोड़ें
  • +
  • ExoPlayer को 2.9.6 पर अपडेट करना
  • +

    फिकसड

    +
      -
    • fixed scroll w/ comments and related streams disabled
    • -
    • fixed CheckForNewAppVersionTask being executed when it shouldn't
    • -
    • fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title
    • -
    • fix invalid YouTube url: signature tag name is not always "signature" preventing streams from loading
    • +
    • गलत YouTube URL ठीक करें: सिग्नेचर टैग का नाम हमेशा "सिग्नेचर" नहीं होता, जिससे स्ट्रीम लोड नहीं हो पातीं
    diff --git a/fastlane/metadata/android/hi/changelogs/750.txt b/fastlane/metadata/android/hi/changelogs/750.txt index 39b77f7c3..13e965311 100644 --- a/fastlane/metadata/android/hi/changelogs/750.txt +++ b/fastlane/metadata/android/hi/changelogs/750.txt @@ -1,22 +1,13 @@ -New -Playback resume #2288 -• Resume streams where you stopped last time -Downloader Enhancements #2149 -• Use Storage Access Framework to store downloads on external SD-cards -• New mp4 muxer -• Optionally change the download directory before starting a download -• Respect metered networks +नया +प्लेबैक फिर से शुरू करें #2288 +• स्ट्रीम वहीं से फिर से शुरू करें जहाँ आपने पिछली बार रोका था +डाउनलोडर एन्हांसमेंट #2149 +• एक्सटर्नल SD-कार्ड पर डाउनलोड स्टोर करने के लिए स्टोरेज एक्सेस फ्रेमवर्क का इस्तेमाल करें +बेहतर +• एक्टिविटी लाइफसाइकल के दौरान (ऑटो) रोटेशन में बदलाव को हैंडल करें #2444 +• लॉन्ग-प्रेस मेनू को एक जैसा बनाएं #2368 -Improved -• Removed gema strings #2295 -• Handle (auto)rotation changes during activity lifecycle #2444 -• Make long-press menus consistent #2368 - -Fixed -• Fixed selected subtitle track name not being shown #2394 -• Do not crash when check for app update fails (GitHub version) #2423 -• Fixed downloads stuck at 99.9% #2440 -• Update play queue metadata #2453 -• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 -• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 +ठीक किया गया +• चुने हुए सबटाइटल ट्रैक का नाम नहीं दिखना ठीक किया गया #2394 +• 99.9% पर अटके डाउनलोड को ठीक किया गया #2440 diff --git a/fastlane/metadata/android/hi/changelogs/760.txt b/fastlane/metadata/android/hi/changelogs/760.txt index 6e000f6d9..c4b6d951f 100644 --- a/fastlane/metadata/android/hi/changelogs/760.txt +++ b/fastlane/metadata/android/hi/changelogs/760.txt @@ -1,43 +1,13 @@ -Changes in 0.17.1 +0.17.1 में बदलाव -New -• Thai localization +नया +• थाई लोकलाइज़ेशन +बेहतर +• प्लेलिस्ट के लिए लॉन्ग-प्रेस मेनू में फिर से 'यहाँ से प्ले करना शुरू करें' एक्शन जोड़ें #2518 +• SAF / लेगेसी फ़ाइल पिकर के लिए स्विच जोड़ें #2521 -Improved -• Add start playing here action in long-press menus for playlists again #2518 -• Add switch for SAF / legacy file picker #2521 - -Fixed -• Fix disappearing buttons in downloads view when switching apps #2487 -• Fix playback position is stored although watch history is disabled -• Fix reduced performance caused by playback position in list views #2517 -• [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 -• [Extractor] [YouTube] Fix casual search error when playlists are in results TeamNewPipe/NewPipeExtractor#185 - - - -Changes in 0.17.0 - -New -Playback resume #2288 -• Resume streams where you stopped last time -Downloader Enhancements #2149 -• Use Storage Access Framework to store downloads on external SD-cards -• New mp4 muxer -• Optionally change the download directory before starting a download -• Respect metered networks - - -Improved -• Removed gema strings #2295 -• Handle (auto)rotation changes during activity lifecycle #2444 -• Make long-press menus consistent #2368 - -Fixed -• Fixed selected subtitle track name not being shown #2394 -• Do not crash when check for app update fails (GitHub version) #2423 -• Fixed downloads stuck at 99.9% #2440 -• Update play queue metadata #2453 -• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 -• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 +ठीक किया गया +• ऐप बदलते समय डाउनलोड व्यू में बटन गायब होने की समस्या ठीक करें #2487 +• लिस्ट व्यू में प्लेबैक पोज़िशन की वजह से परफॉर्मेंस में आई कमी को ठीक करें #2517 +• [एक्सट्रैक्टर] [YouTube] जब प्लेलिस्ट रिज़ल्ट में हों तो कैज़ुअल सर्च एरर को ठीक करें TeamNewPipe/NewPipeExtractor#185 diff --git a/fastlane/metadata/android/hi/changelogs/790.txt b/fastlane/metadata/android/hi/changelogs/790.txt index ec77b2acb..3b322f0af 100644 --- a/fastlane/metadata/android/hi/changelogs/790.txt +++ b/fastlane/metadata/android/hi/changelogs/790.txt @@ -1,14 +1,9 @@ -Improved -• Add more titles to improve accessibility for blind people #2655 -• Make language of download folder setting more consistent and less ambiguous #2637 +ठीक किया गया +• चेक करें कि ब्लॉक में आखिरी बाइट डाउनलोड हुआ है या नहीं #2646 +• वीडियो डिटेल फ़्रैगमेंट में स्क्रॉलिंग को ठीक किया गया #2672 +• [साउंडक्लाउड] client_id एक्सट्रैक्शन को ठीक करें #2745 -Fixed -• Check if last byte in the block is downloaded #2646 -• Fixed scrolling in video detail fragment #2672 -• Remove double search clear box animations to one #2695 -• [SoundCloud] Fix client_id extraction #2745 - -Development -• Add missing dependencies inherited from NewPipeExtractor into NewPipe #2535 -• Migrate to AndroidX #2685 -• Update to ExoPlayer 2.10.6 #2697, #2736 +डेवलपमेंट +• NewPipeExtractor से मिली गायब डिपेंडेंसी को NewPipe में जोड़ें #2535 +• AndroidX पर माइग्रेट करें #2685 +• ExoPlayer 2.10.6 पर अपडेट करें #2697, #2736 diff --git a/fastlane/metadata/android/hi/changelogs/800.txt b/fastlane/metadata/android/hi/changelogs/800.txt index 332b5c994..4df518086 100644 --- a/fastlane/metadata/android/hi/changelogs/800.txt +++ b/fastlane/metadata/android/hi/changelogs/800.txt @@ -1,27 +1,10 @@ -New -• PeerTube support without P2P (#2201) [Beta]: - ◦ Watch and download videos from PeerTube instances - ◦ Add instances in the settings to access the complete PeerTube world - ◦ There might be problems with SSL handshakes on Android 4.4 and 7.1 when accessing certain instances resulting in a network error. +नया +• P2P के बिना PeerTube सपोर्ट (#2201) [बीटा]: -• Downloader (#2679): - ◦ Calculate download ETA - ◦ Download opus (webm files) as ogg - ◦ Recover expired download links to resume downloads after a long pause +◦ लंबे समय तक रुकने के बाद डाउनलोड फिर से शुरू करने के लिए एक्सपायर हो चुके डाउनलोड लिंक रिकवर करें -Improved -• Make the KioskFragment aware of changes in the preferred content country and improve performance of all main tabs #2742 -• Use new Localization and Downloader implementations from extractor #2713 -• Make "Default kiosk" string translatable -• Black navigation bar for black theme #2569 +बेहतर +• KioskFragment को पसंदीदा कंटेंट देश में होने वाले बदलावों के बारे में बताएं और सभी मेन टैब की परफॉर्मेंस को बेहतर बनाएं #2742 -Fixed -• Fixed a bug that could not move the popup player if another finger was placed while moving the popup player #2772 -• Allow playlists missing an uploader and fix crashes related to this problem #2724, TeamNewPipe/NewPipeExtractor#219 -• Enabling TLS1.1/1.2 on Android 4.4 devices (API 19/KitKat) to fix TLS handshake with MediaCCC and some PeerTube instances #2792 -• [SoundCloud] Fixed client_id extraction TeamNewPipe/NewPipeExtractor#217 -• [SoundCloud] Fix audio stream extraction - -Development -• Update ExoPlayer to 2.10.8 #2791, #2816 -• Update Gradle to 3.5.1 and add Kotlin support #2714 +फिक्स किया गया +• Android 4.4 डिवाइस (API 19/KitKat) पर TLS1.1/1.2 इनेबल करें diff --git a/fastlane/metadata/android/hi/changelogs/810.txt b/fastlane/metadata/android/hi/changelogs/810.txt index c75855fd1..b3d4c7bd6 100644 --- a/fastlane/metadata/android/hi/changelogs/810.txt +++ b/fastlane/metadata/android/hi/changelogs/810.txt @@ -1,19 +1,11 @@ -New -• Show video thumbnail on the lock screen when playing in the background +नया +• बैकग्राउंड में चलने पर लॉक स्क्रीन पर वीडियो थंमनेल दिखाएं -Improved -• Add local playlist to queue when long pressing on background / popup button -• Make main page tabs scrollable and hide when there is only a single tab -• Limit amount of notification thumbnail updates in background player -• Add dummy thumbnail for empty local playlists -• Use *.opus file extension instead of *.webm and show "opus" in format label instead of "WebM Opus" in the download dropdown -• Add button to delete downloaded files or download history in "Downloads" -• [YouTube] Add support to /c/shortened_url channel links +बेहतर +• बैकग्राउंड / पॉपअप बटन पर देर तक दबाने पर लोकल प्लेलिस्ट को क्यू में जोड़ें +• [YouTube] /c/shortened_url चैनल लिंक के लिए सपोर्ट जोड़ें -Fixed -• Fixed multiple issues when sharing a video to NewPipe and downloading its streams directly -• Fixed player access out of its creation thread -• Fixed search result paging -• [YouTube] Fixed switching on null causing NPE -• [YouTube] Fixed viewing comments when opening an invidio.us url -• [SoundCloud] Updated client_id +फिकसड +• NewPipe पर वीडियो शेयर करते समय और सीधे उसकी स्ट्रीम डाउनलोड करते समय कई दिक्कतें ठीक की गईं +• सर्च रिज़ल्ट पेजिंग ठीक की गई +• [SoundCloud] client_id अपडेट किया गया diff --git a/fastlane/metadata/android/hi/changelogs/840.txt b/fastlane/metadata/android/hi/changelogs/840.txt index 95dc80844..5be8a8660 100644 --- a/fastlane/metadata/android/hi/changelogs/840.txt +++ b/fastlane/metadata/android/hi/changelogs/840.txt @@ -1,22 +1,10 @@ -New -• Added language selector to change the app language -• Added send to Kodi button to player collapsible menu -• Added ability to copy comments on long press +नया +• ऐप की भाषा बदलने के लिए भाशा सिलेक्टर जोड़ा गया +• प्लेयर कोलैप्सिबल मेनू में कोडी को भेजें बटन जोड़ा गया +• देर तक दबाने पर कमेंट्स कॉपी करने की सुविधा जोड़ी गई -Improved -• Fix ReCaptcha activity and correctly save obtained cookies -• Removed dot-menu in favour of drawer and hide history button when watch history is not enabled in settings -• Ask for display over other apps permission in settings correctly on Android 6 and later -• Rename local playlist by long-clicking in BookmarkFragment -• Various PeerTube improvements -• Improved several English source strings +बेहतर +• ReCaptcha एक्टिविटी को ठीक किया गया और मिली हुई कुकीज़ को सही ढंग से सेव किया गया -Fixed -• Fixed player starting again although it is paused when option "minimize on app switch" enabled and NewPipe is minimized -• Fix initial brightness value for gesture -• Fixed .srt subtitle downloads containing not all line breaks -• Fixed download to SD card failing because some Android 5 devices are not CTF compliant -• Fixed downloading on Android KitKat -• Fixed corrupt video .mp4 file being recognized as audio file -• Fixed multiple localization problems, including wrong Chinese language codes -• [YouTube] Timestamps in description are clickable again +ठीक किया गया +• Android KitKat पर डाउनलोडिंग ठीक की गई diff --git a/fastlane/metadata/android/hi/changelogs/930.txt b/fastlane/metadata/android/hi/changelogs/930.txt index b23b01ea8..457d1745b 100644 --- a/fastlane/metadata/android/hi/changelogs/930.txt +++ b/fastlane/metadata/android/hi/changelogs/930.txt @@ -1,19 +1,13 @@ -New -• Search on YouTube Music -• Basic Android TV support +नया +• YouTube Music पर सर्च करें +• बेसिक Android TV सपोर्ट -Improved -• Added the ability to remove all watched videos from a local playlist -• Show message when content isn't supported yet instead of crashing -• Improved popup player resize with pinch gestures -• Enqueue streams on long press on background and popup buttons in channel -• Improved size handling of the drawer header title +बेहतर +• लोकल प्लेलिस्ट से सभी देखे गए वीडियो हटाने की सुविधा जोड़ी गई +• जब कंटेंट अभी सपोर्टेड न हो, तो क्रैश होने के बजाय मैसेज दिखाएं -Fixed -• Fixed age restricted content setting not working -• Fixed certain kinds of reCAPTCHAs -• Fixed crash when opening bookmarks while playlist is `null` -• Fixed detection of network related exceptions -• Fixed visibility of group sort button in the subscriptions fragment +फिकसड +• उम्र पर रोक वाली कंटेंट सेटिंग काम नहीं कर रही थी, इसे ठीक किया गया +• कुछ तरह के reCAPTCHA को ठीक किया गया -and more +और भी बहुत कुछ diff --git a/fastlane/metadata/android/hi/changelogs/940.txt b/fastlane/metadata/android/hi/changelogs/940.txt index f9530bc68..6f9253a2f 100644 --- a/fastlane/metadata/android/hi/changelogs/940.txt +++ b/fastlane/metadata/android/hi/changelogs/940.txt @@ -1,16 +1,14 @@ -New -• Add support for SoundCloud comments -• Add YouTube restricted mode setting -• Show PeerTube parent channel details +नया +• SoundCloud कमेंट्स के लिए सपोर्ट जोड़ें +• YouTube रेस्ट्रिक्टेड मोड सेटिंग जोड़ें +• PeerTube पेरेंट चैनल की डिटेल्स दिखाएँ -Improved -• Show Kore button only for supported services -• Block player gestures that begin at the NavigationBar or StatusBar -• Change retry & subscribe buttons background color based on service color +बेहतर +• सिर्फ़ सपोर्टेड सर्विसेज़ के लिए Kore बटन दिखाएँ -Fixed -• Fix download dialog freeze -• Open in browser button now really opens in browser -• Fix crash on opening videos and "Could not play this stream" +फिक्स किया गया +• डाउनलोड डायलॉग फ़्रीज़ होने की समस्या को ठीक करें +• ब्राउज़र में खोलें बटन अब सच में ब्राउज़र में खुलता है +• वीडियो खोलने पर क्रैश और "यह स्ट्रीम नहीं चला सका" -and more +और भी बहुत कुछ diff --git a/fastlane/metadata/android/hi/changelogs/951.txt b/fastlane/metadata/android/hi/changelogs/951.txt index e933e5cbd..ffc1f8891 100644 --- a/fastlane/metadata/android/hi/changelogs/951.txt +++ b/fastlane/metadata/android/hi/changelogs/951.txt @@ -1,17 +1,13 @@ -New -• Add search for subscription picker in the feed group dialog -• Add filter to the feed group dialog to show only ungrouped subscriptions -• Add playlist tab to main page -• Fast forward/rewind in background/pop-up player queue -• Display search suggestion: did you mean & showing result for +नया +• फ़ीड ग्रुप डायलॉग में सब्सक्रिप्शन पिकर के लिए सर्च जोड़ें +• फ़ीड ग्रुप डायलॉग में फ़िल्टर जोड़ें ताकि सिर्फ़ अनग्रुप्ड सब्सक्रिप्शन दिखें +• मेन पेज पर प्लेलिस्ट टैब जोड़ें -Improved -• Drop writing application metadata in muxed files -• Do not remove failed streams from the queue -• Update status bar color to match toolbar color +बेहतर +• म्यूक्स की गई फ़ाइलों में एप्लीकेशन मेटाडेटा लिखना बंद करें +• फ़ेल स्ट्रीम को क्यू से न हटाएं -Fixed -• Fixed audio/video desync caused by floating point cumulative errors -• [PeerTube] Handle deleted comments +फिकसड +• फ़्लोटिंग पॉइंट क्यूमुलेटिव एरर के कारण होने वाले ऑडियो/वीडियो डीसिंक को ठीक किया गया -and more +और भी बहुत कुछ diff --git a/fastlane/metadata/android/hi/changelogs/995.txt b/fastlane/metadata/android/hi/changelogs/995.txt index 63ed335a4..7bd7341c2 100644 --- a/fastlane/metadata/android/hi/changelogs/995.txt +++ b/fastlane/metadata/android/hi/changelogs/995.txt @@ -1,16 +1,14 @@ नया • चैनल टैब्स का समर्थन करें • छवि गुणवत्ता का चयन करें -• सभी छवियों के यूआरएल प्राप्त करें सुधार किए • प्लेयर इंटरफ़ेस की पहुंच • केवल-वीडियो डाउनलोड के लिए बेहतर ऑडियो चयन -• साझा प्लेलिस्ट सामग्री में प्लेलिस्ट और वीडियो नाम शामिल करने का विकल्प ठीक किए • [यूट्यूब] लाइक पाने की संख्या ठीक करें • पॉपअप और क्रैश पर प्रतिक्रिया नहीं देने वाले प्लेयर को ठीक करें • भाषा चयनकर्ता में गलत भाषाओं का चयन ठीक करें • प्लेयर ऑडियो फोकस म्यूट का सम्मान नहीं कर रहा था -• प्लेलिस्ट में आइटम जोड़ना कभी-कभी काम नहीं कर रहा था +• प्लेलिस्ट में आइटम ना जुड़ना ठीक किया diff --git a/fastlane/metadata/android/hi/changelogs/997.txt b/fastlane/metadata/android/hi/changelogs/997.txt index 652935884..b47816231 100644 --- a/fastlane/metadata/android/hi/changelogs/997.txt +++ b/fastlane/metadata/android/hi/changelogs/997.txt @@ -6,12 +6,9 @@ सुधार • [एंड्रॉइड 13+] कस्टम अधिसूचना क्रियाएं पुनर्स्थापित करें -• अपडेटस की जांच के लिए सहमति का अनुरोध करें -• बफ़रिंग के दौरान नोटीफिकेशन से चलाने/रोकने की अनुमति दें • कुछ सेटिंग्स पुनः व्यवस्थित करें ठीक किए • [यूट्यूब] लोड न होने वाली टिप्पणियों को ठीक करें, साथ ही अन्य फिक्स और सुधार भी -• सेटिंग्स आयात में भेद्यता को हल करें और JSON पर स्विच करें • विभिन्न डाउनलोड सुधार • खोज पाठ को ट्रिम करें diff --git a/fastlane/metadata/android/pa/changelogs/1000.txt b/fastlane/metadata/android/pa/changelogs/1000.txt index 90d70c151..ddc239f32 100644 --- a/fastlane/metadata/android/pa/changelogs/1000.txt +++ b/fastlane/metadata/android/pa/changelogs/1000.txt @@ -3,11 +3,9 @@ • [PeerTube] `subscribeto.me` ਇੰਸਟੈਂਸ ਲਿੰਕਾਂ ਨੂੰ ਆਟੋਮੈਟਿਕ ਹੀ ਹੈਂਡਲ ਕਰੋ • ਇਤਿਹਾਸ ਸਕਰੀਨ ਵਿੱਚ ਸਿਰਫ਼ ਸਿੰਗਲ ਆਈਟਮ ਨੂੰ ਚਲਾਉਣਾ ਸ਼ੁਰੂ ਕਰੋ -ਠੀਕ ਕਰਿਆ +ਫਿਕਸਡ • RSS ਬਟਨ ਦੀ ਦਿੱਖ ਨੂੰ ਠੀਕ ਕਰੋ • ਸੀਕਬਾਰ ਪੂਰਵਦਰਸ਼ਨ ਕ੍ਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ • ਥੰਮਨੇਲ-ਰਹਿਤ ਆਈਟਮ ਦੀ ਪਲੇਲਿਸਟਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ -• ਡਾਉਨਲੋਡ ਡਾਇਲਾਗ ਦੇ ਦਿਸਣ ਤੋਂ ਪਹਿਲਾਂ ਇਸਨੂੰ ਬਾਹਰ ਕੱਢਣਾ ਠੀਕ ਕਰੋ -• ਸੰਬੰਧਿਤ ਆਈਟਮਾਂ ਦੀ ਸੂਚੀ ਐਨਕਿਊ ਪੌਪਅੱਪ ਨੂੰ ਠੀਕ ਕਰੋ -• ਪਲੇਲਿਸਟ ਡਾਇਲਾਗ ਵਿੱਚ ਜੋੜਨ ਦਾ ਕ੍ਰਮ ਠੀਕ ਕਰੋ -• ਪਲੇਲਿਸਟ ਬੁੱਕਮਾਰਕ ਆਈਟਮ ਖਾਕਾ ਵਿਵਸਥਿਤ ਕਰੋ +• ਸੰਬੰਧਿਤ ਆਈਟਮਾਂ ਦੀ ਸੂਚੀ ਐਨਕਿਊ ਪੌਪ-ਅਪ ਨੂੰ ਠੀਕ ਕਰੋ +• ਅਤੇ ਹੋਰ ਪਲੇਲਿਸਟ ਤੇ ਡਾਊਨਲੋਡ ਸਬੰਧਤ ਫਿਕਸ diff --git a/fastlane/metadata/android/pa/changelogs/1004.txt b/fastlane/metadata/android/pa/changelogs/1004.txt index fe62a1330..6d3d23b2e 100644 --- a/fastlane/metadata/android/pa/changelogs/1004.txt +++ b/fastlane/metadata/android/pa/changelogs/1004.txt @@ -1 +1,3 @@ -ਸਥਿਰ YouTube ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ ਚਲਾ ਰਿਹਾ +ਇਹ ਰੀਲੀਜ਼ ਸਿਰਫ਼ 360p ਸਟ੍ਰੀਮ ਪ੍ਰਦਾਨ ਕਰਨ ਵਾਲੇ YouTube ਨੂੰ ਠੀਕ ਕਰਦੀ ਹੈ। + +ਧਿਆਨ ਦਿਓ ਕਿ ਇਸ ਸੰਸਕਰਣ ਵਿੱਚ ਵਰਤਿਆ ਗਿਆ ਹੱਲ ਸੰਭਾਵਤ ਤੌਰ 'ਤੇ ਅਸਥਾਈ ਹੈ, ਅਤੇ ਲੰਬੇ ਸਮੇਂ ਵਿੱਚ SABR ਵੀਡੀਓ ਪ੍ਰੋਟੋਕੋਲ ਨੂੰ ਲਾਗੂ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ, ਪਰ TeamNewPipe ਮੈਂਬਰ ਇਸ ਸਮੇਂ ਰੁੱਝੇ ਹੋਏ ਹਨ ਇਸ ਲਈ ਕਿਸੇ ਵੀ ਮਦਦ ਦੀ ਬਹੁਤ ਪ੍ਰਸ਼ੰਸਾ ਕੀਤੀ ਜਾਵੇਗੀ! https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/pa/changelogs/1005.txt b/fastlane/metadata/android/pa/changelogs/1005.txt index f1492a1ac..982b092a4 100644 --- a/fastlane/metadata/android/pa/changelogs/1005.txt +++ b/fastlane/metadata/android/pa/changelogs/1005.txt @@ -1,17 +1,10 @@ ਨਵਾਂ -+ • Android Auto ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਿਲ ਕਰੋ -+ • ਫੀਡ ਗਰੁੱਪਾਂ ਨੂੰ ਮੁੱਖ ਸਕ੍ਰੀਨ ਟੈਬਾਂ ਵਜੋਂ ਸੈੱਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ -+ • [YouTube] ਅਸਥਾਈ ਪਲੇਲਿਸਟ ਦੇ ਵਜੋਂ ਸਾਂਝਾ ਕਰੋ -+ • [SoundCloud] "ਪਸੰਦ" ਚੈਨਲ ਟੈਬ ਜੋੜੀ ਗਈ - -ਬਿਹਤਰ ਕੀਤੇ -+ • ਖੋਜ ਬਾਰ ਸੰਕੇਤ -+ • ਡਾਊਨਲੋਡਸ ਸੂਚੀ ਵਿੱਚ ਡਾਊਨਲੋਡ ਤਾਰੀਖ ਦਿਖਾਓ -+ • ਐਂਡਰਾਇਡ 13+ 'ਤੇ ਪ੍ਰਤੀ ਐਪ ਭਾਸ਼ਾ ਦੀ ਵਰਤੋਂ ਕਰੋ +• Android Auto ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਿਲ ਕਰਨ ਸਮੇਤ YouTube ਲਈ ਅਸਥਾਈ ਪਲੇਲਿਸਟ ਵਜੋਂ ਸ਼ੇਅਰ ਫੰਕਸ਼ਨ ਤੇ SoundCloud ਲਈ ਲਾਈਕਸ ਚੈਨਲ ਟੈਬ ਨਵੀਂ ਐਡ ਕੀਤੀ +• ਫੀਡ ਗਰੁੱਪਾਂ ਨੂੰ ਮੁੱਖ ਸਕ੍ਰੀਨ ਟੈਬਾਂ ਵਜੋਂ ਸੈੱਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ ਦਰੁਸਤ ਕੀਤੇ -+ • ਡਾਰਕ ਥੀਮਾਂ 'ਤੇ ਟੈਕਸਟ ਰੰਗਾਂ ਨੂੰ ਠੀਕ ਕਰੋ -+ • [YouTube] ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਠੀਕ ਕਰੋ ਜੋ 100 ਤੋਂ ਵੱਧ ਆਈਟਮਾਂ ਲੋਡ ਨਹੀਂ ਕਰਦੀਆਂ -+ • [YouTube] ਸਿਫਾਰਸ਼ ਕੀਤੀਆਂ ਵੀਡੀਓਜ਼ ਦੀ ਅਣਉਪਲੱਬਧਤਾ ਨੂੰ ਠੀਕ ਕਰੋ -+ • ਇਤਿਹਾਸ ਸੂਚੀ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਕ੍ਰੈਸ਼ ਨੂੰ ਠੀਕ ਕਰੋ -+ • ਟਿੱਪਣੀਆਂ ਦੇ ਜਵਾਬ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +• ਡਾਰਕ ਥੀਮਾਂ 'ਤੇ ਟੈਕਸਟ ਰੰਗਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +• [YouTube] ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਠੀਕ ਕਰੋ ਜੋ 100 ਤੋਂ ਵੱਧ ਆਈਟਮਾਂ ਲੋਡ ਨਹੀਂ ਕਰਦੀਆਂ +• [YouTube] ਸਿਫਾਰਸ਼ ਕੀਤੀਆਂ ਵੀਡੀਓਜ਼ ਦੀ ਅਣਉਪਲੱਬਧਤਾ ਨੂੰ ਠੀਕ ਕਰੋ +• ਟਿੱਪਣੀਆਂ ਦੇ ਜਵਾਬ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +ਪੂਰੇ ਬਦਲਾਵਾਂ ਵਾਸਤੇ ਗਿਟਹੱਬ ਤੇ dev ਸ਼ਾਖਾ ਟੈਗ ਅਨੁਸਾਰ ਬਦਲਾਅ ਵੇਖੋ diff --git a/fastlane/metadata/android/pa/changelogs/1006.txt b/fastlane/metadata/android/pa/changelogs/1006.txt new file mode 100644 index 000000000..2539da187 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/1006.txt @@ -0,0 +1,15 @@ +# ਸੁਧਾਰਿਆ ਗਿਆ +ਟਾਈਮਸਟੈਂਪਾਂ 'ਤੇ ਕਲਿੱਕ ਕਰਦੇ ਸਮੇਂ ਮੌਜੂਦਾ ਪਲੇਅਰ ਰੱਖੋ +ਜਦੋਂ ਸੰਭਵ ਹੋਵੇ ਤਾਂ ਬਕਾਇਆ ਡਾਊਨਲੋਡ ਮਿਸ਼ਨਾਂ ਨੂੰ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ +ਫਾਈਲ ਨੂੰ ਮਿਟਾਏ ਬਿਨਾਂ ਡਾਊਨਲੋਡ ਨੂੰ ਮਿਟਾਉਣ ਦਾ ਵਿਕਲਪ ਸ਼ਾਮਿਲ ਕਰੋ +on.soundcloud ਲਿੰਕ ਖੋਲ੍ਹਣ ਦਾ ਸਮਰਥਨ ਕਰੋ +ਬਹੁਤ ਸਾਰੇ ਛੋਟੇ ਸੁਧਾਰ ਅਤੇ ਅਨੁਕੂਲਤਾ + +# ਫਿਕਸਡ +7 ਤੋਂ ਘੱਟ ਐਂਡਰਾਇਡ ਸੰਸਕਰਣਾਂ ਲਈ ਛੋਟੀ ਗਿਣਤੀ ਫਾਰਮੈਟਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +ਖਾਲੀ ਨੋਟੀਫਿਕੇਸ਼ਨਾਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +SRT ਉਪਸਿਰਲੇਖ ਫਾਈਲਾਂ ਲਈ ਠੀਕ ਕੀਤਾ ਗਿਆ +ਬਹੁਤ ਸਾਰੇ ਕਰੈਸ਼ ਠੀਕ ਕੀਤੇ ਗਏ + +# ਵਿਕਾਸ +ਅੰਦਰੂਨੀ ਕੋਡ ਆਧੁਨਿਕੀਕਰਨ diff --git a/fastlane/metadata/android/pa/changelogs/65.txt b/fastlane/metadata/android/pa/changelogs/65.txt index 0fbf1147e..0f7f8fe7d 100644 --- a/fastlane/metadata/android/pa/changelogs/65.txt +++ b/fastlane/metadata/android/pa/changelogs/65.txt @@ -1 +1,13 @@ -### ਸੁਧਾਰ - ਬਰਗਰਮੇਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ #1486 ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ - ਡਾਉਨਲੋਡਸ #1472 ਨੂੰ ਮਿਟਾਉਣ ਨੂੰ ਅਨਡੂ ਕਰੋ - ਸ਼ੇਅਰ ਮੀਨੂ #1498 ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ - ਲੰਬੇ ਟੈਪ ਮੀਨੂ #1454 ਵਿੱਚ ਸ਼ੇਅਰ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ - ਨਿਕਾਸ #1354 'ਤੇ ਮੁੱਖ ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰੋ - ਲਾਇਬ੍ਰੇਰੀ ਸੰਸਕਰਣ ਅਪਡੇਟ ਅਤੇ ਡੇਟਾਬੇਸ ਬੈਕਅਪ ਫਿਕਸ #1510 - ExoPlayer 2.8.2 ਅੱਪਡੇਟ #1392 - ਤੇਜ਼ ਗਤੀ ਤਬਦੀਲੀ ਲਈ ਵੱਖ-ਵੱਖ ਸਟੈਪ ਸਾਈਜ਼ ਦਾ ਸਮਰਥਨ ਕਰਨ ਲਈ ਪਲੇਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ ਡਾਇਲਾਗ ਨੂੰ ਦੁਬਾਰਾ ਬਣਾਇਆ ਗਿਆ। - ਪਲੇਬੈਕ ਸਪੀਡ ਨਿਯੰਤਰਣ ਵਿੱਚ ਚੁੱਪ ਦੌਰਾਨ ਫਾਸਟ-ਫਾਰਵਰਡ ਕਰਨ ਲਈ ਇੱਕ ਟੌਗਲ ਜੋੜਿਆ ਗਿਆ। ਇਹ ਆਡੀਓਬੁੱਕਾਂ ਅਤੇ ਕੁਝ ਸੰਗੀਤ ਸ਼ੈਲੀਆਂ ਲਈ ਮਦਦਗਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ ਇੱਕ ਸੱਚਾ ਸਹਿਜ ਅਨੁਭਵ ਲਿਆ ਸਕਦਾ ਹੈ (ਅਤੇ ਬਹੁਤ ਸਾਰੀਆਂ ਚੁੱਪ =\\ ਨਾਲ ਗੀਤ ਤੋੜ ਸਕਦਾ ਹੈ)। - ਹੱਥੀਂ ਅਜਿਹਾ ਕਰਨ ਦੀ ਬਜਾਏ, ਪਲੇਅਰ ਵਿੱਚ ਅੰਦਰੂਨੀ ਤੌਰ 'ਤੇ ਮੀਡੀਆ ਦੇ ਨਾਲ-ਨਾਲ ਮੈਟਾਡੇਟਾ ਪਾਸ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ ਰੀਫੈਕਟਰਡ ਮੀਡੀਆ ਸਰੋਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ। ਹੁਣ ਸਾਡੇ ਕੋਲ ਮੈਟਾਡੇਟਾ ਦਾ ਇੱਕ ਸਿੰਗਲ ਸਰੋਤ ਹੈ ਅਤੇ ਪਲੇਬੈਕ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਸਿੱਧਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਸਥਿਰ ਰਿਮੋਟ ਪਲੇਲਿਸਟ ਮੈਟਾਡੇਟਾ ਅੱਪਡੇਟ ਨਹੀਂ ਹੋ ਰਿਹਾ ਹੈ ਜਦੋਂ ਪਲੇਲਿਸਟ ਫਰੈਗਮੈਂਟ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਤਾਂ ਨਵਾਂ ਮੈਟਾਡੇਟਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਕਈ UI ਫਿਕਸ: #1383, ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕੰਟਰੋਲ ਹੁਣ ਹਮੇਸ਼ਾ ਸਫੈਦ, ਫਲਿੰਗਿੰਗ ਰਾਹੀਂ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨਾ ਆਸਾਨ - ਮਲਟੀਸਰਵਿਸ ਲਈ ਰੀਫੈਕਟਰਡ ਆਰਕੀਟੈਕਚਰ ਦੇ ਨਾਲ ਨਵੇਂ ਐਕਸਟਰੈਕਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ ### ਫਿਕਸ - #1440 ਟੁੱਟੇ ਹੋਏ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਲੇਆਉਟ #1491 ਨੂੰ ਠੀਕ ਕਰੋ - ਇਤਿਹਾਸ ਫਿਕਸ #1497 ਦੇਖੋ - #1495, ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਪਲੇਲਿਸਟ ਤੱਕ ਪਹੁੰਚ ਕਰਦਾ ਹੈ, ਮੈਟਾਡੇਟਾ (ਥੰਬਨੇਲ, ਸਿਰਲੇਖ ਅਤੇ ਵੀਡੀਓ ਗਿਣਤੀ) ਨੂੰ ਅਪਡੇਟ ਕਰਕੇ। - #1475, ਜਦੋਂ ਉਪਭੋਗਤਾ ਵੇਰਵੇ ਦੇ ਟੁਕੜੇ 'ਤੇ ਬਾਹਰੀ ਪਲੇਅਰ 'ਤੇ ਵੀਡੀਓ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ ਤਾਂ ਡੇਟਾਬੇਸ ਵਿੱਚ ਇੱਕ ਦ੍ਰਿਸ਼ ਨੂੰ ਰਜਿਸਟਰ ਕਰਕੇ। - ਪੌਪਅੱਪ ਮੋਡ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਕ੍ਰੀਨ ਟਾਈਮਆਊਟ ਫਿਕਸ ਕਰੋ। #1463 (ਸਥਿਰ #640) - ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਫਿਕਸ #1509 - [#1412] ਫਿਕਸਡ ਰੀਪੀਟ ਮੋਡ ਜਿਸ ਨਾਲ ਪਲੇਅਰ ਐਨਪੀਈ ਦਾ ਕਾਰਨ ਬਣਦਾ ਹੈ ਜਦੋਂ ਪਲੇਅਰ ਦੀ ਗਤੀਵਿਧੀ ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵਾਂ ਇਰਾਦਾ ਪ੍ਰਾਪਤ ਹੁੰਦਾ ਹੈ। - ਪੌਪਅੱਪ ਲਈ ਫਿਕਸਡ ਮਿਨੀਮਾਈਜ਼ਿੰਗ ਪਲੇਅਰ ਪਲੇਅਰ ਨੂੰ ਨਸ਼ਟ ਨਹੀਂ ਕਰਦਾ ਹੈ ਜਦੋਂ ਪੌਪਅੱਪ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ। +### ਸੁਧਾਰ + +- ਬਰਗਰ ਮੀਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ ਨੂੰ ਅਯੋਗ ਕਰੋ #1486 +- ਡਾਊਨਲੋਡਸ ਨੂੰ ਅਨਡੂ ਕਰੋ #1472 +- ਸ਼ੇਅਰ ਮੀਨੂ ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ #1498 +- ਲੰਬੇ ਟੈਪ ਮੀਨੂ ਵਿੱਚ ਸਾਂਝਾ ਵਿਕਲਪ ਜੋੜਿਆ ਗਿਆ #1454 +- ਐਕਸੋਪਲੇਅਰ 2.8.2 ਅਪਡੇਟ #1392 +- ਕਈ UI ਫਿਕਸ: #1383 + +### ਫਿਕਸ + +- ਵਿਊ ਹਿਸਟਰੀ ਫਿਕਸ #1497 +- #1495, ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਪਲੇਲਿਸਟ ਤੱਕ ਪਹੁੰਚ ਕਰਦਾ ਹੈ, ਮੈਟਾਡੇਟਾ (ਥੰਬਨੇਲ, ਸਿਰਲੇਖ ਅਤੇ ਵੀਡੀਓ ਗਿਣਤੀ) ਨੂੰ ਅਪਡੇਟ ਕਰਕੇ। diff --git a/fastlane/metadata/android/pa/changelogs/66.txt b/fastlane/metadata/android/pa/changelogs/66.txt index aecf80cbc..f400eb137 100644 --- a/fastlane/metadata/android/pa/changelogs/66.txt +++ b/fastlane/metadata/android/pa/changelogs/66.txt @@ -1 +1,21 @@ -# v0.13.7 ਦਾ ਚੇਂਜਲਾਗ ### ਸਥਿਰ - v0.13.6 ਦੇ ਕ੍ਰਮਬੱਧ ਫਿਲਟਰ ਮੁੱਦਿਆਂ ਨੂੰ ਠੀਕ ਕਰੋ # v0.13.6 ਦਾ ਚੇਂਜਲਾਗ ### ਸੁਧਾਰ - ਬਰਗਰਮੇਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ #1486 ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ - ਡਾਉਨਲੋਡਸ #1472 ਨੂੰ ਮਿਟਾਉਣ ਨੂੰ ਅਨਡੂ ਕਰੋ - ਸ਼ੇਅਰ ਮੀਨੂ #1498 ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ - ਲੰਬੇ ਟੈਪ ਮੀਨੂ #1454 ਵਿੱਚ ਸ਼ੇਅਰ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ - ਨਿਕਾਸ #1354 'ਤੇ ਮੁੱਖ ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰੋ - ਲਾਇਬ੍ਰੇਰੀ ਸੰਸਕਰਣ ਅਪਡੇਟ ਅਤੇ ਡੇਟਾਬੇਸ ਬੈਕਅਪ ਫਿਕਸ #1510 - ExoPlayer 2.8.2 ਅੱਪਡੇਟ #1392 - ਤੇਜ਼ ਗਤੀ ਤਬਦੀਲੀ ਲਈ ਵੱਖ-ਵੱਖ ਸਟੈਪ ਸਾਈਜ਼ ਦਾ ਸਮਰਥਨ ਕਰਨ ਲਈ ਪਲੇਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ ਡਾਇਲਾਗ ਨੂੰ ਦੁਬਾਰਾ ਬਣਾਇਆ ਗਿਆ। - ਪਲੇਬੈਕ ਸਪੀਡ ਨਿਯੰਤਰਣ ਵਿੱਚ ਚੁੱਪ ਦੌਰਾਨ ਫਾਸਟ-ਫਾਰਵਰਡ ਕਰਨ ਲਈ ਇੱਕ ਟੌਗਲ ਜੋੜਿਆ ਗਿਆ। ਇਹ ਆਡੀਓਬੁੱਕਾਂ ਅਤੇ ਕੁਝ ਸੰਗੀਤ ਸ਼ੈਲੀਆਂ ਲਈ ਮਦਦਗਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ ਇੱਕ ਸੱਚਾ ਸਹਿਜ ਅਨੁਭਵ ਲਿਆ ਸਕਦਾ ਹੈ (ਅਤੇ ਬਹੁਤ ਸਾਰੀਆਂ ਚੁੱਪ =\\ ਨਾਲ ਗੀਤ ਤੋੜ ਸਕਦਾ ਹੈ)। - ਹੱਥੀਂ ਅਜਿਹਾ ਕਰਨ ਦੀ ਬਜਾਏ, ਪਲੇਅਰ ਵਿੱਚ ਅੰਦਰੂਨੀ ਤੌਰ 'ਤੇ ਮੀਡੀਆ ਦੇ ਨਾਲ-ਨਾਲ ਮੈਟਾਡੇਟਾ ਪਾਸ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ ਰੀਫੈਕਟਰਡ ਮੀਡੀਆ ਸਰੋਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ। ਹੁਣ ਸਾਡੇ ਕੋਲ ਮੈਟਾਡੇਟਾ ਦਾ ਇੱਕ ਸਿੰਗਲ ਸਰੋਤ ਹੈ ਅਤੇ ਪਲੇਬੈਕ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਸਿੱਧਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਸਥਿਰ ਰਿਮੋਟ ਪਲੇਲਿਸਟ ਮੈਟਾਡੇਟਾ ਅੱਪਡੇਟ ਨਹੀਂ ਹੋ ਰਿਹਾ ਹੈ ਜਦੋਂ ਪਲੇਲਿਸਟ ਫਰੈਗਮੈਂਟ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਤਾਂ ਨਵਾਂ ਮੈਟਾਡੇਟਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਕਈ UI ਫਿਕਸ: #1383, ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕੰਟਰੋਲ ਹੁਣ ਹਮੇਸ਼ਾ ਸਫੈਦ, ਫਲਿੰਗਿੰਗ ਰਾਹੀਂ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨਾ ਆਸਾਨ - ਮਲਟੀਸਰਵਿਸ ਲਈ ਰੀਫੈਕਟਰਡ ਆਰਕੀਟੈਕਚਰ ਦੇ ਨਾਲ ਨਵੇਂ ਐਕਸਟਰੈਕਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ ### ਫਿਕਸ - #1440 ਟੁੱਟੇ ਹੋਏ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਲੇਆਉਟ #1491 ਨੂੰ ਠੀਕ ਕਰੋ - ਇਤਿਹਾਸ ਫਿਕਸ #1497 ਦੇਖੋ - #1495, ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਪਲੇਲਿਸਟ ਤੱਕ ਪਹੁੰਚ ਕਰਦਾ ਹੈ, ਮੈਟਾਡੇਟਾ (ਥੰਬਨੇਲ, ਸਿਰਲੇਖ ਅਤੇ ਵੀਡੀਓ ਗਿਣਤੀ) ਨੂੰ ਅਪਡੇਟ ਕਰਕੇ। - #1475, ਜਦੋਂ ਉਪਭੋਗਤਾ ਵੇਰਵੇ ਦੇ ਟੁਕੜੇ 'ਤੇ ਬਾਹਰੀ ਪਲੇਅਰ 'ਤੇ ਵੀਡੀਓ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ ਤਾਂ ਡੇਟਾਬੇਸ ਵਿੱਚ ਇੱਕ ਦ੍ਰਿਸ਼ ਨੂੰ ਰਜਿਸਟਰ ਕਰਕੇ। - ਪੌਪਅੱਪ ਮੋਡ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਕ੍ਰੀਨ ਟਾਈਮਆਊਟ ਫਿਕਸ ਕਰੋ। #1463 (ਸਥਿਰ #640) - ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਫਿਕਸ #1509 - [#1412] ਫਿਕਸਡ ਰੀਪੀਟ ਮੋਡ ਜਿਸ ਨਾਲ ਪਲੇਅਰ ਐਨਪੀਈ ਦਾ ਕਾਰਨ ਬਣਦਾ ਹੈ ਜਦੋਂ ਪਲੇਅਰ ਦੀ ਗਤੀਵਿਧੀ ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵਾਂ ਇਰਾਦਾ ਪ੍ਰਾਪਤ ਹੁੰਦਾ ਹੈ। - ਪੌਪਅੱਪ ਲਈ ਫਿਕਸਡ ਮਿਨੀਮਾਈਜ਼ਿੰਗ ਪਲੇਅਰ ਪਲੇਅਰ ਨੂੰ ਨਸ਼ਟ ਨਹੀਂ ਕਰਦਾ ਹੈ ਜਦੋਂ ਪੌਪਅੱਪ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ। +# v0.13.7 ਲਈ ਚੇਂਜਲੌਗ + +### ਫਿਕਸ +- v0.13.6 ਤੋਂ ਸੌਰਟ ਫਿਲਟਰ ਨਾਲ ਸਮੱਸਿਆਵਾਂ ਹੱਲ ਕੀਤੀਆਂ ਗਈਆਂ। + +# v0.13.6 ਲਈ ਚੇਂਜਲੌਗ + +### ਸੁਧਾਰ + +- ਬਰਗਰ ਮੀਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ #1486 ਨੂੰ ਅਯੋਗ ਕਰੋ +- ਡਾਊਨਲੋਡਸ ਨੂੰ ਮਿਟਾਓ ਨੂੰ ਅਣਡੂ ਕਰੋ #1472 +- ਸ਼ੇਅਰ ਮੀਨੂ ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ #1498 +- ਲੰਬੇ ਟੈਪ ਮੀਨੂ ਵਿੱਚ ਸ਼ੇਅਰ ਵਿਕਲਪ ਜੋੜਿਆ ਗਿਆ #1454 +- ਐਕਸੋਪਲੇਅਰ 2.8.2 ਅਪਡੇਟ #1392 +ਕਈ UI ਫਿਕਸ: #1383 + +### ਫਿਕਸ + +- ਫਿਕਸ ਕੀਤਾ ਗਿਆ #1440 ਟੁੱਟਿਆ ਹੋਇਆ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਲੇਆਉਟ #1491 +- ਇਤਿਹਾਸ ਦੇਖੋ ਫਿਕਸ #1497 +- ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਫਿਕਸ #1509. diff --git a/fastlane/metadata/android/pa/changelogs/68.txt b/fastlane/metadata/android/pa/changelogs/68.txt index e8e54ea4f..7b98078df 100644 --- a/fastlane/metadata/android/pa/changelogs/68.txt +++ b/fastlane/metadata/android/pa/changelogs/68.txt @@ -1 +1,19 @@ -v0.14.1 ਦੇ # ਬਦਲਾਅ ### ਸਥਿਰ - ਵੀਡੀਓ url #1659 ਨੂੰ ਡੀਕ੍ਰਿਪਟ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ - ਸਥਿਰ ਵਰਣਨ ਲਿੰਕ #1657 ਨੂੰ ਚੰਗੀ ਤਰ੍ਹਾਂ ਐਕਸਟਰੈਕਟ ਨਹੀਂ ਕਰਦਾ ਹੈ v0.14.0 ਦੀਆਂ # ਤਬਦੀਲੀਆਂ ### ਨਵਾਂ - ਨਵਾਂ ਦਰਾਜ਼ ਡਿਜ਼ਾਈਨ #1461 - ਨਵਾਂ ਅਨੁਕੂਲਿਤ ਫਰੰਟ ਪੇਜ #1461 ### ਸੁਧਾਰ - ਮੁੜ ਕੰਮ ਕੀਤਾ ਸੰਕੇਤ ਨਿਯੰਤਰਣ #1604 - ਪੌਪਅੱਪ ਪਲੇਅਰ #1597 ਨੂੰ ਬੰਦ ਕਰਨ ਦਾ ਨਵਾਂ ਤਰੀਕਾ ### ਸਥਿਰ - ਗਾਹਕੀ ਦੀ ਗਿਣਤੀ ਉਪਲਬਧ ਨਾ ਹੋਣ 'ਤੇ ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ। #1649 ਬੰਦ ਹੁੰਦਾ ਹੈ। - ਉਹਨਾਂ ਮਾਮਲਿਆਂ ਵਿੱਚ "ਗਾਹਕ ਗਿਣਤੀ ਉਪਲਬਧ ਨਹੀਂ" ਦਿਖਾਓ - YouTube ਪਲੇਲਿਸਟ ਖਾਲੀ ਹੋਣ 'ਤੇ NPE ਨੂੰ ਠੀਕ ਕਰੋ - SoundCloud ਵਿੱਚ ਕਿਓਸਕ ਲਈ ਤੁਰੰਤ ਫਿਕਸ - ਰਿਫੈਕਟਰ ਅਤੇ ਬੱਗਫਿਕਸ #1623 - ਚੱਕਰੀ ਖੋਜ ਨਤੀਜੇ #1562 ਨੂੰ ਠੀਕ ਕਰੋ - ਸੀਕ ਬਾਰ ਨੂੰ ਸਥਿਰ ਤੌਰ 'ਤੇ ਬਾਹਰ ਨਾ ਕੱਢੋ - ਫਿਕਸ YT ਪ੍ਰੀਮੀਅਮ ਵੀਡੀਓ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਬਲੌਕ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ - ਕਈ ਵਾਰ ਲੋਡ ਨਾ ਹੋਣ ਵਾਲੇ ਵੀਡੀਓ ਨੂੰ ਠੀਕ ਕਰੋ (DASH ਪਾਰਸਿੰਗ ਦੇ ਕਾਰਨ) - ਵੀਡੀਓ ਵਰਣਨ ਵਿੱਚ ਲਿੰਕ ਫਿਕਸ ਕਰੋ - ਜਦੋਂ ਕੋਈ ਬਾਹਰੀ sdcard 'ਤੇ ਡਾਊਨਲੋਡ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦਾ ਹੈ ਤਾਂ ਚੇਤਾਵਨੀ ਦਿਖਾਓ - ਅਪਵਾਦ ਟਰਿੱਗਰ ਰਿਪੋਰਟ ਦਿਖਾਈ ਗਈ ਕੁਝ ਵੀ ਠੀਕ ਨਾ ਕਰੋ - ਐਂਡਰਾਇਡ 8.1 ਲਈ ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ ਥੰਬਨੇਲ ਨਹੀਂ ਦਿਖਾਇਆ ਗਿਆ [ਇੱਥੇ ਦੇਖੋ](https://github.com/TeamNewPipe/NewPipe/issues/943) - ਪ੍ਰਸਾਰਣ ਪ੍ਰਾਪਤ ਕਰਨ ਵਾਲੇ ਦੀ ਰਜਿਸਟਰੇਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ। #1641 ਬੰਦ ਹੁੰਦਾ ਹੈ। +# v0.14.1 ਵਿੱਚ ਬਦਲਾਅ + +### ਠੀਕ ਕੀਤਾ ਗਿਆ +- ਵੀਡੀਓ URL ਨੂੰ ਡੀਕ੍ਰਿਪਟ ਕਰਨ ਵਿੱਚ ਅਸਫਲਤਾ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ #1659 +- ਵਰਣਨ ਲਿੰਕ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਐਕਸਟਰੈਕਟ ਨਾ ਕਰਨ ਦੀ ਸਮੱਸਿਆ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ #1657 + +# v0.14.0 ਵਿੱਚ ਬਦਲਾਅ + +### ਨਵਾਂ +- ਨਵਾਂ ਦਰਾਜ਼ ਡਿਜ਼ਾਈਨ #1461 +- ਨਵਾਂ ਅਨੁਕੂਲਿਤ ਫਰੰਟ ਪੇਜ #1461 + +### ਸੁਧਾਰ +- ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨ ਦਾ ਨਵਾਂ ਤਰੀਕਾ #1597 + +### ਠੀਕ ਕੀਤਾ ਗਿਆ +- YouTube ਪਲੇਲਿਸਟਾਂ ਖਾਲੀ ਹੋਣ 'ਤੇ NPE ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +- SoundCloud ਵਿੱਚ ਕਿਓਸਕ ਲਈ ਤੁਰੰਤ ਠੀਕ ਕੀਤਾ ਗਿਆ +- ਰੀਫੈਕਟਰ ਅਤੇ ਬੱਗਫਿਕਸ #1623. diff --git a/fastlane/metadata/android/pa/changelogs/69.txt b/fastlane/metadata/android/pa/changelogs/69.txt index b6358991b..8956afb54 100644 --- a/fastlane/metadata/android/pa/changelogs/69.txt +++ b/fastlane/metadata/android/pa/changelogs/69.txt @@ -1 +1,15 @@ -### ਨਵਾਂ - ਮਿਟਾਓ ਅਤੇ ਸਬਸਕ੍ਰਿਪਸ਼ਨ #1516 ਵਿੱਚ ਸਾਂਝਾ ਕਰੋ - ਟੈਬਲੇਟ UI ਅਤੇ ਗਰਿੱਡ ਸੂਚੀ ਖਾਕਾ #1617 ### ਸੁਧਾਰ - ਆਖਰੀ ਵਰਤੇ ਗਏ ਆਸਪੈਕਟ ਰੇਸ਼ੋ #1748 ਨੂੰ ਸਟੋਰ ਅਤੇ ਰੀਲੋਡ ਕਰੋ - ਪੂਰੇ ਵੀਡੀਓ ਨਾਮ #1771 ਦੇ ਨਾਲ ਡਾਊਨਲੋਡ ਗਤੀਵਿਧੀ ਵਿੱਚ ਲੀਨੀਅਰ ਲੇਆਉਟ ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ - ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਟੈਬ #1516 ਦੇ ਅੰਦਰੋਂ ਸਿੱਧਾ ਗਾਹਕੀਆਂ ਨੂੰ ਮਿਟਾਓ ਅਤੇ ਸਾਂਝਾ ਕਰੋ - ਜੇਕਰ ਪਲੇ ਕਤਾਰ ਪਹਿਲਾਂ ਹੀ #1783 ਖਤਮ ਹੋ ਗਈ ਹੈ ਤਾਂ ਹੁਣ ਏਨਕਿਊ ਕਰਨਾ ਵੀਡੀਓ ਚਲਾਉਣ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ - ਵਾਲੀਅਮ ਅਤੇ ਚਮਕ ਸੰਕੇਤ #1644 ਲਈ ਵੱਖਰੀ ਸੈਟਿੰਗ - ਸਥਾਨਕਕਰਨ #1792 ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ### ਫਿਕਸ - ਲਈ ਪਾਰਸਿੰਗ ਸਮਾਂ ਫਿਕਸ ਕਰੋ। ਫਾਰਮੈਟ, ਇਸ ਲਈ ਨਿਊ ਪਾਈਪ ਨੂੰ ਫਿਨਲੈਂਡ ਵਿੱਚ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ - ਗਾਹਕੀ ਦੀ ਗਿਣਤੀ ਨੂੰ ਠੀਕ ਕਰੋ - API 28+ ਡਿਵਾਈਸਾਂ #1830 ਲਈ ਫੋਰਗਰਾਉਂਡ ਸੇਵਾ ਅਨੁਮਤੀ ਸ਼ਾਮਲ ਕਰੋ ### ਜਾਣੇ-ਪਛਾਣੇ ਬੱਗ - ਐਂਡ੍ਰਾਇਡ ਪੀ 'ਤੇ ਪਲੇਬੈਕ ਸਟੇਟ ਨੂੰ ਸੇਵ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ +### ਨਵਾਂ +- ਗਾਹਕੀਆਂ 'ਤੇ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਟੈਪ ਕਰਕੇ ਮਿਟਾਓ ਅਤੇ ਸਾਂਝਾ ਕਰੋ #1516 +- ਟੈਬਲੇਟ UI ਅਤੇ ਗਰਿੱਡ ਸੂਚੀ ਲੇਆਉਟ #1617 + +### ਸੁਧਾਰ +- ਵਾਲੀਅਮ ਅਤੇ ਚਮਕ ਸੰਕੇਤਾਂ ਲਈ ਵੱਖਰੀਆਂ ਸੈਟਿੰਗਾਂ #1644 +- ਸਥਾਨਕਕਰਨ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ #1792 + +### ਸੁਧਾਰ +- . ਫਾਰਮੈਟ ਲਈ ਸਮਾਂ ਪਾਰਸਿੰਗ ਠੀਕ ਕਰੋ ਤਾਂ ਜੋ ਫਿਨਲੈਂਡ ਵਿੱਚ ਨਿਊਪਾਈਪ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾ ਸਕੇ +- ਗਾਹਕੀ ਗਿਣਤੀ ਠੀਕ ਕਰੋ +- API 28+ ਡਿਵਾਈਸਾਂ ਲਈ ਫੋਰਗਰਾਉਂਡ ਸੇਵਾ ਅਨੁਮਤੀ ਸ਼ਾਮਲ ਕਰੋ #1830 + +### ਜਾਣੇ-ਪਛਾਣੇ ਬੱਗ +- ਪਲੇਬੈਕ ਸਥਿਤੀ ਨੂੰ ਐਂਡਰਾਇਡ ਪੀ 'ਤੇ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ diff --git a/fastlane/metadata/android/pa/changelogs/70.txt b/fastlane/metadata/android/pa/changelogs/70.txt index 97d781d4a..bedc91496 100644 --- a/fastlane/metadata/android/pa/changelogs/70.txt +++ b/fastlane/metadata/android/pa/changelogs/70.txt @@ -1 +1,10 @@ -ਧਿਆਨ ਦਿਓ: ਇਹ ਸੰਸਕਰਣ ਸ਼ਾਇਦ ਇੱਕ ਬੱਗਫੈਸਟ ਹੈ, ਬਿਲਕੁਲ ਪਿਛਲੇ ਇੱਕ ਵਾਂਗ। ਹਾਲਾਂਕਿ 17 ਤੋਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਬੰਦ ਹੋਣ ਦੇ ਕਾਰਨ. ਇੱਕ ਟੁੱਟਿਆ ਹੋਇਆ ਸੰਸਕਰਣ ਕੋਈ ਸੰਸਕਰਣ ਨਾਲੋਂ ਬਿਹਤਰ ਹੈ. ਸਹੀ? ¯\_(ツ)_/¯ ### ਸੁਧਾਰ * ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਨੂੰ ਹੁਣ ਇੱਕ ਕਲਿੱਕ ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਸਕਦਾ ਹੈ #1879 * ਐਂਡਰਾਇਡ 4.1 - 4.3 #1884 ਲਈ ਸਹਾਇਤਾ ਛੱਡੋ * ਪੁਰਾਣੇ ਪਲੇਅਰ #1884 ਨੂੰ ਹਟਾਓ * ਮੌਜੂਦਾ ਪਲੇ ਕਤਾਰ ਤੋਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸੱਜੇ #1915 'ਤੇ ਸਵਾਈਪ ਕਰਕੇ ਹਟਾਓ * ਆਟੋ ਕਤਾਰਬੱਧ ਸਟ੍ਰੀਮ ਨੂੰ ਹਟਾਓ ਜਦੋਂ ਇੱਕ ਨਵੀਂ ਸਟ੍ਰੀਮ ਹੱਥੀਂ ਕਤਾਰਬੱਧ ਹੁੰਦੀ ਹੈ #1878 * @kapodamy ਦੁਆਰਾ ਡਾਉਨਲੋਡ ਕਰਨ ਅਤੇ ਗੁੰਮ ਹੋਈਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ #1759 ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਪੋਸਟ ਪ੍ਰੋਸੈਸਿੰਗ * ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ ਬੁਨਿਆਦੀ ਢਾਂਚਾ * "ਬੁਨਿਆਦੀ ਢਾਂਚੇ" ਨੂੰ ਸੰਭਾਲਣ ਲਈ ਸਹੀ ਤਰੁੱਟੀ (ਡਾਊਨਲੋਡਰ ਲਈ) * ਮਲਟੀਪਲ ਡਾਉਨਲੋਡਸ ਦੀ ਬਜਾਏ ਕਤਾਰ * ਲੜੀਬੱਧ ਲੰਬਿਤ ਡਾਉਨਲੋਡਸ (`ਗੀਗਾ` ਫਾਈਲਾਂ) ਨੂੰ ਐਪ ਡੇਟਾ ਵਿੱਚ ਮੂਵ ਕਰੋ * ਅਧਿਕਤਮ ਡਾਊਨਲੋਡ ਦੀ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਨੂੰ ਲਾਗੂ ਕਰੋ * ਉਚਿਤ ਮਲਟੀ-ਥ੍ਰੈਡ ਡਾਊਨਲੋਡ ਵਿਰਾਮ * ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ 'ਤੇ ਜਾਣ ਵੇਲੇ ਡਾਊਨਲੋਡ ਬੰਦ ਕਰੋ (ਕਦੇ ਕੰਮ ਨਹੀਂ ਕਰਦਾ, ਦੂਜਾ ਪੁਆਇੰਟ ਦੇਖੋ) * ਅਗਲੇ ਡਾਉਨਲੋਡਸ ਲਈ ਥਰਿੱਡ ਗਿਣਤੀ ਨੂੰ ਸੁਰੱਖਿਅਤ ਕਰੋ * ਬਹੁਤ ਸਾਰੀਆਂ ਅਸੰਗਤੀਆਂ ਹੱਲ ਕੀਤੀਆਂ ਗਈਆਂ ### ਸਥਿਰ * ਪੂਰਵ-ਨਿਰਧਾਰਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਨਾਲ ਕਰੈਸ਼ ਨੂੰ ਬਿਹਤਰ ਅਤੇ ਸੀਮਤ ਮੋਬਾਈਲ ਡਾਟਾ ਰੈਜ਼ੋਲਿਊਸ਼ਨ #1835 'ਤੇ ਸੈੱਟ ਕਰੋ * ਪੌਪ-ਅੱਪ ਪਲੇਅਰ ਕਰੈਸ਼ ਫਿਕਸਡ #1874 * ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ #1901 ਨੂੰ ਖੋਲ੍ਹਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਸਮੇਂ NPE * ਜਦੋਂ ਆਟੋ ਕਤਾਰ ਯੋਗ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸੰਮਿਲਿਤ ਕਰਨ ਲਈ ਠੀਕ ਕਰੋ #1878 * ਡੀਸਾਈਪਰਿੰਗ ਸ਼ੱਟਟਾਊਨ ਮੁੱਦੇ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ +ਸੁਧਾਰ +* ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਹੁਣ ਇੱਕ ਕਲਿੱਕ ਨਾਲ ਖੋਲ੍ਹੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ #1879 +* ਐਂਡਰਾਇਡ 4.1 - 4.3 ਲਈ ਡ੍ਰੌਪ ਸਪੋਰਟ #1884 +* ਪੁਰਾਣੇ ਪਲੇਅਰ ਨੂੰ ਹਟਾਓ #1884 +* ਮੌਜੂਦਾ ਪਲੇ ਕਤਾਰ ਤੋਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਸਵਾਈਪ ਕਰਕੇ ਹਟਾਓ #1915 +* ਜਦੋਂ ਇੱਕ ਨਵੀਂ ਸਟ੍ਰੀਮ ਨੂੰ ਹੱਥੀਂ ਕਤਾਰਬੱਧ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਤਾਂ ਆਟੋ ਕਤਾਰਬੱਧ ਸਟ੍ਰੀਮ ਨੂੰ ਹਟਾਓ #1878 +* ਬਹੁਤ ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਅਸੰਗਤੀਆਂ ਠੀਕ ਕੀਤੀਆਂ ਗਈਆਂ + +ਫਿਕਸਡ +* ਬਹੁਤ ਸਾਰੀਆਂ ਅਸੰਗਤੀਆਂ ਠੀਕ ਕੀਤੀਆਂ ਗਈਆਂ diff --git a/fastlane/metadata/android/pa/changelogs/71.txt b/fastlane/metadata/android/pa/changelogs/71.txt index bafa26f8c..2f11dea82 100644 --- a/fastlane/metadata/android/pa/changelogs/71.txt +++ b/fastlane/metadata/android/pa/changelogs/71.txt @@ -1 +1,8 @@ -### ਸੁਧਾਰ * GitHub ਬਿਲਡ ਲਈ ਐਪ ਅਪਡੇਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਸ਼ਾਮਲ ਕਰੋ (@krtkush ਦੁਆਰਾ #1608) * ਡਾਊਨਲੋਡਰ ਵਿੱਚ ਕਈ ਸੁਧਾਰ (@kapodamy ਦੁਆਰਾ #1944): * ਗੁੰਮ ਹੋਏ ਚਿੱਟੇ ਆਈਕਨ ਸ਼ਾਮਲ ਕਰੋ ਅਤੇ ਆਈਕਨ ਦੇ ਰੰਗਾਂ ਨੂੰ ਬਦਲਣ ਲਈ ਹਾਰਡਕੋਰਡ ਤਰੀਕੇ ਦੀ ਵਰਤੋਂ ਕਰੋ * ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਇਟਰੇਟਰ ਸ਼ੁਰੂ ਕੀਤਾ ਗਿਆ ਹੈ (ਫਿਕਸ #2031) * ਨਵੇਂ ਮੁਕਸਰ ਵਿੱਚ "ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ ਫੇਲ੍ਹ" ਗਲਤੀ ਦੇ ਨਾਲ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ * ਨਵਾਂ MPEG-4 ਮੁਕਸਰ ਫਿਕਸਿੰਗ ਗੈਰ-ਸਿੰਕਰੋਨਸ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਸਟ੍ਰੀਮਜ਼ (#2039) ### ਸਥਿਰ * YouTube ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਥੋੜ੍ਹੇ ਸਮੇਂ ਬਾਅਦ ਚੱਲਣੀਆਂ ਬੰਦ ਹੋ ਜਾਂਦੀਆਂ ਹਨ (@yausername ਦੁਆਰਾ #1996) +ਸੁਧਾਰ +* GitHub ਬਿਲਡ ਲਈ ਐਪ ਅੱਪਡੇਟ ਸੂਚਨਾ ਸ਼ਾਮਲ ਕਰੋ (#1608 @krtkush ਦੁਆਰਾ) +* ਡਾਊਨਲੋਡਰ ਵਿੱਚ ਕਈ ਸੁਧਾਰ (#1944 @kapodamy ਦੁਆਰਾ) +* ਨਵੇਂ ਮਕਸਰ ਵਿੱਚ "ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ ਅਸਫਲ" ਗਲਤੀ ਨਾਲ ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ +* ਨਵਾਂ MPEG-4 ਮਕਸਰ ਗੈਰ-ਸਮਕਾਲੀ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਠੀਕ ਕਰਦਾ ਹੈ (#2039) + +ਫਿਕਸਡ +* YouTube ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਥੋੜ੍ਹੇ ਸਮੇਂ ਬਾਅਦ ਚੱਲਣਾ ਬੰਦ ਕਰ ਦਿੰਦੀਆਂ ਹਨ (#1996 @yausername ਦੁਆਰਾ) diff --git a/fastlane/metadata/android/pa/changelogs/740.txt b/fastlane/metadata/android/pa/changelogs/740.txt index 6a2dbdc86..62da0f9c3 100644 --- a/fastlane/metadata/android/pa/changelogs/740.txt +++ b/fastlane/metadata/android/pa/changelogs/740.txt @@ -1 +1,8 @@ -ਬਦਲਾਅ ਸੂਚੀ ਅਨੁਵਾਦ ਕਰਣਯੋਗ ਨਹੀਂ। ਬਿਲਕੁਲ ਬਕਵਾਸ +

    ਸੁਧਾਰ

    +
      +
    • ਟਿੱਪਣੀਆਂ ਵਿੱਚ ਲਿੰਕਾਂ ਨੂੰ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਬਣਾਓ, ਟੈਕਸਟ ਦਾ ਆਕਾਰ ਵਧਾਓ
    • +
    • ਟਿੱਪਣੀਆਂ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪ ਕੀਤੇ ਲਿੰਕਾਂ 'ਤੇ ਕਲਿੱਕ ਕੀਤੇ ਜਾਣ 'ਤੇ ਖੋਜ ਕਰੋ
    • +
    • ਜਦੋਂ ਸਾਂਝਾ ਕੀਤਾ ਟੈਕਸਟ URL ਨਾ ਹੋਵੇ ਤਾਂ ਖੋਜ ਕਰੋ
    • +
    • ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ "ਹੁਣੇ ਸਾਂਝਾ ਕਰੋ" ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ
    • +
    • ExoPlayer ਨੂੰ 2.9.6 'ਤੇ ਅੱਪਡੇਟ ਕਰਨਾ
    • +
    diff --git a/fastlane/metadata/android/pa/changelogs/750.txt b/fastlane/metadata/android/pa/changelogs/750.txt index 0b875b705..c24183ddb 100644 --- a/fastlane/metadata/android/pa/changelogs/750.txt +++ b/fastlane/metadata/android/pa/changelogs/750.txt @@ -1 +1,9 @@ -ਨਵਾਂ ਪਲੇਬੈਕ ਰੈਜ਼ਿਊਮੇ #2288 • ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ ਜਿੱਥੇ ਤੁਸੀਂ ਪਿਛਲੀ ਵਾਰ ਰੁਕੇ ਸੀ ਡਾਊਨਲੋਡਰ ਸੁਧਾਰ #2149 • ਬਾਹਰੀ SD-ਕਾਰਡਾਂ 'ਤੇ ਡਾਊਨਲੋਡ ਸਟੋਰ ਕਰਨ ਲਈ ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ • ਨਵਾਂ mp4 muxer • ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਡਾਉਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਬਦਲੋ • ਮੀਟਰਡ ਨੈੱਟਵਰਕਾਂ ਦਾ ਆਦਰ ਕਰੋ ਸੁਧਾਰ • gema ਸਤਰ #2295 ਨੂੰ ਹਟਾਇਆ • ਗਤੀਵਿਧੀ ਜੀਵਨ ਚੱਕਰ #2444 ਦੌਰਾਨ ਹੈਂਡਲ (ਆਟੋ) ਰੋਟੇਸ਼ਨ ਤਬਦੀਲੀਆਂ • ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਨੂੰ ਇਕਸਾਰ #2368 ਬਣਾਓ ਸਥਿਰ • ਫਿਕਸਡ ਚੁਣਿਆ ਹੋਇਆ ਉਪਸਿਰਲੇਖ ਟਰੈਕ ਨਾਮ #2394 ਨਹੀਂ ਦਿਖਾਇਆ ਜਾ ਰਿਹਾ ਹੈ • ਐਪ ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਅਸਫਲ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨਾ ਹੋਵੋ (GitHub ਸੰਸਕਰਣ) #2423 • ਸਥਿਰ ਡਾਊਨਲੋਡ 99.9% #2440 'ਤੇ ਅਟਕ ਗਏ • ਪਲੇ ਕਤਾਰ ਮੈਟਾਡੇਟਾ #2453 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ • [SoundCloud] ਪਲੇਲਿਸਟਸ ਲੋਡ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ TeamNewPipe/NewPipeExtractor#170 • [YouTube] ਸਥਿਰ ਅਵਧੀ ਨੂੰ ਪਾਰਸਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ TeamNewPipe/NewPipeExtractor#177 +ਨਵਾਂ +ਪਲੇਬੈਕ ਰੈਜ਼ਿਊਮੇ #2288 +ਡਾਊਨਲੋਡਰ ਸੁਧਾਰ #2149 +• ਬਾਹਰੀ SD-ਕਾਰਡਾਂ 'ਤੇ ਡਾਊਨਲੋਡ ਸਟੋਰ ਕਰਨ ਲਈ ਸਟੋਰੇਜ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ +• ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਡਾਊਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਬਦਲੋ +• ਮੀਟਰ ਕੀਤੇ ਨੈੱਟਵਰਕਾਂ ਦਾ ਸਤਿਕਾਰ ਕਰੋ + +ਸਥਿਰ +• [YouTube] ਸਥਿਰ ਮਿਆਦ ਨੂੰ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pa/changelogs/760.txt b/fastlane/metadata/android/pa/changelogs/760.txt index fd4b8f2a4..6279139d0 100644 --- a/fastlane/metadata/android/pa/changelogs/760.txt +++ b/fastlane/metadata/android/pa/changelogs/760.txt @@ -1 +1,10 @@ -0.17.1 ਵਿੱਚ ਬਦਲਾਅ ਨਵਾਂ • ਥਾਈ ਸਥਾਨਕਕਰਨ ਸੁਧਾਰ • ਦੁਬਾਰਾ #2518 ਪਲੇਲਿਸਟਾਂ ਲਈ ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਵਿੱਚ ਇੱਥੇ ਪਲੇ ਸ਼ੁਰੂ ਕਰੋ ਐਕਸ਼ਨ ਸ਼ਾਮਲ ਕਰੋ • SAF / ਪੁਰਾਤਨ ਫਾਈਲ ਪਿਕਰ #2521 ਲਈ ਸਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • ਐਪਸ #2487 ਨੂੰ ਬਦਲਦੇ ਸਮੇਂ ਡਾਊਨਲੋਡ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਗਾਇਬ ਹੋਣ ਵਾਲੇ ਬਟਨਾਂ ਨੂੰ ਠੀਕ ਕਰੋ • ਫਿਕਸ ਪਲੇਬੈਕ ਸਥਿਤੀ ਸਟੋਰ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਹਾਲਾਂਕਿ ਦੇਖਣ ਦਾ ਇਤਿਹਾਸ ਅਯੋਗ ਹੈ • ਸੂਚੀ ਦ੍ਰਿਸ਼ #2517 ਵਿੱਚ ਪਲੇਬੈਕ ਸਥਿਤੀ ਦੇ ਕਾਰਨ ਘਟੇ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ • [ਐਕਸਟ੍ਰੈਕਟਰ] ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 ਫਿਕਸ • [ਐਕਸਟ੍ਰੈਕਟਰ] [YouTube] ਜਦੋਂ ਪਲੇਲਿਸਟਾਂ ਨਤੀਜੇ ਵਿੱਚ ਹੋਣ ਤਾਂ ਆਮ ਖੋਜ ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ TeamNewPipe/NewPipeExtractor#185 0.17.0 ਵਿੱਚ ਬਦਲਾਅ ਨਵਾਂ ਪਲੇਬੈਕ ਰੈਜ਼ਿਊਮੇ #2288 • ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ ਜਿੱਥੇ ਤੁਸੀਂ ਪਿਛਲੀ ਵਾਰ ਰੁਕੇ ਸੀ ਡਾਊਨਲੋਡਰ ਸੁਧਾਰ #2149 • ਬਾਹਰੀ SD-ਕਾਰਡਾਂ 'ਤੇ ਡਾਊਨਲੋਡ ਸਟੋਰ ਕਰਨ ਲਈ ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ • ਨਵਾਂ mp4 muxer • ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਡਾਉਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਬਦਲੋ • ਮੀਟਰਡ ਨੈੱਟਵਰਕਾਂ ਦਾ ਆਦਰ ਕਰੋ ਸੁਧਾਰ • gema ਸਤਰ #2295 ਨੂੰ ਹਟਾਇਆ • ਗਤੀਵਿਧੀ ਜੀਵਨ ਚੱਕਰ #2444 ਦੌਰਾਨ ਹੈਂਡਲ (ਆਟੋ) ਰੋਟੇਸ਼ਨ ਤਬਦੀਲੀਆਂ • ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਨੂੰ ਇਕਸਾਰ #2368 ਬਣਾਓ ਸਥਿਰ • ਫਿਕਸਡ ਚੁਣਿਆ ਹੋਇਆ ਉਪਸਿਰਲੇਖ ਟਰੈਕ ਨਾਮ #2394 ਨਹੀਂ ਦਿਖਾਇਆ ਜਾ ਰਿਹਾ ਹੈ • ਐਪ ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਅਸਫਲ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨਾ ਹੋਵੋ (GitHub ਸੰਸਕਰਣ) #2423 • ਸਥਿਰ ਡਾਊਨਲੋਡ 99.9% #2440 'ਤੇ ਅਟਕ ਗਏ • ਪਲੇ ਕਤਾਰ ਮੈਟਾਡੇਟਾ #2453 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ • [SoundCloud] ਪਲੇਲਿਸਟਸ ਲੋਡ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ TeamNewPipe/NewPipeExtractor#170 • [YouTube] ਸਥਿਰ ਅਵਧੀ ਨੂੰ ਪਾਰਸਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ TeamNewPipe/NewPipeExtractor#177 +0.17.1 ਵਿੱਚ ਬਦਲਾਅ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਪਲੇਲਿਸਟਾਂ ਲਈ ਦੁਬਾਰਾ ਲੰਬੇ-ਦਬਾਓ ਵਾਲੇ ਮੀਨੂ ਵਿੱਚ ਇੱਥੇ ਚਲਾਉਣਾ ਸ਼ੁਰੂ ਕਰੋ ਐਕਸ਼ਨ ਸ਼ਾਮਲ ਕਰੋ +• SAF / ਲੀਗੇਸੀ ਫਾਈਲ ਪਿਕਰ #2521 ਲਈ ਸਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ +ਫਿਕਸਡ +• ਐਪਸ ਨੂੰ ਸਵਿੱਚ ਕਰਦੇ ਸਮੇਂ ਡਾਊਨਲੋਡ ਵਿਊ ਵਿੱਚ ਗਾਇਬ ਹੋਣ ਵਾਲੇ ਬਟਨਾਂ ਨੂੰ ਠੀਕ ਕਰੋ #2487 +• ਦੇਖਣ ਦੇ ਇਤਿਹਾਸ ਨੂੰ ਅਯੋਗ ਹੋਣ ਦੇ ਬਾਵਜੂਦ ਸਟੋਰ ਕੀਤੀ ਗਈ ਪਲੇਬੈਕ ਸਥਿਤੀ ਨੂੰ ਠੀਕ ਕਰੋ +• ਸੂਚੀ ਵਿਊ ਵਿੱਚ ਪਲੇਬੈਕ ਸਥਿਤੀ ਕਾਰਨ ਘਟੀ ਹੋਈ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ +• [ਐਕਸਟ੍ਰੈਕਟਰ] [YouTube] ਜਦੋਂ ਪਲੇਲਿਸਟਾਂ ਨਤੀਜਿਆਂ ਵਿੱਚ ਹੋਣ ਤਾਂ ਆਮ ਖੋਜ ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/780.txt b/fastlane/metadata/android/pa/changelogs/780.txt index 999a24468..923a0410a 100644 --- a/fastlane/metadata/android/pa/changelogs/780.txt +++ b/fastlane/metadata/android/pa/changelogs/780.txt @@ -1 +1,11 @@ -0.17.3 ਵਿੱਚ ਬਦਲਾਅ ਸੁਧਾਰ • ਪਲੇਬੈਕ ਸਥਿਤੀਆਂ #2550 ਨੂੰ ਸਾਫ਼ ਕਰਨ ਲਈ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਫਾਈਲ ਪਿਕਰ #2591 ਵਿੱਚ ਲੁਕੀਆਂ ਹੋਈਆਂ ਡਾਇਰੈਕਟਰੀਆਂ ਦਿਖਾਓ • NewPipe #2488 ਨਾਲ ਖੋਲ੍ਹੇ ਜਾਣ ਵਾਲੇ `invidio.us` ਉਦਾਹਰਨਾਂ ਤੋਂ ਸਮਰਥਨ URL • `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • [YouTube] ਸਥਿਰ 'java.lang.IllegalArgumentException #192 • [YouTube] ਸਥਿਰ ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀਆਂ TeamNewPipe/NewPipeExtractor#195 • ਇੱਕ ਸਟ੍ਰੀਮ #2592 ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਵੇਲੇ ਐਂਡਰੌਇਡ ਪਾਈ ਵਿੱਚ ਸਥਿਰ ਪ੍ਰਦਰਸ਼ਨ ਸਮੱਸਿਆ +0.17.3 ਵਿੱਚ ਬਦਲਾਅ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਪਲੇਬੈਕ ਸਥਿਤੀਆਂ ਨੂੰ ਸਾਫ਼ ਕਰਨ ਲਈ ਵਿਕਲਪ ਜੋੜਿਆ ਗਿਆ #2550 +• ਫਾਈਲ ਚੋਣਕਾਰ #2591 ਵਿੱਚ ਲੁਕੀਆਂ ਹੋਈਆਂ ਡਾਇਰੈਕਟਰੀਆਂ ਦਿਖਾਓ +• NewPipe #2488 ਨਾਲ ਖੋਲ੍ਹੇ ਜਾਣ ਵਾਲੇ `invidio.us` ਉਦਾਹਰਣਾਂ ਤੋਂ URL ਦਾ ਸਮਰਥਨ ਕਰੋ +• `music.youtube.com` URL ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ + +ਸਥਿਰ +• [YouTube] ਫਿਕਸਡ ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀਆਂ +• ਸਟ੍ਰੀਮ ਡਾਊਨਲੋਡ ਕਰਦੇ ਸਮੇਂ ਐਂਡਰਾਇਡ ਪਾਈ ਵਿੱਚ ਪ੍ਰਦਰਸ਼ਨ ਸਮੱਸਿਆ ਹੱਲ ਕੀਤੀ ਗਈ #2592 diff --git a/fastlane/metadata/android/pa/changelogs/790.txt b/fastlane/metadata/android/pa/changelogs/790.txt index f841801eb..28627c7ec 100644 --- a/fastlane/metadata/android/pa/changelogs/790.txt +++ b/fastlane/metadata/android/pa/changelogs/790.txt @@ -1 +1,11 @@ -ਸੁਧਾਰ • ਅੰਨ੍ਹੇ ਲੋਕਾਂ #2655 ਲਈ ਪਹੁੰਚਯੋਗਤਾ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਹੋਰ ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕਰੋ • ਡਾਉਨਲੋਡ ਫੋਲਡਰ ਸੈਟਿੰਗ ਦੀ ਭਾਸ਼ਾ ਨੂੰ ਵਧੇਰੇ ਇਕਸਾਰ ਅਤੇ ਘੱਟ ਅਸਪਸ਼ਟ #2637 ਬਣਾਓ ਸਥਿਰ • ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਬਲਾਕ ਵਿੱਚ ਆਖਰੀ ਬਾਈਟ #2646 ਡਾਊਨਲੋਡ ਕੀਤੀ ਗਈ ਹੈ • ਵੀਡੀਓ ਡਿਟੇਲ ਫਰੈਗਮੈਂਟ #2672 ਵਿੱਚ ਸਥਿਰ ਸਕ੍ਰੋਲਿੰਗ • ਡਬਲ ਸਰਚ ਕਲੀਅਰ ਬਾਕਸ ਐਨੀਮੇਸ਼ਨ ਨੂੰ ਇੱਕ #2695 ਵਿੱਚ ਹਟਾਓ • [SoundCloud] ਕਲਾਇਟ_ਆਈਡੀ ਐਕਸਟਰੈਕਸ਼ਨ #2745 ਨੂੰ ਠੀਕ ਕਰੋ ਵਿਕਾਸ • NewPipeExtractor ਤੋਂ ਵਿਰਾਸਤ ਵਿੱਚ ਮਿਲੀ ਗੁੰਮ ਨਿਰਭਰਤਾ ਨੂੰ NewPipe #2535 ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ • AndroidX #2685 'ਤੇ ਮਾਈਗ੍ਰੇਟ ਕਰੋ • ExoPlayer 2.10.6 #2697, #2736 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ +ਸੁਧਾਰਿਆ ਗਿਆ +• ਹੋਰ ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕਰੋ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਬਲਾਕ ਵਿੱਚ ਆਖਰੀ ਬਾਈਟ ਡਾਊਨਲੋਡ ਕੀਤਾ ਗਿਆ ਹੈ #2646 +• ਵੀਡੀਓ ਵੇਰਵੇ ਵਾਲੇ ਟੁਕੜੇ #2672 ਵਿੱਚ ਸਕ੍ਰੌਲਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +• [SoundCloud] client_id ਐਕਸਟਰੈਕਸ਼ਨ #2745 ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ + +ਵਿਕਾਸ +• AndroidX 'ਤੇ ਮਾਈਗ੍ਰੇਟ ਕਰੋ +• ExoPlayer 2.10.6 'ਤੇ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/800.txt b/fastlane/metadata/android/pa/changelogs/800.txt index 53868c894..08940d095 100644 --- a/fastlane/metadata/android/pa/changelogs/800.txt +++ b/fastlane/metadata/android/pa/changelogs/800.txt @@ -1 +1,10 @@ -ਨਵਾਂ • P2P (#2201) [ਬੀਟਾ] ਤੋਂ ਬਿਨਾਂ PeerTube ਸਮਰਥਨ: ◦ PeerTube ਉਦਾਹਰਨਾਂ ਤੋਂ ਵੀਡੀਓ ਦੇਖੋ ਅਤੇ ਡਾਊਨਲੋਡ ਕਰੋ ◦ ਪੂਰੀ PeerTube ਸੰਸਾਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਉਦਾਹਰਨਾਂ ਸ਼ਾਮਲ ਕਰੋ ◦ Android 4.4 ਅਤੇ 7.1 'ਤੇ SSL ਹੈਂਡਸ਼ੇਕ ਨਾਲ ਸਮੱਸਿਆਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ ਜਦੋਂ ਕੁਝ ਖਾਸ ਮੌਕਿਆਂ 'ਤੇ ਪਹੁੰਚ ਕਰਦੇ ਸਮੇਂ ਨੈੱਟਵਰਕ ਗੜਬੜ ਹੋ ਜਾਂਦੀ ਹੈ। • ਡਾਊਨਲੋਡਰ (#2679): ◦ ਡਾਊਨਲੋਡ ETA ਦੀ ਗਣਨਾ ਕਰੋ ◦ ਓਪਸ (ਵੈਬ ਫਾਈਲਾਂ) ਨੂੰ ogg ਵਜੋਂ ਡਾਊਨਲੋਡ ਕਰੋ ◦ ਲੰਬੇ ਵਿਰਾਮ ਤੋਂ ਬਾਅਦ ਡਾਊਨਲੋਡ ਮੁੜ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਮਿਆਦ ਪੁੱਗ ਚੁੱਕੇ ਡਾਊਨਲੋਡ ਲਿੰਕਾਂ ਨੂੰ ਮੁੜ-ਹਾਸਲ ਕਰੋ ਸੁਧਾਰ • ਕਿਓਸਕਫ੍ਰੈਗਮੈਂਟ ਨੂੰ ਤਰਜੀਹੀ ਸਮਗਰੀ ਵਾਲੇ ਦੇਸ਼ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਤੋਂ ਜਾਣੂ ਕਰਵਾਓ ਅਤੇ ਸਾਰੀਆਂ ਮੁੱਖ ਟੈਬਾਂ #2742 ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ। • ਐਕਸਟਰੈਕਟਰ #2713 ਤੋਂ ਨਵੇਂ ਸਥਾਨਕਕਰਨ ਅਤੇ ਡਾਉਨਲੋਡਰ ਲਾਗੂਕਰਨ ਦੀ ਵਰਤੋਂ ਕਰੋ • "ਡਿਫੌਲਟ ਕਿਓਸਕ" ਸਤਰ ਨੂੰ ਅਨੁਵਾਦਯੋਗ ਬਣਾਓ • ਬਲੈਕ ਥੀਮ #2569 ਲਈ ਬਲੈਕ ਨੈਵੀਗੇਸ਼ਨ ਪੱਟੀ ਸਥਿਰ • ਇੱਕ ਬੱਗ ਫਿਕਸ ਕੀਤਾ ਗਿਆ ਹੈ ਜੋ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਹਿਲਾ ਨਹੀਂ ਸਕਦਾ ਸੀ ਜੇਕਰ ਪੌਪਅੱਪ ਪਲੇਅਰ #2772 ਨੂੰ ਹਿਲਾਉਂਦੇ ਸਮੇਂ ਕੋਈ ਹੋਰ ਉਂਗਲ ਰੱਖੀ ਜਾਂਦੀ ਹੈ • ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਅਪਲੋਡਰ ਦੀ ਗੁੰਮਸ਼ੁਦਗੀ ਦੀ ਆਗਿਆ ਦਿਓ ਅਤੇ ਇਸ ਸਮੱਸਿਆ ਨਾਲ ਸਬੰਧਤ ਕ੍ਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ #2724, TeamNewPipe/NewPipeExtractor#219 • MediaCCC ਅਤੇ ਕੁਝ PeerTube ਉਦਾਹਰਨਾਂ #2792 ਨਾਲ TLS ਹੈਂਡਸ਼ੇਕ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ Android 4.4 ਡਿਵਾਈਸਾਂ (API 19/KitKat) 'ਤੇ TLS1.1/1.2 ਨੂੰ ਸਮਰੱਥ ਕਰਨਾ • [SoundCloud] ਫਿਕਸਡ ਕਲਾਈਂਟ_ਆਈਡੀ ਐਕਸਟ੍ਰੈਕਸ਼ਨ TeamNewPipe/NewPipeExtractor#217 • [SoundCloud] ਆਡੀਓ ਸਟ੍ਰੀਮ ਕੱਢਣ ਨੂੰ ਠੀਕ ਕਰੋ ਵਿਕਾਸ • ExoPlayer ਨੂੰ 2.10.8 #2791, #2816 'ਤੇ ਅੱਪਡੇਟ ਕਰੋ • Gradle ਨੂੰ 3.5.1 ਵਿੱਚ ਅੱਪਡੇਟ ਕਰੋ ਅਤੇ Kotlin ਸਹਿਯੋਗ #2714 ਸ਼ਾਮਲ ਕਰੋ +ਨਵਾਂ +• P2P ਤੋਂ ਬਿਨਾਂ PeerTube ਸਹਾਇਤਾ (#2201) [ਬੀਟਾ]: + +◦ ਲੰਬੇ ਵਿਰਾਮ ਤੋਂ ਬਾਅਦ ਡਾਊਨਲੋਡ ਮੁੜ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਮਿਆਦ ਪੁੱਗ ਚੁੱਕੇ ਡਾਊਨਲੋਡ ਲਿੰਕਾਂ ਨੂੰ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰੋ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਪਸੰਦੀਦਾ ਸਮੱਗਰੀ ਦੇਸ਼ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਬਾਰੇ KioskFragment ਨੂੰ ਸੂਚਿਤ ਕਰੋ ਅਤੇ ਸਾਰੇ ਮੁੱਖ ਟੈਬਾਂ ਵਿੱਚ ਪ੍ਰਦਰਸ਼ਨ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ #2742 + +ਸਥਿਰ +• Android 4.4 ਡਿਵਾਈਸਾਂ (API 19/KitKat) 'ਤੇ TLS1.1/1.2 ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ diff --git a/fastlane/metadata/android/pa/changelogs/810.txt b/fastlane/metadata/android/pa/changelogs/810.txt index 96a2b9da5..d10bc6913 100644 --- a/fastlane/metadata/android/pa/changelogs/810.txt +++ b/fastlane/metadata/android/pa/changelogs/810.txt @@ -1 +1,11 @@ -ਨਵਾਂ • ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਦੇ ਸਮੇਂ ਲੌਕ ਸਕ੍ਰੀਨ 'ਤੇ ਵੀਡੀਓ ਥੰਬਨੇਲ ਦਿਖਾਓ ਸੁਧਾਰ • ਬੈਕਗ੍ਰਾਉਂਡ / ਪੌਪਅੱਪ ਬਟਨ 'ਤੇ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ 'ਤੇ ਕਤਾਰ ਵਿੱਚ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਸ਼ਾਮਲ ਕਰੋ • ਮੁੱਖ ਪੰਨਾ ਟੈਬਾਂ ਨੂੰ ਸਕ੍ਰੋਲ ਕਰਨ ਯੋਗ ਬਣਾਓ ਅਤੇ ਸਿਰਫ਼ ਇੱਕ ਟੈਬ ਹੋਣ 'ਤੇ ਲੁਕਾਓ • ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ ਸੂਚਨਾ ਥੰਬਨੇਲ ਅੱਪਡੇਟ ਦੀ ਸੀਮਾ ਮਾਤਰਾ • ਖਾਲੀ ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਲਈ ਡਮੀ ਥੰਬਨੇਲ ਸ਼ਾਮਲ ਕਰੋ • *.webm ਦੀ ਬਜਾਏ *.opus ਫਾਈਲ ਐਕਸਟੈਂਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰੋ ਅਤੇ ਡਾਊਨਲੋਡ ਡ੍ਰੌਪਡਾਉਨ ਵਿੱਚ "WebM Opus" ਦੀ ਬਜਾਏ ਫਾਰਮੈਟ ਲੇਬਲ ਵਿੱਚ "opus" ਦਿਖਾਓ • "ਡਾਊਨਲੋਡ" ਵਿੱਚ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਜਾਂ ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਨੂੰ ਮਿਟਾਉਣ ਲਈ ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ • [YouTube] /c/shortened_url ਚੈਨਲ ਲਿੰਕਾਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • NewPipe ਨਾਲ ਵੀਡੀਓ ਸਾਂਝਾ ਕਰਨ ਅਤੇ ਇਸ ਦੀਆਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸਿੱਧੇ ਡਾਊਨਲੋਡ ਕਰਨ ਵੇਲੇ ਕਈ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ • ਇਸ ਦੇ ਸਿਰਜਣ ਥ੍ਰੈਡ ਤੋਂ ਬਾਹਰ ਸਥਿਰ ਪਲੇਅਰ ਪਹੁੰਚ • ਸਥਿਰ ਖੋਜ ਨਤੀਜੇ ਪੇਜਿੰਗ • [YouTube] ਨਿਸ਼ਚਤ ਸਵਿਚਿੰਗ ਚਾਲੂ ਕਰਨ ਨਾਲ NPE ਹੁੰਦਾ ਹੈ • [YouTube] ਇੱਕ invidio.us url ਖੋਲ੍ਹਣ ਵੇਲੇ ਟਿੱਪਣੀਆਂ ਦੇਖਣ ਲਈ ਸਥਿਰ • [SoundCloud] ਅੱਪਡੇਟ ਕੀਤਾ client_id +ਨਵਾਂ +• ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਦੇ ਸਮੇਂ ਲਾਕ ਸਕ੍ਰੀਨ 'ਤੇ ਵੀਡੀਓ ਥੰਬਨੇਲ ਦਿਖਾਓ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਬੈਕਗ੍ਰਾਊਂਡ/ਪੌਪਅੱਪ ਬਟਨ ਨੂੰ ਦੇਰ ਤੱਕ ਦਬਾਉਣ 'ਤੇ ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਕਤਾਰ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ +• [YouTube] /c/shortened_url ਚੈਨਲ ਲਿੰਕਾਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• NewPipe 'ਤੇ ਵੀਡੀਓ ਸਾਂਝੇ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦੀਆਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸਿੱਧਾ ਡਾਊਨਲੋਡ ਕਰਨ ਵੇਲੇ ਕਈ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ +• ਖੋਜ ਨਤੀਜਿਆਂ ਦੀ ਪੇਜਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +• [SoundCloud] client_id ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/840.txt b/fastlane/metadata/android/pa/changelogs/840.txt index 745098496..d05907bd6 100644 --- a/fastlane/metadata/android/pa/changelogs/840.txt +++ b/fastlane/metadata/android/pa/changelogs/840.txt @@ -1 +1,10 @@ -ਨਵਾਂ • ਐਪ ਦੀ ਭਾਸ਼ਾ ਬਦਲਣ ਲਈ ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਪਲੇਅਰ ਸਮੇਟਣਯੋਗ ਮੀਨੂ ਵਿੱਚ ਕੋਡੀ ਬਟਨ 'ਤੇ ਭੇਜੋ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਲੰਬੀ ਪ੍ਰੈਸ 'ਤੇ ਟਿੱਪਣੀਆਂ ਨੂੰ ਕਾਪੀ ਕਰਨ ਦੀ ਸਮਰੱਥਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ ਹੈ ਸੁਧਾਰ • ਰੀਕੈਪਚਾ ਗਤੀਵਿਧੀ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ ਪ੍ਰਾਪਤ ਕੀਤੀਆਂ ਕੂਕੀਜ਼ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕਰੋ • ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਦੇਖਣ ਦਾ ਇਤਿਹਾਸ ਚਾਲੂ ਨਾ ਹੋਣ 'ਤੇ ਦਰਾਜ਼ ਦੇ ਹੱਕ ਵਿੱਚ ਡਾਟ-ਮੀਨੂ ਨੂੰ ਹਟਾਇਆ ਗਿਆ ਅਤੇ ਇਤਿਹਾਸ ਨੂੰ ਲੁਕਾਓ ਬਟਨ • Android 6 ਅਤੇ ਬਾਅਦ ਵਾਲੇ 'ਤੇ ਸਹੀ ਢੰਗ ਨਾਲ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਹੋਰ ਐਪਾਂ ਦੀ ਇਜਾਜ਼ਤ ਦੇ ਉੱਪਰ ਡਿਸਪਲੇ ਲਈ ਪੁੱਛੋ • BookmarkFragment ਵਿੱਚ ਲੰਮਾ-ਕਲਿੱਕ ਕਰਕੇ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਦਾ ਨਾਮ ਬਦਲੋ • ਕਈ PeerTube ਸੁਧਾਰ • ਕਈ ਅੰਗਰੇਜ਼ੀ ਸਰੋਤ ਸਤਰਾਂ ਨੂੰ ਸੁਧਾਰਿਆ ਗਿਆ ਹੈ ਸਥਿਰ • ਫਿਕਸਡ ਪਲੇਅਰ ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਹੋ ਰਿਹਾ ਹੈ ਹਾਲਾਂਕਿ ਇਹ ਉਦੋਂ ਰੋਕਿਆ ਜਾਂਦਾ ਹੈ ਜਦੋਂ ਵਿਕਲਪ "ਐਪ ਸਵਿੱਚ 'ਤੇ ਛੋਟਾ ਕਰੋ" ਯੋਗ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਅਤੇ ਨਿਊ ਪਾਈਪ ਨੂੰ ਛੋਟਾ ਕੀਤਾ ਜਾਂਦਾ ਹੈ • ਸੰਕੇਤ ਲਈ ਸ਼ੁਰੂਆਤੀ ਚਮਕ ਮੁੱਲ ਨੂੰ ਠੀਕ ਕਰੋ • ਸਥਿਰ .srt ਉਪਸਿਰਲੇਖ ਡਾਉਨਲੋਡ ਜਿਸ ਵਿੱਚ ਸਾਰੇ ਲਾਈਨ ਬ੍ਰੇਕ ਨਹੀਂ ਹਨ • SD ਕਾਰਡ 'ਤੇ ਸਥਿਰ ਡਾਊਨਲੋਡ ਅਸਫਲ ਹੋ ਰਿਹਾ ਹੈ ਕਿਉਂਕਿ ਕੁਝ Android 5 ਡਿਵਾਈਸਾਂ CTF ਅਨੁਕੂਲ ਨਹੀਂ ਹਨ • Android KitKat 'ਤੇ ਸਥਿਰ ਡਾਊਨਲੋਡਿੰਗ • ਸਥਿਰ ਭ੍ਰਿਸ਼ਟ ਵੀਡੀਓ .mp4 ਫਾਈਲ ਨੂੰ ਆਡੀਓ ਫਾਈਲ ਵਜੋਂ ਮਾਨਤਾ ਦਿੱਤੀ ਜਾ ਰਹੀ ਹੈ • ਗਲਤ ਚੀਨੀ ਭਾਸ਼ਾ ਕੋਡ ਸਮੇਤ, ਮਲਟੀਪਲ ਸਥਾਨੀਕਰਨ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ ਹੈ • [YouTube] ਵਰਣਨ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪ ਦੁਬਾਰਾ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਹਨ +ਨਵਾਂ +• ਐਪ ਦੀ ਭਾਸ਼ਾ ਬਦਲਣ ਲਈ ਇੱਕ ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਜੋੜਿਆ ਗਿਆ +• ਪਲੇਅਰ ਦੇ ਕੋਲੈਪਸੀਬਲ ਮੀਨੂ ਵਿੱਚ ਕੋਡੀ ਨੂੰ ਭੇਜੋ ਬਟਨ ਜੋੜਿਆ ਗਿਆ +• ਟਿੱਪਣੀਆਂ ਦੀ ਕਾਪੀ ਕਰਨ ਲਈ ਇੱਕ ਲੰਮਾ-ਦਬਾਓ ਵਿਸ਼ੇਸ਼ਤਾ ਜੋੜਿਆ ਗਿਆ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਰੀਕੈਪਚਾ ਗਤੀਵਿਧੀ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ ਅਤੇ ਪ੍ਰਾਪਤ ਕੂਕੀਜ਼ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਐਂਡਰਾਇਡ ਕਿਟਕੈਟ 'ਤੇ ਡਾਊਨਲੋਡਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/920.txt b/fastlane/metadata/android/pa/changelogs/920.txt index 04fc07937..94b1e74a0 100644 --- a/fastlane/metadata/android/pa/changelogs/920.txt +++ b/fastlane/metadata/android/pa/changelogs/920.txt @@ -1 +1,9 @@ -ਸੁਧਾਰ • ਸਟ੍ਰੀਮ ਗਰਿੱਡ ਆਈਟਮਾਂ 'ਤੇ ਅੱਪਲੋਡ ਦੀ ਮਿਤੀ ਅਤੇ ਦੇਖਣ ਦੀ ਗਿਣਤੀ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਦਰਾਜ਼ ਹੈਡਰ ਲੇਆਉਟ ਲਈ ਸੁਧਾਰ ਸਥਿਰ • ਏਪੀਆਈ 19 'ਤੇ ਕ੍ਰੈਸ਼ ਹੋਣ ਕਾਰਨ ਫਿਕਸਡ ਮਿਊਟ ਬਟਨ • ਲੰਬੇ 1080p 60fps ਵੀਡੀਓ ਦੀ ਸਥਿਰ ਡਾਊਨਲੋਡਿੰਗ +ਸੁਧਾਰਿਆ ਗਿਆ + +• ਸਟ੍ਰੀਮ ਗਰਿੱਡ ਆਈਟਮਾਂ 'ਤੇ ਅਪਲੋਡ ਮਿਤੀ ਅਤੇ ਵਿਯੂ ਗਿਣਤੀ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ +• ਦਰਾਜ਼ ਹੈਡਰ ਲੇਆਉਟ ਲਈ ਸੁਧਾਰ + +ਠੀਕ ਕੀਤਾ ਗਿਆ + +• API 19 'ਤੇ ਕਰੈਸ਼ ਹੋਣ ਵਾਲੇ ਮਿਊਟ ਬਟਨ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਲੰਬੇ 1080p 60fps ਵੀਡੀਓਜ਼ ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨਾ ਠੀਕ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/930.txt b/fastlane/metadata/android/pa/changelogs/930.txt index a067bfb58..96fc7d0b5 100644 --- a/fastlane/metadata/android/pa/changelogs/930.txt +++ b/fastlane/metadata/android/pa/changelogs/930.txt @@ -1 +1,14 @@ -ਨਵਾਂ • YouTube ਸੰਗੀਤ 'ਤੇ ਖੋਜੋ • ਬੁਨਿਆਦੀ Android TV ਸਮਰਥਨ ਸੁਧਾਰ • ਇੱਕ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਤੋਂ ਸਾਰੇ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਨੂੰ ਹਟਾਉਣ ਦੀ ਯੋਗਤਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ ਹੈ • ਕ੍ਰੈਸ਼ ਹੋਣ ਦੀ ਬਜਾਏ ਜਦੋਂ ਸਮੱਗਰੀ ਅਜੇ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ ਤਾਂ ਸੁਨੇਹਾ ਦਿਖਾਓ • ਚੁਟਕੀ ਇਸ਼ਾਰਿਆਂ ਨਾਲ ਪੌਪਅੱਪ ਪਲੇਅਰ ਦਾ ਆਕਾਰ ਬਦਲਿਆ ਗਿਆ ਹੈ • ਬੈਕਗ੍ਰਾਊਂਡ 'ਤੇ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਅਤੇ ਚੈਨਲ ਵਿੱਚ ਪੌਪਅੱਪ ਬਟਨਾਂ 'ਤੇ ਸਟ੍ਰੀਮ ਨੂੰ ਐਨਕਿਊ ਕਰੋ • ਦਰਾਜ਼ ਸਿਰਲੇਖ ਦੇ ਸਿਰਲੇਖ ਦੇ ਆਕਾਰ ਨੂੰ ਸੰਭਾਲਣ ਵਿੱਚ ਸੁਧਾਰ ਕੀਤਾ ਗਿਆ ਹੈ ਸਥਿਰ • ਨਿਸ਼ਚਿਤ ਉਮਰ ਪ੍ਰਤਿਬੰਧਿਤ ਸਮੱਗਰੀ ਸੈਟਿੰਗ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀ • ਕੁਝ ਖਾਸ ਕਿਸਮ ਦੇ reCAPTCHA ਫਿਕਸ ਕੀਤੇ ਗਏ ਹਨ • ਪਲੇਲਿਸਟ `ਨੱਲ` ਹੋਣ 'ਤੇ ਬੁੱਕਮਾਰਕ ਖੋਲ੍ਹਣ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ • ਨੈੱਟਵਰਕ ਸੰਬੰਧੀ ਅਪਵਾਦਾਂ ਦੀ ਸਥਿਰ ਖੋਜ • ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫਰੈਗਮੈਂਟ ਵਿੱਚ ਗਰੁੱਪ ਸੌਰਟ ਬਟਨ ਦੀ ਸਥਿਰ ਦਿੱਖ ਅਤੇ ਹੋਰ +ਨਵਾਂ +• YouTube ਸੰਗੀਤ ਖੋਜੋ +• ਮੁੱਢਲਾ Android TV ਸਮਰਥਨ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਤੋਂ ਸਾਰੇ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਹਟਾਉਣ ਦੀ ਯੋਗਤਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ +• ਜਦੋਂ ਸਮੱਗਰੀ ਵਰਤਮਾਨ ਵਿੱਚ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ ਤਾਂ ਕ੍ਰੈਸ਼ ਹੋਣ ਦੀ ਬਜਾਏ ਇੱਕ ਸੁਨੇਹਾ ਦਿਖਾਓ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਉਮਰ-ਪ੍ਰਤੀਬੰਧਿਤ ਸਮੱਗਰੀ ਸੈਟਿੰਗਾਂ ਨਾਲ ਇੱਕ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ। + +ਕੁਝ reCAPTCHA ਗਲਤੀਆਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ। + +ਅਤੇ ਹੋਰ ਵੀ diff --git a/fastlane/metadata/android/pa/changelogs/940.txt b/fastlane/metadata/android/pa/changelogs/940.txt index b9d9b3fdf..3ea03ad03 100644 --- a/fastlane/metadata/android/pa/changelogs/940.txt +++ b/fastlane/metadata/android/pa/changelogs/940.txt @@ -1 +1,14 @@ -ਨਵਾਂ • SoundCloud ਟਿੱਪਣੀਆਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ • YouTube ਪ੍ਰਤਿਬੰਧਿਤ ਮੋਡ ਸੈਟਿੰਗ ਸ਼ਾਮਲ ਕਰੋ • PeerTube ਮੂਲ ਚੈਨਲ ਦੇ ਵੇਰਵੇ ਦਿਖਾਓ ਸੁਧਾਰ • ਸਿਰਫ਼ ਸਮਰਥਿਤ ਸੇਵਾਵਾਂ ਲਈ ਕੋਰ ਬਟਨ ਦਿਖਾਓ • ਨੈਵੀਗੇਸ਼ਨਬਾਰ ਜਾਂ ਸਟੇਟਸਬਾਰ ਤੋਂ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਪਲੇਅਰ ਸੰਕੇਤਾਂ ਨੂੰ ਬਲਾਕ ਕਰੋ • ਸੇਵਾ ਦੇ ਰੰਗ ਦੇ ਆਧਾਰ 'ਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਅਤੇ ਗਾਹਕ ਬਣੋ ਬਟਨਾਂ ਦਾ ਪਿਛੋਕੜ ਰੰਗ ਬਦਲੋ ਸਥਿਰ • ਡਾਉਨਲੋਡ ਡਾਇਲਾਗ ਫ੍ਰੀਜ਼ ਨੂੰ ਠੀਕ ਕਰੋ • ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ ਬਟਨ ਹੁਣ ਅਸਲ ਵਿੱਚ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੁੱਲ੍ਹਦਾ ਹੈ • ਵੀਡੀਓ ਖੋਲ੍ਹਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ "ਇਸ ਸਟ੍ਰੀਮ ਨੂੰ ਚਲਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ" ਅਤੇ ਹੋਰ +ਨਵਾਂ +• SoundCloud ਟਿੱਪਣੀਆਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ +• YouTube ਪ੍ਰਤਿਬੰਧਿਤ ਮੋਡ ਸੈਟਿੰਗ ਸ਼ਾਮਲ ਕਰੋ +• PeerTube ਪੇਰੈਂਟ ਚੈਨਲ ਵੇਰਵੇ ਦਿਖਾਓ + +ਸੁਧਾਰਿਆ ਗਿਆ +• ਸਿਰਫ਼ ਸਮਰਥਿਤ ਸੇਵਾਵਾਂ ਲਈ Kore ਬਟਨ ਦਿਖਾਓ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਇੱਕ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ ਜਿੱਥੇ ਡਾਊਨਲੋਡ ਡਾਇਲਾਗ ਫ੍ਰੀਜ਼ ਹੋ ਰਿਹਾ ਸੀ +• ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ ਬਟਨ ਹੁਣ ਅਸਲ ਵਿੱਚ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੁੱਲ੍ਹਦਾ ਹੈ +• ਵੀਡੀਓ ਖੋਲ੍ਹਣ ਵੇਲੇ ਕਰੈਸ਼ ਅਤੇ "ਇਸ ਸਟ੍ਰੀਮ ਨੂੰ ਚਲਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ" + +ਅਤੇ ਹੋਰ diff --git a/fastlane/metadata/android/pa/changelogs/951.txt b/fastlane/metadata/android/pa/changelogs/951.txt index 2b1cd7933..f4dd14071 100644 --- a/fastlane/metadata/android/pa/changelogs/951.txt +++ b/fastlane/metadata/android/pa/changelogs/951.txt @@ -1,13 +1,13 @@ -ਨਵਾਂ -• ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਗਾਹਕੀ ਚੋਣਕਾਰ ਲਈ ਖੋਜ ਸ਼ਾਮਲ ਕਰੋ -• ਸਿਰਫ਼ ਗੈਰ-ਗਰੁੱਪ ਕੀਤੀਆਂ ਗਾਹਕੀਆਂ ਨੂੰ ਦਿਖਾਉਣ ਲਈ ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਫਿਲਟਰ ਸ਼ਾਮਲ ਕਰੋ -• ਪਲੇਲਿਸਟ ਟੈਬ ਨੂੰ ਮੁੱਖ ਪੰਨੇ 'ਤੇ ਸ਼ਾਮਲ ਕਰੋ -• ਬੈਕਗ੍ਰਾਊਂਡ/ਪੌਪ-ਅੱਪ ਪਲੇਅਰ ਕਤਾਰ ਵਿੱਚ ਤੇਜ਼ੀ ਨਾਲ ਅੱਗੇ/ਰਿਵਾਈਂਡ ਕਰੋ -• ਖੋਜ ਸੁਝਾਅ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ: ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਹੈ ਅਤੇ ਇਸ ਲਈ ਨਤੀਜਾ ਦਿਖਾ ਰਿਹਾ ਹੈ -ਸੁਧਾਰ -• ਮਿਕਸਡ ਫਾਈਲਾਂ ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨ ਮੈਟਾਡੇਟਾ ਲਿਖਣਾ ਛੱਡੋ • ਕਤਾਰ ਤੋਂ ਅਸਫਲ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਨਾ ਹਟਾਓ -• ਟੂਲਬਾਰ ਦੇ ਰੰਗ ਨਾਲ ਮੇਲ ਕਰਨ ਲਈ ਸਥਿਤੀ ਪੱਟੀ ਦਾ ਰੰਗ ਅੱਪਡੇਟ ਕਰੋ +ਨਵਾਂ +• ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਚੋਣਕਾਰ ਲਈ ਖੋਜ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ +• ਸਿਰਫ਼ ਅਣ-ਗਰੁੱਪ ਕੀਤੀਆਂ ਗਾਹਕੀਆਂ ਦਿਖਾਉਣ ਲਈ ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਇੱਕ ਫਿਲਟਰ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ +• ਮੁੱਖ ਪੰਨੇ 'ਤੇ ਇੱਕ ਪਲੇਲਿਸਟ ਟੈਬ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ -ਠੀਕ ਕੀਤਾ -• ਫਲੋਟਿੰਗ ਪੁਆਇੰਟ ਸੰਚਤ ਤਰੁੱਟੀਆਂ ਦੇ ਕਾਰਨ ਫਿਕਸਡ ਆਡੀਓ/ਵੀਡੀਓ ਡੀਸਿੰਕ -• [PeerTube] ਮਿਟਾਈਆਂ ਗਈਆਂ ਟਿੱਪਣੀਆਂ ਨੂੰ ਸੰਭਾਲੋ ਅਤੇ ਹੋਰ +ਸੁਧਾਰਿਆ ਗਿਆ +• ਮਕਸਡ ਫਾਈਲਾਂ ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨ ਮੈਟਾਡੇਟਾ ਲਿਖਣਾ ਬੰਦ ਕੀਤਾ ਗਿਆ +• ਕਤਾਰ ਤੋਂ ਅਸਫਲ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਨਾ ਹਟਾਓ + +ਠੀਕ ਕੀਤਾ ਗਿਆ +• ਫਲੋਟਿੰਗ ਪੁਆਇੰਟ ਸੰਚਤ ਗਲਤੀਆਂ ਕਾਰਨ ਆਡੀਓ/ਵੀਡੀਓ ਡੀਸਿੰਕ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ + +ਅਤੇ ਹੋਰ diff --git a/fastlane/metadata/android/pa/changelogs/954.txt b/fastlane/metadata/android/pa/changelogs/954.txt index 3eb8dd68b..b5b0e78d8 100644 --- a/fastlane/metadata/android/pa/changelogs/954.txt +++ b/fastlane/metadata/android/pa/changelogs/954.txt @@ -1,8 +1,9 @@ -• ਨਵਾਂ ਐਪਲੀਕੇਸ਼ਨ ਵਰਕਫਲੋ: ਵੇਰਵੇ ਵਾਲੇ ਪੰਨੇ 'ਤੇ ਵੀਡੀਓ ਚਲਾਓ, ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰਨ ਲਈ ਹੇਠਾਂ ਵੱਲ ਸਵਾਈਪ ਕਰੋ -• ਮੀਡੀਆ ਸਟਾਈਲ ਸੂਚਨਾਵਾਂ: ਸੂਚਨਾਵਾਂ ਵਿੱਚ ਅਨੁਕੂਲਿਤ ਕਾਰਵਾਈਆਂ, ਪ੍ਰਦਰਸ਼ਨ ਸੁਧਾਰ -• ਡੈਸਕਟੌਪ ਐਪ ਦੇ ਤੌਰ 'ਤੇ NewPipe ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਮੂਲ ਰੀਸਾਈਜ਼ ਕਰਨਾ +• ਨਵਾਂ ਐਪ ਵਰਕਫਲੋ: ਵੇਰਵੇ ਵਾਲੇ ਪੰਨੇ 'ਤੇ ਵੀਡੀਓ ਚਲਾਓ, ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰਨ ਲਈ ਹੇਠਾਂ ਵੱਲ ਸਵਾਈਪ ਕਰੋ +• ਮੀਡੀਆਸਟਾਈਲ ਸੂਚਨਾਵਾਂ: ਸੂਚਨਾਵਾਂ ਵਿੱਚ ਅਨੁਕੂਲਿਤ ਕਾਰਵਾਈਆਂ, ਪ੍ਰਦਰਸ਼ਨ ਸੁਧਾਰ +• ਡੈਸਕਟੌਪ ਐਪ ਦੇ ਤੌਰ 'ਤੇ NewPipe ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਮੂਲ ਆਕਾਰ ਬਦਲਣਾ -• ਇੱਕ ਅਸਮਰਥਿਤ URL ਟੋਸਟ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਖੁੱਲੇ ਵਿਕਲਪਾਂ ਨਾਲ ਡਾਇਲਾਗ ਦਿਖਾਓ -• ਜਦੋਂ ਰਿਮੋਟ ਨੂੰ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਤਾਂ ਖੋਜ ਸੁਝਾਅ ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਓ -• ਡਿਫ਼ਾਲਟ ਵੀਡੀਓ ਗੁਣਵੱਤਾ ਨੂੰ 720p60 (ਇਨ-ਐਪ ਪਲੇਅਰ) ਅਤੇ 480p (ਪੌਪ-ਅੱਪ ਪਲੇਅਰ) ਤੱਕ ਵਧਾ ਦਿੱਤਾ ਗਿਆ ਹੈ -• ਬਹੁਤ ਸਾਰੇ ਬੱਗ ਫਿਕਸ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ +• ਇੱਕ ਅਸਮਰਥਿਤ URL ਟੋਸਟ ਦੀ ਸਥਿਤੀ ਵਿੱਚ ਖੁੱਲ੍ਹੇ ਵਿਕਲਪਾਂ ਦੇ ਨਾਲ ਇੱਕ ਡਾਇਲਾਗ ਦਿਖਾਓ +• ਰਿਮੋਟ ਸੁਝਾਅ ਉਪਲਬਧ ਨਾ ਹੋਣ 'ਤੇ ਸੁਧਾਰਾਂ ਦਾ ਅਨੁਭਵ ਕਰੋ +• ਡਿਫੌਲਟ ਵੀਡੀਓ ਗੁਣਵੱਤਾ 720p60 (ਇਨ-ਐਪ ਪਲੇਅਰ) ਅਤੇ 480p (ਪੌਪ-ਅੱਪ ਪਲੇਅਰ) ਤੱਕ ਵਧਾ ਦਿੱਤੀ ਗਈ + +• ਬੱਗ ਫਿਕਸ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ diff --git a/fastlane/metadata/android/pa/changelogs/957.txt b/fastlane/metadata/android/pa/changelogs/957.txt index eb66dacbc..2cf56525d 100644 --- a/fastlane/metadata/android/pa/changelogs/957.txt +++ b/fastlane/metadata/android/pa/changelogs/957.txt @@ -1,10 +1,7 @@ -• ਖਾਸ ਐਨਕਿਊ ਕਿਰਿਆਵਾਂ ਨੂੰ ਇੱਕ ਵਿੱਚ ਜੋੜੋ -• ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ ਦੋ ਉਂਗਲਾਂ ਦੇ ਸੰਕੇਤ -• reCAPTCHA ਕੂਕੀਜ਼ ਨੂੰ ਕਲੀਅਰ ਕਰਨ ਦਿਓ -• ਨੋਟੀਫਿਕੇਸ਼ਨ ਨੂੰ ਰੰਗ ਨਾ ਕਰਨ ਦਾ ਵਿਕਲਪ -• ਅਨੰਤ ਬਫਰਿੰਗ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਵਿਡੀਓ ਵੇਰਵਿਆਂ ਨੂੰ ਕਿਵੇਂ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਇਸ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ, ਨਿਊਪਾਈਪ ਨਾਲ ਸਾਂਝਾ ਕਰਨ ਵੇਲੇ ਬੱਗੀ ਵਿਵਹਾਰ ਅਤੇ ਹੋਰ ਅਸੰਗਤਤਾਵਾਂ -• YouTube ਵੀਡੀਓਜ਼ ਦੀ ਗਤੀ ਵਧਾਓ ਅਤੇ ਉਮਰ ਪ੍ਰਤੀਬੰਧਿਤ ਵੀਡੀਓ ਨੂੰ ਠੀਕ ਕਰੋ -• ਫਾਸਟ ਫਾਰਵਰਡ/ਰਿਵਾਇੰਡ 'ਤੇ ਕਰੈਸ਼ ਨੂੰ ਠੀਕ ਕਰੋ -• ਥੰਬਨੇਲ ਖਿੱਚ ਕੇ ਸੂਚੀਆਂ ਨੂੰ ਮੁੜ ਵਿਵਸਥਿਤ ਨਾ ਕਰੋ -• ਪੌਪਅੱਪ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਹਮੇਸ਼ਾ ਯਾਦ ਰੱਖੋ -• ਸੰਤਾਲੀ ਭਾਸ਼ਾ ਸ਼ਾਮਲ ਕਰੋ +• ਖਾਸ NQE ਕਿਰਿਆਵਾਂ ਨੂੰ ਇੱਕ ਵਿੱਚ ਏਕੀਕ੍ਰਿਤ ਕਰਨਾ। +• ਦੋ-ਉਂਗਲਾਂ ਵਾਲੇ ਇਸ਼ਾਰੇ ਨਾਲ ਵੀਡੀਓ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨਾ। +• reCOPTCHA ਕੂਕੀਜ਼ ਨੂੰ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦੇਣਾ। +• ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੰਗੀਨ ਨਾ ਕਰਨ ਦਾ ਵਿਕਲਪ। +• NewPipe 'ਤੇ ਸਾਂਝਾ ਕਰਦੇ ਸਮੇਂ ਅਨੰਤ ਬਫਰਿੰਗ, ਗਲਤੀਆਂ ਅਤੇ ਹੋਰ ਅਸੰਗਤੀਆਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ। +• YouTube ਵੀਡੀਓ ਨੂੰ ਤੇਜ਼ ਕੀਤਾ ਗਿਆ ਅਤੇ ਉਮਰ-ਪ੍ਰਤੀਬੰਧਿਤ ਵੀਡੀਓ ਨੂੰ ਬਿਹਤਰ ਬਣਾਇਆ ਗਿਆ। +• ਫਾਸਟ ਫਾਰਵਰਡ/ਰਿਵਾਈਂਡ 'ਤੇ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/964.txt b/fastlane/metadata/android/pa/changelogs/964.txt index 85dc2c151..e94595673 100644 --- a/fastlane/metadata/android/pa/changelogs/964.txt +++ b/fastlane/metadata/android/pa/changelogs/964.txt @@ -1 +1,6 @@ -• ਪਲੇਅਰ ਨਿਯੰਤਰਣ ਵਿੱਚ ਅਧਿਆਵਾਂ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ • [PeerTube] ਸੇਪੀਆ ਖੋਜ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਵੀਡੀਓ ਵੇਰਵੇ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਸ਼ੇਅਰ ਬਟਨ ਨੂੰ ਮੁੜ-ਜੋੜਿਆ ਗਿਆ ਅਤੇ ਟੈਬ ਲੇਆਉਟ ਵਿੱਚ ਸਟ੍ਰੀਮ ਵਰਣਨ ਨੂੰ ਤਬਦੀਲ ਕੀਤਾ ਗਿਆ • ਜੇਕਰ ਚਮਕ ਦਾ ਸੰਕੇਤ ਅਸਮਰੱਥ ਹੈ ਤਾਂ ਚਮਕ ਨੂੰ ਬਹਾਲ ਕਰਨਾ ਬੰਦ ਕਰੋ • ਕੋਡੀ 'ਤੇ ਵੀਡੀਓ ਚਲਾਉਣ ਲਈ ਸੂਚੀ ਆਈਟਮ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਕੁਝ ਡਿਵਾਈਸਾਂ 'ਤੇ ਕੋਈ ਡਿਫੌਲਟ ਬ੍ਰਾਊਜ਼ਰ ਸੈੱਟ ਨਾ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਦਾ ਹੱਲ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਸ਼ੇਅਰ ਡਾਇਲਾਗਸ ਨੂੰ ਬਿਹਤਰ ਬਣਾਓ • ਫੁੱਲਸਕ੍ਰੀਨ ਪਲੇਅਰ ਵਿੱਚ ਹਾਰਡਵੇਅਰ ਸਪੇਸ ਬਟਨ ਨਾਲ ਪਲੇ/ਪੌਜ਼ ਨੂੰ ਟੌਗਲ ਕਰੋ • [media.ccc.de] ਕਈ ਫਿਕਸ ਅਤੇ ਸੁਧਾਰ +• ਪਲੇਅਰ ਕੰਟਰੋਲਾਂ ਵਿੱਚ ਚੈਪਟਰਾਂ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ +• [PeerTube] ਸੇਪੀਆ ਖੋਜ ਜੋੜਿਆ ਗਿਆ +• ਵੀਡੀਓ ਵੇਰਵੇ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਸ਼ੇਅਰ ਬਟਨ ਨੂੰ ਦੁਬਾਰਾ ਜੋੜਿਆ ਗਿਆ ਅਤੇ ਸਟ੍ਰੀਮ ਵਰਣਨ ਨੂੰ ਟੈਬ ਲੇਆਉਟ ਵਿੱਚ ਤਬਦੀਲ ਕੀਤਾ ਗਿਆ +• ਜੇਕਰ ਚਮਕ ਸੰਕੇਤ ਅਯੋਗ ਹੈ ਤਾਂ ਚਮਕ ਨੂੰ ਬਹਾਲ ਕਰਨਾ ਅਯੋਗ ਕਰੋ +• ਕੋਡੀ 'ਤੇ ਵੀਡੀਓ ਚਲਾਉਣ ਲਈ ਸੂਚੀ ਆਈਟਮ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ +• ਕੁਝ ਡਿਵਾਈਸਾਂ 'ਤੇ ਕੋਈ ਡਿਫੌਲਟ ਬ੍ਰਾਊਜ਼ਰ ਸੈੱਟ ਨਾ ਹੋਣ 'ਤੇ ਕਰੈਸ਼ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/975.txt b/fastlane/metadata/android/pa/changelogs/975.txt index c866df1e2..fe23991c7 100644 --- a/fastlane/metadata/android/pa/changelogs/975.txt +++ b/fastlane/metadata/android/pa/changelogs/975.txt @@ -3,14 +3,11 @@ • ਅਯੋਗ ਟਿੱਪਣੀਆਂ ਦਾ ਪਤਾ ਲਗਾਓ • ਫੀਡ ਆਈਟਮ ਨੂੰ ਦੇਖੇ ਗਏ ਵਜੋਂ ਨਿਸ਼ਾਨਬੱਧ ਕਰਨ ਦਿਓ • ਟਿੱਪਣੀ ਦਿਲ ਦਿਖਾਓ - ਸੁਧਾਰ • ਮੈਟਾਡੇਟਾ ਅਤੇ ਟੈਗਸ ਲੇਆਉਟ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ • UI ਭਾਗਾਂ 'ਤੇ ਸੇਵਾ ਰੰਗ ਲਾਗੂ ਕਰੋ ਠੀਕ ਕੀਤਾ • ਮਿੰਨੀ ਪਲੇਅਰ ਵਿੱਚ ਥੰਬਨੇਲ ਠੀਕ ਕਰੋ • ਡੁਪਲੀਕੇਟ ਕਤਾਰ ਆਈਟਮਾਂ 'ਤੇ ਬੇਅੰਤ ਬਫਰਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ -• ਕੁਝ ਪਲੇਅਰ ਫਿਕਸ ਜਿਵੇਂ ਰੋਟੇਸ਼ਨ ਅਤੇ ਤੇਜ਼ੀ ਨਾਲ ਬੰਦ ਹੋਣਾ -• ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਲੋਡ ਕੀਤੇ ਬਾਕੀ ਬਚੇ ReCAPTCHA ਨੂੰ ਠੀਕ ਕਰੋ -• ਫੀਡ ਨੂੰ ਤਾਜ਼ਾ ਕਰਨ ਵੇਲੇ ਕਲਿੱਕਾਂ ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ +• ਕੁਝ ਪਲੇਅਰ ਫਿਕਸ • ਕੁਝ ਡਾਊਨਲੋਡਰ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/976.txt b/fastlane/metadata/android/pa/changelogs/976.txt index a1a1354ca..1f2a70887 100644 --- a/fastlane/metadata/android/pa/changelogs/976.txt +++ b/fastlane/metadata/android/pa/changelogs/976.txt @@ -1,10 +1 @@ -• ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਿੱਚ ਪਲੇਅਰ ਨੂੰ ਸਿੱਧਾ ਖੋਲ੍ਹਣ ਲਈ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ -• ਇਹ ਚੁਣਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ ਕਿ ਕਿਸ ਕਿਸਮ ਦੇ ਖੋਜ ਸੁਝਾਅ ਦਿਖਾਉਣੇ ਹਨ -• ਗੂੜ੍ਹਾ ਥੀਮ ਹੁਣ ਗਹਿਰਾ ਗੂੜ੍ਹਾ + ਗੂੜ੍ਹਾ ਸਪਲੈਸ਼ ਸਕ੍ਰੀਨ ਜੋੜਿਆ ਗਿਆ ਹੈ -• ਅਣਚਾਹੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਸਲੇਟੀ ਕਰਨ ਲਈ ਬਿਹਤਰ ਫ਼ਾਈਲ ਚੋਣਕਾਰ -• ਸਥਿਰ YouTube ਗਾਹਕੀ ਆਯਾਤ - -• ਇੱਕ ਸਟ੍ਰੀਮ ਨੂੰ ਮੁੜ ਚਲਾਉਣ ਲਈ ਮੁੜ-ਪਲੇਅ ਬਟਨ 'ਤੇ ਟੈਪ ਕਰਨ ਦੀ ਲੋੜ ਹੈ -• ਸਥਿਰ ਸਮਾਪਤੀ ਆਡੀਓ ਸੈਸ਼ਨ -• [Android TV] DPad ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਸਥਿਰ ਲੰਬੀ ਸੀਕਬਾਰ ਜੰਪ -ਹੋਰ ਤਬਦੀਲੀਆਂ ਦੇਖਣ ਲਈ, ਹੇਠਾਂ ਦਿੱਤੇ ਲਿੰਕ ਟੈਬ ਤੋਂ ਚੇਂਜਲੌਗ (ਅਤੇ ਬਲੌਗ ਪੋਸਟ) ਦੇਖੋ। +• ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਿੱਚ ਪਲੇਅਰ ਨੂੰ ਸਿੱਧਾ ਖੋਲ੍ਹਣ ਲਈ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਇਹ ਚੁਣਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ ਕਿ ਕਿਸ ਕਿਸਮ ਦੇ ਖੋਜ ਸੁਝਾਅ ਦਿਖਾਉਣੇ ਹਨ • ਗੂੜ੍ਹਾ ਥੀਮ ਹੁਣ ਗੂੜ੍ਹਾ + ਗੂੜ੍ਹਾ ਸਪਲੈਸ਼ ਸਕ੍ਰੀਨ ਜੋੜਿਆ ਗਿਆ ਹੈ • ਅਣਚਾਹੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਸਲੇਟੀ ਕਰਨ ਲਈ ਬਿਹਤਰ ਫ਼ਾਈਲ ਚੋਣਕਾਰ • ਸਥਿਰ YouTube ਗਾਹਕੀ ਆਯਾਤ • ਇੱਕ ਸਟ੍ਰੀਮ ਨੂੰ ਮੁੜ ਚਲਾਉਣ ਲਈ ਮੁੜ-ਪਲੇਅ ਬਟਨ 'ਤੇ ਟੈਪ ਕਰਨ ਦੀ ਲੋੜ ਹੈ • ਸਥਿਰ ਸਮਾਪਤੀ ਆਡੀਓ ਸੈਸ਼ਨ • [Android TV] DPad ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਸਥਿਰ ਲੰਬੀ ਸੀਕਬਾਰ ਜੰਪ ਹੋਰ ਤਬਦੀਲੀਆਂ ਦੇਖਣ ਲਈ, ਹੇਠਾਂ ਦਿੱਤੇ ਲਿੰਕ ਟੈਬ ਤੋਂ ਚੇਂਜਲੌਗ (ਅਤੇ ਬਲੌਗ ਪੋਸਟ) ਦੇਖੋ। diff --git a/fastlane/metadata/android/pa/changelogs/986.txt b/fastlane/metadata/android/pa/changelogs/986.txt index b072d6cb9..3766ca8d1 100644 --- a/fastlane/metadata/android/pa/changelogs/986.txt +++ b/fastlane/metadata/android/pa/changelogs/986.txt @@ -1,15 +1,15 @@ ਨਵਾਂ -• ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਲਈ ਸੂਚਨਾਵਾਂ -• ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਵੀਡੀਓ ਪਲੇਅਰਾਂ ਵਿਚਕਾਰ ਅਰਾਮ ਨਾਲ ਤਬਦੀਲੀ -• ਸੈਮੀਟੋਨਸ ਦੁਆਰਾ ਪਿੱਚ ਬਦਲੋ -• ਇੱਕ ਪਲੇਲਿਸਟ ਵਿੱਚ ਮੁੱਖ ਪਲੇਅਰ ਕਤਾਰ ਜੋੜੋ +• ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਲਈ ਸੂਚਨਾਵਾਂ +• ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਵੀਡੀਓ ਪਲੇਅਰਾਂ ਵਿਚਕਾਰ ਅਰਾਮ ਨਾਲ ਤਬਦੀਲੀ +• ਸੈਮੀਟੋਨਸ ਦੁਆਰਾ ਪਿੱਚ ਬਦਲੋ +• ਇੱਕ ਪਲੇਲਿਸਟ ਵਿੱਚ ਮੁੱਖ ਪਲੇਅਰ ਕਤਾਰ ਜੋੜੋ ਸੁਧਾਰ -• ਸਪੀਡ/ਪਿਚ ਸਟੈਪ ਦਾ ਆਕਾਰ ਯਾਦ ਰੱਖੋ -• ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ ਸ਼ੁਰੂਆਤੀ ਲੰਬੇ ਬਫਰਿੰਗ ਨੂੰ ਘੱਟ ਕਰੋ • Android TV ਲਈ ਪਲੇਅਰ UI ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ +• ਸਪੀਡ/ਪਿਚ ਸਟੈਪ ਦਾ ਆਕਾਰ ਯਾਦ ਰੱਖੋ +• ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ ਸ਼ੁਰੂਆਤੀ ਲੰਬੇ ਬਫਰਿੰਗ ਨੂੰ ਘੱਟ ਕਰੋ +• Android TV ਲਈ ਪਲੇਅਰ UI ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ • ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁਸ਼ਟੀ ਕਰੋ -ਠੀਕ ਕੀਤਾ -• ਮੀਡੀਆ ਬਟਨ ਨੂੰ ਫਿਕਸ ਕਰੋ ਜੋ ਪਲੇਅਰ ਨਿਯੰਤਰਣਾਂ ਨੂੰ ਨਹੀਂ ਲੁਕਾਉਂਦਾ ਹੈ +ਫਿਕਸਡ +• ਮੀਡੀਆ ਬਟਨ ਨੂੰ ਫਿਕਸ ਕਰੋ ਜੋ ਪਲੇਅਰ ਨਿਯੰਤਰਣਾਂ ਨੂੰ ਨਹੀਂ ਲੁਕਾਉਂਦਾ ਹੈ • ਪਲੇਅਰ ਦੀ ਕਿਸਮ ਬਦਲਣ 'ਤੇ ਪਲੇਬੈਕ ਰੀਸੈਟ ਨੂੰ ਠੀਕ ਕਰੋ -• ਪਲੇਲਿਸਟ ਡਾਇਲਾਗ ਨੂੰ ਘੁੰਮਾਉਣ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/987.txt b/fastlane/metadata/android/pa/changelogs/987.txt index 93fc77a77..52d0bb828 100644 --- a/fastlane/metadata/android/pa/changelogs/987.txt +++ b/fastlane/metadata/android/pa/changelogs/987.txt @@ -6,6 +6,4 @@ ਸੁਧਾਰ • ਪਲੇਬੈਕ ਪੈਰਾਮੀਟਰ ਡਾਇਲਾਗ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ • ਗਾਹਕੀ ਆਯਾਤ/ਨਿਰਯਾਤ ਬਟਨਾਂ ਨੂੰ ਤਿੰਨ-ਬਿੰਦੀਆਂ ਵਾਲੇ ਮੀਨੂ ਵਿੱਚ ਲੈ ਜਾਓ - -ਠੀਕ ਕੀਤਾ -• ਪਲੇਲਿਸਟ ਤੋਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਨੂੰ ਹਟਾਉਣਾ ਠੀਕ ਕਰੋ • ਸ਼ੇਅਰ ਮੀਨੂ ਥੀਮ ਅਤੇ "ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" ਐਂਟਰੀ ਨੂੰ ਠੀਕ ਕਰੋ +ਠੀਕ ਕੀਤਾ diff --git a/fastlane/metadata/android/pa/changelogs/990.txt b/fastlane/metadata/android/pa/changelogs/990.txt index bd532ecb0..90cd8b35c 100644 --- a/fastlane/metadata/android/pa/changelogs/990.txt +++ b/fastlane/metadata/android/pa/changelogs/990.txt @@ -1,13 +1,10 @@ -ਇਹ ਰੀਲੀਜ਼ Android 4.4 ਕਿਟਕੈਟ ਲਈ ਸਮਰਥਨ ਛੱਡਦੀ ਹੈ, ਹੁਣ ਘੱਟੋ-ਘੱਟ ਸੰਸਕਰਣ Android 5 Lollipop ਹੈ! -ਨਵਾਂ -• ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਵਾਲੇ ਮੀਨੂ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ -• ਫੀਡ ਵਿੱਚ ਭਵਿੱਖ ਦੇ ਵੀਡੀਓ ਲੁਕਾਓ -• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ -ਸੁਧਾਰ -• ਪਲੇਅਰ ਕੋਡ ਨੂੰ ਛੋਟੇ ਹਿੱਸਿਆਂ ਵਿੱਚ ਰੀਫੈਕਟਰ ਕਰੋ: ਘੱਟ RAM ਵਰਤੀ ਗਈ, ਘੱਟ ਬੱਗ -• ਥੰਮਨੇਲ ਦੇ ਸਕੇਲ ਮੋਡ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ -• ਚਿੱਤਰ ਪਲੇਸਹੋਲਡਰ ਨੂੰ ਵੈਕਟਰਾਈਜ਼ ਕਰੋ - -ਠੀਕ ਕੀਤਾ -• ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਾਲ ਵੱਖ-ਵੱਖ ਮੁੱਦਿਆਂ ਨੂੰ ਹੱਲ ਕਰੋ: ਪੁਰਾਣੀ/ਗੁੰਮ ਮੀਡੀਆ ਜਾਣਕਾਰੀ, ਵਿਗੜਿਆ ਥੰਮਨੇਲ +ਇਹ ਰਿਲੀਜ਼ Android 4.4 ਕਿਟਕੈਟ ਲਈ ਸਮਰਥਨ ਛੱਡਦੀ ਹੈ, ਹੁਣ ਘੱਟੋ-ਘੱਟ ਸੰਸਕਰਣ Android 5 Lollipop ਹੈ! +ਨਵਾਂ +• ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਵਾਲੇ ਮੀਨੂ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ +• ਫੀਡ ਵਿੱਚ ਭਵਿੱਖ ਦੇ ਵੀਡੀਓ ਲੁਕਾਓ +• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ +ਸੁਧਾਰ +• ਪਲੇਅਰ ਕੋਡ ਨੂੰ ਛੋਟੇ ਹਿੱਸਿਆਂ ਵਿੱਚ ਰੀਫੈਕਟਰ ਕਰੋ: ਘੱਟ RAM ਵਰਤੇਗੀ, ਘੱਟ ਬੱਗ ਹੋਣਗੇ + +ਠੀਕ ਕੀਤਾ • ਪੂਰੀ ਸਕ੍ਰੀਨ ਦੀ ਥਾਂ ਉਸਦੇ 1/4 ਹਿੱਸੇ ਦੀ ਵਰਤੋਂ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/995.txt b/fastlane/metadata/android/pa/changelogs/995.txt index 0da0a4261..dc9c576c9 100644 --- a/fastlane/metadata/android/pa/changelogs/995.txt +++ b/fastlane/metadata/android/pa/changelogs/995.txt @@ -5,12 +5,10 @@ ਸੁਧਾਰ • ਪਲੇਅਰ ਇੰਟਰਫੇਸ ਦੀ ਪਹੁੰਚਯੋਗਤਾ -• ਸਿਰਫ਼-ਵੀਡੀਓ ਡਾਊਨਲੋਡਾਂ ਲਈ ਬਿਹਤਰ ਆਡੀਓ ਚੋਣ -• ਸਾਂਝੀ ਕੀਤੀ ਪਲੇਲਿਸਟ ਸਮੱਗਰੀ ਵਿੱਚ ਪਲੇਲਿਸਟ ਅਤੇ ਵੀਡੀਓ ਨਾਮ ਸ਼ਾਮਲ ਕਰਨ ਦਾ ਵਿਕਲਪ +• ਪਲੇਲਿਸਟ ਸ਼ੇਅਰਿੰਗ ਸਮੱਗਰੀ ਵਿੱਚ ਪਲੇਲਿਸਟ ਨਾਮ ਅਤੇ ਵੀਡੀਓ ਨਾਮ ਜੋੜਨ ਲਈ ਵਿਕਲਪ +• ਅੰਦਰੂਨੀ ਸੁਧਾਰ ਅਤੇ ਨਿਰਭਰਤਾ ਅੱਪਡੇਟ ਠੀਕ ਕੀਤੇ -• [ਯੂਟਿਊਬ] ਲਾਈਕ ਗਿਣਤੀ ਨੂੰ ਠੀਕ ਕਰੋ -• ਪਲੇਅਰ ਰਿਸਪੌੰਡ ਨਹੀਂ ਕਰ ਰਿਹਾ ਦੇ ਸੁਨੇਹੇ ਦੇਣ ਵਾਲੇ ਪੌਪਅੱਪ ਅਤੇ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ • ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਵਿੱਚ ਗਲਤ ਭਾਸ਼ਾਵਾਂ ਦੀ ਚੋਣ • ਪਲੇਅਰ ਆਡੀਓ ਫੋਕਸ ਮਿਊਟ ਦਾ ਆਦਰ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ -• ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ ਆਈਟਮਾਂ ਨੂੰ ਜੋੜਨਾ ਕਦੇ-ਕਦਾਈਂ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ +• ਖਾਸ ਮਾਮਲਿਆਂ ਵਿੱਚ ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ ਆਈਟਮਾਂ ਨੂੰ ਜੋੜਨਾ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ diff --git a/fastlane/metadata/android/pa/changelogs/997.txt b/fastlane/metadata/android/pa/changelogs/997.txt index 8e0cb85f2..a33ff32af 100644 --- a/fastlane/metadata/android/pa/changelogs/997.txt +++ b/fastlane/metadata/android/pa/changelogs/997.txt @@ -12,6 +12,4 @@ ਠੀਕ ਕੀਤਾ • [ਯੂਟਿਊਬ] ਲੋਡ ਨਾ ਹੋਣ ਵਾਲੀਆਂ ਟਿੱਪਣੀਆਂ ਨੂੰ ਠੀਕ ਕਰੋ, ਨਾਲ ਹੀ ਹੋਰ ਫਿਕਸ ਅਤੇ ਸੁਧਾਰ -• ਸੈਟਿੰਗਾਂ ਆਯਾਤ ਕਰਨ ਵਿੱਚ ਕਮਜ਼ੋਰੀ ਨੂੰ ਹੱਲ ਕਰੋ ਅਤੇ JSON 'ਤੇ ਸਵਿੱਚ ਕਰੋ • ਕਈ ਡਾਊਨਲੋਡ ਫਿਕਸ -• ਖੋਜ ਟੈਕਸਟ ਨੂੰ ਟਰਿੱਮ ਕਰੋ diff --git a/fastlane/metadata/android/sat/short_description.txt b/fastlane/metadata/android/sat/short_description.txt new file mode 100644 index 000000000..9e7874738 --- /dev/null +++ b/fastlane/metadata/android/sat/short_description.txt @@ -0,0 +1 @@ +ᱮᱱᱰᱨᱳᱭᱮᱰ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱫ ᱯᱷᱨᱤ ᱦᱟᱞᱠᱟ ᱚᱡᱚᱱ ᱭᱩᱴᱭᱩᱵᱽ ᱯᱷᱨᱚᱱᱴᱮᱱᱰ ᱾ diff --git a/fastlane/metadata/android/sk/changelogs/1005.txt b/fastlane/metadata/android/sk/changelogs/1005.txt index 8f2bfbfab..2bfdfca0e 100644 --- a/fastlane/metadata/android/sk/changelogs/1005.txt +++ b/fastlane/metadata/android/sk/changelogs/1005.txt @@ -1,18 +1,17 @@ -Novinky -• Pridaná podpora pre Android Auto -• Možnosť nastaviť skupiny kanálov ako hlavné karty na obrazovke -• [YouTube] Zdieľanie ako dočasný playlist +New +• Add support for Android Auto +• Allow setting feed groups as main screen tabs +• [YouTube] Share as temporary playlist +• [SoundCloud] Likes channel tab -• [SoundCloud] Karta „Páči sa“ kanál. +Improved +• Better search bar hints +• Show download date in Downloads +• Use Android 13 per-app language -Vylepšenia -• Lepšia nápoveda v paneli vyhľadávania -• Zobrazenie dátumu stiahnutia v sekcii „Stiahnuté” -• Použitie jazyka Android 13 pre jednotlivé aplikácie - -Opravy -• Oprava chybných farieb textu v tmavom režime -• [YouTube] Oprava playlistov, ktoré nenačítavajú viac ako 100 položiek -• [YouTube] Oprava chýbajúcich odporúčaných videí -• Oprava pádov v zobrazení zoznamu histórie -• Oprava časových značiek v odpovediach na komentáre. +Fixed +• Fix broken text colors in dark mode +• [YouTube] Fix playlists not loading more than 100 items +• [YouTube] Fix missing recommended videos +• Fix crashes in History list view +• Fix timestamps in comment replies diff --git a/fastlane/metadata/android/sk/changelogs/1006.txt b/fastlane/metadata/android/sk/changelogs/1006.txt index 943b4ff5c..6bc6f9a2b 100644 --- a/fastlane/metadata/android/sk/changelogs/1006.txt +++ b/fastlane/metadata/android/sk/changelogs/1006.txt @@ -1,16 +1,16 @@ -# Vylepšené -Aktuálny prehrávač zostane zachovaný pri kliknutí na časové značky -Ak je to možné, pokúsi sa obnoviť čakajúce úlohy sťahovania -Pridaná možnosť odstrániť sťahovanie bez odstránenia súboru -Oprávnenie zobrazenia cez ostatné aplikácie: zobrazí vysvetlenie pre Android > R -Podpora otvárania odkazov on.soundcloud -Množstvo malých vylepšení a optimalizácií +# Improved +Keep current player when clicking on timestamps +Try to recover pending download missions when possible +Add option to delete a download without also deleting file +Overlay Permission: display explanatory dialog for Android > R +Support on.soundcloud link opening +A lot of small improvements and optimizations -# Opravené -Oprava formátovania krátkeho počítania pre verzie Androidu nižšie ako 7 -Oprava klamných oznámení -Oprava súborov titulkov SRT -Oprava množstva zlyhaní +# Fixed +Fix short count formatting for Android versions below 7 +Fix ghost notifications +Fixes for SRT subtitle files +Fixed tons of crashes -# Vývoj -Modernizácia interného kódu +# Development +Internal code modernization diff --git a/fastlane/metadata/android/sk/changelogs/65.txt b/fastlane/metadata/android/sk/changelogs/65.txt index c7cac2626..8570a056a 100644 --- a/fastlane/metadata/android/sk/changelogs/65.txt +++ b/fastlane/metadata/android/sk/changelogs/65.txt @@ -1,26 +1,26 @@ -### Zlepšenia +### Improvements -- Zakázanie animácie ikony burgermenu #1486 -- Zrušenie odstránenia stiahnutých súborov #1472 -- Možnosť sťahovania v ponuke zdieľania #1498 -- Pridaná možnosť zdieľania do ponuky dlhého ťuknutia #1454 -- Minimalizácia hlavného prehrávača pri ukončení #1354 -- Aktualizácia verzie knižnice a oprava zálohovania databázy #1510 -- Aktualizácia ExoPlayer 2.8.2 #1392 - - Prepracované dialógové okno na ovládanie rýchlosti prehrávania tak, aby podporovalo rôzne veľkosti krokov pre rýchlejšiu zmenu rýchlosti. - - Pridaný prepínač na rýchle prevíjanie dopredu počas ticha v ovládaní rýchlosti prehrávania. Toto by malo byť užitočné pre audioknihy a niektoré hudobné žánre a môže priniesť skutočne plynulý zážitok (a môže prerušiť skladbu s množstvom ticha =\). - - Prepracované rozlíšenie zdrojov médií, aby bolo možné odovzdávať metadáta spolu s médiami interne v prehrávači, namiesto toho, aby sa to robilo ručne. Teraz máme jediný zdroj metadát a je priamo k dispozícii pri spustení prehrávania. - - Opravené neaktualizovanie metadát vzdialeného zoznamu skladieb, keď sú k dispozícii nové metadáta pri otvorení fragmentu zoznamu skladieb. - - Rôzne opravy používateľského rozhrania: #1383, ovládacie prvky oznámenia prehrávača na pozadí sú teraz vždy biele, jednoduchšie vypnutie vyskakovacieho prehrávača prostredníctvom hodenia -- Použitie nového extraktora s preformulovanou architektúrou pre multiservis +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). + - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. + - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. + - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging +- Use new extractor with refactored architecture for multiservice -### Opravy +### Fixes -- Oprava #1440 Nefunkčné rozloženie informácií o videu #1491 -- Oprava histórie zobrazenia #1497 - - #1495 aktualizáciou metadát (miniatúry, názov a počet videí) hneď, ako používateľ vstúpi do zoznamu skladieb. - - #1475, zaregistrovaním zobrazenia v databáze, keď používateľ spustí video v externom prehrávači na detailnom fragmente. -- Oprava časového limitu creen v prípade popup režimu. #1463 (Opravené #640) -- Oprava hlavného prehrávača videa č. 1509 - - #1412] Opravený režim opakovania spôsobujúci NPE prehrávača, keď je prijatý nový zámer, zatiaľ čo je činnosť prehrávača na pozadí. - - Opravené minimalizovanie prehrávača na vyskakovacie okno nezničí prehrávač, keď nie je udelené povolenie na vyskakovanie. +- Fix #1440 Broken Video Info Layout #1491 +- View history fix #1497 + - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. + - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. +- Fix creen timeout in case of popup mode. #1463 (Fixed #640) +- Main video player fix #1509 + - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. + - Fixed minimizing player to popup does not destroy player when popup permission is not granted. diff --git a/fastlane/metadata/android/sk/changelogs/66.txt b/fastlane/metadata/android/sk/changelogs/66.txt index ba9808cba..30c20b0e8 100644 --- a/fastlane/metadata/android/sk/changelogs/66.txt +++ b/fastlane/metadata/android/sk/changelogs/66.txt @@ -1,33 +1,33 @@ -# Zoznam zmien verzie v0.13.7 +# Changelog of v0.13.7 -### Opravené -- Oprava problémov s triediacim filtrom vo verzii v0.13.6 +### Fixed +- Fix sort filter issues of v0.13.6 -# Zoznam zmien verzie v0.13.6 +# Changelog of v0.13.6 -### Vylepšenia +### Improvements -- Zakázanie animácie ikony burgermenu #1486 -- Zrušenie odstránenia stiahnutých súborov #1472 -- Možnosť sťahovania v ponuke zdieľania #1498 -- Pridaná možnosť zdieľania do ponuky dlhého ťuknutia #1454 -- Minimalizácia hlavného prehrávača pri ukončení #1354 -- Aktualizácia verzie knižnice a oprava zálohovania databázy #1510 -- Aktualizácia ExoPlayer 2.8.2 #1392 - - Prepracované dialógové okno na ovládanie rýchlosti prehrávania tak, aby podporovalo rôzne veľkosti krokov pre rýchlejšiu zmenu rýchlosti. - - Pridaný prepínač na rýchle prevíjanie dopredu počas ticha v ovládaní rýchlosti prehrávania. Toto by malo byť užitočné pre audioknihy a niektoré hudobné žánre a môže priniesť skutočne plynulý zážitok (a môže prerušiť skladbu s množstvom ticha =\). - - Prepracované rozlíšenie zdrojov médií, aby bolo možné odovzdávať metadáta spolu s médiami interne v prehrávači, namiesto toho, aby sa to robilo ručne. Teraz máme jediný zdroj metadát a je priamo k dispozícii pri spustení prehrávania. - - Opravené neaktualizovanie metadát vzdialeného zoznamu skladieb, keď sú k dispozícii nové metadáta pri otvorení fragmentu zoznamu skladieb. - - Rôzne opravy používateľského rozhrania: #1383, ovládacie prvky oznámenia prehrávača na pozadí sú teraz vždy biele, jednoduchšie vypnutie vyskakovacieho prehrávača prostredníctvom hodenia -- Použitie nového extraktora s preformulovanou architektúrou pre multiservis +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). + - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. + - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. + - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging +- Use new extractor with refactored architecture for multiservice -### Opravy +### Fixes -- Oprava #1440 Nefunkčné rozloženie informácií o videu #1491 -- Oprava histórie zobrazenia #1497 - - #1495 aktualizáciou metadát (miniatúry, názov a počet videí) hneď, ako používateľ vstúpi do zoznamu skladieb. - - #1475, zaregistrovaním zobrazenia v databáze, keď používateľ spustí video v externom prehrávači na detailnom fragmente. -- Oprava časového limitu creen v prípade popup režimu. #1463 (Opravené #640) -- Oprava hlavného prehrávača videa č. 1509 - - #1412] Opravený režim opakovania spôsobujúci NPE prehrávača, keď je prijatý nový zámer, zatiaľ čo je činnosť prehrávača na pozadí. - - Opravené minimalizovanie prehrávača na vyskakovacie okno nezničí prehrávač, keď nie je udelené povolenie na vyskakovanie. +- Fix #1440 Broken Video Info Layout #1491 +- View history fix #1497 + - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. + - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. +- Fix creen timeout in case of popup mode. #1463 (Fixed #640) +- Main video player fix #1509 + - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. + - Fixed minimizing player to popup does not destroy player when popup permission is not granted. diff --git a/fastlane/metadata/android/tr/changelogs/1005.txt b/fastlane/metadata/android/tr/changelogs/1005.txt index 82b3e2e9c..46b3142f7 100644 --- a/fastlane/metadata/android/tr/changelogs/1005.txt +++ b/fastlane/metadata/android/tr/changelogs/1005.txt @@ -1,17 +1,17 @@ Yeni • Android Auto desteği eklendi -• Akış gruplarını ana ekran sekmeleri olarak ayarlama özelliği eklendi -• [YouTube] Geçici oynatma listesi olarak paylaşma özelliği eklendi -• [SoundCloud] Beğeniler kanalı sekmesi eklendi +• Akış gruplarının ana ekran sekmeleri olarak ayarlanmasına izin verme +• [YouTube] Geçici oynatma listesi olarak paylaşma +• [SoundCloud] Beğenilen kanal sekmesi Geliştirildi -• Arama çubuğu ipuçları iyileştirildi -• İndirilenler bölümünde indirme tarihi gösteriliyor -• Android 13 uygulama başına dil ayarı desteği eklendi +• Daha iyi arama çubuğu önerileri +• İndirilenler'de indirme tarihini gösterimi +• Android 13 uygulama başı dil kullanma Düzeltildi • Karanlık modda bozuk metin renkleri düzeltildi -• [YouTube] 100’den fazla öğe yüklenmeyen oynatma listeleri sorunu giderildi +• [YouTube] 100'den fazla öğeyi yüklemeyen oynatma listeleri düzeltildi • [YouTube] Eksik önerilen videolar düzeltildi -• Geçmiş liste görünümünde oluşan çökme sorunu giderildi +• Geçmiş listesi görünümündeki çökmeler düzeltildi • Yorum yanıtlarındaki zaman damgaları düzeltildi From 11467a73b8e09edd386343df4e41d6bfdd428a92 Mon Sep 17 00:00:00 2001 From: tobigr Date: Fri, 9 Jan 2026 21:13:57 +0100 Subject: [PATCH 126/190] Fixed length of changelogs --- .../metadata/android/cs/changelogs/1006.txt | 4 ---- .../metadata/android/de/changelogs/1006.txt | 3 --- .../metadata/android/fr/changelogs/1006.txt | 9 --------- .../metadata/android/hi/changelogs/1006.txt | 5 ----- .../metadata/android/hu/changelogs/1006.txt | 3 --- .../metadata/android/pa/changelogs/1006.txt | 6 ------ .../metadata/android/pl/changelogs/1006.txt | 3 --- .../metadata/android/sv/changelogs/1006.txt | 7 ------- .../metadata/android/uk/changelogs/1006.txt | 4 ---- fastlane_check.sh | 19 +++++++++++++++++++ 10 files changed, 19 insertions(+), 44 deletions(-) create mode 100755 fastlane_check.sh diff --git a/fastlane/metadata/android/cs/changelogs/1006.txt b/fastlane/metadata/android/cs/changelogs/1006.txt index 11a6f4cca..88c312e14 100644 --- a/fastlane/metadata/android/cs/changelogs/1006.txt +++ b/fastlane/metadata/android/cs/changelogs/1006.txt @@ -4,13 +4,9 @@ Pokus o obnovení čekajících stahování, pokud to jde Možnost odstranění stahování bez smazání souboru Oprávnění Zobrazení přes ostatní aplikace: zobrazení vysvětlení pro Android > R Podpora odkazů on.soundcloud -Spousta malých vylepšení a optimalizací # Opravy Oprava formátování pro verze Androidu nižší než 7 Oprava falešných oznámení Opravy souborů titulků SRT Oprava spousty pádů - -# Vývoj -Interní modernizace kódu diff --git a/fastlane/metadata/android/de/changelogs/1006.txt b/fastlane/metadata/android/de/changelogs/1006.txt index 811138c07..1a76b6f0e 100644 --- a/fastlane/metadata/android/de/changelogs/1006.txt +++ b/fastlane/metadata/android/de/changelogs/1006.txt @@ -11,6 +11,3 @@ Kurzformatierung für Android-Versionen unter 7 Geisterbenachrichtigungen SRT-Untertiteldateien Zahlreiche Abstürze - -# Entwicklung -Modernisierung des internen Codes diff --git a/fastlane/metadata/android/fr/changelogs/1006.txt b/fastlane/metadata/android/fr/changelogs/1006.txt index a9ed2c642..65fbccfd5 100644 --- a/fastlane/metadata/android/fr/changelogs/1006.txt +++ b/fastlane/metadata/android/fr/changelogs/1006.txt @@ -1,17 +1,8 @@ -# Améliorations 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 améliorations et optimisations mineures - -# Corrections Correction du formatage du nombre court pour les versions Android inférieures à 7 Correction des notifications fantômes Corrections pour les fichiers de sous-titres SRT -Correction de nombreux plantages - -# Développement -Modernisation du code interne diff --git a/fastlane/metadata/android/hi/changelogs/1006.txt b/fastlane/metadata/android/hi/changelogs/1006.txt index f9656149b..4545d60ed 100644 --- a/fastlane/metadata/android/hi/changelogs/1006.txt +++ b/fastlane/metadata/android/hi/changelogs/1006.txt @@ -3,13 +3,8 @@ जब हो सके तो पेंडिंग डाउनलोड मिशन को रिकवर करने की कोशिश करें फ़ाइल डिलीट किए बिना डाउनलोड डिलीट करने का ऑप्शन जोड़ें .soundcloud लिंक खोलने में सपोर्ट करें -कई छोटे सुधार और ऑप्टिमाइज़ेशन -# ठीक किया गया 7 से कम Android वर्शन के लिए छोटे नंबर फ़ॉर्मेटिंग को ठीक किया गया खाली नोटिफ़िकेशन को ठीक किया गया SRT सबटाइटल फ़ाइलों के लिए ठीक किया गया कई क्रैश ठीक किए गए - -# डेवलपमेंट -इंटरनल कोड मॉडर्नाइज़ेशन diff --git a/fastlane/metadata/android/hu/changelogs/1006.txt b/fastlane/metadata/android/hu/changelogs/1006.txt index 3d0cba88f..a5cbf76eb 100644 --- a/fastlane/metadata/android/hu/changelogs/1006.txt +++ b/fastlane/metadata/android/hu/changelogs/1006.txt @@ -11,6 +11,3 @@ Számozás javítása Android 7 alatt Szellem értesítések javítása SRT felirat javítások Sok összeomlás javítva - -# Fejlesztés -Belső kód modernizálása diff --git a/fastlane/metadata/android/pa/changelogs/1006.txt b/fastlane/metadata/android/pa/changelogs/1006.txt index 2539da187..5046eaaa0 100644 --- a/fastlane/metadata/android/pa/changelogs/1006.txt +++ b/fastlane/metadata/android/pa/changelogs/1006.txt @@ -3,13 +3,7 @@ ਜਦੋਂ ਸੰਭਵ ਹੋਵੇ ਤਾਂ ਬਕਾਇਆ ਡਾਊਨਲੋਡ ਮਿਸ਼ਨਾਂ ਨੂੰ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਫਾਈਲ ਨੂੰ ਮਿਟਾਏ ਬਿਨਾਂ ਡਾਊਨਲੋਡ ਨੂੰ ਮਿਟਾਉਣ ਦਾ ਵਿਕਲਪ ਸ਼ਾਮਿਲ ਕਰੋ on.soundcloud ਲਿੰਕ ਖੋਲ੍ਹਣ ਦਾ ਸਮਰਥਨ ਕਰੋ -ਬਹੁਤ ਸਾਰੇ ਛੋਟੇ ਸੁਧਾਰ ਅਤੇ ਅਨੁਕੂਲਤਾ - -# ਫਿਕਸਡ 7 ਤੋਂ ਘੱਟ ਐਂਡਰਾਇਡ ਸੰਸਕਰਣਾਂ ਲਈ ਛੋਟੀ ਗਿਣਤੀ ਫਾਰਮੈਟਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ ਖਾਲੀ ਨੋਟੀਫਿਕੇਸ਼ਨਾਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ SRT ਉਪਸਿਰਲੇਖ ਫਾਈਲਾਂ ਲਈ ਠੀਕ ਕੀਤਾ ਗਿਆ ਬਹੁਤ ਸਾਰੇ ਕਰੈਸ਼ ਠੀਕ ਕੀਤੇ ਗਏ - -# ਵਿਕਾਸ -ਅੰਦਰੂਨੀ ਕੋਡ ਆਧੁਨਿਕੀਕਰਨ diff --git a/fastlane/metadata/android/pl/changelogs/1006.txt b/fastlane/metadata/android/pl/changelogs/1006.txt index a537d7c18..137f996b9 100644 --- a/fastlane/metadata/android/pl/changelogs/1006.txt +++ b/fastlane/metadata/android/pl/changelogs/1006.txt @@ -11,6 +11,3 @@ Naprawione - Puste powiadomienia - Pliki napisów SRT - Mnóstwo awarii - -Rozwój -- Modernizacja wewnętrznego kodu diff --git a/fastlane/metadata/android/sv/changelogs/1006.txt b/fastlane/metadata/android/sv/changelogs/1006.txt index 90825e8a8..5fae37d22 100644 --- a/fastlane/metadata/android/sv/changelogs/1006.txt +++ b/fastlane/metadata/android/sv/changelogs/1006.txt @@ -4,13 +4,6 @@ Försök att återställa väntande nedladdningsuppdrag när det är möjligt Lägg till alternativ för att ta bort en nedladdning utan att också ta bort filen Överläggsbehörighet: visa förklarande dialogruta för Android > R Stöd för att öppna on.soundcloud-länkar -Många små förbättringar och optimeringar - -# Åtgärdat Åtgärdade formatering av korta antal för Android-versioner under 7 Åtgärdade Ghost Notifications Åtgärdade för SRT-undertextfiler -Åtgärdade massor av krascher - -# Utveckling -Intern kodmodernisering diff --git a/fastlane/metadata/android/uk/changelogs/1006.txt b/fastlane/metadata/android/uk/changelogs/1006.txt index 6534e9145..fd79de93a 100644 --- a/fastlane/metadata/android/uk/changelogs/1006.txt +++ b/fastlane/metadata/android/uk/changelogs/1006.txt @@ -4,13 +4,9 @@ Додано опцію видалення завантаження без одночасного видалення файлу Дозвіл на накладання: відображення пояснювального діалогового вікна для Android > R Підтримка відкриття посилання на .soundcloud -Багато дрібних покращень та оптимізацій # Виправлено Виправлено форматування короткого лічильника для версій Android нижче 7 Виправлено сповіщення-примари Виправлення для файлів субтитрів SRT Виправлено безліч збоїв - -# Розробка -Модернізація внутрішнього коду diff --git a/fastlane_check.sh b/fastlane_check.sh new file mode 100755 index 000000000..71bc5b6f7 --- /dev/null +++ b/fastlane_check.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +dir="fastlane" +size="500" +name_filter="${1:-}" + +find_cmd=(find "$dir" -type f -size +"${size}c") +if [[ -n $name_filter ]]; then + find_cmd+=(-name "$name_filter") +fi +find_cmd+=(-print0) + +# find: -type f (files), -size +Nc (N bytes, + means strictly greater) +# print0/xargs -0 to safely handle filenames with spaces/newlines + + # macOS stat: "%z %N" => size and filename +"${find_cmd[@]}"| xargs -0 stat -f "%z %N" + + From fc39bff77ef36ed2e61eb4744648d39b1087c052 Mon Sep 17 00:00:00 2001 From: tobigr Date: Fri, 9 Jan 2026 21:25:52 +0100 Subject: [PATCH 127/190] Remove script for fastlane check --- fastlane_check.sh | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100755 fastlane_check.sh diff --git a/fastlane_check.sh b/fastlane_check.sh deleted file mode 100755 index 71bc5b6f7..000000000 --- a/fastlane_check.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -dir="fastlane" -size="500" -name_filter="${1:-}" - -find_cmd=(find "$dir" -type f -size +"${size}c") -if [[ -n $name_filter ]]; then - find_cmd+=(-name "$name_filter") -fi -find_cmd+=(-print0) - -# find: -type f (files), -size +Nc (N bytes, + means strictly greater) -# print0/xargs -0 to safely handle filenames with spaces/newlines - - # macOS stat: "%z %N" => size and filename -"${find_cmd[@]}"| xargs -0 stat -f "%z %N" - - From 9ba89d418b444b127ee936f7a39dc5c5b54521ec Mon Sep 17 00:00:00 2001 From: tobigr Date: Fri, 9 Jan 2026 21:25:52 +0100 Subject: [PATCH 128/190] Remove script for fastlane check --- fastlane_check.sh | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100755 fastlane_check.sh diff --git a/fastlane_check.sh b/fastlane_check.sh deleted file mode 100755 index 71bc5b6f7..000000000 --- a/fastlane_check.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -dir="fastlane" -size="500" -name_filter="${1:-}" - -find_cmd=(find "$dir" -type f -size +"${size}c") -if [[ -n $name_filter ]]; then - find_cmd+=(-name "$name_filter") -fi -find_cmd+=(-print0) - -# find: -type f (files), -size +Nc (N bytes, + means strictly greater) -# print0/xargs -0 to safely handle filenames with spaces/newlines - - # macOS stat: "%z %N" => size and filename -"${find_cmd[@]}"| xargs -0 stat -f "%z %N" - - From 5d7a3f97cd7225699e0f95d60fd6e944760a8db4 Mon Sep 17 00:00:00 2001 From: tobigr Date: Sun, 11 Jan 2026 14:58:38 +0100 Subject: [PATCH 129/190] Update extractor to v0.25.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 35dd808d0..2f643413b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -59,7 +59,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 = "f3e143035f8c2b94e43c6bef0608d2a519914e8f" +teamnewpipe-newpipe-extractor = "v0.25.0" viewpager2 = "1.1.0" webkit = "1.14.0" work = "2.10.5" # Newer versions require minSdk >= 23 From 8e389c49e68c25889735af959c8dc87513582527 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 11 Jan 2026 15:01:06 +0100 Subject: [PATCH 130/190] Translated using Weblate (Polish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 56.3% (49 of 87 strings) Translated using Weblate (French) Currently translated at 77.0% (67 of 87 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (764 of 764 strings) Co-authored-by: Agnieszka C Co-authored-by: Hosted Weblate Co-authored-by: Mickaël Binos Co-authored-by: whistlingwoods <72640314+whistlingwoods@users.noreply.github.com> Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/ Translation: NewPipe/Metadata --- app/src/main/res/values-pa/strings.xml | 4 +- .../metadata/android/fr/changelogs/65.txt | 53 ++++++++++------ .../metadata/android/fr/changelogs/66.txt | 60 ++++++++++++------ .../metadata/android/fr/changelogs/68.txt | 63 +++++++++++-------- .../metadata/android/fr/changelogs/750.txt | 46 +++++++++----- .../metadata/android/pl/changelogs/1006.txt | 3 + 6 files changed, 148 insertions(+), 81 deletions(-) diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index a937fbf86..9dfc8143e 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -803,8 +803,8 @@ ਸੈਕੰਡਰੀ ਅਸਥਾਈ ਯੂਟਿਊਬ ਪਲੇਲਿਸਟ ਵਜੋਂ ਸਾਂਝਾ ਕਰੋ ਪਲੇਲਿਸਟਾਂ - %1$s ਦੀ ਖੋਜ ਕਰੋ - %1$s (%2$s) ٪1$s ਦੀ ਖੋਜ ਕਰੋ + %1$s ਖੋਜੋ + %1$s (%2$s) ਖੋਜੋ ਫੀਡ ਗਰੁੱਪ ਚੁਣੋ ਅਜੇ ਤੱਕ ਕੋਈ ਫੀਡ ਗਰੁੱਪ ਨਹੀਂ ਬਣਾਇਆ ਗਿਆ ਚੈਨਲ ਗਰੁੱਪ ਪੰਨਾ diff --git a/fastlane/metadata/android/fr/changelogs/65.txt b/fastlane/metadata/android/fr/changelogs/65.txt index c5d6d852a..9d06cac17 100644 --- a/fastlane/metadata/android/fr/changelogs/65.txt +++ b/fastlane/metadata/android/fr/changelogs/65.txt @@ -1,26 +1,41 @@ ### Améliorations -- L'animation de l'icône du burgermenu a été désactivé #1486 -- Annulation de la suppression des téléchargements #1472 +- Désactivation de l'animation de l'icône du menu hamburger #1486 + +- Annulation de la suppression des téléchargements #1472 + - Option de téléchargement dans le menu de partage #1498 -- Ajout d'une option de partage dans le menu "long tap" #1454 -- Réduction du lecteur principal à la sortie #1354 -- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510 -- Mise à jour de ExoPlayer 2.8.2 #1392 - - La boîte de dialogue de contrôle de la vitesse de lecture a été retravaillée pour prendre en charge différentes tailles de pas pour un changement de vitesse plus rapide. - - Ajout d'une option d'avance rapide pendant les silences dans le contrôle de la vitesse de lecture. Cela devrait être utile pour les livres audio et certains genres musicaux, et peut apporter une véritable expérience transparente (et peut casser une chanson avec beaucoup de silences =\\). - - Refonte de la résolution des sources de médias pour permettre le passage des métadonnées avec les médias en interne dans le lecteur, plutôt que de le faire manuellement. Maintenant, nous avons une seule source de métadonnées et elles sont directement disponibles lorsque la lecture commence. - - Correction des métadonnées des listes de lecture distantes qui ne sont pas mises à jour lorsque de nouvelles métadonnées sont disponibles lors de l'ouverture du fragment de liste de lecture. - - Diverses corrections de l'interface utilisateur : #1383, les contrôles de notification du lecteur en arrière-plan sont maintenant toujours blancs, il est plus facile de fermer le lecteur popup en le lançant. + +- Ajout de l'option de partage au menu contextuel (appui long) #1454 + +- Réduction du lecteur principal à la fermeture #1354 + +- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510 + +- Mise à jour ExoPlayer 2.8.2 #1392 + +- Refonte de la boîte de dialogue de contrôle de la vitesse de lecture pour permettre des incréments différents et ainsi accélérer les changements de vitesse. + +- Ajout d'une option pour avancer rapidement pendant les silences dans le contrôle de la vitesse de lecture. Cette fonction devrait être utile pour les livres audio et certains genres musicaux, et peut offrir une expérience d'écoute parfaitement fluide (mais peut aussi perturber la lecture d'un morceau comportant de nombreux silences =\\). + +- Refonte de la résolution de la source multimédia pour permettre la transmission des métadonnées directement dans le lecteur, au lieu d'une saisie manuelle. Nous disposons désormais d'une source unique de métadonnées, directement disponible au démarrage de la lecture. - Correction du problème de mise à jour des métadonnées des listes de lecture distantes lors de la disponibilité de nouvelles métadonnées à l'ouverture d'un fragment de liste de lecture. + +- Diverses corrections d'interface utilisateur : #1383, les commandes de notification du lecteur en arrière-plan sont désormais toujours blanches, fermeture plus facile du lecteur contextuel par un mouvement brusque. + - Utilisation d'un nouvel extracteur avec une architecture remaniée pour le multiservice. ### Corrections -- Correction #1440 Disposition des informations vidéo cassée #1491 -- Correction de l'historique des vues #1497 - - #1495, en mettant à jour les métadonnées (vignette, titre et nombre de vidéos) dès que l'utilisateur accède à la liste de lecture. - - #1475, en enregistrant une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe sur le fragment de détail. -- Correction du timeout de la fenêtre en cas de mode popup. #1463 (Corrigé #640) -- Correction du lecteur vidéo principal #1509 - - Correction du mode répétition entraînant un NPE du lecteur lorsqu'une nouvelle intention est reçue alors que l'activité du lecteur est en arrière-plan. - - Correction de la réduction du lecteur en popup ne détruisant pas le lecteur lorsque la permission de popup n'est pas accordée. +- Correction du problème #1440 : affichage incorrect des informations vidéo. #1491 + +- Correction de l'historique de visionnage. #1497 + +- #1495 : mise à jour des métadonnées (miniature, titre et nombre de vidéos) dès que l'utilisateur accède à la liste de lecture. + +- #1475 : enregistrement d'une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe dans le fragment de détails. + +- Correction du délai d'expiration de l'écran en mode contextuel. #1463 (Correction du problème #640) + +- Correction du lecteur vidéo principal. #1509 + +- [#1412] Correction du mode répétition provoquant une exception NullPointerException (NPE) du lecteur lors de la réception d'une nouvelle intention alors que l'activité du lecteur est en arrière-plan. - Correction d'un problème où la réduction du lecteur dans une fenêtre contextuelle ne détruisait pas le lecteur lorsque l'autorisation d'afficher la fenêtre contextuelle n'était pas accordée. diff --git a/fastlane/metadata/android/fr/changelogs/66.txt b/fastlane/metadata/android/fr/changelogs/66.txt index 33ba1fe25..b6092f44f 100644 --- a/fastlane/metadata/android/fr/changelogs/66.txt +++ b/fastlane/metadata/android/fr/changelogs/66.txt @@ -1,28 +1,50 @@ +# Journal des modifications de la v0.13.7 + +### Corrigé +- Correction des problèmes de filtre de tri de la v0.13.6 + # Journal des modifications de la v0.13.6 ### Améliorations -- L'animation de l'icône du menu « hamburger » a été désactivée #1486 -- Annulation de la suppression des téléchargements #1472 +- Désactivation de l'animation de l'icône du menu hamburger #1486 + +- Annulation de la suppression des téléchargements #1472 + - Option de téléchargement dans le menu de partage #1498 -- Ajout d'une option de partage dans le menu "long tap" #1454 -- Réduction du lecteur principal à la sortie #1354 -- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510 -- Mise à jour de ExoPlayer 2.8.2 #1392 - - La boîte de dialogue de contrôle de la vitesse de lecture a été retravaillée pour prendre en charge différentes tailles de pas pour un changement de vitesse plus rapide. - - Ajout d'une option d'avance rapide pendant les silences dans le contrôle de la vitesse de lecture. Cela devrait être utile pour les livres audio et certains genres musicaux, et peut apporter une véritable expérience transparente (et peut casser une chanson avec beaucoup de silences =\\). - - Refonte de la résolution des sources de médias pour permettre le passage des métadonnées avec les médias en interne dans le lecteur, plutôt que de le faire manuellement. Maintenant, nous avons une seule source de métadonnées et elles sont directement disponibles lorsque la lecture commence. - - Correction des métadonnées des listes de lecture distantes qui ne sont pas mises à jour lorsque de nouvelles métadonnées sont disponibles lors de l'ouverture du fragment de liste de lecture. - - Diverses corrections de l'interface utilisateur : #1383, les contrôles de notification du lecteur en arrière-plan sont maintenant toujours blancs, il est plus facile de fermer le lecteur popup en le lançant. + +- Ajout de l'option de partage au menu contextuel (appui long) #1454 + +- Réduction du lecteur principal à la fermeture #1354 + +- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510 + +- Mise à jour ExoPlayer 2.8.2 #1392 + +- Refonte de la boîte de dialogue de contrôle de la vitesse de lecture pour permettre des incréments différents et ainsi accélérer les changements de vitesse. + +- Ajout d'une option pour avancer rapidement pendant les silences dans le contrôle de la vitesse de lecture. Ceci devrait être utile pour les livres audio et certains genres musicaux, et peut offrir une expérience d'écoute parfaitement fluide (mais peut aussi perturber une chanson avec de nombreux silences =\\). - Résolution de la source multimédia remaniée pour permettre la transmission interne des métadonnées au lecteur, au lieu d'une saisie manuelle. Les métadonnées proviennent désormais d'une source unique et sont directement disponibles au démarrage de la lecture. + +- Correction du problème de mise à jour des métadonnées des listes de lecture distantes lors de l'ouverture d'un fragment de liste de lecture, même lorsque de nouvelles métadonnées sont disponibles. + +- Diverses corrections d'interface : #1383, les commandes de notification du lecteur en arrière-plan sont désormais toujours blanches ; il est plus facile de fermer le lecteur contextuel en le faisant glisser. + - Utilisation d'un nouvel extracteur avec une architecture remaniée pour le multiservice. ### Corrections -- Correction #1440 Disposition des informations vidéo cassée #1491 -- Correction de l'historique des vues #1497 - - #1495, en mettant à jour les métadonnées (vignette, titre et nombre de vidéos) dès que l'utilisateur accède à la playlist. - - #1475, en enregistrant une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe sur le fragment de détail. -- Correction du timeout de la fenêtre en cas de mode popup. #1463 (Corrigé #640) -- Correction du lecteur vidéo principal #1509 - - Correction du mode répétition entraînant un NPE du lecteur lorsqu'une nouvelle intention est reçue alors que l'activité du lecteur est en arrière-plan. - - Correction de la réduction du lecteur en popup ne détruisant pas le lecteur lorsque la permission de popup n'est pas accordée. +- Correction du problème #1440 : affichage incorrect des informations vidéo ; #1491 + +- Correction de l'historique de visionnage ; #1497 + +- #1495 : mise à jour des métadonnées (miniature, titre et nombre de vidéos) dès que l'utilisateur accède à la liste de lecture. + +- #1475 : enregistrement d'une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe dans le fragment de détails. + +- Correction du délai d'expiration de l'écran en mode fenêtre contextuelle. #1463 (Correction de #640) + +- Correction du lecteur vidéo principal #1509 + +- [#1412] Correction du mode de répétition provoquant une exception de pointeur nul (NPE) du lecteur lors de la réception d'une nouvelle intention alors que l'activité du lecteur est en arrière-plan. + +- Correction du problème suivant : la réduction du lecteur dans une fenêtre contextuelle ne le détruisait pas lorsque l'autorisation d'ouvrir une fenêtre contextuelle n'était pas accordée. diff --git a/fastlane/metadata/android/fr/changelogs/68.txt b/fastlane/metadata/android/fr/changelogs/68.txt index b1735214a..3c9c4446f 100644 --- a/fastlane/metadata/android/fr/changelogs/68.txt +++ b/fastlane/metadata/android/fr/changelogs/68.txt @@ -1,31 +1,44 @@ -# Modifications v0.14.1 +# Modifications de la v0.14.1 -### Corrections -- Échec du décryptage de l'URL vidéo #1659 -- Lien de description, ne s'extrayait pas bien #1657 +### Corrigé +- Correction du problème de décryptage de l'URL vidéo (#1659) +- Correction du problème d'extraction du lien de description (#1657) -# Modifications v0.14.0 +# Modifications de la v0.14.0 -### Nouveautés -- Design du dossier #1461 -- Page d'accueil personnalisable #1461 +### Nouveau +- Nouveau design du tiroir (#1461) +- Nouvelle page d'accueil personnalisable (#1461) ### Améliorations -- Contrôles gestuels retravaillés #1604 -- Nouvelle façon de fermer le lecteur popup #1597 +- Refonte des commandes gestuelles (#1604) +- Nouvelle méthode pour fermer le lecteur pop-up (#1597) -### Corrections -- Erreur lorsque le nombre d'abonnements n'est pas disponible. Ferme #1649. - - Affiche "le nombre d'abonnés non disponible" dans ces cas. -- NPE lorsqu'une playlist YouTube est vide. -- Kiosques dans SoundCloud -- Refactor et correction du bug #1623 -- Résultat de recherche cyclique #1562 -- Barre de recherche qui n'est pas mise en page de manière statique -- Vidéos YT Premium qui ne sont pas bloquées correctement -- Vidéos qui ne se chargent pas toujours (à cause du parsing DASH) -- Liens dans la description des vidéos -- Afficher un avertissement lorsque quelqu'un essaie de télécharger vers une carte SD externe -- Exception "rien indiqué" qui déclenche un rapport -- La vignette ne s'affiche pas dans le lecteur de fond pour Android 8.1 [voir ici](https://github.com/TeamNewPipe/NewPipe/issues/943) -- Enregistrement du récepteur de diffusion. Ferme le dossier #1641. +### Corrigé +- Correction d'une erreur lorsque le nombre d'abonnements n'est pas disponible. Résout le problème n° 1649. + + - Afficher « Nombre d'abonnés indisponible » dans ces cas + +- Correction d'une exception NPE lorsqu'une playlist YouTube est vide + +- Correction rapide pour les bornes interactives sur SoundCloud + +- Refactorisation et correction du bug n° 1623 + +- Correction du résultat de recherche cyclique n° 1562 + +- Correction de la barre de progression (position statique) + +- Correction du blocage incorrect des vidéos YouTube Premium + +- Correction du chargement intempestif des vidéos (dû à l'analyse DASH) + +- Correction des liens dans la description des vidéos + +- Afficher un avertissement lors d'une tentative de téléchargement sur carte SD externe + +- Correction d'une exception déclenchant un rapport en cas d'absence d'affichage + +- Correction de l'affichage des miniatures 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. Résout le problème n° 1641. diff --git a/fastlane/metadata/android/fr/changelogs/750.txt b/fastlane/metadata/android/fr/changelogs/750.txt index 422529abf..7273ae1f0 100644 --- a/fastlane/metadata/android/fr/changelogs/750.txt +++ b/fastlane/metadata/android/fr/changelogs/750.txt @@ -1,22 +1,36 @@ -Nouveau -Reprise de lecture #2288 -• Reprise des flux où ils s'étaient arrêtés -Améliorations du téléchargeur #2149 -• Utilisation du Storage Access Framework pour stocker sur cartes SD -• Nouveau multiplexeur mp4 -• Peut changer le dossier de téléchargement -• Respect des réseaux tarifés +Nouveautés +Reprise de la lecture #2288 + +• Reprise des flux là où vous les avez interrompus +Améliorations du téléchargeur #2149 + +• Utilisation de Storage Access Framework pour stocker les téléchargements sur des cartes SD externes + +• Nouveau multiplexeur mp4 + +• Possibilité de modifier le répertoire de téléchargement avant de lancer un téléchargement + +• Respect des réseaux limités Améliorations + • Suppression des chaînes gema #2295 -• Gestion des changements de rotation #2444 -• Uniformisation des menus longue-pression #2368 + +• Gestion des changements de rotation (automatique) pendant le cycle de vie de l'activité #2444 + +• Harmonisation des menus accessibles par appui long #2368 Corrections -• Nom de la piste de sous-titres sélectionnée qui ne s'affiche pas #2394 -• Ne plante pas quand la vérification de la mise à jour de l'application échoue #2423 -• Téléchargements bloqués à 99,9 % #2440 -• Mise à jour des métadonnées de la file de lecture #2453 -• [SoundCloud] Ne plante pas lors du chargement des playlists TeamNewPipe/NewPipeExtractor#170 -• [YouTube] Durée pas analysée TeamNewPipe/NewPipeExtractor#177 + +• Correction de l'affichage du nom de la piste de sous-titres sélectionnée #2394 + +• Correction du plantage en cas d'échec de la vérification des mises à jour de l'application (version GitHub) #2423 + +• Correction du blocage des téléchargements à 99,9 % #2440 + +• Mise à jour des métadonnées de la file d'attente de lecture #2453 + +• [SoundCloud] Correction du plantage lors du chargement des playlists TeamNewPipe/NewPipeExtractor#170 + +• [YouTube] Correction de l'impossibilité d'afficher la durée paresd TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pl/changelogs/1006.txt b/fastlane/metadata/android/pl/changelogs/1006.txt index 137f996b9..a537d7c18 100644 --- a/fastlane/metadata/android/pl/changelogs/1006.txt +++ b/fastlane/metadata/android/pl/changelogs/1006.txt @@ -11,3 +11,6 @@ Naprawione - Puste powiadomienia - Pliki napisów SRT - Mnóstwo awarii + +Rozwój +- Modernizacja wewnętrznego kodu From 56489e5ddd6c2ea6b208ef05682561affb9733ff Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 11 Jan 2026 15:01:06 +0100 Subject: [PATCH 131/190] Translated using Weblate (Polish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 56.3% (49 of 87 strings) Translated using Weblate (French) Currently translated at 77.0% (67 of 87 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (764 of 764 strings) Co-authored-by: Agnieszka C Co-authored-by: Hosted Weblate Co-authored-by: Mickaël Binos Co-authored-by: whistlingwoods <72640314+whistlingwoods@users.noreply.github.com> Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/ Translation: NewPipe/Metadata --- app/src/main/res/values-pa/strings.xml | 4 +- .../metadata/android/fr/changelogs/65.txt | 53 ++++++++++------ .../metadata/android/fr/changelogs/66.txt | 60 ++++++++++++------ .../metadata/android/fr/changelogs/68.txt | 63 +++++++++++-------- .../metadata/android/fr/changelogs/750.txt | 46 +++++++++----- .../metadata/android/pl/changelogs/1006.txt | 3 + 6 files changed, 148 insertions(+), 81 deletions(-) diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index a937fbf86..9dfc8143e 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -803,8 +803,8 @@ ਸੈਕੰਡਰੀ ਅਸਥਾਈ ਯੂਟਿਊਬ ਪਲੇਲਿਸਟ ਵਜੋਂ ਸਾਂਝਾ ਕਰੋ ਪਲੇਲਿਸਟਾਂ - %1$s ਦੀ ਖੋਜ ਕਰੋ - %1$s (%2$s) ٪1$s ਦੀ ਖੋਜ ਕਰੋ + %1$s ਖੋਜੋ + %1$s (%2$s) ਖੋਜੋ ਫੀਡ ਗਰੁੱਪ ਚੁਣੋ ਅਜੇ ਤੱਕ ਕੋਈ ਫੀਡ ਗਰੁੱਪ ਨਹੀਂ ਬਣਾਇਆ ਗਿਆ ਚੈਨਲ ਗਰੁੱਪ ਪੰਨਾ diff --git a/fastlane/metadata/android/fr/changelogs/65.txt b/fastlane/metadata/android/fr/changelogs/65.txt index c5d6d852a..9d06cac17 100644 --- a/fastlane/metadata/android/fr/changelogs/65.txt +++ b/fastlane/metadata/android/fr/changelogs/65.txt @@ -1,26 +1,41 @@ ### Améliorations -- L'animation de l'icône du burgermenu a été désactivé #1486 -- Annulation de la suppression des téléchargements #1472 +- Désactivation de l'animation de l'icône du menu hamburger #1486 + +- Annulation de la suppression des téléchargements #1472 + - Option de téléchargement dans le menu de partage #1498 -- Ajout d'une option de partage dans le menu "long tap" #1454 -- Réduction du lecteur principal à la sortie #1354 -- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510 -- Mise à jour de ExoPlayer 2.8.2 #1392 - - La boîte de dialogue de contrôle de la vitesse de lecture a été retravaillée pour prendre en charge différentes tailles de pas pour un changement de vitesse plus rapide. - - Ajout d'une option d'avance rapide pendant les silences dans le contrôle de la vitesse de lecture. Cela devrait être utile pour les livres audio et certains genres musicaux, et peut apporter une véritable expérience transparente (et peut casser une chanson avec beaucoup de silences =\\). - - Refonte de la résolution des sources de médias pour permettre le passage des métadonnées avec les médias en interne dans le lecteur, plutôt que de le faire manuellement. Maintenant, nous avons une seule source de métadonnées et elles sont directement disponibles lorsque la lecture commence. - - Correction des métadonnées des listes de lecture distantes qui ne sont pas mises à jour lorsque de nouvelles métadonnées sont disponibles lors de l'ouverture du fragment de liste de lecture. - - Diverses corrections de l'interface utilisateur : #1383, les contrôles de notification du lecteur en arrière-plan sont maintenant toujours blancs, il est plus facile de fermer le lecteur popup en le lançant. + +- Ajout de l'option de partage au menu contextuel (appui long) #1454 + +- Réduction du lecteur principal à la fermeture #1354 + +- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510 + +- Mise à jour ExoPlayer 2.8.2 #1392 + +- Refonte de la boîte de dialogue de contrôle de la vitesse de lecture pour permettre des incréments différents et ainsi accélérer les changements de vitesse. + +- Ajout d'une option pour avancer rapidement pendant les silences dans le contrôle de la vitesse de lecture. Cette fonction devrait être utile pour les livres audio et certains genres musicaux, et peut offrir une expérience d'écoute parfaitement fluide (mais peut aussi perturber la lecture d'un morceau comportant de nombreux silences =\\). + +- Refonte de la résolution de la source multimédia pour permettre la transmission des métadonnées directement dans le lecteur, au lieu d'une saisie manuelle. Nous disposons désormais d'une source unique de métadonnées, directement disponible au démarrage de la lecture. - Correction du problème de mise à jour des métadonnées des listes de lecture distantes lors de la disponibilité de nouvelles métadonnées à l'ouverture d'un fragment de liste de lecture. + +- Diverses corrections d'interface utilisateur : #1383, les commandes de notification du lecteur en arrière-plan sont désormais toujours blanches, fermeture plus facile du lecteur contextuel par un mouvement brusque. + - Utilisation d'un nouvel extracteur avec une architecture remaniée pour le multiservice. ### Corrections -- Correction #1440 Disposition des informations vidéo cassée #1491 -- Correction de l'historique des vues #1497 - - #1495, en mettant à jour les métadonnées (vignette, titre et nombre de vidéos) dès que l'utilisateur accède à la liste de lecture. - - #1475, en enregistrant une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe sur le fragment de détail. -- Correction du timeout de la fenêtre en cas de mode popup. #1463 (Corrigé #640) -- Correction du lecteur vidéo principal #1509 - - Correction du mode répétition entraînant un NPE du lecteur lorsqu'une nouvelle intention est reçue alors que l'activité du lecteur est en arrière-plan. - - Correction de la réduction du lecteur en popup ne détruisant pas le lecteur lorsque la permission de popup n'est pas accordée. +- Correction du problème #1440 : affichage incorrect des informations vidéo. #1491 + +- Correction de l'historique de visionnage. #1497 + +- #1495 : mise à jour des métadonnées (miniature, titre et nombre de vidéos) dès que l'utilisateur accède à la liste de lecture. + +- #1475 : enregistrement d'une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe dans le fragment de détails. + +- Correction du délai d'expiration de l'écran en mode contextuel. #1463 (Correction du problème #640) + +- Correction du lecteur vidéo principal. #1509 + +- [#1412] Correction du mode répétition provoquant une exception NullPointerException (NPE) du lecteur lors de la réception d'une nouvelle intention alors que l'activité du lecteur est en arrière-plan. - Correction d'un problème où la réduction du lecteur dans une fenêtre contextuelle ne détruisait pas le lecteur lorsque l'autorisation d'afficher la fenêtre contextuelle n'était pas accordée. diff --git a/fastlane/metadata/android/fr/changelogs/66.txt b/fastlane/metadata/android/fr/changelogs/66.txt index 33ba1fe25..b6092f44f 100644 --- a/fastlane/metadata/android/fr/changelogs/66.txt +++ b/fastlane/metadata/android/fr/changelogs/66.txt @@ -1,28 +1,50 @@ +# Journal des modifications de la v0.13.7 + +### Corrigé +- Correction des problèmes de filtre de tri de la v0.13.6 + # Journal des modifications de la v0.13.6 ### Améliorations -- L'animation de l'icône du menu « hamburger » a été désactivée #1486 -- Annulation de la suppression des téléchargements #1472 +- Désactivation de l'animation de l'icône du menu hamburger #1486 + +- Annulation de la suppression des téléchargements #1472 + - Option de téléchargement dans le menu de partage #1498 -- Ajout d'une option de partage dans le menu "long tap" #1454 -- Réduction du lecteur principal à la sortie #1354 -- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510 -- Mise à jour de ExoPlayer 2.8.2 #1392 - - La boîte de dialogue de contrôle de la vitesse de lecture a été retravaillée pour prendre en charge différentes tailles de pas pour un changement de vitesse plus rapide. - - Ajout d'une option d'avance rapide pendant les silences dans le contrôle de la vitesse de lecture. Cela devrait être utile pour les livres audio et certains genres musicaux, et peut apporter une véritable expérience transparente (et peut casser une chanson avec beaucoup de silences =\\). - - Refonte de la résolution des sources de médias pour permettre le passage des métadonnées avec les médias en interne dans le lecteur, plutôt que de le faire manuellement. Maintenant, nous avons une seule source de métadonnées et elles sont directement disponibles lorsque la lecture commence. - - Correction des métadonnées des listes de lecture distantes qui ne sont pas mises à jour lorsque de nouvelles métadonnées sont disponibles lors de l'ouverture du fragment de liste de lecture. - - Diverses corrections de l'interface utilisateur : #1383, les contrôles de notification du lecteur en arrière-plan sont maintenant toujours blancs, il est plus facile de fermer le lecteur popup en le lançant. + +- Ajout de l'option de partage au menu contextuel (appui long) #1454 + +- Réduction du lecteur principal à la fermeture #1354 + +- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510 + +- Mise à jour ExoPlayer 2.8.2 #1392 + +- Refonte de la boîte de dialogue de contrôle de la vitesse de lecture pour permettre des incréments différents et ainsi accélérer les changements de vitesse. + +- Ajout d'une option pour avancer rapidement pendant les silences dans le contrôle de la vitesse de lecture. Ceci devrait être utile pour les livres audio et certains genres musicaux, et peut offrir une expérience d'écoute parfaitement fluide (mais peut aussi perturber une chanson avec de nombreux silences =\\). - Résolution de la source multimédia remaniée pour permettre la transmission interne des métadonnées au lecteur, au lieu d'une saisie manuelle. Les métadonnées proviennent désormais d'une source unique et sont directement disponibles au démarrage de la lecture. + +- Correction du problème de mise à jour des métadonnées des listes de lecture distantes lors de l'ouverture d'un fragment de liste de lecture, même lorsque de nouvelles métadonnées sont disponibles. + +- Diverses corrections d'interface : #1383, les commandes de notification du lecteur en arrière-plan sont désormais toujours blanches ; il est plus facile de fermer le lecteur contextuel en le faisant glisser. + - Utilisation d'un nouvel extracteur avec une architecture remaniée pour le multiservice. ### Corrections -- Correction #1440 Disposition des informations vidéo cassée #1491 -- Correction de l'historique des vues #1497 - - #1495, en mettant à jour les métadonnées (vignette, titre et nombre de vidéos) dès que l'utilisateur accède à la playlist. - - #1475, en enregistrant une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe sur le fragment de détail. -- Correction du timeout de la fenêtre en cas de mode popup. #1463 (Corrigé #640) -- Correction du lecteur vidéo principal #1509 - - Correction du mode répétition entraînant un NPE du lecteur lorsqu'une nouvelle intention est reçue alors que l'activité du lecteur est en arrière-plan. - - Correction de la réduction du lecteur en popup ne détruisant pas le lecteur lorsque la permission de popup n'est pas accordée. +- Correction du problème #1440 : affichage incorrect des informations vidéo ; #1491 + +- Correction de l'historique de visionnage ; #1497 + +- #1495 : mise à jour des métadonnées (miniature, titre et nombre de vidéos) dès que l'utilisateur accède à la liste de lecture. + +- #1475 : enregistrement d'une vue dans la base de données lorsque l'utilisateur lance une vidéo sur un lecteur externe dans le fragment de détails. + +- Correction du délai d'expiration de l'écran en mode fenêtre contextuelle. #1463 (Correction de #640) + +- Correction du lecteur vidéo principal #1509 + +- [#1412] Correction du mode de répétition provoquant une exception de pointeur nul (NPE) du lecteur lors de la réception d'une nouvelle intention alors que l'activité du lecteur est en arrière-plan. + +- Correction du problème suivant : la réduction du lecteur dans une fenêtre contextuelle ne le détruisait pas lorsque l'autorisation d'ouvrir une fenêtre contextuelle n'était pas accordée. diff --git a/fastlane/metadata/android/fr/changelogs/68.txt b/fastlane/metadata/android/fr/changelogs/68.txt index b1735214a..3c9c4446f 100644 --- a/fastlane/metadata/android/fr/changelogs/68.txt +++ b/fastlane/metadata/android/fr/changelogs/68.txt @@ -1,31 +1,44 @@ -# Modifications v0.14.1 +# Modifications de la v0.14.1 -### Corrections -- Échec du décryptage de l'URL vidéo #1659 -- Lien de description, ne s'extrayait pas bien #1657 +### Corrigé +- Correction du problème de décryptage de l'URL vidéo (#1659) +- Correction du problème d'extraction du lien de description (#1657) -# Modifications v0.14.0 +# Modifications de la v0.14.0 -### Nouveautés -- Design du dossier #1461 -- Page d'accueil personnalisable #1461 +### Nouveau +- Nouveau design du tiroir (#1461) +- Nouvelle page d'accueil personnalisable (#1461) ### Améliorations -- Contrôles gestuels retravaillés #1604 -- Nouvelle façon de fermer le lecteur popup #1597 +- Refonte des commandes gestuelles (#1604) +- Nouvelle méthode pour fermer le lecteur pop-up (#1597) -### Corrections -- Erreur lorsque le nombre d'abonnements n'est pas disponible. Ferme #1649. - - Affiche "le nombre d'abonnés non disponible" dans ces cas. -- NPE lorsqu'une playlist YouTube est vide. -- Kiosques dans SoundCloud -- Refactor et correction du bug #1623 -- Résultat de recherche cyclique #1562 -- Barre de recherche qui n'est pas mise en page de manière statique -- Vidéos YT Premium qui ne sont pas bloquées correctement -- Vidéos qui ne se chargent pas toujours (à cause du parsing DASH) -- Liens dans la description des vidéos -- Afficher un avertissement lorsque quelqu'un essaie de télécharger vers une carte SD externe -- Exception "rien indiqué" qui déclenche un rapport -- La vignette ne s'affiche pas dans le lecteur de fond pour Android 8.1 [voir ici](https://github.com/TeamNewPipe/NewPipe/issues/943) -- Enregistrement du récepteur de diffusion. Ferme le dossier #1641. +### Corrigé +- Correction d'une erreur lorsque le nombre d'abonnements n'est pas disponible. Résout le problème n° 1649. + + - Afficher « Nombre d'abonnés indisponible » dans ces cas + +- Correction d'une exception NPE lorsqu'une playlist YouTube est vide + +- Correction rapide pour les bornes interactives sur SoundCloud + +- Refactorisation et correction du bug n° 1623 + +- Correction du résultat de recherche cyclique n° 1562 + +- Correction de la barre de progression (position statique) + +- Correction du blocage incorrect des vidéos YouTube Premium + +- Correction du chargement intempestif des vidéos (dû à l'analyse DASH) + +- Correction des liens dans la description des vidéos + +- Afficher un avertissement lors d'une tentative de téléchargement sur carte SD externe + +- Correction d'une exception déclenchant un rapport en cas d'absence d'affichage + +- Correction de l'affichage des miniatures 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. Résout le problème n° 1641. diff --git a/fastlane/metadata/android/fr/changelogs/750.txt b/fastlane/metadata/android/fr/changelogs/750.txt index 422529abf..7273ae1f0 100644 --- a/fastlane/metadata/android/fr/changelogs/750.txt +++ b/fastlane/metadata/android/fr/changelogs/750.txt @@ -1,22 +1,36 @@ -Nouveau -Reprise de lecture #2288 -• Reprise des flux où ils s'étaient arrêtés -Améliorations du téléchargeur #2149 -• Utilisation du Storage Access Framework pour stocker sur cartes SD -• Nouveau multiplexeur mp4 -• Peut changer le dossier de téléchargement -• Respect des réseaux tarifés +Nouveautés +Reprise de la lecture #2288 + +• Reprise des flux là où vous les avez interrompus +Améliorations du téléchargeur #2149 + +• Utilisation de Storage Access Framework pour stocker les téléchargements sur des cartes SD externes + +• Nouveau multiplexeur mp4 + +• Possibilité de modifier le répertoire de téléchargement avant de lancer un téléchargement + +• Respect des réseaux limités Améliorations + • Suppression des chaînes gema #2295 -• Gestion des changements de rotation #2444 -• Uniformisation des menus longue-pression #2368 + +• Gestion des changements de rotation (automatique) pendant le cycle de vie de l'activité #2444 + +• Harmonisation des menus accessibles par appui long #2368 Corrections -• Nom de la piste de sous-titres sélectionnée qui ne s'affiche pas #2394 -• Ne plante pas quand la vérification de la mise à jour de l'application échoue #2423 -• Téléchargements bloqués à 99,9 % #2440 -• Mise à jour des métadonnées de la file de lecture #2453 -• [SoundCloud] Ne plante pas lors du chargement des playlists TeamNewPipe/NewPipeExtractor#170 -• [YouTube] Durée pas analysée TeamNewPipe/NewPipeExtractor#177 + +• Correction de l'affichage du nom de la piste de sous-titres sélectionnée #2394 + +• Correction du plantage en cas d'échec de la vérification des mises à jour de l'application (version GitHub) #2423 + +• Correction du blocage des téléchargements à 99,9 % #2440 + +• Mise à jour des métadonnées de la file d'attente de lecture #2453 + +• [SoundCloud] Correction du plantage lors du chargement des playlists TeamNewPipe/NewPipeExtractor#170 + +• [YouTube] Correction de l'impossibilité d'afficher la durée paresd TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pl/changelogs/1006.txt b/fastlane/metadata/android/pl/changelogs/1006.txt index 137f996b9..a537d7c18 100644 --- a/fastlane/metadata/android/pl/changelogs/1006.txt +++ b/fastlane/metadata/android/pl/changelogs/1006.txt @@ -11,3 +11,6 @@ Naprawione - Puste powiadomienia - Pliki napisów SRT - Mnóstwo awarii + +Rozwój +- Modernizacja wewnętrznego kodu From 4f0e62e5991853015c17bc3f8bc9cc1136d3ed4c Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Sun, 11 Jan 2026 13:51:34 +0200 Subject: [PATCH 132/190] Misc small kotlin based refactors Java file here because it uses kotlin function which returns non null --- .../java/org/schabi/newpipe/database/FeedDAOTest.kt | 1 - .../java/org/schabi/newpipe/DownloaderImpl.java | 4 +--- .../java/org/schabi/newpipe/database/Migrations.kt | 1 - .../main/java/org/schabi/newpipe/error/ErrorInfo.kt | 2 +- app/src/main/java/org/schabi/newpipe/ktx/View.kt | 6 +----- .../newpipe/local/feed/FeedDatabaseManager.kt | 13 ++++++------- .../local/feed/notifications/NotificationHelper.kt | 6 +++--- .../local/feed/notifications/ScheduleOptions.kt | 7 +++---- .../schabi/newpipe/local/playlist/ExportPlaylist.kt | 2 +- 9 files changed, 16 insertions(+), 26 deletions(-) diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt index 893ae82b7..54d2dad9c 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt @@ -22,7 +22,6 @@ import org.schabi.newpipe.extractor.channel.ChannelInfo import org.schabi.newpipe.extractor.stream.StreamType import java.io.IOException import java.time.OffsetDateTime -import kotlin.streams.toList class FeedDAOTest { private lateinit var db: AppDatabase diff --git a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java index 6ccc2437a..041e91396 100644 --- a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java +++ b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java @@ -161,9 +161,7 @@ public final class DownloaderImpl extends Downloader { String responseBodyToReturn = null; try (ResponseBody body = response.body()) { - if (body != null) { - responseBodyToReturn = body.string(); - } + responseBodyToReturn = body.string(); } final String latestUrl = response.request().url().toString(); diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.kt b/app/src/main/java/org/schabi/newpipe/database/Migrations.kt index 6566f7e6a..414f74893 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Migrations.kt +++ b/app/src/main/java/org/schabi/newpipe/database/Migrations.kt @@ -8,7 +8,6 @@ package org.schabi.newpipe.database import android.util.Log import androidx.room.migration.Migration -import androidx.sqlite.db.SupportSQLiteDatabase import org.schabi.newpipe.MainActivity object Migrations { diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt index 609fbb336..7ddfeb553 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt @@ -163,7 +163,7 @@ class ErrorInfo private constructor( private fun getServiceName(serviceId: Int?) = // not using getNameOfServiceById since we want to accept a nullable serviceId and we // want to default to SERVICE_NONE - ServiceList.all()?.firstOrNull { it.serviceId == serviceId }?.serviceInfo?.name + ServiceList.all().firstOrNull { it.serviceId == serviceId }?.serviceInfo?.name ?: SERVICE_NONE fun throwableToStringList(throwable: Throwable) = arrayOf(throwable.stackTraceToString()) diff --git a/app/src/main/java/org/schabi/newpipe/ktx/View.kt b/app/src/main/java/org/schabi/newpipe/ktx/View.kt index b781335e1..cf9e4baef 100644 --- a/app/src/main/java/org/schabi/newpipe/ktx/View.kt +++ b/app/src/main/java/org/schabi/newpipe/ktx/View.kt @@ -41,11 +41,7 @@ fun View.animate( execOnEnd: Runnable? = null ) { if (DEBUG) { - val id = try { - resources.getResourceEntryName(id) - } catch (e: Exception) { - id.toString() - } + val id = runCatching { resources.getResourceEntryName(id) }.getOrDefault(id.toString()) val msg = String.format( "%8s → [%s:%s] [%s %s:%s] execOnEnd=%s", enterOrExit, javaClass.simpleName, id, animationType, duration, delay, execOnEnd diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt index aacc6757e..8a1de01c9 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt @@ -85,14 +85,13 @@ class FeedDatabaseManager(context: Context) { items: List, oldestAllowedDate: OffsetDateTime = FEED_OLDEST_ALLOWED_DATE ) { - val itemsToInsert = ArrayList() - loop@ for (streamItem in items) { - val uploadDate = streamItem.uploadDate + val itemsToInsert = items.mapNotNull { stream -> + val uploadDate = stream.uploadDate - itemsToInsert += when { - uploadDate == null && streamItem.streamType == StreamType.LIVE_STREAM -> streamItem - uploadDate != null && uploadDate.offsetDateTime() >= oldestAllowedDate -> streamItem - else -> continue@loop + when { + uploadDate == null && stream.streamType == StreamType.LIVE_STREAM -> stream + uploadDate != null && uploadDate.offsetDateTime() >= oldestAllowedDate -> stream + else -> null } } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt index 646596884..7ce117fcd 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt @@ -15,6 +15,7 @@ import androidx.core.app.NotificationManagerCompat import androidx.core.app.PendingIntentCompat import androidx.core.content.ContextCompat import androidx.core.content.getSystemService +import androidx.core.net.toUri import androidx.preference.PreferenceManager import com.squareup.picasso.Picasso import com.squareup.picasso.Target @@ -181,8 +182,7 @@ class NotificationHelper(val context: Context) { val manager = context.getSystemService()!! val enabled = manager.areNotificationsEnabled() val channel = manager.getNotificationChannel(channelId) - val importance = channel?.importance - enabled && channel != null && importance != NotificationManager.IMPORTANCE_NONE + enabled && channel?.importance != NotificationManager.IMPORTANCE_NONE } else { NotificationManagerCompat.from(context).areNotificationsEnabled() } @@ -212,7 +212,7 @@ class NotificationHelper(val context: Context) { context.startActivity(intent) } else { val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - intent.data = Uri.parse("package:" + context.packageName) + intent.data = "package:${context.packageName}".toUri() context.startActivity(intent) } } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/ScheduleOptions.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/ScheduleOptions.kt index 37e8fc39e..b1027e21a 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/ScheduleOptions.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/ScheduleOptions.kt @@ -3,6 +3,7 @@ package org.schabi.newpipe.local.feed.notifications import android.content.Context import androidx.preference.PreferenceManager import org.schabi.newpipe.R +import org.schabi.newpipe.ktx.getStringSafe import java.util.concurrent.TimeUnit /** @@ -20,11 +21,9 @@ data class ScheduleOptions( val preferences = PreferenceManager.getDefaultSharedPreferences(context) return ScheduleOptions( interval = TimeUnit.SECONDS.toMillis( - preferences.getString( + preferences.getStringSafe( context.getString(R.string.streams_notifications_interval_key), - null - )?.toLongOrNull() ?: context.getString( - R.string.streams_notifications_interval_default + context.getString(R.string.streams_notifications_interval_default) ).toLong() ), isRequireNonMeteredNetwork = preferences.getString( diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt b/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt index 8eb3ab3ae..9c7f1ba09 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt @@ -65,5 +65,5 @@ private val linkHandler: YoutubeStreamLinkHandlerFactory = YoutubeStreamLinkHand */ private fun getYouTubeId(url: String): String? { - return try { linkHandler.getId(url) } catch (e: ParsingException) { null } + return runCatching { linkHandler.getId(url) }.getOrNull() } From 6c5d58bed3a4e7945580c644a875aa1addf3a89b Mon Sep 17 00:00:00 2001 From: tobigr Date: Sun, 11 Jan 2026 18:56:41 +0100 Subject: [PATCH 133/190] Fix minify step of release build by ignoring two classes This fixes the following error during the minifyWithR8 task: > Task :app:minifyReleaseWithR8 FAILED ERROR: Missing classes detected while running R8. Please add the missing classes or apply additional keep rules that are generated in /home/runner/work/NewPipe/NewPipe/app/build/outputs/mapping/release/missing_rules.txt. ERROR: R8: Missing class com.google.re2j.Matcher (referenced from: com.google.re2j.Matcher org.jsoup.helper.Re2jRegex$Re2jMatcher.delegate and 3 other contexts) Missing class com.google.re2j.Pattern (referenced from: com.google.re2j.Pattern org.jsoup.helper.Re2jRegex.re2jPattern and 4 other contexts) --- app/proguard-rules.pro | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 0cdffbe2e..8bcef3fbd 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -16,6 +16,11 @@ -dontwarn javax.script.** -keep class jdk.dynalink.** { *; } -dontwarn jdk.dynalink.** +# Rules for jsoup +# Ignore intended-to-be-optional re2j classes - only needed if using re2j for jsoup regex +# jsoup safely falls back to JDK regex if re2j not on classpath, but has concrete re2j refs +# See https://github.com/jhy/jsoup/issues/2459 - may be resolved in future, then this may be removed +-dontwarn com.google.re2j.** ## Rules for ExoPlayer -keep class com.google.android.exoplayer2.** { *; } From 914feef5e97162a62bfa234e25a030bea9481c45 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Mon, 12 Jan 2026 20:35:14 +0200 Subject: [PATCH 134/190] Fix playlist item dragging video to only neighbor positions Call `saveImmediate` only after used actually dropped item instead of every time View is updated which happens several times to show user a feedback where item would be moved --- .../newpipe/local/playlist/LocalPlaylistFragment.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 1efc0a84c..d841b44b4 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -768,11 +768,17 @@ public class LocalPlaylistFragment extends BaseLocalListFragment Date: Tue, 13 Jan 2026 20:42:10 +0700 Subject: [PATCH 135/190] ci: fix shell injection in backport workflow --- .github/workflows/backport-pr.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/backport-pr.yml b/.github/workflows/backport-pr.yml index c7bcb117e..de46ca7c7 100644 --- a/.github/workflows/backport-pr.yml +++ b/.github/workflows/backport-pr.yml @@ -25,9 +25,11 @@ jobs: - uses: actions/checkout@v4 - name: Get backport metadata # the target branch is the first argument after `/backport` + env: + COMMENT_BODY: ${{ github.event.comment.body }} run: | set -euo pipefail - body="${{ github.event.comment.body }}" + body="$COMMENT_BODY" line=${body%%$'\n'*} # Get the first line if [[ $line =~ ^/backport[[:space:]]+([^[:space:]]+) ]]; then From 402f43e8952703fe10cd97a0341419e91151eeb2 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Tue, 13 Jan 2026 16:12:02 +0200 Subject: [PATCH 136/190] Fixed a bug that prevented the display of multiple empty playlists Turned out this bug was already fixed two years ago but unfortunately it made its way back again. It was solved in #9642 but back then another method was used for querying playlists from db (for add playlist dialog) then in ef4a6238c88f26e50ba794caa071432a08da66e7 was introduced another method which had the same problem as fixed in #9642 and which eventually replaced original method in code for querying playlists from db (for add playlist dialog) --- .../database/playlist/dao/PlaylistStreamDAO.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt index 8bf26d754..c6b6e37a4 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt @@ -68,6 +68,11 @@ interface PlaylistStreamDAO : BasicDAO { ) fun getOrderedStreamsOf(playlistId: Long): Flowable> + // If a playlist has no streams, there won’t be any rows in the **playlist_stream_join** table + // that have a foreign key to that playlist. Thus, the **playlist_id** will not have a + // corresponding value in any rows of the join table. So, if you group by the **playlist_id**, + // only playlists that contain videos are grouped and displayed. Look at #9642 #13055 + @Transaction @Query( """ @@ -103,6 +108,11 @@ interface PlaylistStreamDAO : BasicDAO { ) fun getStreamsWithoutDuplicates(playlistId: Long): Flowable> + // If a playlist has no streams, there won’t be any rows in the **playlist_stream_join** table + // that have a foreign key to that playlist. Thus, the **playlist_id** will not have a + // corresponding value in any rows of the join table. So, if you group by the **playlist_id**, + // only playlists that contain videos are grouped and displayed. Look at #9642 #13055 + @Transaction @Query( """ @@ -118,7 +128,7 @@ interface PlaylistStreamDAO : BasicDAO { LEFT JOIN streams ON streams.uid = stream_id AND :streamUrl = :streamUrl - GROUP BY playlist_id + GROUP BY playlists.uid ORDER BY display_index, name """ ) From 3ab414252f8b5bd761e9c9a00f6c85021537b6af Mon Sep 17 00:00:00 2001 From: tobigr Date: Tue, 23 Dec 2025 10:36:40 +0100 Subject: [PATCH 137/190] Update NewPipe Extractor, checkstyle and sonarqube to latest versions Add note that new webkit versions require a minSdk >= 23 --- gradle/libs.versions.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a7a856a41..b06321413 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,7 +12,7 @@ autoservice-google = "1.1.1" autoservice-zacsweers = "1.2.0" bridge = "v2.0.2" cardview = "1.0.0" -checkstyle = "12.2.0" +checkstyle = "12.3.0" constraintlayout = "2.2.1" core = "1.17.0" desugar = "2.1.5" @@ -45,7 +45,7 @@ runner = "1.7.0" rxandroid = "3.0.2" rxbinding = "4.0.0" rxjava = "3.1.12" -sonarqube = "7.2.1.6560" +sonarqube = "7.2.2.6593" statesaver = "1.4.1" # TODO: Drop because it is deprecated and incompatible with KSP2 stetho = "1.6.0" swiperefreshlayout = "1.2.0" @@ -61,7 +61,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # to cause jitpack to regenerate the artifact. teamnewpipe-newpipe-extractor = "v0.25.0" viewpager2 = "1.1.0" -webkit = "1.14.0" +webkit = "1.14.0" # Newer versions require minSdk >= 23 work = "2.10.5" # Newer versions require minSdk >= 23 [libraries] From 16415d13edcdd5be0f22b01af4d161d687a7e5b1 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 19 Jan 2026 14:23:24 +0800 Subject: [PATCH 138/190] Update more dependencies to latest stable release Signed-off-by: Aayush Gupta --- gradle/libs.versions.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b06321413..be09de32d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,7 +12,7 @@ autoservice-google = "1.1.1" autoservice-zacsweers = "1.2.0" bridge = "v2.0.2" cardview = "1.0.0" -checkstyle = "12.3.0" +checkstyle = "13.0.0" constraintlayout = "2.2.1" core = "1.17.0" desugar = "2.1.5" @@ -20,11 +20,11 @@ documentfile = "1.1.0" exoplayer = "2.19.1" fragment = "1.8.9" groupie = "2.10.1" -jsoup = "1.21.2" +jsoup = "1.22.1" junit = "4.13.2" junit-ext = "1.3.0" kotlin = "2.2.21" -ksp = "2.3.2" +ksp = "2.3.4" ktlint = "1.8.0" leakcanary = "2.14" lifecycle = "2.9.4" # Newer versions require minSdk >= 23 From 40d7dcf3d373408967b22d73afdcf717bbfa4649 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 22 Jan 2026 17:36:13 +0800 Subject: [PATCH 139/190] Update Gradle to 9.3.0 Signed-off-by: Aayush Gupta --- gradle/wrapper/gradle-wrapper.jar | Bin 45633 -> 46175 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f8e1ee3125fe0768e9a76ee977ac089eb657005e..61285a659d17295f1de7c53e24fdf13ad755c379 100644 GIT binary patch delta 37058 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 NNswbwE82Y!{{uvZmpcFe delta 36446 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 JWd7DQ`9Hc?h(rJY diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8a848873f..44ae9537e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=72f44c9f8ebcb1af43838f45ee5c4aa9c5444898b3468ab3f4af7b6076c5bc3f -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +distributionSha256Sum=0d585f69da091fc5b2beced877feab55a3064d43b8a1d46aeb07996b0915e0e0 +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From bcb7469d30fc22cd0d2cd08f813cc1a6be66e180 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 22 Jan 2026 17:38:41 +0800 Subject: [PATCH 140/190] Run checkstyle with JDK 21 Signed-off-by: Aayush Gupta --- app/build.gradle.kts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1aa5297c5..292dcdbdf 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -134,6 +134,13 @@ ksp { // Custom dependency configuration for ktlint val ktlint by configurations.creating +// https://checkstyle.org/#JRE_and_JDK +tasks.withType().configureEach { + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(21) + } +} + checkstyle { configDirectory = rootProject.file("checkstyle") isIgnoreFailures = false From ed4b77b5aa847eebf2bd6d2afb6c4e565dbf50a5 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 15:19:26 +0800 Subject: [PATCH 141/190] ktlint: Set codestyle and ignore function naming for Composable Signed-off-by: Aayush Gupta --- .editorconfig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.editorconfig b/.editorconfig index 77feb3181..8c6c145ba 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,6 +6,10 @@ root = true [*.{kt,kts}] +ktlint_code_style = android_studio +# https://pinterest.github.io/ktlint/latest/rules/standard/#function-naming +ktlint_function_naming_ignore_when_annotated_with = Composable + ktlint_standard_annotation = disabled ktlint_standard_argument-list-wrapping = disabled ktlint_standard_backing-property-naming = disabled From f23d8eff571152f5c7eb25bb5ff3bc2ca8683587 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 15:21:02 +0800 Subject: [PATCH 142/190] ktlint: Order imports in lexicographic order Signed-off-by: Aayush Gupta --- .../java/org/schabi/newpipe/database/FeedDAOTest.kt | 4 ++-- .../newpipe/local/history/HistoryRecordManagerTest.kt | 6 +++--- app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt | 2 +- app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt | 2 +- app/src/main/java/org/schabi/newpipe/about/License.kt | 2 +- .../org/schabi/newpipe/about/LicenseFragmentHelper.kt | 2 +- .../java/org/schabi/newpipe/about/SoftwareComponent.kt | 2 +- .../main/java/org/schabi/newpipe/database/Converters.kt | 4 ++-- .../java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt | 2 +- .../newpipe/database/feed/model/FeedLastUpdatedEntity.kt | 2 +- .../newpipe/database/history/model/StreamHistoryEntity.kt | 2 +- .../newpipe/database/history/model/StreamHistoryEntry.kt | 2 +- .../newpipe/database/stream/StreamStatisticsEntry.kt | 2 +- .../org/schabi/newpipe/database/stream/dao/StreamDAO.kt | 2 +- .../schabi/newpipe/database/stream/model/StreamEntity.kt | 4 ++-- app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt | 2 +- .../java/org/schabi/newpipe/error/ErrorPanelHelper.kt | 2 +- .../org/schabi/newpipe/info_list/StreamSegmentAdapter.kt | 2 +- .../org/schabi/newpipe/local/feed/FeedDatabaseManager.kt | 6 +++--- .../java/org/schabi/newpipe/local/feed/FeedFragment.kt | 4 ++-- .../main/java/org/schabi/newpipe/local/feed/FeedState.kt | 2 +- .../java/org/schabi/newpipe/local/feed/FeedViewModel.kt | 4 ++-- .../java/org/schabi/newpipe/local/feed/item/StreamItem.kt | 4 ++-- .../local/feed/notifications/NotificationWorker.kt | 2 +- .../newpipe/local/feed/notifications/ScheduleOptions.kt | 2 +- .../schabi/newpipe/local/feed/service/FeedEventManager.kt | 2 +- .../schabi/newpipe/local/feed/service/FeedLoadManager.kt | 8 ++++---- .../schabi/newpipe/local/feed/service/FeedLoadService.kt | 2 +- .../newpipe/local/subscription/SubscriptionFragment.kt | 6 +++--- .../newpipe/local/subscription/SubscriptionViewModel.kt | 2 +- .../newpipe/local/subscription/dialog/FeedGroupDialog.kt | 2 +- .../local/subscription/dialog/FeedGroupReorderDialog.kt | 2 +- .../newpipe/player/gesture/MainPlayerGestureListener.kt | 2 +- .../newpipe/player/gesture/PopupPlayerGestureListener.kt | 8 ++++---- .../newpipe/player/mediabrowser/MediaBrowserImpl.kt | 2 +- .../player/mediabrowser/MediaBrowserPlaybackPreparer.kt | 4 ++-- .../newpipe/player/mediabrowser/PackageValidator.kt | 2 +- .../schabi/newpipe/settings/export/ImportExportManager.kt | 6 +++--- .../main/java/org/schabi/newpipe/util/FilenameUtils.kt | 2 +- .../java/org/schabi/newpipe/util/ReleaseVersionUtil.kt | 6 +++--- .../java/org/schabi/newpipe/util/image/ImageStrategy.kt | 2 +- .../org/schabi/newpipe/util/potoken/PoTokenWebView.kt | 2 +- .../main/java/us/shandian/giga/get/MissionRecoveryInfo.kt | 2 +- .../test/java/org/schabi/newpipe/NewVersionManagerTest.kt | 8 ++++---- .../org/schabi/newpipe/ktx/ThrowableExtensionsTest.kt | 6 +++--- .../schabi/newpipe/settings/ImportAllCombinationsTest.kt | 6 +++--- .../schabi/newpipe/settings/ImportExportManagerTest.kt | 8 ++++---- .../test/java/org/schabi/newpipe/util/LocalizationTest.kt | 6 +++--- 48 files changed, 83 insertions(+), 83 deletions(-) diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt index 54d2dad9c..80d590f24 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt @@ -4,6 +4,8 @@ import android.content.Context import androidx.room.Room import androidx.test.core.app.ApplicationProvider import io.reactivex.rxjava3.core.Single +import java.io.IOException +import java.time.OffsetDateTime import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull @@ -20,8 +22,6 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity import org.schabi.newpipe.extractor.ServiceList import org.schabi.newpipe.extractor.channel.ChannelInfo import org.schabi.newpipe.extractor.stream.StreamType -import java.io.IOException -import java.time.OffsetDateTime class FeedDAOTest { private lateinit var db: AppDatabase diff --git a/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt b/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt index 0de9dd268..c4c93d6d5 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt @@ -1,6 +1,9 @@ package org.schabi.newpipe.local.history import androidx.test.core.app.ApplicationProvider +import java.time.LocalDateTime +import java.time.OffsetDateTime +import java.time.ZoneOffset import org.assertj.core.api.Assertions.assertThat import org.junit.After import org.junit.Assert.assertEquals @@ -11,9 +14,6 @@ import org.schabi.newpipe.database.AppDatabase import org.schabi.newpipe.database.history.model.SearchHistoryEntry import org.schabi.newpipe.testUtil.TestDatabase import org.schabi.newpipe.testUtil.TrampolineSchedulerRule -import java.time.LocalDateTime -import java.time.OffsetDateTime -import java.time.ZoneOffset class HistoryRecordManagerTest { diff --git a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt index c3ce51524..6527bd2ae 100644 --- a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt +++ b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt @@ -8,6 +8,7 @@ package org.schabi.newpipe import android.content.Context import androidx.room.Room.databaseBuilder +import kotlin.concurrent.Volatile import org.schabi.newpipe.database.AppDatabase import org.schabi.newpipe.database.Migrations.MIGRATION_1_2 import org.schabi.newpipe.database.Migrations.MIGRATION_2_3 @@ -17,7 +18,6 @@ import org.schabi.newpipe.database.Migrations.MIGRATION_5_6 import org.schabi.newpipe.database.Migrations.MIGRATION_6_7 import org.schabi.newpipe.database.Migrations.MIGRATION_7_8 import org.schabi.newpipe.database.Migrations.MIGRATION_8_9 -import kotlin.concurrent.Volatile object NewPipeDatabase { diff --git a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt index 000b83953..893aa8d1b 100644 --- a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt @@ -18,10 +18,10 @@ import androidx.work.WorkerParameters import androidx.work.workDataOf import com.grack.nanojson.JsonParser import com.grack.nanojson.JsonParserException +import java.io.IOException import org.schabi.newpipe.extractor.downloader.Response import org.schabi.newpipe.extractor.exceptions.ReCaptchaException import org.schabi.newpipe.util.ReleaseVersionUtil -import java.io.IOException class NewVersionWorker( context: Context, diff --git a/app/src/main/java/org/schabi/newpipe/about/License.kt b/app/src/main/java/org/schabi/newpipe/about/License.kt index 117ff9bf5..fc50c646d 100644 --- a/app/src/main/java/org/schabi/newpipe/about/License.kt +++ b/app/src/main/java/org/schabi/newpipe/about/License.kt @@ -1,8 +1,8 @@ package org.schabi.newpipe.about import android.os.Parcelable -import kotlinx.parcelize.Parcelize import java.io.Serializable +import kotlinx.parcelize.Parcelize /** * Class for storing information about a software license. diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt index 56e21c88a..a2574ae86 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt @@ -1,9 +1,9 @@ package org.schabi.newpipe.about import android.content.Context +import java.io.IOException import org.schabi.newpipe.R import org.schabi.newpipe.util.ThemeHelper -import java.io.IOException /** * @param context the context to use diff --git a/app/src/main/java/org/schabi/newpipe/about/SoftwareComponent.kt b/app/src/main/java/org/schabi/newpipe/about/SoftwareComponent.kt index 262641caa..a43ddfd5e 100644 --- a/app/src/main/java/org/schabi/newpipe/about/SoftwareComponent.kt +++ b/app/src/main/java/org/schabi/newpipe/about/SoftwareComponent.kt @@ -1,8 +1,8 @@ package org.schabi.newpipe.about import android.os.Parcelable -import kotlinx.parcelize.Parcelize import java.io.Serializable +import kotlinx.parcelize.Parcelize @Parcelize class SoftwareComponent diff --git a/app/src/main/java/org/schabi/newpipe/database/Converters.kt b/app/src/main/java/org/schabi/newpipe/database/Converters.kt index ec097cc1b..f9cbb1de2 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Converters.kt +++ b/app/src/main/java/org/schabi/newpipe/database/Converters.kt @@ -1,11 +1,11 @@ package org.schabi.newpipe.database import androidx.room.TypeConverter -import org.schabi.newpipe.extractor.stream.StreamType -import org.schabi.newpipe.local.subscription.FeedGroupIcon import java.time.Instant import java.time.OffsetDateTime import java.time.ZoneOffset +import org.schabi.newpipe.extractor.stream.StreamType +import org.schabi.newpipe.local.subscription.FeedGroupIcon class Converters { /** diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt index d756df8b1..5861fa767 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt @@ -8,6 +8,7 @@ import androidx.room.Transaction import androidx.room.Update import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Maybe +import java.time.OffsetDateTime import org.schabi.newpipe.database.feed.model.FeedEntity import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity @@ -15,7 +16,6 @@ import org.schabi.newpipe.database.stream.StreamWithState import org.schabi.newpipe.database.stream.model.StreamStateEntity import org.schabi.newpipe.database.subscription.NotificationMode import org.schabi.newpipe.database.subscription.SubscriptionEntity -import java.time.OffsetDateTime @Dao abstract class FeedDAO { diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt index a19af9c45..51c8c1afa 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt @@ -4,10 +4,10 @@ import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.ForeignKey import androidx.room.PrimaryKey +import java.time.OffsetDateTime import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity.Companion.FEED_LAST_UPDATED_TABLE import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity.Companion.SUBSCRIPTION_ID import org.schabi.newpipe.database.subscription.SubscriptionEntity -import java.time.OffsetDateTime @Entity( tableName = FEED_LAST_UPDATED_TABLE, diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt index db41e141c..deba7dd3a 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt @@ -11,12 +11,12 @@ import androidx.room.Entity import androidx.room.ForeignKey import androidx.room.ForeignKey.Companion.CASCADE import androidx.room.Index +import java.time.OffsetDateTime import org.schabi.newpipe.database.history.model.StreamHistoryEntity.Companion.JOIN_STREAM_ID import org.schabi.newpipe.database.history.model.StreamHistoryEntity.Companion.STREAM_ACCESS_DATE import org.schabi.newpipe.database.history.model.StreamHistoryEntity.Companion.STREAM_HISTORY_TABLE import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_ID -import java.time.OffsetDateTime /** * @param streamUid the stream id this history item will refer to diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt index 27fc429f1..ece55269a 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt @@ -2,10 +2,10 @@ package org.schabi.newpipe.database.history.model import androidx.room.ColumnInfo import androidx.room.Embedded +import java.time.OffsetDateTime import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.util.image.ImageStrategy -import java.time.OffsetDateTime data class StreamHistoryEntry( @Embedded diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt b/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt index 3fa281e45..ce74678ca 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt @@ -9,13 +9,13 @@ package org.schabi.newpipe.database.stream import androidx.room.ColumnInfo import androidx.room.Embedded import androidx.room.Ignore +import java.time.OffsetDateTime import org.schabi.newpipe.database.LocalItem import org.schabi.newpipe.database.history.model.StreamHistoryEntity import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamStateEntity.Companion.STREAM_PROGRESS_MILLIS import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.util.image.ImageStrategy -import java.time.OffsetDateTime data class StreamStatisticsEntry( @Embedded diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt index d8c19c1e9..6ef64ec4d 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt @@ -8,12 +8,12 @@ import androidx.room.Query import androidx.room.Transaction import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable +import java.time.OffsetDateTime import org.schabi.newpipe.database.BasicDAO import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_ID import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.util.StreamTypeUtil -import java.time.OffsetDateTime @Dao abstract class StreamDAO : BasicDAO { diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt index d9c160b89..4bb34d7b0 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt @@ -5,6 +5,8 @@ import androidx.room.Entity import androidx.room.Ignore import androidx.room.Index import androidx.room.PrimaryKey +import java.io.Serializable +import java.time.OffsetDateTime import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_SERVICE_ID import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_TABLE import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_URL @@ -14,8 +16,6 @@ import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.player.playqueue.PlayQueueItem import org.schabi.newpipe.util.image.ImageStrategy -import java.io.Serializable -import java.time.OffsetDateTime @Entity( tableName = STREAM_TABLE, diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt index 7ddfeb553..5056c00e1 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt @@ -7,6 +7,7 @@ import androidx.core.content.ContextCompat import com.google.android.exoplayer2.ExoPlaybackException import com.google.android.exoplayer2.upstream.HttpDataSource import com.google.android.exoplayer2.upstream.Loader +import java.net.UnknownHostException import kotlinx.parcelize.Parcelize import org.schabi.newpipe.R import org.schabi.newpipe.extractor.Info @@ -28,7 +29,6 @@ import org.schabi.newpipe.extractor.exceptions.YoutubeMusicPremiumContentExcepti import org.schabi.newpipe.ktx.isNetworkRelated import org.schabi.newpipe.player.mediasource.FailedMediaSource import org.schabi.newpipe.player.resolver.PlaybackResolver -import java.net.UnknownHostException /** * An error has occurred in the app. This class contains plain old parcelable data that can be used diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt index 4ec5f58c3..9d503a935 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt @@ -11,11 +11,11 @@ import androidx.fragment.app.Fragment import com.jakewharton.rxbinding4.view.clicks import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.disposables.Disposable +import java.util.concurrent.TimeUnit import org.schabi.newpipe.MainActivity import org.schabi.newpipe.R import org.schabi.newpipe.ktx.animate import org.schabi.newpipe.util.external_communication.ShareUtils -import java.util.concurrent.TimeUnit class ErrorPanelHelper( private val fragment: Fragment, diff --git a/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentAdapter.kt b/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentAdapter.kt index 869bf6f48..9b6005f65 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentAdapter.kt +++ b/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentAdapter.kt @@ -2,8 +2,8 @@ package org.schabi.newpipe.info_list import android.util.Log import com.xwray.groupie.GroupieAdapter -import org.schabi.newpipe.extractor.stream.StreamInfo import kotlin.math.max +import org.schabi.newpipe.extractor.stream.StreamInfo /** * Custom RecyclerView.Adapter/GroupieAdapter for [StreamSegmentItem] for handling selection state. diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt index 8a1de01c9..3e3a47f57 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt @@ -7,6 +7,9 @@ import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.schedulers.Schedulers +import java.time.LocalDate +import java.time.OffsetDateTime +import java.time.ZoneOffset import org.schabi.newpipe.MainActivity.DEBUG import org.schabi.newpipe.NewPipeDatabase import org.schabi.newpipe.database.feed.model.FeedEntity @@ -18,9 +21,6 @@ import org.schabi.newpipe.database.subscription.NotificationMode import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.local.subscription.FeedGroupIcon -import java.time.LocalDate -import java.time.OffsetDateTime -import java.time.ZoneOffset class FeedDatabaseManager(context: Context) { private val database = NewPipeDatabase.getInstance(context) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index bbad7f689..2663dc5d3 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -53,6 +53,8 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.schedulers.Schedulers +import java.time.OffsetDateTime +import java.util.function.Consumer import org.schabi.newpipe.NewPipeDatabase import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity @@ -81,8 +83,6 @@ import org.schabi.newpipe.util.ThemeHelper.getGridSpanCountStreams import org.schabi.newpipe.util.ThemeHelper.getItemViewMode import org.schabi.newpipe.util.ThemeHelper.resolveDrawable import org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout -import java.time.OffsetDateTime -import java.util.function.Consumer class FeedFragment : BaseStateFragment() { private var _feedBinding: FragmentFeedBinding? = null diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedState.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedState.kt index 665ebbe43..6d6bc9007 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedState.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedState.kt @@ -1,8 +1,8 @@ package org.schabi.newpipe.local.feed import androidx.annotation.StringRes -import org.schabi.newpipe.local.feed.item.StreamItem import java.time.OffsetDateTime +import org.schabi.newpipe.local.feed.item.StreamItem sealed class FeedState { data class ProgressState( diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt index f916db2b5..6ca06e2f8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt @@ -14,6 +14,8 @@ import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.functions.Function6 import io.reactivex.rxjava3.processors.BehaviorProcessor import io.reactivex.rxjava3.schedulers.Schedulers +import java.time.OffsetDateTime +import java.util.concurrent.TimeUnit import org.schabi.newpipe.App import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity @@ -25,8 +27,6 @@ import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.IdleEvent import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ProgressEvent import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.SuccessResultEvent import org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT -import java.time.OffsetDateTime -import java.util.concurrent.TimeUnit class FeedViewModel( private val application: Application, diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt b/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt index 4a071d6df..a39f31efd 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt @@ -6,6 +6,8 @@ import android.view.View import androidx.core.content.ContextCompat import androidx.preference.PreferenceManager import com.xwray.groupie.viewbinding.BindableItem +import java.util.concurrent.TimeUnit +import java.util.function.Consumer import org.schabi.newpipe.MainActivity import org.schabi.newpipe.R import org.schabi.newpipe.database.stream.StreamWithState @@ -20,8 +22,6 @@ import org.schabi.newpipe.extractor.stream.StreamType.VIDEO_STREAM import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.StreamTypeUtil import org.schabi.newpipe.util.image.PicassoHelper -import java.util.concurrent.TimeUnit -import java.util.function.Consumer data class StreamItem( val streamWithState: StreamWithState, diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt index 6fe311fb0..0f66186b8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt @@ -16,6 +16,7 @@ import androidx.work.WorkerParameters import androidx.work.rxjava3.RxWorker import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Single +import java.util.concurrent.TimeUnit import org.schabi.newpipe.App import org.schabi.newpipe.R import org.schabi.newpipe.error.ErrorInfo @@ -23,7 +24,6 @@ import org.schabi.newpipe.error.ErrorUtil import org.schabi.newpipe.error.UserAction import org.schabi.newpipe.local.feed.service.FeedLoadManager import org.schabi.newpipe.local.feed.service.FeedLoadService -import java.util.concurrent.TimeUnit /* * Worker which checks for new streams of subscribed channels diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/ScheduleOptions.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/ScheduleOptions.kt index b1027e21a..6d5f12b2b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/ScheduleOptions.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/ScheduleOptions.kt @@ -2,9 +2,9 @@ package org.schabi.newpipe.local.feed.notifications import android.content.Context import androidx.preference.PreferenceManager +import java.util.concurrent.TimeUnit import org.schabi.newpipe.R import org.schabi.newpipe.ktx.getStringSafe -import java.util.concurrent.TimeUnit /** * Information for the Scheduler which checks for new streams. diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt index 1c2826e7a..952a59b9a 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt @@ -3,8 +3,8 @@ package org.schabi.newpipe.local.feed.service import androidx.annotation.StringRes import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.processors.BehaviorProcessor -import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.IdleEvent import java.util.concurrent.atomic.AtomicBoolean +import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.IdleEvent object FeedEventManager { private var processor: BehaviorProcessor = BehaviorProcessor.create() diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt index 9b0f177d5..0befb3af7 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt @@ -11,6 +11,10 @@ import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.functions.Consumer import io.reactivex.rxjava3.processors.PublishProcessor import io.reactivex.rxjava3.schedulers.Schedulers +import java.time.OffsetDateTime +import java.time.ZoneOffset +import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicInteger import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.database.subscription.NotificationMode @@ -27,10 +31,6 @@ import org.schabi.newpipe.util.ChannelTabHelper import org.schabi.newpipe.util.ExtractorHelper.getChannelInfo import org.schabi.newpipe.util.ExtractorHelper.getChannelTab import org.schabi.newpipe.util.ExtractorHelper.getMoreChannelTabItems -import java.time.OffsetDateTime -import java.time.ZoneOffset -import java.util.concurrent.atomic.AtomicBoolean -import java.util.concurrent.atomic.AtomicInteger class FeedLoadManager(private val context: Context) { diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt index 4aa825ca8..b4af67e6a 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt @@ -36,13 +36,13 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.functions.Function +import java.util.concurrent.TimeUnit import org.schabi.newpipe.App import org.schabi.newpipe.MainActivity.DEBUG import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ErrorResultEvent import org.schabi.newpipe.local.feed.service.FeedEventManager.postEvent -import java.util.concurrent.TimeUnit class FeedLoadService : Service() { companion object { diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt index 8e758adef..5a69c3b41 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt @@ -27,6 +27,9 @@ import com.xwray.groupie.GroupAdapter import com.xwray.groupie.Section import com.xwray.groupie.viewbinding.GroupieViewHolder import io.reactivex.rxjava3.disposables.CompositeDisposable +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity.Companion.GROUP_ALL_ID import org.schabi.newpipe.databinding.DialogTitleBinding @@ -62,9 +65,6 @@ import org.schabi.newpipe.util.OnClickGesture import org.schabi.newpipe.util.ServiceHelper import org.schabi.newpipe.util.ThemeHelper.getGridSpanCountChannels import org.schabi.newpipe.util.external_communication.ShareUtils -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale class SubscriptionFragment : BaseStateFragment() { private var _binding: FragmentSubscriptionBinding? = null diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt index dfad60c3f..fc28f8e59 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt @@ -9,6 +9,7 @@ import com.xwray.groupie.Group import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.processors.BehaviorProcessor import io.reactivex.rxjava3.schedulers.Schedulers +import java.util.concurrent.TimeUnit import org.schabi.newpipe.info_list.ItemViewMode import org.schabi.newpipe.local.feed.FeedDatabaseManager import org.schabi.newpipe.local.subscription.item.ChannelItem @@ -16,7 +17,6 @@ import org.schabi.newpipe.local.subscription.item.FeedGroupCardGridItem import org.schabi.newpipe.local.subscription.item.FeedGroupCardItem import org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT import org.schabi.newpipe.util.ThemeHelper.getItemViewMode -import java.util.concurrent.TimeUnit class SubscriptionViewModel(application: Application) : AndroidViewModel(application) { private var feedDatabaseManager: FeedDatabaseManager = FeedDatabaseManager(application) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt index 71c90e3c1..88254dfbd 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt @@ -23,6 +23,7 @@ import com.livefront.bridge.Bridge import com.xwray.groupie.GroupieAdapter import com.xwray.groupie.OnItemClickListener import com.xwray.groupie.Section +import java.io.Serializable import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.databinding.DialogFeedGroupCreateBinding @@ -40,7 +41,6 @@ import org.schabi.newpipe.local.subscription.item.PickerIconItem import org.schabi.newpipe.local.subscription.item.PickerSubscriptionItem import org.schabi.newpipe.util.DeviceUtils import org.schabi.newpipe.util.ThemeHelper -import java.io.Serializable class FeedGroupDialog : DialogFragment(), BackPressable { private var _feedGroupCreateBinding: DialogFeedGroupCreateBinding? = null diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupReorderDialog.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupReorderDialog.kt index c087da464..11f034ba0 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupReorderDialog.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupReorderDialog.kt @@ -15,6 +15,7 @@ import com.evernote.android.state.State import com.livefront.bridge.Bridge import com.xwray.groupie.GroupieAdapter import com.xwray.groupie.TouchCallback +import java.util.Collections import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.databinding.DialogFeedGroupReorderBinding @@ -22,7 +23,6 @@ import org.schabi.newpipe.local.subscription.dialog.FeedGroupReorderDialogViewMo import org.schabi.newpipe.local.subscription.dialog.FeedGroupReorderDialogViewModel.DialogEvent.SuccessEvent import org.schabi.newpipe.local.subscription.item.FeedGroupReorderItem import org.schabi.newpipe.util.ThemeHelper -import java.util.Collections class FeedGroupReorderDialog : DialogFragment() { private var _binding: DialogFeedGroupReorderBinding? = null diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index ff0bb269d..435dfc79a 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -8,6 +8,7 @@ import android.widget.ProgressBar import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources import androidx.core.view.isVisible +import kotlin.math.abs import org.schabi.newpipe.MainActivity import org.schabi.newpipe.R import org.schabi.newpipe.ktx.AnimationType @@ -17,7 +18,6 @@ import org.schabi.newpipe.player.helper.AudioReactor import org.schabi.newpipe.player.helper.PlayerHelper import org.schabi.newpipe.player.ui.MainPlayerUi import org.schabi.newpipe.util.ThemeHelper.getAndroidDimenPx -import kotlin.math.abs /** * GestureListener for the player diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt index 0b94bf364..57dcb6d92 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt @@ -5,14 +5,14 @@ import android.view.MotionEvent import android.view.View import android.view.ViewConfiguration import androidx.core.view.isVisible -import org.schabi.newpipe.MainActivity -import org.schabi.newpipe.ktx.AnimationType -import org.schabi.newpipe.ktx.animate -import org.schabi.newpipe.player.ui.PopupPlayerUi import kotlin.math.abs import kotlin.math.hypot import kotlin.math.max import kotlin.math.min +import org.schabi.newpipe.MainActivity +import org.schabi.newpipe.ktx.AnimationType +import org.schabi.newpipe.ktx.animate +import org.schabi.newpipe.player.ui.PopupPlayerUi class PopupPlayerGestureListener( private val playerUi: PopupPlayerUi, diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt index d221d704b..b2ff4afd4 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt @@ -17,6 +17,7 @@ import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.schedulers.Schedulers +import java.util.function.Consumer import org.schabi.newpipe.MainActivity.DEBUG import org.schabi.newpipe.NewPipeDatabase import org.schabi.newpipe.R @@ -37,7 +38,6 @@ import org.schabi.newpipe.local.playlist.RemotePlaylistManager import org.schabi.newpipe.util.ExtractorHelper import org.schabi.newpipe.util.ServiceHelper import org.schabi.newpipe.util.image.ImageStrategy -import java.util.function.Consumer /** * This class is used to cleanly separate the Service implementation (in diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt index 072a8f332..f50337a22 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt @@ -14,6 +14,8 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.schedulers.Schedulers +import java.util.function.BiConsumer +import java.util.function.Consumer import org.schabi.newpipe.MainActivity import org.schabi.newpipe.NewPipeDatabase import org.schabi.newpipe.R @@ -30,8 +32,6 @@ import org.schabi.newpipe.player.playqueue.SinglePlayQueue import org.schabi.newpipe.util.ChannelTabHelper import org.schabi.newpipe.util.ExtractorHelper import org.schabi.newpipe.util.NavigationHelper -import java.util.function.BiConsumer -import java.util.function.Consumer /** * This class is used to cleanly separate the Service implementation (in diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt index 05719b6d4..c7106003b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt @@ -30,9 +30,9 @@ import android.support.v4.media.session.MediaSessionCompat import android.util.Log import androidx.core.app.NotificationManagerCompat import androidx.media.MediaBrowserServiceCompat -import org.schabi.newpipe.BuildConfig import java.security.MessageDigest import java.security.NoSuchAlgorithmException +import org.schabi.newpipe.BuildConfig /** * Validates that the calling package is authorized to browse a [MediaBrowserServiceCompat]. diff --git a/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt b/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt index 36e0b9ce1..c9901d277 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt @@ -5,13 +5,13 @@ import com.grack.nanojson.JsonArray import com.grack.nanojson.JsonParser import com.grack.nanojson.JsonParserException import com.grack.nanojson.JsonWriter -import org.schabi.newpipe.streams.io.SharpOutputStream -import org.schabi.newpipe.streams.io.StoredFileHelper -import org.schabi.newpipe.util.ZipHelper import java.io.FileNotFoundException import java.io.IOException import java.io.ObjectOutputStream import java.util.zip.ZipOutputStream +import org.schabi.newpipe.streams.io.SharpOutputStream +import org.schabi.newpipe.streams.io.StoredFileHelper +import org.schabi.newpipe.util.ZipHelper class ImportExportManager(private val fileLocator: BackupFileLocator) { companion object { diff --git a/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt b/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt index bfa50beef..6a2d23d21 100644 --- a/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt +++ b/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt @@ -7,9 +7,9 @@ package org.schabi.newpipe.util import android.content.Context import androidx.preference.PreferenceManager +import java.util.regex.Matcher import org.schabi.newpipe.R import org.schabi.newpipe.ktx.getStringSafe -import java.util.regex.Matcher object FilenameUtils { private const val CHARSET_MOST_SPECIAL = "[\\n\\r|?*<\":\\\\>/']+" diff --git a/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt b/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt index 3ea19fa4f..fef7e83c0 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt @@ -2,13 +2,13 @@ package org.schabi.newpipe.util import android.content.pm.PackageManager import androidx.core.content.pm.PackageInfoCompat +import java.time.Instant +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter import org.schabi.newpipe.App import org.schabi.newpipe.error.ErrorInfo import org.schabi.newpipe.error.ErrorUtil.Companion.createNotification import org.schabi.newpipe.error.UserAction -import java.time.Instant -import java.time.ZonedDateTime -import java.time.format.DateTimeFormatter object ReleaseVersionUtil { // Public key of the certificate that is used in NewPipe release versions diff --git a/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt index aa59b4d0a..a2a482f4a 100644 --- a/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt +++ b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt @@ -5,9 +5,9 @@ package org.schabi.newpipe.util.image +import kotlin.math.abs import org.schabi.newpipe.extractor.Image import org.schabi.newpipe.extractor.Image.ResolutionLevel -import kotlin.math.abs object ImageStrategy { // when preferredImageQuality is LOW or MEDIUM, images are sorted by how close their preferred diff --git a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt index 9b4b500f0..d222b1b1e 100644 --- a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt +++ b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt @@ -16,9 +16,9 @@ import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.core.SingleEmitter import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.schedulers.Schedulers +import java.time.Instant import org.schabi.newpipe.BuildConfig import org.schabi.newpipe.DownloaderImpl -import java.time.Instant class PoTokenWebView private constructor( context: Context, diff --git a/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt b/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt index c2f9dc9b2..712e4ee0b 100644 --- a/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt +++ b/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt @@ -1,13 +1,13 @@ package us.shandian.giga.get import android.os.Parcelable +import java.io.Serializable import kotlinx.parcelize.Parcelize import org.schabi.newpipe.extractor.MediaFormat import org.schabi.newpipe.extractor.stream.AudioStream import org.schabi.newpipe.extractor.stream.Stream import org.schabi.newpipe.extractor.stream.SubtitlesStream import org.schabi.newpipe.extractor.stream.VideoStream -import java.io.Serializable @Parcelize class MissionRecoveryInfo( diff --git a/app/src/test/java/org/schabi/newpipe/NewVersionManagerTest.kt b/app/src/test/java/org/schabi/newpipe/NewVersionManagerTest.kt index 7a2d965f7..f10d9553f 100644 --- a/app/src/test/java/org/schabi/newpipe/NewVersionManagerTest.kt +++ b/app/src/test/java/org/schabi/newpipe/NewVersionManagerTest.kt @@ -1,14 +1,14 @@ package org.schabi.newpipe +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter +import kotlin.math.abs import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test import org.schabi.newpipe.util.ReleaseVersionUtil.coerceUpdateCheckExpiry import org.schabi.newpipe.util.ReleaseVersionUtil.isLastUpdateCheckExpired -import java.time.Instant -import java.time.ZoneId -import java.time.format.DateTimeFormatter -import kotlin.math.abs class NewVersionManagerTest { diff --git a/app/src/test/java/org/schabi/newpipe/ktx/ThrowableExtensionsTest.kt b/app/src/test/java/org/schabi/newpipe/ktx/ThrowableExtensionsTest.kt index ca2d04c85..fb7c1afe5 100644 --- a/app/src/test/java/org/schabi/newpipe/ktx/ThrowableExtensionsTest.kt +++ b/app/src/test/java/org/schabi/newpipe/ktx/ThrowableExtensionsTest.kt @@ -1,12 +1,12 @@ package org.schabi.newpipe.ktx -import org.junit.Assert.assertFalse -import org.junit.Assert.assertTrue -import org.junit.Test import java.io.IOException import java.io.InterruptedIOException import java.net.SocketException import javax.net.ssl.SSLException +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test class ThrowableExtensionsTest { @Test fun `assignable causes`() { diff --git a/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt b/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt index 862ac3b80..31f57a37f 100644 --- a/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt +++ b/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt @@ -1,6 +1,9 @@ package org.schabi.newpipe.settings import android.content.SharedPreferences +import java.io.File +import java.io.IOException +import java.nio.file.Files import org.junit.Assert import org.junit.Test import org.mockito.Mockito @@ -8,9 +11,6 @@ import org.schabi.newpipe.settings.export.BackupFileLocator import org.schabi.newpipe.settings.export.ImportExportManager import org.schabi.newpipe.streams.io.StoredFileHelper import us.shandian.giga.io.FileStream -import java.io.File -import java.io.IOException -import java.nio.file.Files class ImportAllCombinationsTest { diff --git a/app/src/test/java/org/schabi/newpipe/settings/ImportExportManagerTest.kt b/app/src/test/java/org/schabi/newpipe/settings/ImportExportManagerTest.kt index 5b8023561..e2ff22134 100644 --- a/app/src/test/java/org/schabi/newpipe/settings/ImportExportManagerTest.kt +++ b/app/src/test/java/org/schabi/newpipe/settings/ImportExportManagerTest.kt @@ -2,6 +2,10 @@ package org.schabi.newpipe.settings import android.content.SharedPreferences import com.grack.nanojson.JsonParser +import java.io.File +import java.io.ObjectInputStream +import java.nio.file.Files +import java.util.zip.ZipFile import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertThrows @@ -23,10 +27,6 @@ import org.schabi.newpipe.settings.export.BackupFileLocator import org.schabi.newpipe.settings.export.ImportExportManager import org.schabi.newpipe.streams.io.StoredFileHelper import us.shandian.giga.io.FileStream -import java.io.File -import java.io.ObjectInputStream -import java.nio.file.Files -import java.util.zip.ZipFile @RunWith(MockitoJUnitRunner::class) class ImportExportManagerTest { diff --git a/app/src/test/java/org/schabi/newpipe/util/LocalizationTest.kt b/app/src/test/java/org/schabi/newpipe/util/LocalizationTest.kt index ab6396951..081d1c545 100644 --- a/app/src/test/java/org/schabi/newpipe/util/LocalizationTest.kt +++ b/app/src/test/java/org/schabi/newpipe/util/LocalizationTest.kt @@ -1,12 +1,12 @@ package org.schabi.newpipe.util -import org.junit.Assert.assertEquals -import org.junit.Test -import org.ocpsoft.prettytime.PrettyTime import java.time.LocalDate import java.time.OffsetDateTime import java.time.ZoneOffset import java.util.Locale +import org.junit.Assert.assertEquals +import org.junit.Test +import org.ocpsoft.prettytime.PrettyTime class LocalizationTest { @Test(expected = NullPointerException::class) From 2c808b0e86a1ca2792a8183b706e8a581dbb8f3a Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 15:34:06 +0800 Subject: [PATCH 143/190] ktlint: Fix ktlint_standard_annotation violations Signed-off-by: Aayush Gupta --- .editorconfig | 1 - .../schabi/newpipe/local/feed/FeedFragment.kt | 5 ++- .../subscription/dialog/FeedGroupDialog.kt | 43 +++++++++++++++---- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/.editorconfig b/.editorconfig index 8c6c145ba..8a779c261 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,7 +10,6 @@ ktlint_code_style = android_studio # https://pinterest.github.io/ktlint/latest/rules/standard/#function-naming ktlint_function_naming_ignore_when_annotated_with = Composable -ktlint_standard_annotation = disabled ktlint_standard_argument-list-wrapping = disabled ktlint_standard_backing-property-naming = disabled ktlint_standard_blank-line-before-declaration = disabled diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index 2663dc5d3..b4b23a503 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -91,7 +91,10 @@ class FeedFragment : BaseStateFragment() { private val disposables = CompositeDisposable() private lateinit var viewModel: FeedViewModel - @State @JvmField var listState: Parcelable? = null + + @State + @JvmField + var listState: Parcelable? = null private var groupId = FeedGroupEntity.GROUP_ALL_ID private var groupName = "" diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt index 88254dfbd..094b1c17f 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt @@ -61,16 +61,41 @@ class FeedGroupDialog : DialogFragment(), BackPressable { data object DeleteScreen : ScreenState() } - @State @JvmField var selectedIcon: FeedGroupIcon? = null - @State @JvmField var selectedSubscriptions: HashSet = HashSet() - @State @JvmField var wasSubscriptionSelectionChanged: Boolean = false - @State @JvmField var currentScreen: ScreenState = InitialScreen + @State + @JvmField + var selectedIcon: FeedGroupIcon? = null - @State @JvmField var subscriptionsListState: Parcelable? = null - @State @JvmField var iconsListState: Parcelable? = null - @State @JvmField var wasSearchSubscriptionsVisible = false - @State @JvmField var subscriptionsCurrentSearchQuery = "" - @State @JvmField var subscriptionsShowOnlyUngrouped = false + @State + @JvmField + var selectedSubscriptions: HashSet = HashSet() + + @State + @JvmField + var wasSubscriptionSelectionChanged: Boolean = false + + @State + @JvmField + var currentScreen: ScreenState = InitialScreen + + @State + @JvmField + var subscriptionsListState: Parcelable? = null + + @State + @JvmField + var iconsListState: Parcelable? = null + + @State + @JvmField + var wasSearchSubscriptionsVisible = false + + @State + @JvmField + var subscriptionsCurrentSearchQuery = "" + + @State + @JvmField + var subscriptionsShowOnlyUngrouped = false private val subscriptionMainSection = Section() private val subscriptionEmptyFooter = Section() From 0641c19388ff4ac55e52ba14e9bc048f72f90fe9 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 16:44:28 +0800 Subject: [PATCH 144/190] ktlint: Fix multi-line if-else violations Signed-off-by: Aayush Gupta --- .editorconfig | 1 - .../schabi/newpipe/local/feed/FeedViewModel.kt | 5 +++-- .../player/gesture/BasePlayerGestureListener.kt | 15 ++++++++++----- .../player/gesture/MainPlayerGestureListener.kt | 9 ++++++--- .../player/gesture/PopupPlayerGestureListener.kt | 9 ++++++--- .../mediabrowser/MediaBrowserPlaybackPreparer.kt | 5 +++-- .../newpipe/util/potoken/PoTokenException.kt | 5 +++-- .../newpipe/views/player/PlayerFastSeekOverlay.kt | 9 ++++++--- 8 files changed, 37 insertions(+), 21 deletions(-) diff --git a/.editorconfig b/.editorconfig index 8a779c261..8be8d250e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -26,7 +26,6 @@ ktlint_standard_kdoc = disabled ktlint_standard_max-line-length = disabled ktlint_standard_mixed-condition-operators = disabled ktlint_standard_multiline-expression-wrapping = disabled -ktlint_standard_multiline-if-else = disabled ktlint_standard_no-blank-line-in-list = disabled ktlint_standard_no-consecutive-comments = disabled ktlint_standard_no-empty-first-line-in-class-body = disabled diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt index 6ca06e2f8..cf0150332 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt @@ -73,12 +73,13 @@ class FeedViewModel( .subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) .map { (event, showPlayedItems, showPartiallyPlayedItems, showFutureItems, notLoadedCount, oldestUpdate) -> - val streamItems = if (event is SuccessResultEvent || event is IdleEvent) + val streamItems = if (event is SuccessResultEvent || event is IdleEvent) { feedDatabaseManager .getStreams(groupId, showPlayedItems, showPartiallyPlayedItems, showFutureItems) .blockingGet(arrayListOf()) - else + } else { arrayListOf() + } CombineResultDataHolder(event, streamItems, notLoadedCount, oldestUpdate) } diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt index 0453f297a..36ee5e05e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt @@ -86,8 +86,9 @@ abstract class BasePlayerGestureListener( // /////////////////////////////////////////////////////////////////// override fun onDown(e: MotionEvent): Boolean { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "onDown called with e = [$e]") + } if (isDoubleTapping && isDoubleTapEnabled) { doubleTapControls?.onDoubleTapProgressDown(getDisplayPortion(e)) @@ -108,8 +109,9 @@ abstract class BasePlayerGestureListener( } override fun onDoubleTap(e: MotionEvent): Boolean { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "onDoubleTap called with e = [$e]") + } onDoubleTap(e, getDisplayPortion(e)) return true @@ -136,8 +138,9 @@ abstract class BasePlayerGestureListener( private fun startMultiDoubleTap(e: MotionEvent) { if (!isDoubleTapping) { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "startMultiDoubleTap called with e = [$e]") + } keepInDoubleTapMode() doubleTapControls?.onDoubleTapStarted(getDisplayPortion(e)) @@ -145,8 +148,9 @@ abstract class BasePlayerGestureListener( } fun keepInDoubleTapMode() { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "keepInDoubleTapMode called") + } isDoubleTapping = true doubleTapHandler.removeCallbacksAndMessages(DOUBLE_TAP) @@ -161,8 +165,9 @@ abstract class BasePlayerGestureListener( } fun endMultiDoubleTap() { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "endMultiDoubleTap called") + } isDoubleTapping = false doubleTapHandler.removeCallbacksAndMessages(DOUBLE_TAP) diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index 435dfc79a..1cd297414 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -51,15 +51,18 @@ class MainPlayerGestureListener( } override fun onSingleTapConfirmed(e: MotionEvent): Boolean { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "onSingleTapConfirmed() called with: e = [$e]") + } - if (isDoubleTapping) + if (isDoubleTapping) { return true + } super.onSingleTapConfirmed(e) - if (player.currentState != Player.STATE_BLOCKED) + if (player.currentState != Player.STATE_BLOCKED) { onSingleTap() + } return true } diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt index 57dcb6d92..70cfd1e95 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt @@ -205,13 +205,16 @@ class PopupPlayerGestureListener( } override fun onSingleTapConfirmed(e: MotionEvent): Boolean { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "onSingleTapConfirmed() called with: e = [$e]") + } - if (isDoubleTapping) + if (isDoubleTapping) { return true - if (player.exoPlayerIsNull()) + } + if (player.exoPlayerIsNull()) { return false + } onSingleTap() return true diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt index f50337a22..62e8032fd 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt @@ -185,10 +185,11 @@ class MediaBrowserPlaybackPreparer( } val playlistId = path[0].toLong() val index = path[1].toInt() - return if (playlistType == ID_LOCAL) + return if (playlistType == ID_LOCAL) { extractLocalPlayQueue(playlistId, index) - else + } else { extractRemotePlayQueue(playlistId, index) + } } ID_URL -> { diff --git a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenException.kt b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenException.kt index 879f8f3e6..683fd48b2 100644 --- a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenException.kt +++ b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenException.kt @@ -6,8 +6,9 @@ class PoTokenException(message: String) : Exception(message) class BadWebViewException(message: String) : Exception(message) fun buildExceptionForJsError(error: String): Exception { - return if (error.contains("SyntaxError")) + return if (error.contains("SyntaxError")) { BadWebViewException(error) - else + } else { PoTokenException(error) + } } diff --git a/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt b/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt index 877070a91..86e8ce311 100644 --- a/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt +++ b/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt @@ -52,8 +52,9 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : private var initTap: Boolean = false override fun onDoubleTapStarted(portion: DisplayPortion) { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "onDoubleTapStarted called with portion = [$portion]") + } initTap = false @@ -64,7 +65,7 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : val shouldForward: Boolean = performListener?.getFastSeekDirection(portion)?.directionAsBoolean ?: return - if (DEBUG) + if (DEBUG) { Log.d( TAG, "onDoubleTapProgressDown called with " + @@ -72,6 +73,7 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : "wasForwarding = [$wasForwarding], " + "initTap = [$initTap], " ) + } /* * Check if a initial tap occurred or if direction was switched @@ -97,8 +99,9 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : } override fun onDoubleTapFinished() { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "onDoubleTapFinished called with initTap = [$initTap]") + } if (initTap) performListener?.onDoubleTapEnd() initTap = false From 247cbf3d6f3a920344c5588d8ead5af0ad844c7b Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 16:46:26 +0800 Subject: [PATCH 145/190] ktlint: Drop non-required violation supressions Signed-off-by: Aayush Gupta --- .editorconfig | 3 --- 1 file changed, 3 deletions(-) diff --git a/.editorconfig b/.editorconfig index 8be8d250e..fe250c80a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -30,7 +30,6 @@ ktlint_standard_no-blank-line-in-list = disabled ktlint_standard_no-consecutive-comments = disabled ktlint_standard_no-empty-first-line-in-class-body = disabled ktlint_standard_no-empty-first-line-in-method-block = disabled -ktlint_standard_no-line-break-after-else = disabled ktlint_standard_no-semi = disabled ktlint_standard_no-single-line-block-comment = disabled ktlint_standard_package-name = disabled @@ -42,5 +41,3 @@ ktlint_standard_statement-wrapping = disabled ktlint_standard_string-template-indent = disabled ktlint_standard_trailing-comma-on-call-site = disabled ktlint_standard_trailing-comma-on-declaration-site = disabled -ktlint_standard_try-catch-finally-spacing = disabled -ktlint_standard_when-entry-bracing = disabled From d6f3dee9f465d6da0b59ca56e37f861552c97d1f Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 16:46:59 +0800 Subject: [PATCH 146/190] ktlint: Drop unused semi-colons Signed-off-by: Aayush Gupta --- .editorconfig | 1 - app/src/main/java/org/schabi/newpipe/error/UserAction.kt | 2 +- .../org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt | 2 +- .../org/schabi/newpipe/settings/ImportAllCombinationsTest.kt | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.editorconfig b/.editorconfig index fe250c80a..aac610b87 100644 --- a/.editorconfig +++ b/.editorconfig @@ -30,7 +30,6 @@ ktlint_standard_no-blank-line-in-list = disabled ktlint_standard_no-consecutive-comments = disabled ktlint_standard_no-empty-first-line-in-class-body = disabled ktlint_standard_no-empty-first-line-in-method-block = disabled -ktlint_standard_no-semi = disabled ktlint_standard_no-single-line-block-comment = disabled ktlint_standard_package-name = disabled ktlint_standard_parameter-list-wrapping = disabled diff --git a/app/src/main/java/org/schabi/newpipe/error/UserAction.kt b/app/src/main/java/org/schabi/newpipe/error/UserAction.kt index 2d2358310..b3f14e2da 100644 --- a/app/src/main/java/org/schabi/newpipe/error/UserAction.kt +++ b/app/src/main/java/org/schabi/newpipe/error/UserAction.kt @@ -40,5 +40,5 @@ enum class UserAction(val message: String) { OPEN_INFO_ITEM_DIALOG("open info item dialog"), GETTING_MAIN_SCREEN_TAB("getting main screen tab"), PLAY_ON_POPUP("play on popup"), - SUBSCRIPTIONS("loading subscriptions"); + SUBSCRIPTIONS("loading subscriptions") } diff --git a/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt b/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt index 86e8ce311..4a4f4509c 100644 --- a/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt +++ b/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt @@ -135,7 +135,7 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : enum class FastSeekDirection(val directionAsBoolean: Boolean?) { NONE(null), FORWARD(true), - BACKWARD(false); + BACKWARD(false) } } diff --git a/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt b/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt index 31f57a37f..314e3c484 100644 --- a/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt +++ b/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt @@ -21,7 +21,7 @@ class ImportAllCombinationsTest { private enum class Ser(val id: String) { YES("ser"), VULNERABLE("vulnser"), - NO("noser"); + NO("noser") } private data class FailData( From c76d14dfd4806a13158e2e63bf3ba709f1b44b21 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 16:48:46 +0800 Subject: [PATCH 147/190] ktlint: Drop unused trailing commas Signed-off-by: Aayush Gupta --- .editorconfig | 2 -- .../org/schabi/newpipe/database/FeedDAOTest.kt | 4 ++-- .../local/history/HistoryRecordManagerTest.kt | 12 ++++++------ .../newpipe/util/StreamItemAdapterTest.kt | 2 +- .../org/schabi/newpipe/about/AboutActivity.kt | 2 +- .../org/schabi/newpipe/database/LocalItem.kt | 2 +- .../history/model/SearchHistoryEntry.kt | 2 +- .../history/model/StreamHistoryEntry.kt | 2 +- .../database/playlist/model/PlaylistEntity.kt | 2 +- .../java/org/schabi/newpipe/error/ErrorInfo.kt | 18 +++++++++--------- .../schabi/newpipe/error/ErrorPanelHelper.kt | 2 +- .../feed/notifications/NotificationWorker.kt | 2 +- .../local/feed/service/FeedLoadManager.kt | 4 ++-- .../local/feed/service/FeedLoadState.kt | 2 +- .../local/feed/service/FeedUpdateInfo.kt | 6 +++--- .../local/subscription/SubscriptionFragment.kt | 2 +- .../subscription/item/FeedGroupCardGridItem.kt | 2 +- .../gesture/BasePlayerGestureListener.kt | 2 +- .../gesture/PopupPlayerGestureListener.kt | 2 +- .../player/mediabrowser/MediaBrowserImpl.kt | 12 ++++++------ .../MediaBrowserPlaybackPreparer.kt | 8 ++++---- .../settings/export/ImportExportManager.kt | 4 ++-- .../NotificationModeConfigFragment.kt | 2 +- .../newpipe/util/potoken/PoTokenWebView.kt | 16 ++++++++-------- .../settings/ImportAllCombinationsTest.kt | 4 ++-- 25 files changed, 58 insertions(+), 60 deletions(-) diff --git a/.editorconfig b/.editorconfig index aac610b87..897c1b288 100644 --- a/.editorconfig +++ b/.editorconfig @@ -38,5 +38,3 @@ ktlint_standard_spacing-between-declarations-with-annotations = disabled ktlint_standard_spacing-between-declarations-with-comments = disabled ktlint_standard_statement-wrapping = disabled ktlint_standard_string-template-indent = disabled -ktlint_standard_trailing-comma-on-call-site = disabled -ktlint_standard_trailing-comma-on-declaration-site = disabled diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt index 80d590f24..5216273a0 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt @@ -111,7 +111,7 @@ class FeedDAOTest { SubscriptionEntity.from(ChannelInfo(serviceId, "1", "https://youtube.com/channel/1", "https://youtube.com/channel/1", "channel-1")), SubscriptionEntity.from(ChannelInfo(serviceId, "2", "https://youtube.com/channel/2", "https://youtube.com/channel/2", "channel-2")), SubscriptionEntity.from(ChannelInfo(serviceId, "3", "https://youtube.com/channel/3", "https://youtube.com/channel/3", "channel-3")), - SubscriptionEntity.from(ChannelInfo(serviceId, "4", "https://youtube.com/channel/4", "https://youtube.com/channel/4", "channel-4")), + SubscriptionEntity.from(ChannelInfo(serviceId, "4", "https://youtube.com/channel/4", "https://youtube.com/channel/4", "channel-4")) ) ) feedDAO.insertAll( @@ -122,7 +122,7 @@ class FeedDAOTest { FeedEntity(4, 2), FeedEntity(5, 2), FeedEntity(6, 3), - FeedEntity(7, 4), + FeedEntity(7, 4) ) ) } diff --git a/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt b/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt index c4c93d6d5..06c0fd09c 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt @@ -54,7 +54,7 @@ class HistoryRecordManagerTest { SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 0, search = "A"), SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 2, search = "A"), SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 1, search = "B"), - SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 0, search = "B"), + SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 0, search = "B") ) // make sure all 4 were inserted @@ -85,7 +85,7 @@ class HistoryRecordManagerTest { val entries = listOf( SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 1, search = "A"), SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 2, search = "B"), - SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 0, search = "C"), + SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 0, search = "C") ) // make sure all 3 were inserted @@ -121,7 +121,7 @@ class HistoryRecordManagerTest { RELATED_SEARCHES_ENTRIES[6].search, // A (even if in two places) RELATED_SEARCHES_ENTRIES[4].search, // B RELATED_SEARCHES_ENTRIES[5].search, // AA - RELATED_SEARCHES_ENTRIES[2].search, // BA + RELATED_SEARCHES_ENTRIES[2].search // BA ) } @@ -136,7 +136,7 @@ class HistoryRecordManagerTest { SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 3, search = "A"), SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 3, search = "A"), SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 0, search = "A"), - SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 2, search = "AA"), + SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 2, search = "AA") ) insertShuffledRelatedSearches(relatedSearches) @@ -153,7 +153,7 @@ class HistoryRecordManagerTest { assertThat(searches).containsExactly( RELATED_SEARCHES_ENTRIES[6].search, // A (even if in two places) RELATED_SEARCHES_ENTRIES[5].search, // AA - RELATED_SEARCHES_ENTRIES[1].search, // BA + RELATED_SEARCHES_ENTRIES[1].search // BA ) // also make sure that the string comparison is case insensitive @@ -171,7 +171,7 @@ class HistoryRecordManagerTest { SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 3, search = "A"), SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 0, search = "B"), SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 2, search = "AA"), - SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 1, search = "A"), + SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 1, search = "A") ) } } diff --git a/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt b/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt index 9b8ee211e..da23bdfec 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt @@ -292,7 +292,7 @@ class StreamItemAdapterTest { Assert.assertEquals( "normal visibility (pos=[$position]) is not correct", findViewById(R.id.wo_sound_icon).visibility, - normalVisibility, + normalVisibility ) } spinner.adapter.getDropDownView(position, null, spinner).run { diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt index 826616e59..0bed7ac60 100644 --- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt +++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt @@ -195,7 +195,7 @@ class AboutActivity : AppCompatActivity() { SoftwareComponent( "SearchPreference", "2018", "ByteHamster", "https://github.com/ByteHamster/SearchPreference", StandardLicenses.MIT - ), + ) ) } } diff --git a/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt b/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt index 50529610b..944b247bf 100644 --- a/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt +++ b/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt @@ -14,6 +14,6 @@ interface LocalItem { PLAYLIST_REMOTE_ITEM, PLAYLIST_STREAM_ITEM, - STATISTIC_STREAM_ITEM, + STATISTIC_STREAM_ITEM } } diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt index e6006a069..eee213453 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt @@ -29,7 +29,7 @@ data class SearchHistoryEntry @JvmOverloads constructor( @ColumnInfo(name = ID) @PrimaryKey(autoGenerate = true) - val id: Long = 0, + val id: Long = 0 ) { @Ignore diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt index ece55269a..57d47d0ac 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt @@ -35,7 +35,7 @@ data class StreamHistoryEntry( streamEntity.serviceId, streamEntity.url, streamEntity.title, - streamEntity.streamType, + streamEntity.streamType ).apply { duration = streamEntity.duration uploaderName = streamEntity.uploader diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt index 4ea4eb3a7..1f1862f4f 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt @@ -37,7 +37,7 @@ data class PlaylistEntity @JvmOverloads constructor( name = item.orderingName, isThumbnailPermanent = item.isThumbnailPermanent!!, thumbnailStreamId = item.thumbnailStreamId!!, - displayIndex = item.displayIndex!!, + displayIndex = item.displayIndex!! ) companion object { diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt index 5056c00e1..2bdea13c0 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt @@ -59,7 +59,7 @@ class ErrorInfo private constructor( * If present, this resource can alternatively be opened in browser (useful if NewPipe is * badly broken). */ - val openInBrowserUrl: String?, + val openInBrowserUrl: String? ) : Parcelable { @JvmOverloads @@ -68,7 +68,7 @@ class ErrorInfo private constructor( userAction: UserAction, request: String, serviceId: Int? = null, - openInBrowserUrl: String? = null, + openInBrowserUrl: String? = null ) : this( throwableToStringList(throwable), userAction, @@ -78,7 +78,7 @@ class ErrorInfo private constructor( isReportable(throwable), isRetryable(throwable), (throwable as? ReCaptchaException)?.url, - openInBrowserUrl, + openInBrowserUrl ) @JvmOverloads @@ -87,7 +87,7 @@ class ErrorInfo private constructor( userAction: UserAction, request: String, serviceId: Int? = null, - openInBrowserUrl: String? = null, + openInBrowserUrl: String? = null ) : this( throwableListToStringList(throwables), userAction, @@ -97,7 +97,7 @@ class ErrorInfo private constructor( throwables.any(::isReportable), throwables.isEmpty() || throwables.any(::isRetryable), throwables.firstNotNullOfOrNull { it as? ReCaptchaException }?.url, - openInBrowserUrl, + openInBrowserUrl ) // constructor to manually build ErrorInfo when no throwable is available @@ -118,7 +118,7 @@ class ErrorInfo private constructor( throwable: Throwable, userAction: UserAction, request: String, - info: Info?, + info: Info? ) : this(throwable, userAction, request, info?.serviceId, info?.url) @@ -127,7 +127,7 @@ class ErrorInfo private constructor( throwables: List, userAction: UserAction, request: String, - info: Info?, + info: Info? ) : this(throwables, userAction, request, info?.serviceId, info?.url) @@ -144,7 +144,7 @@ class ErrorInfo private constructor( class ErrorMessage( @StringRes private val stringRes: Int, - private vararg val formatArgs: String, + private vararg val formatArgs: String ) : Parcelable { fun getString(context: Context): String { return if (formatArgs.isEmpty()) { @@ -174,7 +174,7 @@ class ErrorInfo private constructor( fun getMessage( throwable: Throwable?, action: UserAction?, - serviceId: Int?, + serviceId: Int? ): ErrorMessage { return when { // player exceptions diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt index 9d503a935..023d13e9d 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt @@ -20,7 +20,7 @@ import org.schabi.newpipe.util.external_communication.ShareUtils class ErrorPanelHelper( private val fragment: Fragment, rootView: View, - onRetry: Runnable?, + onRetry: Runnable? ) { private val context: Context = rootView.context!! diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt index 0f66186b8..36be86fcd 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt @@ -31,7 +31,7 @@ import org.schabi.newpipe.local.feed.service.FeedLoadService */ class NotificationWorker( appContext: Context, - workerParams: WorkerParameters, + workerParams: WorkerParameters ) : RxWorker(appContext, workerParams) { private val notificationHelper by lazy { diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt index 0befb3af7..1da3e277b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt @@ -60,7 +60,7 @@ class FeedLoadManager(private val context: Context) { */ fun startLoading( groupId: Long = FeedGroupEntity.GROUP_ALL_ID, - ignoreOutdatedThreshold: Boolean = false, + ignoreOutdatedThreshold: Boolean = false ): Single>> { val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) val useFeedExtractor = defaultSharedPreferences.getBoolean( @@ -234,7 +234,7 @@ class FeedLoadManager(private val context: Context) { subscriptionEntity, originalInfo!!, streams!!, - errors, + errors ) ) } catch (e: Throwable) { diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadState.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadState.kt index 703f593ad..2aedf0925 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadState.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadState.kt @@ -3,5 +3,5 @@ package org.schabi.newpipe.local.feed.service data class FeedLoadState( val updateDescription: String, val maxProgress: Int, - val currentProgress: Int, + val currentProgress: Int ) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt index b44eec353..fb4a27913 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt @@ -25,13 +25,13 @@ data class FeedUpdateInfo( val description: String?, val subscriberCount: Long?, val streams: List, - val errors: List, + val errors: List ) { constructor( subscription: SubscriptionEntity, info: Info, streams: List, - errors: List, + errors: List ) : this( uid = subscription.uid, notificationMode = subscription.notificationMode, @@ -46,7 +46,7 @@ data class FeedUpdateInfo( description = (info as? ChannelInfo)?.description, subscriberCount = (info as? ChannelInfo)?.subscriberCount, streams = streams, - errors = errors, + errors = errors ) /** diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt index 5a69c3b41..f913c845a 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt @@ -309,7 +309,7 @@ class SubscriptionFragment : BaseStateFragment() { title = getString(R.string.feed_groups_header_title), onSortClicked = ::openReorderDialog, onToggleListViewModeClicked = ::toggleListViewMode, - listViewMode = viewModel.getListViewMode(), + listViewMode = viewModel.getListViewMode() ) add(Section(feedGroupsSortMenuItem, listOf(feedGroupsCarousel))) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardGridItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardGridItem.kt index 5a9d6887b..c78801c03 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardGridItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardGridItem.kt @@ -10,7 +10,7 @@ import org.schabi.newpipe.local.subscription.FeedGroupIcon data class FeedGroupCardGridItem( val groupId: Long = FeedGroupEntity.GROUP_ALL_ID, val name: String, - val icon: FeedGroupIcon, + val icon: FeedGroupIcon ) : BindableItem() { constructor (feedGroupEntity: FeedGroupEntity) : this(feedGroupEntity.uid, feedGroupEntity.name, feedGroupEntity.icon) diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt index 36ee5e05e..8682adc43 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt @@ -18,7 +18,7 @@ import org.schabi.newpipe.player.ui.VideoPlayerUi * and provides some abstract methods to make it easier separating the logic from the UI. */ abstract class BasePlayerGestureListener( - private val playerUi: VideoPlayerUi, + private val playerUi: VideoPlayerUi ) : GestureDetector.SimpleOnGestureListener(), View.OnTouchListener { protected val player: Player = playerUi.player diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt index 70cfd1e95..60752652e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt @@ -15,7 +15,7 @@ import org.schabi.newpipe.ktx.animate import org.schabi.newpipe.player.ui.PopupPlayerUi class PopupPlayerGestureListener( - private val playerUi: PopupPlayerUi, + private val playerUi: PopupPlayerUi ) : BasePlayerGestureListener(playerUi) { private var isMoving = false diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt index b2ff4afd4..cc09765f4 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt @@ -47,7 +47,7 @@ import org.schabi.newpipe.util.image.ImageStrategy */ class MediaBrowserImpl( private val context: Context, - notifyChildrenChanged: Consumer, // parentId + notifyChildrenChanged: Consumer // parentId ) { private val packageValidator = PackageValidator(context) private val database = NewPipeDatabase.getInstance(context) @@ -204,12 +204,12 @@ class MediaBrowserImpl( val extras = Bundle() extras.putString( MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE, - context.resources.getString(R.string.tab_bookmarks), + context.resources.getString(R.string.tab_bookmarks) ) builder.setExtras(extras) return MediaBrowserCompat.MediaItem( builder.build(), - MediaBrowserCompat.MediaItem.FLAG_BROWSABLE, + MediaBrowserCompat.MediaItem.FLAG_BROWSABLE ) } @@ -266,7 +266,7 @@ class MediaBrowserImpl( private fun createLocalPlaylistStreamMediaItem( playlistId: Long, item: PlaylistStreamEntry, - index: Int, + index: Int ): MediaBrowserCompat.MediaItem { val builder = MediaDescriptionCompat.Builder() builder.setMediaId(createMediaIdForPlaylistIndex(false, playlistId, index)) @@ -283,7 +283,7 @@ class MediaBrowserImpl( private fun createRemotePlaylistStreamMediaItem( playlistId: Long, item: StreamInfoItem, - index: Int, + index: Int ): MediaBrowserCompat.MediaItem { val builder = MediaDescriptionCompat.Builder() builder.setMediaId(createMediaIdForPlaylistIndex(true, playlistId, index)) @@ -303,7 +303,7 @@ class MediaBrowserImpl( private fun createMediaIdForPlaylistIndex( isRemote: Boolean, playlistId: Long, - index: Int, + index: Int ): String { return buildLocalPlaylistItemMediaId(isRemote, playlistId) .appendPath(index.toString()) diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt index 62e8032fd..a76eaf737 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt @@ -51,7 +51,7 @@ class MediaBrowserPlaybackPreparer( private val context: Context, private val setMediaSessionError: BiConsumer, // error string, error code private val clearMediaSessionError: Runnable, - private val onPrepare: Consumer, + private val onPrepare: Consumer ) : PlaybackPreparer { private val database = NewPipeDatabase.getInstance(context) private var disposable: Disposable? = null @@ -172,7 +172,7 @@ class MediaBrowserPlaybackPreparer( private fun extractPlayQueueFromPlaylistMediaId( mediaId: String, path: MutableList, - url: String?, + url: String? ): Single { if (path.isEmpty()) { throw parseError(mediaId) @@ -209,7 +209,7 @@ class MediaBrowserPlaybackPreparer( @Throws(ContentNotAvailableException::class) private fun extractPlayQueueFromHistoryMediaId( mediaId: String, - path: List, + path: List ): Single { if (path.size != 1) { throw parseError(mediaId) @@ -230,7 +230,7 @@ class MediaBrowserPlaybackPreparer( private fun extractPlayQueueFromInfoItemMediaId( mediaId: String, path: List, - url: String, + url: String ): Single { if (path.size != 2) { throw parseError(mediaId) diff --git a/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt b/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt index c9901d277..8154338ce 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt @@ -31,7 +31,7 @@ class ImportExportManager(private val fileLocator: BackupFileLocator) { ZipHelper.addFileToZip( outZip, BackupFileLocator.FILE_NAME_DB, - fileLocator.db.path, + fileLocator.db.path ) // add the legacy vulnerable serialized preferences (will be removed in the future) @@ -78,7 +78,7 @@ class ImportExportManager(private val fileLocator: BackupFileLocator) { val success = ZipHelper.extractFileFromZip( file, BackupFileLocator.FILE_NAME_DB, - fileLocator.db.path, + fileLocator.db.path ) if (success) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigFragment.kt b/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigFragment.kt index 581768c30..097200662 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigFragment.kt @@ -45,7 +45,7 @@ class NotificationModeConfigFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View { _binding = FragmentChannelsNotificationsBinding.inflate(inflater, container, false) return binding.root diff --git a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt index d222b1b1e..6ec41fc07 100644 --- a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt +++ b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt @@ -23,7 +23,7 @@ import org.schabi.newpipe.DownloaderImpl class PoTokenWebView private constructor( context: Context, // to be used exactly once only during initialization! - private val generatorEmitter: SingleEmitter, + private val generatorEmitter: SingleEmitter ) : PoTokenGenerator { private val webView = WebView(context) private val disposables = CompositeDisposable() // used only during initialization @@ -93,7 +93,7 @@ class PoTokenWebView private constructor( ), "text/html", "utf-8", - null, + null ) }, this::onInitializationErrorCloseAndCancel @@ -113,7 +113,7 @@ class PoTokenWebView private constructor( makeBotguardServiceRequest( "https://www.youtube.com/api/jnn/v1/Create", - "[ \"$REQUEST_KEY\" ]", + "[ \"$REQUEST_KEY\" ]" ) { responseBody -> val parsedChallengeData = parseChallengeData(responseBody) webView.evaluateJavascript( @@ -156,7 +156,7 @@ class PoTokenWebView private constructor( } makeBotguardServiceRequest( "https://www.youtube.com/api/jnn/v1/GenerateIT", - "[ \"$REQUEST_KEY\", \"$botguardResponse\" ]", + "[ \"$REQUEST_KEY\", \"$botguardResponse\" ]" ) { responseBody -> if (BuildConfig.DEBUG) { Log.d(TAG, "GenerateIT response: $responseBody") @@ -200,7 +200,7 @@ class PoTokenWebView private constructor( $JS_INTERFACE.onObtainPoTokenResult(identifier, poTokenU8String) } catch (error) { $JS_INTERFACE.onObtainPoTokenError(identifier, error + "\n" + error.stack) - }""", + }""" ) {} } } @@ -294,7 +294,7 @@ class PoTokenWebView private constructor( private fun makeBotguardServiceRequest( url: String, data: String, - handleResponseBody: (String) -> Unit, + handleResponseBody: (String) -> Unit ) { disposables.add( Single.fromCallable { @@ -306,7 +306,7 @@ class PoTokenWebView private constructor( "Accept" to listOf("application/json"), "Content-Type" to listOf("application/json+protobuf"), "x-goog-api-key" to listOf(GOOGLE_API_KEY), - "x-user-agent" to listOf("grpc-web-javascript/0.1"), + "x-user-agent" to listOf("grpc-web-javascript/0.1") ), data.toByteArray() ) @@ -385,7 +385,7 @@ class PoTokenWebView private constructor( */ private fun runOnMainThread( emitterIfPostFails: SingleEmitter, - runnable: Runnable, + runnable: Runnable ) { if (!Handler(Looper.getMainLooper()).post(runnable)) { emitterIfPostFails.onError(PoTokenException("Could not run on main thread")) diff --git a/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt b/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt index 314e3c484..b8dbf35dc 100644 --- a/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt +++ b/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt @@ -29,7 +29,7 @@ class ImportAllCombinationsTest { val containsSer: Ser, val containsJson: Boolean, val filename: String, - val throwable: Throwable, + val throwable: Throwable ) private fun testZipCombination( @@ -37,7 +37,7 @@ class ImportAllCombinationsTest { containsSer: Ser, containsJson: Boolean, filename: String, - runTest: (test: () -> Unit) -> Unit, + runTest: (test: () -> Unit) -> Unit ) { val zipFile = File(classloader.getResource(filename)?.file!!) val zip = Mockito.mock(StoredFileHelper::class.java, Mockito.withSettings().stubOnly()) From 80a543e7ab5ddbcc4dc0e490ed628c55be3ba213 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 16:55:47 +0800 Subject: [PATCH 148/190] ktlint: Fix violation related to comment placement Signed-off-by: Aayush Gupta --- .editorconfig | 1 - .../org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.editorconfig b/.editorconfig index 897c1b288..d2206b4c2 100644 --- a/.editorconfig +++ b/.editorconfig @@ -26,7 +26,6 @@ ktlint_standard_kdoc = disabled ktlint_standard_max-line-length = disabled ktlint_standard_mixed-condition-operators = disabled ktlint_standard_multiline-expression-wrapping = disabled -ktlint_standard_no-blank-line-in-list = disabled ktlint_standard_no-consecutive-comments = disabled ktlint_standard_no-empty-first-line-in-class-body = disabled ktlint_standard_no-empty-first-line-in-method-block = disabled diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt index cc09765f4..c90d141d7 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt @@ -47,7 +47,8 @@ import org.schabi.newpipe.util.image.ImageStrategy */ class MediaBrowserImpl( private val context: Context, - notifyChildrenChanged: Consumer // parentId + // parentId + notifyChildrenChanged: Consumer ) { private val packageValidator = PackageValidator(context) private val database = NewPipeDatabase.getInstance(context) From c60339fc58ba222dab16393d7dde9be64f4fee82 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 16:56:28 +0800 Subject: [PATCH 149/190] ktlint: Drop non-required violation supression Signed-off-by: Aayush Gupta --- .editorconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index d2206b4c2..b53c364fa 100644 --- a/.editorconfig +++ b/.editorconfig @@ -36,4 +36,3 @@ ktlint_standard_property-naming = disabled ktlint_standard_spacing-between-declarations-with-annotations = disabled ktlint_standard_spacing-between-declarations-with-comments = disabled ktlint_standard_statement-wrapping = disabled -ktlint_standard_string-template-indent = disabled From 6190db7d2fa2db90b6f00def6fa138c00412f744 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 16:57:25 +0800 Subject: [PATCH 150/190] ktlint: Fix violations regarding statement wrapping Signed-off-by: Aayush Gupta --- .editorconfig | 1 - .../java/org/schabi/newpipe/info_list/StreamSegmentItem.kt | 5 ++++- .../java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt | 1 - .../schabi/newpipe/local/subscription/item/ChannelItem.kt | 5 ++++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.editorconfig b/.editorconfig index b53c364fa..3a09d1ab5 100644 --- a/.editorconfig +++ b/.editorconfig @@ -35,4 +35,3 @@ ktlint_standard_parameter-list-wrapping = disabled ktlint_standard_property-naming = disabled ktlint_standard_spacing-between-declarations-with-annotations = disabled ktlint_standard_spacing-between-declarations-with-comments = disabled -ktlint_standard_statement-wrapping = disabled diff --git a/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt b/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt index 1e52d3168..a7ca3bd68 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt +++ b/app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt @@ -41,7 +41,10 @@ class StreamSegmentItem( viewHolder.root.findViewById(R.id.textViewStartSeconds).text = Localization.getDurationString(item.startTimeSeconds.toLong()) viewHolder.root.setOnClickListener { onClick.onItemClick(this, item.startTimeSeconds) } - viewHolder.root.setOnLongClickListener { onClick.onItemLongClick(this, item.startTimeSeconds); true } + viewHolder.root.setOnLongClickListener { + onClick.onItemLongClick(this, item.startTimeSeconds) + true + } viewHolder.root.isSelected = isSelected } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt b/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt index 9c7f1ba09..cbe0baec4 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt @@ -64,6 +64,5 @@ private val linkHandler: YoutubeStreamLinkHandlerFactory = YoutubeStreamLinkHand * @return the video id */ private fun getYouTubeId(url: String): String? { - return runCatching { linkHandler.getId(url) }.getOrNull() } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt index bc39dafe6..7946de693 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt @@ -43,7 +43,10 @@ class ChannelItem( gesturesListener?.run { viewHolder.root.setOnClickListener { selected(infoItem) } - viewHolder.root.setOnLongClickListener { held(infoItem); true } + viewHolder.root.setOnLongClickListener { + held(infoItem) + true + } } } From dcb2460c81c61fa0b4346ca2f2b3d5aad8728a2f Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 16:58:49 +0800 Subject: [PATCH 151/190] ktlint: Fix spacing-between-declarations-with-comments violations Signed-off-by: Aayush Gupta --- .editorconfig | 1 - app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.kt | 3 +++ .../java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt | 3 +++ .../org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 3a09d1ab5..fa8c19f71 100644 --- a/.editorconfig +++ b/.editorconfig @@ -34,4 +34,3 @@ ktlint_standard_package-name = disabled ktlint_standard_parameter-list-wrapping = disabled ktlint_standard_property-naming = disabled ktlint_standard_spacing-between-declarations-with-annotations = disabled -ktlint_standard_spacing-between-declarations-with-comments = disabled diff --git a/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.kt b/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.kt index 703191bb9..899223afa 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.kt +++ b/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.kt @@ -13,14 +13,17 @@ enum class ItemViewMode { * Default mode. */ AUTO, + /** * Full width list item with thumb on the left and two line title & uploader in right. */ LIST, + /** * Grid mode places two cards per row. */ GRID, + /** * A full width card in phone - portrait. */ diff --git a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt index 6ec41fc07..9db0e0f59 100644 --- a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt +++ b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt @@ -245,6 +245,7 @@ class PoTokenWebView private constructor( //endregion //region Handling multiple emitters + /** * Adds the ([identifier], [emitter]) pair to the [poTokenEmitters] list. This makes it so that * multiple poToken requests can be generated invparallel, and the results will be notified to @@ -283,6 +284,7 @@ class PoTokenWebView private constructor( //endregion //region Utils + /** * Makes a POST request to [url] with the given [data] by setting the correct headers. Calls * [onInitializationErrorCloseAndCancel] in case of any network errors and also if the response @@ -363,6 +365,7 @@ class PoTokenWebView private constructor( companion object : PoTokenGenerator.Factory { private val TAG = PoTokenWebView::class.simpleName + // Public API key used by BotGuard, which has been got by looking at BotGuard requests private const val GOOGLE_API_KEY = "AIzaSyDyT5W0Jh49F30Pqqtyfdf7pDLFKLJoAnw" // NOSONAR private const val REQUEST_KEY = "O43z0dpjhgX20SCx4KAo" diff --git a/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt b/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt index 4a4f4509c..cfbb4141c 100644 --- a/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt +++ b/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt @@ -126,6 +126,7 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : interface PerformListener { fun onDoubleTap() fun onDoubleTapEnd() + /** * Determines if the playback should forward/rewind or do nothing. */ From e86846ba6aed17a364a758a25e8d2fc5ae5ec1cc Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 17:00:50 +0800 Subject: [PATCH 152/190] ktlint: Fix spacing-between-declarations-with-annotations violations Signed-off-by: Aayush Gupta --- .editorconfig | 1 - .../java/org/schabi/newpipe/settings/export/BackupFileLocator.kt | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index fa8c19f71..4a388f187 100644 --- a/.editorconfig +++ b/.editorconfig @@ -33,4 +33,3 @@ ktlint_standard_no-single-line-block-comment = disabled ktlint_standard_package-name = disabled ktlint_standard_parameter-list-wrapping = disabled ktlint_standard_property-naming = disabled -ktlint_standard_spacing-between-declarations-with-annotations = disabled diff --git a/app/src/main/java/org/schabi/newpipe/settings/export/BackupFileLocator.kt b/app/src/main/java/org/schabi/newpipe/settings/export/BackupFileLocator.kt index c864e4a0d..f44d4f3e2 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/export/BackupFileLocator.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/export/BackupFileLocator.kt @@ -8,6 +8,7 @@ import java.io.File class BackupFileLocator(private val homeDir: File) { companion object { const val FILE_NAME_DB = "newpipe.db" + @Deprecated( "Serializing preferences with Java's ObjectOutputStream is vulnerable to injections", replaceWith = ReplaceWith("FILE_NAME_JSON_PREFS") From ea105e9026417f9734802688398462f0ae55782c Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 17:01:16 +0800 Subject: [PATCH 153/190] ktlint: Drop non-required violation supressions again Signed-off-by: Aayush Gupta --- .editorconfig | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.editorconfig b/.editorconfig index 4a388f187..3d5399585 100644 --- a/.editorconfig +++ b/.editorconfig @@ -25,11 +25,7 @@ ktlint_standard_indent = disabled ktlint_standard_kdoc = disabled ktlint_standard_max-line-length = disabled ktlint_standard_mixed-condition-operators = disabled -ktlint_standard_multiline-expression-wrapping = disabled -ktlint_standard_no-consecutive-comments = disabled ktlint_standard_no-empty-first-line-in-class-body = disabled ktlint_standard_no-empty-first-line-in-method-block = disabled -ktlint_standard_no-single-line-block-comment = disabled ktlint_standard_package-name = disabled -ktlint_standard_parameter-list-wrapping = disabled ktlint_standard_property-naming = disabled From 555cd3acb7a4103d72b5d5faabd9371880a56378 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 17:12:44 +0800 Subject: [PATCH 154/190] ktlint: Fix standard_kdoc violations Signed-off-by: Aayush Gupta --- .editorconfig | 1 - .../schabi/newpipe/player/mediabrowser/PackageValidator.kt | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.editorconfig b/.editorconfig index 3d5399585..c902918f0 100644 --- a/.editorconfig +++ b/.editorconfig @@ -22,7 +22,6 @@ ktlint_standard_function-expression-body = disabled ktlint_standard_function-literal = disabled ktlint_standard_function-signature = disabled ktlint_standard_indent = disabled -ktlint_standard_kdoc = disabled ktlint_standard_max-line-length = disabled ktlint_standard_mixed-condition-operators = disabled ktlint_standard_no-empty-first-line-in-class-body = disabled diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt index c7106003b..0bbc7252d 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt @@ -98,14 +98,14 @@ internal class PackageValidator(context: Context) { callingUid == Process.SYSTEM_UID -> true // If the app was signed by the same certificate as the platform itself, also allow it. callerSignature == platformSignature -> true - /** + /* * [MEDIA_CONTENT_CONTROL] permission is only available to system applications, and * while it isn't required to allow these apps to connect to a * [MediaBrowserServiceCompat], allowing this ensures optimal compatability with apps * such as Android TV and the Google Assistant. */ callerPackageInfo.permissions.contains(MEDIA_CONTENT_CONTROL) -> true - /** + /* * If the calling app has a notification listener it is able to retrieve notifications * and can connect to an active [MediaSessionCompat]. * From 1466dd17b19ec2b5ab5abd3602b8e80d649e042c Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 17:13:44 +0800 Subject: [PATCH 155/190] ktlint: Fix indentation violations Signed-off-by: Aayush Gupta --- .editorconfig | 1 - app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt | 2 +- .../main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt | 2 +- .../main/java/org/schabi/newpipe/util/image/ImageStrategy.kt | 2 +- .../org/schabi/newpipe/settings/ImportAllCombinationsTest.kt | 4 ++-- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.editorconfig b/.editorconfig index c902918f0..a0d679c80 100644 --- a/.editorconfig +++ b/.editorconfig @@ -21,7 +21,6 @@ ktlint_standard_enum-wrapping = disabled ktlint_standard_function-expression-body = disabled ktlint_standard_function-literal = disabled ktlint_standard_function-signature = disabled -ktlint_standard_indent = disabled ktlint_standard_max-line-length = disabled ktlint_standard_mixed-condition-operators = disabled ktlint_standard_no-empty-first-line-in-class-body = disabled diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt index b358a5fd2..7facb5d85 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt @@ -46,7 +46,7 @@ class ErrorUtil { @JvmStatic fun openActivity(context: Context, errorInfo: ErrorInfo) { if (PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(MainActivity.KEY_IS_IN_BACKGROUND, true) + .getBoolean(MainActivity.KEY_IS_IN_BACKGROUND, true) ) { createNotification(context, errorInfo) } else { diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt index cf0150332..481846a2b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt @@ -65,7 +65,7 @@ class FeedViewModel( feedDatabaseManager.oldestSubscriptionUpdate(groupId), Function6 { t1: FeedEventManager.Event, t2: Boolean, t3: Boolean, t4: Boolean, - t5: Long, t6: List -> + t5: Long, t6: List -> return@Function6 CombineResultEventHolder(t1, t2, t3, t4, t5, t6.firstOrNull()) } ) diff --git a/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt index a2a482f4a..b5e17d63e 100644 --- a/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt +++ b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt @@ -68,7 +68,7 @@ object ImageStrategy { val initialComparator = Comparator // the first step splits the images into groups of resolution levels .comparingInt { i: Image -> - return@comparingInt when (i.estimatedResolutionLevel) { + return@comparingInt when (i.estimatedResolutionLevel) { // avoid unknowns as much as possible ResolutionLevel.UNKNOWN -> 3 diff --git a/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt b/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt index b8dbf35dc..a189640a6 100644 --- a/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt +++ b/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt @@ -152,7 +152,7 @@ class ImportAllCombinationsTest { for (containsSer in Ser.entries) { for (containsJson in listOf(true, false)) { val filename = "settings/${if (containsDb) "db" else "nodb"}_${ - containsSer.id}_${if (containsJson) "json" else "nojson"}.zip" + containsSer.id}_${if (containsJson) "json" else "nojson"}.zip" testZipCombination(containsDb, containsSer, containsJson, filename) { test -> try { test() @@ -173,7 +173,7 @@ class ImportAllCombinationsTest { for (a in failedAssertions) { println( "Assertion failed with containsDb=${a.containsDb}, containsSer=${ - a.containsSer}, containsJson=${a.containsJson}, filename=${a.filename}:" + a.containsSer}, containsJson=${a.containsJson}, filename=${a.filename}:" ) a.throwable.printStackTrace() println() From 81fd089a321b7800ab4bf41fcf308e37fe66e7c3 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 17:14:42 +0800 Subject: [PATCH 156/190] ktlint: Fix block comment violations Signed-off-by: Aayush Gupta --- .editorconfig | 1 - .../schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt | 2 +- .../player/mediabrowser/MediaBrowserPlaybackPreparer.kt | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.editorconfig b/.editorconfig index a0d679c80..3869a05ed 100644 --- a/.editorconfig +++ b/.editorconfig @@ -16,7 +16,6 @@ ktlint_standard_blank-line-before-declaration = disabled ktlint_standard_blank-line-between-when-conditions = disabled ktlint_standard_chain-method-continuation = disabled ktlint_standard_class-signature = disabled -ktlint_standard_comment-wrapping = disabled ktlint_standard_enum-wrapping = disabled ktlint_standard_function-expression-body = disabled ktlint_standard_function-literal = disabled diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt index c90d141d7..1e1a2a113 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt @@ -138,7 +138,7 @@ class MediaBrowserImpl( ) } - when (/*val uriType = */path.removeAt(0)) { + when (path.removeAt(0)) { ID_BOOKMARKS -> { if (path.isEmpty()) { return populateBookmarks() diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt index a76eaf737..890c83cfa 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt @@ -146,7 +146,7 @@ class MediaBrowserPlaybackPreparer( throw parseError(mediaId) } - return when (/*val uriType = */path.removeAt(0)) { + return when (path.removeAt(0)) { ID_BOOKMARKS -> extractPlayQueueFromPlaylistMediaId( mediaId, path, @@ -237,7 +237,7 @@ class MediaBrowserPlaybackPreparer( } val serviceId = path[1].toInt() - return when (/*val infoItemType = */infoItemTypeFromString(path[0])) { + return when (infoItemTypeFromString(path[0])) { InfoType.STREAM -> ExtractorHelper.getStreamInfo(serviceId, url, false) .map { SinglePlayQueue(it) } From ff2390b14439e5ff99fa399bd2b2b5a1fc367865 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 17:16:29 +0800 Subject: [PATCH 157/190] ktlint: Fix enum wrapping violations Signed-off-by: Aayush Gupta --- .editorconfig | 1 - app/src/main/java/org/schabi/newpipe/ktx/View.kt | 6 +++++- .../org/schabi/newpipe/player/gesture/DisplayPortion.kt | 6 +++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.editorconfig b/.editorconfig index 3869a05ed..e7c884c15 100644 --- a/.editorconfig +++ b/.editorconfig @@ -16,7 +16,6 @@ ktlint_standard_blank-line-before-declaration = disabled ktlint_standard_blank-line-between-when-conditions = disabled ktlint_standard_chain-method-continuation = disabled ktlint_standard_class-signature = disabled -ktlint_standard_enum-wrapping = disabled ktlint_standard_function-expression-body = disabled ktlint_standard_function-literal = disabled ktlint_standard_function-signature = disabled diff --git a/app/src/main/java/org/schabi/newpipe/ktx/View.kt b/app/src/main/java/org/schabi/newpipe/ktx/View.kt index cf9e4baef..f6d08d143 100644 --- a/app/src/main/java/org/schabi/newpipe/ktx/View.kt +++ b/app/src/main/java/org/schabi/newpipe/ktx/View.kt @@ -287,5 +287,9 @@ private class HideAndExecOnEndListener(private val view: View, execOnEnd: Runnab } enum class AnimationType { - ALPHA, SCALE_AND_ALPHA, LIGHT_SCALE_AND_ALPHA, SLIDE_AND_ALPHA, LIGHT_SLIDE_AND_ALPHA + ALPHA, + SCALE_AND_ALPHA, + LIGHT_SCALE_AND_ALPHA, + SLIDE_AND_ALPHA, + LIGHT_SLIDE_AND_ALPHA } diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/DisplayPortion.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/DisplayPortion.kt index 684f6d326..c5d483628 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/DisplayPortion.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/DisplayPortion.kt @@ -1,5 +1,9 @@ package org.schabi.newpipe.player.gesture enum class DisplayPortion { - LEFT, MIDDLE, RIGHT, LEFT_HALF, RIGHT_HALF + LEFT, + MIDDLE, + RIGHT, + LEFT_HALF, + RIGHT_HALF } From 9b7874ff51e96133be99d842fbcbe0c84397fa67 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 17:20:00 +0800 Subject: [PATCH 158/190] ktlint: Fix blank-line-between-when-conditions violations Signed-off-by: Aayush Gupta --- .editorconfig | 2 -- .../org/schabi/newpipe/error/ErrorInfo.kt | 30 +++++++++++++++++++ .../newpipe/local/feed/item/StreamItem.kt | 1 + .../local/feed/service/FeedLoadManager.kt | 3 ++ .../subscription/SubscriptionFragment.kt | 7 +++++ .../local/subscription/SubscriptionManager.kt | 2 ++ .../gesture/MainPlayerGestureListener.kt | 4 +++ .../player/mediabrowser/PackageValidator.kt | 4 +++ .../settings/export/ImportExportManager.kt | 10 +++++++ .../NotificationModeConfigFragment.kt | 1 + .../newpipe/util/image/ImageStrategy.kt | 1 + .../util/potoken/PoTokenProviderImpl.kt | 2 ++ .../text/TimestampLongPressClickableSpan.kt | 2 ++ .../shandian/giga/get/MissionRecoveryInfo.kt | 6 ++++ .../settings/ImportAllCombinationsTest.kt | 2 ++ 15 files changed, 75 insertions(+), 2 deletions(-) diff --git a/.editorconfig b/.editorconfig index e7c884c15..24476d4aa 100644 --- a/.editorconfig +++ b/.editorconfig @@ -12,8 +12,6 @@ ktlint_function_naming_ignore_when_annotated_with = Composable ktlint_standard_argument-list-wrapping = disabled ktlint_standard_backing-property-naming = disabled -ktlint_standard_blank-line-before-declaration = disabled -ktlint_standard_blank-line-between-when-conditions = disabled ktlint_standard_chain-method-continuation = disabled ktlint_standard_class-signature = disabled ktlint_standard_function-expression-body = disabled diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt index 2bdea13c0..98cae7b30 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt @@ -193,18 +193,24 @@ class ErrorInfo private constructor( ErrorMessage(R.string.player_http_invalid_status, cause.responseCode.toString()) } } + cause is Loader.UnexpectedLoaderException && cause.cause is ExtractionException -> getMessage(throwable, action, serviceId) + throwable.type == ExoPlaybackException.TYPE_SOURCE -> ErrorMessage(R.string.player_stream_failure) + throwable.type == ExoPlaybackException.TYPE_UNEXPECTED -> ErrorMessage(R.string.player_recoverable_failure) + else -> ErrorMessage(R.string.player_unrecoverable_failure) } } + throwable is FailedMediaSource.FailedMediaSourceException -> getMessage(throwable.cause, action, serviceId) + throwable is PlaybackResolver.ResolverException -> ErrorMessage(R.string.player_stream_failure) @@ -220,34 +226,46 @@ class ErrorInfo private constructor( ) } ?: ErrorMessage(R.string.account_terminated) + throwable is AgeRestrictedContentException -> ErrorMessage(R.string.restricted_video_no_stream) + throwable is GeographicRestrictionException -> ErrorMessage(R.string.georestricted_content) + throwable is PaidContentException -> ErrorMessage(R.string.paid_content) + throwable is PrivateContentException -> ErrorMessage(R.string.private_content) + throwable is SoundCloudGoPlusContentException -> ErrorMessage(R.string.soundcloud_go_plus_content) + throwable is UnsupportedContentInCountryException -> ErrorMessage(R.string.unsupported_content_in_country) + throwable is YoutubeMusicPremiumContentException -> ErrorMessage(R.string.youtube_music_premium_content) + throwable is SignInConfirmNotBotException -> ErrorMessage(R.string.sign_in_confirm_not_bot_error, getServiceName(serviceId)) + throwable is ContentNotAvailableException -> ErrorMessage(R.string.content_not_available) // other extractor exceptions throwable is ContentNotSupportedException -> ErrorMessage(R.string.content_not_supported) + // ReCaptchas will be handled in a special way anyway throwable is ReCaptchaException -> ErrorMessage(R.string.recaptcha_request_toast) + // test this at the end as many exceptions could be a subclass of IOException throwable != null && throwable.isNetworkRelated -> ErrorMessage(R.string.network_error) + // an extraction exception unrelated to the network // is likely an issue with parsing the website throwable is ExtractionException -> @@ -256,16 +274,22 @@ class ErrorInfo private constructor( // user actions (in case the exception is null or unrecognizable) action == UserAction.UI_ERROR -> ErrorMessage(R.string.app_ui_crash) + action == UserAction.REQUESTED_COMMENTS -> ErrorMessage(R.string.error_unable_to_load_comments) + action == UserAction.SUBSCRIPTION_CHANGE -> ErrorMessage(R.string.subscription_change_failed) + action == UserAction.SUBSCRIPTION_UPDATE -> ErrorMessage(R.string.subscription_update_failed) + action == UserAction.LOAD_IMAGE -> ErrorMessage(R.string.could_not_load_thumbnails) + action == UserAction.DOWNLOAD_OPEN_DIALOG -> ErrorMessage(R.string.could_not_setup_download_menu) + else -> ErrorMessage(R.string.error_snackbar_message) } @@ -276,15 +300,19 @@ class ErrorInfo private constructor( // we don't have an exception, so this is a manually built error, which likely // indicates that it's important and is thus reportable null -> true + // the service explicitly said that content is not available (e.g. age restrictions, // video deleted, etc.), there is no use in letting users report it is ContentNotAvailableException -> false + // we know the content is not supported, no need to let the user report it is ContentNotSupportedException -> false + // happens often when there is no internet connection; we don't use // `throwable.isNetworkRelated` since any `IOException` would make that function // return true, but not all `IOException`s are network related is UnknownHostException -> false + // by default, this is an unexpected exception, which the user could report else -> true } @@ -294,8 +322,10 @@ class ErrorInfo private constructor( return when (throwable) { // we know the content is not available, retrying won't help is ContentNotAvailableException -> false + // we know the content is not supported, retrying won't help is ContentNotSupportedException -> false + // by default (including if throwable is null), enable retrying (though the retry // button will be shown only if a way to perform the retry is implemented) else -> true diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt b/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt index a39f31efd..e367961f1 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt @@ -132,6 +132,7 @@ data class StreamItem( viewsAndDate.isEmpty() -> uploadDate!! else -> Localization.concatenateStrings(viewsAndDate, uploadDate) } + else -> viewsAndDate } } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt index 1da3e277b..c60214564 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt @@ -85,9 +85,11 @@ class FeedLoadManager(private val context: Context) { FeedGroupEntity.GROUP_ALL_ID -> feedDatabaseManager.outdatedSubscriptions( outdatedThreshold ) + GROUP_NOTIFICATION_ENABLED -> feedDatabaseManager.outdatedSubscriptionsWithNotificationMode( outdatedThreshold, NotificationMode.ENABLED ) + else -> feedDatabaseManager.outdatedSubscriptionsForGroup(groupId, outdatedThreshold) } @@ -305,6 +307,7 @@ class FeedLoadManager(private val context: Context) { feedDatabaseManager.markAsOutdated(info.uid) } } + notification.isOnError -> { val error = notification.error feedResultsHolder.addError(error!!) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt index f913c845a..5a3753dd0 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt @@ -276,10 +276,13 @@ class SubscriptionFragment : BaseStateFragment() { when (item) { is FeedGroupCardItem -> NavigationHelper.openFeedFragment(fm, item.groupId, item.name) + is FeedGroupCardGridItem -> NavigationHelper.openFeedFragment(fm, item.groupId, item.name) + is FeedGroupAddNewItem -> FeedGroupDialog.newInstance().show(fm, null) + is FeedGroupAddNewGridItem -> FeedGroupDialog.newInstance().show(fm, null) } @@ -294,6 +297,7 @@ class SubscriptionFragment : BaseStateFragment() { when (item) { is FeedGroupCardItem -> FeedGroupDialog.newInstance(item.groupId).show(fm, null) + is FeedGroupCardGridItem -> FeedGroupDialog.newInstance(item.groupId).show(fm, null) } @@ -344,7 +348,9 @@ class SubscriptionFragment : BaseStateFragment() { 0 -> ShareUtils.shareText( requireContext(), selectedItem.name, selectedItem.url, selectedItem.thumbnails ) + 1 -> ShareUtils.openUrlInBrowser(requireContext(), selectedItem.url) + 2 -> deleteChannel(selectedItem) } } @@ -404,6 +410,7 @@ class SubscriptionFragment : BaseStateFragment() { itemsListState = null } } + is SubscriptionState.ErrorState -> { result.error?.let { showError(ErrorInfo(result.error, UserAction.SOMETHING_ELSE, "Subscriptions")) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt index c0783e812..57ff2a401 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt @@ -43,7 +43,9 @@ class SubscriptionManager(context: Context) { subscriptionTable.getSubscriptionsFiltered(filterQuery) } } + showOnlyUngrouped -> subscriptionTable.getSubscriptionsOnlyUngrouped(currentGroupId) + else -> subscriptionTable.getAll() } } diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index 1cd297414..7cc9ba224 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -42,10 +42,12 @@ class MainPlayerGestureListener( v.parent?.requestDisallowInterceptTouchEvent(playerUi.isFullscreen) true } + MotionEvent.ACTION_UP -> { v.parent?.requestDisallowInterceptTouchEvent(false) false } + else -> true } } @@ -198,6 +200,7 @@ class MainPlayerGestureListener( when (PlayerHelper.getActionForRightGestureSide(player.context)) { player.context.getString(R.string.volume_control_key) -> onScrollVolume(distanceY) + player.context.getString(R.string.brightness_control_key) -> onScrollBrightness(distanceY) } @@ -205,6 +208,7 @@ class MainPlayerGestureListener( when (PlayerHelper.getActionForLeftGestureSide(player.context)) { player.context.getString(R.string.volume_control_key) -> onScrollVolume(distanceY) + player.context.getString(R.string.brightness_control_key) -> onScrollBrightness(distanceY) } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt index 0bbc7252d..c41f1dadd 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt @@ -94,10 +94,13 @@ internal class PackageValidator(context: Context) { val isCallerKnown = when { // If it's our own app making the call, allow it. callingUid == Process.myUid() -> true + // If the system is making the call, allow it. callingUid == Process.SYSTEM_UID -> true + // If the app was signed by the same certificate as the platform itself, also allow it. callerSignature == platformSignature -> true + /* * [MEDIA_CONTENT_CONTROL] permission is only available to system applications, and * while it isn't required to allow these apps to connect to a @@ -105,6 +108,7 @@ internal class PackageValidator(context: Context) { * such as Android TV and the Google Assistant. */ callerPackageInfo.permissions.contains(MEDIA_CONTENT_CONTROL) -> true + /* * If the calling app has a notification listener it is able to retrieve notifications * and can connect to an active [MediaSessionCompat]. diff --git a/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt b/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt index 8154338ce..83cca2e0b 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt @@ -122,10 +122,15 @@ class ImportExportManager(private val fileLocator: BackupFileLocator) { for ((key, value) in entries) { when (value) { is Boolean -> editor.putBoolean(key, value) + is Float -> editor.putFloat(key, value) + is Int -> editor.putInt(key, value) + is Long -> editor.putLong(key, value) + is String -> editor.putString(key, value) + is Set<*> -> { // There are currently only Sets with type String possible @Suppress("UNCHECKED_CAST") @@ -159,10 +164,15 @@ class ImportExportManager(private val fileLocator: BackupFileLocator) { for ((key, value) in jsonObject) { when (value) { is Boolean -> editor.putBoolean(key, value) + is Float -> editor.putFloat(key, value) + is Int -> editor.putInt(key, value) + is Long -> editor.putLong(key, value) + is String -> editor.putString(key, value) + is JsonArray -> { editor.putStringSet(key, value.mapNotNull { e -> e as? String }.toSet()) } diff --git a/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigFragment.kt b/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigFragment.kt index 097200662..9dbfa826a 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigFragment.kt @@ -88,6 +88,7 @@ class NotificationModeConfigFragment : Fragment() { toggleAll() true } + else -> super.onOptionsItemSelected(item) } } diff --git a/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt index b5e17d63e..c7e94c7f8 100644 --- a/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt +++ b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt @@ -92,6 +92,7 @@ object ImageStrategy { // the same number for those. val finalComparator = when (nonNoneQuality) { PreferredImageQuality.NONE -> initialComparator + PreferredImageQuality.LOW -> initialComparator.thenComparingDouble { image -> val pixelCount = estimatePixelCount(image, widthOverHeight) abs(pixelCount - BEST_LOW_H * BEST_LOW_H * widthOverHeight) diff --git a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt index 5383a613a..eb1153c7f 100644 --- a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt +++ b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt @@ -37,7 +37,9 @@ object PoTokenProviderImpl : PoTokenProvider { webViewBadImpl = true return null } + null -> throw e + else -> throw cause // includes PoTokenException } } diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.kt b/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.kt index a76c5c31a..c99e2f639 100644 --- a/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.kt +++ b/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.kt @@ -53,8 +53,10 @@ class TimestampLongPressClickableSpan( when (relatedInfoService) { ServiceList.YouTube -> return relatedStreamUrl + "&t=" + timestampMatchDTO.seconds() + ServiceList.SoundCloud, ServiceList.MediaCCC -> return relatedStreamUrl + "#t=" + timestampMatchDTO.seconds() + ServiceList.PeerTube -> return relatedStreamUrl + "?start=" + timestampMatchDTO.seconds() } diff --git a/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt b/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt index 712e4ee0b..c145b8506 100644 --- a/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt +++ b/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt @@ -25,16 +25,19 @@ class MissionRecoveryInfo( isDesired2 = false kind = 'a' } + is VideoStream -> { desired = stream.getResolution() isDesired2 = stream.isVideoOnly() kind = 'v' } + is SubtitlesStream -> { desired = stream.languageTag isDesired2 = stream.isAutoGenerated kind = 's' } + else -> throw RuntimeException("Unknown stream kind") } } @@ -48,14 +51,17 @@ class MissionRecoveryInfo( str.append("audio") info = "bitrate=$desiredBitrate" } + 'v' -> { str.append("video") info = "quality=$desired videoOnly=$isDesired2" } + 's' -> { str.append("subtitles") info = "language=$desired autoGenerated=$isDesired2" } + else -> { info = "" str.append("other") diff --git a/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt b/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt index a189640a6..628c41da4 100644 --- a/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt +++ b/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt @@ -93,6 +93,7 @@ class ImportAllCombinationsTest { Mockito.verify(editor, Mockito.atLeastOnce()) .putInt(Mockito.anyString(), Mockito.anyInt()) } + Ser.VULNERABLE -> runTest { Assert.assertTrue(ImportExportManager(fileLocator).exportHasSerializedPrefs(zip)) Assert.assertThrows(ClassNotFoundException::class.java) { @@ -102,6 +103,7 @@ class ImportAllCombinationsTest { Mockito.verify(editor, Mockito.never()).clear() Mockito.verify(editor, Mockito.never()).commit() } + Ser.NO -> runTest { Assert.assertFalse(ImportExportManager(fileLocator).exportHasSerializedPrefs(zip)) Assert.assertThrows(IOException::class.java) { From 7d5647b0ba35fc16cc42fa0dbb0d000c40e871b8 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 17:24:58 +0800 Subject: [PATCH 159/190] ktlint: Fix standard_argument-list-wrapping violations Signed-off-by: Aayush Gupta --- .editorconfig | 1 - .../newpipe/database/DatabaseMigrationTest.kt | 42 ++++-- .../schabi/newpipe/database/FeedDAOTest.kt | 21 ++- .../playlist/LocalPlaylistManagerTest.kt | 24 ++- .../newpipe/util/StreamItemAdapterTest.kt | 52 +++++-- .../org/schabi/newpipe/NewVersionWorker.kt | 12 +- .../org/schabi/newpipe/about/AboutActivity.kt | 137 +++++++++++++----- .../schabi/newpipe/about/LicenseFragment.kt | 3 +- .../newpipe/about/LicenseFragmentHelper.kt | 9 +- .../newpipe/database/feed/model/FeedEntity.kt | 8 +- .../feed/model/FeedGroupSubscriptionEntity.kt | 8 +- .../feed/model/FeedLastUpdatedEntity.kt | 4 +- .../database/stream/model/StreamEntity.kt | 8 +- .../main/java/org/schabi/newpipe/ktx/View.kt | 10 +- .../schabi/newpipe/local/feed/FeedFragment.kt | 15 +- .../feed/notifications/NotificationHelper.kt | 4 +- .../local/feed/service/FeedLoadManager.kt | 9 +- .../subscription/SubscriptionFragment.kt | 9 +- .../local/subscription/SubscriptionManager.kt | 3 +- .../subscription/dialog/FeedGroupDialog.kt | 9 +- .../dialog/FeedGroupDialogViewModel.kt | 8 +- .../player/mediabrowser/MediaBrowserImpl.kt | 3 +- .../org/schabi/newpipe/util/FilenameUtils.kt | 6 +- .../schabi/newpipe/util/ReleaseVersionUtil.kt | 3 +- .../views/player/PlayerFastSeekOverlay.kt | 6 +- .../newpipe/views/player/SecondsView.kt | 4 +- .../local/subscription/FeedGroupIconTest.kt | 3 +- .../settings/ImportAllCombinationsTest.kt | 7 +- 28 files changed, 306 insertions(+), 122 deletions(-) diff --git a/.editorconfig b/.editorconfig index 24476d4aa..62ebdafe2 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,7 +10,6 @@ ktlint_code_style = android_studio # https://pinterest.github.io/ktlint/latest/rules/standard/#function-naming ktlint_function_naming_ignore_when_annotated_with = Composable -ktlint_standard_argument-list-wrapping = disabled ktlint_standard_backing-property-naming = disabled ktlint_standard_chain-method-continuation = disabled ktlint_standard_class-signature = disabled diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt index 4327271f4..fd551b7b8 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt @@ -176,28 +176,32 @@ class DatabaseMigrationTest { databaseInV7.run { insert( - "search_history", SQLiteDatabase.CONFLICT_FAIL, + "search_history", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("service_id", serviceId) put("search", defaultSearch1) } ) insert( - "search_history", SQLiteDatabase.CONFLICT_FAIL, + "search_history", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("service_id", serviceId) put("search", defaultSearch2) } ) insert( - "search_history", SQLiteDatabase.CONFLICT_FAIL, + "search_history", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("service_id", otherServiceId) put("search", defaultSearch1) } ) insert( - "search_history", SQLiteDatabase.CONFLICT_FAIL, + "search_history", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("service_id", otherServiceId) put("search", defaultSearch2) @@ -207,13 +211,17 @@ class DatabaseMigrationTest { } testHelper.runMigrationsAndValidate( - AppDatabase.DATABASE_NAME, Migrations.DB_VER_8, - true, Migrations.MIGRATION_7_8 + AppDatabase.DATABASE_NAME, + Migrations.DB_VER_8, + true, + Migrations.MIGRATION_7_8 ) testHelper.runMigrationsAndValidate( - AppDatabase.DATABASE_NAME, Migrations.DB_VER_9, - true, Migrations.MIGRATION_8_9 + AppDatabase.DATABASE_NAME, + Migrations.DB_VER_9, + true, + Migrations.MIGRATION_8_9 ) val migratedDatabaseV8 = getMigratedDatabase() @@ -235,7 +243,8 @@ class DatabaseMigrationTest { val remoteUid2: Long databaseInV8.run { localUid1 = insert( - "playlists", SQLiteDatabase.CONFLICT_FAIL, + "playlists", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("name", DEFAULT_NAME + "1") put("is_thumbnail_permanent", false) @@ -243,7 +252,8 @@ class DatabaseMigrationTest { } ) localUid2 = insert( - "playlists", SQLiteDatabase.CONFLICT_FAIL, + "playlists", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("name", DEFAULT_NAME + "2") put("is_thumbnail_permanent", false) @@ -251,25 +261,29 @@ class DatabaseMigrationTest { } ) delete( - "playlists", "uid = ?", + "playlists", + "uid = ?", Array(1) { localUid1 } ) remoteUid1 = insert( - "remote_playlists", SQLiteDatabase.CONFLICT_FAIL, + "remote_playlists", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("service_id", DEFAULT_SERVICE_ID) put("url", DEFAULT_URL) } ) remoteUid2 = insert( - "remote_playlists", SQLiteDatabase.CONFLICT_FAIL, + "remote_playlists", + SQLiteDatabase.CONFLICT_FAIL, ContentValues().apply { put("service_id", DEFAULT_SECOND_SERVICE_ID) put("url", DEFAULT_SECOND_URL) } ) delete( - "remote_playlists", "uid = ?", + "remote_playlists", + "uid = ?", Array(1) { remoteUid2 } ) close() diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt index 5216273a0..a61caad06 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt @@ -40,14 +40,21 @@ class FeedDAOTest { private val stream7 = StreamEntity(7, serviceId, "https://youtube.com/watch?v=7", "stream 7", StreamType.VIDEO_STREAM, 1000, "channel-4", "https://youtube.com/channel/4", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-08-10", OffsetDateTime.parse("2023-08-10T00:00:00Z")) private val allStreams = listOf( - stream1, stream2, stream3, stream4, stream5, stream6, stream7 + stream1, + stream2, + stream3, + stream4, + stream5, + stream6, + stream7 ) @Before fun createDb() { val context = ApplicationProvider.getApplicationContext() db = Room.inMemoryDatabaseBuilder( - context, AppDatabase::class.java + context, + AppDatabase::class.java ).build() feedDAO = db.feedDAO() streamDAO = db.streamDAO() @@ -64,7 +71,10 @@ class FeedDAOTest { fun testUnlinkStreamsOlderThan_KeepOne() { setupUnlinkDelete("2023-08-15T00:00:00Z") val streams = feedDAO.getStreams( - FeedGroupEntity.GROUP_ALL_ID, includePlayed = true, includePartiallyPlayed = true, null + FeedGroupEntity.GROUP_ALL_ID, + includePlayed = true, + includePartiallyPlayed = true, + null ) .blockingGet() val allowedStreams = listOf(stream3, stream5, stream6, stream7) @@ -75,7 +85,10 @@ class FeedDAOTest { fun testUnlinkStreamsOlderThan_KeepMultiple() { setupUnlinkDelete("2023-08-01T00:00:00Z") val streams = feedDAO.getStreams( - FeedGroupEntity.GROUP_ALL_ID, includePlayed = true, includePartiallyPlayed = true, null + FeedGroupEntity.GROUP_ALL_ID, + includePlayed = true, + includePartiallyPlayed = true, + null ) .blockingGet() val allowedStreams = listOf(stream3, stream4, stream5, stream6, stream7) diff --git a/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt b/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt index ce3aeb84a..ac9e84228 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt @@ -33,8 +33,12 @@ class LocalPlaylistManagerTest { fun createPlaylist() { val NEWPIPE_URL = "https://newpipe.net/" val stream = StreamEntity( - serviceId = 1, url = NEWPIPE_URL, title = "title", - streamType = StreamType.VIDEO_STREAM, duration = 1, uploader = "uploader", + serviceId = 1, + url = NEWPIPE_URL, + title = "title", + streamType = StreamType.VIDEO_STREAM, + duration = 1, + uploader = "uploader", uploaderUrl = NEWPIPE_URL ) @@ -58,14 +62,22 @@ class LocalPlaylistManagerTest { @Test() fun createPlaylist_nonExistentStreamsAreUpserted() { val stream = StreamEntity( - serviceId = 1, url = "https://newpipe.net/", title = "title", - streamType = StreamType.VIDEO_STREAM, duration = 1, uploader = "uploader", + serviceId = 1, + url = "https://newpipe.net/", + title = "title", + streamType = StreamType.VIDEO_STREAM, + duration = 1, + uploader = "uploader", uploaderUrl = "https://newpipe.net/" ) database.streamDAO().insert(stream) val upserted = StreamEntity( - serviceId = 1, url = "https://newpipe.net/2", title = "title2", - streamType = StreamType.VIDEO_STREAM, duration = 1, uploader = "uploader", + serviceId = 1, + url = "https://newpipe.net/2", + title = "title2", + streamType = StreamType.VIDEO_STREAM, + duration = 1, + uploader = "uploader", uploaderUrl = "https://newpipe.net/" ) diff --git a/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt b/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt index da23bdfec..348612249 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt @@ -156,41 +156,51 @@ class StreamItemAdapterTest { helper.assertInvalidResponse(getResponse(mapOf(Pair("content-length", "mp3"))), 0) helper.assertInvalidResponse( - getResponse(mapOf(Pair("Content-Disposition", "filename=\"train.png\""))), 1 + getResponse(mapOf(Pair("Content-Disposition", "filename=\"train.png\""))), + 1 ) helper.assertInvalidResponse( - getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"data.csv\""))), 2 + getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"data.csv\""))), + 2 ) helper.assertInvalidResponse( - getResponse(mapOf(Pair("Content-Disposition", "form-data; filename=\"data.csv\""))), 3 + getResponse(mapOf(Pair("Content-Disposition", "form-data; filename=\"data.csv\""))), + 3 ) helper.assertInvalidResponse( - getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"fieldName\"; filename*=\"filename.jpg\""))), 4 + getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"fieldName\"; filename*=\"filename.jpg\""))), + 4 ) helper.assertValidResponse( getResponse(mapOf(Pair("Content-Disposition", "filename=\"train.ogg\""))), - 5, MediaFormat.OGG + 5, + MediaFormat.OGG ) helper.assertValidResponse( getResponse(mapOf(Pair("Content-Disposition", "some-form-data; filename=\"audio.flac\""))), - 6, MediaFormat.FLAC + 6, + MediaFormat.FLAC ) helper.assertValidResponse( getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"audio.aiff\"; filename=\"audio.aiff\""))), - 7, MediaFormat.AIFF + 7, + MediaFormat.AIFF ) helper.assertValidResponse( getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"alien?\"; filename*=UTF-8''%CE%B1%CE%BB%CE%B9%CF%B5%CE%BD.m4a"))), - 8, MediaFormat.M4A + 8, + MediaFormat.M4A ) helper.assertValidResponse( getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"audio.mp3\"; filename=\"audio.opus\"; filename*=UTF-8''alien.opus"))), - 9, MediaFormat.OPUS + 9, + MediaFormat.OPUS ) helper.assertValidResponse( getResponse(mapOf(Pair("Content-Disposition", "form-data; name=\"audio.mp3\"; filename=\"audio.opus\"; filename*=\"UTF-8''alien.opus\""))), - 10, MediaFormat.OPUS + 10, + MediaFormat.OPUS ) } @@ -213,16 +223,24 @@ class StreamItemAdapterTest { helper.assertInvalidResponse(getResponse(mapOf()), 7) helper.assertValidResponse( - getResponse(mapOf(Pair("Content-Type", "audio/flac"))), 8, MediaFormat.FLAC + getResponse(mapOf(Pair("Content-Type", "audio/flac"))), + 8, + MediaFormat.FLAC ) helper.assertValidResponse( - getResponse(mapOf(Pair("Content-Type", "audio/wav"))), 9, MediaFormat.WAV + getResponse(mapOf(Pair("Content-Type", "audio/wav"))), + 9, + MediaFormat.WAV ) helper.assertValidResponse( - getResponse(mapOf(Pair("Content-Type", "audio/opus"))), 10, MediaFormat.OPUS + getResponse(mapOf(Pair("Content-Type", "audio/opus"))), + 10, + MediaFormat.OPUS ) helper.assertValidResponse( - getResponse(mapOf(Pair("Content-Type", "audio/aiff"))), 11, MediaFormat.AIFF + getResponse(mapOf(Pair("Content-Type", "audio/aiff"))), + 11, + MediaFormat.AIFF ) } @@ -345,7 +363,8 @@ class StreamItemAdapterTest { index: Int ) { assertFalse( - "invalid header returns valid value", retrieveMediaFormat(streams[index], response) + "invalid header returns valid value", + retrieveMediaFormat(streams[index], response) ) assertNull("Media format extracted although stated otherwise", wrapper.getFormat(index)) } @@ -359,7 +378,8 @@ class StreamItemAdapterTest { format: MediaFormat ) { assertTrue( - "header was not recognized", retrieveMediaFormat(streams[index], response) + "header was not recognized", + retrieveMediaFormat(streams[index], response) ) assertEquals("Wrong media format extracted", format, wrapper.getFormat(index)) } diff --git a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt index 893aa8d1b..fb48d3f70 100644 --- a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt @@ -46,7 +46,8 @@ class NewVersionWorker( // Show toast stating that the app is up-to-date if the update check was manual. ContextCompat.getMainExecutor(applicationContext).execute { Toast.makeText( - applicationContext, R.string.app_update_unavailable_toast, + applicationContext, + R.string.app_update_unavailable_toast, Toast.LENGTH_SHORT ).show() } @@ -58,7 +59,11 @@ class NewVersionWorker( val intent = Intent(Intent.ACTION_VIEW, apkLocationUrl?.toUri()) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) val pendingIntent = PendingIntentCompat.getActivity( - applicationContext, 0, intent, 0, false + applicationContext, + 0, + intent, + 0, + false ) val channelId = applicationContext.getString(R.string.app_update_notification_channel_id) val notificationBuilder = NotificationCompat.Builder(applicationContext, channelId) @@ -71,7 +76,8 @@ class NewVersionWorker( ) .setContentText( applicationContext.getString( - R.string.app_update_available_notification_text, versionName + R.string.app_update_available_notification_text, + versionName ) ) diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt index 0bed7ac60..cfb504200 100644 --- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt +++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt @@ -116,85 +116,144 @@ class AboutActivity : AppCompatActivity() { */ private val SOFTWARE_COMPONENTS = arrayListOf( SoftwareComponent( - "ACRA", "2013", "Kevin Gaudin", - "https://github.com/ACRA/acra", StandardLicenses.APACHE2 + "ACRA", + "2013", + "Kevin Gaudin", + "https://github.com/ACRA/acra", + StandardLicenses.APACHE2 ), SoftwareComponent( - "AndroidX", "2005 - 2011", "The Android Open Source Project", - "https://developer.android.com/jetpack", StandardLicenses.APACHE2 + "AndroidX", + "2005 - 2011", + "The Android Open Source Project", + "https://developer.android.com/jetpack", + StandardLicenses.APACHE2 ), SoftwareComponent( - "ExoPlayer", "2014 - 2020", "Google, Inc.", - "https://github.com/google/ExoPlayer", StandardLicenses.APACHE2 + "ExoPlayer", + "2014 - 2020", + "Google, Inc.", + "https://github.com/google/ExoPlayer", + StandardLicenses.APACHE2 ), SoftwareComponent( - "GigaGet", "2014 - 2015", "Peter Cai", - "https://github.com/PaperAirplane-Dev-Team/GigaGet", StandardLicenses.GPL3 + "GigaGet", + "2014 - 2015", + "Peter Cai", + "https://github.com/PaperAirplane-Dev-Team/GigaGet", + StandardLicenses.GPL3 ), SoftwareComponent( - "Groupie", "2016", "Lisa Wray", - "https://github.com/lisawray/groupie", StandardLicenses.MIT + "Groupie", + "2016", + "Lisa Wray", + "https://github.com/lisawray/groupie", + StandardLicenses.MIT ), SoftwareComponent( - "Android-State", "2018", "Evernote", - "https://github.com/Evernote/android-state", StandardLicenses.EPL1 + "Android-State", + "2018", + "Evernote", + "https://github.com/Evernote/android-state", + StandardLicenses.EPL1 ), SoftwareComponent( - "Bridge", "2021", "Livefront", - "https://github.com/livefront/bridge", StandardLicenses.APACHE2 + "Bridge", + "2021", + "Livefront", + "https://github.com/livefront/bridge", + StandardLicenses.APACHE2 ), SoftwareComponent( - "Jsoup", "2009 - 2020", "Jonathan Hedley", - "https://github.com/jhy/jsoup", StandardLicenses.MIT + "Jsoup", + "2009 - 2020", + "Jonathan Hedley", + "https://github.com/jhy/jsoup", + StandardLicenses.MIT ), SoftwareComponent( - "Markwon", "2019", "Dimitry Ivanov", - "https://github.com/noties/Markwon", StandardLicenses.APACHE2 + "Markwon", + "2019", + "Dimitry Ivanov", + "https://github.com/noties/Markwon", + StandardLicenses.APACHE2 ), SoftwareComponent( - "Material Components for Android", "2016 - 2020", "Google, Inc.", + "Material Components for Android", + "2016 - 2020", + "Google, Inc.", "https://github.com/material-components/material-components-android", StandardLicenses.APACHE2 ), SoftwareComponent( - "NewPipe Extractor", "2017 - 2020", "Christian Schabesberger", - "https://github.com/TeamNewPipe/NewPipeExtractor", StandardLicenses.GPL3 + "NewPipe Extractor", + "2017 - 2020", + "Christian Schabesberger", + "https://github.com/TeamNewPipe/NewPipeExtractor", + StandardLicenses.GPL3 ), SoftwareComponent( - "NoNonsense-FilePicker", "2016", "Jonas Kalderstam", - "https://github.com/spacecowboy/NoNonsense-FilePicker", StandardLicenses.MPL2 + "NoNonsense-FilePicker", + "2016", + "Jonas Kalderstam", + "https://github.com/spacecowboy/NoNonsense-FilePicker", + StandardLicenses.MPL2 ), SoftwareComponent( - "OkHttp", "2019", "Square, Inc.", - "https://square.github.io/okhttp/", StandardLicenses.APACHE2 + "OkHttp", + "2019", + "Square, Inc.", + "https://square.github.io/okhttp/", + StandardLicenses.APACHE2 ), SoftwareComponent( - "Picasso", "2013", "Square, Inc.", - "https://square.github.io/picasso/", StandardLicenses.APACHE2 + "Picasso", + "2013", + "Square, Inc.", + "https://square.github.io/picasso/", + StandardLicenses.APACHE2 ), SoftwareComponent( - "PrettyTime", "2012 - 2020", "Lincoln Baxter, III", - "https://github.com/ocpsoft/prettytime", StandardLicenses.APACHE2 + "PrettyTime", + "2012 - 2020", + "Lincoln Baxter, III", + "https://github.com/ocpsoft/prettytime", + StandardLicenses.APACHE2 ), SoftwareComponent( - "ProcessPhoenix", "2015", "Jake Wharton", - "https://github.com/JakeWharton/ProcessPhoenix", StandardLicenses.APACHE2 + "ProcessPhoenix", + "2015", + "Jake Wharton", + "https://github.com/JakeWharton/ProcessPhoenix", + StandardLicenses.APACHE2 ), SoftwareComponent( - "RxAndroid", "2015", "The RxAndroid authors", - "https://github.com/ReactiveX/RxAndroid", StandardLicenses.APACHE2 + "RxAndroid", + "2015", + "The RxAndroid authors", + "https://github.com/ReactiveX/RxAndroid", + StandardLicenses.APACHE2 ), SoftwareComponent( - "RxBinding", "2015", "Jake Wharton", - "https://github.com/JakeWharton/RxBinding", StandardLicenses.APACHE2 + "RxBinding", + "2015", + "Jake Wharton", + "https://github.com/JakeWharton/RxBinding", + StandardLicenses.APACHE2 ), SoftwareComponent( - "RxJava", "2016 - 2020", "RxJava Contributors", - "https://github.com/ReactiveX/RxJava", StandardLicenses.APACHE2 + "RxJava", + "2016 - 2020", + "RxJava Contributors", + "https://github.com/ReactiveX/RxJava", + StandardLicenses.APACHE2 ), SoftwareComponent( - "SearchPreference", "2018", "ByteHamster", - "https://github.com/ByteHamster/SearchPreference", StandardLicenses.MIT + "SearchPreference", + "2018", + "ByteHamster", + "https://github.com/ByteHamster/SearchPreference", + StandardLicenses.MIT ) ) } diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt index 240e2f42b..bd0632c13 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt @@ -97,7 +97,8 @@ class LicenseFragment : Fragment() { .observeOn(AndroidSchedulers.mainThread()) .subscribe { formattedLicense -> val webViewData = Base64.encodeToString( - formattedLicense.toByteArray(), Base64.NO_PADDING + formattedLicense.toByteArray(), + Base64.NO_PADDING ) val webView = WebView(context) webView.loadData(webViewData, "text/html; charset=UTF-8", "base64") diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt index a2574ae86..32e4f812f 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt @@ -28,13 +28,16 @@ fun getFormattedLicense(context: Context, license: License): String { fun getLicenseStylesheet(context: Context): String { val isLightTheme = ThemeHelper.isLightThemeSelected(context) val licenseBackgroundColor = getHexRGBColor( - context, if (isLightTheme) R.color.light_license_background_color else R.color.dark_license_background_color + context, + if (isLightTheme) R.color.light_license_background_color else R.color.dark_license_background_color ) val licenseTextColor = getHexRGBColor( - context, if (isLightTheme) R.color.light_license_text_color else R.color.dark_license_text_color + context, + if (isLightTheme) R.color.light_license_text_color else R.color.dark_license_text_color ) val youtubePrimaryColor = getHexRGBColor( - context, if (isLightTheme) R.color.light_youtube_primary_color else R.color.dark_youtube_primary_color + context, + if (isLightTheme) R.color.light_youtube_primary_color else R.color.dark_youtube_primary_color ) return "body{padding:12px 15px;margin:0;background:#$licenseBackgroundColor;color:#$licenseTextColor}" + "a[href]{color:#$youtubePrimaryColor}pre{white-space:pre-wrap}" diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedEntity.kt b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedEntity.kt index beeedc62b..86568bc90 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedEntity.kt @@ -19,13 +19,17 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity entity = StreamEntity::class, parentColumns = [StreamEntity.STREAM_ID], childColumns = [STREAM_ID], - onDelete = ForeignKey.CASCADE, onUpdate = ForeignKey.CASCADE, deferred = true + onDelete = ForeignKey.CASCADE, + onUpdate = ForeignKey.CASCADE, + deferred = true ), ForeignKey( entity = SubscriptionEntity::class, parentColumns = [SubscriptionEntity.SUBSCRIPTION_UID], childColumns = [SUBSCRIPTION_ID], - onDelete = ForeignKey.CASCADE, onUpdate = ForeignKey.CASCADE, deferred = true + onDelete = ForeignKey.CASCADE, + onUpdate = ForeignKey.CASCADE, + deferred = true ) ] ) diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt index b114a734c..6dac3c89c 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt @@ -18,14 +18,18 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity entity = FeedGroupEntity::class, parentColumns = [FeedGroupEntity.ID], childColumns = [GROUP_ID], - onDelete = ForeignKey.CASCADE, onUpdate = ForeignKey.CASCADE, deferred = true + onDelete = ForeignKey.CASCADE, + onUpdate = ForeignKey.CASCADE, + deferred = true ), ForeignKey( entity = SubscriptionEntity::class, parentColumns = [SubscriptionEntity.SUBSCRIPTION_UID], childColumns = [SUBSCRIPTION_ID], - onDelete = ForeignKey.CASCADE, onUpdate = ForeignKey.CASCADE, deferred = true + onDelete = ForeignKey.CASCADE, + onUpdate = ForeignKey.CASCADE, + deferred = true ) ] ) diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt index 51c8c1afa..fc0ee6742 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt @@ -16,7 +16,9 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity entity = SubscriptionEntity::class, parentColumns = [SubscriptionEntity.SUBSCRIPTION_UID], childColumns = [SUBSCRIPTION_ID], - onDelete = ForeignKey.CASCADE, onUpdate = ForeignKey.CASCADE, deferred = true + onDelete = ForeignKey.CASCADE, + onUpdate = ForeignKey.CASCADE, + deferred = true ) ] ) diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt index 4bb34d7b0..067f666b6 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt @@ -86,8 +86,12 @@ data class StreamEntity( @Ignore constructor(item: PlayQueueItem) : this( - serviceId = item.serviceId, url = item.url, title = item.title, - streamType = item.streamType, duration = item.duration, uploader = item.uploader, + serviceId = item.serviceId, + url = item.url, + title = item.title, + streamType = item.streamType, + duration = item.duration, + uploader = item.uploader, uploaderUrl = item.uploaderUrl, thumbnailUrl = ImageStrategy.imageListToDbUrl(item.thumbnails) ) diff --git a/app/src/main/java/org/schabi/newpipe/ktx/View.kt b/app/src/main/java/org/schabi/newpipe/ktx/View.kt index f6d08d143..432b974cb 100644 --- a/app/src/main/java/org/schabi/newpipe/ktx/View.kt +++ b/app/src/main/java/org/schabi/newpipe/ktx/View.kt @@ -43,8 +43,14 @@ fun View.animate( if (DEBUG) { val id = runCatching { resources.getResourceEntryName(id) }.getOrDefault(id.toString()) val msg = String.format( - "%8s → [%s:%s] [%s %s:%s] execOnEnd=%s", enterOrExit, - javaClass.simpleName, id, animationType, duration, delay, execOnEnd + "%8s → [%s:%s] [%s %s:%s] execOnEnd=%s", + enterOrExit, + javaClass.simpleName, + id, + animationType, + duration, + delay, + execOnEnd ) Log.d(TAG, "animate(): $msg") } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index b4b23a503..930998c67 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -390,8 +390,13 @@ class FeedFragment : BaseStateFragment() { if (item is StreamItem && !isRefreshing) { val stream = item.streamWithState.stream NavigationHelper.openVideoDetailFragment( - requireContext(), fm, - stream.serviceId, stream.url, stream.title, null, false + requireContext(), + fm, + stream.serviceId, + stream.url, + stream.title, + null, + false ) } } @@ -503,7 +508,8 @@ class FeedFragment : BaseStateFragment() { ) { val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) val isFastFeedModeEnabled = sharedPreferences.getBoolean( - getString(R.string.feed_use_dedicated_fetch_method_key), false + getString(R.string.feed_use_dedicated_fetch_method_key), + false ) val builder = AlertDialog.Builder(requireContext()) @@ -538,7 +544,8 @@ class FeedFragment : BaseStateFragment() { private fun updateRelativeTimeViews() { updateRefreshViewState() groupAdapter.notifyItemRangeChanged( - 0, groupAdapter.itemCount, + 0, + groupAdapter.itemCount, StreamItem.UPDATE_RELATIVE_TIME ) } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt index 7ce117fcd..d2d16a755 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt @@ -42,7 +42,9 @@ class NotificationHelper(val context: Context) { fun displayNewStreamsNotifications(data: FeedUpdateInfo) { val newStreams = data.newStreams val summary = context.resources.getQuantityString( - R.plurals.new_streams, newStreams.size, newStreams.size + R.plurals.new_streams, + newStreams.size, + newStreams.size ) val summaryBuilder = NotificationCompat.Builder( context, diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt index c60214564..3090a92d4 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt @@ -87,7 +87,8 @@ class FeedLoadManager(private val context: Context) { ) GROUP_NOTIFICATION_ENABLED -> feedDatabaseManager.outdatedSubscriptionsWithNotificationMode( - outdatedThreshold, NotificationMode.ENABLED + outdatedThreshold, + NotificationMode.ENABLED ) else -> feedDatabaseManager.outdatedSubscriptionsForGroup(groupId, outdatedThreshold) @@ -188,7 +189,8 @@ class FeedLoadManager(private val context: Context) { val channelInfo = getChannelInfo( subscriptionEntity.serviceId, - subscriptionEntity.url, true + subscriptionEntity.url, + true ) .onErrorReturn(storeOriginalErrorAndRethrow) .blockingGet() @@ -218,7 +220,8 @@ class FeedLoadManager(private val context: Context) { ) { val infoItemsPage = getMoreChannelTabItems( subscriptionEntity.serviceId, - linkHandler, channelTabInfo.nextPage + linkHandler, + channelTabInfo.nextPage ) .blockingGet() diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt index 5a3753dd0..28abe4cf9 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt @@ -346,7 +346,10 @@ class SubscriptionFragment : BaseStateFragment() { val actions = DialogInterface.OnClickListener { _, i -> when (i) { 0 -> ShareUtils.shareText( - requireContext(), selectedItem.name, selectedItem.url, selectedItem.thumbnails + requireContext(), + selectedItem.name, + selectedItem.url, + selectedItem.thumbnails ) 1 -> ShareUtils.openUrlInBrowser(requireContext(), selectedItem.url) @@ -380,7 +383,9 @@ class SubscriptionFragment : BaseStateFragment() { private val listenerChannelItem = object : OnClickGesture { override fun selected(selectedItem: ChannelInfoItem) = NavigationHelper.openChannelFragment( fm, - selectedItem.serviceId, selectedItem.url, selectedItem.name + selectedItem.serviceId, + selectedItem.url, + selectedItem.name ) override fun held(selectedItem: ChannelInfoItem) = showLongTapDialog(selectedItem) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt index 57ff2a401..bc7afe602 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt @@ -37,7 +37,8 @@ class SubscriptionManager(context: Context) { filterQuery.isNotEmpty() -> { return if (showOnlyUngrouped) { subscriptionTable.getSubscriptionsOnlyUngroupedFiltered( - currentGroupId, filterQuery + currentGroupId, + filterQuery ) } else { subscriptionTable.getSubscriptionsFiltered(filterQuery) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt index 094b1c17f..ab856278f 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt @@ -178,8 +178,10 @@ class FeedGroupDialog : DialogFragment(), BackPressable { itemAnimator = null adapter = subscriptionGroupAdapter layoutManager = GridLayoutManager( - requireContext(), subscriptionGroupAdapter.spanCount, - RecyclerView.VERTICAL, false + requireContext(), + subscriptionGroupAdapter.spanCount, + RecyclerView.VERTICAL, + false ).apply { spanSizeLookup = subscriptionGroupAdapter.spanSizeLookup } @@ -387,7 +389,8 @@ class FeedGroupDialog : DialogFragment(), BackPressable { val selectedCount = this.selectedSubscriptions.size val selectedCountText = resources.getQuantityString( R.plurals.feed_group_dialog_selection_count, - selectedCount, selectedCount + selectedCount, + selectedCount ) feedGroupCreateBinding.selectedSubscriptionCountView.text = selectedCountText feedGroupCreateBinding.subscriptionsHeaderInfo.text = selectedCountText diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt index 292bda394..d8eac2492 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt @@ -55,7 +55,8 @@ class FeedGroupDialogViewModel( private var subscriptionsDisposable = Flowable .combineLatest( - subscriptionsFlowable, feedDatabaseManager.subscriptionIdsForGroup(groupId) + subscriptionsFlowable, + feedDatabaseManager.subscriptionIdsForGroup(groupId) ) { t1: List, t2: List -> t1 to t2.toSet() } .subscribeOn(Schedulers.io()) .subscribe(mutableSubscriptionsLiveData::postValue) @@ -125,7 +126,10 @@ class FeedGroupDialogViewModel( ) = viewModelFactory { initializer { FeedGroupDialogViewModel( - context.applicationContext, groupId, initialQuery, initialShowOnlyUngrouped + context.applicationContext, + groupId, + initialQuery, + initialShowOnlyUngrouped ) } } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt index 1e1a2a113..6b59f683a 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt @@ -90,7 +90,8 @@ class MediaBrowserImpl( val extras = Bundle() extras.putBoolean( - MediaConstants.BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED, true + MediaConstants.BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED, + true ) return MediaBrowserServiceCompat.BrowserRoot(ID_ROOT, extras) } diff --git a/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt b/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt index 6a2d23d21..1237a984b 100644 --- a/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt +++ b/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt @@ -31,10 +31,12 @@ object FilenameUtils { val defaultCharset = context.getString(R.string.default_file_charset_value) val replacementChar = sharedPreferences.getStringSafe( - context.getString(R.string.settings_file_replacement_character_key), "_" + context.getString(R.string.settings_file_replacement_character_key), + "_" ) val selectedCharset = sharedPreferences.getStringSafe( - context.getString(R.string.settings_file_charset_key), "" + context.getString(R.string.settings_file_charset_key), + "" ).ifEmpty { defaultCharset } val charset = when (selectedCharset) { diff --git a/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt b/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt index fef7e83c0..bc3849384 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt @@ -26,7 +26,8 @@ object ReleaseVersionUtil { PackageInfoCompat.hasSignatures(app.packageManager, app.packageName, certificates, false) } catch (e: PackageManager.NameNotFoundException) { createNotification( - app, ErrorInfo(e, UserAction.CHECK_FOR_NEW_APP_VERSION, "Could not find package info") + app, + ErrorInfo(e, UserAction.CHECK_FOR_NEW_APP_VERSION, "Could not find package info") ) false } diff --git a/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt b/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt index cfbb4141c..08b7df6af 100644 --- a/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt +++ b/app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt @@ -115,8 +115,10 @@ class PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) : clone(rootConstraintLayout) clear(secondsView.id, if (forward) START else END) connect( - secondsView.id, if (forward) END else START, - PARENT_ID, if (forward) END else START + secondsView.id, + if (forward) END else START, + PARENT_ID, + if (forward) END else START ) secondsView.startAnimation() applyTo(rootConstraintLayout) diff --git a/app/src/main/java/org/schabi/newpipe/views/player/SecondsView.kt b/app/src/main/java/org/schabi/newpipe/views/player/SecondsView.kt index 8472653fb..5e4885129 100644 --- a/app/src/main/java/org/schabi/newpipe/views/player/SecondsView.kt +++ b/app/src/main/java/org/schabi/newpipe/views/player/SecondsView.kt @@ -29,7 +29,9 @@ class SecondsView(context: Context, attrs: AttributeSet?) : LinearLayout(context var seconds: Int = 0 set(value) { binding.tvSeconds.text = context.resources.getQuantityString( - R.plurals.seconds, value, value + R.plurals.seconds, + value, + value ) field = value } diff --git a/app/src/test/java/org/schabi/newpipe/local/subscription/FeedGroupIconTest.kt b/app/src/test/java/org/schabi/newpipe/local/subscription/FeedGroupIconTest.kt index 2fc44d9b7..6db72255b 100644 --- a/app/src/test/java/org/schabi/newpipe/local/subscription/FeedGroupIconTest.kt +++ b/app/src/test/java/org/schabi/newpipe/local/subscription/FeedGroupIconTest.kt @@ -15,7 +15,8 @@ class FeedGroupIconTest { assertEquals( "Gap between ids detected (current item: ${currentIcon.name} - ${currentIcon.id} → should be: $shouldBeId)", - shouldBeId, currentIcon.id + shouldBeId, + currentIcon.id ) } } diff --git a/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt b/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt index 628c41da4..c7f53f3ac 100644 --- a/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt +++ b/app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt @@ -161,8 +161,11 @@ class ImportAllCombinationsTest { } catch (e: Throwable) { failedAssertions.add( FailData( - containsDb, containsSer, containsJson, - filename, e + containsDb, + containsSer, + containsJson, + filename, + e ) ) } From 81ddd5a1156daefabca0bf3afbafc3664e2cee63 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 20:47:02 +0800 Subject: [PATCH 160/190] ktlint: Fix no-empty-first-line-in-method-block violations Signed-off-by: Aayush Gupta --- .editorconfig | 1 - .../org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt | 1 - .../java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt | 1 - app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt | 1 - .../java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt | 1 - .../java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt | 1 - 6 files changed, 6 deletions(-) diff --git a/.editorconfig b/.editorconfig index 62ebdafe2..ffd02caf2 100644 --- a/.editorconfig +++ b/.editorconfig @@ -19,6 +19,5 @@ ktlint_standard_function-signature = disabled ktlint_standard_max-line-length = disabled ktlint_standard_mixed-condition-operators = disabled ktlint_standard_no-empty-first-line-in-class-body = disabled -ktlint_standard_no-empty-first-line-in-method-block = disabled ktlint_standard_package-name = disabled ktlint_standard_property-naming = disabled diff --git a/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt b/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt index 06c0fd09c..32fb08db0 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt @@ -98,7 +98,6 @@ class HistoryRecordManagerTest { } private fun insertShuffledRelatedSearches(relatedSearches: Collection) { - // shuffle to make sure the order of items returned by queries depends only on // SearchHistoryEntry.creationDate, not on the actual insertion time, so that we can // verify that the `ORDER BY` clause does its job diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt index 6ef64ec4d..a6ab2c6cc 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt @@ -91,7 +91,6 @@ abstract class StreamDAO : BasicDAO { newerStream.uid = existentMinimalStream.uid if (!StreamTypeUtil.isLiveStream(newerStream.streamType)) { - // Use the existent upload date if the newer stream does not have a better precision // (i.e. is an approximation). This is done to prevent unnecessary changes. val hasBetterPrecision = diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index 930998c67..ac076f1b8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -152,7 +152,6 @@ class FeedFragment : BaseStateFragment() { if (newState == RecyclerView.SCROLL_STATE_IDLE && !recyclerView.canScrollVertically(-1) ) { - if (tryGetNewItemsLoadedButton()?.isVisible == true) { hideNewItemsLoaded(true) } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt b/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt index cbe0baec4..a6c3561ec 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt @@ -44,7 +44,6 @@ private fun exportJustUrls(playlist: List): String { } private fun exportAsYoutubeTempPlaylist(playlist: List): String { - val videoIDs = playlist.asReversed().asSequence() .mapNotNull { getYouTubeId(it.streamEntity.url) } .take(50) // YouTube limitation: temp playlists can't have more than 50 items diff --git a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt index eb1153c7f..12fadb68d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt +++ b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt @@ -60,7 +60,6 @@ object PoTokenProviderImpl : PoTokenProvider { webPoTokenGenerator!!.isExpired() if (shouldRecreate) { - val innertubeClientRequestInfo = InnertubeClientRequestInfo.ofWebClient() innertubeClientRequestInfo.clientInfo.clientVersion = YoutubeParsingHelper.getClientVersion() From eb97366e41143e0c27565560515d3e155fbc7c67 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 20:51:34 +0800 Subject: [PATCH 161/190] ktlint: Drop non-required violation supression Signed-off-by: Aayush Gupta --- .editorconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index ffd02caf2..e86e7585e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -18,6 +18,5 @@ ktlint_standard_function-literal = disabled ktlint_standard_function-signature = disabled ktlint_standard_max-line-length = disabled ktlint_standard_mixed-condition-operators = disabled -ktlint_standard_no-empty-first-line-in-class-body = disabled ktlint_standard_package-name = disabled ktlint_standard_property-naming = disabled From 8c5f13ab5c849ec0c71bc1952e453ec733352148 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 20:53:27 +0800 Subject: [PATCH 162/190] ktlint: Fix function-signature violations Signed-off-by: Aayush Gupta --- .editorconfig | 1 - .../testUtil/TrampolineSchedulerRule.kt | 27 ++++--- .../newpipe/util/StreamItemAdapterTest.kt | 71 +++++++++---------- .../history/model/StreamHistoryEntry.kt | 23 +++--- .../org/schabi/newpipe/error/ErrorInfo.kt | 6 +- .../newpipe/local/feed/FeedViewModel.kt | 15 ++-- .../feed/notifications/NotificationWorker.kt | 5 +- .../local/subscription/SubscriptionManager.kt | 21 +++--- .../player/mediabrowser/PackageValidator.kt | 33 ++++----- .../newpipe/util/potoken/PoTokenWebView.kt | 36 +++++----- 10 files changed, 110 insertions(+), 128 deletions(-) diff --git a/.editorconfig b/.editorconfig index e86e7585e..9b62cec64 100644 --- a/.editorconfig +++ b/.editorconfig @@ -15,7 +15,6 @@ ktlint_standard_chain-method-continuation = disabled ktlint_standard_class-signature = disabled ktlint_standard_function-expression-body = disabled ktlint_standard_function-literal = disabled -ktlint_standard_function-signature = disabled ktlint_standard_max-line-length = disabled ktlint_standard_mixed-condition-operators = disabled ktlint_standard_package-name = disabled diff --git a/app/src/androidTest/java/org/schabi/newpipe/testUtil/TrampolineSchedulerRule.kt b/app/src/androidTest/java/org/schabi/newpipe/testUtil/TrampolineSchedulerRule.kt index 75f5c6195..8b9f6b752 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/testUtil/TrampolineSchedulerRule.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/testUtil/TrampolineSchedulerRule.kt @@ -17,21 +17,20 @@ class TrampolineSchedulerRule : TestRule { private val scheduler = Schedulers.trampoline() - override fun apply(base: Statement, description: Description): Statement = - object : Statement() { - override fun evaluate() { - try { - RxJavaPlugins.setComputationSchedulerHandler { scheduler } - RxJavaPlugins.setIoSchedulerHandler { scheduler } - RxJavaPlugins.setNewThreadSchedulerHandler { scheduler } - RxJavaPlugins.setSingleSchedulerHandler { scheduler } - RxAndroidPlugins.setInitMainThreadSchedulerHandler { scheduler } + override fun apply(base: Statement, description: Description): Statement = object : Statement() { + override fun evaluate() { + try { + RxJavaPlugins.setComputationSchedulerHandler { scheduler } + RxJavaPlugins.setIoSchedulerHandler { scheduler } + RxJavaPlugins.setNewThreadSchedulerHandler { scheduler } + RxJavaPlugins.setSingleSchedulerHandler { scheduler } + RxAndroidPlugins.setInitMainThreadSchedulerHandler { scheduler } - base.evaluate() - } finally { - RxJavaPlugins.reset() - RxAndroidPlugins.reset() - } + base.evaluate() + } finally { + RxJavaPlugins.reset() + RxAndroidPlugins.reset() } } + } } diff --git a/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt b/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt index 348612249..22c7887f9 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt @@ -248,39 +248,37 @@ class StreamItemAdapterTest { * @return a list of video streams, in which their video only property mirrors the provided * [videoOnly] vararg. */ - private fun getVideoStreams(vararg videoOnly: Boolean) = - StreamItemAdapter.StreamInfoWrapper( - videoOnly.map { - VideoStream.Builder() - .setId(Stream.ID_UNKNOWN) - .setContent("https://example.com", true) - .setMediaFormat(MediaFormat.MPEG_4) - .setResolution("720p") - .setIsVideoOnly(it) - .build() - }, - context - ) + private fun getVideoStreams(vararg videoOnly: Boolean) = StreamInfoWrapper( + videoOnly.map { + VideoStream.Builder() + .setId(Stream.ID_UNKNOWN) + .setContent("https://example.com", true) + .setMediaFormat(MediaFormat.MPEG_4) + .setResolution("720p") + .setIsVideoOnly(it) + .build() + }, + context + ) /** * @return a list of audio streams, containing valid and null elements mirroring the provided * [shouldBeValid] vararg. */ - private fun getAudioStreams(vararg shouldBeValid: Boolean) = - getSecondaryStreamsFromList( - shouldBeValid.map { - if (it) { - AudioStream.Builder() - .setId(Stream.ID_UNKNOWN) - .setContent("https://example.com", true) - .setMediaFormat(MediaFormat.OPUS) - .setAverageBitrate(192) - .build() - } else { - null - } + private fun getAudioStreams(vararg shouldBeValid: Boolean) = getSecondaryStreamsFromList( + shouldBeValid.map { + if (it) { + AudioStream.Builder() + .setId(Stream.ID_UNKNOWN) + .setContent("https://example.com", true) + .setMediaFormat(MediaFormat.OPUS) + .setAverageBitrate(192) + .build() + } else { + null } - ) + } + ) private fun getIncompleteAudioStreams(size: Int): List { val list = ArrayList(size) @@ -325,18 +323,17 @@ class StreamItemAdapterTest { /** * Helper function that builds a secondary stream list. */ - private fun getSecondaryStreamsFromList(streams: List) = - SparseArrayCompat?>(streams.size).apply { - streams.forEachIndexed { index, stream -> - val secondaryStreamHelper: SecondaryStreamHelper? = stream?.let { - SecondaryStreamHelper( - StreamItemAdapter.StreamInfoWrapper(streams, context), - it - ) - } - put(index, secondaryStreamHelper) + private fun getSecondaryStreamsFromList(streams: List) = SparseArrayCompat?>(streams.size).apply { + streams.forEachIndexed { index, stream -> + val secondaryStreamHelper: SecondaryStreamHelper? = stream?.let { + SecondaryStreamHelper( + StreamItemAdapter.StreamInfoWrapper(streams, context), + it + ) } + put(index, secondaryStreamHelper) } + } private fun getResponse(headers: Map): Response { val listHeaders = HashMap>() diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt index 57d47d0ac..816b25c2a 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt @@ -30,16 +30,15 @@ data class StreamHistoryEntry( accessDate.isEqual(other.accessDate) } - fun toStreamInfoItem(): StreamInfoItem = - StreamInfoItem( - streamEntity.serviceId, - streamEntity.url, - streamEntity.title, - streamEntity.streamType - ).apply { - duration = streamEntity.duration - uploaderName = streamEntity.uploader - uploaderUrl = streamEntity.uploaderUrl - thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl) - } + fun toStreamInfoItem(): StreamInfoItem = StreamInfoItem( + streamEntity.serviceId, + streamEntity.url, + streamEntity.title, + streamEntity.streamType + ).apply { + duration = streamEntity.duration + uploaderName = streamEntity.uploader + uploaderUrl = streamEntity.uploaderUrl + thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl) + } } diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt index 98cae7b30..05f2b34a9 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt @@ -160,16 +160,14 @@ class ErrorInfo private constructor( const val SERVICE_NONE = "" - private fun getServiceName(serviceId: Int?) = - // not using getNameOfServiceById since we want to accept a nullable serviceId and we + private fun getServiceName(serviceId: Int?) = // not using getNameOfServiceById since we want to accept a nullable serviceId and we // want to default to SERVICE_NONE ServiceList.all().firstOrNull { it.serviceId == serviceId }?.serviceInfo?.name ?: SERVICE_NONE fun throwableToStringList(throwable: Throwable) = arrayOf(throwable.stackTraceToString()) - fun throwableListToStringList(throwableList: List) = - throwableList.map { it.stackTraceToString() }.toTypedArray() + fun throwableListToStringList(throwableList: List) = throwableList.map { it.stackTraceToString() }.toTypedArray() fun getMessage( throwable: Throwable?, diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt index 481846a2b..4e50f7bd1 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt @@ -151,17 +151,14 @@ class FeedViewModel( fun getShowFutureItemsFromPreferences() = getShowFutureItemsFromPreferences(application) companion object { - private fun getShowPlayedItemsFromPreferences(context: Context) = - PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(context.getString(R.string.feed_show_watched_items_key), true) + private fun getShowPlayedItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.feed_show_watched_items_key), true) - private fun getShowPartiallyPlayedItemsFromPreferences(context: Context) = - PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(context.getString(R.string.feed_show_partially_watched_items_key), true) + private fun getShowPartiallyPlayedItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.feed_show_partially_watched_items_key), true) - private fun getShowFutureItemsFromPreferences(context: Context) = - PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(context.getString(R.string.feed_show_future_items_key), true) + private fun getShowFutureItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.feed_show_future_items_key), true) fun getFactory(context: Context, groupId: Long) = viewModelFactory { initializer { diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt index 36be86fcd..d1fd29945 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt @@ -95,9 +95,8 @@ class NotificationWorker( private val TAG = NotificationWorker::class.java.simpleName private const val WORK_TAG = App.PACKAGE_NAME + "_streams_notifications" - private fun areNotificationsEnabled(context: Context) = - NotificationHelper.areNewStreamsNotificationsEnabled(context) && - NotificationHelper.areNotificationsEnabledOnDevice(context) + private fun areNotificationsEnabled(context: Context) = NotificationHelper.areNewStreamsNotificationsEnabled(context) && + NotificationHelper.areNotificationsEnabledOnDevice(context) /** * Schedules a task for the [NotificationWorker] diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt index bc7afe602..2918ad5fb 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt @@ -70,19 +70,18 @@ class SubscriptionManager(context: Context) { return listEntities } - fun updateChannelInfo(info: ChannelInfo): Completable = - subscriptionTable.getSubscription(info.serviceId, info.url) - .flatMapCompletable { - Completable.fromRunnable { - it.apply { - name = info.name - avatarUrl = ImageStrategy.imageListToDbUrl(info.avatars) - description = info.description - subscriberCount = info.subscriberCount - } - subscriptionTable.update(it) + fun updateChannelInfo(info: ChannelInfo): Completable = subscriptionTable.getSubscription(info.serviceId, info.url) + .flatMapCompletable { + Completable.fromRunnable { + it.apply { + name = info.name + avatarUrl = ImageStrategy.imageListToDbUrl(info.avatars) + description = info.description + subscriberCount = info.subscriberCount } + subscriptionTable.update(it) } + } fun updateNotificationMode(serviceId: Int, url: String, @NotificationMode mode: Int): Completable { return subscriptionTable().getSubscription(serviceId, url) diff --git a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt index c41f1dadd..05c94e990 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt +++ b/app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt @@ -173,11 +173,10 @@ internal class PackageValidator(context: Context) { */ @Suppress("deprecation") @SuppressLint("PackageManagerGetSignatures") - private fun getPackageInfo(callingPackage: String): PackageInfo? = - packageManager.getPackageInfo( - callingPackage, - PackageManager.GET_SIGNATURES or PackageManager.GET_PERMISSIONS - ) + private fun getPackageInfo(callingPackage: String): PackageInfo? = packageManager.getPackageInfo( + callingPackage, + PackageManager.GET_SIGNATURES or PackageManager.GET_PERMISSIONS + ) /** * Gets the signature of a given package's [PackageInfo]. @@ -189,23 +188,21 @@ internal class PackageValidator(context: Context) { * returns `null` as the signature. */ @Suppress("deprecation") - private fun getSignature(packageInfo: PackageInfo): String? = - if (packageInfo.signatures == null || packageInfo.signatures!!.size != 1) { - // Security best practices dictate that an app should be signed with exactly one (1) - // signature. Because of this, if there are multiple signatures, reject it. - null - } else { - val certificate = packageInfo.signatures!![0].toByteArray() - getSignatureSha256(certificate) - } + private fun getSignature(packageInfo: PackageInfo): String? = if (packageInfo.signatures == null || packageInfo.signatures!!.size != 1) { + // Security best practices dictate that an app should be signed with exactly one (1) + // signature. Because of this, if there are multiple signatures, reject it. + null + } else { + val certificate = packageInfo.signatures!![0].toByteArray() + getSignatureSha256(certificate) + } /** * Finds the Android platform signing key signature. This key is never null. */ - private fun getSystemSignature(): String = - getPackageInfo(ANDROID_PLATFORM)?.let { platformInfo -> - getSignature(platformInfo) - } ?: throw IllegalStateException("Platform signature not found") + private fun getSystemSignature(): String = getPackageInfo(ANDROID_PLATFORM)?.let { platformInfo -> + getSignature(platformInfo) + } ?: throw IllegalStateException("Platform signature not found") /** * Creates a SHA-256 signature given a certificate byte array. diff --git a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt index 9db0e0f59..deeef613a 100644 --- a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt +++ b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt @@ -179,16 +179,15 @@ class PoTokenWebView private constructor( //endregion //region Obtaining poTokens - override fun generatePoToken(identifier: String): Single = - Single.create { emitter -> - if (BuildConfig.DEBUG) { - Log.d(TAG, "generatePoToken() called with identifier $identifier") - } - runOnMainThread(emitter) { - addPoTokenEmitter(identifier, emitter) - val u8Identifier = stringToU8(identifier) - webView.evaluateJavascript( - """try { + override fun generatePoToken(identifier: String): Single = Single.create { emitter -> + if (BuildConfig.DEBUG) { + Log.d(TAG, "generatePoToken() called with identifier $identifier") + } + runOnMainThread(emitter) { + addPoTokenEmitter(identifier, emitter) + val u8Identifier = stringToU8(identifier) + webView.evaluateJavascript( + """try { identifier = "$identifier" u8Identifier = $u8Identifier poTokenU8 = obtainPoToken(webPoSignalOutput, integrityToken, u8Identifier) @@ -201,9 +200,9 @@ class PoTokenWebView private constructor( } catch (error) { $JS_INTERFACE.onObtainPoTokenError(identifier, error + "\n" + error.stack) }""" - ) {} - } + ) {} } + } /** * Called by the JavaScript snippet from [generatePoToken] when an error occurs in calling the @@ -373,14 +372,13 @@ class PoTokenWebView private constructor( "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.3" private const val JS_INTERFACE = "PoTokenWebView" - override fun newPoTokenGenerator(context: Context): Single = - Single.create { emitter -> - runOnMainThread(emitter) { - val potWv = PoTokenWebView(context, emitter) - potWv.loadHtmlAndObtainBotguard(context) - emitter.setDisposable(potWv.disposables) - } + override fun newPoTokenGenerator(context: Context): Single = Single.create { emitter -> + runOnMainThread(emitter) { + val potWv = PoTokenWebView(context, emitter) + potWv.loadHtmlAndObtainBotguard(context) + emitter.setDisposable(potWv.disposables) } + } /** * Runs [runnable] on the main thread using `Handler(Looper.getMainLooper()).post()`, and From 6b2a1cedef74c65f091027945a08a23bfba9bc9e Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 20:55:36 +0800 Subject: [PATCH 163/190] ktlint: Fix function-literal violations Signed-off-by: Aayush Gupta --- .editorconfig | 1 - .../org/schabi/newpipe/local/feed/FeedViewModel.kt | 10 ++++++++-- .../newpipe/local/feed/service/FeedLoadService.kt | 3 ++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.editorconfig b/.editorconfig index 9b62cec64..dd54b4355 100644 --- a/.editorconfig +++ b/.editorconfig @@ -14,7 +14,6 @@ ktlint_standard_backing-property-naming = disabled ktlint_standard_chain-method-continuation = disabled ktlint_standard_class-signature = disabled ktlint_standard_function-expression-body = disabled -ktlint_standard_function-literal = disabled ktlint_standard_max-line-length = disabled ktlint_standard_mixed-condition-operators = disabled ktlint_standard_package-name = disabled diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt index 4e50f7bd1..7e781b30f 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt @@ -64,8 +64,14 @@ class FeedViewModel( feedDatabaseManager.notLoadedCount(groupId), feedDatabaseManager.oldestSubscriptionUpdate(groupId), - Function6 { t1: FeedEventManager.Event, t2: Boolean, t3: Boolean, t4: Boolean, - t5: Long, t6: List -> + Function6 { + t1: FeedEventManager.Event, + t2: Boolean, + t3: Boolean, + t4: Boolean, + t5: Long, + t6: List + -> return@Function6 CombineResultEventHolder(t1, t2, t3, t4, t5, t6.firstOrNull()) } ) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt index b4af67e6a..48ad5df94 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt @@ -94,7 +94,8 @@ class FeedLoadService : Service() { .doOnSubscribe { startForeground(NOTIFICATION_ID, notificationBuilder.build()) } - .subscribe { _, error: Throwable? -> // explicitly mark error as nullable + .subscribe { _, error: Throwable? -> + // explicitly mark error as nullable if (error != null) { Log.e(TAG, "Error while storing result", error) handleError(error) From 8ac8424cab5f924df34b1ec65612e8505a43f7e9 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Jan 2026 20:56:42 +0800 Subject: [PATCH 164/190] ktlint: Drop unused chain-method-continuation violation supression Signed-off-by: Aayush Gupta --- .editorconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index dd54b4355..da6d5442d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,7 +11,6 @@ ktlint_code_style = android_studio ktlint_function_naming_ignore_when_annotated_with = Composable ktlint_standard_backing-property-naming = disabled -ktlint_standard_chain-method-continuation = disabled ktlint_standard_class-signature = disabled ktlint_standard_function-expression-body = disabled ktlint_standard_max-line-length = disabled From 2fd2822053b33247c047c5481a5f69fb36f37d1d Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 22 Jan 2026 17:30:15 +0800 Subject: [PATCH 165/190] ktlint: Drop non-required backing-property-naming supression Signed-off-by: Aayush Gupta --- .editorconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index da6d5442d..b34abfa11 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,7 +10,6 @@ ktlint_code_style = android_studio # https://pinterest.github.io/ktlint/latest/rules/standard/#function-naming ktlint_function_naming_ignore_when_annotated_with = Composable -ktlint_standard_backing-property-naming = disabled ktlint_standard_class-signature = disabled ktlint_standard_function-expression-body = disabled ktlint_standard_max-line-length = disabled From 25b133946d2ded5984ce8b1ff9ebd2e0151b1d13 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Fri, 23 Jan 2026 22:04:05 +0100 Subject: [PATCH 166/190] [YouTube] Adapt YoutubeHttpDataSource to TVHTML5 client removal in NPE --- .../newpipe/player/datasource/YoutubeHttpDataSource.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/datasource/YoutubeHttpDataSource.java b/app/src/main/java/org/schabi/newpipe/player/datasource/YoutubeHttpDataSource.java index d4658d1de..4cdb649a3 100644 --- a/app/src/main/java/org/schabi/newpipe/player/datasource/YoutubeHttpDataSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/datasource/YoutubeHttpDataSource.java @@ -14,10 +14,8 @@ import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Util.castNonNull; import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getAndroidUserAgent; import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getIosUserAgent; -import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getTvHtml5UserAgent; import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isAndroidStreamingUrl; import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isIosStreamingUrl; -import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isTvHtml5StreamingUrl; import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isWebStreamingUrl; import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isWebEmbeddedPlayerStreamingUrl; import static java.lang.Math.min; @@ -661,10 +659,7 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD } } - final boolean isTvHtml5StreamingUrl = isTvHtml5StreamingUrl(requestUrl); - if (isWebStreamingUrl(requestUrl) - || isTvHtml5StreamingUrl || isWebEmbeddedPlayerStreamingUrl(requestUrl)) { httpURLConnection.setRequestProperty(HttpHeaders.ORIGIN, YOUTUBE_BASE_URL); httpURLConnection.setRequestProperty(HttpHeaders.REFERER, YOUTUBE_BASE_URL); @@ -685,9 +680,6 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD } else if (isIosStreamingUrl) { httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, getIosUserAgent(null)); - } else if (isTvHtml5StreamingUrl) { - httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, - getTvHtml5UserAgent()); } else { // non-mobile user agent httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, DownloaderImpl.USER_AGENT); From d7dffb7a900f79a15b9198922b6930229f09e2ed Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 27 Jan 2026 21:32:15 +0100 Subject: [PATCH 167/190] Add deprecation to LocalItemListAdapter.showFooter(true) --- .../java/org/schabi/newpipe/local/BaseLocalListFragment.java | 2 ++ .../java/org/schabi/newpipe/local/LocalItemListAdapter.java | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java b/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java index 00a721bcf..d690a2607 100644 --- a/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java @@ -212,6 +212,8 @@ public abstract class BaseLocalListFragment extends BaseStateFragment showListFooter(false); } + @Deprecated(since = "Calling this method with `true` may cause crashes, see " + + "https://github.com/TeamNewPipe/NewPipe/pull/12996#pullrequestreview-3713317115") @Override public void showListFooter(final boolean show) { if (itemsList == null) { diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index 3bb84e2de..6bbe536e3 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -207,6 +207,8 @@ public class LocalItemListAdapter extends RecyclerView.Adapter Date: Sun, 21 Dec 2025 17:08:51 +0100 Subject: [PATCH 168/190] Fix removing unwatched streams from playlist when using "remove watched" The bug is caused by a wanted but forgotten inconsistency in the database. A stream can be listed in the watch history (StreamHistoryEntity) while having no corresponding playback state (StreamStateEntity) containing the matching playback position. This is caused by the fact that NewPipe does not consider a watch time of less than five seconds to be worthy to be put into the StreamStateEntity because the video was most likely played by error. Those videos are, however, counted and stored in the watch history. --- .../local/playlist/LocalPlaylistFragment.java | 51 ++++++++----------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index ca6ff9502..9bbab6da0 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -447,39 +447,28 @@ public class LocalPlaylistFragment extends BaseLocalListFragment Date: Sun, 21 Dec 2025 20:40:35 +0100 Subject: [PATCH 169/190] Use checkbox to remove partially watched videos --- .../local/playlist/LocalPlaylistFragment.java | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 9bbab6da0..6c2c1ec46 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -22,6 +22,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.LinearLayout; import android.widget.Toast; import androidx.annotation.NonNull; @@ -54,6 +55,7 @@ import org.schabi.newpipe.local.BaseLocalListFragment; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; +import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; @@ -365,16 +367,29 @@ public class LocalPlaylistFragment extends BaseLocalListFragment - removeWatchedStreams(false)) - .setNeutralButton( - R.string.remove_watched_popup_yes_and_partially_watched_videos, - (d, id) -> removeWatchedStreams(true)) - .setNegativeButton(R.string.cancel, - (d, id) -> d.cancel()) + .setView(checkboxContainer) + .setPositiveButton(R.string.yes, (d, id) -> + removeWatchedStreams(removePartiallyWatchedCheckbox.isChecked())) + .setNegativeButton(R.string.cancel, (d, id) -> d.cancel()) .show(); } } else if (item.getItemId() == R.id.menu_item_remove_duplicates) { From 8f32532acd1f29ac0423b90b2ed9487126c06246 Mon Sep 17 00:00:00 2001 From: tobigr Date: Sun, 21 Dec 2025 20:42:35 +0100 Subject: [PATCH 170/190] "Removed watched videos" changed to "Remove watched streams" Playlists can also contain audio-only items. Therefore, the term "stream" is used. --- .../newpipe/local/playlist/LocalPlaylistFragment.java | 2 +- app/src/main/res/values-ar-rLY/strings.xml | 2 +- app/src/main/res/values-ar/strings.xml | 2 +- app/src/main/res/values-az/strings.xml | 2 +- app/src/main/res/values-b+ast/strings.xml | 2 +- app/src/main/res/values-b+uz+Latn/strings.xml | 2 +- app/src/main/res/values-be/strings.xml | 2 +- app/src/main/res/values-bg/strings.xml | 2 +- app/src/main/res/values-bn/strings.xml | 2 +- app/src/main/res/values-bs/strings.xml | 2 +- app/src/main/res/values-ca/strings.xml | 2 +- app/src/main/res/values-ckb/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-da/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-el/strings.xml | 2 +- app/src/main/res/values-eo/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-et/strings.xml | 2 +- app/src/main/res/values-eu/strings.xml | 2 +- app/src/main/res/values-fa/strings.xml | 2 +- app/src/main/res/values-fi/strings.xml | 2 +- app/src/main/res/values-fil/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-gl/strings.xml | 2 +- app/src/main/res/values-he/strings.xml | 2 +- app/src/main/res/values-hi/strings.xml | 2 +- app/src/main/res/values-hr/strings.xml | 2 +- app/src/main/res/values-hu/strings.xml | 2 +- app/src/main/res/values-ia/strings.xml | 2 +- app/src/main/res/values-in/strings.xml | 2 +- app/src/main/res/values-is/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-ka/strings.xml | 2 +- app/src/main/res/values-kmr/strings.xml | 2 +- app/src/main/res/values-ko/strings.xml | 2 +- app/src/main/res/values-ku/strings.xml | 2 +- app/src/main/res/values-lt/strings.xml | 2 +- app/src/main/res/values-lv/strings.xml | 2 +- app/src/main/res/values-mk/strings.xml | 2 +- app/src/main/res/values-ml/strings.xml | 2 +- app/src/main/res/values-nb-rNO/strings.xml | 2 +- app/src/main/res/values-ne/strings.xml | 2 +- app/src/main/res/values-nl-rBE/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 2 +- app/src/main/res/values-nqo/strings.xml | 2 +- app/src/main/res/values-or/strings.xml | 2 +- app/src/main/res/values-pa/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-pt-rPT/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values-ro/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-ryu/strings.xml | 2 +- app/src/main/res/values-sat/strings.xml | 2 +- app/src/main/res/values-sc/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-so/strings.xml | 2 +- app/src/main/res/values-sq/strings.xml | 2 +- app/src/main/res/values-sr/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 2 +- app/src/main/res/values-ta/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- app/src/main/res/values-vi/strings.xml | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 2 +- app/src/main/res/values-zh-rHK/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values/strings.xml | 8 ++++---- 71 files changed, 74 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 6c2c1ec46..49bf5acfe 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -370,7 +370,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment%s مُشاهِد عرض تلميح عند الضغط على زر استخدام المشغل الخلفي أو النافذة المنبثقة في صفحة تفاصيل الفديو - نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا + نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا انتهى وقت الاتصال غير معروف تشغيل تلقائي diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 895314ad5..20d42dc61 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -547,7 +547,7 @@ هذا الفيديو مقيد بالفئة العمرية. \n \nقم بتشغيل \"%1$s\" في الإعدادات إذا كنت تريد رؤيته. - نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا + نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل. \nهل أنت واثق؟ لا يمكن التراجع عن هذا! إزالة مقاطع الفيديو التي تمت مشاهدتها؟ diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 689cf4937..07c7ba2ad 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -652,7 +652,7 @@ Oynatma Sürəti Nizamlamaları Ayır (pozuntuya səbəb ola bilər) Xətanı göstər - Bəli və qismən baxılmış videolar + Bəli və qismən baxılmış videolar %1$s endirməsi silindi %1$s endirmə silindi diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index 81b212f80..f89bb1ad7 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -312,7 +312,7 @@ Últimu anovamientu del feed: %s Grupos de canales Pola mor de les torgues d\'ExoPlayer la duración afitóse en %d segundos - Sí, y tamién los vistos parcialmente + Sí, y tamién los vistos parcialmente Van desaniciase los vídeos que se vieren enantes y dempués d\'amestase a la llista de reproducción. \n¿De xuru\? ¡Esto nun pue desfacese! ¿Desaniciar los vídeos vistos\? diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index 2be37ea7c..be009d792 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -384,7 +384,7 @@ %d sekondlar ExoPlayer cheklovlari tufayli qidiruv davomiyligi %d soniya qilib belgilandi - Ha, va qisman videolarni tomosha qildim + Ha, va qisman videolarni tomosha qildim Pleylistga qo\'shilishdan oldin va keyin ko\'rilgan videolar o\'chiriladi. \nIshonchingiz komilmi\? Buni qaytarib bo\'lmaydi! Ko\'rilgan videolar olib tashlansinmi\? diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index ef7ef98c3..f222a0f41 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -617,7 +617,7 @@ Пры кожным спампоўванні вам будзе прапанавана выбраць месца захавання Загрузка канала… Выдаліць прагледжаныя відэа\? - Так, часткова прагледжаныя відэа таксама + Так, часткова прагледжаныя відэа таксама Працэнт Відэа, якія прагледжаны перад дадаваннем і пасля дадавання ў спіс прайгравання, будуць выдалены. \nВы ўпэўнены? Гэта дзеянне немагчыма скасаваць! Паказвае варыянт збою пры выкарыстанні плэера diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 69f8a8e9b..79e308f3d 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -502,7 +502,7 @@ Съдържанието е достъпно само за хора, които са си платили, затова не може да бъде гледано или изтеглено с NewPipe. Това видео е достъпно за абонати на YouTube Music Premium, затова не може да бъде гледано или изтеглено с NewPipe. Премахни изгледаните видеа\? - Да, както и само частично изгледаните видеа + Да, както и само частично изгледаните видеа Брой на абонати не е наличен Инстанцията вече съществува Файлът е преместен или изтрит diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 8d767a173..0190f50ce 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -337,7 +337,7 @@ অপুনরুদ্ধারযোগ্য প্লেয়ার ত্রুটি ঘটেছে ইন্সট্যান্সটি যাচাই করা যায়নি রিক্যাপচা কুকিগুলো পরিষ্কার করা হয়েছে - হ্যাঁ, এবং আংশিকভাবে দেখা ভিডিও + হ্যাঁ, এবং আংশিকভাবে দেখা ভিডিও ব্যবস্থা দ্বারা ক্রিয়া অস্বীকার করা হয়েছে স্বয়ংক্রিয়ভাবে প্লেব্যাক শুরু করো %s — তে একটি পপ-আপে প্লে শুরু করো diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index ff0b7003a..ee4fc3317 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -579,7 +579,7 @@ Ukloniti duplikate? Želite li ukloniti sve duplikatne tokove na ovoj listi za reprodukciju? Videozapisi koji su pregledani prije i poslije dodavanja na listu za reprodukciju bit će uklonjeni.\nJeste li sigurni? Ovo se ne može poništiti! - Da, i djelimično odgledani videozapisi + Da, i djelimično odgledani videozapisi Zbog ograničenja ExoPlayera, trajanje pretraživanja je postavljeno na %d sekundi Šta je novo Stranica grupe kanala diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 31183d15b..b8fe195ea 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -508,7 +508,7 @@ %d segons A causa de les limitacions d\'ExoPlayer, la durada de cerca és de %d segons - Sí, i també els vídeos vistos parcialment + Sí, i també els vídeos vistos parcialment Els vídeos que ja heu vist tant abans com després d\'haver estat afegits a la llista de reproducció seran suprimits. \nN\'esteu segurs\? Aquesta acció no pot desfer-se! Esborrar els vídeos ja vistos\? diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index f0ddfb6e9..6bb843e04 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -350,7 +350,7 @@ په‌نجه‌ڕاگرتن له‌سه‌ری بۆ نۆبه‌ت نه‌بوون زۆرترین ژمارەی هەوڵدان پێش پاشگەزبوونەوە لە دابەزاندنەکە هەڵه‌ - بەڵێ، لەگەڵ ڤیدیۆ سەیر کراوەکانەوە + بەڵێ، لەگەڵ ڤیدیۆ سەیر کراوەکانەوە دەستپێکردنی لێدان لە پەنجەرەوه‌ نابەدڵه‌كان مێژوو diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 853b8c1cb..5c6a6b251 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -517,7 +517,7 @@ Toto video má věkové omezení. \n \nPokud jej chcete vidět, povolte „%1$s“ v nastavení. - Ano, i zčásti zhlédnutá videa + Ano, i zčásti zhlédnutá videa Odstranit zhlédnutá videa? Odstranit zhlédnutá Videa, která jste zhlédli před a po jejich přidání do playlistu, budou odstraněna. diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 78f08ee85..8021bd64c 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -630,7 +630,7 @@ Ingen app på din enhed kan åbne dette Ingen ledig plads på enheden App-sprog - Ja, og delvist sete videoer + Ja, og delvist sete videoer Fejl ved indlæsning af feed Kunne ikke indlæse feed for \'%s\'. Vis \"Crash afspilleren\" diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index b36b8555b..ebb734b04 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -518,7 +518,7 @@ \nAktiviere in den Einstellungen „%1$s“, falls du diese sehen möchtest. Videos, die vor und nach dem Hinzufügen zur Wiedergabeliste angeschaut wurden, werden entfernt. \nBist du sicher\? Dies kann nicht rückgängig gemacht werden! - Ja, und teilweise gesehene Videos + Ja, und teilweise gesehene Videos Gesehene entfernen Gesehene Videos entfernen\? Originalzeit vor Elementen anzeigen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 02bf75b30..22f8ef447 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -524,7 +524,7 @@ %d δευτερόλεπτα Λόγω περιορισμών του ExoPlayer, η διάρκεια αναζήτησης ορίστηκε στα %d δευτερόλεπτα - Ναι. Και τα μερικώς θεαθέντα βίντεο + Ναι. Και τα μερικώς θεαθέντα βίντεο Τα βίντεο που εθεάθησαν πριν και αφού προστέθηκαν στη λίστα αναπαραγωγής θα απομακρυνθούν \nΕίστε σίγουρος; Δεν μπορεί να αναιρεθεί! Απομάκρυνση θεαθέντων βίντεο; diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 3dde69618..cc42c0426 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -612,5 +612,5 @@ Filmetoj Filmetoj kiuj spektiĝis antaŭ aŭ post sia aldoniĝo al la ludlisto foriĝus.. \nĈu vi certas? Ĉi tio nemalfareblus! Restarigi implicitajn agordojn - Jes, kaj ankaŭ parte spektitajn filmetojn + Jes, kaj ankaŭ parte spektitajn filmetojn diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 72d1f58b5..5a6b1bd20 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -512,7 +512,7 @@ Álbumes Canciones Este vídeo tiene restricción de edad. \n \nHabilitar \"%1$s\" en los ajustes si quieres verlo. - Sí, y también vídeos vistos parcialmente + Sí, y también vídeos vistos parcialmente Los vídeos que ya se hayan visto luego de añadidos a la lista de reproducción, serán quitados. \n¿Estás seguro\? ¡Esta acción no se puede deshacer! ¿Quitar vídeos ya vistos\? diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 05f4cf505..dfebedacb 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -532,7 +532,7 @@ Sellega eemaldame vaadatud videod ja esitusloendisse lisatud videod. \nKas sa oled kindel\? Seda tegevust ei saa hiljem tagasi pöörata! - Jah, sealhulgas videod, mille vaatmine jäi pooleli + Jah, sealhulgas videod, mille vaatmine jäi pooleli Kas eemaldame vaadatud videod\? Eemalda vaadatud videod Kasuta süsteemi keelt diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 5c963d6b7..71e71b7e5 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -512,7 +512,7 @@ %s-k sortua Kanalaren avatar-earen miniatura Erakutsi agrupatuta ez dauden harpidetzak bakarrik - Bai, partzialki ikusitako bideoak ere bai + Bai, partzialki ikusitako bideoak ere bai Jada ikusi eta gero erreprodukzio zerrendara gehitu diren bideoak ezabatuak izango dira. \nJarraitu nahi duzu\? Ekintza hau ezin da desegin! Ikusitako bideoak ezabatu\? diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 403fb4c11..58ce1d63a 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -449,7 +449,7 @@ %d ثانیه %d ثانیه - بله، و ویدیوهای ناقص دیده شده + بله، و ویدیوهای ناقص دیده شده برداشتن ویدیوهای دیده شده؟ پاک کردن دیده شده‌ها پیش‌فرض دستگاه diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 22c1fab12..4764f69d5 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -395,7 +395,7 @@ Aiemmin katsotut ja soittolistaan lisätyt videot poistetaan. \nOletko varma\? Tätä ei voi peruuttaa! Poistetaanko katsotut videot\? - Kyllä ja osittain katsotut videot + Kyllä ja osittain katsotut videot Pysäytä Tyhjennä lataushistoria Sulje diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index 5dfcbd2ce..abb13644a 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -249,7 +249,7 @@ Mga track Mga gumagamit Hangganan ng Edad - Oo, pati na rin ang mga napanood nang video + Oo, pati na rin ang mga napanood nang video Kusa (tema ng device) Tanggalin ang kabuuan ng watch history? Walang mga stream na maaaring i-download diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index eb28d0e21..3e1752a4a 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -521,7 +521,7 @@ \n \nActivez « %1$s » dans les paramètres si vous voulez la voir. Supprimer les vidéos visionnées - Oui ainsi que les vidéos partiellement visionnées + Oui ainsi que les vidéos partiellement visionnées Les vidéos qui ont été visionnées avant et après avoir été ajoutées à la playlist seront supprimées. \nÊtes-vous certain(e) ? Cette action est irréversible ! Supprimer les vidéos visionnées \? Miniature de l\'avatar de la chaine diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index aacaf9288..20519e53b 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -387,7 +387,7 @@ %d segundos Debido ás restricións de ExoPlayer, a duración da busca estableceuse en %d segundos - Si, e visualizou parcialmente estes vídeos + Si, e visualizou parcialmente estes vídeos Eliminaranse os vídeos vistos antes e despois de seren engadidos á lista de reprodución. \nEstás seguro\? Isto non se pode desfacer.! Borrar todos os vídeos vistos\? diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index c35281207..e85e9809b 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -527,7 +527,7 @@ סרטון זה מוגבל לצפייה מגיל מסוים. \n \nיש להפעיל את „%1$s” בהגדרות כדי לצפות בו. - כן, לרבות סרטונים שהפסקתי באמצע + כן, לרבות סרטונים שהפסקתי באמצע סרטונים שלאחר שצפית בהם מופיע לרשימת הנגינה יוסרו. \nלהמשיך\? זאת פעולה בלתי הפיכה! הסרת נצפו diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index d2e6a422e..f9939f28b 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -584,7 +584,7 @@ डिस्क से सभी डाउनलोड की गई फ़ाइलें मिटाएं\? एंड्रॉइड 10 से शुरू होकर केवल \'स्टोरेज एक्सेस फ्रेमवर्क\' समर्थित है एक इंस्टेंस चुनें - हां, और आंशिक रूप से देखे गए वीडियो भी + हां, और आंशिक रूप से देखे गए वीडियो भी फ़ीड लोड हो रही है… फ़ीड अपडेट चरणसीमा फ़ीड लोड करने में त्रुटि हूई diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 0eafb2930..95043ca32 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -502,7 +502,7 @@ Obrada feeda u tijeku … Zadnje aktualiziranje feeda: %s Grupe kanala - Da, i djelomično pogledana videa + Da, i djelomično pogledana videa Odaberi jednu instancu Aplikacija će te pitati kamo spremati preuzimanja. \nUključi sustavksi birač mapa (SAF) ako želiš preuzeti na eksternu SD karticu diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 12778fd32..c3148d0c8 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -620,7 +620,7 @@ Címkék Adatvédelem Gyors mód letiltása - Igen, és távolítsa el a részben megnézett videókat is + Igen, és távolítsa el a részben megnézett videókat is A videók, melyeket már megnézett miután a lejátszási listához adta őket, el lesznek távolítva. \nBiztos benne\? Ez nem vonható vissza! A szolgáltatásokból származó eredeti szövegek láthatók lesznek a közvetítési elemeken diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index d0bc29057..11571ce2d 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -165,7 +165,7 @@ Reimplaciar tu chronologia, subscriptiones e (optionalmente) configurationes currente Le videos jam observate ante e post de esser addite al lista de reproduction essera removite. \nSecur que tu vole\? Isto non pote disfacer se! - Si, e le videos partialmente observate + Si, e le videos partialmente observate Deler le videos observate\? Deler le videos observate diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index bb9286dab..f2bf9f53d 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -486,7 +486,7 @@ Konten ini belum didukung oleh NewPipe. \n \nSemoga akan didukung pada versi berikutnya. - Iya, dan video yang ditonton sebagian + Iya, dan video yang ditonton sebagian Video yang sudah ditonton sebelum dan sesudah ditambahkan ke daftar putar akan dibuang. \nApakah Anda yakin\? Ini tidak bisa diurungkan! Batal bisukan diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 387bce955..52d22d795 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -675,7 +675,7 @@ Fjöldi tilrauna áður en hætt er við niðurhal Myndskeiðum sem skoðuð voru áður eða eftir að þeim var bætt við spilunarlistann verður eytt. \nErtu viss? Það er ekki hægt að afturkalla þetta! - Já og skoðuð að hluta + Já og skoðuð að hluta Nota RSS ef tiltækt Hjartað af höfunda Slökkt er á tilkynningum diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f73e7437a..7b8fcc0c8 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -517,7 +517,7 @@ Questo video ha restrizioni di età. \n \nAttivare «%1$s» nelle Impostazioni per poterlo vedere. - Sì, anche quelli visualizzati parzialmente + Sì, anche quelli visualizzati parzialmente I video che sono stati visti prima e dopo essere stati aggiunti alla playlist verranno rimossi. \nProcedere\? L\'azione è irreversibile! Rimuovere i video già visti\? diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3274062b5..57ba676dc 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -499,7 +499,7 @@ \n閲覧したい場合、設定から \"%1$s\" を有効化してください。 プレイリストに追加される前も追加された後も視聴した動画はプレイリストから削除されます。 \nよろしいですか?この操作は元に戻せません! - はい、部分的に視聴した動画も削除します + はい、部分的に視聴した動画も削除します 視聴済みの動画を削除しますか? 視聴済みを削除 サービスのオリジナルのテキストが生放送に表示されます diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 819517ba4..68435d218 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -483,7 +483,7 @@ სისტემის ნაგულისხმევი ნანახის ამოღება წაშალოთ ნანახი ვიდეოები\? - დიახ, და ნაწილობრივ ნანახი ვიდეოები + დიახ, და ნაწილობრივ ნანახი ვიდეოები ExoPlayer-ის შეზღუდვების გამო ძიების ხანგრძლივობა დაყენდა %d წამზე %d წამი diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index 24bc5574e..bb19054d5 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -355,7 +355,7 @@ %d çirkeyan Ji ber astengiyên ExoPlayer dema lêgerînê li %d çirkeyan hate saz kirin - Erê, û bi qismî vîdyoyan temaşe kir + Erê, û bi qismî vîdyoyan temaşe kir Vîdyoyên ku berî û piştî ku li lîsteya lîsteyê hatine zêdekirin hatine temaşekirin, dê werin rakirin. \nPiştrastin\? Ev nayê betal kirin! Vîdyoyên temaşekirî rakin\? diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 39f854d35..a25ca6f96 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -589,7 +589,7 @@ %s 다운로드 완료 앱 언어 - 예, 부분적으로 본 비디오 + 예, 부분적으로 본 비디오 카테고리 %s에 의해 아래에서 선호하는 어두운 테마를 선택할 수 있습니다 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 3dc51fcc8..16f708a14 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -499,7 +499,7 @@ هونەرمەندەکان ئەلبوومەکان گۆرانییەکان - بەڵێ، لەگەڵ ڤیدیۆ تەماشاکراوەکانەوە + بەڵێ، لەگەڵ ڤیدیۆ تەماشاکراوەکانەوە ئەو ڤیدیۆیانەی پێشتر سەیرت کردوون و دواتر زیادت کردوون بۆ لیستەلێدان دەسڕێنەوە. \nئایا دڵنیایت؟ ئەمە ناگەڕێنرێتەوە! ڤیدیۆ تەماشاکراوەکان بسڕێنەوە؟ diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 20419fef6..bafefac6b 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -409,7 +409,7 @@ Užmegzti saugaus ryšio nepavyko Riboti raišką naudojant mobilius duomenis Automatiškai atkurti — %s - Taip ir iš dalies žiūrėtus vaizdo įrašus + Taip ir iš dalies žiūrėtus vaizdo įrašus Atstatyti parsiuntimo nepavyko Pertraukti matuojamuose tinkluose Sumažinti iki iššokančio lango grotuvo diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 0eb6e4201..d1a3e1d50 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -338,7 +338,7 @@ %d sekundes ExoPlayer ierobežojumu dēļ meklēšanas ilgums tika iestatīts uz %d sekundēm - Jā, un daļēji skatītos videoklipus + Jā, un daļēji skatītos videoklipus Videoklipi, kas ir skatīti pirms un pēc pievienošanas atskaņošanas sarakstam, tiks noņemti. \nVai tu esi pārliecināts\? To nevar atsaukt! Vai noņemt skatītos videoklipus\? diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 3a8fa2f07..5ce379216 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -406,7 +406,7 @@ Премести ги основниот селектор на јазичиња најдолу Позиција на основните јазичиња Прикажи информации за каналот - Да, како и делумно изгледаните видеа + Да, како и делумно изгледаните видеа Аудио снимка треба да е веќе присутна во овој стрим %s слушател diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 5a449025e..8688b670a 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -461,7 +461,7 @@ %d സെക്കൻഡുകൾ എക്സോപ്ലെയർ പരിമിതികൾ കാരണം തിരയൽ ദൈർഘ്യം %d സെക്കൻഡിലേക്ക് സജ്ജമാക്കി - അതെ, അതിന്റെകൂടെ ഭാഗികമായി കണ്ട വീഡിയോകളും + അതെ, അതിന്റെകൂടെ ഭാഗികമായി കണ്ട വീഡിയോകളും പ്ലേലിസ്റ്റിലേക്ക് ചേർക്കുന്നതിന് മുമ്പും ശേഷവും കണ്ട വീഡിയോകൾ നീക്കംചെയ്യും. \nനിങ്ങൾക്ക് ഉറപ്പാണോ\? ഇത് പഴയപടിയാക്കാൻ കഴിയില്ല! കണ്ട വീഡിയോകൾ നീക്കംചെയ്യണോ\? diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index d5edc2060..4e1ad1fe2 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -488,7 +488,7 @@ Artister Album Sanger - Ja, og delvist sette videoer + Ja, og delvist sette videoer Fjern sette videoer\? Fjern sette Opprettet av %s diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index b40145aa6..7af9f4634 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -514,7 +514,7 @@ यो सामग्री अझै NewPipeमा समर्थित छैन। \n… \nआशा छ कि भविष्यको संस्करणमा समर्थित हुनेछ। - हो र आंशिक रूपमा हेरिएको भिडियोहरू + हो र आंशिक रूपमा हेरिएको भिडियोहरू सूचना पाटी रंगिन बनाउनु केहि छैन Buffering हुँदै diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 02d772023..a8afb6a8f 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -440,7 +440,7 @@ %d seconden Door beperkingen van ExoPlayer is de zoekduur ingesteld op %d seconden - Ja, en deels bekeken video\'s + Ja, en deels bekeken video\'s Video\'s die zijn bekeken voor, en na, ze werden toegevoegd aan de afspeellijst worden verwijderd. \nBent u zeker\? Dit kan niet ongedaan gemaakt worden! Verwijder bekeken video\'s\? diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 4c8a28745..7f3e342ac 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -502,7 +502,7 @@ Deze inhoud wordt nog niet ondersteund door NewPipe. \n \nHopelijk zal dit bij een toekomstige versie ondersteund worden. - Ja, en deels bekeken video\'s + Ja, en deels bekeken video\'s Video\'s die zijn bekeken voor, en na ze werden toegevoegd aan de afspeellijst worden verwijderd. \nWeet u dit zeker\? Deze actie kan niet ongedaan gemaakt worden! Bekeken video\'s verwijderen\? diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml index caf8509e3..06b2e21dd 100644 --- a/app/src/main/res/values-nqo/strings.xml +++ b/app/src/main/res/values-nqo/strings.xml @@ -594,7 +594,7 @@ ߞߊ߬ ߖߌ߬ߦߊ߬ߖߟߎ߬ ߦߋߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ ߦߋߡߍ߲ߕߊ ߟߎ߫ ߖߏ߬ߛߌ߬ߕߐ߫ ߟߋ߬߸ ߡߍ߲ ߠߎ߬ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߢߍ߫ ߥߊߟߴߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߞߐ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊ߫. \nߌ ߟߊߣߍ߲߫ ߊ߬ ߟߊ߫ ؟ ߊ߬ ߕߍߣߊ߬ ߛߋ߫ ߟߊ߫ ߟߊߛߊ߬ߦߌ߬ ߟߊ߫߹ - ߐ߬ߤߐ߲߫߸ ߊ߬ߣߌ߫ ߘߏ߫ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߖߌ߬ߦߊ߬ߖߟߎ ߡߍ߲ ߠߎ߬ ߘߐ߫ + ߐ߬ߤߐ߲߫߸ ߊ߬ߣߌ߫ ߘߏ߫ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߖߌ߬ߦߊ߬ߖߟߎ ߡߍ߲ ߠߎ߬ ߘߐ߫ ߞߵߊ߬ ߓߍ߲߬ ExoPlayer ߟߊ߫ ߛߙߊߕߌ߫ ߛߌ߰ߣߍ߲ ߠߎ߫ ߡߊ߬߸ ߓߐߒߣߐ߬ߘߐ ߛߋ߲߬ߕߊ ߓߘߊ߬ ߞߍ߫ ߝߌ߬ߟߊ߲߬ %d ߘߌ߫ ߡߌ߬ߛߍ߲߬ %d diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 81184d526..d4830fac9 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -595,7 +595,7 @@ ଏହି ନାମ ସହିତ ଏକ ଡାଉନଲୋଡ୍ ଫାଇଲ୍ ପୂର୍ବରୁ ବିଦ୍ୟମାନ ଅଛି ଡାଉନଲୋଡ୍ ହୋଇଥିବା ଫାଇଲଗୁଡିକ ଡିଲିଟ୍ କରନ୍ତୁ ସିଷ୍ଟମ୍ ଫୋଲ୍ଡର୍ ପିକର୍ (SAF) ବ୍ୟବହାର କରନ୍ତୁ - ହଁ, ଏବଂ ଆଂଶିକ ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକ + ହଁ, ଏବଂ ଆଂଶିକ ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକ ଗୋଷ୍ଠୀ ନାମ ଖାଲି ଅଛି ଉପଲବ୍ଧ ଥିବାବେଳେ ଉତ୍ସର୍ଗୀକୃତ ଫିଡରୁ ଆଣ ତାଲିକା diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 9dfc8143e..23c9a8d51 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -493,7 +493,7 @@ %d ਸਕਿੰਟ %d ਸਕਿੰਟ - ਹਾਂ, ਅਤੇ ਅੱਧ-ਪਚੱਧੀਆਂ ਵੇਖੀਆਂ ਹੋਈਆਂ ਵੀ + ਹਾਂ, ਅਤੇ ਅੱਧ-ਪਚੱਧੀਆਂ ਵੇਖੀਆਂ ਹੋਈਆਂ ਵੀ ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਿਲ ਪਹਿਲਾਂ ਤੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੇ ਜਾ ਚੁੱਕੇ ਵੀਡੀਓ ਹਟਾ ਦਿੱਤੇ ਜਾਣਗੇ। \nਕੀ ਵਾਕਿਆ ਹੀ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਣਾ! ਵੇਖੇ ਹੋਏ ਵੀਡੀਓ ਹਟਾ ਦੇਈਏ\? ਵੇਖੇ ਹੋਏ ਨੂੰ ਹਟਾਓ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 3eee59c46..b7ea06024 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -522,7 +522,7 @@ To wideo jest objęte ograniczeniem wiekowym. \n \nWłącz „%1$s” w ustawieniach, jeśli chcesz je zobaczyć. - Tak, i częściowo obejrzane wideo + Tak, i częściowo obejrzane wideo Wideo, które zostały obejrzane przed i po dodaniu do playlisty, zostaną usunięte. \nCzy na pewno\? Tego nie da się cofnąć! Czy usunąć obejrzane wideo\? diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index a0ec8127e..08184fbb6 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -517,7 +517,7 @@ Este vídeo tem restrição de idade. \n \nAtive \"%1$s\" nas configurações se quiser vê-lo. - Sim, e vídeos parcialmente assistidos + Sim, e vídeos parcialmente assistidos Os vídeos que foram assistidos antes e depois de terem sidos adicionados à playlist serão removidos. \nTem certeza? Esta ação não pode ser desfeita! Remover vídeos assistidos? diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 1ec01b0d7..a204e1973 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -228,7 +228,7 @@ Limite de atualização da fonte OK Não foi possível atualizar a subscrição - Sim e também os vídeos parcialmente vistos + Sim e também os vídeos parcialmente vistos Ainda não há listas de reprodução favoritas %s ouvinte diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index da54067e7..b33f9a2d3 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -519,7 +519,7 @@ \nPara o poder ver, tem que ativar \"%1$s\" nas definições. Os vídeos que tenham sido vistos antes e depois de serem adicionados à lista de reprodução serão removidos. \nTem a certeza\? Esta ação não pode ser revertida! - Sim e também os vídeos parcialmente vistos + Sim e também os vídeos parcialmente vistos Remover vídeos visualizados\? Remover visualizados Os textos originais dos serviços serão visíveis nos itens do vídeo diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 1b7210e58..4a3ab8beb 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -432,7 +432,7 @@ %d de secunde Datorită constrângerilor ExoPlayer, durata de căutare a fost setată la %d secunde - Da, și videoclipuri vizionate parțial + Da, și videoclipuri vizionate parțial Videoclipurile care au fost vizionate înainte și după ce au fost adăugate la lista de redare vor fi eliminate. \nSunteți sigur\? Acest lucru nu poate fi anulat! Eliminați videoclipurile vizionate\? diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e3ca674a2..bb8042192 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -525,7 +525,7 @@ Исполнители Альбомы Удалить просмотренные - Да, и частично просмотренные + Да, и частично просмотренные Видео, просмотренные до или после добавления в плейлист, будут удалены. \nПродолжить\? Не может быть отменено! Удалить просмотренные видео\? diff --git a/app/src/main/res/values-ryu/strings.xml b/app/src/main/res/values-ryu/strings.xml index e9baa11da..fdd266f7a 100644 --- a/app/src/main/res/values-ryu/strings.xml +++ b/app/src/main/res/values-ryu/strings.xml @@ -509,7 +509,7 @@ \nいちらんさるいばあい、しっていから \"%1$s\" ゆーいるこうかしみそーれー。 プレイリストんかいちいからさりーるめーんちいからさったるあとぅんしちょうさんちゃーしがはプレイリストからさくじょさりやびーん。 \nゆたさいびーが?くぬあしっさーむとぅんかいむどぅしやびらん! - はい、ぶぶんてぃちーがしちょうさんちゃーしがんさちゅるじょさびーん + はい、ぶぶんてぃちーがしちょうさんちゃーしがんさちゅるじょさびーん しちょうじみぬちゃーしがさちゅるじょさびーが? しちょうじみさちゅるじょ サービスぬオリジナルぬテキストぬやーまほうあぬんかいひょうじさりやびーん diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index 717283e83..88e9cfca1 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -313,7 +313,7 @@ ᱧᱮᱞᱚᱜ ᱟᱠᱟᱱ ᱥᱟᱯᱲᱟᱣ ᱢᱮ ᱧᱮᱞ ᱟᱠᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱪᱷᱩᱴᱟᱹᱣ? ᱫᱩᱯᱞᱟᱹᱲ ᱠᱚ ᱦᱮᱡ ᱢᱮ - ᱭ, ᱟᱨ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱡᱟᱦᱟᱸ ᱞᱮᱠᱟ ᱧᱮᱞᱚᱜᱼᱟ + ᱭ, ᱟᱨ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱡᱟᱦᱟᱸ ᱞᱮᱠᱟ ᱧᱮᱞᱚᱜᱼᱟ ᱪᱟᱱᱮᱞ ᱜᱨᱩᱯ ᱯᱷᱤᱰ ᱢᱩᱪᱟᱹᱫ ᱵᱚᱫᱚᱞᱟᱠᱟᱱ: %s ᱵᱟᱝ ᱞᱚᱰ ᱟᱠᱟᱱᱟ: %d diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 091001ae6..099b3308d 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -284,7 +284,7 @@ %d segundu Pro more de sos lìmites de ExoPlayer sa longària de s\'iscostiamentu lestru est istada impostada a %d segundos - Eja, e fintzas sos vìdeos pompiados in parte + Eja, e fintzas sos vìdeos pompiados in parte Sos vìdeos pompiados in antis e a pustis de los àere annànghidos a s\'iscalita ant a èssere bogados. \n Seguru ses\? Custu no est reversìbile! Bogare sos elementos pompiados\? diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 601623cb1..49ffccb28 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -509,7 +509,7 @@ Tento obsah ešte nie je podporovaný v NwPipe. \n \nMožno v budúcnosti sa to zmení. - Áno aj čiastočne pozreté videá + Áno aj čiastočne pozreté videá Pozreté videá, ktoré ste pozreli pred a po ich pridaní do playlistu, budú odstránené. \nSte si istí ich odstránením z playlistu? Táto operácia je nezvratná! Odstrániť pozreté videá\? Odstrániť pozreté diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index 860a607f5..b972c104d 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -490,7 +490,7 @@ %d ilbiriqsi Ayadooy ugu wacantahay xayiraad xaga ExoPlayer-ka ah xadka dhaaf-dhaafinta waa %d ilbiriqsi - Haa, sidoo kale ku dar muuqaalada qayb laga daawaday + Haa, sidoo kale ku dar muuqaalada qayb laga daawaday Muuqaalada la daawaday kahor iyo kadib markii xulka lagu daray waa la saari doonaa. \nMa hubtaa\? Arrinkan dib looma soocelin karo! Saar muuqaalada la daawaday\? diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 4b9c2ac36..48bcb4bf1 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -506,7 +506,7 @@ Zgjidhni dosjen e shkarkimit për skedarët video Skedarët video të shkarkuara ruhen këtu Nuk u gjend lexues për stream (ju mund të instaloni VLC për ta lexuar). - Po, dhe videot e shikuara pjesërisht + Po, dhe videot e shikuara pjesërisht Videot që janë shikuar më parë dhe pasi janë shtuar në listën e luajtjes do të hiqen. \nA jeni të sigurt\? Kjo nuk mund të zhbëhet! Dëshironi t\'i hiqni videot e para\? diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 02711dac2..a1fc299c6 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -205,7 +205,7 @@ Приказ коментара Искључите да бисте сакрили коментаре Због ограничења ExoPlayer-а, премотавање је постављено на %d секунди - Да, и делимично одгледани видео снимци + Да, и делимично одгледани видео снимци Видео снимци који су одгледани пре и после додавања на плејлисту биће уклоњени. \nЈесте ли сигурни\? Ово се не може поништити! Уклонити одгледане видео снимке\? diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 7893eae19..f20044b65 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -473,7 +473,7 @@ %d sekunder På grund av ExoPlayer-begränsningar sattes söktiden till %d sekunder - Ja, och delvis tittade videor + Ja, och delvis tittade videor Videor som har spelats före och efter att de har lagts till i spellistan kommer att tas bort. \nÄr du säker\? Detta kan inte ångras! Ta bort tittade videor\? diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index f1d388393..b7534ccc0 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -509,7 +509,7 @@ ச்ட்ரீம்களைக் காட்டு/மறைக்க இந்த உள்ளடக்கம் உங்கள் நாட்டில் கிடைக்கவில்லை. திருப்பித் தரவும் - ஆம், மற்றும் ஓரளவு பார்த்த வீடியோக்கள் + ஆம், மற்றும் ஓரளவு பார்த்த வீடியோக்கள் கடைசியாக புதுப்பிக்கப்பட்டது: %s %s கேட்பவர் diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 947d0bcf9..6948fcc95 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -508,7 +508,7 @@ \nGörmek istiyorsanız ayarlarda \"%1$s\" seçeneğini açın. Oynatma listesine eklendikten önce ve sonra izlenen videolar kaldırılacak. \nEmin misiniz\? Bu geri döndürülemez! - Evet ve kısmen izlenmiş videolar + Evet ve kısmen izlenmiş videolar İzlenen videoları kaldır\? İzleneni kaldır Akış ögelerinde hizmetlerden alınan özgün metinler görünecektir diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 58e62c0d8..6c3624923 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -509,7 +509,7 @@ Не завантажено: %d Останнє оновлення: %s Через обмеження ExoPlayer точність перемотування становить %d секунд - Так, а також частково переглянуті відео + Так, а також частково переглянуті відео Відео, які Ви переглядали до та після додавання в добірку, вилучатимуться. \nВи впевнені\? Це незворотна дія! Видалити переглянуті відео\? diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 29dcb8c4d..f27f5a248 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -422,7 +422,7 @@ %d giây - Có, và video đã xem một phần + Có, và video đã xem một phần Những video đã xem trước và sau khi thêm vào danh sách phát sẽ bị loại bỏ. \nBạn có chắc không? Điều này không thể được hoàn tác! Xóa các video đã xem? diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 0a8c8a944..d42a0072a 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -500,7 +500,7 @@ 由 %s 由 %s 创建 频道的头像缩略图 - 是的,包括没看完的视频 + 是的,包括没看完的视频 已经看过且在之后被加入播放列表的视频将被删除。 \n您确定吗?操作不能被撤消! 移除看过的视频? diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 24f457c25..ee95d0751 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -538,7 +538,7 @@ 令個 app 閃退 顯示一則錯誤橫條 建立一則出現錯誤通知 - 好,包括埋睇過但未睇晒嘅影片 + 好,包括埋睇過但未睇晒嘅影片 礙於 ExoPlayer 所限,快轉長度經已改為 %d 秒 影片雜湊通知 排咗去隊尾 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 2ceb296b0..d69f4e5a8 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -479,7 +479,7 @@ 此影片設有年齡限制。 \n \n如果您想要觀看,請在設定中開啟「%1$s」。 - 是的,包括已部份觀看的影片 + 是的,包括已部份觀看的影片 已觀看過的影片在加入播放清單後將被移除。\n您確定嗎?此動作無法復原! 移除已觀看的影片? 移除已觀看的影片 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 147c88938..1a2a5b6f1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -667,13 +667,13 @@ App language System default Remove watched - Remove watched videos? + Remove watched streams? Remove duplicates Remove duplicates? Do you want to remove all duplicate streams in this playlist? - Videos that have been watched before and after being added to the playlist will be removed. -\nAre you sure\? This cannot be undone! - Yes, and partially watched videos + Streams that have been watched before and after being added to the playlist will be removed. +\nAre you sure\? + Remove partially watched streams Due to ExoPlayer constraints the seek duration was set to %d seconds From 8d9af62736d827386e2ad3463138652fc4569043 Mon Sep 17 00:00:00 2001 From: tobigr Date: Sun, 21 Dec 2025 21:25:04 +0100 Subject: [PATCH 171/190] Extract dialog creation into its own method --- .../local/playlist/LocalPlaylistFragment.java | 57 +++++++++++-------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 49bf5acfe..8e3a4cc4f 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.local.playlist; +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import static org.schabi.newpipe.error.ErrorUtil.showUiErrorSnackbar; import static org.schabi.newpipe.ktx.ViewUtils.animate; import static org.schabi.newpipe.local.playlist.ExportPlaylistKt.export; @@ -23,6 +25,7 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; +import android.widget.LinearLayout.LayoutParams; import android.widget.Toast; import androidx.annotation.NonNull; @@ -367,30 +370,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment - removeWatchedStreams(removePartiallyWatchedCheckbox.isChecked())) - .setNegativeButton(R.string.cancel, (d, id) -> d.cancel()) - .show(); + openRemoveWatchedConfirmationDialog(); } } else if (item.getItemId() == R.id.menu_item_remove_duplicates) { if (!isRewritingPlaylist) { @@ -908,6 +888,35 @@ public class LocalPlaylistFragment extends BaseLocalListFragment + removeWatchedStreams(removePartiallyWatchedCheckbox.isChecked())) + .setNegativeButton(R.string.cancel, (d, id) -> d.cancel()) + .show(); + } + public void setTabsPagerAdapter( @Nullable final MainFragment.SelectedTabsPagerAdapter tabsPagerAdapter) { this.tabsPagerAdapter = tabsPagerAdapter; From 817fccb7a361a5e52da261433661a182916da9bb Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 27 Jan 2026 21:59:52 +0100 Subject: [PATCH 172/190] Swap && to reduce computation --- .../schabi/newpipe/local/playlist/LocalPlaylistFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 8e3a4cc4f..cb38d9bae 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -457,8 +457,8 @@ public class LocalPlaylistFragment extends BaseLocalListFragment Date: Tue, 27 Jan 2026 23:44:20 +0100 Subject: [PATCH 173/190] Partial revert: fix VideoDetailFragment flickering This partially reverts commit 92a07a34456c5df560454a335f89ba677719c313, which was needed to fix ghost notifications. There I broke the "cycle" causing the useless notifications to popup in 2 different places (see points 3 and 4 of the commit description). However, breaking the cycle in point 4 ("`PlayerHolder::tryBindIfNeeded()` is now used to passively try to bind, instead of `PlayerHolder::startService()`" was not correct, for the following reason. I assumed that `ACTION_PLAYER_STARTED` was used for notifying that the player was instantiated anew, while it actually is used to notify that something is now ready for use: it could be the player, but it could also just be that the bottom sheet view was just added and thus the VideoDetailFragment needs to start the player. Therefore, when handling `ACTION_PLAYER_STARTED` it is correct to start the player service and not just try to bind to it. The other point in which I broke the cycle (point 3) should still prevent ghost notifications, although I could not test. --- .../newpipe/fragments/detail/VideoDetailFragment.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 9bffa149c..12920a8cb 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -1424,8 +1424,10 @@ public final class VideoDetailFragment bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } // Rebound to the service if it was closed via notification or mini player - playerHolder.setListener(VideoDetailFragment.this); - playerHolder.tryBindIfNeeded(context); + if (!playerHolder.isBound()) { + playerHolder.startService( + false, VideoDetailFragment.this); + } break; } } From dc160da034db46f949dd7a82c1607ccb3c36e202 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 28 Jan 2026 00:14:21 +0100 Subject: [PATCH 174/190] Allow reporting ContentNotAvailableException --- .../org/schabi/newpipe/error/ErrorInfo.kt | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt index 05f2b34a9..cd48fb298 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt @@ -299,9 +299,9 @@ class ErrorInfo private constructor( // indicates that it's important and is thus reportable null -> true - // the service explicitly said that content is not available (e.g. age restrictions, - // video deleted, etc.), there is no use in letting users report it - is ContentNotAvailableException -> false + // if the service explicitly said that content is not available (e.g. age + // restrictions, video deleted, etc.), there is no use in letting users report it + is ContentNotAvailableException -> !isContentSurelyNotAvailable(throwable) // we know the content is not supported, no need to let the user report it is ContentNotSupportedException -> false @@ -318,8 +318,8 @@ class ErrorInfo private constructor( fun isRetryable(throwable: Throwable?): Boolean { return when (throwable) { - // we know the content is not available, retrying won't help - is ContentNotAvailableException -> false + // if we know the content is surely not available, retrying won't help + is ContentNotAvailableException -> !isContentSurelyNotAvailable(throwable) // we know the content is not supported, retrying won't help is ContentNotSupportedException -> false @@ -329,5 +329,28 @@ class ErrorInfo private constructor( else -> true } } + + /** + * Unfortunately sometimes [ContentNotAvailableException] may not indicate that the content + * is blocked/deleted/paid, but may just indicate that we could not extract it. This is an + * inconsistency in the exceptions thrown by the extractor, but until it is fixed, this + * function will distinguish between the two types. + * @return `true` if the content is not available because of a limitation imposed by the + * service or the owner, `false` if the extractor could not extract info about it + */ + fun isContentSurelyNotAvailable(e: ContentNotAvailableException): Boolean { + return when (e) { + is AccountTerminatedException, + is AgeRestrictedContentException, + is GeographicRestrictionException, + is PaidContentException, + is PrivateContentException, + is SoundCloudGoPlusContentException, + is UnsupportedContentInCountryException, + is YoutubeMusicPremiumContentException -> true + + else -> false + } + } } } From 49e95d95a15abb021db79ce6f7b0514dbe22e6b2 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 28 Jan 2026 01:44:39 +0100 Subject: [PATCH 175/190] Revert "Remember and restore orientation on fullscreen exit" --- .../fragments/detail/VideoDetailFragment.java | 34 +++++++------------ 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 9bffa149c..a07e9c06e 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -206,8 +206,6 @@ public final class VideoDetailFragment int lastStableBottomSheetState = BottomSheetBehavior.STATE_EXPANDED; @State protected boolean autoPlayEnabled = true; - @State - protected int originalOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; @Nullable private StreamInfo currentInfo = null; @@ -1908,29 +1906,23 @@ public final class VideoDetailFragment @Override public void onScreenRotationButtonClicked() { - final Optional playerUi = player != null - ? player.UIs().get(MainPlayerUi.class) - : Optional.empty(); - if (playerUi.isEmpty()) { + // On Android TV screen rotation is not supported + // In tablet user experience will be better if screen will not be rotated + // from landscape to portrait every time. + // Just turn on fullscreen mode in landscape orientation + // or portrait & unlocked global orientation + final boolean isLandscape = DeviceUtils.isLandscape(requireContext()); + if (DeviceUtils.isTv(activity) || DeviceUtils.isTablet(activity) + && (!globalScreenOrientationLocked(activity) || isLandscape)) { + player.UIs().get(MainPlayerUi.class).ifPresent(MainPlayerUi::toggleFullscreen); return; } - // On tablets and TVs, just toggle fullscreen UI without orientation change. - if (DeviceUtils.isTablet(activity) || DeviceUtils.isTv(activity)) { - playerUi.get().toggleFullscreen(); - return; - } + final int newOrientation = isLandscape + ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + : ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE; - if (playerUi.get().isFullscreen()) { - // EXITING FULLSCREEN - playerUi.get().toggleFullscreen(); - activity.setRequestedOrientation(originalOrientation); - } else { - // ENTERING FULLSCREEN - originalOrientation = activity.getRequestedOrientation(); - playerUi.get().toggleFullscreen(); - activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); - } + activity.setRequestedOrientation(newOrientation); } /* From bffee48bcbedf190e628ccfd5edbb627c9ea3cc5 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Tue, 27 Jan 2026 11:14:30 +0100 Subject: [PATCH 176/190] Update NewPipeExtractor --- a.bisect | 25 +++++++++++++++++++++++++ gradle/libs.versions.toml | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 a.bisect diff --git a/a.bisect b/a.bisect new file mode 100644 index 000000000..f5227c22e --- /dev/null +++ b/a.bisect @@ -0,0 +1,25 @@ +git bisect start +# status: waiting for both good and bad commits +# good: [eb277fe14b87b35118cea41dc74fb8c2e2ba7b1c] Player/handleIntent: call handleIntentPost unconditionally +git bisect good eb277fe14b87b35118cea41dc74fb8c2e2ba7b1c +# status: waiting for bad commit, 1 good commit known +# bad: [d0f32b3842a37f79b27594d763cacd3d0f404b06] Merge pull request #12996 from whistlingwoods/reapply-local-list-header-fix-by-j-haldane +git bisect bad d0f32b3842a37f79b27594d763cacd3d0f404b06 +# bad: [c2f526d5b3137e291d269980f8c289e80ceb10a2] Use context.getString() shorthand instead of context.getResources().getString() +git bisect bad c2f526d5b3137e291d269980f8c289e80ceb10a2 +# bad: [c2f526d5b3137e291d269980f8c289e80ceb10a2] Use context.getString() shorthand instead of context.getResources().getString() +git bisect bad c2f526d5b3137e291d269980f8c289e80ceb10a2 +# good: [2fadaffb98d7599334e6ffe3080bac45d35472c9] Merge pull request #12765 from TransZAllen/build_error_into_NewPipeExtractor +git bisect good 2fadaffb98d7599334e6ffe3080bac45d35472c9 +# good: [2fadaffb98d7599334e6ffe3080bac45d35472c9] Merge pull request #12765 from TransZAllen/build_error_into_NewPipeExtractor +git bisect good 2fadaffb98d7599334e6ffe3080bac45d35472c9 +# good: [ffb82dc88c9e530757c98f4645a6b8a16d288d39] Merge pull request #12849 from TeamNewPipe/acraKSP +git bisect good ffb82dc88c9e530757c98f4645a6b8a16d288d39 +# good: [ffb82dc88c9e530757c98f4645a6b8a16d288d39] Merge pull request #12849 from TeamNewPipe/acraKSP +git bisect good ffb82dc88c9e530757c98f4645a6b8a16d288d39 +# bad: [f3876d1c4a7b2818600e96856ddaa40ad5045b5d] Translated using Weblate (Danish) +git bisect bad f3876d1c4a7b2818600e96856ddaa40ad5045b5d +# good: [40bc8c191e6120c92e91f72527a8ec9343b93cce] Merge pull request #12897 from TeamNewPipe/depUpdate +git bisect good 40bc8c191e6120c92e91f72527a8ec9343b93cce +# good: [40bc8c191e6120c92e91f72527a8ec9343b93cce] Merge pull request #12897 from TeamNewPipe/depUpdate +git bisect good 40bc8c191e6120c92e91f72527a8ec9343b93cce diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index be09de32d..5448848a2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -59,7 +59,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "v0.25.0" +teamnewpipe-newpipe-extractor = "v0.25.1" viewpager2 = "1.1.0" webkit = "1.14.0" # Newer versions require minSdk >= 23 work = "2.10.5" # Newer versions require minSdk >= 23 From 077f34c922703a62b4144f43e1a73d3f2096e543 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Sat, 5 Jul 2025 20:26:37 +0200 Subject: [PATCH 177/190] Add a YouTube DASH manifest parser to make live DASH manifests usable This is a hacky solution, a better one should be investigated and used. --- .../helper/YoutubeDashLiveManifestParser.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 app/src/main/java/org/schabi/newpipe/player/helper/YoutubeDashLiveManifestParser.java diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/YoutubeDashLiveManifestParser.java b/app/src/main/java/org/schabi/newpipe/player/helper/YoutubeDashLiveManifestParser.java new file mode 100644 index 000000000..00f5de071 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/helper/YoutubeDashLiveManifestParser.java @@ -0,0 +1,68 @@ +package org.schabi.newpipe.player.helper; + +import android.net.Uri; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.google.android.exoplayer2.source.dash.manifest.DashManifest; +import com.google.android.exoplayer2.source.dash.manifest.DashManifestParser; +import com.google.android.exoplayer2.source.dash.manifest.Period; +import com.google.android.exoplayer2.source.dash.manifest.ProgramInformation; +import com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement; +import com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement; + +import java.util.List; + +/** + * A {@link DashManifestParser} fixing YouTube DASH manifests to allow starting playback from the + * newest period available instead of the earliest one in some cases. + * + *

    + * It changes the {@code availabilityStartTime} passed to a custom value doing the workaround. + * A better approach to fix the issue should be investigated and used in the future. + *

    + */ +public class YoutubeDashLiveManifestParser extends DashManifestParser { + + // Result of Util.parseXsDateTime("1970-01-01T00:00:00Z") + private static final long AVAILABILITY_START_TIME_TO_USE = 0; + + // There is no computation made with the availabilityStartTime value in the + // parseMediaPresentationDescription method itself, so we can just override methods called in + // this method using the workaround value + // Overriding parsePeriod does not seem to be needed + + @SuppressWarnings("checkstyle:ParameterNumber") + @NonNull + @Override + protected DashManifest buildMediaPresentationDescription( + final long availabilityStartTime, + final long durationMs, + final long minBufferTimeMs, + final boolean dynamic, + final long minUpdateTimeMs, + final long timeShiftBufferDepthMs, + final long suggestedPresentationDelayMs, + final long publishTimeMs, + @Nullable final ProgramInformation programInformation, + @Nullable final UtcTimingElement utcTiming, + @Nullable final ServiceDescriptionElement serviceDescription, + @Nullable final Uri location, + @NonNull final List periods) { + return super.buildMediaPresentationDescription( + AVAILABILITY_START_TIME_TO_USE, + durationMs, + minBufferTimeMs, + dynamic, + minUpdateTimeMs, + timeShiftBufferDepthMs, + suggestedPresentationDelayMs, + publishTimeMs, + programInformation, + utcTiming, + serviceDescription, + location, + periods); + } +} From c670ad80ee563e670b274f7a3c137a318d176218 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Sat, 5 Jul 2025 20:33:37 +0200 Subject: [PATCH 178/190] Use DASH first instead of HLS and YouTube's DASH parser for lives --- .../newpipe/player/helper/PlayerDataSource.java | 7 +++++++ .../newpipe/player/resolver/PlaybackResolver.java | 13 +++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java index 0530d56e9..506b643fe 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java @@ -129,6 +129,13 @@ public class PlayerDataSource { getDefaultDashChunkSourceFactory(cachelessDataSourceFactory), cachelessDataSourceFactory); } + + public DashMediaSource.Factory getLiveYoutubeDashMediaSourceFactory() { + return new DashMediaSource.Factory( + getDefaultDashChunkSourceFactory(cachelessDataSourceFactory), + cachelessDataSourceFactory) + .setManifestParser(new YoutubeDashLiveManifestParser()); + } //endregion diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java index e204b8372..33a007597 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java @@ -201,12 +201,13 @@ public interface PlaybackResolver extends Resolver { try { final StreamInfoTag tag = StreamInfoTag.of(info); - if (!info.getHlsUrl().isEmpty()) { - return buildLiveMediaSource(dataSource, info.getHlsUrl(), C.CONTENT_TYPE_HLS, tag); - } else if (!info.getDashMpdUrl().isEmpty()) { + if (!info.getDashMpdUrl().isEmpty()) { return buildLiveMediaSource( dataSource, info.getDashMpdUrl(), C.CONTENT_TYPE_DASH, tag); } + if (!info.getHlsUrl().isEmpty()) { + return buildLiveMediaSource(dataSource, info.getHlsUrl(), C.CONTENT_TYPE_HLS, tag); + } } catch (final Exception e) { Log.w(TAG, "Error when generating live media source, falling back to standard sources", e); @@ -225,7 +226,11 @@ public interface PlaybackResolver extends Resolver { factory = dataSource.getLiveSsMediaSourceFactory(); break; case C.CONTENT_TYPE_DASH: - factory = dataSource.getLiveDashMediaSourceFactory(); + if (metadata.getServiceId() == ServiceList.YouTube.getServiceId()) { + factory = dataSource.getLiveYoutubeDashMediaSourceFactory(); + } else { + factory = dataSource.getLiveDashMediaSourceFactory(); + } break; case C.CONTENT_TYPE_HLS: factory = dataSource.getLiveHlsMediaSourceFactory(); From 0578e7fde077ed34a84942d14ddc53f7c5866ab7 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Sat, 5 Jul 2025 20:48:49 +0200 Subject: [PATCH 179/190] Rename useVideoSource to useVideoAndSubtitles in Player As both subtitles and video tracks are disabled in this method, the goal of this rename is to highlight disabling/enabled subtitles. --- .../main/java/org/schabi/newpipe/player/Player.java | 11 ++++++----- .../org/schabi/newpipe/player/ui/MainPlayerUi.java | 4 ++-- .../org/schabi/newpipe/player/ui/PopupPlayerUi.java | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 42f6cbf36..f3dfb0a91 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -2195,12 +2195,12 @@ public final class Player implements PlaybackListener, Listener { } } - public void useVideoSource(final boolean videoEnabled) { + public void useVideoAndSubtitles(final boolean videoAndSubtitlesEnabled) { if (playQueue == null || audioPlayerSelected()) { return; } - isAudioOnly = !videoEnabled; + isAudioOnly = !videoAndSubtitlesEnabled; getCurrentStreamInfo().ifPresentOrElse(info -> { // In case we don't know the source type, fall back to either video-with-audio, or @@ -2214,10 +2214,11 @@ public final class Player implements PlaybackListener, Listener { setRecovery(); - // Disable or enable video and subtitles renderers depending of the videoEnabled value + // Disable or enable video and subtitles renderers depending of the + // videoAndSubtitlesEnabled value trackSelector.setParameters(trackSelector.buildUponParameters() - .setTrackTypeDisabled(C.TRACK_TYPE_TEXT, !videoEnabled) - .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, !videoEnabled)); + .setTrackTypeDisabled(C.TRACK_TYPE_TEXT, !videoAndSubtitlesEnabled) + .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, !videoAndSubtitlesEnabled)); }, () -> { /* The current metadata may be null sometimes (for e.g. when using an unstable connection diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java index bfcc82984..b21a387a9 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java @@ -331,7 +331,7 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh } else if (VideoDetailFragment.ACTION_VIDEO_FRAGMENT_RESUMED.equals(intent.getAction())) { // Restore video source when user returns to the fragment fragmentIsVisible = true; - player.useVideoSource(true); + player.useVideoAndSubtitles(true); // When a user returns from background, the system UI will always be shown even if // controls are invisible: hide it in that case @@ -370,7 +370,7 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh if (player.isPlaying() || player.isLoading()) { switch (getMinimizeOnExitAction(context)) { case MINIMIZE_ON_EXIT_MODE_BACKGROUND: - player.useVideoSource(false); + player.useVideoAndSubtitles(false); break; case MINIMIZE_ON_EXIT_MODE_POPUP: getParentActivity().ifPresent(activity -> { diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java index 24b734fe0..10a982bf0 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java @@ -219,10 +219,10 @@ public final class PopupPlayerUi extends VideoPlayerUi { } else if (player.isPlaying() || player.isLoading()) { if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) { // Use only audio source when screen turns off while popup player is playing - player.useVideoSource(false); + player.useVideoAndSubtitles(false); } else if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) { // Restore video source when screen turns on and user was watching video in popup - player.useVideoSource(true); + player.useVideoAndSubtitles(true); } } } From 4648cac9c6bd28c75350ea4f28ab257a6ba8b199 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Thu, 4 Sep 2025 17:52:48 +0200 Subject: [PATCH 180/190] Allow changing video and text tracks state without stream info This allows disabling these track types when stream info has been not loaded while the ExoPlayer instance is. It is now possible to do so with the background player, in order to disable fetching video and text tracks for manifest sources, especially used for livestreams. Also set the recovery first before reloading play queue manager in the useVideoAndSubtitles method of the Player class. --- .../org/schabi/newpipe/player/Player.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index f3dfb0a91..ef3a8b0fe 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -2196,7 +2196,7 @@ public final class Player implements PlaybackListener, Listener { } public void useVideoAndSubtitles(final boolean videoAndSubtitlesEnabled) { - if (playQueue == null || audioPlayerSelected()) { + if (playQueue == null) { return; } @@ -2208,17 +2208,11 @@ public final class Player implements PlaybackListener, Listener { final SourceType sourceType = videoResolver.getStreamSourceType() .orElse(SourceType.VIDEO_WITH_AUDIO_OR_AUDIO_ONLY); + setRecovery(); + if (playQueueManagerReloadingNeeded(sourceType, info, getVideoRendererIndex())) { reloadPlayQueueManager(); } - - setRecovery(); - - // Disable or enable video and subtitles renderers depending of the - // videoAndSubtitlesEnabled value - trackSelector.setParameters(trackSelector.buildUponParameters() - .setTrackTypeDisabled(C.TRACK_TYPE_TEXT, !videoAndSubtitlesEnabled) - .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, !videoAndSubtitlesEnabled)); }, () -> { /* The current metadata may be null sometimes (for e.g. when using an unstable connection @@ -2227,9 +2221,15 @@ public final class Player implements PlaybackListener, Listener { Reload the play queue manager in this case, which is the behavior when we don't know the index of the video renderer or playQueueManagerReloadingNeeded returns true */ - reloadPlayQueueManager(); setRecovery(); + reloadPlayQueueManager(); }); + + // Disable or enable video and subtitles renderers depending of the + // videoAndSubtitlesEnabled value + trackSelector.setParameters(trackSelector.buildUponParameters() + .setTrackTypeDisabled(C.TRACK_TYPE_TEXT, !videoAndSubtitlesEnabled) + .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, !videoAndSubtitlesEnabled)); } /** From 1d8ea0181fc6a447153b0f1ffe4f27006bd1109a Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Thu, 4 Sep 2025 17:58:31 +0200 Subject: [PATCH 181/190] Disable fetching video and text tracks in background player This reduces data usage for manifest sources with demuxed audio and video, such as livestreams, for non-HLS sources only due to an ExoPlayer bug. --- .../org/schabi/newpipe/player/Player.java | 18 ++++++++++++ .../newpipe/player/ui/BackgroundPlayerUi.java | 29 +++++++++++++++++++ .../newpipe/player/ui/MainPlayerUi.java | 4 +++ .../newpipe/player/ui/PopupPlayerUi.java | 8 +++++ 4 files changed, 59 insertions(+) create mode 100644 app/src/main/java/org/schabi/newpipe/player/ui/BackgroundPlayerUi.java diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index ef3a8b0fe..b0858f2e3 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -114,6 +114,7 @@ import org.schabi.newpipe.player.playqueue.SinglePlayQueue; import org.schabi.newpipe.player.resolver.AudioPlaybackResolver; import org.schabi.newpipe.player.resolver.VideoPlaybackResolver; import org.schabi.newpipe.player.resolver.VideoPlaybackResolver.SourceType; +import org.schabi.newpipe.player.ui.BackgroundPlayerUi; import org.schabi.newpipe.player.ui.MainPlayerUi; import org.schabi.newpipe.player.ui.PlayerUi; import org.schabi.newpipe.player.ui.PlayerUiList; @@ -271,6 +272,7 @@ public final class Player implements PlaybackListener, Listener { @NonNull private final HistoryRecordManager recordManager; + private boolean screenOn = true; /*////////////////////////////////////////////////////////////////////////// // Constructor @@ -592,14 +594,17 @@ public final class Player implements PlaybackListener, Listener { switch (playerType) { case MAIN: UIs.destroyAll(PopupPlayerUi.class); + UIs.destroyAll(BackgroundPlayerUi.class); UIs.addAndPrepare(new MainPlayerUi(this, binding)); break; case POPUP: UIs.destroyAll(MainPlayerUi.class); + UIs.destroyAll(BackgroundPlayerUi.class); UIs.addAndPrepare(new PopupPlayerUi(this, binding)); break; case AUDIO: UIs.destroyAll(VideoPlayerUi.class); + UIs.addAndPrepare(new BackgroundPlayerUi(this)); break; } } @@ -842,6 +847,12 @@ public final class Player implements PlaybackListener, Listener { case ACTION_SHUFFLE: toggleShuffleModeEnabled(); break; + case Intent.ACTION_SCREEN_OFF: + screenOn = false; + break; + case Intent.ACTION_SCREEN_ON: + screenOn = true; + break; case Intent.ACTION_CONFIGURATION_CHANGED: if (DEBUG) { Log.d(TAG, "ACTION_CONFIGURATION_CHANGED received"); @@ -2462,4 +2473,11 @@ public final class Player implements PlaybackListener, Listener { .orElse(RENDERER_UNAVAILABLE); } //endregion + + /** + * @return whether the device screen is turned on. + */ + public boolean isScreenOn() { + return screenOn; + } } diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/BackgroundPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/BackgroundPlayerUi.java new file mode 100644 index 000000000..9530033d1 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/ui/BackgroundPlayerUi.java @@ -0,0 +1,29 @@ +package org.schabi.newpipe.player.ui; + +import androidx.annotation.NonNull; + +import org.schabi.newpipe.player.Player; + +/** + * This is not a real UI for the background player, it used to disable fetching video and text + * tracks with it. + * + *

    + * This allows reducing data usage for manifest sources with demuxed audio and video, + * such as livestreams. + *

    + */ +public class BackgroundPlayerUi extends PlayerUi { + + public BackgroundPlayerUi(@NonNull final Player player) { + super(player); + } + + @Override + public void initPlayback() { + super.initPlayback(); + + // Make sure to disable video and subtitles track types + player.useVideoAndSubtitles(false); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java index b21a387a9..868881782 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java @@ -216,6 +216,10 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh playQueueAdapter = new PlayQueueAdapter(context, Objects.requireNonNull(player.getPlayQueue())); segmentAdapter = new StreamSegmentAdapter(getStreamSegmentListener()); + + // Make sure video and text tracks are enabled if the user is in the app, in the case user + // switched from background player to main player + player.useVideoAndSubtitles(fragmentIsVisible); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java index 10a982bf0..b9c29c008 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java @@ -152,6 +152,14 @@ public final class PopupPlayerUi extends VideoPlayerUi { windowManager.addView(closeOverlayBinding.getRoot(), closeOverlayLayoutParams); } + @Override + public void initPlayback() { + super.initPlayback(); + // Make sure video and text tracks are enabled if the screen is turned on (which should + // always be the case), in the case user switched from background player to popup player + player.useVideoAndSubtitles(player.isScreenOn()); + } + @Override protected void setupElementsVisibility() { binding.fullScreenButton.setVisibility(View.VISIBLE); From 216867c597c46fc62ebee371b28545557c2984fd Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 28 Jan 2026 02:20:33 +0100 Subject: [PATCH 182/190] Address review comments --- app/src/main/java/org/schabi/newpipe/player/Player.java | 6 +++--- .../schabi/newpipe/player/resolver/PlaybackResolver.java | 2 ++ .../org/schabi/newpipe/player/ui/BackgroundPlayerUi.java | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index b0858f2e3..b70441d51 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -2219,7 +2219,7 @@ public final class Player implements PlaybackListener, Listener { final SourceType sourceType = videoResolver.getStreamSourceType() .orElse(SourceType.VIDEO_WITH_AUDIO_OR_AUDIO_ONLY); - setRecovery(); + setRecovery(); // making sure to save playback position before reloadPlayQueueManager() if (playQueueManagerReloadingNeeded(sourceType, info, getVideoRendererIndex())) { reloadPlayQueueManager(); @@ -2227,12 +2227,12 @@ public final class Player implements PlaybackListener, Listener { }, () -> { /* The current metadata may be null sometimes (for e.g. when using an unstable connection - in livestreams) so we will be not able to execute the block below + in livestreams) so we will be not able to execute the block above Reload the play queue manager in this case, which is the behavior when we don't know the index of the video renderer or playQueueManagerReloadingNeeded returns true */ - setRecovery(); + setRecovery(); // making sure to save playback position before reloadPlayQueueManager() reloadPlayQueueManager(); }); diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java index 33a007597..7dc80a958 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java @@ -201,6 +201,8 @@ public interface PlaybackResolver extends Resolver { try { final StreamInfoTag tag = StreamInfoTag.of(info); + // Prefer DASH over HLS because of an exoPlayer bug that causes the background player to + // also fetch the video stream even if it is supposed to just fetch the audio stream. if (!info.getDashMpdUrl().isEmpty()) { return buildLiveMediaSource( dataSource, info.getDashMpdUrl(), C.CONTENT_TYPE_DASH, tag); diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/BackgroundPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/BackgroundPlayerUi.java index 9530033d1..4172df35e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/BackgroundPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/BackgroundPlayerUi.java @@ -5,8 +5,8 @@ import androidx.annotation.NonNull; import org.schabi.newpipe.player.Player; /** - * This is not a real UI for the background player, it used to disable fetching video and text - * tracks with it. + * This is not a "graphical" UI for the background player, but it is used to disable fetching video + * and text tracks with it. * *

    * This allows reducing data usage for manifest sources with demuxed audio and video, From eb7351c858c389412a5f12373c94aa33e43d03e3 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 28 Jan 2026 02:20:58 +0100 Subject: [PATCH 183/190] Remove file committed by accident --- a.bisect | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 a.bisect diff --git a/a.bisect b/a.bisect deleted file mode 100644 index f5227c22e..000000000 --- a/a.bisect +++ /dev/null @@ -1,25 +0,0 @@ -git bisect start -# status: waiting for both good and bad commits -# good: [eb277fe14b87b35118cea41dc74fb8c2e2ba7b1c] Player/handleIntent: call handleIntentPost unconditionally -git bisect good eb277fe14b87b35118cea41dc74fb8c2e2ba7b1c -# status: waiting for bad commit, 1 good commit known -# bad: [d0f32b3842a37f79b27594d763cacd3d0f404b06] Merge pull request #12996 from whistlingwoods/reapply-local-list-header-fix-by-j-haldane -git bisect bad d0f32b3842a37f79b27594d763cacd3d0f404b06 -# bad: [c2f526d5b3137e291d269980f8c289e80ceb10a2] Use context.getString() shorthand instead of context.getResources().getString() -git bisect bad c2f526d5b3137e291d269980f8c289e80ceb10a2 -# bad: [c2f526d5b3137e291d269980f8c289e80ceb10a2] Use context.getString() shorthand instead of context.getResources().getString() -git bisect bad c2f526d5b3137e291d269980f8c289e80ceb10a2 -# good: [2fadaffb98d7599334e6ffe3080bac45d35472c9] Merge pull request #12765 from TransZAllen/build_error_into_NewPipeExtractor -git bisect good 2fadaffb98d7599334e6ffe3080bac45d35472c9 -# good: [2fadaffb98d7599334e6ffe3080bac45d35472c9] Merge pull request #12765 from TransZAllen/build_error_into_NewPipeExtractor -git bisect good 2fadaffb98d7599334e6ffe3080bac45d35472c9 -# good: [ffb82dc88c9e530757c98f4645a6b8a16d288d39] Merge pull request #12849 from TeamNewPipe/acraKSP -git bisect good ffb82dc88c9e530757c98f4645a6b8a16d288d39 -# good: [ffb82dc88c9e530757c98f4645a6b8a16d288d39] Merge pull request #12849 from TeamNewPipe/acraKSP -git bisect good ffb82dc88c9e530757c98f4645a6b8a16d288d39 -# bad: [f3876d1c4a7b2818600e96856ddaa40ad5045b5d] Translated using Weblate (Danish) -git bisect bad f3876d1c4a7b2818600e96856ddaa40ad5045b5d -# good: [40bc8c191e6120c92e91f72527a8ec9343b93cce] Merge pull request #12897 from TeamNewPipe/depUpdate -git bisect good 40bc8c191e6120c92e91f72527a8ec9343b93cce -# good: [40bc8c191e6120c92e91f72527a8ec9343b93cce] Merge pull request #12897 from TeamNewPipe/depUpdate -git bisect good 40bc8c191e6120c92e91f72527a8ec9343b93cce From c2723096ab88eae17c773b6e8f94161cc5fd03a3 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 28 Jan 2026 02:39:56 +0100 Subject: [PATCH 184/190] Avoid rebuilding BackgroundPlayerUi if already in place --- app/src/main/java/org/schabi/newpipe/player/Player.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index b70441d51..e18ead899 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -576,6 +576,7 @@ public final class Player implements PlaybackListener, Listener { private void initUIsForCurrentPlayerType() { if ((UIs.get(MainPlayerUi.class).isPresent() && playerType == PlayerType.MAIN) + || (UIs.get(BackgroundPlayerUi.class).isPresent() && playerType == PlayerType.AUDIO) || (UIs.get(PopupPlayerUi.class).isPresent() && playerType == PlayerType.POPUP)) { // correct UI already in place return; @@ -603,7 +604,7 @@ public final class Player implements PlaybackListener, Listener { UIs.addAndPrepare(new PopupPlayerUi(this, binding)); break; case AUDIO: - UIs.destroyAll(VideoPlayerUi.class); + UIs.destroyAll(VideoPlayerUi.class); // destroys both MainPlayerUi and PopupPlayerUi UIs.addAndPrepare(new BackgroundPlayerUi(this)); break; } From ee52b0854668bf864e38c208eb4a9782b169fe5a Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Wed, 28 Jan 2026 03:00:29 +0100 Subject: [PATCH 185/190] Translated using Weblate (Basque) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Latvian) Currently translated at 20.6% (18 of 87 strings) Translated using Weblate (Latvian) Currently translated at 96.9% (741 of 764 strings) Translated using Weblate (Vietnamese) Currently translated at 99.6% (761 of 764 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Thai) Currently translated at 37.3% (285 of 764 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (French) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Turkish) Currently translated at 33.3% (29 of 87 strings) Translated using Weblate (Spanish) Currently translated at 74.7% (65 of 87 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Lombard) Currently translated at 4.9% (38 of 764 strings) Translated using Weblate (Lombard) Currently translated at 2.2% (2 of 87 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Arabic) Currently translated at 97.7% (85 of 87 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Turkish) Currently translated at 33.3% (29 of 87 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Latvian) Currently translated at 95.8% (732 of 764 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Latvian) Currently translated at 95.8% (732 of 764 strings) Translated using Weblate (Latvian) Currently translated at 95.2% (728 of 764 strings) Translated using Weblate (Latvian) Currently translated at 95.2% (728 of 764 strings) Translated using Weblate (Latvian) Currently translated at 95.6% (731 of 764 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Basque) Currently translated at 100.0% (87 of 87 strings) Translated using Weblate (Basque) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Spanish) Currently translated at 74.7% (65 of 87 strings) Added translation using Weblate (Yiddish) Co-authored-by: AudricV Co-authored-by: CJ Montero Co-authored-by: Erenay Co-authored-by: Hasan Kara Co-authored-by: Hosted Weblate Co-authored-by: Igi 5216 Co-authored-by: Mohammed al-Qubati Co-authored-by: Nicolás Pérez Co-authored-by: TXRdev Archive Co-authored-by: Thadah D. Denyse Co-authored-by: ThaiWithNoBraincell Co-authored-by: What's news Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) Co-authored-by: 大王叫我来巡山 Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/es/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/eu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/lmo/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/lv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/tr/ Translation: NewPipe/Metadata --- app/src/main/res/values-eu/strings.xml | 452 +++++++++--------- app/src/main/res/values-fr/strings.xml | 42 +- app/src/main/res/values-ji/strings.xml | 3 + app/src/main/res/values-lmo/strings.xml | 35 ++ app/src/main/res/values-lv/strings.xml | 47 +- app/src/main/res/values-th/strings.xml | 1 + app/src/main/res/values-vi/strings.xml | 15 +- app/src/main/res/values-zh-rCN/strings.xml | 2 +- .../metadata/android/ar/changelogs/1006.txt | 16 + .../metadata/android/es/changelogs/1005.txt | 2 +- .../metadata/android/es/changelogs/1006.txt | 16 + .../metadata/android/eu/changelogs/1000.txt | 13 + .../metadata/android/eu/changelogs/1001.txt | 6 + .../metadata/android/eu/changelogs/1002.txt | 4 + .../metadata/android/eu/changelogs/1003.txt | 6 + .../metadata/android/eu/changelogs/1004.txt | 3 + .../metadata/android/eu/changelogs/1005.txt | 17 + .../metadata/android/eu/changelogs/1006.txt | 16 + .../metadata/android/eu/changelogs/66.txt | 22 + .../metadata/android/eu/changelogs/800.txt | 24 + .../metadata/android/eu/changelogs/810.txt | 19 + .../metadata/android/eu/changelogs/820.txt | 1 + .../metadata/android/eu/changelogs/830.txt | 1 + .../metadata/android/eu/changelogs/840.txt | 21 + .../metadata/android/eu/changelogs/850.txt | 1 + .../metadata/android/eu/changelogs/860.txt | 7 + .../metadata/android/eu/changelogs/870.txt | 2 + .../metadata/android/eu/changelogs/900.txt | 14 + .../metadata/android/eu/changelogs/920.txt | 9 + .../metadata/android/eu/changelogs/930.txt | 17 + .../metadata/android/eu/changelogs/940.txt | 16 + .../metadata/android/eu/changelogs/951.txt | 15 + .../metadata/android/eu/changelogs/952.txt | 7 + .../metadata/android/eu/changelogs/954.txt | 9 + .../metadata/android/eu/changelogs/963.txt | 1 + .../metadata/android/eu/changelogs/965.txt | 6 + .../metadata/android/eu/changelogs/966.txt | 14 + .../metadata/android/eu/changelogs/967.txt | 1 + .../metadata/android/eu/changelogs/968.txt | 7 + .../metadata/android/eu/changelogs/969.txt | 8 + .../metadata/android/eu/changelogs/970.txt | 10 + .../metadata/android/eu/changelogs/971.txt | 3 + .../metadata/android/eu/changelogs/972.txt | 12 + .../metadata/android/eu/changelogs/973.txt | 4 + .../metadata/android/eu/changelogs/974.txt | 5 + .../metadata/android/eu/changelogs/975.txt | 16 + .../metadata/android/eu/changelogs/976.txt | 10 + .../metadata/android/eu/changelogs/977.txt | 10 + .../metadata/android/eu/changelogs/978.txt | 1 + .../metadata/android/eu/changelogs/979.txt | 2 + .../metadata/android/eu/changelogs/980.txt | 13 + .../metadata/android/eu/changelogs/981.txt | 2 + .../metadata/android/eu/changelogs/982.txt | 1 + .../metadata/android/eu/changelogs/983.txt | 9 + .../metadata/android/eu/changelogs/984.txt | 7 + .../metadata/android/eu/changelogs/985.txt | 1 + .../metadata/android/eu/changelogs/986.txt | 16 + .../metadata/android/eu/changelogs/987.txt | 12 + .../metadata/android/eu/changelogs/991.txt | 13 + .../metadata/android/eu/changelogs/992.txt | 30 +- .../metadata/android/eu/changelogs/993.txt | 12 + .../metadata/android/eu/changelogs/994.txt | 15 + .../metadata/android/eu/changelogs/995.txt | 16 + .../metadata/android/eu/changelogs/996.txt | 2 + .../metadata/android/eu/changelogs/998.txt | 4 + .../metadata/android/eu/changelogs/999.txt | 12 + .../metadata/android/lmo/full_description.txt | 1 + .../android/lmo/short_description.txt | 1 + .../metadata/android/lv/changelogs/63.txt | 6 +- .../metadata/android/tr/changelogs/1006.txt | 19 + .../metadata/android/tr/changelogs/997.txt | 30 +- 71 files changed, 913 insertions(+), 300 deletions(-) create mode 100644 app/src/main/res/values-ji/strings.xml create mode 100644 fastlane/metadata/android/ar/changelogs/1006.txt create mode 100644 fastlane/metadata/android/es/changelogs/1006.txt create mode 100644 fastlane/metadata/android/eu/changelogs/1000.txt create mode 100644 fastlane/metadata/android/eu/changelogs/1001.txt create mode 100644 fastlane/metadata/android/eu/changelogs/1002.txt create mode 100644 fastlane/metadata/android/eu/changelogs/1003.txt create mode 100644 fastlane/metadata/android/eu/changelogs/1004.txt create mode 100644 fastlane/metadata/android/eu/changelogs/1005.txt create mode 100644 fastlane/metadata/android/eu/changelogs/1006.txt create mode 100644 fastlane/metadata/android/eu/changelogs/66.txt create mode 100644 fastlane/metadata/android/eu/changelogs/800.txt create mode 100644 fastlane/metadata/android/eu/changelogs/810.txt create mode 100644 fastlane/metadata/android/eu/changelogs/820.txt create mode 100644 fastlane/metadata/android/eu/changelogs/830.txt create mode 100644 fastlane/metadata/android/eu/changelogs/840.txt create mode 100644 fastlane/metadata/android/eu/changelogs/850.txt create mode 100644 fastlane/metadata/android/eu/changelogs/860.txt create mode 100644 fastlane/metadata/android/eu/changelogs/870.txt create mode 100644 fastlane/metadata/android/eu/changelogs/900.txt create mode 100644 fastlane/metadata/android/eu/changelogs/920.txt create mode 100644 fastlane/metadata/android/eu/changelogs/930.txt create mode 100644 fastlane/metadata/android/eu/changelogs/940.txt create mode 100644 fastlane/metadata/android/eu/changelogs/951.txt create mode 100644 fastlane/metadata/android/eu/changelogs/952.txt create mode 100644 fastlane/metadata/android/eu/changelogs/954.txt create mode 100644 fastlane/metadata/android/eu/changelogs/963.txt create mode 100644 fastlane/metadata/android/eu/changelogs/965.txt create mode 100644 fastlane/metadata/android/eu/changelogs/966.txt create mode 100644 fastlane/metadata/android/eu/changelogs/967.txt create mode 100644 fastlane/metadata/android/eu/changelogs/968.txt create mode 100644 fastlane/metadata/android/eu/changelogs/969.txt create mode 100644 fastlane/metadata/android/eu/changelogs/970.txt create mode 100644 fastlane/metadata/android/eu/changelogs/971.txt create mode 100644 fastlane/metadata/android/eu/changelogs/972.txt create mode 100644 fastlane/metadata/android/eu/changelogs/973.txt create mode 100644 fastlane/metadata/android/eu/changelogs/974.txt create mode 100644 fastlane/metadata/android/eu/changelogs/975.txt create mode 100644 fastlane/metadata/android/eu/changelogs/976.txt create mode 100644 fastlane/metadata/android/eu/changelogs/977.txt create mode 100644 fastlane/metadata/android/eu/changelogs/978.txt create mode 100644 fastlane/metadata/android/eu/changelogs/979.txt create mode 100644 fastlane/metadata/android/eu/changelogs/980.txt create mode 100644 fastlane/metadata/android/eu/changelogs/981.txt create mode 100644 fastlane/metadata/android/eu/changelogs/982.txt create mode 100644 fastlane/metadata/android/eu/changelogs/983.txt create mode 100644 fastlane/metadata/android/eu/changelogs/984.txt create mode 100644 fastlane/metadata/android/eu/changelogs/985.txt create mode 100644 fastlane/metadata/android/eu/changelogs/986.txt create mode 100644 fastlane/metadata/android/eu/changelogs/987.txt create mode 100644 fastlane/metadata/android/eu/changelogs/991.txt create mode 100644 fastlane/metadata/android/eu/changelogs/993.txt create mode 100644 fastlane/metadata/android/eu/changelogs/994.txt create mode 100644 fastlane/metadata/android/eu/changelogs/995.txt create mode 100644 fastlane/metadata/android/eu/changelogs/996.txt create mode 100644 fastlane/metadata/android/eu/changelogs/998.txt create mode 100644 fastlane/metadata/android/eu/changelogs/999.txt create mode 100644 fastlane/metadata/android/lmo/full_description.txt create mode 100644 fastlane/metadata/android/lmo/short_description.txt create mode 100644 fastlane/metadata/android/tr/changelogs/1006.txt diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 71e71b7e5..dc2fefa21 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -10,32 +10,32 @@ Ezarpenak Partekatu honekin Bideoak deskargatzeko karpeta - Deskargatutako bideoak hemen gordeko dira - Aukeratu bideoak deskargatzeko karpeta + Deskargatutako bideoak hemen gordetzen dira + Aukeratu bideo-fitxategien deskarga karpeta Lehenetsitako bereizmena - Jo Kodirekin + Erreproduzitu Kodi-rekin Falta den Kore aplikazioa instalatu nahi duzu? - Erakutsi \"Jo Kodirekin\" aukera - Erakutsi bideoa Kodi multimedia zentroarekin erreproduzitzeko aukera + Erakutsi «Erreproduzitu Kodi-rekin» aukera + Erakutsi bideoa Kodi multimedia zentroarekin erreproduzitzeko aukera bat Audioa Audio formatu lehenetsia Deskargatu Erakutsi \'hurrengo\' eta \'antzeko\' bideoak - URLak ez du euskarririk - Edukiaren hizkuntz lehenetsia + Ez da URLa onartzen + Edukiaren hizkuntza lehenetsia Bideoa eta audioa Erreproduzitu bideoa, iraupena: - Igotzailearen abatarraren iruditxoa - Ez dute gustoko - Gustoko dute + Igotzailearen abatarraren miniatura + Desatseginak + Atseginak Ez da igorpen-erreproduzigailurik aurkitu. VLC instalatu? \"%1$s\" esan nahi al zenuen\? - Erabili kanpo bideo-erreproduzigailua - Erabili kanpo audio-erreproduzigailua + Erabili kanpo bideo-erreproduzitzailea + Erabili kanpo audio-erreproduzitzailea Atzeko planoan erreproduzitzen Sakatu lupan hasteko. Audioa deskargatzeko karpeta - Aukeratu audio fitxategiak deskargatzeko karpeta + Aukeratu audio-fitxategien deskarga karpeta Deskargatutako audio fitxategiak hemen gordetzen dira Iluna Argia @@ -45,15 +45,15 @@ Bigarren planoa Laster-leihoa Laster-leihoaren lehenetsitako bereizmena - Erakutsi bereizmen altuagoak - Bakarrik gailu batzuk onartzen dituzte 2K/4K bideoak erreproduzitzea - Hobetsitako bideo-formatua + Erakutsi bereizmen handiagoak + Gailu batzuek soilik erreproduzitu ditzakete 2K/4K bideoak + Lehenetsitako bideo-formatua Gaia Beltza - Gogoratu laster-leihoaren tamaina eta posizioa + Gogoratu laster-leihoaren propietateak Gogoratu laster-leihoaren azken tamaina eta posizioa Bilaketa-iradokizunak - Bilatzean erakutsi beharreko iradokizunak aukeratu + Aukeratu bilaketak egitean erakutsiko diren iradokizunak Laster-leiho moduan erreproduzitzen Edukia Adinez mugatutako edukia erakutsi @@ -67,18 +67,18 @@ Bereizmen onena Errorea Sare-errorea - Ezin izan dira iruditxo guztiak deskargatu + Ezin izan dira miniatura guztiak kargatu Ezin izan da webgunea analizatu Edukia ez dago eskuragarri Ezin izan da deskargen menua ezarri - Aplikazioa/interfazea kraskatu da + Aplikazioa/EIa kraskatu da Hori ez litzateke gertatu behar. Eman honen berri e-posta bidez Barkatu, zerbait gaizki atera da. Salatu Informazioa: Zer gertatu da: - Zer:\\nEskaria:\\nEdukiaren hizkuntza:\\nEdukiaren herrialdea:\\nAplikazioaren hizkuntza:\\nZerbitzua:\\nGMT Ordua:\\nPaketea:\\nBertsioa:\\nSE bertsioa: + Zer:\\nEskaria:\\nEdukiaren hizkuntza:\\nEdukiaren herrialdea:\\nAplikazioaren hizkuntza:\\nZerbitzua:\\nDenbora-zigilua:\\nPaketea:\\nBertsioa:\\nSE bertsioa: Zure iruzkina (Ingelesez): Xehetasunak: Bideoa @@ -93,7 +93,7 @@ Hariak Errorea NewPipe deskargatzen - Ukitu xehetasunetarako + Sakatu xehetasunetarako Itxaron mesedez… Arbelera kopiatuta Ezarri deskargetarako karpeta bat ezarpenetan geroago @@ -101,17 +101,17 @@ \nlaster-leiho moduan irekitzeko reCAPTCHA erronka reCAPTCHA erronka eskatu da - NewPipe aplikazioari buruz - Hirugarrengoen lizentziak - © %1$s %2$s. %3$s + NewPipe-i buruz + Hirugarrenen lizentziak + © %1$s %2$s-(r)engatik, %3$s lizentziapean Honi buruz eta ohiko galderak Lizentziak Igorpen libre eta arinak Android-en. - Ikusi GitHub zerbitzarian - NewPipe Lizentzia - Ideiak, itzulpenak, diseinu aldaketak, kode garbiketak, kode aldaketa sakonak badituzu, laguntza beti da ongi etorria. Eginaz hobetzen da! + Ikusi GitHub-en + NewPipe-en lizentzia + Itzulpen, diseinu aldaketa, kode garbiketa edo kode aldaketa sakonak bezalako ideiak badituzu, laguntza beti da ongi etorria. Zenbat eta gehiago egin, orduan eta hobeto! Irakurri lizentzia - Hartu parte + Lagundu Harpidetu Harpidetuta Kanaletik harpidetza kenduta @@ -119,8 +119,8 @@ Ezin izan da harpidetza eguneratu Harpidetzak Zer dago berri - Jarraitu erreprodukzioa - Jarraitu etenaldiak eta gero (adib. telefono deiak) + Berrekin erreprodukzioa + Jarraitu erreproduzitzen etenaldien ostean (adib. telefono deiak) Deskargak Fitxategi-izenetan baimendutako karaktereak Karaktere baliogabeak balio honekin ordezkatzen dira @@ -128,15 +128,15 @@ Hizkiak eta zenbakiak Karaktere berezi gehienak Bilaketa historiala - Gorde bilaketak lokalki + Gorde bilaketa-kontsultak tokian Ikustaldien historiala Gorde ikusitako bideoen historiala NewPipe jakinarazpena - Erreproduzigailua + Erreproduzitzailea Portaera Historia eta cache-a Desegin - NewPipe erreproduzigailuaren jakinarazpenak + NewPipe erreproduzitzailearen jakinarazpenak Emaitzarik ez Kilkerrak besterik ez daude hemen Harpidedunik ez @@ -144,10 +144,10 @@ Harpidedun %s %s harpidedun - Ikustaldirik ez + Erreprodukziorik ez - ikustaldi %s - %s ikustaldi + Erreprodukzio %s + %s erreprodukzio Bideorik ez @@ -156,52 +156,52 @@ Historiala Historiala - Erakutsi \"mantendu eransteko\" aholkua - Erakutsi aholkua bigarren planoko eta popup botoia sakatzean bideoaren \"Xehetasunak:\" atalean + Erakutsi «Mantendu ilaran jartzeko » aholkua + Erakutsi aholkua bigarren planoko eta laster-leiho botoia sakatzean bideoaren «Xehetasunak: » atalean Lehenetsitako edukiaren herrialdea - Jo denak + Erreproduzitu denak [Ezezaguna] Aldatu bigarren planora Aldatu laster-leihora Aldatu nagusira Ezin izan da igorpen hau erreproduzitu - Erreproduzigailuaren errore berreskuraezina gertatu da - Erreproduzigailuaren erroretik berreskuratzen - Dohaintza - NewPipe zuri erabiltzaile esperientziarik onena ekartzeko haien denbora librea ematen duten boluntarioek garatzen dute. Emaiezu zerbait garatzaileei NewPipe kafe bat hartzen duten bitartean hobetu ahal izan dezaten. + Erreproduzitzailearen errore berreskuraezina gertatu da + Erreproduzitzailearen erroretik berreskuratzen + Egin dohaintza + NewPipe boluntarioek garatu dute, haien denbora librea erabiltzaile esperientzia onena eskaintzen emanez. Eman dohaintza garatzaileei NewPipe are hobea izan dadin kafe bat hartzen duten bitartean. Egin dohaintza Webgunea Bisitatu NewPipe webgunea informazio gehiagorako eta berriak irakurtzeko. - Elementu hau bilaketen historialetik ezabatu nahi duzu? + Elementu hau bilaketa-historiatik ezabatu nahi duzu? Orri nagusiko edukia Orri hutsa Kioskoaren orria - Kanal-orria + Kanalaren orria Hautatu kanal bat - Ez zara inolako kanalera harpidetu oraindik + Ez dago kanal harpidetzarik oraindik Hautatu kiosko bat Joerak - Lehen 50ak + 50 onenak Berria eta arrakastatsua Kendu Xehetasunak Audio ezarpenak Mantendu ilaran jartzeko Hasi erreproduzitzen bigarren planoan - Laster-leihoan erreproduzitzen hasi + Hasi erreproduzitzen laster-leihoan Ireki tiradera Itxi tiradera Ez da igorpen-erreproduzigailurik aurkitu (VLC instalatu dezakezu erreproduzitzeko). Beti Behin besterik ez - Kanpo erreproduzigailuek ez dituzte mota honetako estekak onartzen + Kanpo erreproduzitzaileek ez dituzte mota honetako estekak onartzen Ez da bideo-igorpenik aurkitu Ez da audio-igorpenik aurkitu - Bideo erreproduzigailua - Bigarren planoko erreproduzigailua - Laster-leiho erreproduzigailua + Bideo erreproduzitzailea + Atzeko planoko erreproduzitzailea + Laster-leiho erreproduzitzailea Informazioa eskuratzen… - Kargatzen eskatutako edukia + Eskatutako edukia kargatzen Deskargatu igorpen-fitxategia Erakutsi informazioa Gogoko erreprodukzio-zerrendak @@ -211,54 +211,54 @@ Ezabatu cacheko metadatuak Kendu cachetik webguneen datu guztiak Metadatuen cachea ezabatuta - Gehitu automatikoki hurrengo igorpena ilarara - Gehitu ilararen amaieran lotutako igorpen bat errepikatu gabe + Jarri ilaran hurrengo igorpena automatikoki + Jarraitu erreprodukzioa errepikatu gabe, erlazionatutako igorpen bat gehituz Arazketa Fitxategia Inportatu datu-basea Esportatu datu-basea Zure uneko historiala, harpidetzak eta (aukeran) ezarpenak gainidazten ditu Esportatu historiala, harpidetzak, erreprodukzio-zerrendak eta ezarpenak - Garbitu ikusitakoaren historiala + Garbitu erreprodukzio-historia Erreproduzitutako igorpen-historia eta erreprodukzio-kokapenak ezabatzen ditu - Ezabatu ikusitakoaren historia osoa\? - Ikusitakoaren historiala ezabatuta - Garbitu bilaketa historiala - Ezabatu bilaketa gakoen historiala - Ezabatu bilaketen historia osoa\? - Bilaketen historiala ezabatuta - Karpeta baliogabea - Fitxategi edo edukiaren iturri baliogabea + Ezabatu erreprodukzio-historia osoa? + Erreprodukzio-historia ezabatuta + Garbitu bilaketa-historia + Bilaketa-gakoen historia ezabatzen du + Ezabatu bilaketa-historia osoa? + Bilaketa-historia ezabatuta + Karpeta ez da existitzen + Fitxategi/edukiaren iturria ez da existitzen Fitxategia ez dago edo ez dago baimenik irakurri edo idazteko - Fitxategi izena ezin da hutsik egon + Fitxategi-izena ezin da hutsik egon Errore bat gertatu da: %1$s Ez dago igorpenik eskuragarri deskargatzeko Arrastatu ordena aldatzeko Sortu Baztertu - Aldatu izena + Berrizendatu Elementu 1 ezabatuta. - Jotako azkena - Ikusiena + Erreproduzitutako azkena + Gehien erreproduzitutakoa Esportatuta Inportatuta Ez da baliozko ZIP fitxategia - Ebisua: Ezin izan dira fitxategi guztiak inportatu. - Honek oraingo ezarpenak gainidatziko ditu. - \'Ireki\' ekintza hobetsia + Abisua: Ezin izan dira fitxategi guztiak inportatu. + Honek zure uneko konfigurazioa gainidatziko du. + «Ireki» ekintza hobetsia Lehenetsitako ekintza edukia irekitzean — %s Galdetu beti Erreprodukzio-zerrenda berria - Aldatu izena + Berrizendatu Izena Gehitu erreprodukzio-zerrendara - Ezarri erreprodukzio-zerrendaren iruditxo gisa - Gogoko erreprodukzio-zerrenda - Kendu gogokoa - Erreprodukzio zerrenda hau ezabatu\? + Ezarri erreprodukzio-zerrendaren miniatura gisa + Laster-markatu erreprodukzio-zerrenda + Kendu laster-marka + Erreprodukzio-zerrenda hau ezabatu? Erreprodukzio-zerrenda sortuta Zerrendara gehitua - Erreprodukzio zerrendaren iruditxoa aldatuta. + Erreprodukzio zerrendaren miniatura aldatuta. Azpititulurik ez Doitu Bete @@ -277,21 +277,8 @@ Aurreko esportazioa Ezin izan dira harpidetzak inportatu Ezin izan dira harpidetzak esportatu - Inportatu YouTube harpidetzak Google takeoutetik: -\n -\n1. Joan URL honetara: %1$s -\n2. Hasi saioa eskatzen zaizunean -\n3. Hautatu \"Datu guztiak barne\", gero \"Kendu hautapen guztiak\", eta hautatu \"harpidetzak\" soilik eta egin klik \"Ados\" botoian -\n4. Egin klik \"Hurrengo pausua\"-n eta \"Sortu esportazioa\" -\n5. Egin klik \"Deskargatu\" botoian agertzen denean -\n6. Egin klik INPORTATU FITXATEGIA botoian eta hautatu deskargatutako zip fitxategia -\n7. [.zip inportazioak huts egiten badu] Erauzi .csv fitxategia deskargatutako takeout zip-etik (normalean \"Youtube eta Youtube Music/harpidetzak/harpidetzak.csv\"), egin klik INPORTATU FITXATEGIA botoian eta hautatu erauzitako csv fitxategia - Inportatu SoundCloud profila URL-a edo zure ID-a idatziz: -\n -\n1. Gaitu \"mahaigain modua\" web nabigatzailean (gunea ez dabil mugikorretan) -\n2. Joan URL honetara: %1$s -\n3. Hasi saioa eskatzen zaizunean -\n4. Kopiatu profilaren URL-a eraman zaizun orritik. + Inportatu YouTube harpidetzak Google takeout-etik: \n \n1. Joan URL honetara: %1$s \n2. Hasi saioa eskatzen zaizunean \n3. Hautatu «Datu guztiak barne», gero «Kendu hautapen guztiak», eta hautatu «harpidetzak» soilik eta egin klik «Ados» botoian \n4. Egin klik «Hurrengo pausua» eta «Sortu esportazioa» botoietan \n5. Egin klik «Deskargatu» botoian agertzen denean \n6. Egin klik INPORTATU FITXATEGIA botoian eta hautatu deskargatutako .zip fitxategia \n7. [.zip inportazioak huts egiten badu] Erauzi .csv fitxategia deskargatutako takeout zip-etik (normalean «Youtube eta Youtube Music/harpidetzak/harpidetzak.csv»), egin klik INPORTATU FITXATEGIA botoian eta hautatu erauzitako csv fitxategia + Inportatu SoundCloud profila URL-a edo zure ID-a idatziz: \n \n1. Gaitu «mahaigain modua» web nabigatzailean (gunea ez dabil mugikorretan) \n2. Joan URL honetara: %1$s \n3. Hasi saioa eskatzen zaizunean \n4. Kopiatu profilaren URL-a eraman zaizun orritik. zureID,soundcloud.com/zureid Eragiketa honek sarearen erabilera handia egin lezake. \n @@ -299,17 +286,15 @@ Erreprodukzio-abiaduraren kontrolak Tempoa Tonua - Desaktibatu (distortsioa sor lezake) + Desgaitu (distortsioa sor lezake) Ezarpenak ere inportatu nahi dituzu? - Bilaketa ez zehatzak posizioak azkarrago baina prezisio gutxiagoz bilatzea ahalbidetzen du. 5, 15 edo 25 segundo bilatzea ez du honekin funtzionatzen - NewPipe Software Librea eta Copyleft da: Erabili, ikertu, partekatu eta hobetu dezakezu. Zehazki, elkarbanatzea eta aldatzea Free Software Foundation-ek argitaratutako GNU General Public License-ren 3. bertsioa edo berriagoren baten terminoen arabera egiteko baimena duzu. + Bilaketa ez zehatzak erreproduzitzaileari posizioak azkarrago baina zehaztasun txikiagoarekin bilatzea ahalbidetzen dio. 5, 15 edo 25 segundoz bilatzea ez du honekin funtzionatzen + NewPipe copyleft software librea da: nahi duzunean erabili, aztertu, partekatu eta hobetu dezakezu. Zehazki, GNU Lizentzia Publiko Orokorraren baldintzen arabera birbanatu eta/edo aldatu dezakezu, Free Software Foundation-ek argitaratutako moduan, Lizentziaren 3. bertsioan edo (zure aukeran) ondorengo edozein bertsiotan. Behartu aktibitatearen bizitza ziklotik kanpo baztertu eta gero entregatu ezin diren Rx salbuespenen inguruko txostena - NewPipe pribatutasun politika - NewPipe proiektuak aintzat hartzen du zure pribatutasuna. Aplikazioak ez du zure baimenik gabe daturik jasotzen. -\nNewPipe pribatutasun politikak azaltzen du zehazki bidali eta gordetako informazioa zein den kraskatze txosten bat bidaltzen duzunean. + NewPipe-en pribatutasun politika + NewPipe proiektuak aintzat hartzen du zure pribatutasuna. Aplikazioak ez du zure baimenik gabe daturik jasotzen. \nNewPipe-en pribatutasun politikak zehazki azaltzen du zer datu bidali eta gordetzen den kraskatze txosten bat bidaltzen duzunean. Irakurri pribatutasun politika - Datuak Babesteko Araudi Orokorra (GDPR) betetzeko, NewPipe-en pribatutasun politika kontuan hartzera gonbidatzen zaitugu. Mesedez, irakurri kontu handiz. -\nAkats txosten bat bidali ahal izateko onartu behar duzu. + Europako Datuak Babesteko Erregelamendu Orokorra (GDPR) betetzeko, NewPipe-ren pribatutasun-politikaren berri ematen dizugu. Mesedez, irakurri arretaz. \nAkatsen txostena bidaltzeko onartu behar duzu. Onartu Ukatu Mugagabea @@ -318,31 +303,31 @@ Urratsa Leheneratu Minimizatu app-a aldatzean - Ekintza bideo erreproduzigailu nagusitik beste app batera aldatzean — %s + Ekintza bideo-erreproduzitzaile nagusitik beste aplikazio batera aldatzean — %s Bat ere ez - Minimizatu bigarren planoko erreproduzigailura - Minimizatu laster-leiho erreproduzigailura + Minimizatu bigarren planoko erreproduzitzailera + Minimizatu laster-leiho erreproduzitzailera Kanalak Erreprodukzio-zerrendak Pistak Erabiltzaileak Kendu harpidetza - Hautatu fitxa + Aukeratu fitxa Eguneraketak Gertaerak - Fitxategia ezabatu da + Fitxategia ezabatuta Aplikazioaren eguneraketen jakinarazpena NewPipe aplikazioaren bertsio berrien jakinarazpena - Kanpo biltegiratzea ez dago eskuragarri + Kanpoko biltegiratzea ez dago eskuragarri Ezin da SD txartel batera deskargatu. Deskargen karpeta berrezarri nahi duzu\? - Ezin izan dira gordetako fitxak irakurri, lehenetsitako fitxak erabiltzen + Ezin izan dira gordetako fitxak irakurri, lehenetsitakoak erabiltzen Berrezarri lehenetsitakoak - Lehenetsiak berrezarri nahi dituzu\? + Lehenetsitako balioak berrezarri nahi dituzu? Harpidedun kopurua ez dago eskuragarri Orri nagusian ikusiko diren fitxak Konferentziak Eguneraketak - Erakutsi jakinarazpena aplikazioa eguneratzea eskatuz bertsio berria eskuragarri dagoenean + Erakutsi jakinarazpena bertsio berri bat eskuragarri dagoenean aplikazioaren eguneratzea eskatzeko Zerrenda ikuspegi modua Zerrenda Sareta @@ -352,11 +337,11 @@ Zain pausatuta ilaran - post-prozesua - Enkargatu - Ekintza sistemak ukatu du + post-prozesamendua + Ilaran jarri + Sistemak ekintza ukatu du Deskargak huts egin du - Sortu izen bakana + Sortu izen bakarra Gainidatzi Badago izen bera duen deskargatutako fitxategi bat Badago izen bera duen deskarga bat abian @@ -365,17 +350,17 @@ Ezin da helburu karpeta sortu Ezin izan da konexio seguru bat ezarri Ezin izan da zerbitzaria aurkitu - Ezin da zerbitzariarekin konektatu + Ezin da zerbitzariara konektatu Zerbitzariak ez du daturik bidaltzen Zerbitzariak ez ditu hainbat hariko deskargak onartzen, saiatu @string/msg_threads = 1 erabilita - Ez aurkitua - Post-prozesuak huts egin du + Ez da aurkitu + Post-prozesamenduak huts egin du Gelditu Gehienezko saiakerak - Deskarga ezeztatu aurretik saiatu beharreko aldi kopurua + Deskarga utzi aurretik saiatu beharreko aldi kopurua Eten sare neurtuetan Erabilgarria datu mugikorretara aldatzean, hala ere deskarga batzuk ezin dira pausatu - Konexioaren denbora muga + Konexioaren denbora-muga Erakutsi iruzkinak Desgaitu iruzkinak ezkutatzeko Erreprodukzio automatikoa @@ -387,17 +372,17 @@ Posizioak zerrendetan Erakutsi erreprodukzio-posizioen adierazleak zerrendetan Garbitu datuak - Erreprodukzio-posizioak ezabatuta + Erreprodukzio-kokapenak ezabatuta Fitxategia lekuz aldatu edo ezabatu da Badago izen bereko fitxategi bat - Ezin da fitxategia gainidatzi - Badago izen bereko deskarga bat burutzeke + ezin da fitxategia gainidatzi + Badago izen bereko deskarga bat zain NewPipe itxi egin da fitxategian lanean zegoela Ez dago lekurik gailuan - Progresioa galdu da, fitxategia ezabatu delako - Zure deskargen historiala garbitu nahi duzu ala deskargatutako fitxategi guztiak ezabatu\? + Aurrerapena galdu da, fitxategia ezabatu delako + Zure deskargen historia garbitu nahi duzu ala deskargatutako fitxategi guztiak ezabatu? Mugatu deskargen ilara - Deskarga bakarra aldi berean + Deskarga bakarra soilik onartuko da aldi berean Hasi deskargak Pausatu deskargak Galdetu non deskargatu @@ -405,21 +390,21 @@ \nGaitu sistemaren karpeta hautatzailea (SAF) kanpoko SD txartel batera deskargatu nahi baduzu Ez dago inor ikusten - ikusle %s + Ikusle %s %s ikusle Ez dago inor entzuten - entzule %s + Entzule %s %s entzule Erabili sistemaren karpeta hautatzailea (SAF) \'Biltegiaren Sarrera Framework\'ak kanpoko SD txartel betera deskargatzea ahalbidetzen du - Ezabatu erreprodukziorako kokapenak - Erreprodukziorako kokapen guztiak ezabatzen ditu - Ezabatu erreprodukziorako kokapen guztiak\? + Ezabatu erreprodukzio-kokapenak + Erreprodukzio-kokapen guztiak ezabatzen ditu + Ezabatu erreprodukzio-kokapen guztiak? Aktibatu zerbitzua, orain hautatua: - Kiosko Lehenetsia + Kiosko lehenetsia Aurreratze/atzeratze bilaketaren iraupena PeerTube instantziak Hautatu zure gogoko PeerTube instantziak @@ -427,26 +412,26 @@ Gehitu instantzia Sartu instantziaren URLa Ezin izan da instantzia balioztatu - HTTPS URLak onartzen dira soilik + HTTPS URLak soilik onartzen dira Instantzia badago aurretik - Lokala + Tokikoa Berriki gehitua Gogokoenak Automatikoki sortua (igotzailea ez da aurkitu) berreskuratzen Ezin da deskarga hau berreskuratu - Aukeratu instantzia - Garbitu deskargen historiala + Aukeratu instantzia bat + Garbitu deskargen historia Ezabatu deskargatutako fitxategiak Baimena eman beste aplikazioen gainetik erakusteko Aplikazioaren hizkuntza Sistemaren lehenetsia - Sakatu \"Egina\" konponduta dagoenean - Egina + Sakatu «Eginda» konponduta dagoenean + Eginda Bideoak - segundu %d - %d segundu + segundo %d + %d segundo ExoPlayer-en mugak direla eta bilaketaren iraupena %d segundotan ezarri da Jarioaren karga motelegia dela uste duzu\? Hala bada, saiatu karga azkarra gaitzen (ezarpenetan edo beheko botoia sakatzen aldatu dezakezu). @@ -462,7 +447,7 @@ \nBeraz aukerak zure nahietara murrizten dira: abiadura edo informazio zehatza. Desgaitu modu azkarra Gaitu modu azkarra - Zenbait zerbitzuetan eskuragarri, normalean askoz azkarragoa da, baina elementu kopuru mugatua eta osatu gabeko informazioa itzuli dezake (adib. iraupenik ez, elementu mota, zuzeneko egoera) + Zerbitzu batzuetan eskuragarri, normalean askoz azkarragoa da, baina elementu kopuru mugatu eta osatu gabeko informazioa itzuli dezake (adib. iraupenik ez, elementu mota, zuzeneko egoerarik ez) Eskuratu jario dedikatutik eskuragarri dagoenean Eguneratu beti Pasatzen den denbora harpidetza bat zaharkituta dagoela kontuan hartzen den arte — %s @@ -473,15 +458,15 @@ Talde izena hutsik %d hautatuta - %d hautatutak + %d hautatuta - Ez da harpidetzarik aukeratu + Ez da harpidetzarik hautatu Hautatu harpidetzak Jarioa prozesatzen… Jarioa kargatzen… Kargatu gabe: %d - Jarioa azkenik eguneratuta: %s - Kanal taldeak + Jarioaren azken eguneraketa: %s + Kanal-taldeak egun %d %d egun @@ -494,68 +479,63 @@ minutu %d %d minutu - Aktibatu audioa + Gaitu audioa Isilarazi - Eduki hau ez dago oraindik NewPipengatik onatuta. -\n -\nEtorkizuneko bertsio batean onartua izatea espero da. + Eduki hau ez dago oraindik NewPiperengatik onartuta. \n \nEtorkizuneko bertsio batean onartua izatea espero da. ∞ bideo 100 bideo baino gehiago Artistak Albumak Abestiak - Bideo hau adinez mugatua dago. -\n -\nIkusi nahi baduzu, piztu ezazu \"%1$s\" ezarpenetan. + Bideo hau adinez mugatua dago. \n \nIkusi nahi baduzu, gaitu ezazu \"%1$s\" ezarpenetan. Egilea: %s - Erreprodukzio zerrendaren orria - %s-k sortua - Kanalaren avatar-earen miniatura - Erakutsi agrupatuta ez dauden harpidetzak bakarrik + Erreprodukzio-zerrendaren orria + %s-(e)k sortuta + Kanalaren avatarraren miniatura + Erakutsi taldekatuta ez dauden harpidetzak soilik Bai, partzialki ikusitako bideoak ere bai - Jada ikusi eta gero erreprodukzio zerrendara gehitu diren bideoak ezabatuak izango dira. -\nJarraitu nahi duzu\? Ekintza hau ezin da desegin! - Ikusitako bideoak ezabatu\? - Ikusitako bideoak ezabatu + Dagoeneko ikusi eta gero erreprodukzio-zerrendara gehitu diren bideoak kendu egingo dira. \nJarraitu nahi duzu? Ekintza hau ezin da desegin! + Ikusitako bideoak kendu? + Kendu ikusitako bideoak Inoiz ez - Bakarrik WiFi-arekin + WiFi-arekin soilik Erreprodukzioa automatikoki hasi — %s Erakutsi memoria galerak - Ilara erreproduzitu + Erreproduzitu ilara Oraindik ez dago erreprodukzio-zerrenda laster-markarik - Playlist bat aukeratu - Mesedez, egiaztatu jada zure arazoarekin diskusiorik sortuta badagoen. Sarrera duplikatuak daudenean, arazoa ebazteko erabili dezakegun denbora galtzen ari gara. - Formatodun erreportea kopiatu - GitHub-en erreportatu - reCAPTCHA bat egiten duzunean NewPipe-k gordetzen dituen kookiak ezabatu + Hautatu erreprodukzio-zerrenda bat + Mesedez, egiaztatu dagoeneko zure arazoarekin eztabaidarik sortuta badagoen. Sarrera duplikatuak daudenean, arazoa ebazteko erabili dezakegun denbora galtzen ari gara. + Formatodun txostena kopiatu + Eman berri GitHub-en + Garbitu NewPipe-k gordetzen dituen cookieak reCAPTCHA bat ebazten duzunean reCAPTCHA kookiak garbitu dira Ezabatu reCAPTCHA-ren kookiak Adinez mugatuta dagoen eta haurrentzako desegokia izan daitezkeen edukia erakutsi (+18 adibidez) - YouTube-ren \"Modu Murriztua\" helduentzako edukia izan daitekeen edukia ezkutatzen du - Piztu YouTube-ren \"Modu Murriztua\" + YouTube-ren «Modu mugatua» helduentzako edukia izan daitekeen edukia ezkutatzen du + Gaitu YouTube-ren «Modu mugatua» Ezin izan da URL-a ezagutu. Beste aplikazio batekin ireki\? - Auto-ilara - Erreprodukzio ilara aktiboa ordezkatuko da + Auto-ilaratzea + Erreprodukzio-ilara aktiboa ordezkatuko da Erreproduzitzaile batetik beste batera aldatzeak ilara ordezkatu dezake - Konfirmazioa eskatu ilaratik ezabatu baino lehenago + Eskatu berrespena ilara bat garbitu baino lehenago Ezer ez Buferreratzen - Aleatorio - Gehienez hiru ekintza aukera ditzakezu jakinarazpenean erakusteko! + Nahastu + Gehienez hiru ekintza aukera ditzakezu jakinarazpen trinkoan erakusteko! Errepikatu Bostgarren ekintzaren botoia Laugarren ekintzaren botoia Hirugarren ekintzaren botoia Bigarren ekintzaren botoia Lehenego ekintzaren botoia - Ebaki jakinarazpenetan erakusten den bideo miniaturaren formatu-ratioa 16:9tik 1:1era - Miniatura 1:1 formatu-ratiora ebaki + Ebaki jakinarazpenetan erakusten den bideo miniaturaren itxura-erlazioa 16:9tik 1:1era + Miniatura 1:1 itxura-erlaziora ebaki %s bilaketaren erantzunak erakusten Ilaran jarri da Jarri ilaran Zerbitzuen jatorrizko testuak igorpenaren elementuetan ikusgai egongo dira Erakutsi «orain dela» jatorrizko denbora elementuetan - Editatu beheko jakinarazpen ekintza bakoitza gainean sakatuz. Hautatu horietako hiru gehienez jakinarazpen trinkoan erakusteko eskuineko kontrol laukiak erabiliz. + Editatu beheko jakinarazpen-ekintza bakoitza sakatuz. Hautatu horietako hiru gehienez jakinarazpen trinkoan erakusteko, eskuineko kontrol-laukiak erabiliz. Androidek miniaturako kolore nagusiaren arabera jakinarazpenaren kolorea pertsonalizatzea baimendu (kontuan izan ez dagoela gailu guztietan erabilgarri) Koloreztatu jakinarazpena Erabili miniatura blokeo pantaila eta jakinarazpenentzako @@ -564,20 +544,20 @@ Bideo hash jakinarazpena Hash-a kalkulatzen Azkenak - Desgaitu igorpen-sortzailearen informazio gehigarria, igorpenaren edukia edo bilaketa-eskaera duten metadatuen informazio-koadroak ezkutatzeko + Desgaitu igorpenaren sortzaileari, eduki edo bilaketa-eskaera bati buruzko meta informazio-koadroak ezkutatzeko Erakutsi meta informazioa Ez dago zure gailuan hau ireki dezakeen aplikaziorik Kapituluak Deskribapena - Erlazionatutako jarioak + Erlazionatutako elementuak Iruzkinak - Desaktibatu bideoaren deskribapena eta informazio gehigarria ezkutatzeko + Desgaitu bideoaren deskribapen eta informazio gehigarria ezkutatzeko Erakutsi deskribapena Ireki honekin Irratia Nabarmenduak - Eduki hau ordaindu duten erabiltzaileentzat soilik dago erabilgarri, eta NewPipe-k ezin du igorri edo deskargatu. - Bideo hau YouTube Music Premium kideentzako soilik erabilgarri dago, eta NewPipe-k ezin du igorri edo deskargatu. + Eduki hau ordaindu duten erabiltzaileentzat soilik dago eskuragarri, eta NewPipe-k ezin du igorri edo deskargatu. + Bideo hau YouTube Music Premium kideentzako soilik dago eskuragarri, eta NewPipe-k ezin du igorri edo deskargatu. Eduki hau pribatua da, eta NewPipe-k ezin du igorri edo deskargatu. Hau SoundCloud Go+ zerbitzuko pista bat da, zure herrialdean behintzat, eta NewPipe-k ezin du igorri edo deskargatu. Eduki hau ez dago eskuragarri zure herrialdean. @@ -586,26 +566,26 @@ Bideo hau adinez mugatua dago. \nAdinez mugatutako bideoekiko YouTube-ren politika berriengatik, NewPipe-k ezin ditu bideoen igorpen hauek atzitu eta erreproduzitu. Deskarga hasi da - Behean gaueko gai gogokoena hauta dezakezu + Behean gaueko gai gogokoena hautatu dezakezu Hautatu zure gaueko gai gogokoena — %s Automatikoa (gailuaren gaia) - Gauaren gaia - kanalaren xehetasunak erakutsi - Desgaitu edukien tunela bideo-erreprodukzioan pantaila beltza badago edo bideoa totelka ari bada. - Hedabideen tunela desaktibatu + Gaueko gaia + Erakutsi kanalaren xehetasunak + Desgaitu multimedia-tunelatzea pantaila beltza edo bideoa erreproduzitzean eten egiten bada. + Multimedia-tunela desgaitu Itzalita Piztuta Tablet modua - Web-orrialdea ireki + Ireki webgunea Pribatua Publikoa Hizkuntza Lizentzia - Tag-ak + Etiketak Kategoria - Desgaitu bideo deskripzioaren testua hautatzea - Bideo deskripzioaren testua hautatzea gaitu - Orain, testua aukeratu dezakezu deskribapenaren barruan. Kontuan izan orriak begiak kliskatu ditzakeela eta estekak ez direla klikagarriak izango hautaketa moduan dagoen bitartean. + Desgaitu deskribapenaren testu-hautaketa + Deskribapenaren testu-hautaketa gaitu + Orain deskribapenaren barruko testua hauta dezakezu. Kontuan izan orrialdea keinuka hasi dezakela eta estekak ezin direla klikatu hautaketa moduan zauden bitartean. Egilearen kontua itxi da. \nNewPipe-k ezingo du etorkizunean jario hau kargatu. \nKanal honetatik harpidetza kendu nahi duzu\? @@ -615,7 +595,7 @@ Non gorde galdetuko zaizu deskarga bakoitzean Ez da deskargatzeko karpetarik ezarri oraindik, aukeratu lehenetsitako deskargatzeko karpeta orain Pribatutasuna - Kontua ezabatu da + Kontua itxi da Jario azkarrak ez du honi buruz informazio gehiagorik ematen. Adin muga Barnekoa @@ -625,30 +605,30 @@ Ez da agertzen Kalitate txikia (txikiagoa) Kalitate handia (handiagoa) - Seekbarren miniaturen aurrebista - Iruzkinak desaktibatuta daude + Bilaketa-barraren miniaturen aurrebista + Iruzkinak desgaituta daude Sortzaileak baloratua Deskarga %1$s ezabatuta - %1$s deskarga ezabatuak + %1$s deskarga ezabatuta Deskarga amaituta - %s Deskarga amaituta + %s deskarga amaituta Irudien gainean Picasso koloretako zintak erakutsi, jatorria adieraziz: gorria sarerako, urdina diskorako eta berdea memoriarako Erakutsi irudi-adierazleak - Urruneko bilaketaren iradokizunak + Urruneko bilaketa-iradokizunak Tokiko bilaketa-iradokizunak - Ikusi gisa markatu - Lerratu elementuak aldetara ezabatzeko + Ikusitako gisa markatu + Irristatu elementuak kentzeko Ez hasi bideoak mini erreproduzitzailean eta hasi bideoak pantaila osoan zuzenean, auto biraketa blokeatuta badago. Mini erreproduzitzailea erabili dezakezu pantaila osotik irtetzean Hasi erreproduzitzaile nagusia pantaila osoan - Isatsari bideo hau erantsita + Jarraian jarrita Gehitu jarraian - Erakutsi \"Itxi erreproduzigailua\" + Erakutsi «Erreproduzitzailea kraskatu» Prozesatzen... Itxoin mesedez - Erroreen txostenen jakinarazpena + Errore-txostenen jakinarazpena Jakinarazpenak erroreen berri emateko NewPipe-k errore bat aurkitu du, sakatu berri emateko Errore bat gertatu da, ikusi jakinarazpena @@ -658,16 +638,16 @@ Ez da fitxategi kudeatzaile bat aurkitu ekintza honetarako. \nMesedez, instalatu Storage Access Framework-ekin bateragarria den fitxategi kudeatzaile bat Ainguratutako iruzkina - Itxi erreproduzigailua + Erreproduzitzailea kraskatu Eguneraketak bilatzen… Ez da fitxategi kudeatzaile bat aurkitu ekintza honetarako. \nMesedez, instalatu fitxategi kudeatzaile bat edo saiatu \'%s\' desgaitzen deskarga ezarpenetan - Erreproduzigailua erabiltzean ustekabean ixteko aukera ematen du + Erreproduzitzailea erabiltzean kraskadura aukera erakusten du Erakutsi errore barra bat Sortu errore jakinarazpen bat - Konfiguratu unean erreproduzitzen ari den igorpenaren jakinarazpena + Konfiguratu uneko erreprodukzio-igorpenaren jakinarazpena Jakinarazpenak - Erreproduzigailuaren jakinarazpenak + Erreproduzitzailearen jakinarazpenak Igorpen berriak Bilatu igorpen berriak Igorpen berrien jakinarazpenak @@ -681,27 +661,27 @@ Harpidetzen igorpen berrien jakinarazpenak Igorpenaren xehetasunak kargatzen… - igorpen berri %s + Igorpen berri %s %s igorpen berri LeakCanary ez dago eskuragarri - Egiaztapen maiztasuna - Jakinarazi + Egiaztatze maiztasuna + Jaso jakinarazpenak ExoPlayer lehenetsia Beharrezko sareko konexioa Portzentaia Semitonoa Erreprodukzioaren kargatze-tartearen tamaina Deskargatzaileak onartzen ez dituen igorpenak ez dira erakusten - Hautatutako igorpena ez dute kanpoko erreproduzitzaileek onartzen - Ez dato erabilgarri audio-igorpenik kanpoko erreproduzitzaileentzat - Ez dago erabilgarri bideo-igorpenik kanpoko erreproduzitzaileentzat + Kanpoko erreproduzitzaileek ez dute hautatutako igorpena onartzen + Ez dago audio-igorpenik eskuragarri kanpoko erreproduzitzaileentzat + Ez dago bideo-igorpenik eskuragarri kanpoko erreproduzitzaileentzat Formatu ezezaguna Kalitate ezezaguna - Hautatu kanpoko erreproduzigailuen kalitatea + Hautatu kanpoko erreproduzitzaileen kalitatea Grisez idatzitako erreprodukzio-zerrendek jada badute elementu hau. Webgunean ikusi - Akatsa arbelera kopiatzean + Akatsa arbelera kopiatzeak huts egin du Arazoren bat baduzu aplikazioa erabiltzerakoan, irakur itzazu ohiko galdera hauen erantzunak! Betiko miniatura kendu NewPipe-en azken bertsioa erabiltzen ari zara @@ -712,8 +692,8 @@ Ordenatu Modu azkarra Hiru-puntutako menutik harpidetzak inportatu edo esportatu - Maiz galdetutako galderak - Ezikusi hardware multimedia botoien gertaerak + Maiz egindako galderak + Ezikusi hardware multimedia-botoien gertaerak Erabilgarria, adibidez, botoi fisiko hautsiak dituen entzungailua erabiltzen ari bazara Kendu bikoiztuak Kendu bikoiztuak\? @@ -737,9 +717,9 @@ Eskuineko keinuaren ekintza Erabili beti ExoPlayer-en bideo-irteeraren interfazeko ezarpenaren konponbidea Hurrengo igorpena - Edukien tunela desgaitu da lehenespenez gailuan, gailuaren modeloak ez du onartzen eta. + Multimedia-tunela desgaitu da lehenespenez gailuan, gailuaren modeloak ez du onartzen eta. Azpikanalen abatarrak - Audio-pista bat egon behar da igorpen honetan jada + Audio-pista bat egon beharko litzateke igorpen honetan dagoeneko Hautatu jatorrizko audioaren pista hizkuntza zein den kontuan hartu gabe Hautatu kanpoko erreproduzitzailearen audio-pista Lortuko diren fitxak jarioa eguneratzean. Aukera honek ez du eraginik kanal bat modu azkarra erabiliz eguneratzen bada. @@ -747,7 +727,7 @@ Ezkerreko keinuaren ekintza Hobetsi audio deskribatzailea Igotako abatarrak - Aldatu eduki progresiboen kargatze-tartearen tamaina (oraingoa: %s). Balio baxu batek hasierako kargatzea bizkortu dezake + Aldatu eduki progresiboen kargatze-tartearen tamaina (oraingoa: %s). Balio baxu batek hasierako karga bizkortu dezake Hobetsi jatorrizko audioa Audioa: %s Bannerrak @@ -766,7 +746,7 @@ %1$s %2$s Honi buruz Ez - Editatu beheko jakinarazpen ekintza bakoitza gainean sakatuz. Lehen hiru ekintzak (erreproduzitu/pausatu, aurrekoa eta hurrengoa) sistemarengatik ezarrita daude eta ezin dira pertsonalizatu. + Editatu beheko jakinarazpen-ekintza bakoitza sakatuz. Lehen hiru ekintzak (erreproduzitu/pausatu, aurrekoa eta hurrengoa) sistemarengatik ezarrita daude eta ezin dira pertsonalizatu. Atzera egin Irudiaren kalitatea Aukera gehiago @@ -787,7 +767,7 @@ Ezarpenak berrezartzeak zure ezarpen gogokoenak baztertzen ditu eta aplikazioa berrabiarazten du. \n \nAurrera egin nahi duzu? - Ez dago nahikoa lekurik gailuan + Ez dago leku libre nahikorik gailuan Konponbide honek azal aldaketa bat gertatzean bideo kodekak askatu eta berrezartzen ditu, azalaren kodeka zuzenean ezarri ordez. ExoPlayer-ek dagoeneko erabiltzen du arazoak dituzten gailu batzuetan. Ezarpen honek Android 6 eta berriagotan funtzionatzen du soilik \n \nAukera hau gaitzeak erreprodukzio erroreak saihestu ditzake bideo-erreproduktorea aldatzean edo pantaila osoan jartzean @@ -820,4 +800,34 @@ Erakutsi gutxiago bigarren mailako + Bilatu %1$s + Bilatu %1$s (%2$s) + Erreprodukzio-zerrendak + Laster-leiho erreproduzitzailea erabiltzeko, hautatu %1$s Android-en ezarpenen menu hauan, eta gaitu %2$s. + «Baimendu beste aplikazio batzuen gainean bistaratzea» + %sK + %sM + %sMM + Ezabatu fitxategia + Ezabatu sarrera + Hatutatu jario talde bat + Ez da jario talderik sortu oraindik + Kanal-taldeen orria + Kontua itxi da\n\n%1$s-ek arrazoi hau ematen du: %2$s + Gustoko + Partekatu YouTubeko aldi baterako erreprodukzio-zerrenda gisa + SoundCloud-eko 50 onenen orrialdea kendu da + SoundCloud-ek jatorrizko Top 50 zerrendetan eten egin du. Dagokion fitxa kendu da zure orrialde nagusitik. + YouTubeko joera konbinatuak kendu dira + YouTube-k joera-orrialde konbinatua eten du 2025eko uztailaren 21etik aurrera. NewPipe-k joera-orrialde lehenetsia zuzeneko emankizunekin ordezkatu du.\n\nJoera desberdineko orrialdeak ere hauta ditzakezu \"Ezarpenak > Edukia > Orrialde nagusiaren edukia\" atalean. + Bideojoko joerak + Podcast joerak + Film eta telesail joerak + Musika joerak + Sarrera ezabatua + 403 HTTP errorea jaso da zerbitzaritik erreproduzitzen ari zenean, ziurrenik streaming URLaren iraungipenak edo IP debeku batek eraginda + %1$s HTTP errorea jaso da zerbitzaritik erreproduzitzen ari zela + 403 HTTP errorea jaso da zerbitzaritik erreproduzitzen ari zenean, ziurrenik IP debeku batek edo streaming URLaren desofuskazio arazoek eraginda + %1$s-ek datuak emateari uko egin dio, eskatzailea bot bat ez dela baieztatzeko saioa hasteko eskatuz.\n\nBaliteke zure IP helbidea %1$s-ek aldi baterako debekatu izana, denbora pixka bat itxaron dezakezu edo beste IP batera aldatu (adibidez, VPN bat aktibatu/itzaliz, edo WiFitik datu mugikorretara aldatuz). + Eduki hau ez dago eskuragarri hautatutako edukiaren herrialderako.\n\nAldatu zure hautaketa \"Ezarpenak > Edukia > Edukiaren herrialde lehenetsia\" ataletik. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 3e1752a4a..03fce16e4 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -207,15 +207,15 @@ Chargement du contenu demandé Importer la base de données Exporter la base de données - Remplace votre historique, vos abonnements, vos playlists et (en option) vos paramètres - Exporte l’historique, les abonnements, les playlists et les paramètres + Remplace votre historique, vos abonnements, vos listes de lecture et (en option) vos paramètres + Exporte l’historique, les abonnements, les listes de lecture et les paramètres Exporté Importé Fichier ZIP non valide Avertissement : impossible d’importer tous les fichiers. Cela effacera vos paramètres actuels. Afficher les informations - Playlists enregistrées + Listes de lecture enregistrées Ajouter à Glisser pour réordonner Créer @@ -224,17 +224,17 @@ Dernière lecture Vidéos les plus vues Toujours demander - Nouvelle playlist + Nouvelle liste de lecture Renommer Nom - Ajouter à la playlist - Définir comme miniature de la playlist - Enregister la playlist + Ajouter à la liste de lecture + Définir comme miniature de la liste de lecture + Enregistrer la liste de lecture Supprimer le signet - Voulez-vous supprimer cette playlist ? - Playlist créée - Ajouté à la playlist - Miniature de la playlist changée. + Voulez-vous supprimer cette liste de lecture ? + Liste de lecture créée + Ajouté à la liste de lecture + Miniature de la liste de lecture changée. Aucun sous-titre Ajuster Zoomer @@ -318,7 +318,7 @@ Aucune limite Limiter la définition lors de l’utilisation des données mobiles Chaînes - Playlists + Listes de lecture Morceaux Utilisateurs Accélérer pendant les silences @@ -355,7 +355,7 @@ Téléchargement échoué Délai de connexion expiré Conférences - ajouté à la playlist + ajouté à la liste de lecture Générer un nom unique Écraser Un fichier avec ce nom existe déjà @@ -386,7 +386,7 @@ Aucun commentaire Impossible de charger les commentaires Fermer - Reprendre la playlist + Reprendre la lecture Effacer les données Fichier déplacé ou supprimé impossible d’écraser le fichier @@ -532,8 +532,8 @@ Activer le « Mode restreint » de YouTube Afficher uniquement les abonnements non groupés Page des playlists - Aucune playlist encore enregistrée - Sélectionner une playlist + Aucune liste de lecture encore enregistrée + Sélectionner une liste de lecture Veuillez vérifier si un ticket concernant votre problème existe déjà. Lorsque vous créez des tickets dupliqués, cela nous prend du temps que nous pourrions passer à résoudre effectivement le problème. Signaler sur GitHub Copier le rapport formaté @@ -723,7 +723,7 @@ Appuyez pour télécharger %s Échec de la copie dans le presse-papiers Cette option est disponible seulement si %s est sélectionné pour le thème - Les playlists grisées contiennent déjà cet élément. + Les listes de lecture grisées contiennent déjà cet élément. Carte Utile si, par exemple, vous utilisez un casque avec des boutons dysfonctionnels Effacer les doublons @@ -784,7 +784,7 @@ Albums Qualité moyenne Bannières - Playlists + Listes de lecture Plus d’options Miniatures Pistes @@ -800,7 +800,7 @@ Partager une liste d\'URLs %1$s \n%2$s - Partager la playlist + Partager la liste de lecture - %1$s : %2$s Choisir quels onglets seront visibles sur les pages de chaîne Changer l’orientation de l’écran @@ -835,8 +835,8 @@ Pas assez d\'espace disponible sur l\'appareil Les paramètres de l\'export en cours d\'importation utilisent un format vulnérable qui a été déprécié depuis NewPipe 0.27.0. Assurez-vous que l\'export en cours d\'importation provient d\'une source fiable. Privilégiez les exports obtenues à partir de NewPipe 0.27.0 ou des versions plus récentes à l\'avenir. Le support pour l\'importation des paramètres dans ce format vulnérable sera bientôt complètement supprimé et les anciennes versions de NewPipe ne pourront plus importer les paramètres des exports des nouvelles versions. secondaire - Partager comme playlist YouTube temporaire - Playlists + Partager comme liste de lecture YouTube temporaire + Listes de lecture Sélectionnez un groupe de flux Encore aucun groupe de flux créé Page du groupe de chaînes diff --git a/app/src/main/res/values-ji/strings.xml b/app/src/main/res/values-ji/strings.xml new file mode 100644 index 000000000..55344e519 --- /dev/null +++ b/app/src/main/res/values-ji/strings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/values-lmo/strings.xml b/app/src/main/res/values-lmo/strings.xml index 80f3dd9c6..1f18b248a 100644 --- a/app/src/main/res/values-lmo/strings.xml +++ b/app/src/main/res/values-lmo/strings.xml @@ -2,4 +2,39 @@ Pigia la lente per inziaa. Canai + Mandad fœra el %1$s + Installa + Scassa + Va ben + + No + Derva ind el browser + Marca tant\'mè vardad + Derva a fenestra + Derva con + Spantega + Descarga + Cerca + Cerca %1$s + Cerca %1$s (%2$s) + Impostazione + Vœlevet dir \"%1$s\"? + Adree a far vider i resultads per: %s + Spantega con + Al tira via el son ind una quai resoluzion + Inscrivess + Inscrivud + Tira via inscrizion + Tœvuda via l\'inscrizion + L\'è stait minga possibil de mudar l\'inscrizion + L\'è stait minga possibil d\'atualizar l\'inscrizion + Fà vider informazione + Inscrizione + Cerniss sqeda + Fond + Fenestra + Jonta a + Cartella dei video descargads + I video descargads inn rejistrads qì + Cerniss una cartella per i fail video diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index d1a3e1d50..f36c2aff6 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -39,13 +39,13 @@ Nav atskaņošanas sarakstu pagaidām Izvēlaties atskaņošanas sarakstu Nav kanālu abonamentu pagaidām - Izvēlaties kanālu - Kanālu lapa + Atlasiet kanālu + Kanāls Noklusējuma Kiosks - Kioska Lapa - Tukša Lapa - Kuras cilnes rāda galvenajā lapā - Galvenās lapas saturs + Kioska lapa + Tukša lapa + Kādas cilnes rādīt galvenajā lapā + Galvenā lapa Visvairāk Atskaņotais Pēdējais Atskaņotais Vai jūs vēlaties izdzēst šo lietu no meklēšanas vēstures\? @@ -95,7 +95,7 @@ Faila nosaukums Labi Pārsaukt - Atcelt + Noraidīt Kontrolsumma Izdzēst Radīt @@ -338,10 +338,9 @@ %d sekundes ExoPlayer ierobežojumu dēļ meklēšanas ilgums tika iestatīts uz %d sekundēm - Jā, un daļēji skatītos videoklipus - Videoklipi, kas ir skatīti pirms un pēc pievienošanas atskaņošanas sarakstam, tiks noņemti. -\nVai tu esi pārliecināts\? To nevar atsaukt! - Vai noņemt skatītos videoklipus\? + Jā, un daļēji skatītos video + Video, kas skatīti pirms un pēc pievienošanas atskaņošanas sarakstam, tiks noņemti. \nVai tiešām turpināt? Šo darbību nevarēs atsaukt! + Vai tiešām noņemt skatītos video? Noņemt skatīto System default Lietotnes valoda @@ -479,7 +478,7 @@ Lejupielādēt Turpināt atskaņošanu pēc pārtraukumiem (piemēram, telefona zvana) Turpināt atskaņošanu - Saglabājiet skatītos videoklipus + Uzglabāt skatīto video vēsturi Dzēst datus Rādīt atskaņošanas pozīcijas indikatoru sarakstos Atskaņošanas pozīcija sarakstos @@ -494,7 +493,7 @@ Turpināt atskaņot videoklipus, automātiski pievienojot līdzīgus videoklipus Automātiski atskaņot nākošo videoklipu Kešatmiņas metadati notīrīti - Izdzēst visus kešatmiņā glabātos mājaslapu datus + Izdzēš visus kešatmiņā glabātos vietnes datus Notīrīt kešatmiņas metadatus Attēlu kešatmiņa notīrīta Izslēdziet, lai paslēptu papildus informācijas laukus par video autoru, video saturu vai meklēšanas vaicājuma rezultātu @@ -552,7 +551,7 @@ Lejupielādētie audio faili tiek glabāti šeit Audio lejupielādes mape Izvēlaties lejupielādes mapi priekš video failiem - Lejupielādētie video faili tiek glabāti šeit + Lejupielādētās video datnes tiek glabātas šeit Video lejupielādes mape Pievienot Fonā @@ -616,7 +615,7 @@ Rādīt krāsainas lentes virs attēliem, norādot to avotu: sarkana - tīkls, zila - disks, zaļa - atmiņa Ieslēgt teksta atlasīšanu video aprakstā Lejupielādes mape vēl nav iestatīta, izvēlieties noklusējuma lejupielādes mapi - Pārvelciet objektus, lai tos noņemtu + Pavelciet atlasīto elementu pa kreisi vai labi, lai to aizvāktu Lokālie meklēšanas ieteikumi Rādīt attēlu indikatorus Augstas kvalitātes (lielāks) @@ -627,9 +626,7 @@ Sākot ar Android 10, tikai“Krātuves Piekļuves Sistēma” ir atbalstīta Nevarēja ielādēt straumi priekš \'%s\'. Kļūda lādējot plūsmu - Autora konts tika slēgts. -\nNewPipe turpmāk nevarēs ielādēt šo plūsmu. -\nVai vēlaties atteikties no šī kanāla abonēšanas\? + Autora konts tika slēgts.\nNewPipe turpmāk vairs nevarēs ielādēt šī kanāla plūsmas saturu.\nVai tiešām atteikties no šī kanāla abonēšanas? Ātrās straumes režīms nesniedz vairāk informācijas par šo. Izslēgt teksta atlasīšanu video aprakstā Iekšeji @@ -641,7 +638,7 @@ Sarakstā neiekļauts Uzņēmums Servera meklēšanas ieteikumi - Atzīmēt kā skatītu + Atzīmēt kā noskatītu Apstrādā... Var aizņemt kādu laiku Izdzēsa %1$s lejupielāžu @@ -725,7 +722,7 @@ Metadatu ielādēšana… Galvenās cilnes pozīcija Nepazīstams formāts - Daļēji noskatīti + Daļēji skatīti Nav tiešraides Nav pietiekami daudz brīvās vietas uz ierīces Par @@ -826,4 +823,14 @@ Atskaņošanas saraksti Kopīgot kā pagaidu YouTube atskaņošanas sarakstu sekundārais + %s tūkst. + %s milj. + %s mljrd. + Patīk + Pašlaik populāra mūzika + Pašlaik populāras filmas un TV raidījumi + Pašlaik populāri raidieraksti + Pašlaik populārs spēļu nozarē + YouTube pārtrauca piedāvāt apvienoto pašlaik populārs lapu kopš 2025. gada 21. jūlija. NewPipe aizstāja noklusējuma pašlaik populārs lapu ar pašlaik populāras tiešraides.\n\nJūs variet atlasīt arī citas pašlaik populārs lapas zem \"Iestatījumi > Saturs > Galvenā lapa\". + Dzēst datni diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 01be8d1d2..e309b7fc7 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -428,4 +428,5 @@ จัดเรียง การ์ด กำลังจะมา + ค้นหา %1$s diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index f27f5a248..58fdf5da3 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -797,9 +797,7 @@ Sao lưu và khôi phục Đặt lại cài đặt Đặt lại tất cả cài đặt về giá trị mặc định - Việc đặt lại tất cả cài đặt sẽ loại bỏ tất cả các cài đặt ưa thích của bạn và khởi động lại ứng dụng. -\n -\nBạn có chắc muốn tiếp tục? + Việc đặt lại tất cả cài đặt sẽ loại bỏ tất cả các cài đặt mà bạn đã đặt và khởi động lại ứng dụng. \n \nBạn có chắc muốn tiếp tục? Không NewPipe có thể tự động kiểm tra các phiên bản mới theo thời gian và thông báo cho bạn khi chúng có sẵn. \nBạn có muốn kích hoạt tính năng này không? @@ -825,4 +823,15 @@ Podcasts đang thịnh hành Phim và chương trình đang thịnh hành Âm nhạc đang thịnh hành + Đã xảy ra lỗi HTTP 403 trong khi phát, có thể do URL phát sóng đã hết hạn hoặc bị ban IP + %1$s đã từ chối cung cấp dữ liệu, cần phải đăng nhập để xác nhận yêu cầu viên ko phải là bot.\n\nIP này có vẻ đã bị ban tạm thời bởi %1$s, bạn có thể đợi một lúc hoặc chuyển sang IP khác (ví dụ như việc tắt / bật lại VPN, hoặc là chuyển mạng từ WIFI sang 4G/5G). + Nội dung này không được hỗ trợ tại quốc gia mà bạn chọn.\n\nHãy đổi quốc gia trong phần \"Cài đặt > Nội dung > Nội dung quốc gia mặc định\". + Để sử dụng tính năng phát video nổi, hãy chọn %1$s trong Cài đặt Android và bật tính năng %2$s. + Đã xảy ra lỗi HTTP 403 trong khi phát, có thể IP này đã bị ban hoặc vấn đề phát URL deobfuscation + \"Cho phép hiển thị trên ứng dụng khác\" + Xóa file + Xóa entry + Tài khoản bị vô hiệu hóa. \n\n%1$s cung cấp lý do này: %2$s + Entry đã xóa + Đã xảy ra lỗi HTTP %1$s trong khi phát diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d42a0072a..35de16f8e 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -366,7 +366,7 @@ 找不到服务器 无法连接至服务器 服务器未发送数据 - 找不到 NOT FOUND + 找不到 后期处理失败 停止 最大重试次数 diff --git a/fastlane/metadata/android/ar/changelogs/1006.txt b/fastlane/metadata/android/ar/changelogs/1006.txt new file mode 100644 index 000000000..9466446c9 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/1006.txt @@ -0,0 +1,16 @@ +# التحسينات +الإبقاء على المشغل الحالي عند الضغط على الزمن. +محاولة استعادة مهام التنزيل المعلقة قدر الإمكان. +إضافة خيار لحذف سجل التنزيل دون حذف الملف الفعلي. +إذن الظهور فوق التطبيقات: عرض مربع توضيحي لإصدارات أندرويد > R. +دعم فتح روابط على.soundcloud. +العديد من التحسينات. + +# الإصلاحات +إصلاح تنسيق الأرقام المختصرة لإصدارات أندرويد الأقدم من 7. +إصلاح الإشعارات الوهمية. +إصلاحات لملفات ترجمة SRT. +إصلاح عدد كبير من الأعطال. + +# التطوير +تحديث البنية البرمجية الداخلية. diff --git a/fastlane/metadata/android/es/changelogs/1005.txt b/fastlane/metadata/android/es/changelogs/1005.txt index b60b51760..64e8353d4 100644 --- a/fastlane/metadata/android/es/changelogs/1005.txt +++ b/fastlane/metadata/android/es/changelogs/1005.txt @@ -1,4 +1,4 @@ -New +Nuevo Añadido soporte a Android Auto Pemitir configurar grupos de feeds como pestaña en la pantalla principal [YouTube] Compartir como playlist temporal diff --git a/fastlane/metadata/android/es/changelogs/1006.txt b/fastlane/metadata/android/es/changelogs/1006.txt new file mode 100644 index 000000000..b6b20370e --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/1006.txt @@ -0,0 +1,16 @@ +#Mejoras +Mantener el reproductor actual al hacer clic en marcas de tiempo. +Intentar recuperar descargas pendientes cuando sea posible. +Añadir opción para eliminar una descarga sin borrar el archivo. +Permiso de superposición: mostrar diálogo explicativo en Android 11 y superior. +Soporte para abrir enlaces on.soundcloud. +Muchas pequeñas mejoras y optimizaciones. + +#Corregido +Formato corto de conteos en Android inferior a 7. +Notificaciones fantasma. +Problemas con archivos de subtítulos SRT. +Numerosos crashes. + +#Desarrollo +Modernización interna del código. diff --git a/fastlane/metadata/android/eu/changelogs/1000.txt b/fastlane/metadata/android/eu/changelogs/1000.txt new file mode 100644 index 000000000..3fd477227 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/1000.txt @@ -0,0 +1,13 @@ +Hobetua +• Zerrenda deskribapena klikagarria +• [PeerTube] subscribeto.me estekak auto-kudeatu +• Historia elementu bakarra hasi + +Konpondua +• RSS botoien ikusgarritasuna +• Bilaketa aurrebista matxurak +• Miniaturarik gabeko zerrenda +• Deskarga elkarrizketa irtetea +• Erlazionatutako elementuen leihoa +• Zerrendan gehitzeko ordena +• Laster-marken diseinua diff --git a/fastlane/metadata/android/eu/changelogs/1001.txt b/fastlane/metadata/android/eu/changelogs/1001.txt new file mode 100644 index 000000000..1658a021f --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/1001.txt @@ -0,0 +1,6 @@ +Hobetua +• Onartu beti jokalarien jakinarazpenen hobespenak aldatzea Android 13+-n + +Konpondua +• Konpondu datu-basea/harpidetzak esportatzeak lehendik zegoen fitxategi bat ez mozten zuelako, eta horrek esportazio bat hondatzea eragin zezakeelako +• Denbora-zigilu batean klik egitean jokalaria hasieratik jarraitzea konpondu diff --git a/fastlane/metadata/android/eu/changelogs/1002.txt b/fastlane/metadata/android/eu/changelogs/1002.txt new file mode 100644 index 000000000..b1302f9ee --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/1002.txt @@ -0,0 +1,4 @@ +Konpondu da YouTube-k ez zuela inolako stream-ik erreproduzitzen. + +Bertsio honek YouTube bideoen xehetasunak kargatzea eragozten duen errore larriena baino ez du konpontzen. +Badakigu beste arazo batzuk ere badaudela, eta laster beste argitalpen bat kaleratuko dugu horiek konpontzeko. diff --git a/fastlane/metadata/android/eu/changelogs/1003.txt b/fastlane/metadata/android/eu/changelogs/1003.txt new file mode 100644 index 000000000..e9c0ddb43 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/1003.txt @@ -0,0 +1,6 @@ +YouTube-ko akatsak zuzentzen dituen zuzenketa-bertsio bat da hau: +• [YouTube] Bideoen informaziorik kargatzen ez zen arazoa konpondu, bideoak erreproduzitzean HTTP 403 erroreak konpondu eta adin-murrizketak dituzten bideo batzuen erreprodukzioa leheneratu +• Konpondu aldatzen ez ziren azpitituluen tamainak +• Konpondu informazioa bi aldiz deskargatzea erreprodukzio bat irekitzean +• [Soundcloud] Kendu erreproduziezinak diren DRM bidez babestutako erreprodukzioak +• Itzulpen eguneratuak diff --git a/fastlane/metadata/android/eu/changelogs/1004.txt b/fastlane/metadata/android/eu/changelogs/1004.txt new file mode 100644 index 000000000..e85b656ae --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/1004.txt @@ -0,0 +1,3 @@ +Bertsio honek YouTube-k 360p-ko erreprodukzioa soilik eskaintzen zuen arazoa konpontzen du. + +Kontuan izan bertsio honetan erabilitako irtenbidea ziurrenik aldi baterakoa izango dela, eta epe luzera SABR bideo protokoloa inplementatu beharko dela, baina TeamNewPipe-ko kideak lanpetuta daude une honetan, beraz, edozein laguntza eskertzekoa izango litzateke! https://github.com/TeamNewPipe/NewPipe/issues/12248 diff --git a/fastlane/metadata/android/eu/changelogs/1005.txt b/fastlane/metadata/android/eu/changelogs/1005.txt new file mode 100644 index 000000000..8084d70f2 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/1005.txt @@ -0,0 +1,17 @@ +Berria +• Android Auto laguntza +• Jario-taldeak fitxa gisa +• [YouTube] Partekatu zerrenda aldi baterako +• [SoundCloud] Atsegin dut fitxa + +Hobetua +• Bilaketa aholku hobeak +• Deskarga data erakutsi +• Android 13 hizkuntza + +Konpondua +• Testu-koloreak modu ilunean +• [YouTube] 100+ elementuko zerrendak +• [YouTube] Gomendatutako bideoak +• Historia ikuspegiko hutsegiteak +• Iruzkinen denbora-zigiluak diff --git a/fastlane/metadata/android/eu/changelogs/1006.txt b/fastlane/metadata/android/eu/changelogs/1006.txt new file mode 100644 index 000000000..89641bf2d --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/1006.txt @@ -0,0 +1,16 @@ +# Hobetua +Erreproduzitzailea denbora-zigiluetan mantendu +Deskarga misioak berreskuratu +Ezabatu deskarga fitxategia gorde +Gainjartze baimena Android > R +.soundcloud estekak ireki +Hobekuntza txikiak + +# Konpondua +Android <7 zenbaketa laburrak +Mamu jakinarazpenak +SRT azpititulu fitxategiak +Istripu tona + +# Garapena +Kodearen modernizazioa diff --git a/fastlane/metadata/android/eu/changelogs/66.txt b/fastlane/metadata/android/eu/changelogs/66.txt new file mode 100644 index 000000000..52d930795 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/66.txt @@ -0,0 +1,22 @@ +# 0.13.7 bertsioaren aldaketa-erregistroa +### Konpondua +- Ordenazio-iragazkiak + +# 0.13.6 bertsioaren aldaketa-erregistroa +### Hobekuntzak +- Hanburgesa animazioa desgaitu +- Deskargak ezabaketa desegin +- Partekatu menuan deskarga +- Jokalaria minimizatu +- ExoPlayer 2.8.2 +- Abiadura kontrolak hobetuak +- Isilune saltoa +- Metadatu egitura berria +- UI konponketak + +### Konponketak + +- Bideoaren informazio diseinua +- Ikusi historia eguneraketa +- Pantaila denbora-muga leiho-moduan +- Jokalari NPE konpondua diff --git a/fastlane/metadata/android/eu/changelogs/800.txt b/fastlane/metadata/android/eu/changelogs/800.txt new file mode 100644 index 000000000..15457364c --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/800.txt @@ -0,0 +1,24 @@ +Berria +• PeerTube euskarria P2P gabe + ◦ Instantziak gehitu + ◦ PeerTube instantziak ikusi eta deskargatu +Deskargak + ◦ Deskarga ETA kalkulatu + ◦ Opus ogg gisa + ◦ Estekak berreskuratu + +Hobetua +• Fitxen errendimendua eta lokalizazioa +• Lokalizazio berriak +• Nabigazio barra beltza + +Konpondua +• Popup hatz-mugimendua +• Igotzailerik gabeko zerrendak +• TLS Android 4.4 +• [SoundCloud] Client_id +• Audio-jarioa + +Garapena +• ExoPlayer 2.10.8 +• Gradle 3.5.1 eta Kotlin onartu diff --git a/fastlane/metadata/android/eu/changelogs/810.txt b/fastlane/metadata/android/eu/changelogs/810.txt new file mode 100644 index 000000000..464b91958 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/810.txt @@ -0,0 +1,19 @@ +Berria +• Miniatura blokeatutako pantailan + +Hobetua +• Zerrenda ilaran botoia +• Fitxak korritzeko moduan +• Jakinarazpen miniatura mugatu +• Irudi zerrenda hutsentzat +• *.opus luzapena erabili +• Deskarga historia ezabatu +• [YouTube] /c/ estekak + +Konpondua +• Partekatzeko arazoak +• Erreproduzitzaile sarbidea +• Bilaketa orrialdekatzea +• [YouTube] NPE nulua +• [YouTube] invidio.us iruzkinak +• [SoundCloud] bezeroaren_id diff --git a/fastlane/metadata/android/eu/changelogs/820.txt b/fastlane/metadata/android/eu/changelogs/820.txt new file mode 100644 index 000000000..54d14152a --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/820.txt @@ -0,0 +1 @@ +YouTube erabilezin bihurtzen zuen funtzio-izenaren regex deszifratzea konpondu da. diff --git a/fastlane/metadata/android/eu/changelogs/830.txt b/fastlane/metadata/android/eu/changelogs/830.txt new file mode 100644 index 000000000..d699a9558 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/830.txt @@ -0,0 +1 @@ +SoundCloud client_id eguneratu da SoundCloud-eko arazoak konpontzeko. diff --git a/fastlane/metadata/android/eu/changelogs/840.txt b/fastlane/metadata/android/eu/changelogs/840.txt new file mode 100644 index 000000000..a17af893c --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/840.txt @@ -0,0 +1,21 @@ +Berria +• Hizkuntza hautatzailea +• Kodira bidali botoia +• Iruzkinak kopiatu + +Hobetua +• ReCaptcha eta cookieak +• Puntu-menua kendu +• Bistaratu baimena eskatu +• Zerrenda izena aldatu +• PeerTube hobekuntzak + +Konpondua +• Erreproduzitzailea abiarazi minimizatuta +• Keinu distira +• .srt lerro-jauziak +• SD txartel deskargak +• Android KitKat deskargak +• .mp4 ezagutza +• Lokalizazio arazoak +• [YouTube] Denbora-zigiluak diff --git a/fastlane/metadata/android/eu/changelogs/850.txt b/fastlane/metadata/android/eu/changelogs/850.txt new file mode 100644 index 000000000..614ab934e --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/850.txt @@ -0,0 +1 @@ +Bertsio honetan YouTube webgunearen bertsioa eguneratu da. Webgune zaharra martxoan eten egingo da eta, beraz, NewPipe eguneratu beharko duzu. diff --git a/fastlane/metadata/android/eu/changelogs/860.txt b/fastlane/metadata/android/eu/changelogs/860.txt new file mode 100644 index 000000000..bb1ae125a --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/860.txt @@ -0,0 +1,7 @@ +Hobetua +• Gorde eta leheneratu tonua eta tempoa deskonektatuta dauden ala ez +• Erreproduzitzailean pantailaren mozketa onartzen du +• Txanda-ikuspenak eta harpidedun kopurua +• YouTube optimizatu da datu gutxiago erabiltzeko + +Bertsio honetan YouTube-rekin lotutako 15 akats baino gehiago konpondu dira. diff --git a/fastlane/metadata/android/eu/changelogs/870.txt b/fastlane/metadata/android/eu/changelogs/870.txt new file mode 100644 index 000000000..f243bb1bf --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/870.txt @@ -0,0 +1,2 @@ +Hau NewPipe eguneratzen duen zuzenketa bat da, SoundCloud arazorik gabe berriro erabili ahal izateko. +SoundCloud-en v2 APIa erabiltzen da orain erauzgailuan eta bezero ID baliogabeen detekzioa hobetu da. diff --git a/fastlane/metadata/android/eu/changelogs/900.txt b/fastlane/metadata/android/eu/changelogs/900.txt new file mode 100644 index 000000000..ca11afb97 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/900.txt @@ -0,0 +1,14 @@ +Berria +• Harpidetza taldeak eta ordenatutako jarioak +• Isilarazteko botoia erreproduzitzaileetan + +Hobetua +• music.youtube.com eta media.ccc.de estekak irekitzeko aukera eman +• Bi ezarpen Itxuratik Edukira lekuz aldatu +• Ezkutatu 5, 15, 25 segundoko bilaketa aukerak bilaketa zehatza gaituta badago + +Konpondua +• WebM bideo batzuk ezin dira bilatu +• datu-basearen babeskopia Android P-n +• Deskargatutako fitxategi bat partekatzean huts egitea +• YouTube erauzketa arazo mordoa eta gehiago ... diff --git a/fastlane/metadata/android/eu/changelogs/920.txt b/fastlane/metadata/android/eu/changelogs/920.txt new file mode 100644 index 000000000..7954fcb37 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/920.txt @@ -0,0 +1,9 @@ +Hobetua + +• Gehitu dira igoera data eta ikustaldi kopurua erreprodukzio-sareko elementuetan +• Tiraderaren goiburuaren diseinuaren hobekuntzak + +Konpondua + +• API 19an huts egiteak eragiten zuen isilarazteko botoia konpondu da +• 1080p 60 fps-ko bideo luzeen deskarga konpondu da diff --git a/fastlane/metadata/android/eu/changelogs/930.txt b/fastlane/metadata/android/eu/changelogs/930.txt new file mode 100644 index 000000000..74ad72a44 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/930.txt @@ -0,0 +1,17 @@ +Berria +• YouTube Music bilaketa +• Android TV oinarrizkoa + +Hobetua +• Ikusitako bideoak kendu +• Mezua eduki onartzen ez +• Leiho tamaina keinuak +• Ilaran kanaleko botoiak +• Tiradera izenburu kudeaketa + +Konpondua +• Adin mugatuko edukia +• reCAPTCHA motak +• Laster-markak null +• Sareko salbuespena +• Harpidetza ordenatzea diff --git a/fastlane/metadata/android/eu/changelogs/940.txt b/fastlane/metadata/android/eu/changelogs/940.txt new file mode 100644 index 000000000..7627c5632 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/940.txt @@ -0,0 +1,16 @@ +Berria +• SoundCloud iruzkinak +• YouTube modu mugatua +• PeerTube guraso xehetasunak + +Hobetua +• Kore botoia onartutakoentzat +• Blokeatu keinuak barran +• Berriro saiatu/harpidetu koloreak + +Konpondua +• Deskarga elkarrizketa izoztea +• Ireki arakatzailean botoia +• Bideoak irekitzeko hutsegitea + +eta gehiago diff --git a/fastlane/metadata/android/eu/changelogs/951.txt b/fastlane/metadata/android/eu/changelogs/951.txt new file mode 100644 index 000000000..ed8f967cb --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/951.txt @@ -0,0 +1,15 @@ +Berria +• Harpidetzak bilatu jario-taldeetan +• Iragazkiak harpidetza taldekatu gabeak erakusteko +• Hasierako orrialdeko erreprodukzio-zerrenden fitxa +• Aurrera eta atzera egin atzeko planoan eta miniaturazko ilaran +• Bilaketa-iradokizunak + +Hobetua +• Aplikazioaren metadatuak ez dira idazten elkartutako fitxategietan +• Huts egindako erreprodukzioak ez dira ilaratik ezabatzen +• Egoera-barraren kolorea eguneratu da + +Konpondua +• Audio eta bideo desinkronizazioa +• [PeerTube] Ezabatutako iruzkinak diff --git a/fastlane/metadata/android/eu/changelogs/952.txt b/fastlane/metadata/android/eu/changelogs/952.txt new file mode 100644 index 000000000..aa8bdaa90 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/952.txt @@ -0,0 +1,7 @@ +Hobetua +• Erreprodukzio automatikoa zerbitzu guztietarako dago eskuragarri (YouTube-rako bakarrik izan beharrean) + +Konpondua +• YouTube-ren jarraipen berriak onartuz, erlazionatutako erreprodukzioak konpondu ziren. +• Adin-mugako YouTube bideoak konpondu dira +• [Android TV] Fokuaren nabarmentze-gainjartze iraunkorra konpondu da diff --git a/fastlane/metadata/android/eu/changelogs/954.txt b/fastlane/metadata/android/eu/changelogs/954.txt new file mode 100644 index 000000000..215e9f5a9 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/954.txt @@ -0,0 +1,9 @@ +• Ezaugarri berria: Ikusi bideoak xehetasunen orrian, irristatu behera erreproduzitzailea minimizatzeko +• MediaStyle jakinarazpenak: ekintza pertsonalizagarriak, errendimendu hobekuntzak +• Aldatu bideoaren tamaina NewPipe mahaigaineko aplikazio gisa erabiltzean + +• URL bateraezin baten kasuan aukerekin elkarrizketa-koadroa +• Bilaketa-iradokizunak hobetu dira emaitzak urrunetik lortu ezin direnean +• Bideoaren kalitatea 720p60ra (aplikazioan) eta 480p-ra (miniaturan) igo da + +• Akats asko konponduak diff --git a/fastlane/metadata/android/eu/changelogs/963.txt b/fastlane/metadata/android/eu/changelogs/963.txt new file mode 100644 index 000000000..6e4679c60 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/963.txt @@ -0,0 +1 @@ +• [YouTube] Kanalen jarraipena konpondu da diff --git a/fastlane/metadata/android/eu/changelogs/965.txt b/fastlane/metadata/android/eu/changelogs/965.txt new file mode 100644 index 000000000..142c96324 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/965.txt @@ -0,0 +1,6 @@ +Kanal taldeak berrantolatzean gertatzen zen hutsegitea konpondu da. +Konpondu da kanal eta erreprodukzio-zerrendetatik YouTube bideo gehiago lortzea. +YouTubeko iruzkinak jasotzea konpondu da. +YouTube URLetan /watch/, /v/ eta /w/ azpibideetarako laguntza gehitu da. +SoundCloud bezeroaren IDaren eta geo-murriztutako edukiaren erauzketa konpondu da. +Iparraldeko kurduera lokalizazioa gehitu da. diff --git a/fastlane/metadata/android/eu/changelogs/966.txt b/fastlane/metadata/android/eu/changelogs/966.txt new file mode 100644 index 000000000..9fe618e6c --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/966.txt @@ -0,0 +1,14 @@ +Berria: +• Zerbitzu berria gehitu: Bandcamp + +Hobetua: +• Aplikazioak gailuaren gaiari jarraitzeko aukera +• Errore-panel bat erakutsi hutsegiteak saihesteko +• Edukia erabilgarri ez dagoenaren informazio gehiago +• Hardware espazio botoiak erreproduzitu/pausatu aktibatzen du +• "Deskargatzen hasita" mezua erakutsi + +Konpondua: +• Miniatura txikiak atzeko planoan erreproduzitzen +• Erreproduzitzaile minimizatuan izenburu hutsa +• Tamaina aldatzeko modua leheneratzen ez zena diff --git a/fastlane/metadata/android/eu/changelogs/967.txt b/fastlane/metadata/android/eu/changelogs/967.txt new file mode 100644 index 000000000..0a7b974a4 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/967.txt @@ -0,0 +1 @@ +YouTube EBn behar bezala ez funtzionatzea konpondu da. Hau cookie eta pribatutasun baimen sistema berri batek eragin zuen, eta horrek NewPipe-k CONSENT cookie bat ezartzea eskatzen du. diff --git a/fastlane/metadata/android/eu/changelogs/968.txt b/fastlane/metadata/android/eu/changelogs/968.txt new file mode 100644 index 000000000..c3d54f0f1 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/968.txt @@ -0,0 +1,7 @@ +Kanalaren xehetasunen aukera gehitu da sakatuta edukitzeko menuan. +Erreprodukzio-zerrendaren izena erreprodukzio-zerrendaren interfazetik aldatzeko funtzionalitatea gehitu da. +Utzi erabiltzaileari bideoa bufferrean gordetzen ari den bitartean pausatzen. +Gai zuria leundu da. +Letra-tamaina handiagoa erabiltzean gainjarritako letra-tipoak konpondu dira. +Formuler eta Zephier gailuetan bideorik ez egotea konpondu da. +Hainbat hutsegite konpondu. diff --git a/fastlane/metadata/android/eu/changelogs/969.txt b/fastlane/metadata/android/eu/changelogs/969.txt new file mode 100644 index 000000000..be068dc50 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/969.txt @@ -0,0 +1,8 @@ +• Kanpoko biltegiratzean instalazioa baimendu +• [Bandcamp] Erreprodukzio bateko lehen hiru iruzkinak bistaratzeko laguntza gehitu da +• Deskargatzen hasten denean bakarrik erakutsi "deskarga hasi da" menua +• Ez ezarri reCaptcha cookierik cookierik gordeta ez dagoenean +• Cachearen errendimendua hobetu +• Jokalaria automatikoki ez jokatzea konpondu da +• Deskargak ezabatzean, baztertu aurreko Snackbar-ak +• Zerrendan ez zegoen objektua ezabatzen saiatzean izandako arazoa konpondu da diff --git a/fastlane/metadata/android/eu/changelogs/970.txt b/fastlane/metadata/android/eu/changelogs/970.txt new file mode 100644 index 000000000..4be4035ce --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/970.txt @@ -0,0 +1,10 @@ +Berria +• Erakutsi edukiaren metadatuak (etiketak, kategoriak, lizentzia) deskribapenaren azpian +• "Erakutsi kanalaren xehetasunak" aukera urruneko erreprodukzio-zerrendetan +• "Ireki arakatzailean" aukera sakatuta edukitzeko menuan + +Konpondua +• Bideoaren xehetasunen orrialdean errotazio-matxura +• "Jolastu Kodirekin" botoia Kore instalatzeko eskatzen zuena +• Inportazio eta esportazio bideak konpondu eta hobetu +• [YouTube] Iruzkinen "atsegin dut" kopurua diff --git a/fastlane/metadata/android/eu/changelogs/971.txt b/fastlane/metadata/android/eu/changelogs/971.txt new file mode 100644 index 000000000..f77ce5008 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/971.txt @@ -0,0 +1,3 @@ +Konponketa +• Bufferra handitu erreprodukziorako rebuffer-aren ondoren +• Tabletetan eta telebistetan erreproduzitzailearen erreprodukzio-ilararen ikonoan klik egitean gertatzen zen hutsegitea konpondu da diff --git a/fastlane/metadata/android/eu/changelogs/972.txt b/fastlane/metadata/android/eu/changelogs/972.txt new file mode 100644 index 000000000..03c28a763 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/972.txt @@ -0,0 +1,12 @@ +Berria +Denbora-zigiluen eta traolen ezagutza deskribapenean +Tableta moduaren eskuzko doikuntza gehitu da +Jarioan erreproduzitutako elementuak ezkutatzeko aukera gehitu da + +Hobetua +Biltegiratze sarbide sistemarako (SAF) laguntza egokia +Ezabatutako eta erabilgarri ez dauden kanaletako erroreen kudeaketa hobetua +Android 10+ erabiltzaileentzako partekatzeko menuak edukiaren izenburua erakusten du orain. +Invidious-en instantzia eguneratuak eta Piped estekak erabiltzeko laguntza + +...eta zuzenketak diff --git a/fastlane/metadata/android/eu/changelogs/973.txt b/fastlane/metadata/android/eu/changelogs/973.txt new file mode 100644 index 000000000..b2db943a3 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/973.txt @@ -0,0 +1,4 @@ +Konponketa +• Konpondu sareta-diseinuan moztutako miniaturak eta izenburuak, errenkada batean zenbat bideo sartu daitezkeen gaizki kalkulatzeagatik. +• Konpondu deskargatzeko elkarrizketa-koadroa ezer egin gabe desagertzea partekatzeko menutik irekitzean +• Kanpoko jarduerak irekitzearekin lotutako liburutegi bat eguneratu, hala nola Storage Access Framework fitxategi hautatzailea diff --git a/fastlane/metadata/android/eu/changelogs/974.txt b/fastlane/metadata/android/eu/changelogs/974.txt new file mode 100644 index 000000000..a515de2bc --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/974.txt @@ -0,0 +1,5 @@ +Konponketa +• Konpondu YouTube-ren mugatzeak eragindako buffering arazoak +• Konpondu YouTubeko iruzkinen erauzketa eta iruzkin desgaituekin matxurak +• Konpondu YouTubeko musika bilaketa +• Konpondu PeerTube zuzeneko emankizunak diff --git a/fastlane/metadata/android/eu/changelogs/975.txt b/fastlane/metadata/android/eu/changelogs/975.txt new file mode 100644 index 000000000..ccdfe2a55 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/975.txt @@ -0,0 +1,16 @@ +Berria +• Miniatura erakutsi bilatzen ari den bitartean +• Desgaitutako iruzkinak detektatu +• Jarioko elementua ikusita gisa markatu +• Bihotz-formako iruzkinak erakutsi + +Hobetua +• Metadatuen eta etiketen diseinua +• Zerbitzuaren kolorea UI osagai guztiei aplikatu + +Zuzenduta +• Mini erreproduzitzailean miniaturak konpondu +• Elementu bikoiztuen buffering infinitua konpondu +• Jokalarien zuzenketak: errotazioa eta itxiera +• ReCAPTCHA atzeko planoan kargatu +• Beste zuzenketa batzuk diff --git a/fastlane/metadata/android/eu/changelogs/976.txt b/fastlane/metadata/android/eu/changelogs/976.txt new file mode 100644 index 000000000..17076919c --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/976.txt @@ -0,0 +1,10 @@ +• Erreproduzitzailea pantaila osoan zuzenean ireki +• Bilaketa-iradokizun motak aukeratu +• Gai iluna ilunagoa + pantaila-aurreikuspen iluna +• Fitxategi-hautatzailea: nahi ez direnak gris koloreztatu +• YouTubeko harpidetzak inportatzea konpondu +• Berriro erreproduzitzeko botoia sakatu behar da +• Amaierako audio saioa konpondu +• [Android TV] Bilaketa-barraren jauzi luzeak DPad-ekin konpondu + +Aldaketa gehiago ikusteko, ikusi aldaketa-erregistroa beheko Estekak fitxan. diff --git a/fastlane/metadata/android/eu/changelogs/977.txt b/fastlane/metadata/android/eu/changelogs/977.txt new file mode 100644 index 000000000..138a957df --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/977.txt @@ -0,0 +1,10 @@ +• "Hurrengoa erreproduzitu" botoia sakatuta edukitzeko menuan +• YouTubeko bideo labur bide-aurrizkia asmo-iragazkian +• Ezarpen finkoak inportatu +• Bilaketa-barra eta jokalari botoiak trukatu Ilara-pantailan +• MediasessionManager konponketak +• Bilaketa-barra bideoa amaitu ondoren ez amaitzea konpondu +• RealtekATV multimedia tunela desgaituta +• Jokalari botoien klik eremua handitu + +Aldaketa gehiago ikusteko, ikusi aldaketa-erregistroa beheko Estekak fitxan. diff --git a/fastlane/metadata/android/eu/changelogs/978.txt b/fastlane/metadata/android/eu/changelogs/978.txt new file mode 100644 index 000000000..a01c898ef --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/978.txt @@ -0,0 +1 @@ +NewPipe bertsio berri baten egiaztapena exekutatzea konpondu da. Batzuetan egiaztapen hau goizegi exekutatzen zen eta, beraz, aplikazioaren kraskadura eragiten zuen. Hori orain konpondu beharko litzateke. diff --git a/fastlane/metadata/android/eu/changelogs/979.txt b/fastlane/metadata/android/eu/changelogs/979.txt new file mode 100644 index 000000000..15550832a --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/979.txt @@ -0,0 +1,2 @@ +- Erreprodukzioa berriro hasteko arazoa konpondu da +- Hobekuntzak NewPipe-k bertsio berri bat egiaztatu behar duen zehazten duen zerbitzua atzeko planoan abiarazten ez dela ziurtatzeko diff --git a/fastlane/metadata/android/eu/changelogs/980.txt b/fastlane/metadata/android/eu/changelogs/980.txt new file mode 100644 index 000000000..1e45b17ab --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/980.txt @@ -0,0 +1,13 @@ +Berria +- "Gehitu erreprodukzio-zerrendara" aukera gehitu da partekatzeko menuan +- y2u.be eta PeerTube esteka laburretarako laguntza gehitu da + +Hobetua +- Erreprodukzio-abiaduraren kontrol trinkoagoak +- Jarioak elementu berriak nabarmentzen ditu orain +- "Erakutsi ikusitako elementuak" aukera orain jarioan gordeta dago + +Zuzenduta +- YouTube-tik "atsegin dut" eta "ez dut" mezuen erauzketa konpondu da +- Errepikapen automatikoa konpondu da atzeko planotik itzuli ondoren +Eta askoz gehiago diff --git a/fastlane/metadata/android/eu/changelogs/981.txt b/fastlane/metadata/android/eu/changelogs/981.txt new file mode 100644 index 000000000..9ef0ddc88 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/981.txt @@ -0,0 +1,2 @@ +MediaParserren euskarria kendu da Android 11+-n bufferrean sartu ondoren erreprodukzioa berriro hasteko huts egitea konpontzeko. +Philips QM16XE-n multimedia tunelizazioa desgaitu da erreprodukzio arazoak konpontzeko. diff --git a/fastlane/metadata/android/eu/changelogs/982.txt b/fastlane/metadata/android/eu/changelogs/982.txt new file mode 100644 index 000000000..28b860901 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/982.txt @@ -0,0 +1 @@ +Konpondu da YouTube-k ez zuela inolako erreprodukziorik erreproduzitzen. diff --git a/fastlane/metadata/android/eu/changelogs/983.txt b/fastlane/metadata/android/eu/changelogs/983.txt new file mode 100644 index 000000000..1c9b31572 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/983.txt @@ -0,0 +1,9 @@ +Gehitu bi aldiz sakatuta bilatzeko interfazea eta portaera berriak +Egin ezarpenak bilagarri +Nabarmendu finkatutako iruzkinak horrela +Gehitu aplikazioarekin irekitzeko euskarria FSFEren PeerTube instantziarako +Gehitu errore-jakinarazpenak +Konpondu jokalaria aldatzean lehenengo ilarako elementuaren errepikapena +Itxaron denbora gehiago zuzeneko erreprodukzioetan bufferrean gordetzean huts egin aurretik +Tokiko bilaketa-emaitzen ordena konpondu +Konpondu erreprodukzio-ilarako elementu-eremu hutsak diff --git a/fastlane/metadata/android/eu/changelogs/984.txt b/fastlane/metadata/android/eu/changelogs/984.txt new file mode 100644 index 000000000..cef6b4c1b --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/984.txt @@ -0,0 +1,7 @@ +Kargatu elementu nahikoa pantaila betetzeko eta tableta/telebista korritzea konpondu +Zerrendetan mugitzeko ausazko hutsegiteak konpondu +Bilaketa azkarraren gainjartze-arkua sistemaren azpian jarri +Leiho anitzetan mozketen aldaketak leheneratu (kokapen okerreko atzerakada) +compileSdk 30etik 31ra handitu +Erroreen liburutegia eguneratu +Erreproduzitzailearen kodea berregituratu diff --git a/fastlane/metadata/android/eu/changelogs/985.txt b/fastlane/metadata/android/eu/changelogs/985.txt new file mode 100644 index 000000000..68d0be7fc --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/985.txt @@ -0,0 +1 @@ +Konpondu da YouTube-k ez zuela inolako erreprodukziorik erreproduzitzen diff --git a/fastlane/metadata/android/eu/changelogs/986.txt b/fastlane/metadata/android/eu/changelogs/986.txt new file mode 100644 index 000000000..b167f6092 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/986.txt @@ -0,0 +1,16 @@ +Berria +• Erreprodukzio berrien jakinarazpenak +• Trantsizio hobetua atzeko planoa/bideo artean +• Tonua erdi-tonuz aldatu +• Ilara erreprodukzio-zerrenda bati erantsi + +Hobetua +• Abiadura/tonu urratsaren tamaina gogoratu +• Hasierako buffering luzea arintu +• Android TV interfazea hobetu +• Fitxategi guztiak ezabatu aurretik berretsi + +Konpondua +• Multimedia botoiak kontrolak ezkutatzen ez zituen +• Erreprodukzioa berrezartzea mota aldatzean +• Erreprodukzio-zerrenda elkarrizketa biratzea diff --git a/fastlane/metadata/android/eu/changelogs/987.txt b/fastlane/metadata/android/eu/changelogs/987.txt new file mode 100644 index 000000000..4c03d4277 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/987.txt @@ -0,0 +1,12 @@ +Berria +• Beste bidalketa-metodoak: karga azkarragoa, PeerTube/SoundCloud konponketak, YouTube zuzeneko emankizunak +• Urruneko zerrenda tokikora gehitu botoia +• Irudi aurrebista Android 10+ partekatze-orrian + +Hobetua +• Erreprodukzio-parametroen elkarrizketa hobetu +• Harpidetza botoiak hiru puntuko menura eraman + +Konpondua +• Ikusitako bideoak kentzea zerrendatik +• Partekatzeko menuaren gaia eta zerrenda sarrera diff --git a/fastlane/metadata/android/eu/changelogs/991.txt b/fastlane/metadata/android/eu/changelogs/991.txt new file mode 100644 index 000000000..471f353dd --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/991.txt @@ -0,0 +1,13 @@ +Berria +• "Ireki arakatzailean" botoia errore-panelean +• Kanal taldeak zerrenda gisa bistaratzeko aukera +• [YouTube] Klik luze segmentuetan denbora-zigilu URLa partekatzeko +• Erreprodukzio-ilarako botoia erreproduzitzaile txikian + +Hobetua +• Islandierazko lokalizazioa eta itzulpen eguneraketak +• Barne-hobekuntza asko + +Konpondua +• Hainbat hutsegite konpondu +• [YouTube] Kanalak kargatzea, jario ez-dedikatuak eta erreprodukzio-konponbideak herrialde batzuetan diff --git a/fastlane/metadata/android/eu/changelogs/992.txt b/fastlane/metadata/android/eu/changelogs/992.txt index 5b0dd96ba..d7f52bf43 100644 --- a/fastlane/metadata/android/eu/changelogs/992.txt +++ b/fastlane/metadata/android/eu/changelogs/992.txt @@ -1,17 +1,17 @@ -Zer berri -• Harpidetza kopurua bideoen xehetasunetan -• Ilaratik deskargatu -• Erreprodukzio-zerrendei betirako izango den miniatura ezarri -• Luze sakatu traola eta estekentzako -• Txartel-bista modua +Berria +• Harpidedun kopurua bideoaren xehetasunetan +• Deskargatu ilaratik +• Zerrenda miniatura behin betiko ezarri +• Sakatu luze traolak eta estekak +• Txartelen ikuspegi modua -Hobekuntzak -• Mini-erreproduzitzailearen ixteko botoi handiago bat -• Miniaturen eskala murrizketa arinagoa -• Android 13 (API 33) -• Bilaketak ez du erreprodukzioa geldiaraziko +Hobetua +• Mini-erreproduzitzailearen ixteko botoia handiagoa +• Miniaturen eskala txikiagotzea leunagoa +• Helburua Android 13 (API 33) +• Bilatzeak ez du jokalaria pausatzen -Konponketak -• DeX/saguaren gainezarpena konpondua -• Bigarren planoko erreprodukzioa baimendu bereizitako bi audio-jariorik gabe -• YouTube-kin zeuden arazoak konpondu eta are gehiago… +Konpondua +• Gainjartzea DeX/saguaren gainean konpondu +• Atzeko planoan audio-jariorik gabe baimendu +• Hainbat YouTube konponketa eta gehiago diff --git a/fastlane/metadata/android/eu/changelogs/993.txt b/fastlane/metadata/android/eu/changelogs/993.txt new file mode 100644 index 000000000..c8d24db0f --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/993.txt @@ -0,0 +1,12 @@ +Berria +• Gehitu abisua erreprodukzio-zerrenda bikoiztuak gehitzean eta gehitu botoia kentzeko +• Hardware botoiak baztertzea baimendu +• Jarioan partzialki ikusitako bideoak ezkutatzea baimendu + +Hobetua +• Erabili sareta-zutabe gehiago pantaila handietan +• Aurrerapen adierazleak ezarpenekin bat etorriz egin + +Konpondua +• Konpondu arakatzailearen URLak, deskargak eta kanpoko erreproduzitzaileak irekitzeko arazoak Android 11+-n +• MIUI-n bi ukitu behar izatearen pantaila osoko interakzioa konpondu diff --git a/fastlane/metadata/android/eu/changelogs/994.txt b/fastlane/metadata/android/eu/changelogs/994.txt new file mode 100644 index 000000000..0b54ba569 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/994.txt @@ -0,0 +1,15 @@ +Berria +• Audio pista eta hizkuntza anitz onartzen ditu +• Bolumen eta distira keinuak pantailaren edozein aldetan ezarri +• Fitxa nagusiak pantailaren behealdean bistaratzeko laguntza + +Hobetua +• [Bandcamp] Ordainpeko hormaren atzean dauden abestiak kudeatu + +Konpondua +• [YouTube] 403 HTTP erroreak erreprodukzioetarako +• Jokalari beltza zerrendaren ikuspegitik nagusira aldatzean +• Jokalarien zerbitzuaren memoria-ihesa +• [PeerTube] Igotzailearen eta azpikanalaren avatarrak trukatu + +eta gehiago diff --git a/fastlane/metadata/android/eu/changelogs/995.txt b/fastlane/metadata/android/eu/changelogs/995.txt new file mode 100644 index 000000000..1db316b4c --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/995.txt @@ -0,0 +1,16 @@ +Berria +• Kanal fitxak laguntza +• Hautatu irudiaren kalitatea +• Irudi guztien URLak lortu + +Hobetua +• Jokalarien interfazeen irisgarritasuna +• Bideo-deskargetarako audio-hautaketa hobea +• Partekatutako zerrendetan izenak sartzeko aukera + +Konpondua +• [YouTube] Atsegin dut kopurua lortzea +• Erreproduzitzaileak erantzuten ez duen leihoak eta kraskadurak +• Hizkuntza hautatzailean hizkuntza okerrak hautatzea +• Audioaren fokuak isilaraztea errespetatu +• Zerrendako elementuen gehikuntzak diff --git a/fastlane/metadata/android/eu/changelogs/996.txt b/fastlane/metadata/android/eu/changelogs/996.txt new file mode 100644 index 000000000..8a3c936dd --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/996.txt @@ -0,0 +1,2 @@ +NullPointerException bat konpondu da media.ccc.de-n kanal/konferentzia bat irekitzean. +Grinch-a gure Gabonetako oparia apurtzen saiatu zen, baina konpondu dugu. diff --git a/fastlane/metadata/android/eu/changelogs/998.txt b/fastlane/metadata/android/eu/changelogs/998.txt new file mode 100644 index 000000000..931876cb5 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/998.txt @@ -0,0 +1,4 @@ +Konpondu da YouTube-k ez zuela inolako erreprodukziorik erreproduzitzen HTTP 403 erroreengatik. + +YouTube bideo baten erdian noizbehinkako HTTP 403 erroreak ez dira oraindik konpondu. +Arazo hori ahalik eta azkarren konponduko da beste hotfix bertsio batean. diff --git a/fastlane/metadata/android/eu/changelogs/999.txt b/fastlane/metadata/android/eu/changelogs/999.txt new file mode 100644 index 000000000..b461e2b5b --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/999.txt @@ -0,0 +1,12 @@ +Bertsio honek YouTube bideoen erdian dauden HTTP 403 erroreak konpontzen ditu. + +Berria +• [SoundCloud] Gehitu URLaren euskarria on.soundcloud.com webgunean + +Hobetua +• [Bandcamp] Erakutsi informazio gehigarria irrati-kioskoan + +Zuzenduta +• [YouTube] Bideoen hasieran edo erdian noizbehinkako HTTP 403 erroreak konpondu dira. +• [YouTube] Atera avatarra eta bannerra kanal goiburu mota gehiagotatik +• [Bandcamp] Hainbat akats konpontzen ditu eta beti HTTPS erabiltzen du diff --git a/fastlane/metadata/android/lmo/full_description.txt b/fastlane/metadata/android/lmo/full_description.txt new file mode 100644 index 000000000..6a6055c29 --- /dev/null +++ b/fastlane/metadata/android/lmo/full_description.txt @@ -0,0 +1 @@ +NewPipe al drœva nissuna libreria framework del Google o l'API del YouTube. Al scandiss domà el sit web per ciapar su i informazione de qe n'ha bisogn. Per qella rexon qì qell'aplicazion qì la pœl vesser doperada ind aparecc senza i Servizi Google installad. G'è nanca bisogn d'haver-g un cunt YouTube per doperar NewPipe e a l'è FLOSS. diff --git a/fastlane/metadata/android/lmo/short_description.txt b/fastlane/metadata/android/lmo/short_description.txt new file mode 100644 index 000000000..417963085 --- /dev/null +++ b/fastlane/metadata/android/lmo/short_description.txt @@ -0,0 +1 @@ +Un frontend YouTube ligier per Android. diff --git a/fastlane/metadata/android/lv/changelogs/63.txt b/fastlane/metadata/android/lv/changelogs/63.txt index 94c6a06df..585d8b461 100644 --- a/fastlane/metadata/android/lv/changelogs/63.txt +++ b/fastlane/metadata/android/lv/changelogs/63.txt @@ -1,8 +1,8 @@ ### Uzlabojumi -- Iestatījumu importēšana/eksportēšana #1333 +- Ievietot/izgūt iestatījumus #1333 - Samazināts pārzīmēšanas skaits (veiktspējas uzlabojums) #1371 - Nelieli koda uzlabojumi #1375 -- Pievienots viss par GDPR #1420 +- Pievienota visa informācija par GDPR #1420 ### Salabots -- Lejupielādētājs: Salabota lietotnes nobrukšana turpinot lejupielādēt nepabeigtās .giga failu lejupielādes #1407 +- Lejupielādētājs: Salabota lietotnes nobrukšana ielādējot nepabeigtās .giga datņu lejupielādes #1407 diff --git a/fastlane/metadata/android/tr/changelogs/1006.txt b/fastlane/metadata/android/tr/changelogs/1006.txt new file mode 100644 index 000000000..9e5d704a4 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/1006.txt @@ -0,0 +1,19 @@ +# Geliştirmeler (Improved) + +* Zaman damgalarına tıklandığında mevcut oynatıcıyı koru. +* Mümkün olduğunda bekleyen indirme görevlerini kurtarmayı dene. +* Dosyayı silmeden sadece indirme kaydını silme seçeneği ekle. +* Üstte Gösterim İzni: Android R ve üzeri için açıklayıcı iletişim kutusu göster. +* "on.soundcloud" bağlantılarını açma desteği. +* Çok sayıda küçük iyileştirme ve optimizasyon. + +# Düzeltmeler (Fixed) + +* Android 7 altı sürümler için kısa sayı formatını düzelt. +* Hayalet bildirimleri düzelt. +* SRT altyazı dosyaları için düzeltmeler. +* Çok sayıda çökme sorunu giderildi. + +# Geliştirme (Development) + +* Dahili kod modernizasyonu. diff --git a/fastlane/metadata/android/tr/changelogs/997.txt b/fastlane/metadata/android/tr/changelogs/997.txt index ef0368d18..0dfeb5dd4 100644 --- a/fastlane/metadata/android/tr/changelogs/997.txt +++ b/fastlane/metadata/android/tr/changelogs/997.txt @@ -1,17 +1,17 @@ -Yeni -• Yorum yanıtları ekle -• Oynatma listelerini yeniden sıralamaya izin ver -• Oynatma listesi açıklamasını ve süresini göster -• Ayarların sıfırlanmasına izin ver +# Yeni +• Yorum yanıtları eklendi +• Oynatma listelerini yeniden sıralama +• Liste açıklaması ve süresi gösterimi +• Ayarları sıfırlama özelliği -İyileştirildi -• [Android 13+] Özel bildirim eylemlerini geri yükle -• Güncelleme denetimi için onay iste -• Arabelleğe alma sırasında bildirim oynatma/duraklatmaya izin ver -• Bazı ayarları yeniden sırala +# İyileştirmeler +• [Android 13+] Özel bildirim eylemleri geri getirildi +• Güncelleme kontrolü için onay isteme +• Arabelleğe alma sırasında oynat/duraklat +• Ayarlar yeniden düzenlendi -Düzeltildi -• [YouTube] Yorumların yüklenmemesini düzelt, ayrıca diğer düzeltmeler ve iyileştirmeler -• Ayarların içe aktarılmasındaki güvenlik açığını çöz ve JSON'a geç -• Çeşitli indirme düzeltmeleri -• Arama metnini kırp +# Düzeltmeler +• [YouTube] Yorumların yüklenmeme sorunu giderildi +• Ayar içe aktarma güvenlik açığı giderildi, JSON'a geçildi +• İndirme sorunları giderildi +• Arama metni düzeltmeleri From d53f7acfa4339309f48da0ff47ed433bf4037b9d Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Wed, 28 Jan 2026 03:26:36 +0100 Subject: [PATCH 186/190] Translated using Weblate (Somali) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 71.5% (547 of 764 strings) Translated using Weblate (Somali) Currently translated at 71.5% (547 of 764 strings) Translated using Weblate (Danish) Currently translated at 98.5% (753 of 764 strings) Translated using Weblate (Danish) Currently translated at 98.5% (753 of 764 strings) Translated using Weblate (Kurdish (Central)) Currently translated at 80.4% (615 of 764 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 73.5% (562 of 764 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 73.5% (562 of 764 strings) Translated using Weblate (Hungarian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Hungarian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Georgian) Currently translated at 92.5% (707 of 764 strings) Translated using Weblate (Kurdish) Currently translated at 60.9% (466 of 764 strings) Translated using Weblate (Catalan) Currently translated at 96.0% (734 of 764 strings) Translated using Weblate (Catalan) Currently translated at 96.0% (734 of 764 strings) Translated using Weblate (Greek) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (French) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (French) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Japanese) Currently translated at 95.5% (730 of 764 strings) Translated using Weblate (Belarusian) Currently translated at 98.8% (755 of 764 strings) Translated using Weblate (Vietnamese) Currently translated at 99.3% (759 of 764 strings) Translated using Weblate (Odia) Currently translated at 95.2% (728 of 764 strings) Translated using Weblate (Russian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Russian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Korean) Currently translated at 98.4% (752 of 764 strings) Translated using Weblate (Korean) Currently translated at 98.4% (752 of 764 strings) Translated using Weblate (Interlingua) Currently translated at 31.1% (238 of 764 strings) Translated using Weblate (Interlingua) Currently translated at 31.1% (238 of 764 strings) Translated using Weblate (Indonesian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Indonesian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.5% (142 of 764 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Turkish) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Turkish) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Arabic (Libya)) Currently translated at 93.4% (714 of 764 strings) Translated using Weblate (Slovak) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Azerbaijani) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Lithuanian) Currently translated at 98.9% (756 of 764 strings) Translated using Weblate (Lithuanian) Currently translated at 98.9% (756 of 764 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Czech) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Asturian) Currently translated at 60.6% (463 of 764 strings) Translated using Weblate (Asturian) Currently translated at 60.6% (463 of 764 strings) Translated using Weblate (Hebrew) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Hebrew) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Sardinian) Currently translated at 97.9% (748 of 764 strings) Translated using Weblate (Sardinian) Currently translated at 97.9% (748 of 764 strings) Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 95.1% (727 of 764 strings) Translated using Weblate (Albanian) Currently translated at 76.3% (583 of 764 strings) Translated using Weblate (Albanian) Currently translated at 76.3% (583 of 764 strings) Translated using Weblate (Nepali) Currently translated at 56.2% (430 of 764 strings) Translated using Weblate (Nepali) Currently translated at 56.2% (430 of 764 strings) Translated using Weblate (Finnish) Currently translated at 94.2% (720 of 764 strings) Translated using Weblate (Finnish) Currently translated at 94.2% (720 of 764 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 59.2% (453 of 764 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 59.2% (453 of 764 strings) Translated using Weblate (Punjabi) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Kurdish (Northern)) Currently translated at 62.5% (478 of 764 strings) Translated using Weblate (Kurdish (Northern)) Currently translated at 62.5% (478 of 764 strings) Translated using Weblate (Icelandic) Currently translated at 98.1% (750 of 764 strings) Translated using Weblate (N’Ko) Currently translated at 85.7% (655 of 764 strings) Translated using Weblate (Croatian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Serbian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Serbian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Ukrainian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Ukrainian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Bengali) Currently translated at 74.2% (567 of 764 strings) Translated using Weblate (German) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (German) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Romanian) Currently translated at 97.6% (746 of 764 strings) Translated using Weblate (Romanian) Currently translated at 97.6% (746 of 764 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (ryu (generated) (ryu)) Currently translated at 95.2% (728 of 764 strings) Translated using Weblate (Arabic) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Galician) Currently translated at 95.2% (728 of 764 strings) Translated using Weblate (Galician) Currently translated at 95.2% (728 of 764 strings) Translated using Weblate (Italian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Italian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Dutch) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Dutch) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Estonian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Estonian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Bulgarian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Bulgarian) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Malayalam) Currently translated at 73.0% (558 of 764 strings) Translated using Weblate (Malayalam) Currently translated at 73.0% (558 of 764 strings) Translated using Weblate (Swedish) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Swedish) Currently translated at 99.7% (762 of 764 strings) Translated using Weblate (Persian) Currently translated at 95.6% (731 of 764 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 89.9% (687 of 764 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 89.9% (687 of 764 strings) Translated using Weblate (Polish) Currently translated at 99.7% (762 of 764 strings) Co-authored-by: 2-Seol <2Seol.0117@gmail.com> Co-authored-by: Agnieszka C Co-authored-by: Ajeje Brazorf Co-authored-by: Allan Nordhøy Co-authored-by: Andreas Westrell Co-authored-by: Anonymous Co-authored-by: Anxhelo Lushka Co-authored-by: AudricV Co-authored-by: Aurelian Ciocîltan Co-authored-by: Bakary Kaba Co-authored-by: Balázs Meskó Co-authored-by: ButterflyOfFire Co-authored-by: D D Co-authored-by: David Rebolo Magariños Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Dormin Co-authored-by: Emin Tufan Çetin Co-authored-by: Enol P. Co-authored-by: Femini Co-authored-by: Fjuro Co-authored-by: Francesco Saltori Co-authored-by: GET100PERCENT Co-authored-by: Guillem Co-authored-by: Hakim Oubouali Co-authored-by: Hoseok Seo Co-authored-by: Igor Nedoboy Co-authored-by: Ishwor Ghimire Co-authored-by: Kiss Attila Co-authored-by: Ldm Public Co-authored-by: MS-PC Co-authored-by: Marian Hanzel Co-authored-by: Mathias Hamza Vedsted-Mirza Co-authored-by: Mickaël Binos Co-authored-by: Milo Ivir Co-authored-by: Mukhamadjonov Co-authored-by: NEXI Co-authored-by: Nadir Nour Co-authored-by: Nikoloz Co-authored-by: Olivia Ng Co-authored-by: Oymate Co-authored-by: Philip Goto Co-authored-by: Priit Jõerüüt Co-authored-by: SecularSteve Co-authored-by: ShareASmile Co-authored-by: Sveinn í Felli Co-authored-by: Sérgio Marques Co-authored-by: Theophine Savio Theodore Co-authored-by: Ville Rantanen Co-authored-by: Yaron Shahrabani Co-authored-by: cat Co-authored-by: cehnemdark Co-authored-by: gymka Co-authored-by: nautilusx Co-authored-by: ngocanhtve Co-authored-by: winqooq Co-authored-by: zmni Co-authored-by: Макар Разин Co-authored-by: Слободан Симић(Slobodan Simić) --- app/src/main/res/values-ar-rLY/strings.xml | 3 +-- app/src/main/res/values-ar/strings.xml | 3 +-- app/src/main/res/values-az/strings.xml | 5 ++--- app/src/main/res/values-b+ast/strings.xml | 5 ++--- app/src/main/res/values-b+uz+Latn/strings.xml | 5 ++--- app/src/main/res/values-be/strings.xml | 2 +- app/src/main/res/values-bg/strings.xml | 5 ++--- app/src/main/res/values-bn/strings.xml | 2 +- app/src/main/res/values-ca/strings.xml | 5 ++--- app/src/main/res/values-ckb/strings.xml | 3 +-- app/src/main/res/values-cs/strings.xml | 3 +-- app/src/main/res/values-da/strings.xml | 5 ++--- app/src/main/res/values-de/strings.xml | 5 ++--- app/src/main/res/values-el/strings.xml | 3 +-- app/src/main/res/values-es/strings.xml | 5 ++--- app/src/main/res/values-et/strings.xml | 5 ++--- app/src/main/res/values-fa/strings.xml | 3 +-- app/src/main/res/values-fi/strings.xml | 5 ++--- app/src/main/res/values-fr/strings.xml | 4 ++-- app/src/main/res/values-gl/strings.xml | 5 ++--- app/src/main/res/values-he/strings.xml | 5 ++--- app/src/main/res/values-hi/strings.xml | 5 ++--- app/src/main/res/values-hr/strings.xml | 5 ++--- app/src/main/res/values-hu/strings.xml | 5 ++--- app/src/main/res/values-ia/strings.xml | 5 ++--- app/src/main/res/values-in/strings.xml | 5 ++--- app/src/main/res/values-is/strings.xml | 3 +-- app/src/main/res/values-it/strings.xml | 5 ++--- app/src/main/res/values-ja/strings.xml | 3 +-- app/src/main/res/values-ka/strings.xml | 5 ++--- app/src/main/res/values-kmr/strings.xml | 5 ++--- app/src/main/res/values-ko/strings.xml | 5 ++--- app/src/main/res/values-ku/strings.xml | 3 +-- app/src/main/res/values-lt/strings.xml | 5 ++--- app/src/main/res/values-ml/strings.xml | 5 ++--- app/src/main/res/values-nb-rNO/strings.xml | 5 ++--- app/src/main/res/values-ne/strings.xml | 6 ++---- app/src/main/res/values-nl-rBE/strings.xml | 5 ++--- app/src/main/res/values-nl/strings.xml | 5 ++--- app/src/main/res/values-nqo/strings.xml | 3 +-- app/src/main/res/values-or/strings.xml | 5 ++--- app/src/main/res/values-pa/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 5 ++--- app/src/main/res/values-pt-rBR/strings.xml | 3 +-- app/src/main/res/values-pt-rPT/strings.xml | 5 ++--- app/src/main/res/values-pt/strings.xml | 5 ++--- app/src/main/res/values-ro/strings.xml | 5 ++--- app/src/main/res/values-ru/strings.xml | 5 ++--- app/src/main/res/values-ryu/strings.xml | 3 +-- app/src/main/res/values-sc/strings.xml | 5 ++--- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-so/strings.xml | 5 ++--- app/src/main/res/values-sq/strings.xml | 5 ++--- app/src/main/res/values-sr/strings.xml | 5 ++--- app/src/main/res/values-sv/strings.xml | 5 ++--- app/src/main/res/values-tr/strings.xml | 5 ++--- app/src/main/res/values-tzm/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 5 ++--- app/src/main/res/values-vi/strings.xml | 3 +-- app/src/main/res/values-zh-rCN/strings.xml | 3 +-- app/src/main/res/values-zh-rHK/strings.xml | 3 +-- 61 files changed, 102 insertions(+), 158 deletions(-) diff --git a/app/src/main/res/values-ar-rLY/strings.xml b/app/src/main/res/values-ar-rLY/strings.xml index 4cf7e20dd..ad411ab1e 100644 --- a/app/src/main/res/values-ar-rLY/strings.xml +++ b/app/src/main/res/values-ar-rLY/strings.xml @@ -428,8 +428,7 @@ هذا الإذن مطلوب \nللفتح في وضع النافذة المنبثقة الموجز - ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل. -\nهل أنت واثق؟ لا يمكن التراجع عن هذا! + ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل. \nهل أنت واثق؟ لا يمكن التراجع عن هذا! عدم الإعجاب مشاهدة على الموقع هذا الخيار متاح فقط إذا تم تحديد %s للسمة diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 20d42dc61..51a1e47cb 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -548,8 +548,7 @@ \n \nقم بتشغيل \"%1$s\" في الإعدادات إذا كنت تريد رؤيته. نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا - ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل. -\nهل أنت واثق؟ لا يمكن التراجع عن هذا! + ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل. \nهل أنت واثق؟ لا يمكن التراجع عن هذا! إزالة مقاطع الفيديو التي تمت مشاهدتها؟ إزالة ما تمت مشاهدته ستكون النصوص الأصلية من الخدمات مرئية في عناصر البث diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 07c7ba2ad..d1d2c8bd9 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -397,8 +397,7 @@ Server çox iş parçalı endirmələri qəbul etmir, @string/msg_threads = 1 ilə yenidən cəhd edin Bütün endirilmiş fayllar diskdən silinsin\? Maksimum təkrar cəhdlər - Pleylistə əlavə olunandan əvvəl və sonrakı baxılmış videolar silinəcək. -\nSiz əminsiniz? Bu geri qaytarıla bilməz! + Pleylistə əlavə olunandan əvvəl və sonrakı baxılmış videolar silinəcək. \nSiz əminsiniz? Bu geri qaytarıla bilməz! Kanal qrupları Yeni axın elementləri Abunəlik köhnəlmiş hesab edilənə qədərki son yeniləmədən sonrakı vaxt — %s @@ -529,7 +528,7 @@ ExoPlayer standartı Mövcud olduqda xüsusi axından al - Baxılmış videolar silinsin\? + Baxılmış videolar silinsin? İzləniləni sil Sistem qovluğu seçicisini (SAF) istifadə et Bağlantı fasiləsi diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index f89bb1ad7..c64972eb3 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -313,9 +313,8 @@ Grupos de canales Pola mor de les torgues d\'ExoPlayer la duración afitóse en %d segundos Sí, y tamién los vistos parcialmente - Van desaniciase los vídeos que se vieren enantes y dempués d\'amestase a la llista de reproducción. -\n¿De xuru\? ¡Esto nun pue desfacese! - ¿Desaniciar los vídeos vistos\? + Van desaniciase los vídeos que se vieren enantes y dempués d\'amestase a la llista de reproducción. \n¿De xuru? ¡Esto nun pue desfacese! + ¿Desaniciar los vídeos vistos? Desaniciar lo visto Escoyeta d\'una instancia El «Storage Access Framework» permite les descargues nuna tarxeta SD esterna. diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index be009d792..cc82ec69c 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -385,9 +385,8 @@ ExoPlayer cheklovlari tufayli qidiruv davomiyligi %d soniya qilib belgilandi Ha, va qisman videolarni tomosha qildim - Pleylistga qo\'shilishdan oldin va keyin ko\'rilgan videolar o\'chiriladi. -\nIshonchingiz komilmi\? Buni qaytarib bo\'lmaydi! - Ko\'rilgan videolar olib tashlansinmi\? + Pleylistga qo\'shilishdan oldin va keyin ko\'rilgan videolar o\'chiriladi. \nIshonchingiz komilmi? Buni qaytarib bo\'lmaydi! + Ko\'rilgan videolar olib tashlansinmi? Ko\'rilganlarni olib tashlash Tizimning standart qiymati Ilova tili diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index f222a0f41..e44d2ea5c 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -616,7 +616,7 @@ Апрацоўка стужкі… Пры кожным спампоўванні вам будзе прапанавана выбраць месца захавання Загрузка канала… - Выдаліць прагледжаныя відэа\? + Выдаліць прагледжаныя відэа? Так, часткова прагледжаныя відэа таксама Працэнт Відэа, якія прагледжаны перад дадаваннем і пасля дадавання ў спіс прайгравання, будуць выдалены. \nВы ўпэўнены? Гэта дзеянне немагчыма скасаваць! diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 79e308f3d..a038ac07b 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -464,8 +464,7 @@ \nЕвентуално може да бъде поддържано в бъдещи версии. Обработка… Ще отнеме момент Поради ограничения в ExoPlayer, стъпката за превъртане е зададена на %d секунди - Видата, които са били изгледани преди и след добавянето към плейлиста ще бъдат премахнати. -\nСигурни ли сте\? Това не може да бъде отменено! + Видата, които са били изгледани преди и след добавянето към плейлиста ще бъдат премахнати. \nСигурни ли сте? Това не може да бъде отменено! „Storage Access Framework“ позволява изтегляния във външна SD-карта Започни изтеглянията Затвори @@ -501,7 +500,7 @@ Създаден от %s Съдържанието е достъпно само за хора, които са си платили, затова не може да бъде гледано или изтеглено с NewPipe. Това видео е достъпно за абонати на YouTube Music Premium, затова не може да бъде гледано или изтеглено с NewPipe. - Премахни изгледаните видеа\? + Премахни изгледаните видеа? Да, както и само частично изгледаните видеа Брой на абонати не е наличен Инстанцията вече съществува diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 0190f50ce..7a4c8b3b0 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -434,7 +434,7 @@ খালি গ্রুপ নাম কোনো সদস্যতা নির্বাচিত হয়নি %d: লোড হয়নি - দেখা ভিডিওগুলো সরাও\? + দেখা ভিডিওগুলো সরাও? একটি ইন্সট্যান্স নাও ডাউনলোড সারি সীমিত করো অনন্য নাম বানাও diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index b8fe195ea..ff12819f5 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -509,9 +509,8 @@ A causa de les limitacions d\'ExoPlayer, la durada de cerca és de %d segons Sí, i també els vídeos vistos parcialment - Els vídeos que ja heu vist tant abans com després d\'haver estat afegits a la llista de reproducció seran suprimits. -\nN\'esteu segurs\? Aquesta acció no pot desfer-se! - Esborrar els vídeos ja vistos\? + Els vídeos que ja heu vist tant abans com després d\'haver estat afegits a la llista de reproducció seran suprimits. \nN\'esteu segurs? Aquesta acció no pot desfer-se! + Esborrar els vídeos ja vistos? Esborra els ja vistos Valors per defecte Llengua de l\'aplicació diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 6bb843e04..d448c1118 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -191,8 +191,7 @@ باشترین ٥٠ تەنها بەستەرەکانی https پشتگیریکراون پەیوەستبوونی پارێزراو هه‌ره‌سی هێنا - ئەو ڤیدیۆیانەی پێشتر سەیرت کردوون و دواتر زیادت کردوون بۆ خشتەلێدان لادەدرێن. -\nئایا دڵنیایت؟ ئەمە ناگەڕێنرێتەوە! + ئەو ڤیدیۆیانەی پێشتر سەیرت کردوون و دواتر زیادت کردوون بۆ خشتەلێدان لادەدرێن. \nئایا دڵنیایت؟ ئەمە ناگەڕێنرێتەوە! وێنۆچکەی سه‌روێنه‌ی کەناڵ دەتەوێت ڕێکخستنەکانیش هاوردە بكرینه‌وه‌؟ هیچ لێدەرێکی ڤیدیۆیی نه‌دۆزرایه‌وه‌. ده‌ته‌وێت VLC دابمەزرێنیت؟ diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 5c6a6b251..ce64e46db 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -520,8 +520,7 @@ Ano, i zčásti zhlédnutá videa Odstranit zhlédnutá videa? Odstranit zhlédnutá - Videa, která jste zhlédli před a po jejich přidání do playlistu, budou odstraněna. -\nJste se jisti? Tato akce je nevratná! + Videa, která jste zhlédli před a po jejich přidání do playlistu, budou odstraněna. \nJste se jisti? Tato akce je nevratná! Původní texty služeb budou viditelné u položek streamů U položek zobrazit původní čas Zapnout „Omezený režim“ YouTube diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 8021bd64c..f3a25e3b7 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -523,7 +523,7 @@ gendanner \"Hurtig feed\"-tilstand oplyser ikke mere info om dette. Tjek efter opdateringer - Fjern sete videoer\? + Fjern sete videoer? Deaktivér medietunneling, hvis du oplever en sort skærm eller hakken ved videoafspilning. Tjek venligst, om der allerede findes et problem, der diskuterer dit nedbrud. Når du opretter flere tickets, tager du tid fra os, som vi kunne bruge på at løse den faktiske fejl. Tjek efter nye streams @@ -541,8 +541,7 @@ Vælg abonnementer Dette indhold er ikke tilgængeligt i dit land. Af %s - Videoer, der er blevet set før og efter tilføjelse til playlisten, vil blive fjernet. -\nEr du sikker? Dette kan ikke fortrydes! + Videoer, der er blevet set før og efter tilføjelse til playlisten, vil blive fjernet. \nEr du sikker? Dette kan ikke fortrydes! Vis miniaturebillede Tags Aldersbegrænsning diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ebb734b04..b07151585 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -516,11 +516,10 @@ Dieses Video ist altersbeschränkt. \n \nAktiviere in den Einstellungen „%1$s“, falls du diese sehen möchtest. - Videos, die vor und nach dem Hinzufügen zur Wiedergabeliste angeschaut wurden, werden entfernt. -\nBist du sicher\? Dies kann nicht rückgängig gemacht werden! + Videos, die vor und nach dem Hinzufügen zur Wiedergabeliste angeschaut wurden, werden entfernt. \nBist du sicher? Dies kann nicht rückgängig gemacht werden! Ja, und teilweise gesehene Videos Gesehene entfernen - Gesehene Videos entfernen\? + Gesehene Videos entfernen? Originalzeit vor Elementen anzeigen Originaltexte von Diensten werden in Stream-Elementen sichtbar sein YouTubes „Eingeschränkten Modus“ aktivieren diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 22f8ef447..7c23666d5 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -525,8 +525,7 @@ Λόγω περιορισμών του ExoPlayer, η διάρκεια αναζήτησης ορίστηκε στα %d δευτερόλεπτα Ναι. Και τα μερικώς θεαθέντα βίντεο - Τα βίντεο που εθεάθησαν πριν και αφού προστέθηκαν στη λίστα αναπαραγωγής θα απομακρυνθούν -\nΕίστε σίγουρος; Δεν μπορεί να αναιρεθεί! + Τα βίντεο που εθεάθησαν πριν και αφού προστέθηκαν στη λίστα αναπαραγωγής θα απομακρυνθούν \nΕίστε σίγουρος; Δεν μπορεί να αναιρεθεί! Απομάκρυνση θεαθέντων βίντεο; Απομάκρυνση όσων θεάθησαν Γλώσσα εφαρμογής diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 5a6b1bd20..a2ab5ca52 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -513,9 +513,8 @@ Canciones Este vídeo tiene restricción de edad. \n \nHabilitar \"%1$s\" en los ajustes si quieres verlo. Sí, y también vídeos vistos parcialmente - Los vídeos que ya se hayan visto luego de añadidos a la lista de reproducción, serán quitados. -\n¿Estás seguro\? ¡Esta acción no se puede deshacer! - ¿Quitar vídeos ya vistos\? + Los vídeos que ya se hayan visto luego de añadidos a la lista de reproducción, serán quitados. \n¿Estás seguro? ¡Esta acción no se puede deshacer! + ¿Quitar vídeos ya vistos? Quitar vídeos ya vistos Por %s Creado por %s diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index dfebedacb..0ede00587 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -530,10 +530,9 @@ %d sekund %d sekundit - Sellega eemaldame vaadatud videod ja esitusloendisse lisatud videod. -\nKas sa oled kindel\? Seda tegevust ei saa hiljem tagasi pöörata! + Sellega eemaldame vaadatud videod ja esitusloendisse lisatud videod. \nKas sa oled kindel? Seda tegevust ei saa hiljem tagasi pöörata! Jah, sealhulgas videod, mille vaatmine jäi pooleli - Kas eemaldame vaadatud videod\? + Kas eemaldame vaadatud videod? Eemalda vaadatud videod Kasuta süsteemi keelt Rakenduse keel diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 58ce1d63a..cd2d1ec32 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -500,8 +500,7 @@ نمایش اشتراک های دسته بندی نشده آواتار بندانگشتی کانال صفحه فهرست پخش - ویدیوهایی که پیش و‌ پس از افزوده شدن به سیاههٔ پخش دیده شده‌اند حذف خواهند شد. -\nمطمئنید؟ این کار قابل بازگشت نیست! + ویدیوهایی که پیش و‌ پس از افزوده شدن به سیاههٔ پخش دیده شده‌اند حذف خواهند شد. \nمطمئنید؟ این کار قابل بازگشت نیست! گزارش اجباری خطاهای Rx غیرقابل تحویل خارج از چرخه حیات فعالیت یا بخش پس از اتمام فکر می‌کنید دریافت خوراک بیش از حد آهسته است؟ اگر چنین است، بارگیری سریع را فعالی کنید (می‌توانید آن را در تنظیمات یا با فشردن دکمه زیر تغییر دهید) \n diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 4764f69d5..3f66a85eb 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -392,9 +392,8 @@ Näytä toistokohtien osoittimet listoissa Kohdat listoissa Palauta edellinen toistokohta - Aiemmin katsotut ja soittolistaan lisätyt videot poistetaan. -\nOletko varma\? Tätä ei voi peruuttaa! - Poistetaanko katsotut videot\? + Aiemmin katsotut ja soittolistaan lisätyt videot poistetaan. \nOletko varma? Tätä ei voi peruuttaa! + Poistetaanko katsotut videot? Kyllä ja osittain katsotut videot Pysäytä Tyhjennä lataushistoria diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 03fce16e4..2977d982e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -522,8 +522,8 @@ \nActivez « %1$s » dans les paramètres si vous voulez la voir. Supprimer les vidéos visionnées Oui ainsi que les vidéos partiellement visionnées - Les vidéos qui ont été visionnées avant et après avoir été ajoutées à la playlist seront supprimées. \nÊtes-vous certain(e) ? Cette action est irréversible ! - Supprimer les vidéos visionnées \? + Les vidéos qui ont été visionnées avant et après avoir été ajoutées à la playlist seront supprimées. \nÊtes-vous certain(e) ? Cette action est irréversible ! + Supprimer les vidéos visionnées ? Miniature de l\'avatar de la chaine De %s Créé par %s diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 20519e53b..6c7fa3e3c 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -388,9 +388,8 @@ Debido ás restricións de ExoPlayer, a duración da busca estableceuse en %d segundos Si, e visualizou parcialmente estes vídeos - Eliminaranse os vídeos vistos antes e despois de seren engadidos á lista de reprodución. -\nEstás seguro\? Isto non se pode desfacer.! - Borrar todos os vídeos vistos\? + Eliminaranse os vídeos vistos antes e despois de seren engadidos á lista de reprodución. \nEstás seguro? Isto non se pode desfacer.! + Borrar todos os vídeos vistos? Eliminar o visto Sistema predeterminado Lingua do aplicativo diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index e85e9809b..c979ab229 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -528,10 +528,9 @@ \n \nיש להפעיל את „%1$s” בהגדרות כדי לצפות בו. כן, לרבות סרטונים שהפסקתי באמצע - סרטונים שלאחר שצפית בהם מופיע לרשימת הנגינה יוסרו. -\nלהמשיך\? זאת פעולה בלתי הפיכה! + סרטונים שלאחר שצפית בהם מופיע לרשימת הנגינה יוסרו. \nלהמשיך? זאת פעולה בלתי הפיכה! הסרת נצפו - להסיר סרטונים שנצפו\? + להסיר סרטונים שנצפו? הטקסט המקורי משירותים יופיע בפריטי התזרים הצגת לפני כמה זמן מקורי על פריטים הפעלת „מצב מוגבל” של YouTube diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index f9939f28b..5c7be01b4 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -483,7 +483,7 @@ %d सेकेंड %d सेकंड्स - देखे गए वीडियो हटायें\? + देखे गए वीडियो हटायें? देखे गए को हटा दें सिस्टम डिफ़ॉल्ट ऐप की भाषा @@ -671,8 +671,7 @@ चैनल विवरण दिखाएं आइटम्स का असल अपलोड समय दिखाएं सेवाओं से मूल पाठ स्ट्रीम आइटम में दिखाई देंगे - प्लेलिस्ट में शामिल, पहले और बाद में देखे जा चुके वीडियो हटा दिए जाएंगे। -\nक्या यक़ीनन आप ऐसा चाह्ते हैं\? इसे असंपादित नहीं किया जा सकेगा! + प्लेलिस्ट में शामिल, पहले और बाद में देखे जा चुके वीडियो हटा दिए जाएंगे। \nक्या यक़ीनन आप ऐसा चाह्ते हैं? इसे असंपादित नहीं किया जा सकेगा! %d मिनट %d मिनट्स diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 95043ca32..85a2fa367 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -437,7 +437,7 @@ Ograniči popis preuzimanja Koristi sustavksi birač mapa (SAF) Ukloni pregledano - Ukloni pogledana videa\? + Ukloni pogledana videa? %d sekunda %d sekunde @@ -510,8 +510,7 @@ Napredak je izgubljen, jer je datoteka izbrisana NewPipe se zatvorio tijekom rada s datotekom Stranica playliste - Videa koji su gledani prije i nakon dodavanja u playlistu će se ukloniti. -\nStvarno ih želiš ukloniti\? Ovo je nepovratna radnja! + Videa koji su gledani prije i nakon dodavanja u playlistu će se ukloniti. \nStvarno ih želiš ukloniti? Ovo je nepovratna radnja! Još nema zabilježenih playlista Odaberi playlistu obnavljanje diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index c3148d0c8..ad5ac913d 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -621,8 +621,7 @@ Adatvédelem Gyors mód letiltása Igen, és távolítsa el a részben megnézett videókat is - A videók, melyeket már megnézett miután a lejátszási listához adta őket, el lesznek távolítva. -\nBiztos benne\? Ez nem vonható vissza! + A videók, melyeket már megnézett miután a lejátszási listához adta őket, el lesznek távolítva. \nBiztos benne? Ez nem vonható vissza! A szolgáltatásokból származó eredeti szövegek láthatók lesznek a közvetítési elemeken Lejátszó összeomlasztása Képjelölők megjelenítése @@ -632,7 +631,7 @@ Frissítések keresése Ne jelenítse meg Megnézettek eltávolítása - Eltávolítja a megnézett videókat\? + Eltávolítja a megnézett videókat? %1$s letöltés törölve %1$s letöltés törölve diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index 11571ce2d..3b00674a5 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -163,10 +163,9 @@ Chronologia de recerca delite Exportar le chronologia, subscriptiones, listas de reproduction e configurationes Reimplaciar tu chronologia, subscriptiones e (optionalmente) configurationes currente - Le videos jam observate ante e post de esser addite al lista de reproduction essera removite. -\nSecur que tu vole\? Isto non pote disfacer se! + Le videos jam observate ante e post de esser addite al lista de reproduction essera removite. \nSecur que tu vole? Isto non pote disfacer se! Si, e le videos partialmente observate - Deler le videos observate\? + Deler le videos observate? Deler le videos observate %s visualisation diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index f2bf9f53d..003994de2 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -478,7 +478,7 @@ Album Lagu Ambil dari langganan aslinya jika tersedia - Buang video yang sudah ditonton\? + Buang video yang sudah ditonton? Buang ditonton Video ini dibatasi usia. \n @@ -487,8 +487,7 @@ \n \nSemoga akan didukung pada versi berikutnya. Iya, dan video yang ditonton sebagian - Video yang sudah ditonton sebelum dan sesudah ditambahkan ke daftar putar akan dibuang. -\nApakah Anda yakin\? Ini tidak bisa diurungkan! + Video yang sudah ditonton sebelum dan sesudah ditambahkan ke daftar putar akan dibuang. \nApakah Anda yakin? Ini tidak bisa diurungkan! Batal bisukan Bisukan Apakah Anda merasa pemuatan langganan sangat lambat\? Jika iya, coba nyalakan pemuatan cepat (Anda bisa mengubahnya di dalam pengaturan atau dengan menekan tombol di bawah) diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 52d22d795..9473f5f92 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -673,8 +673,7 @@ %1$s sóttum skrám eytt Fjöldi tilrauna áður en hætt er við niðurhal - Myndskeiðum sem skoðuð voru áður eða eftir að þeim var bætt við spilunarlistann verður eytt. -\nErtu viss? Það er ekki hægt að afturkalla þetta! + Myndskeiðum sem skoðuð voru áður eða eftir að þeim var bætt við spilunarlistann verður eytt. \nErtu viss? Það er ekki hægt að afturkalla þetta! Já og skoðuð að hluta Nota RSS ef tiltækt Hjartað af höfunda diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 7b8fcc0c8..10a3c976f 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -518,9 +518,8 @@ \n \nAttivare «%1$s» nelle Impostazioni per poterlo vedere. Sì, anche quelli visualizzati parzialmente - I video che sono stati visti prima e dopo essere stati aggiunti alla playlist verranno rimossi. -\nProcedere\? L\'azione è irreversibile! - Rimuovere i video già visti\? + I video che sono stati visti prima e dopo essere stati aggiunti alla playlist verranno rimossi. \nProcedere? L\'azione è irreversibile! + Rimuovere i video già visti? Rimuovi elementi visti Attiva la \"Modalità con restrizioni\" di YouTube I testi originali dei servizi saranno visibili negli elementi video diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 57ba676dc..d78a06547 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -497,8 +497,7 @@ この動画には年齢制限があります。 \n \n閲覧したい場合、設定から \"%1$s\" を有効化してください。 - プレイリストに追加される前も追加された後も視聴した動画はプレイリストから削除されます。 -\nよろしいですか?この操作は元に戻せません! + プレイリストに追加される前も追加された後も視聴した動画はプレイリストから削除されます。 \nよろしいですか?この操作は元に戻せません! はい、部分的に視聴した動画も削除します 視聴済みの動画を削除しますか? 視聴済みを削除 diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 68435d218..61b3ee523 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -482,7 +482,7 @@ აპლიკაციის ენა სისტემის ნაგულისხმევი ნანახის ამოღება - წაშალოთ ნანახი ვიდეოები\? + წაშალოთ ნანახი ვიდეოები? დიახ, და ნაწილობრივ ნანახი ვიდეოები ExoPlayer-ის შეზღუდვების გამო ძიების ხანგრძლივობა დაყენდა %d წამზე @@ -655,8 +655,7 @@ იკითხეთ, სად უნდა ჩამოტვირთოთ თქვენ მოგეთხოვებათ სად შეინახოთ თითოეული ჩამოტვირთვა. \n ჩართეთ სისტემის საქაღალდის ამომრჩევი (SAF), თუ გსურთ ჩამოტვირთოთ გარე SD ბარათზე - ვიდეოები, რომლებიც უყურეთ დასაკრავ სიაში დამატებამდე და მის შემდეგ, წაიშლება. -\n დარწმუნებული ხართ\? ამის გაუქმება შეუძლებელია! + ვიდეოები, რომლებიც უყურეთ დასაკრავ სიაში დამატებამდე და მის შემდეგ, წაიშლება. \n დარწმუნებული ხართ? ამის გაუქმება შეუძლებელია! NewPipe არის copyleft უფასო პროგრამული უზრუნველყოფა: თქვენ შეგიძლიათ გამოიყენოთ, შეისწავლოთ, გააზიაროთ და გააუმჯობესოთ იგი სურვილისამებრ. კონკრეტულად თქვენ შეგიძლიათ გადაანაწილოთ და/ან შეცვალოთ იგი GNU-ს ზოგადი საჯარო ლიცენზიის პირობებით, როგორც ეს გამოქვეყნებულია თავისუფალი პროგრამული უზრუნველყოფის ფონდის მიერ, ლიცენზიის მე-3 ვერსიით, ან (თქვენი სურვილისამებრ) ნებისმიერი შემდგომი ვერსიით. ავტო ცარიელი გვერდი diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index bb19054d5..f8da8d1a7 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -356,9 +356,8 @@ Ji ber astengiyên ExoPlayer dema lêgerînê li %d çirkeyan hate saz kirin Erê, û bi qismî vîdyoyan temaşe kir - Vîdyoyên ku berî û piştî ku li lîsteya lîsteyê hatine zêdekirin hatine temaşekirin, dê werin rakirin. -\nPiştrastin\? Ev nayê betal kirin! - Vîdyoyên temaşekirî rakin\? + Vîdyoyên ku berî û piştî ku li lîsteya lîsteyê hatine zêdekirin hatine temaşekirin, dê werin rakirin. \nPiştrastin? Ev nayê betal kirin! + Vîdyoyên temaşekirî rakin? Jê temaşe rakin Pergala wekî ku heyî Zimanê appê diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index a25ca6f96..39a985a96 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -480,7 +480,7 @@ %d초 - 시청 기록을 지우겠습니까\? + 시청 기록을 지우겠습니까? 시청 기록 지우기 재생목록 실행 URL을 인식할 수 없습니다. 다른 앱으로 여시겠습니까\? @@ -659,8 +659,7 @@ 구독 선택 일부 서비스에서 사용할 수 있으며 일반적으로 훨씬 빠르지만 제한된 양의 항목과 종종 불완전한 정보를 반환할 수 있습니다 (예: 기간 없음, 항목 유형, 라이브 상태 없음) 안드로이드 10부터 \'저장영역 접속 프레임워크\'만 지원됩니다 - 재생 목록에 추가되기 전과 후에 시청한 동영상은 제거됩니다. -\n확실합니까\? 이것은 취소 할 수 없습니다! + 재생 목록에 추가되기 전과 후에 시청한 동영상은 제거됩니다. \n확실합니까? 이것은 취소 할 수 없습니다! 화면 자동 회전이 잠겨 있는 경우 미니 플레이어에서 동영상을 시작하지 말고 바로 전체 화면 모드로 재생하세요. 전체 화면을 종료해서 미니 플레이어를 이용할 수도 있습니다 공식 라디오 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 16f708a14..e556fcf26 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -500,8 +500,7 @@ ئەلبوومەکان گۆرانییەکان بەڵێ، لەگەڵ ڤیدیۆ تەماشاکراوەکانەوە - ئەو ڤیدیۆیانەی پێشتر سەیرت کردوون و دواتر زیادت کردوون بۆ لیستەلێدان دەسڕێنەوە. -\nئایا دڵنیایت؟ ئەمە ناگەڕێنرێتەوە! + ئەو ڤیدیۆیانەی پێشتر سەیرت کردوون و دواتر زیادت کردوون بۆ لیستەلێدان دەسڕێنەوە. \nئایا دڵنیایت؟ ئەمە ناگەڕێنرێتەوە! ڤیدیۆ تەماشاکراوەکان بسڕێنەوە؟ سڕینەوەی تەماشاکراوەکان دەقە بنچینەییەکان لە خزمەتگوزارییەکانەوە لە بابەتی پەخشەکاندا دیار دەبن diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index bafefac6b..70700bb5d 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -519,8 +519,7 @@ Siekdami laikytis Europos bendrojo duomenų apsaugos reglamento (GDPR), atkreipiame jūsų dėmesį į NewPipe privatumo politiką. Prašome atidžiai ją perskaityti. \nNorėdami išsiųsti mums pranešimą apie klaidą, turite su ja sutikti. Prieinama kai kuriose tarnybose, paprastai yra daug greitesnė, tačiau gali grąžinti ribotą kiekį elementų ir dažnai neišsamią informaciją (pvz., nėra trukmės, elemento tipo, nėra tiesioginės būsenos) - Vaizdo įrašai, kurie buvo peržiūrėti prieš juos įtraukiant į grojaraštį ir po to, kai jie buvo įtraukti į grojaraštį, bus pašalinti. -\nAr tikrai\? To negalima atšaukti! + Vaizdo įrašai, kurie buvo peržiūrėti prieš juos įtraukiant į grojaraštį ir po to, kai jie buvo įtraukti į grojaraštį, bus pašalinti. \nAr tikrai? To negalima atšaukti! Tai \"SoundCloud Go+\" kūrinys, bent jau jūsų šalyje, todėl jo negalima transliuoti ar atsisiųsti per \"NewPipe\". Šio turinio \"NewPipe\" dar nepalaiko. \n @@ -564,7 +563,7 @@ Automatinis (įrenginio tema) Programa nulūžo Sukūrė %s - Pašalinti žiūrėtus video\? + Pašalinti žiūrėtus video? Įjungti greitą režimą Kanalo atnaujinimo slenkstis Tuščias grupės pavadinimas diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 8688b670a..2fce034d2 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -462,9 +462,8 @@ എക്സോപ്ലെയർ പരിമിതികൾ കാരണം തിരയൽ ദൈർഘ്യം %d സെക്കൻഡിലേക്ക് സജ്ജമാക്കി അതെ, അതിന്റെകൂടെ ഭാഗികമായി കണ്ട വീഡിയോകളും - പ്ലേലിസ്റ്റിലേക്ക് ചേർക്കുന്നതിന് മുമ്പും ശേഷവും കണ്ട വീഡിയോകൾ നീക്കംചെയ്യും. -\nനിങ്ങൾക്ക് ഉറപ്പാണോ\? ഇത് പഴയപടിയാക്കാൻ കഴിയില്ല! - കണ്ട വീഡിയോകൾ നീക്കംചെയ്യണോ\? + പ്ലേലിസ്റ്റിലേക്ക് ചേർക്കുന്നതിന് മുമ്പും ശേഷവും കണ്ട വീഡിയോകൾ നീക്കംചെയ്യും. \nനിങ്ങൾക്ക് ഉറപ്പാണോ? ഇത് പഴയപടിയാക്കാൻ കഴിയില്ല! + കണ്ട വീഡിയോകൾ നീക്കംചെയ്യണോ? കണ്ടത് നീക്കംചെയ്യുക സിസ്റ്റം ഡിഫോൾട്ട് അപ്ലിക്കേഷൻ ഭാഷ diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 4e1ad1fe2..404851e6d 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -489,7 +489,7 @@ Album Sanger Ja, og delvist sette videoer - Fjern sette videoer\? + Fjern sette videoer? Fjern sette Opprettet av %s Av %s @@ -526,8 +526,7 @@ Hent fra dedikert strøm når tilgjengelig Tid siden siste oppdatering før et abonnement vurderes utdatert — %s Som følge av begrensninger i ExoPlayer er blafringsdistansen kun %d sekunder - Videoer som har blitt sett før og etter at de er lagt til spillelisten, vil bli fjernet. -\nEr du sikker\? Dette kan ikke angres! + Videoer som har blitt sett før og etter at de er lagt til spillelisten, vil bli fjernet. \nEr du sikker? Dette kan ikke angres! Start avspilling automatisk — %s Kunne ikke gjenkjenne angitt nettadresse. Åpne den med et annet program\? Innholdet støttes ikke enda av NewPipe. diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 7af9f4634..75e113d4e 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -493,10 +493,8 @@ %d मिनेट च्यानल अवतार थम्बनेल - भिडियोहरू जुन प्लेलिस्टमा थपिनु अघि र पछि हेरिएको थियो हटाइनेछ। -\n… -\n के तपाईँ निश्चित हुनुहुन्छ\? यो उल्ट्याउन सकिदैन! - हेरिएका भिडियोहरू हटाउने हो\? + भिडियोहरू जुन प्लेलिस्टमा थपिनु अघि र पछि हेरिएको थियो हटाइनेछ। \n… \n के तपाईँ निश्चित हुनुहुन्छ? यो उल्ट्याउन सकिदैन! + हेरिएका भिडियोहरू हटाउने हो? हेरिसकेको हटाउनुहोस सेवाहरूबाट मूल पाठहरू स्ट्रिम वस्तुहरूमा देखिने छन् आईटमहरूमा मूल समय पहिले देखाउनुहोस् diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index a8afb6a8f..148468dd2 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -441,9 +441,8 @@ Door beperkingen van ExoPlayer is de zoekduur ingesteld op %d seconden Ja, en deels bekeken video\'s - Video\'s die zijn bekeken voor, en na, ze werden toegevoegd aan de afspeellijst worden verwijderd. -\nBent u zeker\? Dit kan niet ongedaan gemaakt worden! - Verwijder bekeken video\'s\? + Video\'s die zijn bekeken voor, en na, ze werden toegevoegd aan de afspeellijst worden verwijderd. \nBent u zeker? Dit kan niet ongedaan gemaakt worden! + Verwijder bekeken video\'s? Verwijder bekeken Systeem standaard App taal diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 7f3e342ac..c7aab3577 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -503,9 +503,8 @@ \n \nHopelijk zal dit bij een toekomstige versie ondersteund worden. Ja, en deels bekeken video\'s - Video\'s die zijn bekeken voor, en na ze werden toegevoegd aan de afspeellijst worden verwijderd. -\nWeet u dit zeker\? Deze actie kan niet ongedaan gemaakt worden! - Bekeken video\'s verwijderen\? + Video\'s die zijn bekeken voor, en na ze werden toegevoegd aan de afspeellijst worden verwijderd. \nWeet u dit zeker? Deze actie kan niet ongedaan gemaakt worden! + Bekeken video\'s verwijderen? ∞ video\'s 100+ video\'s Deze video heeft een leeftijdsbeperking. diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml index 06b2e21dd..fb6950046 100644 --- a/app/src/main/res/values-nqo/strings.xml +++ b/app/src/main/res/values-nqo/strings.xml @@ -592,8 +592,7 @@ ߞߊ߲ߞߋ ߟߊ߫ ߖߏߣߡߊ ߞߊ߬ ߖߌ߬ߦߊ߬ߖߟߎ߬ ߦߋߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ ؟ ߞߊ߬ ߖߌ߬ߦߊ߬ߖߟߎ߬ ߦߋߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ - ߦߋߡߍ߲ߕߊ ߟߎ߫ ߖߏ߬ߛߌ߬ߕߐ߫ ߟߋ߬߸ ߡߍ߲ ߠߎ߬ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߢߍ߫ ߥߊߟߴߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߞߐ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊ߫. -\nߌ ߟߊߣߍ߲߫ ߊ߬ ߟߊ߫ ؟ ߊ߬ ߕߍߣߊ߬ ߛߋ߫ ߟߊ߫ ߟߊߛߊ߬ߦߌ߬ ߟߊ߫߹ + ߦߋߡߍ߲ߕߊ ߟߎ߫ ߖߏ߬ߛߌ߬ߕߐ߫ ߟߋ߬߸ ߡߍ߲ ߠߎ߬ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߢߍ߫ ߥߊߟߴߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߞߐ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊ߫. \nߌ ߟߊߣߍ߲߫ ߊ߬ ߟߊ߫ ؟ ߊ߬ ߕߍߣߊ߬ ߛߋ߫ ߟߊ߫ ߟߊߛߊ߬ߦߌ߬ ߟߊ߫߹ ߐ߬ߤߐ߲߫߸ ߊ߬ߣߌ߫ ߘߏ߫ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߖߌ߬ߦߊ߬ߖߟߎ ߡߍ߲ ߠߎ߬ ߘߐ߫ ߞߵߊ߬ ߓߍ߲߬ ExoPlayer ߟߊ߫ ߛߙߊߕߌ߫ ߛߌ߰ߣߍ߲ ߠߎ߫ ߡߊ߬߸ ߓߐߒߣߐ߬ߘߐ ߛߋ߲߬ߕߊ ߓߘߊ߬ ߞߍ߫ ߝߌ߬ߟߊ߲߬ %d ߘߌ߫ diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index d4830fac9..d15afa4fe 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -190,8 +190,7 @@ କିଛି ରେଜୋଲୁସନରେ ଅଡିଓ ଅପସାରଣ କରେ ଉଚ୍ଚ ରେଜୋଲୁସନ ଦେଖାନ୍ତୁ \"କୋଡି ସହିତ ଖୋଲନ୍ତୁ\" ବିକଳ୍ପ ଦେଖାନ୍ତୁ - ପ୍ଲେ ଲିଷ୍ଟରେ ଯୋଡାଯିବା ପୂର୍ବରୁ ଏବଂ ପରେ ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକ ଅପସାରିତ ହେବ । -\nତମେ ନିଶ୍ଚିତ କି\? ଏହାକୁ ପୂର୍ବବତ୍ କରାଯାଇପାରିବ ନାହିଁ! + ପ୍ଲେ ଲିଷ୍ଟରେ ଯୋଡାଯିବା ପୂର୍ବରୁ ଏବଂ ପରେ ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକ ଅପସାରିତ ହେବ । \nତମେ ନିଶ୍ଚିତ କି? ଏହାକୁ ପୂର୍ବବତ୍ କରାଯାଇପାରିବ ନାହିଁ! ପ୍ଲେୟାରକୁ କ୍ରାସ୍ କରନ୍ତୁ ଡିଫଲ୍ଟ ଅଡିଓ ଫର୍ମାଟ୍ ଅକ୍ଷୟ ସନ୍ଧାନ ପ୍ଲେୟାରକୁ ହ୍ରାସ ହୋଇଥିବା ସଠିକତା ସହିତ ଶୀଘ୍ର ପଦବୀ ଖୋଜିବାକୁ ଅନୁମତି ଦିଏ । 5, 15 କିମ୍ବା 25 ସେକେଣ୍ଡ ଖୋଜିବା ଏହା ସହିତ କାମ କରେ ନାହିଁ @@ -412,7 +411,7 @@ ଅଦ୍ୟତନ ପାଇଁ ଯାଞ୍ଚ କରନ୍ତୁ ନୂତନ ସଂସ୍କରଣଗୁଡ଼ିକ ପାଇଁ ମାନୁଆଲ ଯାଞ୍ଚ କରନ୍ତୁ ବିଚାରାଧୀନ ଅଛି - ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକ ଅପସାରଣ କରିବେ କି\? + ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକ ଅପସାରଣ କରିବେ କି? ବର୍ଣ୍ଣନାରେ ପାଠ ବାଛିବା ଅକ୍ଷମ କରନ୍ତୁ ଏକ ସୁରକ୍ଷିତ ସଂଯୋଗ ସ୍ଥାପନ କରିପାରିଲା ନାହିଁ ଟୋଗଲ୍ ସେବା, ବର୍ତ୍ତମାନ ମନୋନୀତ: diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 23c9a8d51..2c6158355 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -495,7 +495,7 @@ ਹਾਂ, ਅਤੇ ਅੱਧ-ਪਚੱਧੀਆਂ ਵੇਖੀਆਂ ਹੋਈਆਂ ਵੀ ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਿਲ ਪਹਿਲਾਂ ਤੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੇ ਜਾ ਚੁੱਕੇ ਵੀਡੀਓ ਹਟਾ ਦਿੱਤੇ ਜਾਣਗੇ। \nਕੀ ਵਾਕਿਆ ਹੀ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਣਾ! - ਵੇਖੇ ਹੋਏ ਵੀਡੀਓ ਹਟਾ ਦੇਈਏ\? + ਵੇਖੇ ਹੋਏ ਵੀਡੀਓ ਹਟਾ ਦੇਈਏ? ਵੇਖੇ ਹੋਏ ਨੂੰ ਹਟਾਓ ਸਿਸਟਮ ਡਿਫ਼ਾਲਟ ਐਪ ਦੀ ਭਾਸ਼ਾ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index b7ea06024..5580ea24a 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -523,9 +523,8 @@ \n \nWłącz „%1$s” w ustawieniach, jeśli chcesz je zobaczyć. Tak, i częściowo obejrzane wideo - Wideo, które zostały obejrzane przed i po dodaniu do playlisty, zostaną usunięte. -\nCzy na pewno\? Tego nie da się cofnąć! - Czy usunąć obejrzane wideo\? + Wideo, które zostały obejrzane przed i po dodaniu do playlisty, zostaną usunięte. \nCzy na pewno? Tego nie da się cofnąć! + Czy usunąć obejrzane wideo? Usuń obejrzane Oryginalne teksty z usług będą widoczne w strumieniowanych pozycjach Pokazuj oryginalny czas na pozycjach diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 08184fbb6..7488e69c7 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -518,8 +518,7 @@ \n \nAtive \"%1$s\" nas configurações se quiser vê-lo. Sim, e vídeos parcialmente assistidos - Os vídeos que foram assistidos antes e depois de terem sidos adicionados à playlist serão removidos. -\nTem certeza? Esta ação não pode ser desfeita! + Os vídeos que foram assistidos antes e depois de terem sidos adicionados à playlist serão removidos. \nTem certeza? Esta ação não pode ser desfeita! Remover vídeos assistidos? Remover assistidos Textos originais dos serviços serão visíveis nos itens de transmissão diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index a204e1973..4e9a85522 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -144,8 +144,7 @@ Eliminar ficheiros descarregados Idioma da aplicação Utilizadores - Os vídeos que tenham sido vistos antes e depois de serem adicionados à lista de reprodução serão removidos. -\nTem a certeza\? Esta ação não pode ser revertida! + Os vídeos que tenham sido vistos antes e depois de serem adicionados à lista de reprodução serão removidos. \nTem a certeza? Esta ação não pode ser revertida! %s a ver %s a ver @@ -281,7 +280,7 @@ Notificações para novas versões do NewPipe Histórico Lista - Remover vídeos visualizados\? + Remover vídeos visualizados? %d minuto %d minutos diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index b33f9a2d3..e18984dc2 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -517,10 +517,9 @@ Este vídeo está restringido a adultos. \n \nPara o poder ver, tem que ativar \"%1$s\" nas definições. - Os vídeos que tenham sido vistos antes e depois de serem adicionados à lista de reprodução serão removidos. -\nTem a certeza\? Esta ação não pode ser revertida! + Os vídeos que tenham sido vistos antes e depois de serem adicionados à lista de reprodução serão removidos. \nTem a certeza? Esta ação não pode ser revertida! Sim e também os vídeos parcialmente vistos - Remover vídeos visualizados\? + Remover vídeos visualizados? Remover visualizados Os textos originais dos serviços serão visíveis nos itens do vídeo Mostrar antiguidade nos itens diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 4a3ab8beb..ccd1483a1 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -433,9 +433,8 @@ Datorită constrângerilor ExoPlayer, durata de căutare a fost setată la %d secunde Da, și videoclipuri vizionate parțial - Videoclipurile care au fost vizionate înainte și după ce au fost adăugate la lista de redare vor fi eliminate. -\nSunteți sigur\? Acest lucru nu poate fi anulat! - Eliminați videoclipurile vizionate\? + Videoclipurile care au fost vizionate înainte și după ce au fost adăugate la lista de redare vor fi eliminate. \nSunteți sigur? Acest lucru nu poate fi anulat! + Eliminați videoclipurile vizionate? Eliminare cele urmărite Prestabilită de sistem Limba aplicației diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index bb8042192..b96667f93 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -526,9 +526,8 @@ Альбомы Удалить просмотренные Да, и частично просмотренные - Видео, просмотренные до или после добавления в плейлист, будут удалены. -\nПродолжить\? Не может быть отменено! - Удалить просмотренные видео\? + Видео, просмотренные до или после добавления в плейлист, будут удалены. \nПродолжить? Не может быть отменено! + Удалить просмотренные видео? Отображать сообщённое сервисом время с момента публикации Исходное время публикации Включить \"Ограниченный режим\" YouTube diff --git a/app/src/main/res/values-ryu/strings.xml b/app/src/main/res/values-ryu/strings.xml index fdd266f7a..6b70c0c8e 100644 --- a/app/src/main/res/values-ryu/strings.xml +++ b/app/src/main/res/values-ryu/strings.xml @@ -507,8 +507,7 @@ くぬちゃーがんかいはにーるれいうぅいゆいぎんぬあいびーん。 \n \nいちらんさるいばあい、しっていから \"%1$s\" ゆーいるこうかしみそーれー。 - プレイリストんかいちいからさりーるめーんちいからさったるあとぅんしちょうさんちゃーしがはプレイリストからさくじょさりやびーん。 -\nゆたさいびーが?くぬあしっさーむとぅんかいむどぅしやびらん! + プレイリストんかいちいからさりーるめーんちいからさったるあとぅんしちょうさんちゃーしがはプレイリストからさくじょさりやびーん。 \nゆたさいびーが?くぬあしっさーむとぅんかいむどぅしやびらん! はい、ぶぶんてぃちーがしちょうさんちゃーしがんさちゅるじょさびーん しちょうじみぬちゃーしがさちゅるじょさびーが? しちょうじみさちゅるじょ diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 099b3308d..dcaf7290e 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -285,9 +285,8 @@ Pro more de sos lìmites de ExoPlayer sa longària de s\'iscostiamentu lestru est istada impostada a %d segundos Eja, e fintzas sos vìdeos pompiados in parte - Sos vìdeos pompiados in antis e a pustis de los àere annànghidos a s\'iscalita ant a èssere bogados. -\n Seguru ses\? Custu no est reversìbile! - Bogare sos elementos pompiados\? + Sos vìdeos pompiados in antis e a pustis de los àere annànghidos a s\'iscalita ant a èssere bogados. \n Seguru ses? Custu no est reversìbile! + Bogare sos elementos pompiados? Boga sos elementos pompiados Predefinida de su sistema Limba de s\'aplicatzione diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 49ffccb28..9f79f2331 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -511,7 +511,7 @@ \nMožno v budúcnosti sa to zmení. Áno aj čiastočne pozreté videá Pozreté videá, ktoré ste pozreli pred a po ich pridaní do playlistu, budú odstránené. \nSte si istí ich odstránením z playlistu? Táto operácia je nezvratná! - Odstrániť pozreté videá\? + Odstrániť pozreté videá? Odstrániť pozreté Pôvodné texty zo služieb budú viditeľné v položkách streamu Zobrazovať pôvodný čas diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index b972c104d..f40df57f1 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -491,9 +491,8 @@ Ayadooy ugu wacantahay xayiraad xaga ExoPlayer-ka ah xadka dhaaf-dhaafinta waa %d ilbiriqsi Haa, sidoo kale ku dar muuqaalada qayb laga daawaday - Muuqaalada la daawaday kahor iyo kadib markii xulka lagu daray waa la saari doonaa. -\nMa hubtaa\? Arrinkan dib looma soocelin karo! - Saar muuqaalada la daawaday\? + Muuqaalada la daawaday kahor iyo kadib markii xulka lagu daray waa la saari doonaa. \nMa hubtaa? Arrinkan dib looma soocelin karo! + Saar muuqaalada la daawaday? Saar kuwa la daawaday Aaladu saytahay Luuqada Appka diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 48bcb4bf1..5a33ad77f 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -507,9 +507,8 @@ Skedarët video të shkarkuara ruhen këtu Nuk u gjend lexues për stream (ju mund të instaloni VLC për ta lexuar). Po, dhe videot e shikuara pjesërisht - Videot që janë shikuar më parë dhe pasi janë shtuar në listën e luajtjes do të hiqen. -\nA jeni të sigurt\? Kjo nuk mund të zhbëhet! - Dëshironi t\'i hiqni videot e para\? + Videot që janë shikuar më parë dhe pasi janë shtuar në listën e luajtjes do të hiqen. \nA jeni të sigurt? Kjo nuk mund të zhbëhet! + Dëshironi t\'i hiqni videot e para? Hiq të parat Tekstet origjinale nga shërbimet do shihen në produktet e luajtshme Shfaq titullin origjinal \"kohë më parë\" në objekte diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index a1fc299c6..847b60f2f 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -206,9 +206,8 @@ Искључите да бисте сакрили коментаре Због ограничења ExoPlayer-а, премотавање је постављено на %d секунди Да, и делимично одгледани видео снимци - Видео снимци који су одгледани пре и после додавања на плејлисту биће уклоњени. -\nЈесте ли сигурни\? Ово се не може поништити! - Уклонити одгледане видео снимке\? + Видео снимци који су одгледани пре и после додавања на плејлисту биће уклоњени. \nЈесте ли сигурни? Ово се не може поништити! + Уклонити одгледане видео снимке? Уклони одгледано Системски подразумевано Језик апликације diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index f20044b65..fb23c9201 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -474,9 +474,8 @@ På grund av ExoPlayer-begränsningar sattes söktiden till %d sekunder Ja, och delvis tittade videor - Videor som har spelats före och efter att de har lagts till i spellistan kommer att tas bort. -\nÄr du säker\? Detta kan inte ångras! - Ta bort tittade videor\? + Videor som har spelats före och efter att de har lagts till i spellistan kommer att tas bort. \nÄr du säker? Detta kan inte ångras! + Ta bort tittade videor? Ta bort tittade Systemstandard Appspråk diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 6948fcc95..083225ff9 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -506,10 +506,9 @@ Bu video yaş kısıtlıdır. \n \nGörmek istiyorsanız ayarlarda \"%1$s\" seçeneğini açın. - Oynatma listesine eklendikten önce ve sonra izlenen videolar kaldırılacak. -\nEmin misiniz\? Bu geri döndürülemez! + Oynatma listesine eklendikten önce ve sonra izlenen videolar kaldırılacak. \nEmin misiniz? Bu geri döndürülemez! Evet ve kısmen izlenmiş videolar - İzlenen videoları kaldır\? + İzlenen videoları kaldır? İzleneni kaldır Akış ögelerinde hizmetlerden alınan özgün metinler görünecektir Ögelerde özgün \'… önce\'yi göster diff --git a/app/src/main/res/values-tzm/strings.xml b/app/src/main/res/values-tzm/strings.xml index a62b37fa3..48a3ca921 100644 --- a/app/src/main/res/values-tzm/strings.xml +++ b/app/src/main/res/values-tzm/strings.xml @@ -39,7 +39,7 @@ %d wass %d wussan - Kkes ividyuten ittwannayen\? + Kkes ividyuten ittwannayen? 100+ ividyuten walu ividyuten Sɣur %s diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 6c3624923..4526ea837 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -510,9 +510,8 @@ Останнє оновлення: %s Через обмеження ExoPlayer точність перемотування становить %d секунд Так, а також частково переглянуті відео - Відео, які Ви переглядали до та після додавання в добірку, вилучатимуться. -\nВи впевнені\? Це незворотна дія! - Видалити переглянуті відео\? + Відео, які Ви переглядали до та після додавання в добірку, вилучатимуться. \nВи впевнені? Це незворотна дія! + Видалити переглянуті відео? Видалити переглянуті Створено автоматично (автора не знайдено) ∞ вiдео diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 58fdf5da3..50ca67efc 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -423,8 +423,7 @@ %d giây Có, và video đã xem một phần - Những video đã xem trước và sau khi thêm vào danh sách phát sẽ bị loại bỏ. -\nBạn có chắc không? Điều này không thể được hoàn tác! + Những video đã xem trước và sau khi thêm vào danh sách phát sẽ bị loại bỏ. \nBạn có chắc không? Điều này không thể được hoàn tác! Xóa các video đã xem? Loại bỏ đã xem Mặc định hệ thống diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 35de16f8e..7622cddcf 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -501,8 +501,7 @@ 由 %s 创建 频道的头像缩略图 是的,包括没看完的视频 - 已经看过且在之后被加入播放列表的视频将被删除。 -\n您确定吗?操作不能被撤消! + 已经看过且在之后被加入播放列表的视频将被删除。 \n您确定吗?操作不能被撤消! 移除看过的视频? 移除看过的视频 来自服务的原始文本将在串流项目中可见 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index ee95d0751..c483ca96b 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -555,8 +555,7 @@ 每次下載都會問你要儲存去邊。 \n如果你想儲存落外置 SD 卡入面,請啟用系統資料夾揀選器 (SAF) 用系統資料夾揀選器 (SAF) - 加入去播放清單之前或之後睇過嘅影片都會剷走個囉喎。 -\n你肯定?剷走咗冇得掹個囉喎! + 加入去播放清單之前或之後睇過嘅影片都會剷走個囉喎。 \n你肯定?剷走咗冇得掹個囉喎! 「儲存空間存取框架」係畀你下載落外置 SD 卡嗰度 Android 10 打上,局住要用「儲存空間存取框架」 ExoPlayer 預設值 From a40d7ff70e8b14b69c16fc98e23728fcdb1fec85 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 28 Jan 2026 02:59:33 +0100 Subject: [PATCH 187/190] Hotfix release v0.28.2 (1007) --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 292dcdbdf..62afd8522 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -42,9 +42,9 @@ android { minSdk = 21 targetSdk = 35 - versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1006 + versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1007 - versionName = "0.28.1" + versionName = "0.28.2" System.getProperty("versionNameSuffix")?.let { versionNameSuffix = it } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" From addf1e23b36d942aeb257c2be4d5d8ab82bdcc11 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 28 Jan 2026 03:25:23 +0100 Subject: [PATCH 188/190] Add changelogs for v0.28.2 (1007) --- fastlane/metadata/android/ar/changelogs/1007.txt | 1 + fastlane/metadata/android/az/changelogs/1007.txt | 1 + fastlane/metadata/android/bs/changelogs/1007.txt | 1 + fastlane/metadata/android/cs/changelogs/1007.txt | 1 + fastlane/metadata/android/de/changelogs/1007.txt | 1 + fastlane/metadata/android/en-US/changelogs/1007.txt | 11 +++++++++++ fastlane/metadata/android/es/changelogs/1007.txt | 1 + fastlane/metadata/android/eu/changelogs/1007.txt | 1 + fastlane/metadata/android/fa/changelogs/1007.txt | 1 + fastlane/metadata/android/fr/changelogs/1007.txt | 1 + fastlane/metadata/android/he/changelogs/1007.txt | 1 + fastlane/metadata/android/hi/changelogs/1007.txt | 1 + fastlane/metadata/android/hu/changelogs/1007.txt | 1 + fastlane/metadata/android/id/changelogs/1007.txt | 1 + fastlane/metadata/android/it/changelogs/1007.txt | 11 +++++++++++ fastlane/metadata/android/ka/changelogs/1007.txt | 1 + fastlane/metadata/android/ko/changelogs/1007.txt | 1 + fastlane/metadata/android/nl/changelogs/1007.txt | 1 + fastlane/metadata/android/pa/changelogs/1007.txt | 1 + fastlane/metadata/android/pt-BR/changelogs/1007.txt | 1 + fastlane/metadata/android/pt-PT/changelogs/1007.txt | 1 + fastlane/metadata/android/pt/changelogs/1007.txt | 1 + fastlane/metadata/android/ru/changelogs/1007.txt | 1 + fastlane/metadata/android/sk/changelogs/1007.txt | 1 + fastlane/metadata/android/sv/changelogs/1007.txt | 1 + fastlane/metadata/android/ta/changelogs/1007.txt | 1 + fastlane/metadata/android/tr/changelogs/1007.txt | 1 + fastlane/metadata/android/uk/changelogs/1007.txt | 1 + fastlane/metadata/android/vi/changelogs/1007.txt | 1 + fastlane/metadata/android/zh-Hans/changelogs/1007.txt | 1 + fastlane/metadata/android/zh-Hant/changelogs/1007.txt | 1 + .../metadata/android/zh_Hant_HK/changelogs/1007.txt | 1 + 32 files changed, 52 insertions(+) create mode 100644 fastlane/metadata/android/ar/changelogs/1007.txt create mode 100644 fastlane/metadata/android/az/changelogs/1007.txt create mode 100644 fastlane/metadata/android/bs/changelogs/1007.txt create mode 100644 fastlane/metadata/android/cs/changelogs/1007.txt create mode 100644 fastlane/metadata/android/de/changelogs/1007.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/1007.txt create mode 100644 fastlane/metadata/android/es/changelogs/1007.txt create mode 100644 fastlane/metadata/android/eu/changelogs/1007.txt create mode 100644 fastlane/metadata/android/fa/changelogs/1007.txt create mode 100644 fastlane/metadata/android/fr/changelogs/1007.txt create mode 100644 fastlane/metadata/android/he/changelogs/1007.txt create mode 100644 fastlane/metadata/android/hi/changelogs/1007.txt create mode 100644 fastlane/metadata/android/hu/changelogs/1007.txt create mode 100644 fastlane/metadata/android/id/changelogs/1007.txt create mode 100644 fastlane/metadata/android/it/changelogs/1007.txt create mode 100644 fastlane/metadata/android/ka/changelogs/1007.txt create mode 100644 fastlane/metadata/android/ko/changelogs/1007.txt create mode 100644 fastlane/metadata/android/nl/changelogs/1007.txt create mode 100644 fastlane/metadata/android/pa/changelogs/1007.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/1007.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/1007.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1007.txt create mode 100644 fastlane/metadata/android/ru/changelogs/1007.txt create mode 100644 fastlane/metadata/android/sk/changelogs/1007.txt create mode 100644 fastlane/metadata/android/sv/changelogs/1007.txt create mode 100644 fastlane/metadata/android/ta/changelogs/1007.txt create mode 100644 fastlane/metadata/android/tr/changelogs/1007.txt create mode 100644 fastlane/metadata/android/uk/changelogs/1007.txt create mode 100644 fastlane/metadata/android/vi/changelogs/1007.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/1007.txt create mode 100644 fastlane/metadata/android/zh-Hant/changelogs/1007.txt create mode 100644 fastlane/metadata/android/zh_Hant_HK/changelogs/1007.txt diff --git a/fastlane/metadata/android/ar/changelogs/1007.txt b/fastlane/metadata/android/ar/changelogs/1007.txt new file mode 100644 index 000000000..562f16944 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/1007.txt @@ -0,0 +1 @@ +تم إصلاح YouTube الذي لا يقوم بتشغيل أي دفق diff --git a/fastlane/metadata/android/az/changelogs/1007.txt b/fastlane/metadata/android/az/changelogs/1007.txt new file mode 100644 index 000000000..16a2e1013 --- /dev/null +++ b/fastlane/metadata/android/az/changelogs/1007.txt @@ -0,0 +1 @@ +YouTube-un heç bir yayım oynatmaması düzəldildi diff --git a/fastlane/metadata/android/bs/changelogs/1007.txt b/fastlane/metadata/android/bs/changelogs/1007.txt new file mode 100644 index 000000000..acd29e47c --- /dev/null +++ b/fastlane/metadata/android/bs/changelogs/1007.txt @@ -0,0 +1 @@ +Ispravljeno je da YouTube ne reprodukuje nijedan tok diff --git a/fastlane/metadata/android/cs/changelogs/1007.txt b/fastlane/metadata/android/cs/changelogs/1007.txt new file mode 100644 index 000000000..7035a1112 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/1007.txt @@ -0,0 +1 @@ +Opraveno nepřehrávání jakéhokoli streamu ve službě YouTube diff --git a/fastlane/metadata/android/de/changelogs/1007.txt b/fastlane/metadata/android/de/changelogs/1007.txt new file mode 100644 index 000000000..43623578f --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/1007.txt @@ -0,0 +1 @@ +Behoben, dass YouTube keinen Stream abspielte diff --git a/fastlane/metadata/android/en-US/changelogs/1007.txt b/fastlane/metadata/android/en-US/changelogs/1007.txt new file mode 100644 index 000000000..f439ee1de --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/1007.txt @@ -0,0 +1,11 @@ +This hotfix release fixes the "Content not available" error: YouTube videos can now be played again! + +It also fixes a few bugs introduced in 0.28.1: +• Playlist items dragging to only neighbor positions +• Title/comments flickering between current and previous video +• "Start main player in fullscreen" option not working + +Other improvements: +• [YouTube] Allow rewinding livestreams up to 4 hours again +• Don't load livestream video when playing in background +• New UI for "Remove watched" \ No newline at end of file diff --git a/fastlane/metadata/android/es/changelogs/1007.txt b/fastlane/metadata/android/es/changelogs/1007.txt new file mode 100644 index 000000000..80b4efa55 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/1007.txt @@ -0,0 +1 @@ +Arreglo en YouTube no reproduciendo flujos diff --git a/fastlane/metadata/android/eu/changelogs/1007.txt b/fastlane/metadata/android/eu/changelogs/1007.txt new file mode 100644 index 000000000..68d0be7fc --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/1007.txt @@ -0,0 +1 @@ +Konpondu da YouTube-k ez zuela inolako erreprodukziorik erreproduzitzen diff --git a/fastlane/metadata/android/fa/changelogs/1007.txt b/fastlane/metadata/android/fa/changelogs/1007.txt new file mode 100644 index 000000000..ba5413d49 --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/1007.txt @@ -0,0 +1 @@ +مشکل عدم نمایش پخش‌زنده برطرف شد diff --git a/fastlane/metadata/android/fr/changelogs/1007.txt b/fastlane/metadata/android/fr/changelogs/1007.txt new file mode 100644 index 000000000..3ad3bf279 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/1007.txt @@ -0,0 +1 @@ +Correction de YouTube qui ne lisait aucun média diff --git a/fastlane/metadata/android/he/changelogs/1007.txt b/fastlane/metadata/android/he/changelogs/1007.txt new file mode 100644 index 000000000..50731171e --- /dev/null +++ b/fastlane/metadata/android/he/changelogs/1007.txt @@ -0,0 +1 @@ +תוקנה התקלה ש־YouTube לא מנגן אף תזרים diff --git a/fastlane/metadata/android/hi/changelogs/1007.txt b/fastlane/metadata/android/hi/changelogs/1007.txt new file mode 100644 index 000000000..071ab64e3 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/1007.txt @@ -0,0 +1 @@ +फिक्स्ड YouTube कोई स्ट्रीम नहीं चला रहा है diff --git a/fastlane/metadata/android/hu/changelogs/1007.txt b/fastlane/metadata/android/hu/changelogs/1007.txt new file mode 100644 index 000000000..f4de95e68 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/1007.txt @@ -0,0 +1 @@ +Immáron minden YouTube videó lejátszásra kerül diff --git a/fastlane/metadata/android/id/changelogs/1007.txt b/fastlane/metadata/android/id/changelogs/1007.txt new file mode 100644 index 000000000..d3fea84ab --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/1007.txt @@ -0,0 +1 @@ +Memperbaiki YouTube yang tidak memutar streaming apa pun diff --git a/fastlane/metadata/android/it/changelogs/1007.txt b/fastlane/metadata/android/it/changelogs/1007.txt new file mode 100644 index 000000000..3b5044d15 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/1007.txt @@ -0,0 +1,11 @@ +Risolto l’errore "Contenuto non disponibile": i video YouTube ora funzionano di nuovo! + +Risolti vari bug introdotti nella 0.28.1: +• Trascinamento elementi playlist limitato a posizioni adiacenti +• Titoli/commenti si alternano tra video corrente e precedente +• Opzione "Avvia riproduzione a schermo intero" non funzionante + +Altri miglioramenti: +• [YouTube] Riavvolgimento dirette fino a 4 ore +• Non caricare il video delle dirette riprodotte in background +• Nuova UI per "Rimuovi visti" \ No newline at end of file diff --git a/fastlane/metadata/android/ka/changelogs/1007.txt b/fastlane/metadata/android/ka/changelogs/1007.txt new file mode 100644 index 000000000..d20512f17 --- /dev/null +++ b/fastlane/metadata/android/ka/changelogs/1007.txt @@ -0,0 +1 @@ +გაასწორა YouTube არ უკრავს არცერთ ნაკადს diff --git a/fastlane/metadata/android/ko/changelogs/1007.txt b/fastlane/metadata/android/ko/changelogs/1007.txt new file mode 100644 index 000000000..39ea56541 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/1007.txt @@ -0,0 +1 @@ +YouTube에서 스트림을 재생하지 않는 문제 수정 diff --git a/fastlane/metadata/android/nl/changelogs/1007.txt b/fastlane/metadata/android/nl/changelogs/1007.txt new file mode 100644 index 000000000..9bd8adf86 --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/1007.txt @@ -0,0 +1 @@ +YouTube speelt geen stream af opgelost diff --git a/fastlane/metadata/android/pa/changelogs/1007.txt b/fastlane/metadata/android/pa/changelogs/1007.txt new file mode 100644 index 000000000..fe62a1330 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/1007.txt @@ -0,0 +1 @@ +ਸਥਿਰ YouTube ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ ਚਲਾ ਰਿਹਾ diff --git a/fastlane/metadata/android/pt-BR/changelogs/1007.txt b/fastlane/metadata/android/pt-BR/changelogs/1007.txt new file mode 100644 index 000000000..59fc6a5cd --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/1007.txt @@ -0,0 +1 @@ +Corrigido YouTube não reproduzir qualquer transmissão diff --git a/fastlane/metadata/android/pt-PT/changelogs/1007.txt b/fastlane/metadata/android/pt-PT/changelogs/1007.txt new file mode 100644 index 000000000..93519d64d --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/1007.txt @@ -0,0 +1 @@ +Corrigido YouTube não reproduzir nenhuma transmissão diff --git a/fastlane/metadata/android/pt/changelogs/1007.txt b/fastlane/metadata/android/pt/changelogs/1007.txt new file mode 100644 index 000000000..93519d64d --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1007.txt @@ -0,0 +1 @@ +Corrigido YouTube não reproduzir nenhuma transmissão diff --git a/fastlane/metadata/android/ru/changelogs/1007.txt b/fastlane/metadata/android/ru/changelogs/1007.txt new file mode 100644 index 000000000..d3978869d --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/1007.txt @@ -0,0 +1 @@ +Исправлено: YouTube не воспроизводил никакие потоки diff --git a/fastlane/metadata/android/sk/changelogs/1007.txt b/fastlane/metadata/android/sk/changelogs/1007.txt new file mode 100644 index 000000000..2f96b8dc5 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/1007.txt @@ -0,0 +1 @@ +Fixed YouTube not playing any stream diff --git a/fastlane/metadata/android/sv/changelogs/1007.txt b/fastlane/metadata/android/sv/changelogs/1007.txt new file mode 100644 index 000000000..35f298dbf --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/1007.txt @@ -0,0 +1 @@ +Åtgärdat att YouTube inte spelar någon stream diff --git a/fastlane/metadata/android/ta/changelogs/1007.txt b/fastlane/metadata/android/ta/changelogs/1007.txt new file mode 100644 index 000000000..e3c06dc59 --- /dev/null +++ b/fastlane/metadata/android/ta/changelogs/1007.txt @@ -0,0 +1 @@ +நிலையான யூடியூப் எந்த ச்ட்ரீமையும் இயக்கவில்லை diff --git a/fastlane/metadata/android/tr/changelogs/1007.txt b/fastlane/metadata/android/tr/changelogs/1007.txt new file mode 100644 index 000000000..e5979c68d --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/1007.txt @@ -0,0 +1 @@ +YouTube'un herhangi bir akışı oynatmaması düzeltildi diff --git a/fastlane/metadata/android/uk/changelogs/1007.txt b/fastlane/metadata/android/uk/changelogs/1007.txt new file mode 100644 index 000000000..a90cfff6b --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/1007.txt @@ -0,0 +1 @@ +Виправлено проблему невідтворюваності трансляцій YouTube diff --git a/fastlane/metadata/android/vi/changelogs/1007.txt b/fastlane/metadata/android/vi/changelogs/1007.txt new file mode 100644 index 000000000..d2086b62c --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/1007.txt @@ -0,0 +1 @@ +Đã sửa lỗi YouTube không phát bất kỳ luồng nào diff --git a/fastlane/metadata/android/zh-Hans/changelogs/1007.txt b/fastlane/metadata/android/zh-Hans/changelogs/1007.txt new file mode 100644 index 000000000..8a5424c9e --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/1007.txt @@ -0,0 +1 @@ +修复YouTube无法播放任何视频 diff --git a/fastlane/metadata/android/zh-Hant/changelogs/1007.txt b/fastlane/metadata/android/zh-Hant/changelogs/1007.txt new file mode 100644 index 000000000..4e8bf6537 --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/1007.txt @@ -0,0 +1 @@ +修正 YouTube 無法播放任何串流 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/1007.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/1007.txt new file mode 100644 index 000000000..9a4721551 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/1007.txt @@ -0,0 +1 @@ +修正咗 YouTube 乜嘢實況串流都播唔到嘅問題 From 51e62f09baeb1c5434fdb68e78539ae1806d2aad Mon Sep 17 00:00:00 2001 From: Salman Muin Kayser Chishti <13schishti@gmail.com> Date: Fri, 30 Jan 2026 09:16:36 +0000 Subject: [PATCH 189/190] Upgrade GitHub Actions for Node 24 compatibility Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com> --- .github/workflows/backport-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/backport-pr.yml b/.github/workflows/backport-pr.yml index de46ca7c7..1e3074064 100644 --- a/.github/workflows/backport-pr.yml +++ b/.github/workflows/backport-pr.yml @@ -22,7 +22,7 @@ jobs: github.event.comment.author_association == 'MEMBER' ) steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Get backport metadata # the target branch is the first argument after `/backport` env: From d051e8ecc8214fdfeba729afe5b5e367e711d86d Mon Sep 17 00:00:00 2001 From: Salman Muin Kayser Chishti <13schishti@gmail.com> Date: Fri, 30 Jan 2026 09:16:42 +0000 Subject: [PATCH 190/190] Upgrade GitHub Actions to latest versions Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d42c5a0b4..cb8fbc12a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,7 +38,7 @@ jobs: steps: - uses: actions/checkout@v6 - - uses: gradle/actions/wrapper-validation@v4 + - uses: gradle/actions/wrapper-validation@v5 - name: create and checkout branch # push events already checked out the branch