1
mirror of https://github.com/TeamNewPipe/NewPipe synced 2025-10-01 04:00:51 +02:00

Compare commits

..

28 Commits

Author SHA1 Message Date
Stypox
47f9ed08e9 Merge pull request #7934 from TeamNewPipe/release/0.22.1
Release 0.22.1
2022-02-26 22:01:30 +01:00
Hosted Weblate
ee3c06394d Translated using Weblate (Swedish)
Currently translated at 49.2% (32 of 65 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Greek)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 58.4% (38 of 65 strings)

Translated using Weblate (Dutch (Belgium))

Currently translated at 23.0% (15 of 65 strings)

Translated using Weblate (French)

Currently translated at 66.1% (43 of 65 strings)

Translated using Weblate (Azerbaijani)

Currently translated at 7.6% (5 of 65 strings)

Translated using Weblate (Italian)

Currently translated at 38.4% (25 of 65 strings)

Translated using Weblate (Polish)

Currently translated at 55.3% (36 of 65 strings)

Translated using Weblate (Hebrew)

Currently translated at 53.8% (35 of 65 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (65 of 65 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 7.6% (5 of 65 strings)

Translated using Weblate (German)

Currently translated at 66.1% (43 of 65 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (English)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (English)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (English)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (French)

Currently translated at 65.6% (42 of 64 strings)

Translated using Weblate (Dutch)

Currently translated at 71.8% (46 of 64 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 80.4% (493 of 613 strings)

Translated using Weblate (French)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (613 of 613 strings)

Co-authored-by: Agnieszka C <aga_04@o2.pl>
Co-authored-by: Alex25820 <alexs25820@gmail.com>
Co-authored-by: Benedikt Freisen <b.freisen@gmx.net>
Co-authored-by: Corc <nizamismidov4@gmail.com>
Co-authored-by: Guillem <guillemglez@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Issa1553 <fairfull.playing@gmail.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Mohammed Anas <triallax@tutanota.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: Ray <ray.cfu@protonmail.com>
Co-authored-by: Retrial <giwrgosmant@gmail.com>
Co-authored-by: Stypox <stypox@pm.me>
Co-authored-by: TiA4f8R <avdivers84@gmail.com>
Co-authored-by: Vitor Henrique <vitorhcl00@gmail.com>
Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Co-authored-by: mm4c <oldblue@vivaldi.net>
Co-authored-by: ssantos <ssantos@web.de>
Co-authored-by: zmni <zmni@outlook.com>
Co-authored-by: Éfrit <efrit@posteo.net>
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/az/
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/he/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nl/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nl_BE/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sv/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/uk/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant_HK/
Translation: NewPipe/Metadata
2022-02-26 18:52:17 +01:00
Stypox
443ebc46d6 Release 0.22.1 (984) 2022-02-23 15:16:37 +01:00
Tobi
c42f29446d Merge pull request #7924 from litetex/revert-7451
Revert "Respect cutouts when playing in MultiWindow"
2022-02-21 21:36:07 +01:00
litetex
1030e09fc1 Merge pull request #7901 from Stypox/player-small-refactor
Small refactor in player class
2022-02-21 20:48:03 +01:00
litetex
96b930cd07 Revert "Respect cutouts when playing in MultiWindow"
This reverts commit c92a90749e.
2022-02-21 20:30:56 +01:00
litetex
de08edb831 Merge pull request #7898 from Stypox/regression-arc
Have fast seek overlay arc go under system ui
2022-02-21 20:19:22 +01:00
Stypox
af80d96b9e Merge pull request #7659 from litetex/load-enough-initial-data
Load enough initial items (into BaseListFragment and descendants)
2022-02-19 15:43:13 +01:00
Stypox
3c23fb0b13 Small refactor in player class 2022-02-19 13:30:55 +01:00
Tobi
750490cd2f Merge pull request #7900 from Stypox/increment-compile-sdk
Change `compileSdk` from 30 to 31
2022-02-19 12:35:13 +01:00
Stypox
579b8611be Change compileSdk from 30 to 31
This will allow newer libraries to be used, see #7782 and #2335. This should have no changes on the app since the targetSdk stayed the same.
2022-02-19 12:00:04 +01:00
Stypox
da12b92d75 Fix fast seek arc not going under system ui 2022-02-19 11:29:33 +01:00
TobiGr
a3f99bd781 Merge branch 'master' into dev 2022-02-19 10:56:19 +01:00
litetex
2acaefdb2a Fixed scrolling not working when rotating device 2022-02-17 20:59:41 +01:00
litetex
9c2cdd2513 Removed useless code
https://github.com/TeamNewPipe/NewPipe/pull/7659#discussion_r793752985
2022-02-17 20:59:40 +01:00
litetex
01683aa816 Code improvements 2022-02-17 20:59:39 +01:00
litetex
85f701b94e Fixed listener not re-registering after e.g. a new search is started 2022-02-17 20:59:38 +01:00
litetex
ff7cfe4715 Reverted to loading behavior of #7638 and improved it
The previous/reverted behavior caused unwanted data transmission:
* Removed loading via handleResults/loadMoreItems-callback because the RecyclerView is apparently not immediately updated in the UI when the data is set which causes one load of data to much.
2022-02-17 20:59:38 +01:00
litetex
d3cd3d62b4 Tried to repair #4475 and #3368
* Always recreate the footer so that it's not possible to attach the same instance twice
* Removed support for creating a custom footer as it's never used
* Supply the header with an supplier
  * This might not fix the problem completely as we currently can only create the header once inside Channel, Playlist and RelatedItems-Fragment - allowing creation of multiple headers might be done in the future if the issues still arise
* Other minor fixes
2022-02-17 20:59:36 +01:00
litetex
91c67b085b Code improvements
Removed - partial - stupid code.
2022-02-17 20:59:35 +01:00
litetex
cd8c7ec3c0 Removed InfoListAdapter from checkstyle-suppressions
because if you modify something in the code the suppressions-file no longer matches
2022-02-17 20:59:34 +01:00
litetex
2c51a7970d Improved InfoListAdapter
* Removed unused code
* Cleaned it up
* Made code more readable
2022-02-17 20:59:33 +01:00
litetex
fb362022f7 Load enough initial data into BaseListFragment 2022-02-17 20:59:33 +01:00
litetex
2814ae6d3c Merge pull request #7884 from litetex/improve-image-minimizer
Improved image-minimizer
2022-02-17 19:33:39 +01:00
litetex
7225199deb Fixed typo
It was late when I typed this 😆
2022-02-16 20:31:15 +01:00
litetex
c08a4e851b Improved image-minimizer
* Don't minimize images that are too wide -> they will get stretched otherwise
* Don't try to modify the issue/comment when nothing changed
* Fixed typo
2022-02-15 20:09:21 +01:00
Robin
9f8e8c0856 Merge pull request #7679 from TacoTheDank/reportSenderKotlin
Update ACRA library
2022-02-14 15:35:00 +01:00
TacoTheDank
79060f0bfe Update ACRA library 2022-02-02 13:12:29 -05:00
55 changed files with 599 additions and 271 deletions

View File

@@ -4,7 +4,12 @@
module.exports = async ({github, context}) => {
const IGNORE_KEY = '<!-- IGNORE IMAGE MINIFY -->';
const IGNORE_ALT_NAME_END = 'ignoreImageMinify';
// Targeted maximum height
const IMG_MAX_HEIGHT_PX = 600;
// maximum width of GitHub issues/comments
const IMG_MAX_WIDTH_PX = 800;
// all images that have a lower aspect ratio (-> have a smaller width) than this will be minimized
const MIN_ASPECT_RATIO = IMG_MAX_WIDTH_PX / IMG_MAX_HEIGHT_PX
// Get the body of the image
let initialBody = null;
@@ -39,6 +44,8 @@ module.exports = async ({github, context}) => {
// Require the probe lib for getting the image dimensions
const probe = require('probe-image-size');
var wasMatchModified = false;
// Try to find and replace the images with minimized ones
let newBody = await replaceAsync(initialBody, REGEX_IMAGE_LOOKUP, async (match, g1, g2) => {
console.log(`Found match '${match}'`);
@@ -48,7 +55,7 @@ module.exports = async ({github, context}) => {
return match;
}
let shouldModifiy = false;
let shouldModify = false;
try {
console.log(`Probing ${g2}`);
let probeResult = await probe(g2);
@@ -58,15 +65,26 @@ module.exports = async ({github, context}) => {
if (probeResult.hUnits != 'px') {
throw `Unexpected probeResult.hUnits (expected px but got ${probeResult.hUnits})`;
}
if (probeResult.height <= 0) {
throw `Unexpected probeResult.height (height is invalid: ${probeResult.height})`;
}
if (probeResult.wUnits != 'px') {
throw `Unexpected probeResult.wUnits (expected px but got ${probeResult.wUnits})`;
}
if (probeResult.width <= 0) {
throw `Unexpected probeResult.width (width is invalid: ${probeResult.width})`;
}
console.log(`Probing resulted in ${probeResult.width}x${probeResult.height}px`);
shouldModifiy = probeResult.height > IMG_MAX_HEIGHT_PX;
shouldModify = probeResult.height > IMG_MAX_HEIGHT_PX && (probeResult.width / probeResult.height) < MIN_ASPECT_RATIO;
} catch(e) {
console.log('Probing failed:', e);
// Immediately abort
return match;
}
if (shouldModifiy) {
if (shouldModify) {
wasMatchModified = true;
console.log(`Modifying match '${match}'`);
return `<img alt="${g1}" src="${g2}" height=${IMG_MAX_HEIGHT_PX} />`;
}
@@ -75,6 +93,11 @@ module.exports = async ({github, context}) => {
return match;
});
if (!wasMatchModified) {
console.log('Nothing was modified. Skipping update');
return;
}
// Update the corresponding element
if (context.eventName == 'issue_comment') {
console.log('Updating comment with id', context.payload.comment.id);

View File

@@ -8,7 +8,7 @@ plugins {
}
android {
compileSdk 30
compileSdk 31
buildToolsVersion '30.0.3'
defaultConfig {
@@ -16,8 +16,8 @@ android {
resValue "string", "app_name", "NewPipe"
minSdk 19
targetSdk 29
versionCode 983
versionName "0.22.0"
versionCode 984
versionName "0.22.1"
multiDexEnabled true
@@ -260,7 +260,7 @@ dependencies {
implementation "com.nononsenseapps:filepicker:4.2.1"
// Crash reporting
implementation "ch.acra:acra-core:5.7.0"
implementation "ch.acra:acra-core:5.8.4"
// Properly restarting
implementation 'com.jakewharton:process-phoenix:2.1.2'

View File

@@ -13,13 +13,8 @@ import androidx.preference.PreferenceManager;
import com.jakewharton.processphoenix.ProcessPhoenix;
import org.acra.ACRA;
import org.acra.config.ACRAConfigurationException;
import org.acra.config.CoreConfiguration;
import org.acra.config.CoreConfigurationBuilder;
import org.schabi.newpipe.error.ErrorInfo;
import org.schabi.newpipe.error.ErrorUtil;
import org.schabi.newpipe.error.ReCaptchaActivity;
import org.schabi.newpipe.error.UserAction;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.downloader.Downloader;
import org.schabi.newpipe.ktx.ExceptionUtils;
@@ -210,16 +205,9 @@ public class App extends MultiDexApplication {
return;
}
try {
final CoreConfiguration acraConfig = new CoreConfigurationBuilder(this)
.setBuildConfigClass(BuildConfig.class)
.build();
ACRA.init(this, acraConfig);
} catch (final ACRAConfigurationException exception) {
exception.printStackTrace();
ErrorUtil.openActivity(this, new ErrorInfo(exception,
UserAction.SOMETHING_ELSE, "Could not initialize ACRA crash report"));
}
final CoreConfigurationBuilder acraConfig = new CoreConfigurationBuilder(this)
.withBuildConfigClass(BuildConfig.class);
ACRA.init(this, acraConfig);
}
private void initNotificationChannels() {

View File

@@ -1994,9 +1994,7 @@ public final class VideoDetailFragment
// Prevent jumping of the player on devices with cutout
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
activity.getWindow().getAttributes().layoutInDisplayCutoutMode =
isMultiWindowOrFullscreen()
? WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
: WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
}
activity.getWindow().getDecorView().setSystemUiVisibility(0);
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
@@ -2018,9 +2016,7 @@ public final class VideoDetailFragment
// Prevent jumping of the player on devices with cutout
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
activity.getWindow().getAttributes().layoutInDisplayCutoutMode =
isMultiWindowOrFullscreen()
? WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
: WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
}
int visibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
@@ -2037,7 +2033,7 @@ public final class VideoDetailFragment
activity.getWindow().getDecorView().setSystemUiVisibility(visibility);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
&& isMultiWindowOrFullscreen()) {
&& (isInMultiWindow || (isPlayerAvailable() && player.isFullscreen()))) {
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
activity.getWindow().setNavigationBarColor(Color.TRANSPARENT);
}
@@ -2053,11 +2049,6 @@ public final class VideoDetailFragment
}
}
private boolean isMultiWindowOrFullscreen() {
return DeviceUtils.isInMultiWindow(activity)
|| (isPlayerAvailable() && player.isFullscreen());
}
private boolean playerIsNotStopped() {
return isPlayerAvailable() && !player.isStopped();
}

View File

@@ -17,10 +17,8 @@ import androidx.appcompat.app.ActionBar;
import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewbinding.ViewBinding;
import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.PignateFooterBinding;
import org.schabi.newpipe.error.ErrorUtil;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
@@ -44,6 +42,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Queue;
import java.util.function.Supplier;
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
import static org.schabi.newpipe.ktx.ViewUtils.animate;
@@ -79,11 +78,6 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I>
}
}
@Override
public void onDetach() {
super.onDetach();
}
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -220,14 +214,10 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I>
//////////////////////////////////////////////////////////////////////////*/
@Nullable
protected ViewBinding getListHeader() {
protected Supplier<View> getListHeaderSupplier() {
return null;
}
protected ViewBinding getListFooter() {
return PignateFooterBinding.inflate(activity.getLayoutInflater(), itemsList, false);
}
protected RecyclerView.LayoutManager getListLayoutManager() {
return new SuperScrollLayoutManager(activity);
}
@@ -252,11 +242,10 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I>
itemsList.setLayoutManager(useGrid ? getGridLayoutManager() : getListLayoutManager());
infoListAdapter.setUseGridVariant(useGrid);
infoListAdapter.setFooter(getListFooter().getRoot());
final ViewBinding listHeader = getListHeader();
if (listHeader != null) {
infoListAdapter.setHeader(listHeader.getRoot());
final Supplier<View> listHeaderSupplier = getListHeaderSupplier();
if (listHeaderSupplier != null) {
infoListAdapter.setHeaderSupplier(listHeaderSupplier);
}
itemsList.setAdapter(infoListAdapter);
@@ -271,7 +260,7 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I>
@Override
protected void initListeners() {
super.initListeners();
infoListAdapter.setOnStreamSelectedListener(new OnClickGesture<StreamInfoItem>() {
infoListAdapter.setOnStreamSelectedListener(new OnClickGesture<>() {
@Override
public void selected(final StreamInfoItem selectedItem) {
onStreamSelected(selectedItem);
@@ -315,22 +304,98 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I>
}
});
infoListAdapter.setOnCommentsSelectedListener(new OnClickGesture<CommentsInfoItem>() {
infoListAdapter.setOnCommentsSelectedListener(new OnClickGesture<>() {
@Override
public void selected(final CommentsInfoItem selectedItem) {
onItemSelected(selectedItem);
}
});
// Ensure that there is always a scroll listener (e.g. when rotating the device)
useNormalItemListScrollListener();
}
/**
* Removes all listeners and adds the normal scroll listener to the {@link #itemsList}.
*/
protected void useNormalItemListScrollListener() {
if (DEBUG) {
Log.d(TAG, "useNormalItemListScrollListener called");
}
itemsList.clearOnScrollListeners();
itemsList.addOnScrollListener(new OnScrollBelowItemsListener() {
itemsList.addOnScrollListener(new DefaultItemListOnScrolledDownListener());
}
/**
* Removes all listeners and adds the initial scroll listener to the {@link #itemsList}.
* <br/>
* Which tries to load more items when not enough are in the view (not scrollable)
* and more are available.
* <br/>
* Note: This method only works because "This callback will also be called if visible
* item range changes after a layout calculation. In that case, dx and dy will be 0."
* - which might be unexpected because no actual scrolling occurs...
* <br/>
* This listener will be replaced by DefaultItemListOnScrolledDownListener when
* <ul>
* <li>the view was actually scrolled</li>
* <li>the view is scrollable</li>
* <li>no more items can be loaded</li>
* </ul>
*/
protected void useInitialItemListLoadScrollListener() {
if (DEBUG) {
Log.d(TAG, "useInitialItemListLoadScrollListener called");
}
itemsList.clearOnScrollListeners();
itemsList.addOnScrollListener(new DefaultItemListOnScrolledDownListener() {
@Override
public void onScrolledDown(final RecyclerView recyclerView) {
onScrollToBottom();
public void onScrolled(final RecyclerView recyclerView, final int dx, final int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy != 0) {
log("Vertical scroll occurred");
useNormalItemListScrollListener();
return;
}
if (isLoading.get()) {
log("Still loading data -> Skipping");
return;
}
if (!hasMoreItems()) {
log("No more items to load");
useNormalItemListScrollListener();
return;
}
if (itemsList.canScrollVertically(1)
|| itemsList.canScrollVertically(-1)) {
log("View is scrollable");
useNormalItemListScrollListener();
return;
}
log("Loading more data");
loadMoreItems();
}
private void log(final String msg) {
if (DEBUG) {
Log.d(TAG, "initItemListLoadScrollListener - " + msg);
}
}
});
}
class DefaultItemListOnScrolledDownListener extends OnScrollBelowItemsListener {
@Override
public void onScrolledDown(final RecyclerView recyclerView) {
onScrollToBottom();
}
}
private void onStreamSelected(final StreamInfoItem selectedItem) {
onItemSelected(selectedItem);
NavigationHelper.openVideoDetailFragment(requireContext(), getFM(),
@@ -418,6 +483,12 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I>
// Load and handle
//////////////////////////////////////////////////////////////////////////*/
@Override
protected void startLoading(final boolean forceLoad) {
useInitialItemListLoadScrollListener();
super.startLoading(forceLoad);
}
protected abstract void loadMoreItems();
protected abstract boolean hasMoreItems();

View File

@@ -65,7 +65,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo>
super.onResume();
// Check if it was loading when the fragment was stopped/paused,
if (wasLoading.getAndSet(false)) {
if (hasMoreItems() && infoListAdapter.getItemsList().size() > 0) {
if (hasMoreItems() && !infoListAdapter.getItemsList().isEmpty()) {
loadMoreItems();
} else {
doInitialLoadLogic();
@@ -105,6 +105,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo>
// Load and handle
//////////////////////////////////////////////////////////////////////////*/
@Override
protected void doInitialLoadLogic() {
if (DEBUG) {
Log.d(TAG, "doInitialLoadLogic() called");
@@ -158,6 +159,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo>
*/
protected abstract Single<ListExtractor.InfoItemsPage> loadMoreItemsLogic();
@Override
protected void loadMoreItems() {
isLoading.set(true);
@@ -171,9 +173,9 @@ public abstract class BaseListInfoFragment<I extends ListInfo>
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doFinally(this::allowDownwardFocusScroll)
.subscribe((@NonNull ListExtractor.InfoItemsPage InfoItemsPage) -> {
.subscribe(infoItemsPage -> {
isLoading.set(false);
handleNextItems(InfoItemsPage);
handleNextItems(infoItemsPage);
}, (@NonNull Throwable throwable) ->
dynamicallyShowErrorPanelOrSnackbar(new ErrorInfo(throwable,
errorUserAction, "Loading more items: " + url, serviceId)));
@@ -223,7 +225,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo>
setTitle(name);
if (infoListAdapter.getItemsList().isEmpty()) {
if (result.getRelatedItems().size() > 0) {
if (!result.getRelatedItems().isEmpty()) {
infoListAdapter.addInfoItemList(result.getRelatedItems());
showListFooter(hasMoreItems());
} else {
@@ -240,7 +242,7 @@ public abstract class BaseListInfoFragment<I extends ListInfo>
final List<Throwable> errors = new ArrayList<>(result.getErrors());
// handling ContentNotSupportedException not to show the error but an appropriate string
// so that crashes won't be sent uselessly and the user will understand what happened
errors.removeIf(throwable -> throwable instanceof ContentNotSupportedException);
errors.removeIf(ContentNotSupportedException.class::isInstance);
if (!errors.isEmpty()) {
dynamicallyShowErrorPanelOrSnackbar(new ErrorInfo(result.getErrors(),

View File

@@ -1,5 +1,9 @@
package org.schabi.newpipe.fragments.list.channel;
import static org.schabi.newpipe.ktx.TextViewUtils.animateTextColor;
import static org.schabi.newpipe.ktx.ViewUtils.animate;
import static org.schabi.newpipe.ktx.ViewUtils.animateBackgroundColor;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
@@ -17,7 +21,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.core.content.ContextCompat;
import androidx.viewbinding.ViewBinding;
import com.jakewharton.rxbinding4.view.RxView;
@@ -29,7 +32,6 @@ import org.schabi.newpipe.databinding.PlaylistControlBinding;
import org.schabi.newpipe.error.ErrorInfo;
import org.schabi.newpipe.error.ErrorUtil;
import org.schabi.newpipe.error.UserAction;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.ListExtractor;
import org.schabi.newpipe.extractor.channel.ChannelInfo;
import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException;
@@ -43,13 +45,14 @@ import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.util.ExtractorHelper;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.external_communication.ShareUtils;
import org.schabi.newpipe.util.PicassoHelper;
import org.schabi.newpipe.util.ThemeHelper;
import org.schabi.newpipe.util.external_communication.ShareUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Observable;
@@ -61,10 +64,6 @@ import io.reactivex.rxjava3.functions.Consumer;
import io.reactivex.rxjava3.functions.Function;
import io.reactivex.rxjava3.schedulers.Schedulers;
import static org.schabi.newpipe.ktx.TextViewUtils.animateTextColor;
import static org.schabi.newpipe.ktx.ViewUtils.animate;
import static org.schabi.newpipe.ktx.ViewUtils.animateBackgroundColor;
public class ChannelFragment extends BaseListInfoFragment<ChannelInfo>
implements View.OnClickListener {
@@ -145,12 +144,12 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo>
//////////////////////////////////////////////////////////////////////////*/
@Override
protected ViewBinding getListHeader() {
protected Supplier<View> getListHeaderSupplier() {
headerBinding = ChannelHeaderBinding
.inflate(activity.getLayoutInflater(), itemsList, false);
playlistControlBinding = headerBinding.playlistControl;
return headerBinding;
return headerBinding::getRoot;
}
@Override
@@ -183,13 +182,6 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo>
}
}
private void openRssFeed() {
final ChannelInfo info = currentInfo;
if (info != null) {
ShareUtils.openUrlInBrowser(requireContext(), info.getFeedUrl(), false);
}
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
@@ -197,7 +189,10 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo>
NavigationHelper.openSettings(requireContext());
break;
case R.id.menu_item_rss:
openRssFeed();
if (currentInfo != null) {
ShareUtils.openUrlInBrowser(
requireContext(), currentInfo.getFeedUrl(), false);
}
break;
case R.id.menu_item_openInBrowser:
if (currentInfo != null) {
@@ -516,12 +511,11 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo>
}
private PlayQueue getPlayQueue(final int index) {
final List<StreamInfoItem> streamItems = new ArrayList<>();
for (final InfoItem i : infoListAdapter.getItemsList()) {
if (i instanceof StreamInfoItem) {
streamItems.add((StreamInfoItem) i);
}
}
final List<StreamInfoItem> streamItems = infoListAdapter.getItemsList().stream()
.filter(StreamInfoItem.class::isInstance)
.map(StreamInfoItem.class::cast)
.collect(Collectors.toList());
return new ChannelPlayQueue(currentInfo.getServiceId(), currentInfo.getUrl(),
currentInfo.getNextPage(), streamItems, index);
}

View File

@@ -1,5 +1,9 @@
package org.schabi.newpipe.fragments.list.playlist;
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
import static org.schabi.newpipe.ktx.ViewUtils.animate;
import static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
@@ -15,7 +19,6 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.viewbinding.ViewBinding;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
@@ -42,17 +45,18 @@ import org.schabi.newpipe.player.helper.PlayerHolder;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.player.playqueue.PlaylistPlayQueue;
import org.schabi.newpipe.util.ExtractorHelper;
import org.schabi.newpipe.util.PicassoHelper;
import org.schabi.newpipe.util.external_communication.KoreUtils;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.external_communication.ShareUtils;
import org.schabi.newpipe.util.PicassoHelper;
import org.schabi.newpipe.util.StreamDialogEntry;
import org.schabi.newpipe.util.external_communication.KoreUtils;
import org.schabi.newpipe.util.external_communication.ShareUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Supplier;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Flowable;
@@ -60,10 +64,6 @@ import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable;
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
import static org.schabi.newpipe.ktx.ViewUtils.animate;
import static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling;
public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
private static final String PICASSO_PLAYLIST_TAG = "PICASSO_PLAYLIST_TAG";
@@ -120,12 +120,12 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
//////////////////////////////////////////////////////////////////////////*/
@Override
protected ViewBinding getListHeader() {
protected Supplier<View> getListHeaderSupplier() {
headerBinding = PlaylistHeaderBinding
.inflate(activity.getLayoutInflater(), itemsList, false);
playlistControlBinding = headerBinding.playlistControl;
return headerBinding;
return headerBinding::getRoot;
}
@Override
@@ -413,7 +413,7 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
}
private Subscriber<List<PlaylistRemoteEntity>> getPlaylistBookmarkSubscriber() {
return new Subscriber<List<PlaylistRemoteEntity>>() {
return new Subscriber<>() {
@Override
public void onSubscribe(final Subscription s) {
if (bookmarkReactor != null) {

View File

@@ -1,6 +1,5 @@
package org.schabi.newpipe.fragments.list.videos;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.LayoutInflater;
@@ -12,7 +11,6 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager;
import androidx.viewbinding.ViewBinding;
import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.RelatedItemsHeaderBinding;
@@ -24,14 +22,14 @@ import org.schabi.newpipe.ktx.ViewUtils;
import org.schabi.newpipe.util.RelatedItemInfo;
import java.io.Serializable;
import java.util.function.Supplier;
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
public class RelatedItemsFragment extends BaseListInfoFragment<RelatedItemInfo>
implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String INFO_KEY = "related_info_key";
private final CompositeDisposable disposables = new CompositeDisposable();
private RelatedItemInfo relatedItemInfo;
/*//////////////////////////////////////////////////////////////////////////
@@ -54,11 +52,6 @@ public class RelatedItemsFragment extends BaseListInfoFragment<RelatedItemInfo>
// LifeCycle
//////////////////////////////////////////////////////////////////////////*/
@Override
public void onAttach(@NonNull final Context context) {
super.onAttach(context);
}
@Override
public View onCreateView(@NonNull final LayoutInflater inflater,
@Nullable final ViewGroup container,
@@ -66,12 +59,6 @@ public class RelatedItemsFragment extends BaseListInfoFragment<RelatedItemInfo>
return inflater.inflate(R.layout.fragment_related_items, container, false);
}
@Override
public void onDestroy() {
super.onDestroy();
disposables.clear();
}
@Override
public void onDestroyView() {
headerBinding = null;
@@ -79,22 +66,23 @@ public class RelatedItemsFragment extends BaseListInfoFragment<RelatedItemInfo>
}
@Override
protected ViewBinding getListHeader() {
if (relatedItemInfo != null && relatedItemInfo.getRelatedItems() != null) {
headerBinding = RelatedItemsHeaderBinding
.inflate(activity.getLayoutInflater(), itemsList, false);
final SharedPreferences pref = PreferenceManager
.getDefaultSharedPreferences(requireContext());
final boolean autoplay = pref.getBoolean(getString(R.string.auto_queue_key), false);
headerBinding.autoplaySwitch.setChecked(autoplay);
headerBinding.autoplaySwitch.setOnCheckedChangeListener((compoundButton, b) ->
PreferenceManager.getDefaultSharedPreferences(requireContext()).edit()
.putBoolean(getString(R.string.auto_queue_key), b).apply());
return headerBinding;
} else {
protected Supplier<View> getListHeaderSupplier() {
if (relatedItemInfo == null || relatedItemInfo.getRelatedItems() == null) {
return null;
}
headerBinding = RelatedItemsHeaderBinding
.inflate(activity.getLayoutInflater(), itemsList, false);
final SharedPreferences pref = PreferenceManager
.getDefaultSharedPreferences(requireContext());
final boolean autoplay = pref.getBoolean(getString(R.string.auto_queue_key), false);
headerBinding.autoplaySwitch.setChecked(autoplay);
headerBinding.autoplaySwitch.setOnCheckedChangeListener((compoundButton, b) ->
PreferenceManager.getDefaultSharedPreferences(requireContext()).edit()
.putBoolean(getString(R.string.auto_queue_key), b).apply());
return headerBinding::getRoot;
}
@Override
@@ -128,7 +116,6 @@ public class RelatedItemsFragment extends BaseListInfoFragment<RelatedItemInfo>
}
ViewUtils.slideUp(requireView(), 120, 96, 0.06f);
disposables.clear();
}
/*//////////////////////////////////////////////////////////////////////////
@@ -137,11 +124,13 @@ public class RelatedItemsFragment extends BaseListInfoFragment<RelatedItemInfo>
@Override
public void setTitle(final String title) {
// Nothing to do - override parent
}
@Override
public void onCreateOptionsMenu(@NonNull final Menu menu,
@NonNull final MenuInflater inflater) {
// Nothing to do - override parent
}
private void setInitialData(final StreamInfo info) {
@@ -169,11 +158,10 @@ public class RelatedItemsFragment extends BaseListInfoFragment<RelatedItemInfo>
@Override
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences,
final String s) {
final SharedPreferences pref =
PreferenceManager.getDefaultSharedPreferences(requireContext());
final boolean autoplay = pref.getBoolean(getString(R.string.auto_queue_key), false);
if (headerBinding != null) {
headerBinding.autoplaySwitch.setChecked(autoplay);
headerBinding.autoplaySwitch.setChecked(
sharedPreferences.getBoolean(
getString(R.string.auto_queue_key), false));
}
}

View File

@@ -580,11 +580,17 @@ public final class Player implements
v.getPaddingTop(),
v.getPaddingRight(),
v.getPaddingBottom());
binding.fastSeekOverlay.setPadding(
v.getPaddingLeft(),
v.getPaddingTop(),
v.getPaddingRight(),
v.getPaddingBottom());
// If we added padding to the fast seek overlay, too, it would not go under the
// system ui. Instead we apply negative margins equal to the window insets of
// the opposite side, so that the view covers all of the player (overflowing on
// some sides) and its center coincides with the center of other controls.
final RelativeLayout.LayoutParams fastSeekParams = (RelativeLayout.LayoutParams)
binding.fastSeekOverlay.getLayoutParams();
fastSeekParams.leftMargin = -v.getPaddingRight();
fastSeekParams.topMargin = -v.getPaddingBottom();
fastSeekParams.rightMargin = -v.getPaddingLeft();
fastSeekParams.bottomMargin = -v.getPaddingTop();
});
}
@@ -593,8 +599,7 @@ public final class Player implements
*/
private void setupPlayerSeekOverlay() {
binding.fastSeekOverlay
.seekSecondsSupplier(
() -> (int) (retrieveSeekDurationFromPreferences(this) / 1000.0f))
.seekSecondsSupplier(() -> retrieveSeekDurationFromPreferences(this) / 1000)
.performListener(new PlayerFastSeekOverlay.PerformListener() {
@Override
@@ -607,6 +612,7 @@ public final class Player implements
animate(binding.fastSeekOverlay, false, SEEK_OVERLAY_DURATION);
}
@NonNull
@Override
public FastSeekDirection getFastSeekDirection(
@NonNull final DisplayPortion portion

View File

@@ -329,7 +329,7 @@
\nتوضح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير الأعطال.</string>
<string name="read_privacy_policy">الإطلاع على سياسة الخصوصية</string>
<string name="start_accept_privacy_policy">من أجل الامتثال للائحة الأوروبية العامة لحماية البيانات (GDPR)، فإننا نلفت انتباهك إلى سياسة خصوصية NewPipe. يرجى قراءتها بعناية.
\nو يجب عليك قبولها لإرسال تقرير الأخطاء إلينا.</string>
\nويجب عليك قبولها لإرسال تقرير الأخطاء إلينا.</string>
<string name="accept">قبول</string>
<string name="decline">رفض</string>
<string name="limit_data_usage_none_description">لا حدود</string>
@@ -637,7 +637,7 @@
<string name="georestricted_content">هذا المحتوى غير متوفر في بلدك.</string>
<string name="crash_the_app">اغلق التطبيق قسريا</string>
<string name="restricted_video_no_stream">هذا الفيديو مقيد بالفئة العمرية.
\nنظرا لسياسات YouTube الجديدة المتعلقة بمقاطع الفيديو المقيدة بالفئة العمرية، لا يمكن لـNewPipe الوصول إلى أي من مقاطع الفيديو الخاصة بها وبالتالي لا يمكن تشغيلها.</string>
\nنظرًا لسياسات YouTube الجديدة المتعلقة بمقاطع الفيديو المقيدة بالفئة العمرية، لا يمكن لـNewPipe الوصول إلى أي من مقاطع الفيديو الخاصة بها وبالتالي لا يمكن تشغيلها.</string>
<string name="radio">إذاعة</string>
<string name="featured">المميزة</string>
<string name="recaptcha_solve">حل</string>
@@ -688,7 +688,7 @@
<string name="high_quality_larger">جودة عالية (أكبر)</string>
<string name="seekbar_preview_thumbnail_title">معاينة مصغرة على شريط التمرير</string>
<string name="mark_as_watched">علّمه كفيديو تمت مشاهدته</string>
<string name="detail_heart_img_view_description">أعجب بها منشئ المحتوى</string>
<string name="detail_heart_img_view_description">أُعجب بها منشئ المحتوى</string>
<string name="loading_channel_details">جاري تحميل تفاصيل القناة…</string>
<string name="error_show_channel_details">خطأ في عرض تفاصيل القناة</string>
<string name="show_image_indicators_summary">أظهر أشرطة ملونة لبيكاسو أعلى الصور تشير إلى مصدرها: الأحمر للشبكة والأزرق للقرص والأخضر للذاكرة</string>

View File

@@ -215,7 +215,7 @@
<string name="playback_speed_control">Controls de la velocitat de reproducció</string>
<string name="playback_tempo">Tempo</string>
<string name="playback_pitch">To</string>
<string name="main_bg_subtitle">Toca la lupa per començar.</string>
<string name="main_bg_subtitle">Toca \"Cerca\" per començar.</string>
<string name="use_external_video_player_summary">Elimina l\'àudio en algunes resolucions</string>
<string name="use_external_audio_player_title">Reproductor d\'àudio extern</string>
<string name="download_thumbnail_summary">Desactiveu-ho per no guardar miniatures i estalviar dades i memòria. Canviant aquesta opció, s\'eliminarà la memòria cau d\'imatges tant de la memòria com de l\'emmagatzematge</string>
@@ -685,7 +685,7 @@
<string name="feed_new_items">Elements de feed nous</string>
<string name="feed_load_error_fast_unknown">El mode d\'alimentació ràpida no proporciona més informació sobre això.</string>
<string name="detail_pinned_comment_view_description">Comentari fixat</string>
<string name="show_crash_the_player_title">Mostrar \"tancar de forma violenta el reproductor\"</string>
<string name="show_crash_the_player_title">Mostra \"Força el tancament del reproductor\"</string>
<string name="show_crash_the_player_summary">Mostra una opció de fallada quan s\'utilitza el reproductor</string>
<string name="show_image_indicators_summary">Mostra les cintes de color Picasso a la part superior de les imatges que indiquen la seva font: vermell per a la xarxa, blau per al disc i verd per a la memòria</string>
<string name="leak_canary_not_available">El LeakCanary no està disponible</string>

View File

@@ -71,7 +71,7 @@
<string name="title_activity_history">Ιστορικό</string>
<string name="action_history">Ιστορικό</string>
<string name="show_info">Εμφάνιση πληροφοριών</string>
<string name="main_bg_subtitle">Πατήστε το μεγενθυτικό φακό για να ξεκινήσετε.</string>
<string name="main_bg_subtitle">Πατήστε το μεγεθυντικό φακό για να ξεκινήσετε.</string>
<string name="no_player_found_toast">Δε βρέθηκε πρόγραμμα αναπαραγωγής ροής δεδομένων (μπορείτε να εγκαταστήσετε το VLC για να κάνετε αναπαραγωγή).</string>
<string name="controls_download_desc">Λήψη του αρχείου ροής</string>
<string name="use_external_video_player_summary">Αφαιρείται ο ήχος από κάποιες αναλύσεις</string>

View File

@@ -52,7 +52,7 @@
<string name="duration_live">En direct</string>
<string name="could_not_load_thumbnails">Impossible de charger toutes les miniatures</string>
<string name="youtube_signature_deobfuscation_error">Impossible de déchiffrer la signature URL de la vidéo</string>
<string name="sorry_string">Désolé, cela n\'aurait pas dû se produire.</string>
<string name="sorry_string">Désolé, cela naurait pas dû se produire.</string>
<string name="error_report_button_text">Signaler cette erreur par courriel</string>
<string name="what_device_headline">Information :</string>
<string name="what_happened_headline">Ce qui sest passé :</string>
@@ -73,7 +73,7 @@
<string name="checksum">Somme de contrôle</string>
<string name="ok">OK</string>
<string name="msg_name">Nom du fichier</string>
<string name="msg_threads">Nombre de connexions simultanées</string>
<string name="msg_threads">Connexions simultanées</string>
<string name="msg_error">Erreur</string>
<string name="msg_running">NewPipe télécharge</string>
<string name="msg_running_detail">Appuyer pour plus de détails</string>
@@ -668,8 +668,8 @@
<string name="main_page_content_swipe_remove">Balayez un élément pour le supprimer</string>
<string name="start_main_player_fullscreen_summary">Ne pas lancer les vidéos dans le mini lecteur mais directement en plein écran si la rotation automatique est verrouillée. Vous pouvez toujours accéder au mini-lecteur en quittant le mode plein écran</string>
<string name="start_main_player_fullscreen_title">Lancer le lecteur principal en plein écran</string>
<string name="enqueue_next_stream">Mettre en file dattente la suivante</string>
<string name="enqueued_next">Placé comme suivant dans liste de lecture</string>
<string name="enqueue_next_stream">Ajouter à la liste de lecture</string>
<string name="enqueued_next">Suivant dans la liste de lecture</string>
<string name="processing_may_take_a_moment">Traitement en cours… Veuillez patienter</string>
<string name="manual_update_description">Vérifier manuellement de nouvelles versions</string>
<string name="checking_updates_toast">Vérification des mises à jour…</string>
@@ -685,7 +685,7 @@
<string name="create_error_notification">Créer une notification d\'erreur</string>
<string name="no_appropriate_file_manager_message_android_10">Aucun gestionnaire de fichiers approprié n\'a été trouvé pour cette action.
\nVeuillez installer un gestionnaire de fichiers compatible avec l\'Infrastructure d\'accès au stockage.</string>
<string name="show_error_snackbar">Afficher une barre d\'erreur</string>
<string name="show_error_snackbar">Afficher une barre derreur</string>
<string name="no_appropriate_file_manager_message">Aucun gestionnaire de fichier approprié n\'a été trouvé pour cette action.
\nVeuillez installer un gestionnaire de fichiers ou essayez de désactiver \'%s\' dans les paramètres de téléchargement.</string>
<string name="detail_pinned_comment_view_description">Commentaire épinglé</string>

View File

@@ -661,7 +661,7 @@
<string name="manual_update_description">Periksa manual untuk versi baru</string>
<string name="checking_updates_toast">Memeriksa pembaruan…</string>
<string name="feed_new_items">Item feed baru</string>
<string name="show_crash_the_player_title">Tampilkan \"hentikan pemain video\"</string>
<string name="show_crash_the_player_title">Tampilkan \"Mogokkan pemutar\"</string>
<string name="show_crash_the_player_summary">Menampilkan opsi penghentian ketika menggunakan pemain video</string>
<string name="crash_the_player">Hentikan pemain video</string>
<string name="error_report_channel_description">Notifikasi untuk melaporkan kegalatan</string>

View File

@@ -316,7 +316,7 @@
<string name="search_history_deleted">Usunięto historię wyszukiwania</string>
<string name="one_item_deleted">Usunięto jedną pozycję.</string>
<string name="toast_no_player">Brak zainstalowanej aplikacji do odtworzenia tego pliku</string>
<string name="app_license">NewPipe jest wolnym i bezpłatnym oprogramowaniem: Możesz używać, udostępniać i ulepszać je do woli. W szczególności możesz je redystrybuować i/lub modyfikować zgodnie z warunkami GNU General Public License opublikowanej przez Free Software Fundation w wersji 3 albo (według Twojego wyboru) jakąkolwiek późniejszą wersją.</string>
<string name="app_license">NewPipe jest wolnym i bezpłatnym oprogramowaniem: Możesz używać, udostępniać i ulepszać je do woli. W szczególności możesz je redystrybuować i/lub modyfikować zgodnie z warunkami GNU General Public License, opublikowanej przez Free Software Fundation, w wersji 3 albo (według Twojego wyboru) jakiejkolwiek późniejszej wersji.</string>
<string name="import_settings">Czy chcesz zaimportować również ustawienia?</string>
<string name="privacy_policy_title">Polityka prywatności NewPipe</string>
<string name="privacy_policy_encouragement">Projekt NewPipe bardzo poważnie traktuje Twoją prywatność, dlatego aplikacja nie gromadzi żadnych danych bez Twojej zgody.
@@ -377,11 +377,11 @@
<string name="overwrite_finished_warning">Pobrany plik o tej nazwie już istnieje</string>
<string name="download_already_running">Trwa już pobieranie pliku o tej samej nazwie</string>
<string name="show_error">Pokaż błąd</string>
<string name="error_file_creation">Nie można utworzyć pliku</string>
<string name="error_path_creation">Nie można utworzyć folderu docelowego</string>
<string name="error_file_creation">Nie udało się utworzyć pliku</string>
<string name="error_path_creation">Nie udało się utworzyć folderu docelowego</string>
<string name="error_ssl_exception">Nie udało się nawiązać bezpiecznego połączenia</string>
<string name="error_unknown_host">Nie udało się znaleźć serwera</string>
<string name="error_connect_host">Nie można połączyć się z serwerem</string>
<string name="error_connect_host">Nie udało się połączyć z serwerem</string>
<string name="error_http_no_content">Serwer nie wysyła danych</string>
<string name="error_http_unsupported_range">Serwer nie akceptuje pobierania wielowątkowego, spróbuj ponownie za pomocą @string/msg_threads = 1</string>
<string name="error_http_not_found">Nie znaleziono</string>
@@ -408,7 +408,7 @@
<string name="watch_history_states_deleted">Usunięto pozycje odtwarzania</string>
<string name="missing_file">Plik usunięty albo przeniesiony</string>
<string name="overwrite_unrelated_warning">Plik z tą nazwą już istnieje</string>
<string name="overwrite_failed">nie można nadpisać pliku</string>
<string name="overwrite_failed">Nie udało się nadpisać pliku</string>
<string name="download_already_pending">Plik o tej samej nazwie oczekuje na pobranie</string>
<string name="error_postprocessing_stopped">NewPipe został zamknięty podczas pracy nad plikiem</string>
<string name="error_insufficient_storage">Brak miejsca na urządzeniu</string>
@@ -457,7 +457,7 @@
<string name="most_liked">Najbardziej lubiane</string>
<string name="playlist_no_uploader">Wygenerowana automatycznie (nie znaleziono przesyłającego)</string>
<string name="recovering">odzyskiwanie</string>
<string name="error_download_resource_gone">Nie można odzyskać tego pobrania</string>
<string name="error_download_resource_gone">Nie udało się odzyskać tego pobrania</string>
<string name="choose_instance_prompt">Wybierz serwer</string>
<string name="clear_download_history">Wyczyść historię pobierania</string>
<string name="delete_downloaded_files">Usuń pobrane pliki</string>
@@ -481,7 +481,7 @@
\n• Pobieranie całego kanału subskrypcji, co jest powolne, ale kompletne.
\n• Korzystanie z dedykowanego punktu końcowego usługi, co jest szybkie, ale zwykle nie jest kompletne.
\n
\nRóżnica między nimi polega na tym, że w szybkim zwykle brakuje pewnych informacji, takich jak czas trwania lub typ pozycji (nie można odróżnić wideo na żywo od zwykłych) i może zwrócić mniej pozycji.
\nRóżnica między nimi polega na tym, że w szybkim zwykle brakuje pewnych informacji, takich jak czas trwania lub typ pozycji (nie można odróżnić wideo na żywo od zwykłych), i może zwrócić mniej pozycji.
\n
\nYouTube jest przykładem usługi, która oferuje tę szybką metodę z kanałem RSS.
\n
@@ -639,7 +639,7 @@
<string name="metadata_tags">Tagi</string>
<string name="metadata_category">Kategoria</string>
<string name="open_website_license">Otwórz stronę</string>
<string name="description_select_note">Teraz możesz zaznaczyć tekst wewnątrz opisu. Pamiętaj, że strona może migotać, a łącza mogą nie b klikalne w trybie zaznaczania.</string>
<string name="description_select_note">Teraz możesz zaznaczyć tekst wewnątrz opisu. Pamiętaj, że w trybie zaznaczania strona może migotać i linki nie będą klikalne.</string>
<string name="service_provides_reason">%s podaje ten powód:</string>
<string name="account_terminated">Konto zamknięte</string>
<string name="feed_load_error_fast_unknown">Tryb szybki dla ładowania kanału nie dostarcza więcej informacji na ten temat.</string>

View File

@@ -410,7 +410,7 @@
<string name="error_timeout">Tempo limite de conexão</string>
<string name="confirm_prompt">Excluir todo o histórico de downloads ou excluir todos os arquivos baixados\?</string>
<string name="enable_queue_limit">Limitar fila de downloads</string>
<string name="enable_queue_limit_desc">Um download será feito por vez</string>
<string name="enable_queue_limit_desc">Faz downloads um de cada vez</string>
<string name="start_downloads">Iniciar downloads</string>
<string name="pause_downloads">Pausar downloads</string>
<string name="downloads_storage_ask_title">Perguntar onde salvar o arquivo</string>

View File

@@ -323,7 +323,7 @@
<string name="skip_silence_checkbox">Snabbspola vid frånvaro av ljud</string>
<string name="playback_step">Steg</string>
<string name="playback_reset">Återställ</string>
<string name="start_accept_privacy_policy">För att uppfylla den Europeiska dataskyddsförordningen (GDPR) uppmärksammar vi er härmed NewPipes sekretesspolicy. Var god läs den noggrant.
<string name="start_accept_privacy_policy">För att uppfylla den Europeiska dataskyddsförordningen (GDPR), uppmärksammar vi härmed NewPipes sekretesspolicy. Var god och läs den noggrant.
\nDu måste acceptera den för att kunna skicka felrapporten.</string>
<string name="accept">Acceptera</string>
<string name="decline">Avböj</string>
@@ -673,7 +673,7 @@
<string name="manual_update_description">Kolla manuellt efter nya versioner</string>
<string name="checking_updates_toast">Söker efter uppdateringar…</string>
<string name="feed_new_items">Nya flödes objekt</string>
<string name="show_crash_the_player_title">Visa \"krascha spelaren\"</string>
<string name="show_crash_the_player_title">Visa \"Krascha spelaren\"</string>
<string name="crash_the_player">Krascha spelaren</string>
<string name="show_crash_the_player_summary">Visar ett kraschalternativ vid användning av spelaren</string>
<string name="error_report_channel_name">Felrapport-avisering</string>

View File

@@ -29,7 +29,7 @@
<string name="content_language_title">內容預設語言</string>
<string name="settings_category_video_audio_title">影音</string>
<string name="settings_category_appearance_title">外觀</string>
<string name="background_player_playing_toast">背景播放</string>
<string name="background_player_playing_toast">幕後播緊</string>
<string name="network_error">網絡問題</string>
<string name="detail_thumbnail_view_description">播放影片,片長:</string>
<string name="detail_uploader_thumbnail_view_description">上載者嘅頭像縮圖</string>
@@ -95,8 +95,8 @@
<string name="msg_popup_permission">畫中畫模式需要此權限</string>
<string name="recaptcha_request_toast">需完成 reCAPTCHA 挑戰</string>
<string name="use_external_video_player_summary">某啲解像度可能會冇聲</string>
<string name="controls_background_title">背景播放</string>
<string name="controls_popup_title">畫中畫播放</string>
<string name="controls_background_title">幕後播</string>
<string name="controls_popup_title">浮面播</string>
<string name="popup_remember_size_pos_title">記住畫中畫大小及位置</string>
<string name="popup_remember_size_pos_summary">記住最近設定的畫中畫大小及位置</string>
<string name="show_search_suggestions_title">搜尋建議</string>
@@ -126,7 +126,7 @@
<string name="subscription_change_failed">轉唔到訂閱</string>
<string name="subscription_update_failed">更新唔到訂閱</string>
<string name="show_info">顯示資訊</string>
<string name="tab_subscriptions">訂閱項目</string>
<string name="tab_subscriptions">訂閱</string>
<string name="tab_bookmarks">已收藏播放清單</string>
<string name="use_inexact_seek_title">用粗略快轉</string>
<string name="controls_add_to_playlist_title">加入去</string>
@@ -259,7 +259,7 @@
\n您係咪要繼續</string>
<string name="never">幾時都唔使</string>
<string name="auto">自動</string>
<string name="low_quality_smaller">低畫質 (細)</string>
<string name="low_quality_smaller">低畫質 (細格啲)</string>
<string name="dont_show">唔顯示</string>
<string name="app_update_notification_content_text">撳一下去下載</string>
<string name="no_views">無觀看次數</string>
@@ -309,7 +309,7 @@
<string name="no_videos">無影片</string>
<string name="video_player">影片播放器</string>
<string name="wifi_only">僅限用 Wi-Fi 嘅時候</string>
<string name="high_quality_larger">高畫質 (大)</string>
<string name="high_quality_larger">高畫質 (大格啲)</string>
<string name="no_subscribers">無訂閱者</string>
<plurals name="subscribers">
<item quantity="other">%s 位訂閱者</item>
@@ -334,7 +334,7 @@
<string name="title_most_played">最常播放</string>
<string name="main_page_content">頭版內容</string>
<string name="main_page_content_summary">頭版要擺放邊啲分頁</string>
<string name="main_page_content_swipe_remove">走啲項目去剷走佢</string>
<string name="main_page_content_swipe_remove">打橫掃走啲項目去剷走佢</string>
<string name="blank_page_summary">空白頁</string>
<string name="localization_changes_requires_app_restart">重新開過個 app 之後就會轉新語言</string>
<string name="trending">時興</string>
@@ -422,4 +422,113 @@
<string name="error_report_notification_toast">發生問題,詳見通知</string>
<string name="detail_drag_description">拖拉執排位</string>
<string name="drawer_header_description">轉換服務,而家揀選咗嘅係:</string>
<string name="list_view_mode">清單檢視模式</string>
<string name="error_progress_lost">做噉一半冇咗,因為個檔案刪除咗</string>
<string name="error_timeout">連線等太耐</string>
<string name="start_downloads">開始晒所有下載</string>
<string name="enable_queue_limit_desc">下載排隊逐個嚟,唔要一次過</string>
<string name="recent">近期</string>
<string name="account_terminated">帳戶已被終止</string>
<string name="metadata_language">語言</string>
<string name="metadata_support">支援</string>
<string name="overwrite_failed">覆寫唔到個檔案</string>
<string name="pause_downloads">暫停晒所有下載</string>
<string name="on">開</string>
<string name="tablet_mode_title">平板電腦模式</string>
<string name="error_file_creation">個檔案建立唔到</string>
<string name="delete_item_search_history">您係咪想喺搜尋紀錄度刪除呢個項目?</string>
<string name="show_error">睇下咩問題</string>
<string name="download_already_running">有個整緊嘅下載撞名</string>
<string name="download_already_pending">有個等緊嘅下載撞名</string>
<string name="max_retry_desc">試盡幾多次就取消個下載算數</string>
<string name="show_thumbnail_summary">喺鎖定畫面背景同埋通知都擺放縮圖</string>
<string name="download_has_started">開始咗下載</string>
<string name="metadata_age_limit">年齡限制</string>
<string name="no_app_to_open_intent">您部機冇 app 開到佢</string>
<string name="youtube_music_premium_content">呢部影片係 YouTube Music Premium 會員限定,因此 NewPipe 未能串流或下載。</string>
<string name="night_theme_summary">揀選啱您心水嘅夜色主題 — %s</string>
<string name="paid_content">呢部內容係付費使用者限定,因此 NewPipe 未能串流或下載。</string>
<string name="select_night_theme_toast">您可以喺下面揀選啱您心水嘅夜色主題</string>
<string name="description_select_disable">停用揀選描述入面嘅文字</string>
<string name="grid">一格格</string>
<string name="list">一行行</string>
<string name="add_to_playlist">加入去播放清單</string>
<string name="create_playlist">新嘅播放清單</string>
<string name="show_channel_details">顯示頻道詳情</string>
<string name="error_http_not_found">唔見影</string>
<string name="select_a_playlist">揀選一個播放清單</string>
<string name="error_http_unsupported_range">伺服器唔接受多執行緒下載,請改用 @string/msg_threads = 1 再試下啦</string>
<string name="error_connect_host">連接唔到伺服器</string>
<string name="playlist_page_summary">播放清單頁面</string>
<string name="loading_channel_details">載入緊頻道詳情…</string>
<string name="hold_to_append">撳住就輪候</string>
<string name="error_path_creation">目的地資料夾建立唔到</string>
<string name="error_ssl_exception">建立唔到安全連線</string>
<string name="start_here_on_background">喺幕後開始播放</string>
<string name="error_insufficient_storage">部機冇晒位</string>
<string name="max_retry_msg">頂櫳重試幾多次</string>
<string name="pause_downloads_on_mobile_desc">若然有機會用到流動數據嘅時候,或者用得著,雖則有啲下載或者冇得暫停</string>
<string name="enable_queue_limit">輪住下載</string>
<string name="metadata_privacy_internal">內部</string>
<string name="metadata_privacy_private">私人</string>
<string name="stop">停止</string>
<string name="pause_downloads_on_mobile">按用量收費嘅網絡就閘住</string>
<string name="clear_download_history">抹走下載紀錄</string>
<string name="confirm_prompt">您想抹走您嘅下載紀錄,定係想剷走晒所有下載咗嘅檔案?</string>
<string name="delete_downloaded_files">剷走下載咗嘅檔案</string>
<plurals name="deleted_downloads_toast">
<item quantity="other">刪除咗 %1$s 個下載</item>
</plurals>
<string name="downloads_storage_ask_title">問我要下載去邊</string>
<string name="enqueue">排隊尾</string>
<string name="error_unknown_host">搵唔到伺服器</string>
<string name="error_http_no_content">伺服器冇傳回資料</string>
<string name="error_postprocessing_failed">後期處理失敗</string>
<string name="error_postprocessing_stopped">NewPipe 未搞掂個檔案就關閉咗</string>
<string name="error_download_resource_gone">呢個下載恢復唔到</string>
<string name="overwrite_finished_warning">同個下載咗嘅檔案撞名</string>
<string name="overwrite_unrelated_warning">同個現有嘅檔案撞名</string>
<plurals name="feed_group_dialog_selection_count">
<item quantity="other">揀選咗 %d 個</item>
</plurals>
<string name="feed_group_dialog_select_subscriptions">揀選訂閱</string>
<string name="feed_group_dialog_empty_selection">未有揀選訂閱</string>
<string name="show_thumbnail_title">顯示縮圖</string>
<string name="detail_sub_channel_thumbnail_view_description">頻道嘅頭像縮圖</string>
<string name="channel_created_by">由 %s 建立</string>
<string name="video_detail_by">出自 %s</string>
<string name="chapters">章節</string>
<string name="content_not_supported">呢部內容 NewPipe 仲未支援。
\n
\n希望未來會喺日後嘅版本支援啦。</string>
<string name="feed_toggle_show_played_items">顯示睇過嘅項目</string>
<string name="service_provides_reason">%s 話理由如下:</string>
<string name="no_appropriate_file_manager_message">搵唔到合適嘅檔案總管進行呢個動作。
\n請安裝一個檔案管理程式又或者試下喺下載設定度停用「%s」。</string>
<string name="no_appropriate_file_manager_message_android_10">搵唔到合適嘅檔案總管進行呢個動作。
\n請安裝一個與儲存空間存取框架兼容嘅檔案管理程式。</string>
<string name="georestricted_content">呢部內容限區,喺您所在國家未有提供。</string>
<string name="soundcloud_go_plus_content">呢首 (至少喺您所在國家而言) 係 SoundCloud Go+ 單曲,因此 NewPipe 未能串流或下載。</string>
<string name="private_content">呢部內容屬於私人,因此 NewPipe 未能串流或下載。</string>
<string name="auto_device_theme_title">自動 (跟返部機嘅主題色系)</string>
<string name="featured">精選</string>
<string name="radio">廣播</string>
<string name="description_select_note">您而家可以揀選喺描述入面嘅文字喇。不過要單聲,喺揀選模式嘅時候,個頁面可能眨眨下,同埋啲連結會撳唔到。</string>
<string name="description_select_enable">啟用揀選描述入面嘅文字</string>
<string name="metadata_licence">版權協議</string>
<string name="metadata_category">分類</string>
<string name="metadata_tags">標籤</string>
<string name="metadata_privacy">公開設定</string>
<string name="metadata_thumbnail_url">縮圖 URL</string>
<string name="metadata_privacy_public">公開</string>
<string name="metadata_privacy_unlisted">憑網址瀏覽</string>
<string name="detail_pinned_comment_view_description">置頂留言</string>
<string name="detail_heart_img_view_description">創作者畀咗心心</string>
<string name="open_website_license">開啟網站</string>
<string name="off">關</string>
<string name="error_show_channel_details">顯示頻道詳情嘅時候有問題</string>
<string name="metadata_host">主機</string>
<string name="show_hold_to_append_summary">喺影片「詳情:」度撳一下「幕後播」或者「浮面播」個掣嘅時候顯示提示</string>
<string name="title_activity_history">紀錄</string>
<string name="action_history">紀錄</string>
</resources>

File diff suppressed because one or more lines are too long

View File

@@ -7,10 +7,6 @@
files="LocalItemListAdapter.java"
lines="232,304"/>
<suppress checks="FinalParameters"
files="InfoListAdapter.java"
lines="253,325"/>
<suppress checks="FinalParameters"
files="ListHelper.java"
lines="280,312"/>

View File

@@ -0,0 +1,8 @@
### Təkmilləşdirmələr
-İdxal/ixrac parametrləri #1333
-Həddindən artıq çəkilişi azaldın (performansın yaxşılaşdırılması) #1371
- Kiçik kod təkmilləşdirmələri #1375
- GDPR #1420 haqqında hər şeyi əlavə edin
### Sabit
- Yükləyici: .giga fayllarından bitməmiş endirmələrin yüklənməsi zamanı yaranan nasazlığı aradan qaldırın #1407

View File

@@ -0,0 +1,7 @@
### Təkmilləşdirmələr
- Mobil datadan istifadə edərkən video keyfiyyətini məhdudlaşdırmaq imkanı əlavə edildi. #1339
- Sessiya üçün parlaqlığı yadda saxla #1442
- Daha zəif CPU-lar üçün yükləmə performansını yaxşılaşdırın #1431
- media sessiyası üçün (işləyən) dəstək əlavə edin #1433
### Düzəliş
- Yükləmələrin açılması zamanı qəzanı düzəldin (indi buraxılış quruluşları üçün əlçatandır) #1441

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
# Behoden
- erneuter Hotfix des Entschlüsselungsfunktionsfehlers.

View File

@@ -0,0 +1,14 @@
Neu
- Abonnementgruppen und sortierte Feeds
- Stummschalttaste in Playern
Verbessert
- Das Öffnen von music.youtube.com und media.ccc.de Links in NewPipe erlaubt
- Zwei Einstellungen wurden von "Erscheinungsbild" zu "Inhalt" verschoben
- Ausblenden der Suchoptionen 5, 15 und 25 Sekunden, wenn die ungenaue Suche aktiviert ist
Behoben
- einige WebM-Videos sind nicht suchbar
- Datenbank-Backup auf Android P
- Absturz beim Teilen einer heruntergeladenen Datei
- YouTube-Extraktionsprobleme, ...

View File

@@ -0,0 +1 @@
• [YouTube] Fortsetzung des Kanals korrigiert

View File

@@ -0,0 +1,6 @@
Absturz behoben, der beim Neuordnen von Kanalgruppen auftrat.
Das Abrufen weiterer YouTube-Videos aus Kanälen und Wiedergabelisten wurde behoben.
Das Abrufen von YouTube-Kommentaren wurde behoben.
Unterstützung für /watch/, /v/ und /w/ Unterpfade in YouTube URLs hinzugefügt.
Die Extraktion der SoundCloud-Client-ID und geografisch eingeschränkter Inhalte wurde korrigiert.
Nordkurdische Lokalisierung wurde hinzugefügt.

View File

@@ -0,0 +1,4 @@
Hotfix
- Thumbnails und Titel werden im Grid-Layout nicht mehr abgeschnitten, da falsch berechnet wurde, wie viele Videos in eine Reihe passen
- Der Download-Dialog verschwindet nicht mehr, wenn er über das Freigabemenü geöffnet wird
- Aktualisierung einer Bibliothek im Zusammenhang mit dem Öffnen von externen Aktivitäten wie dem Storage Access Framework File Picker

View File

@@ -0,0 +1,5 @@
Hotfix
- Behebung von Pufferproblemen, die durch YouTube-Drosselung verursacht werden
- Behebt die Extraktion von YouTube-Kommentaren und Abstürze bei deaktivierten Kommentaren
- Behebung der YouTube-Musiksuche
- Behebung von PeerTube-Livestreams

Some files were not shown because too many files have changed in this diff Show More