From 75a44fb30a241cf6f09d3fc3a7356fcf45627008 Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Sat, 11 Aug 2018 19:13:52 +0530 Subject: [PATCH 001/207] Added HTTPS request to get version data. Added APK flaor for github and fdroid. --- app/build.gradle | 17 +++ .../java/org/schabi/newpipe/MainActivity.java | 111 ++++++++++++++++++ build.gradle | 2 +- 3 files changed, 129 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a5ff67bee..7264c0ab9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,12 +14,14 @@ android { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } + buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } + debug { multiDexEnabled true @@ -34,10 +36,25 @@ android { // but continue the build even when errors are found: abortOnError false } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + + flavorDimensions "apkSource" + productFlavors { + github { + dimension "apkSource" + applicationIdSuffix ".github" + + } + + fdroid { + dimension "apkSource" + applicationIdSuffix ".fdroid" + } + } } ext { diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 0ce6772bb..4dba91706 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -24,6 +24,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; +import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -47,6 +48,8 @@ import android.widget.Button; import android.widget.ImageButton; import android.widget.TextView; +import org.json.JSONException; +import org.json.JSONObject; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.fragments.BackPressable; @@ -61,6 +64,13 @@ import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.util.StateSaver; import org.schabi.newpipe.util.ThemeHelper; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; + public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; public static final boolean DEBUG = !BuildConfig.BUILD_TYPE.equals("release"); @@ -80,6 +90,10 @@ public class MainActivity extends AppCompatActivity { ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceId(this)); + if (BuildConfig.FLAVOR.equals("github")) { + new versionCheckTask().execute(); + } + super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); @@ -409,4 +423,101 @@ public class MainActivity extends AppCompatActivity { NavigationHelper.gotoMainFragment(getSupportFragmentManager()); } } + + /** + * AsyncTask to check if there is a newer version of the github apk available or not. + * If there is a newer version we show a notification, informing the user. On tapping + * the notification, the user will be directed to download link. + */ + private static class versionCheckTask extends AsyncTask { + + String newPipeApiUrl = "https://api.myjson.com/bins/19gx44"; + int timeoutPeriod = 10000; + + @Override + protected String doInBackground(Void... voids) { + + String output; + + HttpURLConnection connection = null; + + try { + + URL url = new URL(newPipeApiUrl); + + connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setConnectTimeout(timeoutPeriod); + connection.setReadTimeout(timeoutPeriod); + connection.setRequestProperty("Content-length", "0"); + connection.setUseCaches(false); + connection.setAllowUserInteraction(false); + connection.connect(); + + int responseStatus = connection.getResponseCode(); + + switch (responseStatus) { + + case 200: + case 201: + BufferedReader bufferedReader + = new BufferedReader( + new InputStreamReader(connection.getInputStream())); + + StringBuilder stringBuilder = new StringBuilder(); + + String line; + + while ((line = bufferedReader.readLine()) != null) { + stringBuilder.append(line + "\n"); + } + + bufferedReader.close(); + output = stringBuilder.toString(); + + return output; + } + } catch (MalformedURLException ex) { + ex.printStackTrace(); + } catch (IOException ex) { + ex.printStackTrace(); + } finally { + if (connection != null) { + try { + connection.disconnect(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + + return null; + } + + @Override + protected void onPostExecute(String output) { + + if (output != null) { + + Log.i("output---", output); + + try { + JSONObject mainObject = new JSONObject(output); + JSONObject flavoursObject = mainObject.getJSONObject("flavors"); + JSONObject githubObject = flavoursObject.getJSONObject("github"); + JSONObject githubStableObject = githubObject.getJSONObject("stable"); + + String version = githubStableObject.getString("version"); + // String versionCode = githubStableObject.getString("version_code"); + String apkLocationUrl = githubStableObject.getString("apk"); + + Log.i("jsonConvert---", version + " " + apkLocationUrl); + } catch (JSONException ex) { + ex.printStackTrace(); + } + } + } + } + + } diff --git a/build.gradle b/build.gradle index a45c00aef..20c8a0dfc 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.2' + classpath 'com.android.tools.build:gradle:3.1.4' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 5e2aa51627846afbf86fd8c34e94c4b09628cd5b Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Sat, 11 Aug 2018 19:36:23 +0530 Subject: [PATCH 002/207] Moved the asynctask to its own class. --- .../schabi/newpipe/FetchAppVersionTask.java | 118 ++++++++++++++++++ .../java/org/schabi/newpipe/MainActivity.java | 109 +--------------- 2 files changed, 119 insertions(+), 108 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java diff --git a/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java new file mode 100644 index 000000000..2f98fe1ad --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java @@ -0,0 +1,118 @@ +package org.schabi.newpipe; + +import android.os.AsyncTask; +import android.util.Log; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; + +/** + * AsyncTask to check if there is a newer version of the github apk available or not. + * If there is a newer version we show a notification, informing the user. On tapping + * the notification, the user will be directed to download link. + */ +public class FetchAppVersionTask extends AsyncTask { + + private String newPipeApiUrl = "https://newpipe.schabi.org/api/data.json"; + private int timeoutPeriod = 10000; + + @Override + protected String doInBackground(Void... voids) { + + String output; + + HttpURLConnection connection = null; + + try { + + URL url = new URL(newPipeApiUrl); + + connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setConnectTimeout(timeoutPeriod); + connection.setReadTimeout(timeoutPeriod); + connection.setRequestProperty("Content-length", "0"); + connection.setUseCaches(false); + connection.setAllowUserInteraction(false); + connection.connect(); + + int responseStatus = connection.getResponseCode(); + + switch (responseStatus) { + + case 200: + case 201: + BufferedReader bufferedReader + = new BufferedReader( + new InputStreamReader(connection.getInputStream())); + + StringBuilder stringBuilder = new StringBuilder(); + + String line; + + while ((line = bufferedReader.readLine()) != null) { + stringBuilder.append(line + "\n"); + } + + bufferedReader.close(); + output = stringBuilder.toString(); + + return output; + } + } catch (MalformedURLException ex) { + ex.printStackTrace(); + } catch (IOException ex) { + ex.printStackTrace(); + } finally { + if (connection != null) { + try { + connection.disconnect(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + + return null; + } + + @Override + protected void onPostExecute(String output) { + + if (output != null) { + + Log.i("output---", output); + + try { + JSONObject mainObject = new JSONObject(output); + JSONObject flavoursObject = mainObject.getJSONObject("flavors"); + JSONObject githubObject = flavoursObject.getJSONObject("github"); + JSONObject githubStableObject = githubObject.getJSONObject("stable"); + + String versionName = githubStableObject.getString("version"); + // String versionCode = githubStableObject.getString("version_code"); + String apkLocationUrl = githubStableObject.getString("apk"); + + compareAppVersionAndShowNotification(versionName, apkLocationUrl); + + } catch (JSONException ex) { + ex.printStackTrace(); + } + } + } + + private void compareAppVersionAndShowNotification(String versionName, String apkLocationUrl) { + + if (!BuildConfig.VERSION_NAME.equals(versionName)) { + + + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 4dba91706..1554dddc0 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -24,7 +24,6 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; -import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -48,8 +47,6 @@ import android.widget.Button; import android.widget.ImageButton; import android.widget.TextView; -import org.json.JSONException; -import org.json.JSONObject; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.fragments.BackPressable; @@ -64,13 +61,6 @@ import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.util.StateSaver; import org.schabi.newpipe.util.ThemeHelper; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; - public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; public static final boolean DEBUG = !BuildConfig.BUILD_TYPE.equals("release"); @@ -91,7 +81,7 @@ public class MainActivity extends AppCompatActivity { ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceId(this)); if (BuildConfig.FLAVOR.equals("github")) { - new versionCheckTask().execute(); + new FetchAppVersionTask().execute(); } super.onCreate(savedInstanceState); @@ -423,101 +413,4 @@ public class MainActivity extends AppCompatActivity { NavigationHelper.gotoMainFragment(getSupportFragmentManager()); } } - - /** - * AsyncTask to check if there is a newer version of the github apk available or not. - * If there is a newer version we show a notification, informing the user. On tapping - * the notification, the user will be directed to download link. - */ - private static class versionCheckTask extends AsyncTask { - - String newPipeApiUrl = "https://api.myjson.com/bins/19gx44"; - int timeoutPeriod = 10000; - - @Override - protected String doInBackground(Void... voids) { - - String output; - - HttpURLConnection connection = null; - - try { - - URL url = new URL(newPipeApiUrl); - - connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("GET"); - connection.setConnectTimeout(timeoutPeriod); - connection.setReadTimeout(timeoutPeriod); - connection.setRequestProperty("Content-length", "0"); - connection.setUseCaches(false); - connection.setAllowUserInteraction(false); - connection.connect(); - - int responseStatus = connection.getResponseCode(); - - switch (responseStatus) { - - case 200: - case 201: - BufferedReader bufferedReader - = new BufferedReader( - new InputStreamReader(connection.getInputStream())); - - StringBuilder stringBuilder = new StringBuilder(); - - String line; - - while ((line = bufferedReader.readLine()) != null) { - stringBuilder.append(line + "\n"); - } - - bufferedReader.close(); - output = stringBuilder.toString(); - - return output; - } - } catch (MalformedURLException ex) { - ex.printStackTrace(); - } catch (IOException ex) { - ex.printStackTrace(); - } finally { - if (connection != null) { - try { - connection.disconnect(); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - } - - return null; - } - - @Override - protected void onPostExecute(String output) { - - if (output != null) { - - Log.i("output---", output); - - try { - JSONObject mainObject = new JSONObject(output); - JSONObject flavoursObject = mainObject.getJSONObject("flavors"); - JSONObject githubObject = flavoursObject.getJSONObject("github"); - JSONObject githubStableObject = githubObject.getJSONObject("stable"); - - String version = githubStableObject.getString("version"); - // String versionCode = githubStableObject.getString("version_code"); - String apkLocationUrl = githubStableObject.getString("apk"); - - Log.i("jsonConvert---", version + " " + apkLocationUrl); - } catch (JSONException ex) { - ex.printStackTrace(); - } - } - } - } - - } From f85e19c75defdabdc391cd792d73c6d14ef65852 Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Sun, 12 Aug 2018 15:01:50 +0530 Subject: [PATCH 003/207] Added notification channel and code to show notification. --- app/src/main/java/org/schabi/newpipe/App.java | 23 ++++++++++++ .../schabi/newpipe/FetchAppVersionTask.java | 37 +++++++++++++++++-- app/src/main/res/values/strings.xml | 8 ++++ 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index f436a26b8..77c6b6cb0 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -63,6 +63,7 @@ import io.reactivex.plugins.RxJavaPlugins; public class App extends Application { protected static final String TAG = App.class.toString(); private RefWatcher refWatcher; + private static App context; @SuppressWarnings("unchecked") private static final Class[] reportSenderFactoryClasses = new Class[]{AcraReportSenderFactory.class}; @@ -85,6 +86,8 @@ public class App extends Application { } refWatcher = installLeakCanary(); + context = this; + // Initialize settings first because others inits can use its values SettingsActivity.initSettings(this); @@ -202,6 +205,22 @@ public class App extends Application { NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.createNotificationChannel(mChannel); + + // Set up notification channel for app update + final String appUpdateId + = getString(R.string.app_update_notification_channel_id); + final CharSequence appUpdateName + = getString(R.string.app_update_notification_channel_name); + final String appUpdateDescription + = getString(R.string.app_update_notification_channel_description); + + NotificationChannel appUpdateChannel + = new NotificationChannel(appUpdateId, appUpdateName, importance); + appUpdateChannel.setDescription(appUpdateDescription); + + NotificationManager appUpdateNotificationManager + = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + appUpdateNotificationManager.createNotificationChannel(appUpdateChannel); } @Nullable @@ -217,4 +236,8 @@ public class App extends Application { protected boolean isDisposedRxExceptionsReported() { return false; } + + public static App getContext() { + return context; + } } diff --git a/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java index 2f98fe1ad..75da96096 100644 --- a/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java @@ -1,7 +1,12 @@ package org.schabi.newpipe; +import android.app.Application; +import android.app.PendingIntent; +import android.content.Intent; +import android.net.Uri; import android.os.AsyncTask; -import android.util.Log; +import android.support.v4.app.NotificationCompat; +import android.support.v4.app.NotificationManagerCompat; import org.json.JSONException; import org.json.JSONObject; @@ -88,8 +93,6 @@ public class FetchAppVersionTask extends AsyncTask { if (output != null) { - Log.i("output---", output); - try { JSONObject mainObject = new JSONObject(output); JSONObject flavoursObject = mainObject.getJSONObject("flavors"); @@ -108,11 +111,37 @@ public class FetchAppVersionTask extends AsyncTask { } } + /** + * Method to compare + * @param versionName + * @param apkLocationUrl + */ private void compareAppVersionAndShowNotification(String versionName, String apkLocationUrl) { - if (!BuildConfig.VERSION_NAME.equals(versionName)) { + int NOTIFICATION_ID = 2000; + if (!BuildConfig.VERSION_NAME.equals(versionName.replace("v", ""))) { + Application app = App.getContext(); + + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(apkLocationUrl)); + PendingIntent pendingIntent + = PendingIntent.getActivity(app, 0, intent, 0); + + NotificationCompat.Builder notificationBuilder = new NotificationCompat + .Builder(app, app.getString(R.string.app_update_notification_channel_id)) + .setSmallIcon(R.drawable.ic_newpipe_triangle_white) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .setContentIntent(pendingIntent) + .setAutoCancel(true) + .setContentTitle(app.getString(R.string.app_update_notification_content_title)) + .setContentText(app.getString(R.string.app_update_notification_content_text) + + " " + versionName); + + NotificationManagerCompat notificationManager = NotificationManagerCompat.from(app); + + // notificationId is a unique int for each notification that you must define + notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()); } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5ee80536f..6ad772494 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -144,6 +144,10 @@ NewPipe Notification Notifications for NewPipe Background and Popup Players + newpipeAppUpdate + App Update Notification + Notifications for new NewPipe version + [Unknown] Toggle Orientation @@ -504,4 +508,8 @@ 144p + + NewPipe Update Available + Tap to download + From 06f20c66f8fc3f66cd255f13d5f9ab1e9b1ec384 Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Sun, 12 Aug 2018 16:35:53 +0530 Subject: [PATCH 004/207] Moved the new version check to the application class. --- app/src/main/java/org/schabi/newpipe/App.java | 5 +++++ .../main/java/org/schabi/newpipe/FetchAppVersionTask.java | 1 + app/src/main/java/org/schabi/newpipe/MainActivity.java | 4 ---- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index 77c6b6cb0..0a218d061 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -99,6 +99,11 @@ public class App extends Application { ImageLoader.getInstance().init(getImageLoaderConfigurations(10, 50)); configureRxJavaErrorHandler(); + + // Check for new version + if (BuildConfig.FLAVOR.equals("github")) { + new FetchAppVersionTask().execute(); + } } protected Downloader getDownloader() { diff --git a/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java index 75da96096..d56e07127 100644 --- a/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java @@ -124,6 +124,7 @@ public class FetchAppVersionTask extends AsyncTask { Application app = App.getContext(); + // A pending intent to open the apk location url in the browser. Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(apkLocationUrl)); PendingIntent pendingIntent = PendingIntent.getActivity(app, 0, intent, 0); diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 1554dddc0..0ce6772bb 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -80,10 +80,6 @@ public class MainActivity extends AppCompatActivity { ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceId(this)); - if (BuildConfig.FLAVOR.equals("github")) { - new FetchAppVersionTask().execute(); - } - super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); From 930c971035f425e3d692f0c1debb295513aa4b15 Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Sun, 12 Aug 2018 16:41:21 +0530 Subject: [PATCH 005/207] Added version check in the pop-up player --- .../java/org/schabi/newpipe/player/PopupVideoPlayer.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 8107345a1..a4c91cd30 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -58,6 +58,7 @@ import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; import com.google.android.exoplayer2.ui.SubtitleView; import org.schabi.newpipe.BuildConfig; +import org.schabi.newpipe.FetchAppVersionTask; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -663,6 +664,11 @@ public final class PopupVideoPlayer extends Service { lockManager.acquireWifiAndCpu(); hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME); + + // Check for new version + if (BuildConfig.FLAVOR.equals("github")) { + new FetchAppVersionTask().execute(); + } } @Override From 12b93d66377b57e4bbfc7a1cd1556a7f21ab676f Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Sun, 12 Aug 2018 17:18:46 +0530 Subject: [PATCH 006/207] Added new icon for update notification. --- .../org/schabi/newpipe/FetchAppVersionTask.java | 2 +- .../main/res/drawable-hdpi/ic_newpipe_update.png | Bin 0 -> 680 bytes .../main/res/drawable-mdpi/ic_newpipe_update.png | Bin 0 -> 401 bytes .../res/drawable-xhdpi/ic_newpipe_update.png | Bin 0 -> 734 bytes .../res/drawable-xxhdpi/ic_newpipe_update.png | Bin 0 -> 1370 bytes .../res/drawable-xxxhdpi/ic_newpipe_update.png | Bin 0 -> 2177 bytes 6 files changed, 1 insertion(+), 1 deletion(-) create mode 100755 app/src/main/res/drawable-hdpi/ic_newpipe_update.png create mode 100755 app/src/main/res/drawable-mdpi/ic_newpipe_update.png create mode 100755 app/src/main/res/drawable-xhdpi/ic_newpipe_update.png create mode 100755 app/src/main/res/drawable-xxhdpi/ic_newpipe_update.png create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_newpipe_update.png diff --git a/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java index d56e07127..3130dc655 100644 --- a/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java @@ -131,7 +131,7 @@ public class FetchAppVersionTask extends AsyncTask { NotificationCompat.Builder notificationBuilder = new NotificationCompat .Builder(app, app.getString(R.string.app_update_notification_channel_id)) - .setSmallIcon(R.drawable.ic_newpipe_triangle_white) + .setSmallIcon(R.drawable.ic_newpipe_update) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setContentIntent(pendingIntent) .setAutoCancel(true) diff --git a/app/src/main/res/drawable-hdpi/ic_newpipe_update.png b/app/src/main/res/drawable-hdpi/ic_newpipe_update.png new file mode 100755 index 0000000000000000000000000000000000000000..cbf336a1f173c751889af7f1a0164edb045c82d9 GIT binary patch literal 680 zcmV;Z0$2TsP)l zsW^T3lkhj-|}{4v?F6wr|V;0X?)u@-=mx`#!z1O)v!j};hS z3qUZ4r#Mp8G?oD*w&_DRHmXK7W&m~LR|aT5E~@l3kpZ+0d+|W1xd)u6nSkB0w?BX}pr%MvCbT z=2QZxBhT;o)P;rd(=IgNqy}-k5OS~kJzqNxN(#Eg;SWGirt2XDcifU+DM5&+ptrddo086 zlzk6QBz#s0Gg4AHVT74FQlR>j&lKGDzXpVgTqvX_9diKt3c?fs$_Y7d&G4zicKN5s zKlq&IJv_pUa)A1TmQb__Vg}C1UrG7&9LqCdQb6Ca2Q!uU*9@i!hdHaK<%EO0vXqz+ zCJW`+T#`fn7;U(Mm-vWJLYsIjd{`E~2&*O3qeZB$)x!7Mq)`W{g#G~=P}v~1B^9y& O0000*Ius2C3<`nbKafxXrl|oO9tSv} zRSlvv0UFo`v9rnaa%Z!5+2wO{&NufxbLO5Ym7YuJ##B22y{KRZZ`%ogJFMYNy8ty^ zVj3^n1*qu=?^_MH&p;~JL{F;#^EghNY6hK81q_GyXZ*>5Tw`toA literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_newpipe_update.png b/app/src/main/res/drawable-xhdpi/ic_newpipe_update.png new file mode 100755 index 0000000000000000000000000000000000000000..5ee02aaa9359524b5a83988ddd54724dbef58854 GIT binary patch literal 734 zcmV<40wMj0P)dQcBIjU}J@%q+}^2AyQI|5*sTkQfd~Ig^j#rDP(~( zE0nj!TbIFnEY7_;-R?Pao_o)|=T7-9PtWsze&5@3&-tI{luG~UKrjp4MdxT3tidq0 zVRF%Vf~g3MiMWsD=qfr_W@-fBH_l;B(b+OlN1#d>n=rlTjH#puRC$NRMdwT;gFuy= zMQ5!`fWR1jVkagQo%I zXXO{}VOggL?7|dm#m4}V@3?@T!UbaEdT<)w0z}?mH>MUY5F6iz8yL+fF@`6Vb@Fc# zLj_{j;6^{1f;TAn^y=<<%rMD^RJ?jUiDho|Tta(-8u(TB}8EM#ytz zNHgyqc?wkObzvWV1W5eGevLfM^A?EJosMe(5-@@lg$rO3F3EnYRT(=Vv{lbrKy-T@ z2?!2nHF~s@mjG7cMM|wCUSml^;qwp>9gJNS_NT4o3%0aXK(x;f;X}&&5Wb_oEduD* z*mfC@x0ul~0rcXss2yk(7h5T?E@f;Yb=JI{GW@-euC)UNVBJI)xX^BaRH+68?zBsw zjEka|`C5)-SbHWO*O~jU)dGJ+ZS%s)^>+#L52mc!jb{n-uC!9%3kGVg-%FSeC+n;^ z4bM~NWItaD6zEN;aV#YaoT?c=oHDkoRkzWU8ncc6I(affc(|K6d|m>TI%mcSM${^# zF^WZb2#n&mfRi=RpYmx2i8PJ|g-;N;j-|ncqFVEfzeSQ5Y-G*2z%Vvw^7IUID?dV3 z%GlG)f~&Asj$i9V?+TmoASL)$oEN(1+YJ_oPPY%>u;|ETy-xpp`=2`e1=-pLm1y2b QXaE2J07*qoM6N<$f|apLeEMjH*Ix2@BF%WW^mYM$C>?(*8E}Eo0<20-v7Sedwjm*j_c5& zLy=$%Mi(7NX~9)^0Ow#>(eacH+X_FNc( zAlM^jyIU}>=r&}^5CzpZfKM^0=yqgALP0flh{x_M3@^G(sgjZ)Vp*^OcVTkT?MjUl z1rf`FKKz8s{1QsGiy;__U(iIwW!sL@WzF!y?DpA~PpJ zH4furoL+RhTc!;`AK)D^rB@P2>c=KLgc-_yTF{1|r!fh)V|@ZaH4bAf7URUCJq$`a zf~wyifs=5bI5$etn=0tVyXY?3MMK&ZG~l=M@gDvXJt7G`ctkvQql$3RkR*btzn_3x zu?G7SN;-tkafh;Of|ClWD`zV16sM3$s9=}a1Yc9QsI&ytl{Z?9DM=qWIEdvKo3)2# z4N6r|wak%NAjYR&$p&)Rh`TXO-ut^O1l5&21viVwB`N#GB6D#T9-1{GGeOnzhl}y) zVX-VoLcbWFR%5n27MWQKs;g%h=He@{EJ*s;{UJ8NQ!^Enm!P`(Cg7&3sHBqm99fNL zGu!1YsIJ~Kunb!hN`jqYpEy6w7;AwRBB-wZ8F*h@P$unBaIe@3rSsSoEvOnpm&gT3 zLr_27Kv!D972SiTSLOVef}jIRKpjchcP0L54z%v&ly8RM-Bb`m`KuPOy zMVemfgU@m=Hbxw(txH)-BevnvV?vPF&CkQL;-oN*>AMxS;KEW1!enuyx>0ohyxD{~ zr4u9$%C5urVw}mV*EHfSWmyM_$7v2$iG^Aj_#F$%B50Oa?4>z7t;VAbK5JY2eMKxM zk|)JWE~s1Fwx-F#LF&4vjWV`kdPh)muI~tH&MO^3&Dqcq)SMk<7gP~98O_Q+fX!lI zS^Hc*NL@D$_};IY&z}3sDyWvVu@={g_t6Gpm&g^G&}Q6IutJs`(G2lC2v`{{g{?asu5u-%UX@xaq5wr~-i6qT` z<@VsI78}%u2QhJwy1Lqs153*ws0&x(89v45VTn&iO-TzVvj0;zZYqnS z+M6yAW8UldTI3+^6`31-V#B*0FN+syx-;uFWkoCnCW@@HGjT4?6SuT;MJ~|^MaS8p cLx-062ZvJ(o>WhTC;$Ke07*qoM6N<$f`%81KmY&$ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_newpipe_update.png b/app/src/main/res/drawable-xxxhdpi/ic_newpipe_update.png new file mode 100755 index 0000000000000000000000000000000000000000..1f44c1aaf28c6773c1125ab7c6a0692c7c76b81c GIT binary patch literal 2177 zcmV-{2!8j8P)asI5TDR=Q1R=Hnl~`!dgQrt{{#d+vSj&HW~m`RC=H-}!y- z`JHpVzu!6cpo1z@s8FFog$nHr9D-AEM%lKEOW-hEgiTn3#bw(xu7KIN82hmk_hU6? zmTlX(Kpg@77|4j&hF@Ss+4glkh7eH00QO)DevDUPdfB#iB}O2i9?#--T!o`Bp=_JG z3Jnkdeb|Z(Sc&5>xoq3J0u2&SLq8tCI-HH?m2H2=V~hk4^TTf3h|6)BYJO-QO%PCz zZMXrK;02gec7Hk!EfP?}{rC>vf}_jsQ%4~u0^m8^g)if^m{E4$Is!QoP{R)V3LnNI zOf0*PZH)v35WDFu_&LtUT-E$AJQ5L5!(I`VzJg_Ve%bwPJ0vE6Shn`!4txZQRrA9j z3Lv0{n#i{f7h;}jekhcHdThn#@fsXiwhu~0NdydF7w*KTvCw$kO_xMKJ$7R~mSev0 z7M9w809o5lh}^^JLiQdX%U10{Kn;B&H@#YH;(By@{z3Bu>=NOlFGm7u=)*?5Q-q~y zx|Imc6L1TDhljCGOssih2YxDY4~OfcybI!l<1F>xFjM`R-38-u5 zV6m28hCfQPfvbspkKk*ffULbYa0()zuD$7E;{2!x8!6B)Lf#)lZuL3Ed z#QciP-VM@?fL<{IJ}as-#`g#iLf(r+sry=?dZrNbcH^%i(X&LzCF6Sz5Y9hW$O!j| zU2+OMjh~59m}89hRgh3kPZi6;yT!&SZ`9=LTf{;1d5V^=wHW~-ojFguiPwpZQmToz zU(_D05u32$a|hal0I|9`5^oUlKuX8gV<2nmYP?d>d1WONARK>)SZ`k{j=c6M#`!~W zoj7&?0_=!0aHY{IX~-sJK$z)2sbluGOiTK^LE90yjbexr~(KOj-MuKIzNbqnrN>KT!|w(ngAgm%oa(Hb)tx> zQ}7I4rxT?JgKzy}agoRF{QOcV*5M_cNWd(-N7QbnIyX=RdW9mIW)w(Az+7=fK~c`X zWR!j`Y2n#F!Tj8vpBYvWFgmv4wA`Ja8CDT6I{NWmDGGj71T=~@SWpo#GEx)pYn)OM zFfvjTa37Xb1dNQ-1U!Lrx|M(dt&4G~3D|=-bsGV-WXNwv`CUD35PH&iL;empK^l}p z>i^y*cDjvVAC`3s0R!Sv@LNTF&sljy`}fMG?@OIqn*)5Kf<%{q`tv z-^5t(kSLs*JI4Ob6mR}moKI9xzq&T!fw>zda1!9Ao@p@qPvGRDkT9|;V+{0{>_**!f$)TO^VIn0elk2jndCUh4b%dvYjh% zY>Vz5*059r94=z~avbjfH86_8SE4?Cr<*Ei`PVkE3KWF&~Z#7f-O!n1G3q842}V#nL1FzaBvTWdwP4~lR!KYQj8 z!ufZ$@XS6De$wQIwGROkM5x->g0mPL2`3BZ-`e8yHsMUED(18a0hujRgzmmaYtqC& zL|I8IZ$7d6{fv|!rO@0rWcJ~!n3KSs8RD>Z%FCV_#ckq9RJsG*#zsJ|7?RhDn*E;9 zTWHFr(?uvsaR{SPJSZJ1nd-> zmoJGz+CuJE5CvVI5*ksFBoZ67=0HTv@lOefVyQB2T@(u82Mk_#*S4RY5+`Xc76RYS?4=ni5jDr}GAL=6 z_p<50Z^{dOXNCCa^foba_ll8G3#GNc{*0)-nbWu9&*FnZ`uRH5NH^t}c4L00000NkvXXu0mjf DUcmjm literal 0 HcmV?d00001 From af42e32ae6ef75cc1ae143694f79640ddf45e6de Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Sun, 12 Aug 2018 18:34:20 +0530 Subject: [PATCH 007/207] Code refactored and added comments. --- app/src/main/java/org/schabi/newpipe/App.java | 4 +-- ...sk.java => CheckForNewAppVersionTask.java} | 34 +++++++++++++------ .../newpipe/player/PopupVideoPlayer.java | 6 ++-- 3 files changed, 26 insertions(+), 18 deletions(-) rename app/src/main/java/org/schabi/newpipe/{FetchAppVersionTask.java => CheckForNewAppVersionTask.java} (80%) diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index 0a218d061..fe64d95fb 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -101,9 +101,7 @@ public class App extends Application { configureRxJavaErrorHandler(); // Check for new version - if (BuildConfig.FLAVOR.equals("github")) { - new FetchAppVersionTask().execute(); - } + new CheckForNewAppVersionTask().execute(); } protected Downloader getDownloader() { diff --git a/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java similarity index 80% rename from app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java rename to app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index 3130dc655..2be4712a7 100644 --- a/app/src/main/java/org/schabi/newpipe/FetchAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -19,20 +19,29 @@ import java.net.MalformedURLException; import java.net.URL; /** - * AsyncTask to check if there is a newer version of the github apk available or not. + * AsyncTask to check if there is a newer version of the NewPipe github apk available or not. * If there is a newer version we show a notification, informing the user. On tapping - * the notification, the user will be directed to download link. + * the notification, the user will be directed to the download link. */ -public class FetchAppVersionTask extends AsyncTask { +public class CheckForNewAppVersionTask extends AsyncTask { private String newPipeApiUrl = "https://newpipe.schabi.org/api/data.json"; private int timeoutPeriod = 10000; + @Override + protected void onPreExecute() { + // Continue with version check only if the build variant is of type "github". + if (!BuildConfig.FLAVOR.equals("github")) { + this.cancel(true); + } + } + @Override protected String doInBackground(Void... voids) { - String output; + // Make a network request to get latest NewPipe data. + String response; HttpURLConnection connection = null; try { @@ -63,13 +72,14 @@ public class FetchAppVersionTask extends AsyncTask { String line; while ((line = bufferedReader.readLine()) != null) { - stringBuilder.append(line + "\n"); + stringBuilder.append(line); + stringBuilder.append("\n"); } bufferedReader.close(); - output = stringBuilder.toString(); + response = stringBuilder.toString(); - return output; + return response; } } catch (MalformedURLException ex) { ex.printStackTrace(); @@ -89,12 +99,13 @@ public class FetchAppVersionTask extends AsyncTask { } @Override - protected void onPostExecute(String output) { + protected void onPostExecute(String response) { - if (output != null) { + // Parse the json from the response. + if (response != null) { try { - JSONObject mainObject = new JSONObject(output); + JSONObject mainObject = new JSONObject(response); JSONObject flavoursObject = mainObject.getJSONObject("flavors"); JSONObject githubObject = flavoursObject.getJSONObject("github"); JSONObject githubStableObject = githubObject.getJSONObject("stable"); @@ -112,7 +123,8 @@ public class FetchAppVersionTask extends AsyncTask { } /** - * Method to compare + * Method to compare the current and latest available app version. + * If a newer version is available, we show the update notification. * @param versionName * @param apkLocationUrl */ diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index a4c91cd30..2c233f219 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -58,7 +58,7 @@ import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; import com.google.android.exoplayer2.ui.SubtitleView; import org.schabi.newpipe.BuildConfig; -import org.schabi.newpipe.FetchAppVersionTask; +import org.schabi.newpipe.CheckForNewAppVersionTask; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -666,9 +666,7 @@ public final class PopupVideoPlayer extends Service { hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME); // Check for new version - if (BuildConfig.FLAVOR.equals("github")) { - new FetchAppVersionTask().execute(); - } + new CheckForNewAppVersionTask().execute(); } @Override From 2a18eacf622e71226aa7216183ab1096ff288153 Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Sun, 12 Aug 2018 20:57:30 +0530 Subject: [PATCH 008/207] More refactoring. --- .../org/schabi/newpipe/CheckForNewAppVersionTask.java | 11 ++++------- app/src/main/res/values/strings.xml | 4 ++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index 2be4712a7..134fb3406 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -25,13 +25,15 @@ import java.net.URL; */ public class CheckForNewAppVersionTask extends AsyncTask { + private Application app = App.getContext(); + private String newPipeApiUrl = "https://newpipe.schabi.org/api/data.json"; private int timeoutPeriod = 10000; @Override protected void onPreExecute() { // Continue with version check only if the build variant is of type "github". - if (!BuildConfig.FLAVOR.equals("github")) { + if (!BuildConfig.FLAVOR.equals(app.getString(R.string.app_flavor_github))) { this.cancel(true); } } @@ -63,8 +65,7 @@ public class CheckForNewAppVersionTask extends AsyncTask { case 200: case 201: - BufferedReader bufferedReader - = new BufferedReader( + BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(connection.getInputStream())); StringBuilder stringBuilder = new StringBuilder(); @@ -134,8 +135,6 @@ public class CheckForNewAppVersionTask extends AsyncTask { if (!BuildConfig.VERSION_NAME.equals(versionName.replace("v", ""))) { - Application app = App.getContext(); - // A pending intent to open the apk location url in the browser. Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(apkLocationUrl)); PendingIntent pendingIntent @@ -152,8 +151,6 @@ public class CheckForNewAppVersionTask extends AsyncTask { + " " + versionName); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(app); - - // notificationId is a unique int for each notification that you must define notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()); } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6ad772494..f83324845 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -512,4 +512,8 @@ NewPipe Update Available Tap to download + + github + fdroid + From e7abeb5ad91afb700f0d914ea1906a5c05f18b89 Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Fri, 17 Aug 2018 00:53:42 +0530 Subject: [PATCH 009/207] Added version code check. --- app/src/main/java/org/schabi/newpipe/App.java | 30 +++++++++++-------- .../newpipe/CheckForNewAppVersionTask.java | 10 ++++--- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index fe64d95fb..a9002fda2 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -209,21 +209,25 @@ public class App extends Application { NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.createNotificationChannel(mChannel); - // Set up notification channel for app update - final String appUpdateId - = getString(R.string.app_update_notification_channel_id); - final CharSequence appUpdateName - = getString(R.string.app_update_notification_channel_name); - final String appUpdateDescription - = getString(R.string.app_update_notification_channel_description); + // Set up notification channel for app update only if it's a github apk. - NotificationChannel appUpdateChannel - = new NotificationChannel(appUpdateId, appUpdateName, importance); - appUpdateChannel.setDescription(appUpdateDescription); + if (!BuildConfig.FLAVOR.equals(getString(R.string.app_flavor_github))) { - NotificationManager appUpdateNotificationManager - = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - appUpdateNotificationManager.createNotificationChannel(appUpdateChannel); + final String appUpdateId + = getString(R.string.app_update_notification_channel_id); + final CharSequence appUpdateName + = getString(R.string.app_update_notification_channel_name); + final String appUpdateDescription + = getString(R.string.app_update_notification_channel_description); + + NotificationChannel appUpdateChannel + = new NotificationChannel(appUpdateId, appUpdateName, importance); + appUpdateChannel.setDescription(appUpdateDescription); + + NotificationManager appUpdateNotificationManager + = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + appUpdateNotificationManager.createNotificationChannel(appUpdateChannel); + } } @Nullable diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index 134fb3406..b6b269bb5 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -112,10 +112,10 @@ public class CheckForNewAppVersionTask extends AsyncTask { JSONObject githubStableObject = githubObject.getJSONObject("stable"); String versionName = githubStableObject.getString("version"); - // String versionCode = githubStableObject.getString("version_code"); + String versionCode = githubStableObject.getString("version_code"); String apkLocationUrl = githubStableObject.getString("apk"); - compareAppVersionAndShowNotification(versionName, apkLocationUrl); + compareAppVersionAndShowNotification(versionName, apkLocationUrl, versionCode); } catch (JSONException ex) { ex.printStackTrace(); @@ -129,11 +129,13 @@ public class CheckForNewAppVersionTask extends AsyncTask { * @param versionName * @param apkLocationUrl */ - private void compareAppVersionAndShowNotification(String versionName, String apkLocationUrl) { + private void compareAppVersionAndShowNotification(String versionName, + String apkLocationUrl, + String versionCode) { int NOTIFICATION_ID = 2000; - if (!BuildConfig.VERSION_NAME.equals(versionName.replace("v", ""))) { + if (BuildConfig.VERSION_CODE < Integer.valueOf(versionCode)) { // A pending intent to open the apk location url in the browser. Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(apkLocationUrl)); From 04e974b3264db7001bd03511bdfa32a326ef12d0 Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Fri, 17 Aug 2018 01:11:51 +0530 Subject: [PATCH 010/207] Bug fix. --- app/src/main/java/org/schabi/newpipe/App.java | 3 +-- .../java/org/schabi/newpipe/CheckForNewAppVersionTask.java | 5 ++++- 2 files changed, 5 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 a9002fda2..c9ebc976c 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -210,8 +210,7 @@ public class App extends Application { mNotificationManager.createNotificationChannel(mChannel); // Set up notification channel for app update only if it's a github apk. - - if (!BuildConfig.FLAVOR.equals(getString(R.string.app_flavor_github))) { + if (BuildConfig.FLAVOR.equals(getString(R.string.app_flavor_github))) { final String appUpdateId = getString(R.string.app_update_notification_channel_id); diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index b6b269bb5..b53ef1794 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -7,6 +7,7 @@ import android.net.Uri; import android.os.AsyncTask; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; +import android.util.Log; import org.json.JSONException; import org.json.JSONObject; @@ -34,7 +35,7 @@ public class CheckForNewAppVersionTask extends AsyncTask { protected void onPreExecute() { // Continue with version check only if the build variant is of type "github". if (!BuildConfig.FLAVOR.equals(app.getString(R.string.app_flavor_github))) { - this.cancel(true); + // this.cancel(true); } } @@ -102,6 +103,8 @@ public class CheckForNewAppVersionTask extends AsyncTask { @Override protected void onPostExecute(String response) { + Log.i("Response--", response); + // Parse the json from the response. if (response != null) { From 910c10f55428305b671b609a219a7f746ef32757 Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Fri, 17 Aug 2018 01:46:33 +0530 Subject: [PATCH 011/207] Removed debug code --- .../main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index b53ef1794..5794b0d0f 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -35,7 +35,7 @@ public class CheckForNewAppVersionTask extends AsyncTask { protected void onPreExecute() { // Continue with version check only if the build variant is of type "github". if (!BuildConfig.FLAVOR.equals(app.getString(R.string.app_flavor_github))) { - // this.cancel(true); + this.cancel(true); } } From 17197ad670e96feea6c45b0d7d62f9de56d94032 Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Sat, 15 Sep 2018 12:51:39 +0530 Subject: [PATCH 012/207] Pull request changes begins here. --- .../java/org/schabi/newpipe/CheckForNewAppVersionTask.java | 4 ++-- .../main/java/org/schabi/newpipe/player/PopupVideoPlayer.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index 5794b0d0f..628704b23 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -44,6 +44,8 @@ public class CheckForNewAppVersionTask extends AsyncTask { // Make a network request to get latest NewPipe data. + Log.i("Update---", "checking"); + String response; HttpURLConnection connection = null; @@ -103,8 +105,6 @@ public class CheckForNewAppVersionTask extends AsyncTask { @Override protected void onPostExecute(String response) { - Log.i("Response--", response); - // Parse the json from the response. if (response != null) { diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index 2c233f219..f9892ecb5 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -666,7 +666,7 @@ public final class PopupVideoPlayer extends Service { hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME); // Check for new version - new CheckForNewAppVersionTask().execute(); + //new CheckForNewAppVersionTask().execute(); } @Override From 6417bd91ef339e246f2413ae791367bb2b21fd1c Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Sat, 15 Sep 2018 14:08:32 +0530 Subject: [PATCH 013/207] Pull request changes v1. --- .../java/org/schabi/newpipe/CheckForNewAppVersionTask.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index 628704b23..4b75c202c 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -7,7 +7,6 @@ import android.net.Uri; import android.os.AsyncTask; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; -import android.util.Log; import org.json.JSONException; import org.json.JSONObject; @@ -16,7 +15,6 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; -import java.net.MalformedURLException; import java.net.URL; /** @@ -44,8 +42,6 @@ public class CheckForNewAppVersionTask extends AsyncTask { // Make a network request to get latest NewPipe data. - Log.i("Update---", "checking"); - String response; HttpURLConnection connection = null; @@ -85,8 +81,6 @@ public class CheckForNewAppVersionTask extends AsyncTask { return response; } - } catch (MalformedURLException ex) { - ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } finally { From 08127e5806c2234034af9b61650b8f7f9aae3b9d Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Mon, 3 Sep 2018 04:52:59 +0530 Subject: [PATCH 014/207] added basic/crappy comments support --- app/build.gradle | 2 +- .../java/org/schabi/newpipe/Downloader.java | 101 +++++++- .../fragments/detail/VideoDetailFragment.java | 222 +++++++++++++++--- .../fragments/list/BaseListFragment.java | 8 + .../newpipe/info_list/InfoItemBuilder.java | 14 ++ .../newpipe/info_list/InfoListAdapter.java | 5 + .../holder/CommentsInfoItemHolder.java | 53 +++++ .../holder/CommentsMiniInfoItemHolder.java | 92 ++++++++ .../schabi/newpipe/util/ExtractorHelper.java | 34 +-- .../main/res/layout/fragment_video_detail.xml | 206 ++++++++++------ .../main/res/layout/list_comments_item.xml | 112 +++++++++ .../res/layout/list_comments_mini_item.xml | 112 +++++++++ app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 1 + 14 files changed, 834 insertions(+), 129 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java create mode 100644 app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java create mode 100644 app/src/main/res/layout/list_comments_item.xml create mode 100644 app/src/main/res/layout/list_comments_mini_item.xml diff --git a/app/build.gradle b/app/build.gradle index 4ae9f0fb7..d409532bb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.TeamNewPipe:NewPipeExtractor:217d13b1028' + implementation 'com.github.yausername:NewPipeExtractor:5242bda' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.8.9' diff --git a/app/src/main/java/org/schabi/newpipe/Downloader.java b/app/src/main/java/org/schabi/newpipe/Downloader.java index 17dc5859d..d51d31e11 100644 --- a/app/src/main/java/org/schabi/newpipe/Downloader.java +++ b/app/src/main/java/org/schabi/newpipe/Downloader.java @@ -3,17 +3,22 @@ package org.schabi.newpipe; import android.support.annotation.Nullable; import android.text.TextUtils; +import org.schabi.newpipe.extractor.DownloadResponse; import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; import java.io.IOException; import java.io.InputStream; +import java.io.Serializable; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; +import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.ResponseBody; @@ -137,13 +142,16 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader { private ResponseBody getBody(String siteUrl, Map customProperties) throws IOException, ReCaptchaException { final Request.Builder requestBuilder = new Request.Builder() - .method("GET", null).url(siteUrl) - .addHeader("User-Agent", USER_AGENT); + .method("GET", null).url(siteUrl); for (Map.Entry header : customProperties.entrySet()) { requestBuilder.addHeader(header.getKey(), header.getValue()); } + if (!customProperties.containsKey("User-Agent")) { + requestBuilder.header("User-Agent", USER_AGENT); + } + if (!TextUtils.isEmpty(mCookies)) { requestBuilder.addHeader("Cookie", mCookies); } @@ -175,4 +183,91 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader { public String download(String siteUrl) throws IOException, ReCaptchaException { return download(siteUrl, Collections.emptyMap()); } -} + + + @Override + public DownloadResponse get(String siteUrl, Map> requestHeaders) throws IOException, ReCaptchaException { + final Request.Builder requestBuilder = new Request.Builder() + .method("GET", null).url(siteUrl); + + // set custom headers in request + for (Map.Entry> pair : requestHeaders.entrySet()) { + for(String value : pair.getValue()){ + requestBuilder.addHeader(pair.getKey(), value); + } + } + + if (!requestHeaders.containsKey("User-Agent")) { + requestBuilder.header("User-Agent", USER_AGENT); + } + + if (!TextUtils.isEmpty(mCookies)) { + requestBuilder.addHeader("Cookie", mCookies); + } + + final Request request = requestBuilder.build(); + final Response response = client.newCall(request).execute(); + final ResponseBody body = response.body(); + + if (response.code() == 429) { + throw new ReCaptchaException("reCaptcha Challenge requested"); + } + + if (body == null) { + response.close(); + return null; + } + + return new DownloadResponse(body.string(), response.headers().toMultimap()); + } + + @Override + public DownloadResponse get(String siteUrl) throws IOException, ReCaptchaException { + return get(siteUrl, Collections.emptyMap()); + } + + @Override + public DownloadResponse post(String siteUrl, String requestBody, Map> requestHeaders) throws IOException, ReCaptchaException { + + if(null == requestHeaders.get("Content-Type") || requestHeaders.get("Content-Type").isEmpty()){ + // content type header is required. maybe throw an exception here + return null; + } + + String contentType = requestHeaders.get("Content-Type").get(0); + + RequestBody okRequestBody = RequestBody.create(MediaType.parse(contentType), requestBody); + final Request.Builder requestBuilder = new Request.Builder() + .method("POST", okRequestBody).url(siteUrl); + + // set custom headers in request + for (Map.Entry> pair : requestHeaders.entrySet()) { + for(String value : pair.getValue()){ + requestBuilder.addHeader(pair.getKey(), value); + } + } + + if (!requestHeaders.containsKey("User-Agent")) { + requestBuilder.header("User-Agent", USER_AGENT); + } + + if (!TextUtils.isEmpty(mCookies)) { + requestBuilder.addHeader("Cookie", mCookies); + } + + final Request request = requestBuilder.build(); + final Response response = client.newCall(request).execute(); + final ResponseBody body = response.body(); + + if (response.code() == 429) { + throw new ReCaptchaException("reCaptcha Challenge requested"); + } + + if (body == null) { + response.close(); + return null; + } + + return new DownloadResponse(body.string(), response.headers().toMultimap()); + } +} \ No newline at end of file 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 c726f8cee..cbea6803e 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 @@ -40,6 +40,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Spinner; +import android.widget.TabHost; import android.widget.TextView; import android.widget.Toast; @@ -53,6 +54,7 @@ import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.download.DownloadDialog; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor; @@ -64,19 +66,17 @@ import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.BaseStateFragment; -import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.report.ErrorActivity; -import org.schabi.newpipe.util.StreamItemAdapter; -import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; -import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.info_list.InfoItemDialog; +import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; +import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.player.MainVideoPlayer; import org.schabi.newpipe.player.PopupVideoPlayer; import org.schabi.newpipe.player.helper.PlayerHelper; import org.schabi.newpipe.player.old.PlayVideoActivity; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; +import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.ExtractorHelper; @@ -87,6 +87,8 @@ import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; import org.schabi.newpipe.util.PermissionHelper; +import org.schabi.newpipe.util.StreamItemAdapter; +import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; import org.schabi.newpipe.util.ThemeHelper; import java.io.Serializable; @@ -114,6 +116,8 @@ public class VideoDetailFragment // Amount of videos to show on start private static final int INITIAL_RELATED_VIDEOS = 8; + // Amount of comments to show on start + private static final int INITIAL_COMMENTS = 8; private InfoItemBuilder infoItemBuilder = null; @@ -121,18 +125,24 @@ public class VideoDetailFragment private static final int RELATED_STREAMS_UPDATE_FLAG = 0x1; private static final int RESOLUTIONS_MENU_UPDATE_FLAG = 0x2; private static final int TOOLBAR_ITEMS_UPDATE_FLAG = 0x4; + private static final int COMMENTS_UPDATE_FLAG = 0x4; private boolean autoPlayEnabled; private boolean showRelatedStreams; + private boolean showComments; private boolean wasRelatedStreamsExpanded = false; - @State protected int serviceId = Constants.NO_SERVICE_ID; - @State protected String name; - @State protected String url; + @State + protected int serviceId = Constants.NO_SERVICE_ID; + @State + protected String name; + @State + protected String url; private StreamInfo currentInfo; private Disposable currentWorker; - @NonNull private CompositeDisposable disposables = new CompositeDisposable(); + @NonNull + private CompositeDisposable disposables = new CompositeDisposable(); private List sortedVideoStreams; private int selectedVideoStreamIndex = -1; @@ -183,6 +193,16 @@ public class VideoDetailFragment private LinearLayout relatedStreamsView; private ImageButton relatedStreamExpandButton; + private LinearLayout commentsRootLayout; + private LinearLayout commentsView; + private ImageButton commentsExpandButton; + private Disposable commentsDisposable; + + private TabHost tabHost; + private static final String COMMENTS_TAB_TAG = "CommentsTab"; + private static final String RELATED_TAB_TAG = "RelatedTab"; + + /*////////////////////////////////////////////////////////////////////////*/ @@ -197,12 +217,17 @@ public class VideoDetailFragment //////////////////////////////////////////////////////////////////////////*/ @Override - public void onCreate(Bundle savedInstanceState) { + public void + onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); showRelatedStreams = PreferenceManager.getDefaultSharedPreferences(activity) .getBoolean(getString(R.string.show_next_video_key), true); + + showComments = PreferenceManager.getDefaultSharedPreferences(activity) + .getBoolean(getString(R.string.show_comments), true); + PreferenceManager.getDefaultSharedPreferences(activity) .registerOnSharedPreferenceChangeListener(this); } @@ -224,14 +249,17 @@ public class VideoDetailFragment if (updateFlags != 0) { if (!isLoading.get() && currentInfo != null) { - if ((updateFlags & RELATED_STREAMS_UPDATE_FLAG) != 0) initRelatedVideos(currentInfo); + if ((updateFlags & RELATED_STREAMS_UPDATE_FLAG) != 0) + initRelatedVideos(currentInfo); if ((updateFlags & RESOLUTIONS_MENU_UPDATE_FLAG) != 0) setupActionBar(currentInfo); + if ((updateFlags & COMMENTS_UPDATE_FLAG) != 0) initComments(currentInfo); } if ((updateFlags & TOOLBAR_ITEMS_UPDATE_FLAG) != 0 && menu != null) { updateMenuItemVisibility(); } + updateFlags = 0; } @@ -288,6 +316,9 @@ public class VideoDetailFragment updateFlags |= RESOLUTIONS_MENU_UPDATE_FLAG; } else if (key.equals(getString(R.string.show_play_with_kodi_key))) { updateFlags |= TOOLBAR_ITEMS_UPDATE_FLAG; + } else if (key.equals(R.string.show_comments)) { + showComments = sharedPreferences.getBoolean(key, true); + updateFlags |= COMMENTS_UPDATE_FLAG; } } @@ -312,7 +343,8 @@ public class VideoDetailFragment } if (!isLoading.get() && currentInfo != null && isVisible()) { - outState.putSerializable(INFO_KEY, currentInfo); + //TODO fix this. it should not be commented + //outState.putSerializable(INFO_KEY, currentInfo); } outState.putSerializable(STACK_KEY, stack); @@ -392,6 +424,9 @@ public class VideoDetailFragment case R.id.detail_related_streams_expand: toggleExpandRelatedVideos(currentInfo); break; + case R.id.detail_comments_expand: + toggleExpandComments(currentInfo); + break; } } @@ -452,6 +487,46 @@ public class VideoDetailFragment ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.collapse))); } + + private void toggleExpandComments(StreamInfo info) { + if (DEBUG) Log.d(TAG, "toggleExpandComments() called with: info = [" + info + "]"); + if (!showComments) return; + + int initialCount = INITIAL_COMMENTS; + + if (commentsView.getChildCount() > initialCount && commentsView.getChildCount() >= info.getComments().size() && !info.hasMoreComments()) { + commentsView.removeViews(initialCount, + commentsView.getChildCount() - (initialCount)); + commentsExpandButton.setImageDrawable(ContextCompat.getDrawable( + activity, ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.expand))); + return; + } + + //Log.d(TAG, "toggleExpandRelatedVideos() called with: info = [" + info + "], from = [" + INITIAL_RELATED_VIDEOS + "]"); + int currentCount = commentsView.getChildCount(); + for (int i = currentCount; i < info.getComments().size(); i++) { + CommentsInfoItem item = info.getComments().get(i); + //Log.d(TAG, "i = " + i); + commentsView.addView(infoItemBuilder.buildView(commentsView, item)); + } + + if (info.hasMoreComments()) { + loadMoreComments(info); + } else { + commentsExpandButton.setImageDrawable( + ContextCompat.getDrawable(activity, + ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.collapse))); + } + } + + private void loadMoreComments(StreamInfo info) { + if (commentsDisposable != null) commentsDisposable.dispose(); + + commentsDisposable = Single.fromCallable(() -> { + StreamInfo.loadMoreComments(info); + return info.getComments(); + }).subscribeOn(Schedulers.io()).doOnError(e -> info.addError(e)).subscribe(); + } /*////////////////////////////////////////////////////////////////////////// // Init //////////////////////////////////////////////////////////////////////////*/ @@ -498,14 +573,37 @@ public class VideoDetailFragment uploaderTextView = rootView.findViewById(R.id.detail_uploader_text_view); uploaderThumb = rootView.findViewById(R.id.detail_uploader_thumbnail_view); + tabHost = (TabHost) rootView.findViewById(R.id.tab_host); + tabHost.setup(); + + TabHost.TabSpec commentsTab = tabHost.newTabSpec(COMMENTS_TAB_TAG); + commentsTab.setContent(R.id.detail_comments_root_layout); + commentsTab.setIndicator(getString(R.string.comments)); + + + TabHost.TabSpec relatedVideosTab = tabHost.newTabSpec(RELATED_TAB_TAG); + relatedVideosTab.setContent(R.id.detail_related_streams_root_layout); + relatedVideosTab.setIndicator(getString(R.string.next_video_title)); + + tabHost.addTab(commentsTab); + tabHost.addTab(relatedVideosTab); + + //show comments tab by default + tabHost.setCurrentTabByTag(COMMENTS_TAB_TAG); + relatedStreamRootLayout = rootView.findViewById(R.id.detail_related_streams_root_layout); nextStreamTitle = rootView.findViewById(R.id.detail_next_stream_title); relatedStreamsView = rootView.findViewById(R.id.detail_related_streams_view); - relatedStreamExpandButton = rootView.findViewById(R.id.detail_related_streams_expand); + commentsRootLayout = rootView.findViewById(R.id.detail_comments_root_layout); + commentsView = rootView.findViewById(R.id.detail_comments_view); + commentsExpandButton = rootView.findViewById(R.id.detail_comments_expand); + infoItemBuilder = new InfoItemBuilder(activity); setHeightThumbnail(); + + } @Override @@ -532,6 +630,7 @@ public class VideoDetailFragment detailControlsDownload.setOnClickListener(this); detailControlsDownload.setOnLongClickListener(this); relatedStreamExpandButton.setOnClickListener(this); + commentsExpandButton.setOnClickListener(this); detailControlsBackground.setLongClickable(true); detailControlsPopup.setLongClickable(true); @@ -622,7 +721,7 @@ public class VideoDetailFragment relatedStreamsView.addView( infoItemBuilder.buildView(relatedStreamsView, info.getNextVideo())); relatedStreamsView.addView(getSeparatorView()); - relatedStreamRootLayout.setVisibility(View.VISIBLE); + showRelatedStreamsIfSelected(); } else nextStreamTitle.setVisibility(View.GONE); if (info.getRelatedStreams() != null @@ -639,7 +738,7 @@ public class VideoDetailFragment } //if (DEBUG) Log.d(TAG, "Total time " + ((System.nanoTime() - first) / 1000000L) + "ms"); - relatedStreamRootLayout.setVisibility(View.VISIBLE); + showRelatedStreamsIfSelected(); relatedStreamExpandButton.setVisibility(View.VISIBLE); relatedStreamExpandButton.setImageDrawable(ContextCompat.getDrawable( @@ -648,6 +747,47 @@ public class VideoDetailFragment if (info.getNextVideo() == null) relatedStreamRootLayout.setVisibility(View.GONE); relatedStreamExpandButton.setVisibility(View.GONE); } + + } + + private void showRelatedStreamsIfSelected() { + if (tabHost.getCurrentTabTag().contentEquals(RELATED_TAB_TAG)) { + relatedStreamRootLayout.setVisibility(View.VISIBLE); + } + } + + private void initComments(StreamInfo info) { + if (commentsView.getChildCount() > 0) commentsView.removeAllViews(); + + if (info.getComments() != null + && !info.getComments().isEmpty() && showComments) { + //long first = System.nanoTime(), each; + int to = info.getComments().size() >= INITIAL_RELATED_VIDEOS + ? INITIAL_RELATED_VIDEOS + : info.getComments().size(); + for (int i = 0; i < to; i++) { + InfoItem item = info.getComments().get(i); + //each = System.nanoTime(); + commentsView.addView(infoItemBuilder.buildView(commentsView, item)); + //if (DEBUG) Log.d(TAG, "each took " + ((System.nanoTime() - each) / 1000000L) + "ms"); + } + //if (DEBUG) Log.d(TAG, "Total time " + ((System.nanoTime() - first) / 1000000L) + "ms"); + + showCommentsIfSelected(); + commentsExpandButton.setVisibility(View.VISIBLE); + + commentsExpandButton.setImageDrawable(ContextCompat.getDrawable( + activity, ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.expand))); + } else { + commentsRootLayout.setVisibility(View.GONE); + } + + } + + private void showCommentsIfSelected() { + if (tabHost.getCurrentTabTag().contentEquals(COMMENTS_TAB_TAG)) { + commentsRootLayout.setVisibility(View.VISIBLE); + } } /*////////////////////////////////////////////////////////////////////////// @@ -682,7 +822,7 @@ public class VideoDetailFragment @Override public boolean onOptionsItemSelected(MenuItem item) { - if(isLoading.get()) { + if (isLoading.get()) { // if is still loading block menu return true; } @@ -706,7 +846,7 @@ public class VideoDetailFragment NavigationHelper.playWithKore(activity, Uri.parse( url.replace("https", "http"))); } catch (Exception e) { - if(DEBUG) Log.i(TAG, "Failed to start kore", e); + if (DEBUG) Log.i(TAG, "Failed to start kore", e); showInstallKoreDialog(activity); } return true; @@ -720,7 +860,8 @@ public class VideoDetailFragment builder.setMessage(R.string.kore_not_found) .setPositiveButton(R.string.install, (DialogInterface dialog, int which) -> NavigationHelper.installKore(context)) - .setNegativeButton(R.string.cancel, (DialogInterface dialog, int which) -> {}); + .setNegativeButton(R.string.cancel, (DialogInterface dialog, int which) -> { + }); builder.create().show(); } @@ -823,7 +964,8 @@ public class VideoDetailFragment } public void prepareAndHandleInfo(final StreamInfo info, boolean scrollToTop) { - if (DEBUG) Log.d(TAG, "prepareAndHandleInfo() called with: info = [" + info + "], scrollToTop = [" + scrollToTop + "]"); + if (DEBUG) + Log.d(TAG, "prepareAndHandleInfo() called with: info = [" + info + "], scrollToTop = [" + scrollToTop + "]"); setInitialData(info.getServiceId(), info.getOriginalUrl(), info.getName()); pushToStack(serviceId, url, name); @@ -1057,7 +1199,7 @@ public class VideoDetailFragment .setInterpolator(new FastOutSlowInInterpolator()) .start(); - if (showRelatedStreams) { + if (showRelatedStreams && tabHost.getCurrentTabTag().contentEquals(RELATED_TAB_TAG)) { relatedStreamRootLayout.animate().setListener(null).cancel(); relatedStreamRootLayout.setAlpha(0f); relatedStreamRootLayout.setTranslationY(translationY); @@ -1070,6 +1212,20 @@ public class VideoDetailFragment .setInterpolator(new FastOutSlowInInterpolator()) .start(); } + + if (showComments && tabHost.getCurrentTabTag().contentEquals(COMMENTS_TAB_TAG)) { + commentsRootLayout.animate().setListener(null).cancel(); + commentsRootLayout.setAlpha(0f); + commentsRootLayout.setTranslationY(translationY); + commentsRootLayout.setVisibility(View.VISIBLE); + commentsRootLayout.animate() + .alpha(1f) + .translationY(0) + .setStartDelay((long) (duration * .8f) + delay) + .setDuration(duration) + .setInterpolator(new FastOutSlowInInterpolator()) + .start(); + } } protected void setInitialData(int serviceId, String url, String name) { @@ -1204,6 +1360,8 @@ public class VideoDetailFragment setupActionBar(info); initThumbnailViews(info); initRelatedVideos(info); + initComments(info); + if (wasRelatedStreamsExpanded) { toggleExpandRelatedVideos(currentInfo); wasRelatedStreamsExpanded = false; @@ -1246,19 +1404,19 @@ public class VideoDetailFragment public void openDownloadDialog() { - try { - DownloadDialog downloadDialog = DownloadDialog.newInstance(currentInfo); - downloadDialog.setVideoStreams(sortedVideoStreams); - downloadDialog.setAudioStreams(currentInfo.getAudioStreams()); - downloadDialog.setSelectedVideoStream(selectedVideoStreamIndex); + try { + DownloadDialog downloadDialog = DownloadDialog.newInstance(currentInfo); + downloadDialog.setVideoStreams(sortedVideoStreams); + downloadDialog.setAudioStreams(currentInfo.getAudioStreams()); + downloadDialog.setSelectedVideoStream(selectedVideoStreamIndex); - downloadDialog.show(activity.getSupportFragmentManager(), "downloadDialog"); - } catch (Exception e) { - Toast.makeText(activity, - R.string.could_not_setup_download_menu, - Toast.LENGTH_LONG).show(); - e.printStackTrace(); - } + downloadDialog.show(activity.getSupportFragmentManager(), "downloadDialog"); + } catch (Exception e) { + Toast.makeText(activity, + R.string.could_not_setup_download_menu, + Toast.LENGTH_LONG).show(); + e.printStackTrace(); + } } /*////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index c70ea2b19..cd557c931 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -17,6 +17,7 @@ import android.view.View; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.fragments.BaseStateFragment; @@ -181,6 +182,13 @@ public abstract class BaseListFragment extends BaseStateFragment implem } }); + infoListAdapter.setOnCommentsSelectedListener(new OnClickGesture() { + @Override + public void selected(CommentsInfoItem selectedItem) { + //Log.d("comments" , "this comment was clicked" + selectedItem.getCommentText()); + } + }); + itemsList.clearOnScrollListeners(); itemsList.addOnScrollListener(new OnScrollBelowItemsListener() { @Override diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java index 78867c81f..dbb91bbb2 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java @@ -10,10 +10,13 @@ import com.nostra13.universalimageloader.core.ImageLoader; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.info_list.holder.ChannelInfoItemHolder; import org.schabi.newpipe.info_list.holder.ChannelMiniInfoItemHolder; +import org.schabi.newpipe.info_list.holder.CommentsInfoItemHolder; +import org.schabi.newpipe.info_list.holder.CommentsMiniInfoItemHolder; import org.schabi.newpipe.info_list.holder.InfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistInfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistMiniInfoItemHolder; @@ -50,6 +53,7 @@ public class InfoItemBuilder { private OnClickGesture onStreamSelectedListener; private OnClickGesture onChannelSelectedListener; private OnClickGesture onPlaylistSelectedListener; + private OnClickGesture onCommentsSelectedListener; public InfoItemBuilder(Context context) { this.context = context; @@ -73,6 +77,8 @@ public class InfoItemBuilder { return useMiniVariant ? new ChannelMiniInfoItemHolder(this, parent) : new ChannelInfoItemHolder(this, parent); case PLAYLIST: return useMiniVariant ? new PlaylistMiniInfoItemHolder(this, parent) : new PlaylistInfoItemHolder(this, parent); + case COMMENT: + return useMiniVariant ? new CommentsMiniInfoItemHolder(this, parent) : new CommentsInfoItemHolder(this, parent); default: Log.e(TAG, "Trollolo"); throw new RuntimeException("InfoType not expected = " + infoType.name()); @@ -111,4 +117,12 @@ public class InfoItemBuilder { this.onPlaylistSelectedListener = listener; } + public OnClickGesture getOnCommentsSelectedListener() { + return onCommentsSelectedListener; + } + + public void setOnCommentsSelectedListener(OnClickGesture onCommentsSelectedListener) { + this.onCommentsSelectedListener = onCommentsSelectedListener; + } + } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java index cf12deb6f..49bd2bdf1 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java @@ -8,6 +8,7 @@ import android.view.ViewGroup; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.info_list.holder.ChannelInfoItemHolder; @@ -90,6 +91,10 @@ public class InfoListAdapter extends RecyclerView.Adapter listener) { + infoItemBuilder.setOnCommentsSelectedListener(listener); + } + public void useMiniItemVariants(boolean useMiniVariant) { this.useMiniVariant = useMiniVariant; } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java new file mode 100644 index 000000000..46e4b4563 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java @@ -0,0 +1,53 @@ +package org.schabi.newpipe.info_list.holder; + +import android.view.ViewGroup; +import android.widget.TextView; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.channel.ChannelInfoItem; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; +import org.schabi.newpipe.info_list.InfoItemBuilder; +import org.schabi.newpipe.util.Localization; + +/* + * Created by Christian Schabesberger on 12.02.17. + * + * Copyright (C) Christian Schabesberger 2016 + * ChannelInfoItemHolder .java is part of NewPipe. + * + * NewPipe is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ + +public class CommentsInfoItemHolder extends CommentsMiniInfoItemHolder { + + public final TextView itemTitleView; + + public CommentsInfoItemHolder(InfoItemBuilder infoItemBuilder, ViewGroup parent) { + super(infoItemBuilder, R.layout.list_comments_item, parent); + + itemTitleView = itemView.findViewById(R.id.itemTitleView); + } + + @Override + public void updateFromItem(final InfoItem infoItem) { + super.updateFromItem(infoItem); + + if (!(infoItem instanceof CommentsInfoItem)) return; + final CommentsInfoItem item = (CommentsInfoItem) infoItem; + + itemTitleView.setText(item.getAuthorName()); + } + +} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java new file mode 100644 index 000000000..046cadc3f --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java @@ -0,0 +1,92 @@ +package org.schabi.newpipe.info_list.holder; + +import android.support.v7.app.AppCompatActivity; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; +import org.schabi.newpipe.info_list.InfoItemBuilder; +import org.schabi.newpipe.report.ErrorActivity; +import org.schabi.newpipe.util.ImageDisplayConstants; +import org.schabi.newpipe.util.Localization; +import org.schabi.newpipe.util.NavigationHelper; + +import de.hdodenhof.circleimageview.CircleImageView; + +public class CommentsMiniInfoItemHolder extends InfoItemHolder { + public final CircleImageView itemThumbnailView; + private final TextView itemContentView; + private final TextView itemLikesCountView; + private final TextView itemDislikesCountView; + + private static final int commentDefaultLines = 2; + private static final int commentExpandedLines = 1000; + + CommentsMiniInfoItemHolder(InfoItemBuilder infoItemBuilder, int layoutId, ViewGroup parent) { + super(infoItemBuilder, layoutId, parent); + + itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView); + itemContentView = itemView.findViewById(R.id.itemCommentContentView); + itemLikesCountView = itemView.findViewById(R.id.detail_thumbs_up_count_view); + itemDislikesCountView = itemView.findViewById(R.id.detail_thumbs_down_count_view); + } + + public CommentsMiniInfoItemHolder(InfoItemBuilder infoItemBuilder, ViewGroup parent) { + this(infoItemBuilder, R.layout.list_comments_mini_item, parent); + } + + @Override + public void updateFromItem(final InfoItem infoItem) { + if (!(infoItem instanceof CommentsInfoItem)) return; + final CommentsInfoItem item = (CommentsInfoItem) infoItem; + + itemBuilder.getImageLoader() + .displayImage(item.getAuthorThumbnail(), + itemThumbnailView, + ImageDisplayConstants.DISPLAY_THUMBNAIL_OPTIONS); + + itemThumbnailView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + try { + final AppCompatActivity activity = (AppCompatActivity) itemBuilder.getContext(); + NavigationHelper.openChannelFragment( + activity.getSupportFragmentManager(), + item.getServiceId(), + item.getAuthorEndpoint(), + item.getAuthorName()); + } catch (Exception e) { + ErrorActivity.reportUiError((AppCompatActivity) itemBuilder.getContext(), e); + } + } + }); + + itemContentView.setText(item.getCommentText()); + if (null != item.getLikeCount()) { + itemLikesCountView.setText(String.valueOf(item.getLikeCount())); + } + + itemView.setOnClickListener(view -> { + toggleEllipsize(item.getCommentText()); + if (itemBuilder.getOnCommentsSelectedListener() != null) { + itemBuilder.getOnCommentsSelectedListener().selected(item); + } + }); + } + + private void toggleEllipsize(String text) { + // toggle ellipsize + if (null == itemContentView.getEllipsize()) { + itemContentView.setEllipsize(TextUtils.TruncateAt.END); + itemContentView.setMaxLines(commentDefaultLines); + } else { + itemContentView.setEllipsize(null); + itemContentView.setMaxLines(commentExpandedLines); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index e445233c3..42d746eae 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -59,7 +59,7 @@ public final class ExtractorHelper { } private static void checkServiceId(int serviceId) { - if(serviceId == Constants.NO_SERVICE_ID) { + if (serviceId == Constants.NO_SERVICE_ID) { throw new IllegalArgumentException("serviceId is NO_SERVICE_ID"); } } @@ -122,8 +122,8 @@ public final class ExtractorHelper { } public static Single getMoreChannelItems(final int serviceId, - final String url, - final String nextStreamsUrl) { + final String url, + final String nextStreamsUrl) { checkServiceId(serviceId); return Single.fromCallable(() -> ChannelInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl)); @@ -138,8 +138,8 @@ public final class ExtractorHelper { } public static Single getMorePlaylistItems(final int serviceId, - final String url, - final String nextStreamsUrl) { + final String url, + final String nextStreamsUrl) { checkServiceId(serviceId); return Single.fromCallable(() -> PlaylistInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl)); @@ -154,9 +154,9 @@ public final class ExtractorHelper { } public static Single getMoreKioskItems(final int serviceId, - final String url, - final String nextStreamsUrl, - final String contentCountry) { + final String url, + final String nextStreamsUrl, + final String contentCountry) { return Single.fromCallable(() -> KioskInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl, contentCountry)); @@ -198,17 +198,17 @@ public final class ExtractorHelper { public static Maybe loadFromCache(final int serviceId, final String url) { checkServiceId(serviceId); return Maybe.defer(() -> { - //noinspection unchecked - I info = (I) cache.getFromKey(serviceId, url); - if (MainActivity.DEBUG) Log.d(TAG, "loadFromCache() called, info > " + info); + //noinspection unchecked + I info = (I) cache.getFromKey(serviceId, url); + if (MainActivity.DEBUG) Log.d(TAG, "loadFromCache() called, info > " + info); - // Only return info if it's not null (it is cached) - if (info != null) { - return Maybe.just(info); - } + // Only return info if it's not null (it is cached) + if (info != null) { + return Maybe.just(info); + } - return Maybe.empty(); - }); + return Maybe.empty(); + }); } /** diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index 7c6568b67..185f7d380 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -1,6 +1,5 @@ - + tools:src="@drawable/dummy_thumbnail" /> + tools:visibility="visible" /> + tools:visibility="visible" /> + tools:visibility="visible" /> @@ -127,7 +126,7 @@ android:textAppearance="?android:attr/textAppearanceLarge" android:textSize="@dimen/video_item_detail_title_text_size" tools:ignore="RtlHardcoded" - tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed a ultricies ex. Integer sit amet sodales risus. Duis non mi et urna pretium bibendum. Nunc eleifend est quis ipsum porttitor egestas. Sed facilisis, nisl quis eleifend pellentesque, orci metus egestas dolor, at accumsan eros metus quis libero."/> + tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed a ultricies ex. Integer sit amet sodales risus. Duis non mi et urna pretium bibendum. Nunc eleifend est quis ipsum porttitor egestas. Sed facilisis, nisl quis eleifend pellentesque, orci metus egestas dolor, at accumsan eros metus quis libero." /> + tools:ignore="ContentDescription,RtlHardcoded" /> @@ -150,7 +149,7 @@ android:layout_marginTop="@dimen/video_item_detail_error_panel_margin" android:indeterminate="true" android:visibility="gone" - tools:visibility="visible"/> + tools:visibility="visible" /> + tools:visibility="visible" /> + android:padding="6dp"> + tools:ignore="RtlHardcoded" /> + tools:text="Uploader" /> + tools:text="Published on Oct 2, 2009" /> + tools:text="Description Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed a ultricies ex. Integer sit amet sodales risus. Duis non mi et urna pretium bibendum." /> + android:background="?attr/separator_color" /> - - - - + - - - + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_comments_item.xml b/app/src/main/res/layout/list_comments_item.xml new file mode 100644 index 000000000..16b6107c5 --- /dev/null +++ b/app/src/main/res/layout/list_comments_item.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_comments_mini_item.xml b/app/src/main/res/layout/list_comments_mini_item.xml new file mode 100644 index 000000000..7e8ce1a87 --- /dev/null +++ b/app/src/main/res/layout/list_comments_mini_item.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 9b39fec26..b110a6aa3 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -135,6 +135,7 @@ show_search_suggestions show_play_with_kodi show_next_video + show_comments show_hold_to_append en GB diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0dc837ae8..64ff4ec74 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -129,6 +129,7 @@ Playlist Playlists Videos + Comments Tracks Users Yes From 7124d9bca50ab5fbc7965d069f9f41edf3dc73ea Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Sat, 15 Sep 2018 20:51:17 +0530 Subject: [PATCH 015/207] Removed flvor checks. Added update settings under main settings. --- app/build.gradle | 14 -------- app/src/main/java/org/schabi/newpipe/App.java | 29 +++++++-------- .../newpipe/CheckForNewAppVersionTask.java | 18 ++++++++-- .../settings/UpdateSettingsFragment.java | 35 +++++++++++++++++++ .../res/drawable/ic_settings_update_black.xml | 9 +++++ .../res/drawable/ic_settings_update_white.xml | 5 +++ app/src/main/res/values/attrs.xml | 1 + app/src/main/res/values/settings_keys.xml | 3 ++ app/src/main/res/values/strings.xml | 9 ++--- app/src/main/res/values/styles.xml | 2 ++ app/src/main/res/xml/main_settings.xml | 5 +++ app/src/main/res/xml/update_settings.xml | 13 +++++++ 12 files changed, 107 insertions(+), 36 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java create mode 100644 app/src/main/res/drawable/ic_settings_update_black.xml create mode 100644 app/src/main/res/drawable/ic_settings_update_white.xml create mode 100644 app/src/main/res/xml/update_settings.xml diff --git a/app/build.gradle b/app/build.gradle index b5a106a6d..2fd175fbe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,20 +41,6 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } - - flavorDimensions "apkSource" - productFlavors { - github { - dimension "apkSource" - applicationIdSuffix ".github" - - } - - fdroid { - dimension "apkSource" - applicationIdSuffix ".fdroid" - } - } } ext { diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index c9ebc976c..bc824699e 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -209,24 +209,21 @@ public class App extends Application { NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.createNotificationChannel(mChannel); - // Set up notification channel for app update only if it's a github apk. - if (BuildConfig.FLAVOR.equals(getString(R.string.app_flavor_github))) { + // Set up notification channel for app update. + final String appUpdateId + = getString(R.string.app_update_notification_channel_id); + final CharSequence appUpdateName + = getString(R.string.app_update_notification_channel_name); + final String appUpdateDescription + = getString(R.string.app_update_notification_channel_description); - final String appUpdateId - = getString(R.string.app_update_notification_channel_id); - final CharSequence appUpdateName - = getString(R.string.app_update_notification_channel_name); - final String appUpdateDescription - = getString(R.string.app_update_notification_channel_description); + NotificationChannel appUpdateChannel + = new NotificationChannel(appUpdateId, appUpdateName, importance); + appUpdateChannel.setDescription(appUpdateDescription); - NotificationChannel appUpdateChannel - = new NotificationChannel(appUpdateId, appUpdateName, importance); - appUpdateChannel.setDescription(appUpdateDescription); - - NotificationManager appUpdateNotificationManager - = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - appUpdateNotificationManager.createNotificationChannel(appUpdateChannel); - } + NotificationManager appUpdateNotificationManager + = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + appUpdateNotificationManager.createNotificationChannel(appUpdateChannel); } @Nullable diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index 4b75c202c..9694850d7 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -3,10 +3,13 @@ package org.schabi.newpipe; import android.app.Application; import android.app.PendingIntent; import android.content.Intent; +import android.content.SharedPreferences; import android.net.Uri; import android.os.AsyncTask; +import android.preference.PreferenceManager; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; +import android.util.Log; import org.json.JSONException; import org.json.JSONObject; @@ -29,12 +32,23 @@ public class CheckForNewAppVersionTask extends AsyncTask { private String newPipeApiUrl = "https://newpipe.schabi.org/api/data.json"; private int timeoutPeriod = 10000; + private SharedPreferences mPrefs; + @Override protected void onPreExecute() { - // Continue with version check only if the build variant is of type "github". - if (!BuildConfig.FLAVOR.equals(app.getString(R.string.app_flavor_github))) { + + mPrefs = PreferenceManager.getDefaultSharedPreferences(app); + + // Check if user has enabled/ disabled update checking. + if (mPrefs.getBoolean(app.getString(R.string.update_app_key), true)) { + + // Go ahead with further checks. + Log.i("pref---", "true"); + } else { + Log.i("pref---", "false"); this.cancel(true); } + } @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java new file mode 100644 index 000000000..f6aab7cda --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java @@ -0,0 +1,35 @@ +package org.schabi.newpipe.settings; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.preference.Preference; + +import org.schabi.newpipe.R; + +public class UpdateSettingsFragment extends BasePreferenceFragment { + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + String updateToggleKey = getString(R.string.update_app_key); + findPreference(updateToggleKey).setOnPreferenceChangeListener(updatePreferenceChange); + } + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + addPreferencesFromResource(R.xml.update_settings); + } + + private Preference.OnPreferenceChangeListener updatePreferenceChange + = new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + + defaultPreferences.edit().putBoolean(getString(R.string.update_app_key), + (boolean) newValue).apply(); + + return true; + } + }; +} diff --git a/app/src/main/res/drawable/ic_settings_update_black.xml b/app/src/main/res/drawable/ic_settings_update_black.xml new file mode 100644 index 000000000..261c31217 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_update_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_settings_update_white.xml b/app/src/main/res/drawable/ic_settings_update_white.xml new file mode 100644 index 000000000..0feb270af --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_update_white.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 7b879fb4c..75c39c490 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -38,6 +38,7 @@ + diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 9b39fec26..b7ffb101d 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -201,6 +201,9 @@ @string/always_ask_open_action_key + + update_app_key + af diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ab55b6f6c..29fa4dc03 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -109,6 +109,7 @@ Appearance Other Debug + Updates Playing in background Playing in popup mode Queued on background player @@ -515,6 +516,10 @@ 144p + + Updates + Show a notification to prompt app update when a new version is available + Minimize on application switch Action when switching to other application from main video player — %s @@ -526,8 +531,4 @@ NewPipe Update Available Tap to download - - github - fdroid - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 87e19cede..8eae8343d 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -54,6 +54,7 @@ @drawable/ic_add_black_24dp @drawable/ic_settings_backup_restore_black_24dp @drawable/ic_blank_page_black_24dp + @drawable/ic_settings_update_black @color/light_separator_color @color/light_contrast_background_color @@ -114,6 +115,7 @@ @drawable/ic_add_white_24dp @drawable/ic_settings_backup_restore_white_24dp @drawable/ic_blank_page_white_24dp + @drawable/ic_settings_update_white @color/dark_separator_color @color/dark_contrast_background_color diff --git a/app/src/main/res/xml/main_settings.xml b/app/src/main/res/xml/main_settings.xml index 4196a98d3..3773460d6 100644 --- a/app/src/main/res/xml/main_settings.xml +++ b/app/src/main/res/xml/main_settings.xml @@ -29,6 +29,11 @@ android:icon="?attr/language" android:title="@string/content"/> + + + + + + + From 219922cd8240b00c9efe4feeb4c462f8f0e79211 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Wed, 19 Sep 2018 05:13:55 +0530 Subject: [PATCH 016/207] added commentsInfo in streamInfo --- app/build.gradle | 2 +- .../fragments/detail/VideoDetailFragment.java | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d409532bb..b9e3ce812 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.yausername:NewPipeExtractor:5242bda' + implementation 'com.github.yausername:NewPipeExtractor:4794e16' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.8.9' 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 cbea6803e..90056c724 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 @@ -54,6 +54,7 @@ import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.download.DownloadDialog; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.comments.CommentsInfo; import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ParsingException; @@ -252,7 +253,7 @@ public class VideoDetailFragment if ((updateFlags & RELATED_STREAMS_UPDATE_FLAG) != 0) initRelatedVideos(currentInfo); if ((updateFlags & RESOLUTIONS_MENU_UPDATE_FLAG) != 0) setupActionBar(currentInfo); - if ((updateFlags & COMMENTS_UPDATE_FLAG) != 0) initComments(currentInfo); + if ((updateFlags & COMMENTS_UPDATE_FLAG) != 0) initComments(currentInfo.getCommentsInfo()); } if ((updateFlags & TOOLBAR_ITEMS_UPDATE_FLAG) != 0 @@ -343,8 +344,7 @@ public class VideoDetailFragment } if (!isLoading.get() && currentInfo != null && isVisible()) { - //TODO fix this. it should not be commented - //outState.putSerializable(INFO_KEY, currentInfo); + outState.putSerializable(INFO_KEY, currentInfo); } outState.putSerializable(STACK_KEY, stack); @@ -425,7 +425,7 @@ public class VideoDetailFragment toggleExpandRelatedVideos(currentInfo); break; case R.id.detail_comments_expand: - toggleExpandComments(currentInfo); + toggleExpandComments(currentInfo.getCommentsInfo()); break; } } @@ -488,9 +488,9 @@ public class VideoDetailFragment } - private void toggleExpandComments(StreamInfo info) { + private void toggleExpandComments(CommentsInfo info) { if (DEBUG) Log.d(TAG, "toggleExpandComments() called with: info = [" + info + "]"); - if (!showComments) return; + if (!showComments || null == info) return; int initialCount = INITIAL_COMMENTS; @@ -519,11 +519,11 @@ public class VideoDetailFragment } } - private void loadMoreComments(StreamInfo info) { + private void loadMoreComments(CommentsInfo info) { if (commentsDisposable != null) commentsDisposable.dispose(); commentsDisposable = Single.fromCallable(() -> { - StreamInfo.loadMoreComments(info); + CommentsInfo.loadMoreComments(info); return info.getComments(); }).subscribeOn(Schedulers.io()).doOnError(e -> info.addError(e)).subscribe(); } @@ -756,10 +756,10 @@ public class VideoDetailFragment } } - private void initComments(StreamInfo info) { + private void initComments(CommentsInfo info) { if (commentsView.getChildCount() > 0) commentsView.removeAllViews(); - if (info.getComments() != null + if (null != info && info.getComments() != null && !info.getComments().isEmpty() && showComments) { //long first = System.nanoTime(), each; int to = info.getComments().size() >= INITIAL_RELATED_VIDEOS @@ -1360,7 +1360,7 @@ public class VideoDetailFragment setupActionBar(info); initThumbnailViews(info); initRelatedVideos(info); - initComments(info); + initComments(info.getCommentsInfo()); if (wasRelatedStreamsExpanded) { toggleExpandRelatedVideos(currentInfo); From 5cc73555cddb81172464663f253e9f2f6cb321a7 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Wed, 19 Sep 2018 05:41:01 +0530 Subject: [PATCH 017/207] updated extractor version --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b9e3ce812..c4a54f386 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.yausername:NewPipeExtractor:4794e16' + implementation 'com.github.yausername:NewPipeExtractor:e04787f' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.8.9' From 7047b62442320a64a164fd3392e36c5e828e8b85 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Sun, 23 Sep 2018 07:02:19 +0530 Subject: [PATCH 018/207] added comments fragment --- app/build.gradle | 2 +- .../fragments/detail/VideoDetailFragment.java | 173 ++++++++++----- .../list/comments/CommentsFragment.java | 201 ++++++++++++++++++ .../newpipe/info_list/InfoListAdapter.java | 13 +- .../org/schabi/newpipe/report/UserAction.java | 1 + .../schabi/newpipe/util/ExtractorHelper.java | 37 +++- .../org/schabi/newpipe/util/InfoCache.java | 17 +- .../schabi/newpipe/util/NavigationHelper.java | 13 ++ app/src/main/res/layout/fragment_comments.xml | 70 ++++++ .../main/res/layout/fragment_video_detail.xml | 1 + 10 files changed, 451 insertions(+), 77 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java create mode 100644 app/src/main/res/layout/fragment_comments.xml diff --git a/app/build.gradle b/app/build.gradle index c4a54f386..e4c1f24c1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.yausername:NewPipeExtractor:e04787f' + implementation 'com.github.yausername:NewPipeExtractor:c1199c8' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.8.9' 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 90056c724..4357753b4 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 @@ -54,9 +54,12 @@ import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.download.DownloadDialog; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.ServiceList; +import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.comments.CommentsInfo; import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor; import org.schabi.newpipe.extractor.stream.AudioStream; @@ -131,6 +134,7 @@ public class VideoDetailFragment private boolean autoPlayEnabled; private boolean showRelatedStreams; private boolean showComments; + private boolean isCommentsSupported; private boolean wasRelatedStreamsExpanded = false; @State @@ -141,6 +145,7 @@ public class VideoDetailFragment protected String url; private StreamInfo currentInfo; + private CommentsInfo commentsInfo; private Disposable currentWorker; @NonNull private CompositeDisposable disposables = new CompositeDisposable(); @@ -242,6 +247,7 @@ public class VideoDetailFragment public void onPause() { super.onPause(); if (currentWorker != null) currentWorker.dispose(); + if (commentsDisposable != null) commentsDisposable.dispose(); } @Override @@ -253,7 +259,7 @@ public class VideoDetailFragment if ((updateFlags & RELATED_STREAMS_UPDATE_FLAG) != 0) initRelatedVideos(currentInfo); if ((updateFlags & RESOLUTIONS_MENU_UPDATE_FLAG) != 0) setupActionBar(currentInfo); - if ((updateFlags & COMMENTS_UPDATE_FLAG) != 0) initComments(currentInfo.getCommentsInfo()); + if ((updateFlags & COMMENTS_UPDATE_FLAG) != 0) initComments(commentsInfo); } if ((updateFlags & TOOLBAR_ITEMS_UPDATE_FLAG) != 0 @@ -267,6 +273,8 @@ public class VideoDetailFragment // Check if it was loading when the fragment was stopped/paused, if (wasLoading.getAndSet(false)) { selectAndLoadVideo(serviceId, url, name); + }else{ + loadComments(false); } } @@ -277,8 +285,10 @@ public class VideoDetailFragment .unregisterOnSharedPreferenceChangeListener(this); if (currentWorker != null) currentWorker.dispose(); + if (commentsDisposable != null) commentsDisposable.dispose(); if (disposables != null) disposables.clear(); currentWorker = null; + commentsDisposable = null; disposables = null; } @@ -359,7 +369,7 @@ public class VideoDetailFragment if (serializable instanceof StreamInfo) { //noinspection unchecked currentInfo = (StreamInfo) serializable; - InfoCache.getInstance().putInfo(serviceId, url, currentInfo); + InfoCache.getInstance().putInfo(serviceId, url, currentInfo, InfoItem.InfoType.STREAM); } serializable = savedState.getSerializable(STACK_KEY); @@ -367,6 +377,7 @@ public class VideoDetailFragment //noinspection unchecked stack.addAll((Collection) serializable); } + } /*////////////////////////////////////////////////////////////////////////// @@ -425,7 +436,7 @@ public class VideoDetailFragment toggleExpandRelatedVideos(currentInfo); break; case R.id.detail_comments_expand: - toggleExpandComments(currentInfo.getCommentsInfo()); + toggleExpandComments(commentsInfo); break; } } @@ -493,40 +504,33 @@ public class VideoDetailFragment if (!showComments || null == info) return; int initialCount = INITIAL_COMMENTS; + int currentCount = commentsView.getChildCount(); - if (commentsView.getChildCount() > initialCount && commentsView.getChildCount() >= info.getComments().size() && !info.hasMoreComments()) { + //collapse + if (currentCount > initialCount && !info.hasNextPage()) { commentsView.removeViews(initialCount, - commentsView.getChildCount() - (initialCount)); + currentCount - (initialCount)); commentsExpandButton.setImageDrawable(ContextCompat.getDrawable( activity, ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.expand))); return; } - //Log.d(TAG, "toggleExpandRelatedVideos() called with: info = [" + info + "], from = [" + INITIAL_RELATED_VIDEOS + "]"); - int currentCount = commentsView.getChildCount(); - for (int i = currentCount; i < info.getComments().size(); i++) { - CommentsInfoItem item = info.getComments().get(i); - //Log.d(TAG, "i = " + i); - commentsView.addView(infoItemBuilder.buildView(commentsView, item)); - } - - if (info.hasMoreComments()) { - loadMoreComments(info); - } else { - commentsExpandButton.setImageDrawable( - ContextCompat.getDrawable(activity, - ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.collapse))); + if(currentCount < info.getRelatedItems().size()){ + //expand + for (int i = currentCount; i < info.getRelatedItems().size(); i++) { + CommentsInfoItem item = info.getRelatedItems().get(i); + commentsView.addView(infoItemBuilder.buildView(commentsView, item)); + } + if(!info.hasNextPage()){ + commentsExpandButton.setImageDrawable( + ContextCompat.getDrawable(activity, + ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.collapse))); + } + }else{ + NavigationHelper.openCommentsFragment(getFragmentManager(), serviceId, url, name); } } - private void loadMoreComments(CommentsInfo info) { - if (commentsDisposable != null) commentsDisposable.dispose(); - - commentsDisposable = Single.fromCallable(() -> { - CommentsInfo.loadMoreComments(info); - return info.getComments(); - }).subscribeOn(Schedulers.io()).doOnError(e -> info.addError(e)).subscribe(); - } /*////////////////////////////////////////////////////////////////////////// // Init //////////////////////////////////////////////////////////////////////////*/ @@ -573,23 +577,17 @@ public class VideoDetailFragment uploaderTextView = rootView.findViewById(R.id.detail_uploader_text_view); uploaderThumb = rootView.findViewById(R.id.detail_uploader_thumbnail_view); - tabHost = (TabHost) rootView.findViewById(R.id.tab_host); - tabHost.setup(); + StreamingService service = null; + try { + service = NewPipe.getService(serviceId); + } catch (ExtractionException e) { + onError(e); + } - TabHost.TabSpec commentsTab = tabHost.newTabSpec(COMMENTS_TAB_TAG); - commentsTab.setContent(R.id.detail_comments_root_layout); - commentsTab.setIndicator(getString(R.string.comments)); - - - TabHost.TabSpec relatedVideosTab = tabHost.newTabSpec(RELATED_TAB_TAG); - relatedVideosTab.setContent(R.id.detail_related_streams_root_layout); - relatedVideosTab.setIndicator(getString(R.string.next_video_title)); - - tabHost.addTab(commentsTab); - tabHost.addTab(relatedVideosTab); - - //show comments tab by default - tabHost.setCurrentTabByTag(COMMENTS_TAB_TAG); + if (service.isCommentsSupported()) { + isCommentsSupported = true; + initTabs(rootView); + } relatedStreamRootLayout = rootView.findViewById(R.id.detail_related_streams_root_layout); nextStreamTitle = rootView.findViewById(R.id.detail_next_stream_title); @@ -606,6 +604,25 @@ public class VideoDetailFragment } + private void initTabs(View rootView) { + tabHost = (TabHost) rootView.findViewById(R.id.tab_host); + tabHost.setup(); + + TabHost.TabSpec commentsTab = tabHost.newTabSpec(COMMENTS_TAB_TAG); + commentsTab.setContent(R.id.detail_comments_root_layout); + commentsTab.setIndicator(getString(R.string.comments)); + + TabHost.TabSpec relatedVideosTab = tabHost.newTabSpec(RELATED_TAB_TAG); + relatedVideosTab.setContent(R.id.detail_related_streams_root_layout); + relatedVideosTab.setIndicator(getString(R.string.next_video_title)); + + tabHost.addTab(commentsTab); + tabHost.addTab(relatedVideosTab); + + //show comments tab by default + tabHost.setCurrentTabByTag(COMMENTS_TAB_TAG); + } + @Override protected void initListeners() { super.initListeners(); @@ -751,22 +768,25 @@ public class VideoDetailFragment } private void showRelatedStreamsIfSelected() { - if (tabHost.getCurrentTabTag().contentEquals(RELATED_TAB_TAG)) { + if (null == tabHost || tabHost.getCurrentTabTag().contentEquals(RELATED_TAB_TAG)) { relatedStreamRootLayout.setVisibility(View.VISIBLE); } } private void initComments(CommentsInfo info) { + if(null == info) return; + if (commentsView.getChildCount() > 0) commentsView.removeAllViews(); - if (null != info && info.getComments() != null - && !info.getComments().isEmpty() && showComments) { + List initialComments = info.getRelatedItems(); + if (null != info && initialComments != null + && !initialComments.isEmpty() && showComments) { //long first = System.nanoTime(), each; - int to = info.getComments().size() >= INITIAL_RELATED_VIDEOS - ? INITIAL_RELATED_VIDEOS - : info.getComments().size(); + int to = initialComments.size() >= INITIAL_COMMENTS + ? INITIAL_COMMENTS + : initialComments.size(); for (int i = 0; i < to; i++) { - InfoItem item = info.getComments().get(i); + InfoItem item = initialComments.get(i); //each = System.nanoTime(); commentsView.addView(infoItemBuilder.buildView(commentsView, item)); //if (DEBUG) Log.d(TAG, "each took " + ((System.nanoTime() - each) / 1000000L) + "ms"); @@ -774,10 +794,13 @@ public class VideoDetailFragment //if (DEBUG) Log.d(TAG, "Total time " + ((System.nanoTime() - first) / 1000000L) + "ms"); showCommentsIfSelected(); - commentsExpandButton.setVisibility(View.VISIBLE); - - commentsExpandButton.setImageDrawable(ContextCompat.getDrawable( - activity, ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.expand))); + if(initialComments.size() > INITIAL_COMMENTS){ + commentsExpandButton.setVisibility(View.VISIBLE); + commentsExpandButton.setImageDrawable(ContextCompat.getDrawable( + activity, ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.expand))); + }else{ + commentsExpandButton.setVisibility(View.GONE); + } } else { commentsRootLayout.setVisibility(View.GONE); } @@ -785,11 +808,16 @@ public class VideoDetailFragment } private void showCommentsIfSelected() { - if (tabHost.getCurrentTabTag().contentEquals(COMMENTS_TAB_TAG)) { + if (null == tabHost || tabHost.getCurrentTabTag().contentEquals(COMMENTS_TAB_TAG)) { commentsRootLayout.setVisibility(View.VISIBLE); } } + private void clearComments(){ + if (commentsView.getChildCount() > 0) commentsView.removeAllViews(); + commentsExpandButton.setVisibility(View.GONE); + } + /*////////////////////////////////////////////////////////////////////////// // Menu //////////////////////////////////////////////////////////////////////////*/ @@ -988,6 +1016,7 @@ public class VideoDetailFragment protected void prepareAndLoadInfo() { parallaxScrollRootView.smoothScrollTo(0, 0); pushToStack(serviceId, url, name); + //clearComments(); startLoading(false); } @@ -1010,6 +1039,27 @@ public class VideoDetailFragment isLoading.set(false); onError(throwable); }); + + loadComments(forceLoad); + + } + + private void loadComments(boolean forceLoad) { + if(isCommentsSupported && showComments){ + commentsInfo = null; + if (commentsDisposable != null) commentsDisposable.dispose(); + + commentsDisposable = ExtractorHelper.getCommentsInfo(serviceId, url, forceLoad) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe((@NonNull CommentsInfo result) -> { + commentsInfo = result; + showCommentsWithAnimation(120, 0,0); + initComments(commentsInfo); + }, (@NonNull Throwable throwable) -> { + onError(throwable); + }); + } } /*////////////////////////////////////////////////////////////////////////// @@ -1199,7 +1249,7 @@ public class VideoDetailFragment .setInterpolator(new FastOutSlowInInterpolator()) .start(); - if (showRelatedStreams && tabHost.getCurrentTabTag().contentEquals(RELATED_TAB_TAG)) { + if (showRelatedStreams && (null == tabHost || tabHost.getCurrentTabTag().contentEquals(RELATED_TAB_TAG))) { relatedStreamRootLayout.animate().setListener(null).cancel(); relatedStreamRootLayout.setAlpha(0f); relatedStreamRootLayout.setTranslationY(translationY); @@ -1213,7 +1263,15 @@ public class VideoDetailFragment .start(); } - if (showComments && tabHost.getCurrentTabTag().contentEquals(COMMENTS_TAB_TAG)) { + } + + private void showCommentsWithAnimation(long duration, + long delay, + @FloatRange(from = 0.0f, to = 1.0f) float translationPercent) { + int translationY = (int) (getResources().getDisplayMetrics().heightPixels * + (translationPercent > 0.0f ? translationPercent : .06f)); + + if (showComments && (null == tabHost || tabHost.getCurrentTabTag().contentEquals(COMMENTS_TAB_TAG))) { commentsRootLayout.animate().setListener(null).cancel(); commentsRootLayout.setAlpha(0f); commentsRootLayout.setTranslationY(translationY); @@ -1360,7 +1418,6 @@ public class VideoDetailFragment setupActionBar(info); initThumbnailViews(info); initRelatedVideos(info); - initComments(info.getCommentsInfo()); if (wasRelatedStreamsExpanded) { toggleExpandRelatedVideos(currentInfo); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java new file mode 100644 index 000000000..78787107a --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java @@ -0,0 +1,201 @@ +package org.schabi.newpipe.fragments.list.comments; + +import android.app.Activity; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.content.ContextCompat; +import android.support.v7.app.ActionBar; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.jakewharton.rxbinding2.view.RxView; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.database.subscription.SubscriptionEntity; +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.ListExtractor; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.channel.ChannelInfo; +import org.schabi.newpipe.extractor.comments.CommentsInfo; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.fragments.list.BaseListInfoFragment; +import org.schabi.newpipe.info_list.InfoItemDialog; +import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; +import org.schabi.newpipe.local.subscription.SubscriptionService; +import org.schabi.newpipe.player.playqueue.ChannelPlayQueue; +import org.schabi.newpipe.player.playqueue.PlayQueue; +import org.schabi.newpipe.player.playqueue.SinglePlayQueue; +import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.util.AnimationUtils; +import org.schabi.newpipe.util.ExtractorHelper; +import org.schabi.newpipe.util.ImageDisplayConstants; +import org.schabi.newpipe.util.Localization; +import org.schabi.newpipe.util.NavigationHelper; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Action; +import io.reactivex.functions.Consumer; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; + +import static org.schabi.newpipe.util.AnimationUtils.animateBackgroundColor; +import static org.schabi.newpipe.util.AnimationUtils.animateTextColor; +import static org.schabi.newpipe.util.AnimationUtils.animateView; + +public class CommentsFragment extends BaseListInfoFragment { + + private CompositeDisposable disposables = new CompositeDisposable(); + + /*////////////////////////////////////////////////////////////////////////// + // Views + //////////////////////////////////////////////////////////////////////////*/ + + + + private boolean mIsVisibleToUser = false; + + public static CommentsFragment getInstance(int serviceId, String url, String name) { + CommentsFragment instance = new CommentsFragment(); + instance.setInitialData(serviceId, url, name); + return instance; + } + + /*////////////////////////////////////////////////////////////////////////// + // LifeCycle + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + mIsVisibleToUser = isVisibleToUser; + if(activity != null + && useAsFrontPage + && isVisibleToUser) { + setTitle(currentInfo != null ? currentInfo.getName() : name); + } + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_comments, container, false); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (disposables != null) disposables.clear(); + } + + /*////////////////////////////////////////////////////////////////////////// + // Init + //////////////////////////////////////////////////////////////////////////*/ + + + /*////////////////////////////////////////////////////////////////////////// + // Menu + //////////////////////////////////////////////////////////////////////////*/ + + + /*////////////////////////////////////////////////////////////////////////// + // Load and handle + //////////////////////////////////////////////////////////////////////////*/ + + @Override + protected Single loadMoreItemsLogic() { + return ExtractorHelper.getMoreCommentItems(serviceId, currentInfo, currentNextPageUrl); + } + + @Override + protected Single loadResult(boolean forceLoad) { + return ExtractorHelper.getCommentsInfo(serviceId, url, forceLoad); + } + + /*////////////////////////////////////////////////////////////////////////// + // Contract + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public void showLoading() { + super.showLoading(); + } + + @Override + public void handleResult(@NonNull CommentsInfo result) { + super.handleResult(result); + + if (!result.getErrors().isEmpty()) { + showSnackBarError(result.getErrors(), UserAction.REQUESTED_COMMENTS, NewPipe.getNameOfService(result.getServiceId()), result.getUrl(), 0); + } + + if (disposables != null) disposables.clear(); + } + + @Override + public void handleNextItems(ListExtractor.InfoItemsPage result) { + super.handleNextItems(result); + + if (!result.getErrors().isEmpty()) { + showSnackBarError(result.getErrors(), + UserAction.REQUESTED_COMMENTS, + NewPipe.getNameOfService(serviceId), + "Get next page of: " + url, + R.string.general_error); + } + } + + /*////////////////////////////////////////////////////////////////////////// + // OnError + //////////////////////////////////////////////////////////////////////////*/ + + @Override + protected boolean onError(Throwable exception) { + if (super.onError(exception)) return true; + + int errorId = exception instanceof ExtractionException ? R.string.parsing_error : R.string.general_error; + onUnrecoverableError(exception, + UserAction.REQUESTED_COMMENTS, + NewPipe.getNameOfService(serviceId), + url, + errorId); + return true; + } + + /*////////////////////////////////////////////////////////////////////////// + // Utils + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public void setTitle(String title) { + super.setTitle(title); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java index 49bd2bdf1..64abf67f8 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java @@ -13,6 +13,8 @@ import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.info_list.holder.ChannelInfoItemHolder; import org.schabi.newpipe.info_list.holder.ChannelMiniInfoItemHolder; +import org.schabi.newpipe.info_list.holder.CommentsInfoItemHolder; +import org.schabi.newpipe.info_list.holder.CommentsMiniInfoItemHolder; import org.schabi.newpipe.info_list.holder.InfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistInfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistMiniInfoItemHolder; @@ -57,6 +59,8 @@ public class InfoListAdapter extends RecyclerView.Adapter infoItemList; @@ -216,6 +220,8 @@ public class InfoListAdapter extends RecyclerView.Adapter + return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.STREAM, Single.fromCallable(() -> StreamInfo.getInfo(NewPipe.getService(serviceId), url))); } @@ -117,7 +119,7 @@ public final class ExtractorHelper { final String url, boolean forceLoad) { checkServiceId(serviceId); - return checkCache(forceLoad, serviceId, url, Single.fromCallable(() -> + return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.CHANNEL, Single.fromCallable(() -> ChannelInfo.getInfo(NewPipe.getService(serviceId), url))); } @@ -129,11 +131,27 @@ public final class ExtractorHelper { ChannelInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl)); } + public static Single getCommentsInfo(final int serviceId, + final String url, + boolean forceLoad) { + checkServiceId(serviceId); + return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.COMMENT, Single.fromCallable(() -> + CommentsInfo.getInfo(NewPipe.getService(serviceId), url))); + } + + public static Single getMoreCommentItems(final int serviceId, + final CommentsInfo info, + final String nextPageUrl) { + checkServiceId(serviceId); + return Single.fromCallable(() -> + CommentsInfo.getMoreItems(NewPipe.getService(serviceId), info, nextPageUrl)); + } + public static Single getPlaylistInfo(final int serviceId, final String url, boolean forceLoad) { checkServiceId(serviceId); - return checkCache(forceLoad, serviceId, url, Single.fromCallable(() -> + return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.PLAYLIST, Single.fromCallable(() -> PlaylistInfo.getInfo(NewPipe.getService(serviceId), url))); } @@ -149,7 +167,7 @@ public final class ExtractorHelper { final String url, final String contentCountry, boolean forceLoad) { - return checkCache(forceLoad, serviceId, url, Single.fromCallable(() -> + return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.PLAYLIST, Single.fromCallable(() -> KioskInfo.getInfo(NewPipe.getService(serviceId), url, contentCountry))); } @@ -174,16 +192,17 @@ public final class ExtractorHelper { private static Single checkCache(boolean forceLoad, int serviceId, String url, + InfoItem.InfoType infoType, Single loadFromNetwork) { checkServiceId(serviceId); - loadFromNetwork = loadFromNetwork.doOnSuccess(info -> cache.putInfo(serviceId, url, info)); + loadFromNetwork = loadFromNetwork.doOnSuccess(info -> cache.putInfo(serviceId, url, info, infoType)); Single load; if (forceLoad) { - cache.removeInfo(serviceId, url); + cache.removeInfo(serviceId, url, infoType); load = loadFromNetwork; } else { - load = Maybe.concat(ExtractorHelper.loadFromCache(serviceId, url), + load = Maybe.concat(ExtractorHelper.loadFromCache(serviceId, url, infoType), loadFromNetwork.toMaybe()) .firstElement() //Take the first valid .toSingle(); @@ -195,11 +214,11 @@ public final class ExtractorHelper { /** * Default implementation uses the {@link InfoCache} to get cached results */ - public static Maybe loadFromCache(final int serviceId, final String url) { + public static Maybe loadFromCache(final int serviceId, final String url, InfoItem.InfoType infoType) { checkServiceId(serviceId); return Maybe.defer(() -> { //noinspection unchecked - I info = (I) cache.getFromKey(serviceId, url); + I info = (I) cache.getFromKey(serviceId, url, infoType); if (MainActivity.DEBUG) Log.d(TAG, "loadFromCache() called, info > " + info); // Only return info if it's not null (it is cached) diff --git a/app/src/main/java/org/schabi/newpipe/util/InfoCache.java b/app/src/main/java/org/schabi/newpipe/util/InfoCache.java index ecc66bb40..82f64a5ff 100644 --- a/app/src/main/java/org/schabi/newpipe/util/InfoCache.java +++ b/app/src/main/java/org/schabi/newpipe/util/InfoCache.java @@ -26,6 +26,7 @@ import android.util.Log; import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.extractor.Info; +import org.schabi.newpipe.extractor.InfoItem; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -55,27 +56,27 @@ public final class InfoCache { } @Nullable - public Info getFromKey(int serviceId, @NonNull String url) { + public Info getFromKey(int serviceId, @NonNull String url, @NonNull InfoItem.InfoType infoType) { if (DEBUG) Log.d(TAG, "getFromKey() called with: serviceId = [" + serviceId + "], url = [" + url + "]"); synchronized (lruCache) { - return getInfo(lruCache, keyOf(serviceId, url)); + return getInfo(lruCache, keyOf(serviceId, url, infoType)); } } - public void putInfo(int serviceId, @NonNull String url, @NonNull Info info) { + public void putInfo(int serviceId, @NonNull String url, @NonNull Info info, @NonNull InfoItem.InfoType infoType) { if (DEBUG) Log.d(TAG, "putInfo() called with: info = [" + info + "]"); final long expirationMillis = ServiceHelper.getCacheExpirationMillis(info.getServiceId()); synchronized (lruCache) { final CacheData data = new CacheData(info, expirationMillis); - lruCache.put(keyOf(serviceId, url), data); + lruCache.put(keyOf(serviceId, url, infoType), data); } } - public void removeInfo(int serviceId, @NonNull String url) { + public void removeInfo(int serviceId, @NonNull String url, @NonNull InfoItem.InfoType infoType) { if (DEBUG) Log.d(TAG, "removeInfo() called with: serviceId = [" + serviceId + "], url = [" + url + "]"); synchronized (lruCache) { - lruCache.remove(keyOf(serviceId, url)); + lruCache.remove(keyOf(serviceId, url, infoType)); } } @@ -101,8 +102,8 @@ public final class InfoCache { } @NonNull - private static String keyOf(final int serviceId, @NonNull final String url) { - return serviceId + url; + private static String keyOf(final int serviceId, @NonNull final String url, @NonNull InfoItem.InfoType infoType) { + return serviceId + url + infoType.toString(); } private static void removeStaleCache(@NonNull final LruCache cache) { diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index 13767125d..27cf7bf71 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -34,6 +34,7 @@ import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; import org.schabi.newpipe.fragments.list.channel.ChannelFragment; +import org.schabi.newpipe.fragments.list.comments.CommentsFragment; import org.schabi.newpipe.local.bookmark.BookmarkFragment; import org.schabi.newpipe.local.feed.FeedFragment; import org.schabi.newpipe.fragments.list.kiosk.KioskFragment; @@ -331,6 +332,18 @@ public class NavigationHelper { .commit(); } + public static void openCommentsFragment( + FragmentManager fragmentManager, + int serviceId, + String url, + String name) { + if (name == null) name = ""; + defaultTransaction(fragmentManager) + .replace(R.id.fragment_holder, CommentsFragment.getInstance(serviceId, url, name)) + .addToBackStack(null) + .commit(); + } + public static void openPlaylistFragment(FragmentManager fragmentManager, int serviceId, String url, diff --git a/app/src/main/res/layout/fragment_comments.xml b/app/src/main/res/layout/fragment_comments.xml new file mode 100644 index 000000000..97ad5c247 --- /dev/null +++ b/app/src/main/res/layout/fragment_comments.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index 185f7d380..c59c4ac11 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -495,6 +495,7 @@ android:src="?attr/expand" android:textAlignment="center" android:textAllCaps="true" + android:visibility="gone" tools:ignore="ContentDescription" /> From 66c753f3a3845346249b4ef5a92e891b01ffd094 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Sun, 23 Sep 2018 15:22:45 +0530 Subject: [PATCH 019/207] changed comments fragment loading animation --- .../newpipe/fragments/list/comments/CommentsFragment.java | 6 +++++- .../main/java/org/schabi/newpipe/util/NavigationHelper.java | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java index 78787107a..3e9cfe44c 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java @@ -70,7 +70,7 @@ import static org.schabi.newpipe.util.AnimationUtils.animateView; public class CommentsFragment extends BaseListInfoFragment { private CompositeDisposable disposables = new CompositeDisposable(); - + private boolean initialLoad = true; /*////////////////////////////////////////////////////////////////////////// // Views //////////////////////////////////////////////////////////////////////////*/ @@ -152,6 +152,10 @@ public class CommentsFragment extends BaseListInfoFragment { @Override public void handleResult(@NonNull CommentsInfo result) { super.handleResult(result); + if(initialLoad){ + itemsList.smoothScrollToPosition(infoListAdapter.getItemCount()); + initialLoad = false; + } if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.REQUESTED_COMMENTS, NewPipe.getNameOfService(result.getServiceId()), result.getUrl(), 0); diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index 27cf7bf71..77bcec10b 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -338,7 +338,7 @@ public class NavigationHelper { String url, String name) { if (name == null) name = ""; - defaultTransaction(fragmentManager) + fragmentManager.beginTransaction().setCustomAnimations(R.anim.switch_service_in, R.anim.switch_service_out) .replace(R.id.fragment_holder, CommentsFragment.getInstance(serviceId, url, name)) .addToBackStack(null) .commit(); From d694c5f511461a6fa939cb2ffe5c83777d39cafe Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Sun, 23 Sep 2018 19:45:26 +0530 Subject: [PATCH 020/207] smoother transition to comments fragment --- .../fragments/detail/VideoDetailFragment.java | 28 ++----------------- .../list/comments/CommentsFragment.java | 3 +- 2 files changed, 4 insertions(+), 27 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 4357753b4..64d785bcb 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 @@ -121,7 +121,7 @@ public class VideoDetailFragment // Amount of videos to show on start private static final int INITIAL_RELATED_VIDEOS = 8; // Amount of comments to show on start - private static final int INITIAL_COMMENTS = 8; + public static final int INITIAL_COMMENTS = 8; private InfoItemBuilder infoItemBuilder = null; @@ -503,32 +503,8 @@ public class VideoDetailFragment if (DEBUG) Log.d(TAG, "toggleExpandComments() called with: info = [" + info + "]"); if (!showComments || null == info) return; - int initialCount = INITIAL_COMMENTS; - int currentCount = commentsView.getChildCount(); + NavigationHelper.openCommentsFragment(getFragmentManager(), serviceId, url, name); - //collapse - if (currentCount > initialCount && !info.hasNextPage()) { - commentsView.removeViews(initialCount, - currentCount - (initialCount)); - commentsExpandButton.setImageDrawable(ContextCompat.getDrawable( - activity, ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.expand))); - return; - } - - if(currentCount < info.getRelatedItems().size()){ - //expand - for (int i = currentCount; i < info.getRelatedItems().size(); i++) { - CommentsInfoItem item = info.getRelatedItems().get(i); - commentsView.addView(infoItemBuilder.buildView(commentsView, item)); - } - if(!info.hasNextPage()){ - commentsExpandButton.setImageDrawable( - ContextCompat.getDrawable(activity, - ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.collapse))); - } - }else{ - NavigationHelper.openCommentsFragment(getFragmentManager(), serviceId, url, name); - } } /*////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java index 3e9cfe44c..02815407a 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java @@ -34,6 +34,7 @@ import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.comments.CommentsInfo; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.fragments.detail.VideoDetailFragment; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.info_list.InfoItemDialog; import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; @@ -153,7 +154,7 @@ public class CommentsFragment extends BaseListInfoFragment { public void handleResult(@NonNull CommentsInfo result) { super.handleResult(result); if(initialLoad){ - itemsList.smoothScrollToPosition(infoListAdapter.getItemCount()); + itemsList.smoothScrollToPosition(VideoDetailFragment.INITIAL_COMMENTS); initialLoad = false; } From 515be677a918b45181b9e6bc956de668a3956432 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Mon, 24 Sep 2018 14:53:43 +0530 Subject: [PATCH 021/207] no comments --- .../fragments/detail/VideoDetailFragment.java | 11 +++++-- app/src/main/res/layout/fragment_comments.xml | 2 +- .../main/res/layout/fragment_video_detail.xml | 29 +++++++++++++++++++ app/src/main/res/values/strings.xml | 7 +++++ 4 files changed, 45 insertions(+), 4 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 64d785bcb..09e9b38d7 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 @@ -54,7 +54,6 @@ import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.download.DownloadDialog; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.comments.CommentsInfo; import org.schabi.newpipe.extractor.comments.CommentsInfoItem; @@ -200,6 +199,7 @@ public class VideoDetailFragment private ImageButton relatedStreamExpandButton; private LinearLayout commentsRootLayout; + private View commentsEmptyStateView; private LinearLayout commentsView; private ImageButton commentsExpandButton; private Disposable commentsDisposable; @@ -571,6 +571,7 @@ public class VideoDetailFragment relatedStreamExpandButton = rootView.findViewById(R.id.detail_related_streams_expand); commentsRootLayout = rootView.findViewById(R.id.detail_comments_root_layout); + commentsEmptyStateView = rootView.findViewById(R.id.comments_empty_state_view); commentsView = rootView.findViewById(R.id.detail_comments_view); commentsExpandButton = rootView.findViewById(R.id.detail_comments_expand); @@ -750,9 +751,13 @@ public class VideoDetailFragment } private void initComments(CommentsInfo info) { - if(null == info) return; + clearComments(); - if (commentsView.getChildCount() > 0) commentsView.removeAllViews(); + if(null == info || null == info.getRelatedItems() || info.getRelatedItems().size() == 0){ + commentsEmptyStateView.setVisibility(View.VISIBLE); + return; + } + commentsEmptyStateView.setVisibility(View.GONE); List initialComments = info.getRelatedItems(); if (null != info && initialComments != null diff --git a/app/src/main/res/layout/fragment_comments.xml b/app/src/main/res/layout/fragment_comments.xml index 97ad5c247..83e788070 100644 --- a/app/src/main/res/layout/fragment_comments.xml +++ b/app/src/main/res/layout/fragment_comments.xml @@ -45,7 +45,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:text="@string/empty_view_no_videos" + android:text="@string/empty_view_no_comments" android:textSize="24sp"/> diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index c59c4ac11..870043eb1 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -477,6 +477,35 @@ android:layout_marginTop="14dp" android:orientation="vertical"> + + + + + + + + User report No results @string/no_videos + @string/no_comments Nothing Here But Crickets Drag to reorder @@ -264,6 +265,12 @@ %s videos + No comments + + %s comment + %s comments + + Start Pause From a29e2116a7ed127da639d59b5ac97f96c3f259b3 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Thu, 27 Sep 2018 00:53:36 +0530 Subject: [PATCH 022/207] handling error while loading comments --- app/build.gradle | 2 +- .../newpipe/fragments/detail/VideoDetailFragment.java | 8 ++++++-- app/src/main/res/values/strings.xml | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e4c1f24c1..0b264d8c6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.yausername:NewPipeExtractor:c1199c8' + implementation 'com.github.yausername:NewPipeExtractor:fb14196' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.8.9' 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 09e9b38d7..1629afadd 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 @@ -997,7 +997,6 @@ public class VideoDetailFragment protected void prepareAndLoadInfo() { parallaxScrollRootView.smoothScrollTo(0, 0); pushToStack(serviceId, url, name); - //clearComments(); startLoading(false); } @@ -1027,6 +1026,7 @@ public class VideoDetailFragment private void loadComments(boolean forceLoad) { if(isCommentsSupported && showComments){ + clearComments(); commentsInfo = null; if (commentsDisposable != null) commentsDisposable.dispose(); @@ -1038,7 +1038,7 @@ public class VideoDetailFragment showCommentsWithAnimation(120, 0,0); initComments(commentsInfo); }, (@NonNull Throwable throwable) -> { - onError(throwable); + onCommentsError(throwable); }); } } @@ -1495,4 +1495,8 @@ public class VideoDetailFragment showError(getString(R.string.blocked_by_gema), false, R.drawable.gruese_die_gema); } + + public void onCommentsError(Throwable exception) { + showSnackBarError(exception, UserAction.REQUESTED_COMMENTS, NewPipe.getNameOfService(serviceId), url, R.string.error_unable_to_load_comments); + } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 23039a4c7..3dbbc29cf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -389,6 +389,7 @@ Warning: Could not import all files. This will override your current setup. Do you want to also import settings? + Could not load comments Kiosk From 4e6722f201569df3b01af5347a1c4f1336c814e2 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Thu, 27 Sep 2018 04:20:57 +0530 Subject: [PATCH 023/207] updated extractor and downloader --- app/build.gradle | 2 +- .../java/org/schabi/newpipe/Downloader.java | 22 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0b264d8c6..0eef1e2d0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.yausername:NewPipeExtractor:fb14196' + implementation 'com.github.yausername:NewPipeExtractor:6b62091' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.8.9' diff --git a/app/src/main/java/org/schabi/newpipe/Downloader.java b/app/src/main/java/org/schabi/newpipe/Downloader.java index d51d31e11..528141c49 100644 --- a/app/src/main/java/org/schabi/newpipe/Downloader.java +++ b/app/src/main/java/org/schabi/newpipe/Downloader.java @@ -3,6 +3,7 @@ package org.schabi.newpipe; import android.support.annotation.Nullable; import android.text.TextUtils; +import org.schabi.newpipe.extractor.DownloadRequest; import org.schabi.newpipe.extractor.DownloadResponse; import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; @@ -186,10 +187,11 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader { @Override - public DownloadResponse get(String siteUrl, Map> requestHeaders) throws IOException, ReCaptchaException { + public DownloadResponse get(String siteUrl, DownloadRequest request) throws IOException, ReCaptchaException { final Request.Builder requestBuilder = new Request.Builder() .method("GET", null).url(siteUrl); + Map> requestHeaders = request.getRequestHeaders(); // set custom headers in request for (Map.Entry> pair : requestHeaders.entrySet()) { for(String value : pair.getValue()){ @@ -205,8 +207,8 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader { requestBuilder.addHeader("Cookie", mCookies); } - final Request request = requestBuilder.build(); - final Response response = client.newCall(request).execute(); + final Request okRequest = requestBuilder.build(); + final Response response = client.newCall(okRequest).execute(); final ResponseBody body = response.body(); if (response.code() == 429) { @@ -223,12 +225,13 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader { @Override public DownloadResponse get(String siteUrl) throws IOException, ReCaptchaException { - return get(siteUrl, Collections.emptyMap()); + return get(siteUrl, DownloadRequest.emptyRequest); } @Override - public DownloadResponse post(String siteUrl, String requestBody, Map> requestHeaders) throws IOException, ReCaptchaException { + public DownloadResponse post(String siteUrl, DownloadRequest request) throws IOException, ReCaptchaException { + Map> requestHeaders = request.getRequestHeaders(); if(null == requestHeaders.get("Content-Type") || requestHeaders.get("Content-Type").isEmpty()){ // content type header is required. maybe throw an exception here return null; @@ -236,7 +239,10 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader { String contentType = requestHeaders.get("Content-Type").get(0); - RequestBody okRequestBody = RequestBody.create(MediaType.parse(contentType), requestBody); + RequestBody okRequestBody = null; + if(null != request.getRequestBody()){ + okRequestBody = RequestBody.create(MediaType.parse(contentType), request.getRequestBody()); + } final Request.Builder requestBuilder = new Request.Builder() .method("POST", okRequestBody).url(siteUrl); @@ -255,8 +261,8 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader { requestBuilder.addHeader("Cookie", mCookies); } - final Request request = requestBuilder.build(); - final Response response = client.newCall(request).execute(); + final Request okRequest = requestBuilder.build(); + final Response response = client.newCall(okRequest).execute(); final ResponseBody body = response.body(); if (response.code() == 429) { From 08bbfc50eebc906ddb4cc6642f0944b29feca473 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Thu, 27 Sep 2018 23:27:52 +0530 Subject: [PATCH 024/207] updated extractor --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0eef1e2d0..e1727665a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.yausername:NewPipeExtractor:6b62091' + implementation 'com.github.yausername:NewPipeExtractor:c2ed99b' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.8.9' From 803b8eab282fe343fb28f03a3019addefcff4515 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Fri, 28 Sep 2018 05:04:36 +0530 Subject: [PATCH 025/207] updated extractor version --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e1727665a..2104d2023 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.yausername:NewPipeExtractor:c2ed99b' + implementation 'com.github.yausername:NewPipeExtractor:d1ff1c7' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.8.9' From 2e9a860aaa138f9682d363eece897506b823e340 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Tue, 2 Oct 2018 20:39:16 +0530 Subject: [PATCH 026/207] added viewpager. changed from parallaxscrollview to coordinate layout --- .../newpipe/fragments/detail/TabAdaptor.java | 82 +++++ .../fragments/detail/VideoDetailFragment.java | 348 +++--------------- .../list/comments/CommentsFragment.java | 33 +- .../list/videos/RelatedVideosFragment.java | 150 ++++++++ .../newpipe/util/RelatedStreamInfo.java | 23 ++ app/src/main/res/layout/fragment_comments.xml | 2 +- .../res/layout/fragment_related_streams.xml | 70 ++++ .../main/res/layout/fragment_video_detail.xml | 304 +++++---------- 8 files changed, 484 insertions(+), 528 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java create mode 100644 app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java create mode 100644 app/src/main/java/org/schabi/newpipe/util/RelatedStreamInfo.java create mode 100644 app/src/main/res/layout/fragment_related_streams.xml diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java new file mode 100644 index 000000000..c091f45b2 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java @@ -0,0 +1,82 @@ +package org.schabi.newpipe.fragments.detail; + +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.view.PagerAdapter; + +import java.util.ArrayList; +import java.util.List; + +public class TabAdaptor extends FragmentPagerAdapter { + + private final List mFragmentList = new ArrayList<>(); + private final List mFragmentTitleList = new ArrayList<>(); + int baseId = 0; + + public TabAdaptor(FragmentManager fm) { + super(fm); + } + + @Override + public Fragment getItem(int position) { + return mFragmentList.get(position); + } + + @Override + public int getCount() { + return mFragmentList.size(); + } + + @Nullable + @Override + public CharSequence getPageTitle(int position) { + return mFragmentTitleList.get(position); + } + + @Override + public long getItemId(int position) { + // give an ID different from position when position has been changed + return baseId + position; + } + + public void addFragment(Fragment fragment, String title) { + mFragmentList.add(fragment); + mFragmentTitleList.add(title); + notifyDataSetChanged(); + } + + public void clearAllItems() { + mFragmentList.clear(); + mFragmentTitleList.clear(); + notifyDataSetChanged(); + } + + public void removeItem(int position){ + mFragmentList.remove(position == 0 ? 0 : position - 1); + mFragmentTitleList.remove(position == 0 ? 0 : position - 1); + notifyDataSetChanged(); + } + + public void updateItem(int position, Fragment fragment){ + mFragmentList.set(position, fragment); + // shift the ID returned by getItemId outside the range of all previous fragments + // https://stackoverflow.com/questions/10396321/remove-fragment-page-from-viewpager-in-android + baseId += getCount() + 1; + notifyDataSetChanged(); + } + + public void updateItem(String title, Fragment fragment){ + int index = mFragmentTitleList.indexOf(title); + if(index != -1){ + updateItem(index, fragment); + } + } + + @Override + public int getItemPosition(Object object) { + if (mFragmentList.contains(object)) return mFragmentList.indexOf(object); + else return POSITION_NONE; + } +} 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 6a3e31fc1..ded6be349 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 @@ -13,7 +13,11 @@ import android.support.annotation.DrawableRes; import android.support.annotation.FloatRange; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.design.widget.AppBarLayout; +import android.support.design.widget.TabLayout; +import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; +import android.support.v4.view.ViewPager; import android.support.v4.view.animation.FastOutSlowInInterpolator; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; @@ -40,11 +44,9 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Spinner; -import android.widget.TabHost; import android.widget.TextView; import android.widget.Toast; -import com.nirhart.parallaxscroll.views.ParallaxScrollView; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; @@ -56,7 +58,6 @@ import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.comments.CommentsInfo; -import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; @@ -69,6 +70,8 @@ import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.BaseStateFragment; +import org.schabi.newpipe.fragments.list.comments.CommentsFragment; +import org.schabi.newpipe.fragments.list.videos.RelatedVideosFragment; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.info_list.InfoItemDialog; import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; @@ -117,13 +120,6 @@ public class VideoDetailFragment View.OnLongClickListener { public static final String AUTO_PLAY = "auto_play"; - // Amount of videos to show on start - private static final int INITIAL_RELATED_VIDEOS = 8; - // Amount of comments to show on start - public static final int INITIAL_COMMENTS = 8; - - private InfoItemBuilder infoItemBuilder = null; - private int updateFlags = 0; private static final int RELATED_STREAMS_UPDATE_FLAG = 0x1; private static final int RESOLUTIONS_MENU_UPDATE_FLAG = 0x2; @@ -133,8 +129,6 @@ public class VideoDetailFragment private boolean autoPlayEnabled; private boolean showRelatedStreams; private boolean showComments; - private boolean isCommentsSupported; - private boolean wasRelatedStreamsExpanded = false; @State protected int serviceId = Constants.NO_SERVICE_ID; @@ -144,7 +138,6 @@ public class VideoDetailFragment protected String url; private StreamInfo currentInfo; - private CommentsInfo commentsInfo; private Disposable currentWorker; @NonNull private CompositeDisposable disposables = new CompositeDisposable(); @@ -160,7 +153,6 @@ public class VideoDetailFragment private Spinner spinnerToolbar; - private ParallaxScrollView parallaxScrollRootView; private LinearLayout contentRootLayoutHiding; private View thumbnailBackgroundButton; @@ -193,21 +185,13 @@ public class VideoDetailFragment private ImageView thumbsDownImageView; private TextView thumbsDisabledTextView; - private TextView nextStreamTitle; - private LinearLayout relatedStreamRootLayout; - private LinearLayout relatedStreamsView; - private ImageButton relatedStreamExpandButton; - - private LinearLayout commentsRootLayout; - private View commentsEmptyStateView; - private LinearLayout commentsView; - private ImageButton commentsExpandButton; - private Disposable commentsDisposable; - - private TabHost tabHost; - private static final String COMMENTS_TAB_TAG = "CommentsTab"; - private static final String RELATED_TAB_TAG = "RelatedTab"; + private static final String COMMENTS_TAB_TAG = "COMMENTS"; + private static final String RELATED_TAB_TAG = "NEXT VIDEO"; + private AppBarLayout appBarLayout; + private ViewPager viewPager; + private TabAdaptor pageAdapter; + private TabLayout tabLayout; /*////////////////////////////////////////////////////////////////////////*/ @@ -247,7 +231,6 @@ public class VideoDetailFragment public void onPause() { super.onPause(); if (currentWorker != null) currentWorker.dispose(); - if (commentsDisposable != null) commentsDisposable.dispose(); } @Override @@ -256,10 +239,9 @@ public class VideoDetailFragment if (updateFlags != 0) { if (!isLoading.get() && currentInfo != null) { - if ((updateFlags & RELATED_STREAMS_UPDATE_FLAG) != 0) - initRelatedVideos(currentInfo); + if ((updateFlags & RELATED_STREAMS_UPDATE_FLAG) != 0) startLoading(false); if ((updateFlags & RESOLUTIONS_MENU_UPDATE_FLAG) != 0) setupActionBar(currentInfo); - if ((updateFlags & COMMENTS_UPDATE_FLAG) != 0) initComments(commentsInfo); + if ((updateFlags & COMMENTS_UPDATE_FLAG) != 0) startLoading(false); } if ((updateFlags & TOOLBAR_ITEMS_UPDATE_FLAG) != 0 @@ -273,8 +255,6 @@ public class VideoDetailFragment // Check if it was loading when the fragment was stopped/paused, if (wasLoading.getAndSet(false)) { selectAndLoadVideo(serviceId, url, name); - }else{ - loadComments(false); } } @@ -285,10 +265,8 @@ public class VideoDetailFragment .unregisterOnSharedPreferenceChangeListener(this); if (currentWorker != null) currentWorker.dispose(); - if (commentsDisposable != null) commentsDisposable.dispose(); if (disposables != null) disposables.clear(); currentWorker = null; - commentsDisposable = null; disposables = null; } @@ -339,7 +317,6 @@ public class VideoDetailFragment private static final String INFO_KEY = "info_key"; private static final String STACK_KEY = "stack_key"; - private static final String WAS_RELATED_EXPANDED_KEY = "was_related_expanded_key"; @Override public void onSaveInstanceState(Bundle outState) { @@ -348,10 +325,6 @@ public class VideoDetailFragment // Check if the next video label and video is visible, // if it is, include the two elements in the next check int nextCount = currentInfo != null && currentInfo.getNextVideo() != null ? 2 : 0; - if (relatedStreamsView != null - && relatedStreamsView.getChildCount() > INITIAL_RELATED_VIDEOS + nextCount) { - outState.putSerializable(WAS_RELATED_EXPANDED_KEY, true); - } if (!isLoading.get() && currentInfo != null && isVisible()) { outState.putSerializable(INFO_KEY, currentInfo); @@ -364,7 +337,6 @@ public class VideoDetailFragment protected void onRestoreInstanceState(@NonNull Bundle savedState) { super.onRestoreInstanceState(savedState); - wasRelatedStreamsExpanded = savedState.getBoolean(WAS_RELATED_EXPANDED_KEY, false); Serializable serializable = savedState.getSerializable(INFO_KEY); if (serializable instanceof StreamInfo) { //noinspection unchecked @@ -432,12 +404,6 @@ public class VideoDetailFragment case R.id.detail_title_root_layout: toggleTitleAndDescription(); break; - case R.id.detail_related_streams_expand: - toggleExpandRelatedVideos(currentInfo); - break; - case R.id.detail_comments_expand: - toggleExpandComments(commentsInfo); - break; } } @@ -472,41 +438,6 @@ public class VideoDetailFragment } } - private void toggleExpandRelatedVideos(StreamInfo info) { - if (DEBUG) Log.d(TAG, "toggleExpandRelatedVideos() called with: info = [" + info + "]"); - if (!showRelatedStreams) return; - - int nextCount = info.getNextVideo() != null ? 2 : 0; - int initialCount = INITIAL_RELATED_VIDEOS + nextCount; - - if (relatedStreamsView.getChildCount() > initialCount) { - relatedStreamsView.removeViews(initialCount, - relatedStreamsView.getChildCount() - (initialCount)); - relatedStreamExpandButton.setImageDrawable(ContextCompat.getDrawable( - activity, ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.expand))); - return; - } - - //Log.d(TAG, "toggleExpandRelatedVideos() called with: info = [" + info + "], from = [" + INITIAL_RELATED_VIDEOS + "]"); - for (int i = INITIAL_RELATED_VIDEOS; i < info.getRelatedStreams().size(); i++) { - InfoItem item = info.getRelatedStreams().get(i); - //Log.d(TAG, "i = " + i); - relatedStreamsView.addView(infoItemBuilder.buildView(relatedStreamsView, item)); - } - relatedStreamExpandButton.setImageDrawable( - ContextCompat.getDrawable(activity, - ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.collapse))); - } - - - private void toggleExpandComments(CommentsInfo info) { - if (DEBUG) Log.d(TAG, "toggleExpandComments() called with: info = [" + info + "]"); - if (!showComments || null == info) return; - - NavigationHelper.openCommentsFragment(getFragmentManager(), serviceId, url, name); - - } - /*////////////////////////////////////////////////////////////////////////// // Init //////////////////////////////////////////////////////////////////////////*/ @@ -516,8 +447,6 @@ public class VideoDetailFragment super.initViews(rootView, savedInstanceState); spinnerToolbar = activity.findViewById(R.id.toolbar).findViewById(R.id.toolbar_spinner); - parallaxScrollRootView = rootView.findViewById(R.id.detail_main_content); - thumbnailBackgroundButton = rootView.findViewById(R.id.detail_thumbnail_root_layout); thumbnailImageView = rootView.findViewById(R.id.detail_thumbnail_image_view); thumbnailPlayButton = rootView.findViewById(R.id.detail_thumbnail_play_button); @@ -553,67 +482,21 @@ public class VideoDetailFragment uploaderTextView = rootView.findViewById(R.id.detail_uploader_text_view); uploaderThumb = rootView.findViewById(R.id.detail_uploader_thumbnail_view); - StreamingService service = null; - try { - service = NewPipe.getService(serviceId); - } catch (ExtractionException e) { - onError(e); - } + appBarLayout = rootView.findViewById(R.id.appbarlayout); + viewPager = rootView.findViewById(R.id.viewpager); + pageAdapter = new TabAdaptor(getChildFragmentManager()); + viewPager.setAdapter(pageAdapter); + tabLayout = rootView.findViewById(R.id.tablayout); + tabLayout.setupWithViewPager(viewPager); - if (service.isCommentsSupported()) { - isCommentsSupported = true; - initTabs(rootView); - } - - relatedStreamRootLayout = rootView.findViewById(R.id.detail_related_streams_root_layout); - nextStreamTitle = rootView.findViewById(R.id.detail_next_stream_title); - relatedStreamsView = rootView.findViewById(R.id.detail_related_streams_view); - relatedStreamExpandButton = rootView.findViewById(R.id.detail_related_streams_expand); - - commentsRootLayout = rootView.findViewById(R.id.detail_comments_root_layout); - commentsEmptyStateView = rootView.findViewById(R.id.comments_empty_state_view); - commentsView = rootView.findViewById(R.id.detail_comments_view); - commentsExpandButton = rootView.findViewById(R.id.detail_comments_expand); - - infoItemBuilder = new InfoItemBuilder(activity); setHeightThumbnail(); } - private void initTabs(View rootView) { - tabHost = (TabHost) rootView.findViewById(R.id.tab_host); - tabHost.setup(); - - TabHost.TabSpec commentsTab = tabHost.newTabSpec(COMMENTS_TAB_TAG); - commentsTab.setContent(R.id.detail_comments_root_layout); - commentsTab.setIndicator(getString(R.string.comments)); - - TabHost.TabSpec relatedVideosTab = tabHost.newTabSpec(RELATED_TAB_TAG); - relatedVideosTab.setContent(R.id.detail_related_streams_root_layout); - relatedVideosTab.setIndicator(getString(R.string.next_video_title)); - - tabHost.addTab(commentsTab); - tabHost.addTab(relatedVideosTab); - - //show comments tab by default - tabHost.setCurrentTabByTag(COMMENTS_TAB_TAG); - } - @Override protected void initListeners() { super.initListeners(); - infoItemBuilder.setOnStreamSelectedListener(new OnClickGesture() { - @Override - public void selected(StreamInfoItem selectedItem) { - selectAndLoadVideo(selectedItem.getServiceId(), selectedItem.getUrl(), selectedItem.getName()); - } - - @Override - public void held(StreamInfoItem selectedItem) { - showStreamDialog(selectedItem); - } - }); videoTitleRoot.setOnClickListener(this); uploaderRootLayout.setOnClickListener(this); @@ -623,8 +506,6 @@ public class VideoDetailFragment detailControlsAddToPlaylist.setOnClickListener(this); detailControlsDownload.setOnClickListener(this); detailControlsDownload.setOnLongClickListener(this); - relatedStreamExpandButton.setOnClickListener(this); - commentsExpandButton.setOnClickListener(this); detailControlsBackground.setLongClickable(true); detailControlsPopup.setLongClickable(true); @@ -707,98 +588,6 @@ public class VideoDetailFragment } } - private void initRelatedVideos(StreamInfo info) { - if (relatedStreamsView.getChildCount() > 0) relatedStreamsView.removeAllViews(); - - if (info.getNextVideo() != null && showRelatedStreams) { - nextStreamTitle.setVisibility(View.VISIBLE); - relatedStreamsView.addView( - infoItemBuilder.buildView(relatedStreamsView, info.getNextVideo())); - relatedStreamsView.addView(getSeparatorView()); - showRelatedStreamsIfSelected(); - } else nextStreamTitle.setVisibility(View.GONE); - - if (info.getRelatedStreams() != null - && !info.getRelatedStreams().isEmpty() && showRelatedStreams) { - //long first = System.nanoTime(), each; - int to = info.getRelatedStreams().size() >= INITIAL_RELATED_VIDEOS - ? INITIAL_RELATED_VIDEOS - : info.getRelatedStreams().size(); - for (int i = 0; i < to; i++) { - InfoItem item = info.getRelatedStreams().get(i); - //each = System.nanoTime(); - relatedStreamsView.addView(infoItemBuilder.buildView(relatedStreamsView, item)); - //if (DEBUG) Log.d(TAG, "each took " + ((System.nanoTime() - each) / 1000000L) + "ms"); - } - //if (DEBUG) Log.d(TAG, "Total time " + ((System.nanoTime() - first) / 1000000L) + "ms"); - - showRelatedStreamsIfSelected(); - relatedStreamExpandButton.setVisibility(View.VISIBLE); - - relatedStreamExpandButton.setImageDrawable(ContextCompat.getDrawable( - activity, ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.expand))); - } else { - if (info.getNextVideo() == null) relatedStreamRootLayout.setVisibility(View.GONE); - relatedStreamExpandButton.setVisibility(View.GONE); - } - - } - - private void showRelatedStreamsIfSelected() { - if (null == tabHost || tabHost.getCurrentTabTag().contentEquals(RELATED_TAB_TAG)) { - relatedStreamRootLayout.setVisibility(View.VISIBLE); - } - } - - private void initComments(CommentsInfo info) { - clearComments(); - - if(null == info || null == info.getRelatedItems() || info.getRelatedItems().size() == 0){ - commentsEmptyStateView.setVisibility(View.VISIBLE); - return; - } - commentsEmptyStateView.setVisibility(View.GONE); - - List initialComments = info.getRelatedItems(); - if (null != info && initialComments != null - && !initialComments.isEmpty() && showComments) { - //long first = System.nanoTime(), each; - int to = initialComments.size() >= INITIAL_COMMENTS - ? INITIAL_COMMENTS - : initialComments.size(); - for (int i = 0; i < to; i++) { - InfoItem item = initialComments.get(i); - //each = System.nanoTime(); - commentsView.addView(infoItemBuilder.buildView(commentsView, item)); - //if (DEBUG) Log.d(TAG, "each took " + ((System.nanoTime() - each) / 1000000L) + "ms"); - } - //if (DEBUG) Log.d(TAG, "Total time " + ((System.nanoTime() - first) / 1000000L) + "ms"); - - showCommentsIfSelected(); - if(initialComments.size() > INITIAL_COMMENTS){ - commentsExpandButton.setVisibility(View.VISIBLE); - commentsExpandButton.setImageDrawable(ContextCompat.getDrawable( - activity, ThemeHelper.resolveResourceIdFromAttr(activity, R.attr.expand))); - }else{ - commentsExpandButton.setVisibility(View.GONE); - } - } else { - commentsRootLayout.setVisibility(View.GONE); - } - - } - - private void showCommentsIfSelected() { - if (null == tabHost || tabHost.getCurrentTabTag().contentEquals(COMMENTS_TAB_TAG)) { - commentsRootLayout.setVisibility(View.VISIBLE); - } - } - - private void clearComments(){ - if (commentsView.getChildCount() > 0) commentsView.removeAllViews(); - commentsExpandButton.setVisibility(View.GONE); - } - /*////////////////////////////////////////////////////////////////////////// // Menu //////////////////////////////////////////////////////////////////////////*/ @@ -979,23 +768,18 @@ public class VideoDetailFragment setInitialData(info.getServiceId(), info.getOriginalUrl(), info.getName()); pushToStack(serviceId, url, name); showLoading(); + initTabs(); - Log.d(TAG, "prepareAndHandleInfo() called parallaxScrollRootView.getScrollY(): " - + parallaxScrollRootView.getScrollY()); - final boolean greaterThanThreshold = parallaxScrollRootView.getScrollY() > (int) - (getResources().getDisplayMetrics().heightPixels * .1f); - - if (scrollToTop) parallaxScrollRootView.smoothScrollTo(0, 0); + if (scrollToTop) appBarLayout.setExpanded(true, true); animateView(contentRootLayoutHiding, - false, - greaterThanThreshold ? 250 : 0, 0, () -> { + false, 0, 0, () -> { handleResult(info); showContentWithAnimation(120, 0, .01f); }); } protected void prepareAndLoadInfo() { - parallaxScrollRootView.smoothScrollTo(0, 0); + appBarLayout.setExpanded(true, true); pushToStack(serviceId, url, name); startLoading(false); } @@ -1004,6 +788,7 @@ public class VideoDetailFragment public void startLoading(boolean forceLoad) { super.startLoading(forceLoad); + initTabs(); currentInfo = null; if (currentWorker != null) currentWorker.dispose(); @@ -1020,26 +805,29 @@ public class VideoDetailFragment onError(throwable); }); - loadComments(forceLoad); - } - private void loadComments(boolean forceLoad) { - if(isCommentsSupported && showComments){ - clearComments(); - commentsInfo = null; - if (commentsDisposable != null) commentsDisposable.dispose(); + private void initTabs() { + pageAdapter.clearAllItems(); - commentsDisposable = ExtractorHelper.getCommentsInfo(serviceId, url, forceLoad) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe((@NonNull CommentsInfo result) -> { - commentsInfo = result; - showCommentsWithAnimation(120, 0,0); - initComments(commentsInfo); - }, (@NonNull Throwable throwable) -> { - onCommentsError(throwable); - }); + if(shouldShowComments()){ + pageAdapter.addFragment(CommentsFragment.getInstance(serviceId, url, name), COMMENTS_TAB_TAG); + } + + if(showRelatedStreams){ + pageAdapter.addFragment(new Fragment(), RELATED_TAB_TAG); + } + + if(pageAdapter.getCount() < 2){ + tabLayout.setVisibility(View.GONE); + } + } + + private boolean shouldShowComments() { + try { + return showComments && NewPipe.getService(serviceId).isCommentsSupported(); + } catch (ExtractionException e) { + return false; } } @@ -1230,41 +1018,6 @@ public class VideoDetailFragment .setInterpolator(new FastOutSlowInInterpolator()) .start(); - if (showRelatedStreams && (null == tabHost || tabHost.getCurrentTabTag().contentEquals(RELATED_TAB_TAG))) { - relatedStreamRootLayout.animate().setListener(null).cancel(); - relatedStreamRootLayout.setAlpha(0f); - relatedStreamRootLayout.setTranslationY(translationY); - relatedStreamRootLayout.setVisibility(View.VISIBLE); - relatedStreamRootLayout.animate() - .alpha(1f) - .translationY(0) - .setStartDelay((long) (duration * .8f) + delay) - .setDuration(duration) - .setInterpolator(new FastOutSlowInInterpolator()) - .start(); - } - - } - - private void showCommentsWithAnimation(long duration, - long delay, - @FloatRange(from = 0.0f, to = 1.0f) float translationPercent) { - int translationY = (int) (getResources().getDisplayMetrics().heightPixels * - (translationPercent > 0.0f ? translationPercent : .06f)); - - if (showComments && (null == tabHost || tabHost.getCurrentTabTag().contentEquals(COMMENTS_TAB_TAG))) { - commentsRootLayout.animate().setListener(null).cancel(); - commentsRootLayout.setAlpha(0f); - commentsRootLayout.setTranslationY(translationY); - commentsRootLayout.setVisibility(View.VISIBLE); - commentsRootLayout.animate() - .alpha(1f) - .translationY(0) - .setStartDelay((long) (duration * .8f) + delay) - .setDuration(duration) - .setInterpolator(new FastOutSlowInInterpolator()) - .start(); - } } protected void setInitialData(int serviceId, String url, String name) { @@ -1324,6 +1077,11 @@ public class VideoDetailFragment super.handleResult(info); setInitialData(info.getServiceId(), info.getOriginalUrl(), info.getName()); + + if(showRelatedStreams){ + pageAdapter.updateItem(RELATED_TAB_TAG, RelatedVideosFragment.getInstance(currentInfo)); + } + pushToStack(serviceId, url, name); animateView(thumbnailPlayButton, true, 200); @@ -1398,12 +1156,6 @@ public class VideoDetailFragment animateView(spinnerToolbar, true, 500); setupActionBar(info); initThumbnailViews(info); - initRelatedVideos(info); - - if (wasRelatedStreamsExpanded) { - toggleExpandRelatedVideos(currentInfo); - wasRelatedStreamsExpanded = false; - } setTitleToUrl(info.getServiceId(), info.getUrl(), info.getName()); setTitleToUrl(info.getServiceId(), info.getOriginalUrl(), info.getName()); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java index 02815407a..e7778c905 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java @@ -71,7 +71,6 @@ import static org.schabi.newpipe.util.AnimationUtils.animateView; public class CommentsFragment extends BaseListInfoFragment { private CompositeDisposable disposables = new CompositeDisposable(); - private boolean initialLoad = true; /*////////////////////////////////////////////////////////////////////////// // Views //////////////////////////////////////////////////////////////////////////*/ @@ -94,11 +93,6 @@ public class CommentsFragment extends BaseListInfoFragment { public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); mIsVisibleToUser = isVisibleToUser; - if(activity != null - && useAsFrontPage - && isVisibleToUser) { - setTitle(currentInfo != null ? currentInfo.getName() : name); - } } @Override @@ -117,15 +111,6 @@ public class CommentsFragment extends BaseListInfoFragment { if (disposables != null) disposables.clear(); } - /*////////////////////////////////////////////////////////////////////////// - // Init - //////////////////////////////////////////////////////////////////////////*/ - - - /*////////////////////////////////////////////////////////////////////////// - // Menu - //////////////////////////////////////////////////////////////////////////*/ - /*////////////////////////////////////////////////////////////////////////// // Load and handle @@ -153,10 +138,6 @@ public class CommentsFragment extends BaseListInfoFragment { @Override public void handleResult(@NonNull CommentsInfo result) { super.handleResult(result); - if(initialLoad){ - itemsList.smoothScrollToPosition(VideoDetailFragment.INITIAL_COMMENTS); - initialLoad = false; - } if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.REQUESTED_COMMENTS, NewPipe.getNameOfService(result.getServiceId()), result.getUrl(), 0); @@ -186,12 +167,7 @@ public class CommentsFragment extends BaseListInfoFragment { protected boolean onError(Throwable exception) { if (super.onError(exception)) return true; - int errorId = exception instanceof ExtractionException ? R.string.parsing_error : R.string.general_error; - onUnrecoverableError(exception, - UserAction.REQUESTED_COMMENTS, - NewPipe.getNameOfService(serviceId), - url, - errorId); + showSnackBarError(exception, UserAction.REQUESTED_COMMENTS, NewPipe.getNameOfService(serviceId), url, R.string.error_unable_to_load_comments); return true; } @@ -201,6 +177,11 @@ public class CommentsFragment extends BaseListInfoFragment { @Override public void setTitle(String title) { - super.setTitle(title); + return; + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + return; } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java new file mode 100644 index 000000000..08a6a3bc3 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java @@ -0,0 +1,150 @@ +package org.schabi.newpipe.fragments.list.videos; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.View; +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.ListExtractor; +import org.schabi.newpipe.extractor.ListInfo; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.comments.CommentsInfo; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.kiosk.KioskInfo; +import org.schabi.newpipe.extractor.stream.StreamInfo; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.fragments.list.BaseListInfoFragment; +import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.util.ExtractorHelper; +import org.schabi.newpipe.util.RelatedStreamInfo; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.disposables.CompositeDisposable; + +public class RelatedVideosFragment extends BaseListInfoFragment { + + private CompositeDisposable disposables = new CompositeDisposable(); + private RelatedStreamInfo relatedStreamInfo; + /*////////////////////////////////////////////////////////////////////////// + // Views + //////////////////////////////////////////////////////////////////////////*/ + + + + private boolean mIsVisibleToUser = false; + + public static RelatedVideosFragment getInstance(StreamInfo info) { + RelatedVideosFragment instance = new RelatedVideosFragment(); + instance.setInitialData(info); + return instance; + } + + /*////////////////////////////////////////////////////////////////////////// + // LifeCycle + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + mIsVisibleToUser = isVisibleToUser; + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_related_streams, container, false); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (disposables != null) disposables.clear(); + } + + @Override + protected Single loadMoreItemsLogic() { + return Single.fromCallable(() -> ListExtractor.InfoItemsPage.emptyPage()); + } + + @Override + protected Single loadResult(boolean forceLoad) { + return Single.fromCallable(() -> relatedStreamInfo); + } + + /*////////////////////////////////////////////////////////////////////////// + // Contract + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public void showLoading() { + super.showLoading(); + } + + @Override + public void handleResult(@NonNull RelatedStreamInfo result) { + super.handleResult(result); + + if (!result.getErrors().isEmpty()) { + showSnackBarError(result.getErrors(), UserAction.REQUESTED_STREAM, NewPipe.getNameOfService(result.getServiceId()), result.getUrl(), 0); + } + + if (disposables != null) disposables.clear(); + } + + @Override + public void handleNextItems(ListExtractor.InfoItemsPage result) { + super.handleNextItems(result); + + if (!result.getErrors().isEmpty()) { + showSnackBarError(result.getErrors(), + UserAction.REQUESTED_STREAM, + NewPipe.getNameOfService(serviceId), + "Get next page of: " + url, + R.string.general_error); + } + } + + /*////////////////////////////////////////////////////////////////////////// + // OnError + //////////////////////////////////////////////////////////////////////////*/ + + @Override + protected boolean onError(Throwable exception) { + if (super.onError(exception)) return true; + + showSnackBarError(exception, UserAction.REQUESTED_STREAM, NewPipe.getNameOfService(serviceId), url, R.string.general_error); + return true; + } + + /*////////////////////////////////////////////////////////////////////////// + // Utils + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public void setTitle(String title) { + return; + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + return; + } + + private void setInitialData(StreamInfo info) { + super.setInitialData(info.getServiceId(), info.getUrl(), info.getName()); + this.relatedStreamInfo = RelatedStreamInfo.getInfo(info); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/RelatedStreamInfo.java b/app/src/main/java/org/schabi/newpipe/util/RelatedStreamInfo.java new file mode 100644 index 000000000..c81100703 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/RelatedStreamInfo.java @@ -0,0 +1,23 @@ +package org.schabi.newpipe.util; + +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.ListInfo; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; +import org.schabi.newpipe.extractor.stream.StreamInfo; + +import java.util.Collections; + +public class RelatedStreamInfo extends ListInfo { + + + public RelatedStreamInfo(int serviceId, ListLinkHandler listUrlIdHandler, String name) { + super(serviceId, listUrlIdHandler, name); + } + + public static RelatedStreamInfo getInfo(StreamInfo info) { + ListLinkHandler handler = new ListLinkHandler(info.getOriginalUrl(), info.getUrl(), info.getId(), Collections.emptyList(), null); + RelatedStreamInfo relatedStreamInfo = new RelatedStreamInfo(info.getServiceId(), handler, info.getName()); + relatedStreamInfo.setRelatedItems(info.getRelatedStreams()); + return relatedStreamInfo; + } +} diff --git a/app/src/main/res/layout/fragment_comments.xml b/app/src/main/res/layout/fragment_comments.xml index 83e788070..57ca28688 100644 --- a/app/src/main/res/layout/fragment_comments.xml +++ b/app/src/main/res/layout/fragment_comments.xml @@ -25,7 +25,7 @@ android:id="@+id/empty_state_view" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_centerInParent="true" + android:layout_centerHorizontal="true" android:orientation="vertical" android:paddingTop="90dp" android:visibility="gone" diff --git a/app/src/main/res/layout/fragment_related_streams.xml b/app/src/main/res/layout/fragment_related_streams.xml new file mode 100644 index 000000000..36c9c1d31 --- /dev/null +++ b/app/src/main/res/layout/fragment_related_streams.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index 870043eb1..25eac35cf 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -7,101 +7,107 @@ android:layout_height="match_parent" android:focusableInTouchMode="true"> - + android:layout_height="match_parent"> - - + android:layout_height="wrap_content"> - - + app:layout_scrollFlags="scroll"> - + + android:background="@android:color/black" + android:clickable="true" + android:focusable="true" + android:foreground="?attr/selectableItemBackground" + app:layout_collapseMode="parallax"> - + - + - - + + + + + + + android:layout_height="wrap_content" + android:background="?android:windowBackground" + app:layout_scrollFlags="scroll"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + From b8865e925d498cb9c728c083e8719732c54afc6b Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Tue, 2 Oct 2018 20:56:14 +0530 Subject: [PATCH 027/207] added content setting to disable comments --- .../newpipe/fragments/detail/VideoDetailFragment.java | 11 +++++------ app/src/main/res/values/settings_keys.xml | 2 +- app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/content_settings.xml | 6 ++++++ 4 files changed, 14 insertions(+), 7 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 ded6be349..67f86a905 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 @@ -216,7 +216,7 @@ public class VideoDetailFragment .getBoolean(getString(R.string.show_next_video_key), true); showComments = PreferenceManager.getDefaultSharedPreferences(activity) - .getBoolean(getString(R.string.show_comments), true); + .getBoolean(getString(R.string.show_comments_key), true); PreferenceManager.getDefaultSharedPreferences(activity) .registerOnSharedPreferenceChangeListener(this); @@ -305,7 +305,7 @@ public class VideoDetailFragment updateFlags |= RESOLUTIONS_MENU_UPDATE_FLAG; } else if (key.equals(getString(R.string.show_play_with_kodi_key))) { updateFlags |= TOOLBAR_ITEMS_UPDATE_FLAG; - } else if (key.equals(R.string.show_comments)) { + } else if (key.equals(getString(R.string.show_comments_key))) { showComments = sharedPreferences.getBoolean(key, true); updateFlags |= COMMENTS_UPDATE_FLAG; } @@ -815,11 +815,14 @@ public class VideoDetailFragment } if(showRelatedStreams){ + //temp empty fragment. will be updated in handleResult pageAdapter.addFragment(new Fragment(), RELATED_TAB_TAG); } if(pageAdapter.getCount() < 2){ tabLayout.setVisibility(View.GONE); + }else{ + tabLayout.setVisibility(View.VISIBLE); } } @@ -1247,8 +1250,4 @@ public class VideoDetailFragment showError(getString(R.string.blocked_by_gema), false, R.drawable.gruese_die_gema); } - - public void onCommentsError(Throwable exception) { - showSnackBarError(exception, UserAction.REQUESTED_COMMENTS, NewPipe.getNameOfService(serviceId), url, R.string.error_unable_to_load_comments); - } } \ No newline at end of file diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index b110a6aa3..1a56e2d40 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -135,7 +135,7 @@ show_search_suggestions show_play_with_kodi show_next_video - show_comments + show_comments show_hold_to_append en GB diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3dbbc29cf..bd00ddce1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -76,6 +76,8 @@ Inexact seek allows the player to seek to positions faster with reduced precision Load thumbnails Disable to stop all thumbnails from loading and save on data and memory usage. Changing this will clear both in-memory and on-disk image cache. + Show comments + Disable to stop showing comments Image cache wiped Wipe cached metadata Remove all cached webpage data diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml index fcf42b130..d641a1574 100644 --- a/app/src/main/res/xml/content_settings.xml +++ b/app/src/main/res/xml/content_settings.xml @@ -43,6 +43,12 @@ android:title="@string/download_thumbnail_title" android:summary="@string/download_thumbnail_summary"/> + + Date: Tue, 2 Oct 2018 21:30:11 +0530 Subject: [PATCH 028/207] update notify on dataset change --- .../newpipe/fragments/detail/TabAdaptor.java | 23 +++++++++++++------ .../fragments/detail/VideoDetailFragment.java | 3 +++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java index c091f45b2..2dd7071be 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java @@ -44,27 +44,20 @@ public class TabAdaptor extends FragmentPagerAdapter { public void addFragment(Fragment fragment, String title) { mFragmentList.add(fragment); mFragmentTitleList.add(title); - notifyDataSetChanged(); } public void clearAllItems() { mFragmentList.clear(); mFragmentTitleList.clear(); - notifyDataSetChanged(); } public void removeItem(int position){ mFragmentList.remove(position == 0 ? 0 : position - 1); mFragmentTitleList.remove(position == 0 ? 0 : position - 1); - notifyDataSetChanged(); } public void updateItem(int position, Fragment fragment){ mFragmentList.set(position, fragment); - // shift the ID returned by getItemId outside the range of all previous fragments - // https://stackoverflow.com/questions/10396321/remove-fragment-page-from-viewpager-in-android - baseId += getCount() + 1; - notifyDataSetChanged(); } public void updateItem(String title, Fragment fragment){ @@ -79,4 +72,20 @@ public class TabAdaptor extends FragmentPagerAdapter { if (mFragmentList.contains(object)) return mFragmentList.indexOf(object); else return POSITION_NONE; } + + /** + * Notify that the position of a fragment has been changed. + * Create a new ID for each position to force recreation of the fragment + * @param n number of items which have been changed + */ + public void notifyChangeInPosition(int n) { + // shift the ID returned by getItemId outside the range of all previous fragments + // https://stackoverflow.com/questions/10396321/remove-fragment-page-from-viewpager-in-android + baseId += getCount() + n; + } + + public void notifyDataSetUpdate(){ + notifyChangeInPosition(1); + notifyDataSetChanged(); + } } 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 67f86a905..76047b725 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 @@ -819,6 +819,8 @@ public class VideoDetailFragment pageAdapter.addFragment(new Fragment(), RELATED_TAB_TAG); } + pageAdapter.notifyDataSetUpdate(); + if(pageAdapter.getCount() < 2){ tabLayout.setVisibility(View.GONE); }else{ @@ -1083,6 +1085,7 @@ public class VideoDetailFragment if(showRelatedStreams){ pageAdapter.updateItem(RELATED_TAB_TAG, RelatedVideosFragment.getInstance(currentInfo)); + pageAdapter.notifyDataSetUpdate(); } pushToStack(serviceId, url, name); From e2341363d4b35e28181aa09f9f3d2993004b659f Mon Sep 17 00:00:00 2001 From: krtkush Date: Sun, 14 Oct 2018 19:16:28 +0530 Subject: [PATCH 029/207] Added check for SHA1 key. --- .../newpipe/CheckForNewAppVersionTask.java | 91 +++++++++++++++++-- 1 file changed, 82 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index 9694850d7..fd94980c9 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -4,6 +4,9 @@ import android.app.Application; import android.app.PendingIntent; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.Signature; import android.net.Uri; import android.os.AsyncTask; import android.preference.PreferenceManager; @@ -15,10 +18,18 @@ import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateEncodingException; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; /** * AsyncTask to check if there is a newer version of the NewPipe github apk available or not. @@ -29,6 +40,7 @@ public class CheckForNewAppVersionTask extends AsyncTask { private Application app = App.getContext(); + private String GITHUB_APK_SHA1 = "B0:2E:90:7C:1C:D6:FC:57:C3:35:F0:88:D0:8F:50:5F:94:E4:D2:15"; private String newPipeApiUrl = "https://newpipe.schabi.org/api/data.json"; private int timeoutPeriod = 10000; @@ -39,23 +51,18 @@ public class CheckForNewAppVersionTask extends AsyncTask { mPrefs = PreferenceManager.getDefaultSharedPreferences(app); - // Check if user has enabled/ disabled update checking. - if (mPrefs.getBoolean(app.getString(R.string.update_app_key), true)) { - - // Go ahead with further checks. - Log.i("pref---", "true"); - } else { - Log.i("pref---", "false"); + // Check if user has enabled/ disabled update checking + // and if the current apk is a github one or not. + if (!mPrefs.getBoolean(app.getString(R.string.update_app_key), true) + || !getCertificateSHA1Fingerprint().equals(GITHUB_APK_SHA1)) { this.cancel(true); } - } @Override protected String doInBackground(Void... voids) { // Make a network request to get latest NewPipe data. - String response; HttpURLConnection connection = null; @@ -167,4 +174,70 @@ public class CheckForNewAppVersionTask extends AsyncTask { notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()); } } + + /** + * Method to get the apk's SHA1 key. + * https://stackoverflow.com/questions/9293019/get-certificate-fingerprint-from-android-app#22506133 + */ + private String getCertificateSHA1Fingerprint() { + + PackageManager pm = app.getPackageManager(); + String packageName = app.getPackageName(); + int flags = PackageManager.GET_SIGNATURES; + PackageInfo packageInfo = null; + + try { + packageInfo = pm.getPackageInfo(packageName, flags); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + + Signature[] signatures = packageInfo.signatures; + byte[] cert = signatures[0].toByteArray(); + InputStream input = new ByteArrayInputStream(cert); + CertificateFactory cf = null; + + try { + cf = CertificateFactory.getInstance("X509"); + } catch (CertificateException e) { + e.printStackTrace(); + } + + X509Certificate c = null; + + try { + c = (X509Certificate) cf.generateCertificate(input); + } catch (CertificateException e) { + e.printStackTrace(); + } + + String hexString = null; + + try { + MessageDigest md = MessageDigest.getInstance("SHA1"); + byte[] publicKey = md.digest(c.getEncoded()); + hexString = byte2HexFormatted(publicKey); + } catch (NoSuchAlgorithmException e1) { + e1.printStackTrace(); + } catch (CertificateEncodingException e) { + e.printStackTrace(); + } + + return hexString; + } + + private static String byte2HexFormatted(byte[] arr) { + + StringBuilder str = new StringBuilder(arr.length * 2); + + for (int i = 0; i < arr.length; i++) { + String h = Integer.toHexString(arr[i]); + int l = h.length(); + if (l == 1) h = "0" + h; + if (l > 2) h = h.substring(l - 2, l); + str.append(h.toUpperCase()); + if (i < (arr.length - 1)) str.append(':'); + } + return str.toString(); + } } From 9fc38b5bb8a8fddb085a97220f7332c9df15ee21 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Wed, 17 Oct 2018 00:23:02 +0530 Subject: [PATCH 030/207] improved fling behavior, added tab indicator dots, added next video in related videos --- .../support/design/widget/FlingBehavior.java | 143 ++++++++++++++++++ .../newpipe/fragments/detail/TabAdaptor.java | 8 - .../fragments/detail/VideoDetailFragment.java | 25 --- .../fragments/list/BaseListFragment.java | 2 +- .../list/videos/RelatedVideosFragment.java | 68 +++++++-- .../newpipe/util/RelatedStreamInfo.java | 22 ++- app/src/main/res/drawable/default_dot.xml | 12 ++ app/src/main/res/drawable/selected_dot.xml | 12 ++ app/src/main/res/drawable/tab_selector.xml | 8 + app/src/main/res/layout/fragment_comments.xml | 3 +- .../res/layout/fragment_related_streams.xml | 3 +- .../main/res/layout/fragment_video_detail.xml | 30 ++-- .../res/layout/related_streams_header.xml | 33 ++++ app/src/main/res/values/strings.xml | 3 +- 14 files changed, 313 insertions(+), 59 deletions(-) create mode 100644 app/src/main/java/android/support/design/widget/FlingBehavior.java create mode 100644 app/src/main/res/drawable/default_dot.xml create mode 100644 app/src/main/res/drawable/selected_dot.xml create mode 100644 app/src/main/res/drawable/tab_selector.xml create mode 100644 app/src/main/res/layout/related_streams_header.xml diff --git a/app/src/main/java/android/support/design/widget/FlingBehavior.java b/app/src/main/java/android/support/design/widget/FlingBehavior.java new file mode 100644 index 000000000..217e3ae3a --- /dev/null +++ b/app/src/main/java/android/support/design/widget/FlingBehavior.java @@ -0,0 +1,143 @@ +package android.support.design.widget; + +import android.animation.ValueAnimator; +import android.content.Context; +import android.os.Parcelable; +import android.support.annotation.NonNull; +import android.util.AttributeSet; +import android.view.View; + +// check this https://github.com/ToDou/appbarlayout-spring-behavior/blob/master/appbarspring/src/main/java/android/support/design/widget/AppBarFlingFixBehavior.java +public final class FlingBehavior extends AppBarLayout.Behavior { + + private ValueAnimator mOffsetAnimator; + private static final int MAX_OFFSET_ANIMATION_DURATION = 600; // ms + + public FlingBehavior() { + } + + public FlingBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean onStartNestedScroll(CoordinatorLayout parent, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes, int type) { + return super.onStartNestedScroll(parent, child, directTargetChild, target, nestedScrollAxes, type); + } + + @Override + public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed, int type) { + if (dy != 0) { + int val = child.getBottom(); + if (val != 0) { + int min, max; + if (dy < 0) { + // We're scrolling down + } else { + // We're scrolling up + min = -child.getUpNestedPreScrollRange(); + max = 0; + consumed[1] = scroll(coordinatorLayout, child, dy, min, max); + } + } + } + } + + @Override + public void onNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type) { + super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type); + } + + @Override + public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout abl, View target, int type) { + super.onStopNestedScroll(coordinatorLayout, abl, target, type); + } + + @Override + public boolean onMeasureChild(CoordinatorLayout parent, AppBarLayout child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) { + return super.onMeasureChild(parent, child, parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed); + } + + @Override + public Parcelable onSaveInstanceState(CoordinatorLayout parent, AppBarLayout abl) { + return super.onSaveInstanceState(parent, abl); + } + + @Override + public void onRestoreInstanceState(CoordinatorLayout parent, AppBarLayout appBarLayout, Parcelable state) { + super.onRestoreInstanceState(parent, appBarLayout, state); + } + + @Override + public boolean onNestedPreFling(@NonNull CoordinatorLayout coordinatorLayout, @NonNull AppBarLayout child, @NonNull View target, float velocityX, float velocityY) { + + if (velocityY != 0) { + if (velocityY < 0) { + // We're flinging down + int val = child.getBottom(); + if (val != 0) { + final int targetScroll = + +child.getDownNestedPreScrollRange(); + animateOffsetTo(coordinatorLayout, child, targetScroll, velocityY); + } + + } else { + // We're flinging up + int val = child.getBottom(); + if (val != 0) { + final int targetScroll = -child.getUpNestedPreScrollRange(); + if (getTopBottomOffsetForScrollingSibling() > targetScroll) { + animateOffsetTo(coordinatorLayout, child, targetScroll, velocityY); + } + } + } + } + + return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY); + } + + private void animateOffsetTo(final CoordinatorLayout coordinatorLayout, + final AppBarLayout child, final int offset, float velocity) { + final int distance = Math.abs(getTopBottomOffsetForScrollingSibling() - offset); + + final int duration; + velocity = Math.abs(velocity); + if (velocity > 0) { + duration = 3 * Math.round(1000 * (distance / velocity)); + } else { + final float distanceRatio = (float) distance / child.getHeight(); + duration = (int) ((distanceRatio + 1) * 150); + } + + animateOffsetWithDuration(coordinatorLayout, child, offset, duration); + } + + private void animateOffsetWithDuration(final CoordinatorLayout coordinatorLayout, + final AppBarLayout child, final int offset, final int duration) { + final int currentOffset = getTopBottomOffsetForScrollingSibling(); + if (currentOffset == offset) { + if (mOffsetAnimator != null && mOffsetAnimator.isRunning()) { + mOffsetAnimator.cancel(); + } + return; + } + + if (mOffsetAnimator == null) { + mOffsetAnimator = new ValueAnimator(); + mOffsetAnimator.setInterpolator(AnimationUtils.DECELERATE_INTERPOLATOR); + mOffsetAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animator) { + setHeaderTopBottomOffset(coordinatorLayout, child, + (Integer) animator.getAnimatedValue()); + } + }); + } else { + mOffsetAnimator.cancel(); + } + + mOffsetAnimator.setDuration(Math.min(duration, MAX_OFFSET_ANIMATION_DURATION)); + mOffsetAnimator.setIntValues(currentOffset, offset); + mOffsetAnimator.start(); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java index 2dd7071be..3ed247e50 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java @@ -1,10 +1,8 @@ package org.schabi.newpipe.fragments.detail; -import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.PagerAdapter; import java.util.ArrayList; import java.util.List; @@ -29,12 +27,6 @@ public class TabAdaptor extends FragmentPagerAdapter { return mFragmentList.size(); } - @Nullable - @Override - public CharSequence getPageTitle(int position) { - return mFragmentTitleList.get(position); - } - @Override public long getItemId(int position) { // give an ID different from position when position has been changed 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 76047b725..d3f602ebd 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 @@ -29,7 +29,6 @@ import android.text.method.LinkMovementMethod; import android.text.util.Linkify; import android.util.DisplayMetrics; import android.util.Log; -import android.util.TypedValue; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -39,7 +38,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.FrameLayout; -import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; @@ -56,8 +54,6 @@ import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.download.DownloadDialog; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.StreamingService; -import org.schabi.newpipe.extractor.comments.CommentsInfo; import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; @@ -72,7 +68,6 @@ import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.fragments.list.comments.CommentsFragment; import org.schabi.newpipe.fragments.list.videos.RelatedVideosFragment; -import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.info_list.InfoItemDialog; import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; import org.schabi.newpipe.local.history.HistoryRecordManager; @@ -91,11 +86,9 @@ import org.schabi.newpipe.util.InfoCache; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; -import org.schabi.newpipe.util.OnClickGesture; import org.schabi.newpipe.util.PermissionHelper; import org.schabi.newpipe.util.StreamItemAdapter; import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; -import org.schabi.newpipe.util.ThemeHelper; import java.io.Serializable; import java.util.Collection; @@ -964,24 +957,6 @@ public class VideoDetailFragment })); } - private View getSeparatorView() { - View separator = new View(activity); - LinearLayout.LayoutParams params = - new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1); - int m8 = (int) TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()); - int m5 = (int) TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics()); - params.setMargins(m8, m5, m8, m5); - separator.setLayoutParams(params); - - TypedValue typedValue = new TypedValue(); - activity.getTheme().resolveAttribute(R.attr.separator_color, typedValue, true); - separator.setBackgroundColor(typedValue.data); - - return separator; - } - private void setHeightThumbnail() { final DisplayMetrics metrics = getResources().getDisplayMetrics(); boolean isPortrait = metrics.heightPixels > metrics.widthPixels; diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index cd557c931..672d8c2be 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -22,9 +22,9 @@ import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; -import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; import org.schabi.newpipe.info_list.InfoItemDialog; import org.schabi.newpipe.info_list.InfoListAdapter; +import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.util.NavigationHelper; diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java index 08a6a3bc3..44c7c6787 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java @@ -1,7 +1,9 @@ package org.schabi.newpipe.fragments.list.videos; import android.content.Context; +import android.content.SharedPreferences; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.LayoutInflater; @@ -9,34 +11,31 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.CompoundButton; +import android.widget.Switch; import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; -import org.schabi.newpipe.extractor.ListInfo; import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.comments.CommentsInfo; -import org.schabi.newpipe.extractor.exceptions.ExtractionException; -import org.schabi.newpipe.extractor.kiosk.KioskInfo; import org.schabi.newpipe.extractor.stream.StreamInfo; -import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.report.UserAction; -import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.RelatedStreamInfo; -import java.util.List; +import java.io.Serializable; import io.reactivex.Single; import io.reactivex.disposables.CompositeDisposable; -public class RelatedVideosFragment extends BaseListInfoFragment { +public class RelatedVideosFragment extends BaseListInfoFragment implements SharedPreferences.OnSharedPreferenceChangeListener{ private CompositeDisposable disposables = new CompositeDisposable(); private RelatedStreamInfo relatedStreamInfo; /*////////////////////////////////////////////////////////////////////////// // Views //////////////////////////////////////////////////////////////////////////*/ + private View headerRootLayout; + private Switch aSwitch; @@ -74,6 +73,28 @@ public class RelatedVideosFragment extends BaseListInfoFragment loadMoreItemsLogic() { return Single.fromCallable(() -> ListExtractor.InfoItemsPage.emptyPage()); @@ -145,6 +166,33 @@ public class RelatedVideosFragment extends BaseListInfoFragment { + private StreamInfoItem nextStream; public RelatedStreamInfo(int serviceId, ListLinkHandler listUrlIdHandler, String name) { super(serviceId, listUrlIdHandler, name); @@ -17,7 +21,21 @@ public class RelatedStreamInfo extends ListInfo { public static RelatedStreamInfo getInfo(StreamInfo info) { ListLinkHandler handler = new ListLinkHandler(info.getOriginalUrl(), info.getUrl(), info.getId(), Collections.emptyList(), null); RelatedStreamInfo relatedStreamInfo = new RelatedStreamInfo(info.getServiceId(), handler, info.getName()); - relatedStreamInfo.setRelatedItems(info.getRelatedStreams()); - return relatedStreamInfo; + List streams = new ArrayList<>(); + if(info.getNextVideo() != null){ + streams.add(info.getNextVideo()); + } + streams.addAll(info.getRelatedStreams()); + relatedStreamInfo.setRelatedItems(streams); + relatedStreamInfo.setNextStream(info.getNextVideo()); + return relatedStreamInfo; + } + + public StreamInfoItem getNextStream() { + return nextStream; + } + + public void setNextStream(StreamInfoItem nextStream) { + this.nextStream = nextStream; } } diff --git a/app/src/main/res/drawable/default_dot.xml b/app/src/main/res/drawable/default_dot.xml new file mode 100644 index 000000000..3380dca3b --- /dev/null +++ b/app/src/main/res/drawable/default_dot.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selected_dot.xml b/app/src/main/res/drawable/selected_dot.xml new file mode 100644 index 000000000..017e99d43 --- /dev/null +++ b/app/src/main/res/drawable/selected_dot.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_selector.xml b/app/src/main/res/drawable/tab_selector.xml new file mode 100644 index 000000000..b7307674b --- /dev/null +++ b/app/src/main/res/drawable/tab_selector.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_comments.xml b/app/src/main/res/layout/fragment_comments.xml index 57ca28688..9ace63d4d 100644 --- a/app/src/main/res/layout/fragment_comments.xml +++ b/app/src/main/res/layout/fragment_comments.xml @@ -65,6 +65,7 @@ android:layout_width="match_parent" android:layout_height="4dp" android:background="?attr/toolbar_shadow_drawable" - android:layout_alignParentTop="true"/> + android:layout_alignParentTop="true" + android:visibility="gone"/> diff --git a/app/src/main/res/layout/fragment_related_streams.xml b/app/src/main/res/layout/fragment_related_streams.xml index 36c9c1d31..c12630392 100644 --- a/app/src/main/res/layout/fragment_related_streams.xml +++ b/app/src/main/res/layout/fragment_related_streams.xml @@ -65,6 +65,7 @@ android:layout_width="match_parent" android:layout_height="4dp" android:background="?attr/toolbar_shadow_drawable" - android:layout_alignParentTop="true"/> + android:layout_alignParentTop="true" + android:visibility="gone"/> diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index 25eac35cf..906246bd0 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -10,12 +10,16 @@ + android:layout_height="match_parent" + android:fitsSystemWindows="true"> + android:layout_height="wrap_content" + android:fitsSystemWindows="true" + app:elevation="0dp" + app:layout_behavior="android.support.design.widget.FlingBehavior"> - - - - + + + + + + diff --git a/app/src/main/res/layout/related_streams_header.xml b/app/src/main/res/layout/related_streams_header.xml new file mode 100644 index 000000000..5be7c928d --- /dev/null +++ b/app/src/main/res/layout/related_streams_header.xml @@ -0,0 +1,33 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bd00ddce1..354778e6d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -95,7 +95,8 @@ Resume on focus gain Continue playing after interruptions (e.g. phone calls) Download - Next video + Up next + Autoplay Show \'next\' and \'similar\' videos Show \"hold to append\" tip Show tip when background or popup button is pressed on video details page From 8ef702fa075529feee099e3f496ea8aea4f67520 Mon Sep 17 00:00:00 2001 From: krtkush Date: Thu, 18 Oct 2018 22:59:33 +0530 Subject: [PATCH 031/207] Removed updates options from settings in case of non github apk. --- .../gen/org/schabi/newpipe/BuildConfig.java | 8 ++++++++ .../debug/gen/org/schabi/newpipe/Manifest.java | 7 +++++++ app/src/debug/gen/org/schabi/newpipe/R.java | 7 +++++++ .../gen/org/schabi/newpipe/BuildConfig.java | 8 ++++++++ .../main/gen/org/schabi/newpipe/Manifest.java | 7 +++++++ app/src/main/gen/org/schabi/newpipe/R.java | 7 +++++++ .../newpipe/CheckForNewAppVersionTask.java | 18 +++++++++++------- .../newpipe/settings/MainSettingsFragment.java | 8 ++++++++ .../settings/UpdateSettingsFragment.java | 1 + app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 2 +- app/src/main/res/xml/main_settings.xml | 3 ++- 12 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 app/src/debug/gen/org/schabi/newpipe/BuildConfig.java create mode 100644 app/src/debug/gen/org/schabi/newpipe/Manifest.java create mode 100644 app/src/debug/gen/org/schabi/newpipe/R.java create mode 100644 app/src/main/gen/org/schabi/newpipe/BuildConfig.java create mode 100644 app/src/main/gen/org/schabi/newpipe/Manifest.java create mode 100644 app/src/main/gen/org/schabi/newpipe/R.java diff --git a/app/src/debug/gen/org/schabi/newpipe/BuildConfig.java b/app/src/debug/gen/org/schabi/newpipe/BuildConfig.java new file mode 100644 index 000000000..575afb9cb --- /dev/null +++ b/app/src/debug/gen/org/schabi/newpipe/BuildConfig.java @@ -0,0 +1,8 @@ +/*___Generated_by_IDEA___*/ + +package org.schabi.newpipe; + +/* This stub is only used by the IDE. It is NOT the BuildConfig class actually packed into the APK */ +public final class BuildConfig { + public final static boolean DEBUG = Boolean.parseBoolean(null); +} \ No newline at end of file diff --git a/app/src/debug/gen/org/schabi/newpipe/Manifest.java b/app/src/debug/gen/org/schabi/newpipe/Manifest.java new file mode 100644 index 000000000..10e45a45a --- /dev/null +++ b/app/src/debug/gen/org/schabi/newpipe/Manifest.java @@ -0,0 +1,7 @@ +/*___Generated_by_IDEA___*/ + +package org.schabi.newpipe; + +/* This stub is only used by the IDE. It is NOT the Manifest class actually packed into the APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/app/src/debug/gen/org/schabi/newpipe/R.java b/app/src/debug/gen/org/schabi/newpipe/R.java new file mode 100644 index 000000000..088bdfb0d --- /dev/null +++ b/app/src/debug/gen/org/schabi/newpipe/R.java @@ -0,0 +1,7 @@ +/*___Generated_by_IDEA___*/ + +package org.schabi.newpipe; + +/* This stub is only used by the IDE. It is NOT the R class actually packed into the APK */ +public final class R { +} \ No newline at end of file diff --git a/app/src/main/gen/org/schabi/newpipe/BuildConfig.java b/app/src/main/gen/org/schabi/newpipe/BuildConfig.java new file mode 100644 index 000000000..575afb9cb --- /dev/null +++ b/app/src/main/gen/org/schabi/newpipe/BuildConfig.java @@ -0,0 +1,8 @@ +/*___Generated_by_IDEA___*/ + +package org.schabi.newpipe; + +/* This stub is only used by the IDE. It is NOT the BuildConfig class actually packed into the APK */ +public final class BuildConfig { + public final static boolean DEBUG = Boolean.parseBoolean(null); +} \ No newline at end of file diff --git a/app/src/main/gen/org/schabi/newpipe/Manifest.java b/app/src/main/gen/org/schabi/newpipe/Manifest.java new file mode 100644 index 000000000..10e45a45a --- /dev/null +++ b/app/src/main/gen/org/schabi/newpipe/Manifest.java @@ -0,0 +1,7 @@ +/*___Generated_by_IDEA___*/ + +package org.schabi.newpipe; + +/* This stub is only used by the IDE. It is NOT the Manifest class actually packed into the APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/app/src/main/gen/org/schabi/newpipe/R.java b/app/src/main/gen/org/schabi/newpipe/R.java new file mode 100644 index 000000000..088bdfb0d --- /dev/null +++ b/app/src/main/gen/org/schabi/newpipe/R.java @@ -0,0 +1,7 @@ +/*___Generated_by_IDEA___*/ + +package org.schabi.newpipe; + +/* This stub is only used by the IDE. It is NOT the R class actually packed into the APK */ +public final class R { +} \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index fd94980c9..9ab0f5d36 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -38,11 +38,10 @@ import java.security.cert.X509Certificate; */ public class CheckForNewAppVersionTask extends AsyncTask { - private Application app = App.getContext(); - - private String GITHUB_APK_SHA1 = "B0:2E:90:7C:1C:D6:FC:57:C3:35:F0:88:D0:8F:50:5F:94:E4:D2:15"; - private String newPipeApiUrl = "https://newpipe.schabi.org/api/data.json"; - private int timeoutPeriod = 10000; + private static final Application app = App.getContext(); + private static final String GITHUB_APK_SHA1 = "B0:2E:90:7C:1C:D6:FC:57:C3:35:F0:88:D0:8F:50:5F:94:E4:D2:15"; + private static final String newPipeApiUrl = "https://newpipe.schabi.org/api/data.json"; + private static final int timeoutPeriod = 10000; private SharedPreferences mPrefs; @@ -54,7 +53,7 @@ public class CheckForNewAppVersionTask extends AsyncTask { // Check if user has enabled/ disabled update checking // and if the current apk is a github one or not. if (!mPrefs.getBoolean(app.getString(R.string.update_app_key), true) - || !getCertificateSHA1Fingerprint().equals(GITHUB_APK_SHA1)) { + || !isGithubApk()) { this.cancel(true); } } @@ -179,7 +178,7 @@ public class CheckForNewAppVersionTask extends AsyncTask { * Method to get the apk's SHA1 key. * https://stackoverflow.com/questions/9293019/get-certificate-fingerprint-from-android-app#22506133 */ - private String getCertificateSHA1Fingerprint() { + private static String getCertificateSHA1Fingerprint() { PackageManager pm = app.getPackageManager(); String packageName = app.getPackageName(); @@ -240,4 +239,9 @@ public class CheckForNewAppVersionTask extends AsyncTask { } return str.toString(); } + + public static boolean isGithubApk() { + + return getCertificateSHA1Fingerprint().equals(GITHUB_APK_SHA1); + } } 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 5e07e2b12..43270926e 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.support.v7.preference.Preference; import org.schabi.newpipe.BuildConfig; +import org.schabi.newpipe.CheckForNewAppVersionTask; import org.schabi.newpipe.R; public class MainSettingsFragment extends BasePreferenceFragment { @@ -13,6 +14,13 @@ public class MainSettingsFragment extends BasePreferenceFragment { public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.main_settings); + if (!CheckForNewAppVersionTask.isGithubApk()) { + final Preference update = findPreference(getString(R.string.update_pref_screen_key)); + getPreferenceScreen().removePreference(update); + + defaultPreferences.edit().putBoolean(getString(R.string.update_app_key), false).apply(); + } + if (!DEBUG) { final Preference debug = findPreference(getString(R.string.debug_pref_screen_key)); getPreferenceScreen().removePreference(debug); 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 f6aab7cda..157f52a0e 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.preference.Preference; +import org.schabi.newpipe.CheckForNewAppVersionTask; import org.schabi.newpipe.R; public class UpdateSettingsFragment extends BasePreferenceFragment { diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index e282a3bf5..9c6ae92b0 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -205,6 +205,7 @@ update_app_key + update_pref_screen_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f8c7932a7..f7e461829 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -529,7 +529,7 @@ Switch View - NewPipe Update Available + NewPipe Update Available! Tap to download diff --git a/app/src/main/res/xml/main_settings.xml b/app/src/main/res/xml/main_settings.xml index 3773460d6..74450f77b 100644 --- a/app/src/main/res/xml/main_settings.xml +++ b/app/src/main/res/xml/main_settings.xml @@ -32,7 +32,8 @@ + android:title="@string/settings_category_updates_title" + android:key="update_pref_screen_key"/> Date: Thu, 18 Oct 2018 23:02:19 +0530 Subject: [PATCH 032/207] Delete BuildConfig.java --- app/src/debug/gen/org/schabi/newpipe/BuildConfig.java | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 app/src/debug/gen/org/schabi/newpipe/BuildConfig.java diff --git a/app/src/debug/gen/org/schabi/newpipe/BuildConfig.java b/app/src/debug/gen/org/schabi/newpipe/BuildConfig.java deleted file mode 100644 index 575afb9cb..000000000 --- a/app/src/debug/gen/org/schabi/newpipe/BuildConfig.java +++ /dev/null @@ -1,8 +0,0 @@ -/*___Generated_by_IDEA___*/ - -package org.schabi.newpipe; - -/* This stub is only used by the IDE. It is NOT the BuildConfig class actually packed into the APK */ -public final class BuildConfig { - public final static boolean DEBUG = Boolean.parseBoolean(null); -} \ No newline at end of file From 2d5bc3ada85d2fb0151bfe32b6a6fef9d08c0df8 Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Thu, 18 Oct 2018 23:02:30 +0530 Subject: [PATCH 033/207] Delete Manifest.java --- app/src/debug/gen/org/schabi/newpipe/Manifest.java | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 app/src/debug/gen/org/schabi/newpipe/Manifest.java diff --git a/app/src/debug/gen/org/schabi/newpipe/Manifest.java b/app/src/debug/gen/org/schabi/newpipe/Manifest.java deleted file mode 100644 index 10e45a45a..000000000 --- a/app/src/debug/gen/org/schabi/newpipe/Manifest.java +++ /dev/null @@ -1,7 +0,0 @@ -/*___Generated_by_IDEA___*/ - -package org.schabi.newpipe; - -/* This stub is only used by the IDE. It is NOT the Manifest class actually packed into the APK */ -public final class Manifest { -} \ No newline at end of file From d1a9033525250071a6263f6c4caf3f55ebb285cc Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Thu, 18 Oct 2018 23:02:38 +0530 Subject: [PATCH 034/207] Delete R.java --- app/src/debug/gen/org/schabi/newpipe/R.java | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 app/src/debug/gen/org/schabi/newpipe/R.java diff --git a/app/src/debug/gen/org/schabi/newpipe/R.java b/app/src/debug/gen/org/schabi/newpipe/R.java deleted file mode 100644 index 088bdfb0d..000000000 --- a/app/src/debug/gen/org/schabi/newpipe/R.java +++ /dev/null @@ -1,7 +0,0 @@ -/*___Generated_by_IDEA___*/ - -package org.schabi.newpipe; - -/* This stub is only used by the IDE. It is NOT the R class actually packed into the APK */ -public final class R { -} \ No newline at end of file From ec28e972bbf756c98fc95cf1080a3be465d68bcb Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Thu, 18 Oct 2018 23:02:59 +0530 Subject: [PATCH 035/207] Delete BuildConfig.java --- app/src/main/gen/org/schabi/newpipe/BuildConfig.java | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 app/src/main/gen/org/schabi/newpipe/BuildConfig.java diff --git a/app/src/main/gen/org/schabi/newpipe/BuildConfig.java b/app/src/main/gen/org/schabi/newpipe/BuildConfig.java deleted file mode 100644 index 575afb9cb..000000000 --- a/app/src/main/gen/org/schabi/newpipe/BuildConfig.java +++ /dev/null @@ -1,8 +0,0 @@ -/*___Generated_by_IDEA___*/ - -package org.schabi.newpipe; - -/* This stub is only used by the IDE. It is NOT the BuildConfig class actually packed into the APK */ -public final class BuildConfig { - public final static boolean DEBUG = Boolean.parseBoolean(null); -} \ No newline at end of file From 6ef25eb861d0dcf9cf659c29e041b7ec2dd7a05a Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Thu, 18 Oct 2018 23:03:21 +0530 Subject: [PATCH 036/207] Delete Manifest.java --- app/src/main/gen/org/schabi/newpipe/Manifest.java | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 app/src/main/gen/org/schabi/newpipe/Manifest.java diff --git a/app/src/main/gen/org/schabi/newpipe/Manifest.java b/app/src/main/gen/org/schabi/newpipe/Manifest.java deleted file mode 100644 index 10e45a45a..000000000 --- a/app/src/main/gen/org/schabi/newpipe/Manifest.java +++ /dev/null @@ -1,7 +0,0 @@ -/*___Generated_by_IDEA___*/ - -package org.schabi.newpipe; - -/* This stub is only used by the IDE. It is NOT the Manifest class actually packed into the APK */ -public final class Manifest { -} \ No newline at end of file From 3c6d27b5044520d4877eaef028d6a7fe729a021e Mon Sep 17 00:00:00 2001 From: Kartikey Kushwaha Date: Thu, 18 Oct 2018 23:04:07 +0530 Subject: [PATCH 037/207] Delete R.java --- app/src/main/gen/org/schabi/newpipe/R.java | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 app/src/main/gen/org/schabi/newpipe/R.java diff --git a/app/src/main/gen/org/schabi/newpipe/R.java b/app/src/main/gen/org/schabi/newpipe/R.java deleted file mode 100644 index 088bdfb0d..000000000 --- a/app/src/main/gen/org/schabi/newpipe/R.java +++ /dev/null @@ -1,7 +0,0 @@ -/*___Generated_by_IDEA___*/ - -package org.schabi.newpipe; - -/* This stub is only used by the IDE. It is NOT the R class actually packed into the APK */ -public final class R { -} \ No newline at end of file From fa5896ee5bfda7a47d04c856767f14e02a0677ba Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Fri, 19 Oct 2018 18:44:03 +0530 Subject: [PATCH 038/207] fixed screen rotation for viewpager --- .../newpipe/fragments/detail/TabAdaptor.java | 28 ++++++------------- .../list/videos/RelatedVideosFragment.java | 2 -- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java index 3ed247e50..27cc3ec8a 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdaptor.java @@ -3,6 +3,7 @@ package org.schabi.newpipe.fragments.detail; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; +import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; @@ -11,10 +12,11 @@ public class TabAdaptor extends FragmentPagerAdapter { private final List mFragmentList = new ArrayList<>(); private final List mFragmentTitleList = new ArrayList<>(); - int baseId = 0; + private final FragmentManager fragmentManager; public TabAdaptor(FragmentManager fm) { super(fm); + this.fragmentManager = fm; } @Override @@ -27,12 +29,6 @@ public class TabAdaptor extends FragmentPagerAdapter { return mFragmentList.size(); } - @Override - public long getItemId(int position) { - // give an ID different from position when position has been changed - return baseId + position; - } - public void addFragment(Fragment fragment, String title) { mFragmentList.add(fragment); mFragmentTitleList.add(title); @@ -65,19 +61,13 @@ public class TabAdaptor extends FragmentPagerAdapter { else return POSITION_NONE; } - /** - * Notify that the position of a fragment has been changed. - * Create a new ID for each position to force recreation of the fragment - * @param n number of items which have been changed - */ - public void notifyChangeInPosition(int n) { - // shift the ID returned by getItemId outside the range of all previous fragments - // https://stackoverflow.com/questions/10396321/remove-fragment-page-from-viewpager-in-android - baseId += getCount() + n; - } - public void notifyDataSetUpdate(){ - notifyChangeInPosition(1); notifyDataSetChanged(); } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + fragmentManager.beginTransaction().remove((Fragment) object).commitNowAllowingStateLoss(); + } + } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java index 44c7c6787..694731c69 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java @@ -37,8 +37,6 @@ public class RelatedVideosFragment extends BaseListInfoFragment Date: Mon, 22 Oct 2018 23:08:46 +0530 Subject: [PATCH 039/207] Code review changes. Co-Authored-By: krtkush --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f7e461829..f4910388f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -518,7 +518,7 @@ Updates - Show a notification to prompt app update when a new version is available + Show a notification to prompt app update when a new version is available Minimize on application switch From 96dac0f9791e47b72fb25f19cd57a49cd1f444a1 Mon Sep 17 00:00:00 2001 From: krtkush Date: Mon, 22 Oct 2018 23:12:25 +0530 Subject: [PATCH 040/207] Code review suggested changes. --- .../org/schabi/newpipe/CheckForNewAppVersionTask.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index 9ab0f5d36..e122a5688 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -194,17 +194,12 @@ public class CheckForNewAppVersionTask extends AsyncTask { Signature[] signatures = packageInfo.signatures; byte[] cert = signatures[0].toByteArray(); InputStream input = new ByteArrayInputStream(cert); + CertificateFactory cf = null; - - try { - cf = CertificateFactory.getInstance("X509"); - } catch (CertificateException e) { - e.printStackTrace(); - } - X509Certificate c = null; try { + cf = CertificateFactory.getInstance("X509"); c = (X509Certificate) cf.generateCertificate(input); } catch (CertificateException e) { e.printStackTrace(); From e1146e46556617ab30a20c9c6935e6d535808f60 Mon Sep 17 00:00:00 2001 From: ezjerry liao Date: Wed, 24 Oct 2018 14:28:13 +0000 Subject: [PATCH 041/207] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 9b37caa7e..4b5c9af37 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -10,7 +10,7 @@ 下載 搜尋 設定 - 您是不是要找: %1$s ? + 您是不是要找:%1$s? 分享影片 選擇瀏覽器 旋轉 From 1727387c9c714ac8e7ac621f13aa1ad742e423c5 Mon Sep 17 00:00:00 2001 From: Stjepan Date: Wed, 24 Oct 2018 15:23:28 +0000 Subject: [PATCH 042/207] Translated using Weblate (Croatian) Currently translated at 86.9% (333 of 383 strings) --- app/src/main/res/values-hr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 29a037b9c..216c81b96 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -11,7 +11,7 @@ Preuzimanje Pretraživanje Postavke - Jeste li mislili: %1$s ? + Jeste li mislili: %1$s\? Podijeli putem Izaberi pretraživač rotacija @@ -77,7 +77,7 @@ Preuzmi Sljedeći videozapis - Prikaži sljedeće i slične videozapise + Prikaži \'sljedeće\' i \'slične\' videozapise URL nije podržan Zadani jezik sadržaja Video i zvuk From 8589ee14ffd5c58f1ce8a2f9b5022ed253c8d651 Mon Sep 17 00:00:00 2001 From: Eduardo Caron Date: Thu, 25 Oct 2018 01:56:01 +0000 Subject: [PATCH 043/207] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-pt-rBR/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index dc9ea257d..a3bec6ccb 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -77,7 +77,7 @@ ao vivo Downloads Downloads - Você quis dizer: %1$s ? + Você quis dizer: %1$s\? M4A — melhor qualidade Nova missão App/interface parou From 4d5dc0d39c606d2a01163b2961908fb56c31460a Mon Sep 17 00:00:00 2001 From: Dual Natan Date: Sun, 28 Oct 2018 17:34:35 +0000 Subject: [PATCH 044/207] Translated using Weblate (Macedonian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-mk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 6dccd4b26..abcc820ae 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -13,7 +13,7 @@ Превземи стрим датотека. Пребарај Поставки - Мислеше на: %1$s ? + Мислеше на: %1$s\? Сподели со Одбери пребарувач ротација From 8a56257ade5e639add27e36849a6455c45b96d5b Mon Sep 17 00:00:00 2001 From: simo Date: Tue, 30 Oct 2018 13:31:26 +0000 Subject: [PATCH 045/207] Translated using Weblate (Arabic) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-ar/strings.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index e9c13d3f1..d83779f39 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -10,7 +10,7 @@ الإعجابات صور معاينة الفيديو الصورة المصغرة الشخصية - هل تقصد: %1$s ? + هل تقصد: %1$s\? تنزيل تنزيل أدخل مسار تنزيل الملفات الصوتية @@ -176,18 +176,18 @@ ليس هناك مشترِكون - صفر مشترِك - %s مشترِك - مشترِكان - %s مشتركين - %s مشترك - %s مشترك + %s لا يوجد مشترك + %s مشترك + %s اثنتين مشتركين + %s اشتراكات + %s مشتركين + %s مشتركين دون مشاهدات لاتوجد فيديوهات - تشغيل - إيقاف + ابدأ + إيقاف مؤقت شغل حذف التوقيع From 695a1944676c699445411df01bbae51402af3284 Mon Sep 17 00:00:00 2001 From: Max Mathys Date: Tue, 30 Oct 2018 15:43:43 +0000 Subject: [PATCH 046/207] Translated using Weblate (Finnish) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-fi/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 3f0a8a262..79f3b8c54 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -11,7 +11,7 @@ Lataus Haku Asetukset - Tarkoititko: %1$s ? + Tarkoititko: %1$s\? Jaa Valitse selain kierto @@ -234,7 +234,7 @@ Historia pyyhitty Poistettu Haluatko poistaa tämän hakuhistoriasta? -Jatka keskeytyksen jälkeen +Jatka toistoa ohjelman palatessa päällimmäiseksi Info: Mikä:\\nPyyntö:\\nSisällön kieli:\\nPalvelu:\\nGMT Aika:\\nPaketti:\\nVersio:\\nOS versio: © %1$s %2$s %3$s alla @@ -276,7 +276,7 @@ Aloita toisto taustalla Aloita toisto ikkunassa Lahjoita - NewPipe kehitetään vapaaehtoisten toimesta, jotka käyttävät vapaa-aikaansa tuottaakseen parhaan mahdollisen käyttökokemuksen sinulle. Nyt on aika antaa takaisin, jotta kehittäjät voivat tehdä NewPipe:sta vielä paremman nauttiessaan kupin kahvia! + NewPipe kehitetään vapaaehtoisten toimesta, jotka käyttävät vapaa-aikaansa tuottaakseen parhaan mahdollisen käyttökokemuksen sinulle. Nyt on aika antaa takaisin, jotta kehittäjät voivat tehdä NewPipe:sta vielä paremman nauttiessaan kupin kahvia. Anna takaisin Websivu Käy verkkosivuillamme saadaksesi lisää tietoa ja uusimmat uutiset NewPipe:stä. @@ -308,7 +308,7 @@ Vain kerran Tiedosto - Muuta näytön suuntausta + Vaihda orientaatio Vaihda taustalle Vaihda ponnahdusikkunatoistoon Vaihda normaalitoistoon From 733ebb8caf7bd0080cb20e670c15378bf3ed045c Mon Sep 17 00:00:00 2001 From: Piotr Kaczmarek Date: Tue, 30 Oct 2018 00:54:38 +0000 Subject: [PATCH 047/207] Translated using Weblate (Polish) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-pl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index b156f60db..4f7bb20d9 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -8,7 +8,7 @@ Pobierz Wyszukaj Ustawienia - Miałeś na myśli: %1$s ? + Miałeś na myśli: %1$s\? Udostępnij przez Wybierz przeglądarkę obrót From 6d845af7f10df7cf34dcf37616852612ff21dd5d Mon Sep 17 00:00:00 2001 From: WaldiS Date: Wed, 31 Oct 2018 12:48:05 +0000 Subject: [PATCH 048/207] Translated using Weblate (Polish) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-pl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 4f7bb20d9..a1b844b1a 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -473,7 +473,7 @@ NewPipe jest wolnym i bezpłatnym oprogramowaniem: Możesz używać, brać udział oraz udoskonalać je według własnego uznania. W szczególności możesz redystrybuować lub/i modyfikować pod zasadami GNU General Public License opublikowanej przez Free Software Fundation w wersji 3 lub (w zależności od ciebie) dowolnej późniejszej wersji. Czy chcesz zaimportować również ustawienia? - Polityka prywatności programu NewPipe + Polityka prywatności NewPipe Projekt NewPipe bardzo poważnie traktuję politykę prywatności. Aplikacja nie zbiera żadnych danych bez Twojej zgody. Polityka prywatności programu NewPipe szczegółowo wyjaśnia, jakie dane są zbierane i przesyłane, kiedy wysyłasz raport o błędach aplikacji. Przeczytaj politykę prywatności Ze względu na wprowadzenie Ogólnego Rozporządzenia o ochronie danych (RODO), chcielibyśmy zwrócić Twoją uwagę na politykę prywatności NewPipe. Proszę przeczytać ją uważnie. From 8ae45240b2ce9be7991558689bc60c7a453c4894 Mon Sep 17 00:00:00 2001 From: rimasx Date: Sun, 4 Nov 2018 12:41:16 +0000 Subject: [PATCH 049/207] Translated using Weblate (Estonian) Currently translated at 99.7% (382 of 383 strings) --- app/src/main/res/values-et/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index db523e62e..08a7ee09c 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -13,7 +13,7 @@ Laadi voog alla. Otsi Seaded - Kas mõtlesid: %1$s ? + Kas mõtlesid: %1$s\? Jaga Vali veebilehitseja pööramine From dd56a5d869d1e2b2137f61ff817d45f292683b95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D1=96=D0=B9?= Date: Wed, 7 Nov 2018 14:08:32 +0000 Subject: [PATCH 050/207] Translated using Weblate (Ukrainian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-uk/strings.xml | 206 ++++++++++++------------- 1 file changed, 103 insertions(+), 103 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index d8040c19b..2a4d6c9fd 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -2,38 +2,38 @@ %1$s переглядів Опубліковано %1$s - Стримінґового програвача не знайдено. Чи встановити VLC? - Установити + Потокового програвача не знайдено. Бажаєте встановити VLC\? + Встановити Скасувати - Відкрити у переглядачеві + Відкрити у браузері Поширити Завантажити Шукати Налаштування - Чи ви мали на увазі: %1$s\? + Ви мали на увазі: %1$s\? Поділитись з - Оберіть переглядач + Оберіть браузер обертання Зовнішній відео-програвач - Зовнішній авдіо-програвач + Зовнішній аудіо-програвач Шлях для завантаження відеозапису Вкажіть шлях для завантаження відеозаписів - Вкажіть шлях для завантаження авдіофайлів + Вкажіть шлях для завантаження аудіофайлів Шлях де зберігатимуться завантажені відеозаписи - Шлях для завантаження авдіо - Шлях де зберігатимуться завантажені авдіофайли + Шлях для завантаження аудіо + Шлях де зберігатимуться завантажені аудіофайли Автоматично відтворювати Відтворює відеозапис коли NewPipe викликано з іншого застосунку Типова роздільна здатність Відтворювати за допомогою Kodi Застосунок Kore не знайдено. Встановити? - Відтворювти у Kodi + Відтворювати у Kodi Показувати опцію відтворення відеозапису за допомогою Kodi media center - Авдіо - Типовий авдіоформат + Аудіо + Типовий аудіоформат WebM — вільний формат M4A — ліпша якість Тема @@ -42,13 +42,13 @@ Завантажити Наступний відеозапис - Являти \"наступні\" й \"схожі\" відео + Показати \"наступні\" й \"схожі\" відео URL не підтримується - Переважна мова контенту - Відео та Авдіо + Мова контенту за замовчуванням + Відео та Аудіо Зовнішній вигляд Інше - Відтворення у тловому режимі + Відтворення у фоновому режимі Відтворити У доступі відмовлено Контент @@ -56,8 +56,8 @@ Відеозапис має вікові обмеження. Спершу активуйте опцію для програвання таких записів у налаштуваннях. наживо - Хиба - Хиба мережі + Помилка + Помилка мережі Не вдалося завантажити всі ескізи Не вдалося розшифрувати URL підпис відеозапису Не вдалося проаналізувати веб-сайт @@ -66,11 +66,11 @@ Заблоковано GEMA Не вдалося налаштувати меню завантаження Трансляції НАЖИВО ще не підтримуються. - Не вдалося отримати жодного стриму + Не вдалося отримати жодного стріму Шкода, цього не мало статися. - Зазвітувати помилку за допомогою пошти + Повідомити про помилку за допомогою пошти На жаль, трапилась помилка. - ЗАЗВІТУВАТИ + ПОВІДОМИТИ Інформація: Що сталося: Натисніть на пошук аби почати @@ -95,45 +95,45 @@ Ескіз попереднього перегляду відео Використовувати Tor (Експериментально) Перенаправляти трафік через Tor для підвищення конфіденційності (трансляція відео ще не підтримується). - Зазвітувати про помилку + Повідомити про помилку Не вдалося створити теку для завантаження \'%1$s\' Створити теку для завантаження \'%1$s\' Відео - Авдіо + Аудіо Повторити Використовувати старий програвач - К - М - Б + т + млн + мрд Почати - Павза + Пауза Відтворити Видалити Контрольна сума ОК Назва файлу - Нитки - Хиба + Гілки + Помилка Сервер не підтримується Файл уже існує NewPipe завантажує Натисніть для подробиць Будь ласка, зачекайте… - Скопійовано до сховку + Скопійовано до буферу обміну Будь ласка, оберіть теку для завантаження -Стримінґового програвача не знайдено (ви можете встановити VLC для відтворення) +Потокового програвача не знайдено (ви можете встановити VLC для відтворення) Відкрити у віконному режимі Певні роздільності НЕ матимуть звуку якщо цей параметр увімкнено NewPipe у віконному режимі Підписатися Ви підписалися Ви відписалися від каналу - Неможливо змінити підписання - Неможливо оновити підписання + Неможливо змінити підписку + Неможливо оновити підписку Головна Підписання @@ -145,64 +145,64 @@ Типова роздільна здатність вікна Не всі пристрої підтримують відтворення 2K/4K відеозаписи - Більші роздільні здатності + Вищі роздільні здатності Типовий формат відеозапису Пам\'ятати розмір та позицію вікна Пам\'ятати останній розмір вікна Керування жестами Використовувати жести для контролю яскравості та гучності програвача Шукати схожі - Показувати схожі під час пошуку + Показувати пропозиції під час пошуку Історія пошуків Зберігати пошукові запити локально Історія та кеш Вести облік перегляду відеозаписів Відновити відтворення Продовжувати відтворення опісля переривання (наприклад телефонного дзвінка) - \"Утримуй аби додати\" підказка - Усталена країна контенту + \"Утримуй для додавання\" підказка + Країна контенту за замовчуванням Сервіс Програвач Поведінка Історія та кеш Вікно - Відворення у вікні - Додано до тлового відтворення - Додано до чергу у вікно + Відтворення у вікні + Додано до фонового відтворення + Додано до черги у вікно Плейлист Фільтрувати Оновити Очистити Зміна розміру - Найліпша роздільна здатність + Найкраща роздільна здатність Відміна Грати всі - Щоразу + Завжди Тільки тепер NewPipe сповіщення - "Сповіщення для NewPipe\'пових тлового і віконного програвачів " + "Сповіщення для NewPipe\'ових фонового і віконного програвачів " [Невідомо] - Перемкнутися до тла + Перемкнутися до Фону Перемкнутися до вікна Перемкнутися на головну Імпортувати базу Експортувати базу - Це перепише чинну історію та підписання - Експортувати історію, підписання та плейлисти - Неможливо відтворити цей стрим + Це перепише поточну історію та підписки + Експортувати історію, підписки та плейлисти + Неможливо відтворити цей стрім Відновлююсь після помилки програвача Помилкова URL - Відео-струмів не було знайдено - Не знайдено жодних авдіострумів + Відео-стрімів не знайдено + Не знайдено аудіо стрімів Звіт користувача Без підписників - Відео нема - Помилкова URL або інтернет не є доступним + Немає відео + Помилкова URL або інтернет недоступний Цей дозвіл має бути відкритим \nу вікні @@ -215,23 +215,23 @@ Літери та цифри Більш специфічні символи - Щодо NewPipe + Про NewPipe Налаштування - Візитівка + Про Неможливо завантажити ліцензію Ліцензії Зробити внесок - Переглянути на Ґітгаб + Переглянути на ГітХаб Фінансова допомога Веб-сайт Історія Історію стерто - Експортування доконано - Імпортування доконано + Експорт завершено + Імпорт завершено Топ 50 - Новинки + Гарячі новинки Деталі - Звукові налаштування + Налаштування звуку Відеопрогравач Тловий програвач @@ -240,7 +240,7 @@ Отримую інформацію… Завантажується запитаний контент -Завантажити стримінґовий файл. +Завантажити потоковий файл. Показати інфо Закладки @@ -249,14 +249,14 @@ Показувати підказку коли натиснута кнопка тла або вікна на сторінці інформації відеозапису Перемкнути орієнтацію - Фатальна хиба програвача - Зовнішні програвачі не підтримують такі види ланок + Фатальна помилка програвача + Зовнішні програвачі не підтримують такі види посилань Що:\\nЗапит:\\nМова змісту:\\nСервіс:\\nЧас GMT:\\nПакунок:\\nВерсія:\\nВерсія ОС: Ескіз аватару користувача Сподобалося Не сподобалося Нічого не знайдено - Перетягніть для зміни шикування + Перетягніть для зміни сортування %s підписник @@ -278,15 +278,15 @@ Сторонні ліцензії Перейти до сайту - Візитівка - Вільний та легковагий стримінґ для Андроїду. - Які б не були Ваші ідеї: переклад, дизайн, легкий чи глобальний рефакторинґ - будь-яка допомога завжди у нагоді. Що більше зроблено, то ліпшим NewPipe стає! + Про + Вільний та легковагий стрімінг для Андроїду. + Які б не були Ваші ідеї: переклад, дизайн, легкий чи глобальний рефакторинг - будь-яка допомога завжди у нагоді. Що більше зроблено, то ліпшим NewPipe стає! Моніторинг витоку памяті вимкнено Усунення вад Нічого нема - Старий убудований медія-фреймворк програвач + Старий вбудований медіа-фреймворк програвач - Перегляди відсутні + Немає переглядів %s перегляд %s переглядів @@ -299,9 +299,9 @@ © %1$s by %2$s under %3$s Учасники - NewPipe розробний добровольцями, які витрачають власний час заради вашого задоволення. Допоможіть розробникам зробити NewPipe ще ліпшим, насолоджуючись філіжанкою кави. + NewPipe розроблений добровольцями, які витрачають власний час заради вашого задоволення. Допоможіть розробникам зробити NewPipe ще кращим, насолоджуючись філіжанкою кави. Ваша допомога - Завітайте на офіційний сайт, аби отримати більше інформацій та новин. + Завітайте на офіційний сайт, для отримання більше інформації та новин. Ліцензія NewPipe Прочитати ліцензію @@ -312,40 +312,40 @@ Історія Історія відсутня Елемент видалено - Чи ви хочете видалити цей елемент з історії пошуку? - Чи ви хочете видалити цей елемент з історії переглядів? - Чи ви певні що хочете видали всі елементи з історії? + Ви хочете видалити цей елемент з історії пошуку\? + Ви хочете видалити цей елемент з історії переглядів\? + Ви впевнені, що хочете видали всі елементи з історії\? Програвалося останнім Програвалося найбільше Контент на головній сторінці Порожня сторінка Kiosk - Підписання + Підписки Нове Сторінка каналу Обрати канал - Ви не підписані до жодного з каналів + Ви не підписані на жоден з каналів Обрати kiosk Недійсний ZIP-файл Увага: не можливо здійснити імпортування всіх файлів. - Це перепише ваш чинний сетап. + Це перепише ваші поточні налаштування. Кіоски Набуває популярності - Тловий програвач + Фоновий програвач Віконний програвач Усунути - Затиснути, аби зняти з черги - Зняти з черги у тловому програвачеві - Зняти з черги у віконному програвачеві + Утримуйте, для додавання в чергу + Додати в чергу Фонового відтворення + Додати в чергу для віконного відтворення Розпочати відтворення звідси - Розпочати відтворення у тловому програвачеві + Розпочати відтворення у фоні Розпочати відтворення у вікні звідси - Відчинити шухляду - Зачинити шухляду - Незабаром ми тут щось матимемо ;D + Відкрити меню + Закрити меню + Незабаром тут щось буде ;D Завжди питати @@ -384,19 +384,19 @@ Зазвітувати Out-of-lifecycle хиби Примусове звітування про неможливість доставлення Rx винятків, які відбуваються за межами фраґменту або діяльності життєвого циклу після усунення -Використовувати неточне шукання - Неточне шукання дозволяє програвачеві рухатися позиціями швидше, проте з меншою точністю - Чи наступний стрим у черзі - Автоматично додавати пов\'язаний стрим під час відтворення останнього у неповторювальній черзі +Використовувати неточний пошук + Неточний пошук дозволяє програвачеві рухатися позиціями швидше, проте з меншою точністю + Додавати в чергу наступний стрім + Автоматично додавати пов\'язаний стрим під час відтворення останнього у черзі без повторювань СИНХРОНІЗАЦІЯ - Теки + Файл Неправильна тека - Неправильний файл/контент джерела + Неправильний файл/джерело контенту Файл не існує, або немає дозволу на його запис чи читання - Ім\'я файлу не повинно бути порожнім - Хиба: %1$s + Ім\'я файлу не може бути порожнім + Помилка: %1$s Імпортування/Експортування Імпортування @@ -429,10 +429,10 @@ \n \nПродовжуватимете? Завантажити ескізи - Відключити аби зупинити завантаження ескізів та заощадити використання ресурсів та пам\'яті. Увімкнення функції призведе до повного вичищення кешу зображень + Відключити аби зупинити завантаження ескізів та заощадити використання ресурсів та пам\'яті. Увімкнення функції призведе до повного очищення кешу зображень Кеш зображень стерто Стерти кеш метаданих - "Усунути всі кешовані дані веб-сторінки " + "Видалити всі кешовані дані веб-сторінки " Кеш метаданих стерто Реґулятори швидкісті відтворення Темп @@ -440,7 +440,7 @@ Від\'єднати (може спричинити спотворення) Nightcore Усталено -Струми недоступні для завантаження +Стріми недоступні для завантаження Переважний спосіб \"відкриття\" Типова дія під час відкриття вмісту — %s @@ -448,24 +448,24 @@ Субтитри Змінення маштабу субтитрового тексту та тлових стилів. Увімкнення функції потребує перезавантаження застосунку - Не знайдено відповідного застосунку для відтворення цього файла + Не знайдено відповідного застосунку для відтворення цього файлу Очистити історію переглядів Видаляє історію відтворень Видалити всю історію переглядів. Історію переглядів було видалено. Очистити історію пошуків - Видаляє історію шуканих ключових слів + Видаляє історію пошукових ключових слів Видалити всю пошукову історію. - Пошукову історію було видалено. - Видалено один фраґмент. + Пошукову історію видалено. + Видалено один фрагмент. - "NewPipe є вільною копілефт програмою: Ви можете використовувати її, поширювати та вдосконавлювати за власним розсудом. Зокрема ви можете перерозподіляти та/або змінювати її за умов використання GNU General Public License, опублікованою Free Software Foundation, під 3-ю версією ліцензії, або (на ваш вибір) будь-якою пізнішою версією." - Чи ви також бажаєте імпортувати налаштування? + "NewPipe є вільною копілефт програмою: Ви можете використовувати її, поширювати та вдосконалювати за власним розсудом. Зокрема ви можете перерозподіляти та/або змінювати її за умов використання GNU General Public License, опублікованою Free Software Foundation, під 3-ю версією ліцензії, або (на ваш вибір) будь-якою пізнішою версією." + Бажаєте імпортувати з налаштуваннями\? Політика приватності NewPipe\'у - Проєкт NewPipe дуже серйозно ставиться до вашої приватності. Тому цей застосунок не збирає ніяких даних без вашої згоди -\nПолітика приватності NewPipe пояснюється у деталях, які дані було відіслано та збережено, під час відсилання крахового звіту. + Проект NewPipe дуже серйозно ставиться до вашої приватності. Тому застосунок не збирає ніяких даних без вашої згоди +\nПолітика приватності NewPipe пояснює у деталях, які дані було відіслано та збережено, під час відсилання крахового звіту. Читати політику приватності Аби дотриматися Норм загального захисту даних ЄС (General Data Protection Regulation, GDPR), ми просимо звернути вашу увагу на NewPipe\'ову політику приватності. Будь ласка, прочитайте уважно \nВи маєте підтвердити її аби надіслати нам баґового звіту. @@ -485,6 +485,6 @@ Канали Плейлисти - Стежки + Доріжки Користувачі From 9562972c423b0ddc84cc2fed0f6b080d19baee22 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Fri, 9 Nov 2018 22:07:41 +0000 Subject: [PATCH 051/207] Translated using Weblate (Russian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f2a2f4eef..eb8282d48 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -467,14 +467,14 @@ Удалить историю запросов поиска Удалить историю воспроизведённых потоков Вся история поиска будет удалена. - История поиска удалена. + История поиска удалена 1 элемент удалён. NewPipe — свободное программное обеспечение: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с условиями GNU General Public License, опубликованной Free Software Foundation, либо версии 3, либо (по вашему выбору) любой более поздней версии. При открытии ссылки Хотите импортировать настройки? - Политика конфиденциальности NewPipe + Конфиденциальность Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Поэтому приложение не собирает никаких данных без вашего согласия. \nПолитика конфиденциальности NewPipe подробно объясняет, какие данные отправляются и хранятся при отправке отчёта о сбоях. Прочитать политику From c926482b3c21235b2cb46e6fba923667b8fc4829 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 10 Nov 2018 22:38:13 +0000 Subject: [PATCH 052/207] Translated using Weblate (Russian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index eb8282d48..8ac46754c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -255,7 +255,7 @@ Элемент удалён Удалить этот элемент из истории поиска? -Контент главной страницы +Главная страница Пустая страница Киоск Подписки From 3a608bb58264da086ab6c36cb49470280d47f5f6 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 10 Nov 2018 23:46:58 +0000 Subject: [PATCH 053/207] Translated using Weblate (Russian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 8ac46754c..98d20d7ec 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -444,7 +444,7 @@ Кэш изображений очищен Очистить кэш метаданных Кэш метаданных очищен - Управление скоростью воспроизведения + Скорость воспроизведения Темп Тон Независимо (искажения) From f9341bea79b4fe0a377f4fb79e414f0fd8d917ae Mon Sep 17 00:00:00 2001 From: ssantos Date: Sun, 11 Nov 2018 08:10:20 +0000 Subject: [PATCH 054/207] Translated using Weblate (Portuguese) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-pt/strings.xml | 50 ++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 906d4b8b3..293fa7d5b 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -434,7 +434,7 @@ Histórico de pesquisa deletado. 1 elemento deletado. - Nehum aplicativo instalada para reproduzir este arquivo + Nehum aplicativo instalado para reproduzir este ficheiro NewPipe é desenvolvido por voluntários que usam seu tempo para trazer a melhor experiência para você. Retribua para ajudar os desenvolvedores a tornarem o NewPipe ainda melhor enquanto desfrutam uma xícara de café. Retribuir @@ -443,4 +443,50 @@ \nA polícia de privacidade do NewPipe explica em detalhes qual dado é enviado e salvo quando você envia um relatório de erros. Ler a política de privacidade Próximo stream automaticamente em lista de espera - + NewPipe é libre software copyleft: você pode usar, estudar, compartilhar e melhorar à sua vontade. Especificamente, você pode redistribuir e/ou modificá-la sob os termos da Licença Pública Geral GNU, conforme publicada pela Free Software Foundation, tanto a versão 3 da Licença, ou (por sua opção) qualquer versão posterior. + Deseja também importar configurações\? + + Reter para enfileirar + Enfileirar no fundo + Enfileirar em Popup + Ação \'abrir\' preferida + Ação padrão para abrir o conteúdo — %s + + Definir como miniatura na lista de reprodução + + Não foi possível apagar a lista de reprodução + + Ajuste + Preencher + Modificar escala de texto do Player legenda e estilos de plano de fundo. Requer a reinicialização do aplicativo para ter efeito + + Ativar o LeakCanary + Monitoramento de vazamento à memória pode fazer com que o aplicativo pare de responder quando fizer um heap dumping + + Relatar erros fora do ciclo de vida + Forçar relatórios de exceções de Rx não entregues fora do ciclo de vida de fragmento ou atividade após a eliminação + + Tenha em mente que esta operação pode ser cara para a rede. +\n +\nVocê deseja continuar\? + + Tom + Desvincular (pode causar distorção) + Avanço rápido durante silêncio + Passo + Reiniciar + + Para cumprir o Regulamento Geral sobre a Proteção de Dados (RGPD), chamamos a política de privacidade da NewPipe à sua atenção. Por favor, leia com atenção. +\nVocê deve aceitá-lo para nos enviar o relatório de bug. + Aceitar + Recusar + + Ilimitado + Limite de resolução quando usando dados móveis + Minimizar ao mudar o aplicativo + Ação ao mudar do player de vídeo principal para outro aplicativo —% s + Nenhum + Minimizar para o player de fundo + Minimizar para o player de fundo + + From 6167d5dbfc6de63c50d24fdbfa524ada48432c05 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Tue, 13 Nov 2018 19:12:54 +0000 Subject: [PATCH 055/207] Translated using Weblate (English) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values/strings.xml | 116 ++++++++++++++-------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f9fe85603..70456684b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,7 +5,7 @@ %1$s views Published on %1$s No stream player found. Do you want to install VLC? - No stream player found (you can install VLC to play it) + No stream player found (you can install VLC to play it). Install Cancel https://f-droid.org/repository/browse/?fdfilter=vlc&fdid=org.videolan.vlc @@ -13,7 +13,7 @@ Open in popup mode Share Download - Download stream file. + Download stream file Search Settings Did you mean: %1$s\? @@ -21,20 +21,20 @@ Choose browser rotation Use external video player - Some resolutions will NOT have audio when this option is enabled + Removes audio at SOME resolutions Use external audio player NewPipe popup mode RSS Subscribe Subscribed Channel unsubscribed - Unable to change subscription - Unable to update subscription + Could not change subscription + Could not update subscription Show info Main Subscriptions - Bookmarks + Bookmarked Playlists What\'s New @@ -46,8 +46,8 @@ Path to store downloaded videos in Enter download path for videos - Audio download path - Path to store downloaded audio in + Audio download folder + Downloaded audio is stored here Enter download path for audio files Autoplay @@ -75,13 +75,13 @@ Use fast inexact seek Inexact seek allows the player to seek to positions faster with reduced precision Load thumbnails - Disable to stop all thumbnails from loading and save on data and memory usage. Changing this will clear both in-memory and on-disk image cache + When off no thumbnails load, saving data and memory usage. Changes clear both in-memory and on-disk image cache. Image cache wiped Wipe cached metadata Remove all cached webpage data Metadata cache wiped Auto-queue next stream - Auto-append a related stream when playing the last stream in a non-repeating queue + Auto-append a related stream when playing the last stream in a non-repeating queue. Player gesture controls Use gestures to control the brightness and volume of the player Search suggestions @@ -93,18 +93,18 @@ Resume on focus gain Continue playing after interruptions (e.g. phone calls) Download - Next video - Show \'next\' and \'similar\' videos - Show \"hold to append\" tip + Next + Show \'Next\' and \'Similar\' videos + Show \"Hold to append\" tip Show tip when background or popup button is pressed on video details page - URL not supported + Unsupported URL Default content country Service Default content language Player Behavior - Video & Audio - History & Cache + Video & audio + History & cache Popup Appearance Other @@ -116,9 +116,9 @@ https://www.c3s.cc/ Play Content - Show age restricted content - Age Restricted Video. Allowing such material is possible from Settings. - live + Age restricted content + Show age Restricted Video. Allowing such material is possible from \"Settings\". + LIVE LIVE Downloads Downloads @@ -147,7 +147,7 @@ newpipe NewPipe Notification - Notifications for NewPipe Background and Popup Players + Notifications for NewPipe background and popup players [Unknown] @@ -158,15 +158,15 @@ Import database Export database - Will override your current history and subscriptions + Overrides your current history and subscriptions Export history, subscriptions and playlists Clear watch history Deletes the history of played streams - Delete whole watch history. + Delete entire watch history\? Watch history deleted. Clear search history Deletes history of search keywords - Delete whole search history. + Delete entire search history\? Search history deleted. Error @@ -175,10 +175,10 @@ Could not decrypt video URL signature Could not parse website Could not parse website completely - Content not available + Content unavailable Blocked by GEMA Could not set up download menu - This is a LIVE STREAM, which is not yet supported. + Live streams are not supported yet Could not get any stream Could not load image App/UI crashed @@ -189,10 +189,10 @@ Invalid URL No video streams found No audio streams found - Invalid directory - Invalid file/content source - File doesn\'t exist or insufficient permission to read or write to it - File name cannot be empty + No such folder + No such file/content source + The file doesn\'t exist or permission to read or write to it is lacking + Filename cannot be empty An error occurred: %1$s No streams available to download @@ -221,7 +221,7 @@ User report No results @string/no_videos - Nothing Here But Crickets + Nothing here but crickets Drag to reorder Cannot create download directory \'%1$s\' @@ -277,7 +277,7 @@ Filename Threads Error - Server unsupported + Unsupported server File already exists Malformed URL or Internet not available NewPipe Downloading @@ -292,8 +292,8 @@ MD5 SHA-1 reCAPTCHA - reCAPTCHA Challenge - reCAPTCHA Challenge requested + reCAPTCHA challenge + reCAPTCHA challenge requested @@ -338,7 +338,7 @@ https://newpipe.schabi.org/legal/privacy/ Read privacy policy NewPipe\'s License - NewPipe is copyleft libre software: You can use, study share and improve it at your will. Specifically you can redistribute 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 copyleft libre software: You can use, study share and improve it at will. Specifically you can redistribute 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. Read license @@ -346,7 +346,7 @@ History Searched Watched - History is disabled + History is turned off History The history is empty History cleared @@ -372,10 +372,10 @@ @string/channel_page_summary Select a channel - No channel subscribed yet + No channel subscriptions yet Select a kiosk - Export complete - Import complete + Exported + Imported No valid ZIP file Warning: Could not import all files. This will override your current setup. @@ -389,17 +389,17 @@ %1$s/%2$s - Background Player - Popup Player + Background player + Popup player Remove Details Audio Settings - Hold To Enqueue - Enqueue on Background - Enqueue on Popup - Start Playing Here - Start Here on Background - Start Here on Popup + Hold To enqueue + Enqueue when backgrounded + Enqueue on new popup + Start playing here + Start here when backgrounded + Start here on new popup Open Drawer @@ -423,9 +423,9 @@ "Loading requested content" - Create New Playlist - Delete Playlist - Rename Playlist + New Playlist + Delete + Rename Name Add To Playlist Set as Playlist Thumbnail @@ -433,11 +433,11 @@ Bookmark Playlist Remove Bookmark - Do you want to delete this playlist? + Delete this playlist\? Playlist created - Added to playlist - Playlist thumbnail changed - Could not delete playlist + Playlisted + Playlist thumbnail changed. + Could not delete playlist. No Captions @@ -450,17 +450,17 @@ Captions - Modify player caption text scale and background styles. Requires app restart to take effect + Modify player caption text scale and background styles. Requires app restart to take effect. Enable LeakCanary Memory leak monitoring may cause the app to become unresponsive when heap dumping - Report Out-of-lifecycle Errors + Report out-of-lifecycle errors Force reporting of undeliverable Rx exceptions outside of fragment or activity lifecycle after disposal - Import/Export + Import/export Import Import from Export to @@ -511,8 +511,8 @@ - Minimize on application switch - Action when switching to other application from main video player — %s + Minimize on app switch + Action when switching to other app from main video player — %s None Minimize to background player Minimize to popup player From 862c5d342bacf6bcf4b501353d5084fa907345a6 Mon Sep 17 00:00:00 2001 From: postsorino Date: Mon, 12 Nov 2018 14:13:36 +0000 Subject: [PATCH 056/207] Translated using Weblate (Greek) Currently translated at 84.6% (324 of 383 strings) --- app/src/main/res/values-el/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 274c9fba2..c7fed6c79 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -10,7 +10,7 @@ Λήψη Αναζήτηση Ρυθμίσεις - "Μήπως εννοείτε: %1$s ?" + Μήπως εννοείτε: %1$s\? Κοινοποίηση με Επιλέξτε browser περιστροφή @@ -255,7 +255,7 @@ Κανένα βίντεο %s βίντεο - %s βίντεο + "%s βίντεο " Εκκίνηση From da7716db609ebb23cbd8f7ba9b674c0ee5eef91d Mon Sep 17 00:00:00 2001 From: Mostafa Ahangarha Date: Mon, 12 Nov 2018 17:54:19 +0000 Subject: [PATCH 057/207] Translated using Weblate (Persian) Currently translated at 35.0% (134 of 383 strings) --- app/src/main/res/values-fa/strings.xml | 80 ++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 84c29c4fd..4175f0a8b 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -3,7 +3,7 @@ برای شروع، جست‌وجو را بزنید ‫%1$s مشاهده منتشر شده در %1$s - هیچ پخش‌کنندهٔ جریانی پیدا نشد. وی‌ال‌سی نصب شود؟ + هیچ پخش‌کنندهٔ جریانی پیدا نشد. مایلید وی‌ال‌سی نصب شود؟ نصب لغو گشودن در مرورگر @@ -11,7 +11,7 @@ بارگیری جست‌وجو تنظیمات - منظورتان این بود: %1$s ؟ + منظورتان این بود: %1$s؟ هم‌رسانی با گزیدن مرورگر چرخش @@ -19,33 +19,33 @@ استفاده از پخش‌کنندهٔ صدای خارجی مسیر بارگیری ویدیو - مسیر ذخیرهٔ ویدیوهای بارگیری شده. + مسیر ذخیرهٔ ویدیوهای بارگیری شده مسیر بارگیری را برای ویدیوها وارد کنید مسیر بارگیری صدا مسیر ذخیرهٔ صداهای بارگیری شده - مسیر بارگیری را برای صداها وارد کنید. + مسیر بارگیری را برای صداها وارد کنید - پخش خودکار هنگام فراخوانی از کاره‌ای دیگر - هنگامی که نیوپایپ از کارهٔ دیگری فراخوانی می‌شود، ویدیویی را به صورت خودکار پخش می‌کند. + پخش خودکار + هنگامی که نیوپایپ از کارهٔ دیگری فراخوانی می‌شود، ویدیوی به طور خودکار پخش شود وضوح پیش‌گزیده پخش با کودی - کارهٔ کوره پیدا نشد. کوره نصب شود؟ + کارهٔ کوره پیدا نشد. نصب شود؟ نمایش گزینهٔ «پخش با کودی» - نمایش گزینه‌ای برای پخش ویدیو با مرکز رسانهٔ کودی. + نمایش گزینه‌ای برای پخش ویدیو با مرکز رسانهٔ کودی صدا قالب صدای پیش‌گزیده قالب آزاد — WebM - کیفیت بهتر — m4a + کیفیت بهتر — M4A زمینه تیره روشن بارگیری ویدیوی بعدی - نماش ویدیوهای بعدی و مشابه + نماش ویدیوهای «بعدی» و «مشابه» نشانی اینترنتی پشتیبانی نمی‌شود - زبان محتوای ترجیحی + زبان محتوای پیش‌فرض ویدیو و صدا ظاهر دیگر @@ -136,4 +136,62 @@ موارد جدید پس زمینه + افزودن به + + نمایش کیفیت بالاتر + تنها برخی دستگاه‌ها توانایی پخش ویدئوهای 2K و 4K را دارند + قالب ویدئوی پیش‌فرض + سیاه + بارگذاری بندانگشتی + قرار دادن خودکار جریان بعدی در صف + پیشنهادهای جستجو + نمایش پیشنهادها حین جستجو + تاریخچه جستجو + نگه‌داشتن آمار ویدئوهای دیده‌شده + کشور محتوای پیش‌فرض + پخش‌کننده + رفتار + همه + کانال + کانال‌ها + سیاهه پخش + سیاهه‌های پخش + کاربران + بله + بعدا + غیرفعال + صافی + تازه‌سازی + پاک‌کردن + تغییر اندازه + پخش همه + همیشه + فقط یک‌بار + پرونده + + اعلان نیوپایپ + [ناشناخته] + + وارد کردن پایگاه‌داده + "صادرکردن " + تاریخچه و اشتراک‌های شما بازنویسی خواهند شد + صادرکردن تاریخچه، اشتراک‌ها و سیاهه‌های پخش + پاک‌کردن تاریخچه ویدئوهای دیده‌شده + وارد/صادر کردن + وارد کردن + وارد کردن از + صادر کردن به + + در حال وارد کردن… + در حال صدور… + + ناتوانی در ورود اشتراک‌ها + ناتوانی در صدور اشتراک‌ها + + کنترل‌های سرعت پخش + قبول + رد + + بدون محدودیت + هیچ From 7d5d4df761912119235ef64090df60f6d842a492 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Tue, 13 Nov 2018 19:18:34 +0000 Subject: [PATCH 058/207] Translated using Weblate (Russian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 98d20d7ec..0f469b3df 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -82,8 +82,8 @@ Автовоспроизведение Воспроизводить видео при вызове NewPipe из другого приложения Контент - Видео с возрастными ограничениями. Разрешить подобный контент можно в настройках. - вживую + Видео с возрастными ограничениями. Разрешить подобный контент можно в настройках + Трансляция Загрузки Загрузки Отчёт об ошибке @@ -93,7 +93,7 @@ Контент недоступен Заблокировано GEMA Не удалось создать меню загрузки - Это прямая трансляция, они пока не поддерживаются. + Это прямая трансляция, пока не поддерживается Не удалось загрузить изображение Падение приложения/UI Простите, это не должно было произойти. @@ -205,7 +205,7 @@ Уведомление NewPipe - Уведомления для NewPipe в фоне и во всплывающем окне + Уведомление для NewPipe в фоне и во всплывающем окне Загрузки Допустимые символы имён файлов @@ -293,7 +293,7 @@ Начать отсюда в плеере Начать отсюда в фоне Начать отсюда в окне -Потоковый плеер не найден (вы можете установить VLC) +Потоковый плеер не найден (можно установить VLC) Страна контента по умолчанию Сервис Всегда @@ -325,7 +325,7 @@ Получение сведений… Загрузка запрошенного контента -Загрузка файла прямой трансляции. +Загрузка файла прямой трансляции Показать сведения Закладки @@ -374,8 +374,8 @@ Всегда спрашивать Создать плейлист - Удалить плейлист - Переименовать плейлист + Удалить + Переименовать Имя Добавить в плейлист На миниатюру плейлиста @@ -383,7 +383,7 @@ Добавить закладку Удалить закладку - Удалить этот плейлист? + Удалить плейлист\? Плейлист создан Добавлено в плейлист Миниатюра плейлиста изменена @@ -461,12 +461,12 @@ Изменить размер текста и стиль титров. Нужен перезапуск Очистить историю просмотров - Вся история просмотров будет удалена. + Удалить всю историю просмотров\? История просмотров удалена Очистить историю поиска Удалить историю запросов поиска Удалить историю воспроизведённых потоков - Вся история поиска будет удалена. + Удалить всю историю поиска\? История поиска удалена 1 элемент удалён. From 44b2e62eef04ad4f064068596eee1700cd17a795 Mon Sep 17 00:00:00 2001 From: AB Date: Mon, 12 Nov 2018 10:06:50 +0000 Subject: [PATCH 059/207] Translated using Weblate (Ukrainian) Currently translated at 84.9% (325 of 383 strings) --- app/src/main/res/values-uk/strings.xml | 118 ++++++++++++------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 2a4d6c9fd..9d4975338 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -2,29 +2,29 @@ %1$s переглядів Опубліковано %1$s - Потокового програвача не знайдено. Бажаєте встановити VLC\? + Потокового програвача не знайдено. Чи бажаєте встановити VLC\? Встановити Скасувати - Відкрити у браузері + Відкрити у переглядачеві Поширити Завантажити Шукати Налаштування - Ви мали на увазі: %1$s\? + Чи ви мали на увазі: %1$s\? Поділитись з - Оберіть браузер + Оберіть переглядач обертання Зовнішній відео-програвач - Зовнішній аудіо-програвач + Зовнішній авдіопрогравач Шлях для завантаження відеозапису Вкажіть шлях для завантаження відеозаписів - Вкажіть шлях для завантаження аудіофайлів + Вкажіть шлях для завантаження авдіофайлів Шлях де зберігатимуться завантажені відеозаписи - Шлях для завантаження аудіо - Шлях де зберігатимуться завантажені аудіофайли + Шлях для завантаження авдіо + Шлях де зберігатимуться завантажені авдіофайли Автоматично відтворювати Відтворює відеозапис коли NewPipe викликано з іншого застосунку Типова роздільна здатність @@ -32,8 +32,8 @@ Застосунок Kore не знайдено. Встановити? Відтворювати у Kodi Показувати опцію відтворення відеозапису за допомогою Kodi media center - Аудіо - Типовий аудіоформат + Авдіо + Типовий авдіоформат WebM — вільний формат M4A — ліпша якість Тема @@ -44,11 +44,11 @@ Наступний відеозапис Показати \"наступні\" й \"схожі\" відео URL не підтримується - Мова контенту за замовчуванням - Відео та Аудіо + Усталена мова контенту + Відео та Авдіо Зовнішній вигляд Інше - Відтворення у фоновому режимі + Відтворення у тловому режимі Відтворити У доступі відмовлено Контент @@ -66,7 +66,7 @@ Заблоковано GEMA Не вдалося налаштувати меню завантаження Трансляції НАЖИВО ще не підтримуються. - Не вдалося отримати жодного стріму + Не вдалося отримати жодного стриму Шкода, цього не мало статися. Повідомити про помилку за допомогою пошти На жаль, трапилась помилка. @@ -100,7 +100,7 @@ Створити теку для завантаження \'%1$s\' Відео - Аудіо + Авдіо Повторити Використовувати старий програвач т @@ -108,7 +108,7 @@ мрд Почати - Пауза + Павза Відтворити Видалити Контрольна сума @@ -122,7 +122,7 @@ NewPipe завантажує Натисніть для подробиць Будь ласка, зачекайте… - Скопійовано до буферу обміну + Копійовано до сховку Будь ласка, оберіть теку для завантаження Потокового програвача не знайдено (ви можете встановити VLC для відтворення) @@ -132,8 +132,8 @@ Підписатися Ви підписалися Ви відписалися від каналу - Неможливо змінити підписку - Неможливо оновити підписку + Неможливо змінити підписання + Неможливо оновити підписання Головна Підписання @@ -160,32 +160,32 @@ Відновити відтворення Продовжувати відтворення опісля переривання (наприклад телефонного дзвінка) \"Утримуй для додавання\" підказка - Країна контенту за замовчуванням + Усталена країна контенту Сервіс Програвач Поведінка Історія та кеш Вікно Відтворення у вікні - Додано до фонового відтворення + Додано до тлового відтворення Додано до черги у вікно Плейлист Фільтрувати Оновити Очистити Зміна розміру - Найкраща роздільна здатність + Найліпша роздільна здатність Відміна Грати всі Завжди Тільки тепер NewPipe сповіщення - "Сповіщення для NewPipe\'ових фонового і віконного програвачів " + "Сповіщення для NewPipe\'ових тлового і віконного програвачів " [Невідомо] - Перемкнутися до Фону + Перемкнутися до тла Перемкнутися до вікна Перемкнутися на головну @@ -193,11 +193,11 @@ Експортувати базу Це перепише поточну історію та підписки Експортувати історію, підписки та плейлисти - Неможливо відтворити цей стрім + Неможливо відтворити цей стрим Відновлююсь після помилки програвача Помилкова URL - Відео-стрімів не знайдено - Не знайдено аудіо стрімів + Відеостримів не знайдено + Не знайдено авдіостримів Звіт користувача Без підписників @@ -217,21 +217,21 @@ Про NewPipe Налаштування - Про + Візитівка Неможливо завантажити ліцензію Ліцензії Зробити внесок - Переглянути на ГітХаб + Переглянути на Ґітгаб Фінансова допомога Веб-сайт Історія Історію стерто - Експорт завершено - Імпорт завершено + Експортування завершено + Імпортування завершено Топ 50 - Гарячі новинки + Новинки Деталі - Налаштування звуку + Звукові налаштування Відеопрогравач Тловий програвач @@ -241,7 +241,7 @@ Отримую інформацію… Завантажується запитаний контент Завантажити потоковий файл. - Показати інфо + Показати інформацію Закладки @@ -278,15 +278,15 @@ Сторонні ліцензії Перейти до сайту - Про - Вільний та легковагий стрімінг для Андроїду. - Які б не були Ваші ідеї: переклад, дизайн, легкий чи глобальний рефакторинг - будь-яка допомога завжди у нагоді. Що більше зроблено, то ліпшим NewPipe стає! + Візитівка + Вільний та легковагий стримінґ для Андроїду. + Які б не були Ваші ідеї: переклад, дизайн, легкий чи глобальний рефакторинґ - будь-яка допомога завжди у нагоді. Що більше зроблено, то ліпшим NewPipe стає! Моніторинг витоку памяті вимкнено Усунення вад Нічого нема - Старий вбудований медіа-фреймворк програвач + Старий вбудований медіафреймворковий програвач - Немає переглядів + Перегляди відсутні %s перегляд %s переглядів @@ -299,9 +299,9 @@ © %1$s by %2$s under %3$s Учасники - NewPipe розроблений добровольцями, які витрачають власний час заради вашого задоволення. Допоможіть розробникам зробити NewPipe ще кращим, насолоджуючись філіжанкою кави. + NewPipe розроблений добровольцями, які витрачають власний час заради вашого задоволення. Допоможіть розробникам зробити NewPipe ще ліпшим, насолоджуючись філіжанкою кави. Ваша допомога - Завітайте на офіційний сайт, для отримання більше інформації та новин. + Завітайте на офіційний сайт, аби отримати більше інформацій та новин. Ліцензія NewPipe Прочитати ліцензію @@ -312,16 +312,16 @@ Історія Історія відсутня Елемент видалено - Ви хочете видалити цей елемент з історії пошуку\? - Ви хочете видалити цей елемент з історії переглядів\? - Ви впевнені, що хочете видали всі елементи з історії\? + Чи ви хочете видалити цей елемент з історії пошуку\? + Чи ви хочете видалити цей елемент з історії переглядів\? + Чи ви впевнені, що хочете видали всі елементи з історії\? Програвалося останнім Програвалося найбільше Контент на головній сторінці Порожня сторінка Kiosk - Підписки + Підписання Нове Сторінка каналу Обрати канал @@ -333,18 +333,18 @@ Кіоски Набуває популярності - Фоновий програвач + Тловий програвач Віконний програвач Усунути - Утримуйте, для додавання в чергу - Додати в чергу Фонового відтворення - Додати в чергу для віконного відтворення + Утримуйте, для додавання до черги + Додати до черги тлового відтворення + Додати до черги віконного відтворення Розпочати відтворення звідси - Розпочати відтворення у фоні + Розпочати відтворення тловому програвачеві Розпочати відтворення у вікні звідси - Відкрити меню - Закрити меню + Відкрити шухляду + Закрити шухляду Незабаром тут щось буде ;D @@ -386,7 +386,7 @@ Використовувати неточний пошук Неточний пошук дозволяє програвачеві рухатися позиціями швидше, проте з меншою точністю - Додавати в чергу наступний стрім + Додавати в чергу наступний стрим Автоматично додавати пов\'язаний стрим під час відтворення останнього у черзі без повторювань СИНХРОНІЗАЦІЯ @@ -395,7 +395,7 @@ Неправильна тека Неправильний файл/джерело контенту Файл не існує, або немає дозволу на його запис чи читання - Ім\'я файлу не може бути порожнім + Назва файлу не може бути порожньою Помилка: %1$s Імпортування/Експортування @@ -432,7 +432,7 @@ Відключити аби зупинити завантаження ескізів та заощадити використання ресурсів та пам\'яті. Увімкнення функції призведе до повного очищення кешу зображень Кеш зображень стерто Стерти кеш метаданих - "Видалити всі кешовані дані веб-сторінки " + "Усунути всі кешовані дані вебсторінки " Кеш метаданих стерто Реґулятори швидкісті відтворення Темп @@ -440,7 +440,7 @@ Від\'єднати (може спричинити спотворення) Nightcore Усталено -Стріми недоступні для завантаження +Стрими недоступні для завантаження Переважний спосіб \"відкриття\" Типова дія під час відкриття вмісту — %s @@ -463,8 +463,8 @@ "NewPipe є вільною копілефт програмою: Ви можете використовувати її, поширювати та вдосконалювати за власним розсудом. Зокрема ви можете перерозподіляти та/або змінювати її за умов використання GNU General Public License, опублікованою Free Software Foundation, під 3-ю версією ліцензії, або (на ваш вибір) будь-якою пізнішою версією." Бажаєте імпортувати з налаштуваннями\? - Політика приватності NewPipe\'у - Проект NewPipe дуже серйозно ставиться до вашої приватності. Тому застосунок не збирає ніяких даних без вашої згоди + NewPipe\'ова політика приватності + Проєкт NewPipe дуже серйозно ставиться до вашої приватності. Тому застосунок не збирає ніяких даних без вашої згоди \nПолітика приватності NewPipe пояснює у деталях, які дані було відіслано та збережено, під час відсилання крахового звіту. Читати політику приватності Аби дотриматися Норм загального захисту даних ЄС (General Data Protection Regulation, GDPR), ми просимо звернути вашу увагу на NewPipe\'ову політику приватності. Будь ласка, прочитайте уважно @@ -485,6 +485,6 @@ Канали Плейлисти - Доріжки + Стежки Користувачі From ac2dd81d39d104d91e0b917c35404f23ece7ad78 Mon Sep 17 00:00:00 2001 From: beriain Date: Thu, 15 Nov 2018 15:34:51 +0000 Subject: [PATCH 060/207] Translated using Weblate (Basque) Currently translated at 85.1% (326 of 383 strings) --- app/src/main/res/values-eu/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 1dfc8f059..d73ab7a04 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -298,7 +298,7 @@ "Ireki tiradera " Itxi tiradera - Ez da jarioen erreproduzigailurik aurkitu (VLC instalatu dezakezu) + Ez da jarioen erreproduzigailurik aurkitu (VLC instalatu dezakezu). Beti Behin besterik ez @@ -314,7 +314,7 @@ Informazioa eskuratzen… Kargatzen eskatutako edukia -Deskargatu jario fitxategia. +Deskargatu jario fitxategia Erakutsi informazioa Gogokoak From 6401b5f54de9bd0aec61a9465888ad5b6f931278 Mon Sep 17 00:00:00 2001 From: Viktar Vauchkevich Date: Wed, 14 Nov 2018 17:56:01 +0000 Subject: [PATCH 061/207] Translated using Weblate (Belarusian) Currently translated at 85.1% (326 of 383 strings) --- app/src/main/res/values-be/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 8a1d35df3..9be24b972 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -3,14 +3,14 @@ %1$s праглядаў Апублікавана %1$s Патокавы плэер не знойдзены. Усталяваць VLC? - Патокавы плэер не знойдзены (вы можаце ўсталяваць VLC) + Патокавы плэер не знойдзены (вы можаце ўсталяваць VLC). Усталяваць Скасаваць Адкрыць у браўзэры Адкрыць у асобным акне Падзяліцца Спампаваць - Загрузка файла прамой трансляцыі. + Загрузка файла прамой трансляцыі Пошук Налады Магчыма, вы мелі на ўвазе: %1$s? From 6dbf2263651f2cdee31621fdea6085c4630e57ad Mon Sep 17 00:00:00 2001 From: Marc Riera Date: Tue, 13 Nov 2018 21:13:41 +0000 Subject: [PATCH 062/207] Translated using Weblate (Catalan) Currently translated at 99.5% (381 of 383 strings) --- app/src/main/res/values-ca/strings.xml | 52 +++++++++++++------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 5f1dfafa7..30556e832 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -12,12 +12,12 @@ Mostra la informació Subscripcions - Adreces d\'interès + Llistes de reproducció desades a les adreces d\'interès Novetats Ruta de baixada dels vídeos - Ruta de baixada dels fitxers d\'àudio + Carpeta de baixada dels fitxers d\'àudio Reproducció automàtica Resolució per defecte Àudio @@ -42,7 +42,7 @@ Contingut Desactiva les restriccions per edat Vídeo restringit per edat. Podeu permetre aquesta mena de continguts des de la configuració. - en directe + EN DIRECTE Baixades Baixades Tot @@ -114,9 +114,9 @@ Reproductor emergent Demana-ho sempre - Crea una nova llista de reproducció - Elimina la llista de reproducció - Canvia el nom de la llista de reproducció + Crea una llista de reproducció + Elimina + Canvia el nom Nom Afegeix a una llista de reproducció Importa @@ -131,9 +131,9 @@ %1$s reproduccions Publicat el %1$s No s\'ha trobat un reproductor de fluxos. Voleu instal·lar el VLC? - No s\'ha trobat cap reproductor de fluxos (podeu instal·lar el VLC per reproduir-lo) + No s\'ha trobat cap reproductor de fluxos (podeu instal·lar el VLC per reproduir-lo). Obre en mode emergent - Baixa el fitxer de vídeo. + Baixa el fitxer de vídeo Volíeu dir: %1$s? Comparteix-ho amb rotació @@ -150,7 +150,7 @@ Ruta on es desaran els vídeos baixats Introduïu una ruta de baixada per als vídeos - Ruta on es desaran els fitxers d\'àudio baixats + Els fitxers d\'àudio baixats es desaran aquí Introduïu una ruta de baixada per als fitxers d\'àudio Reprodueix un vídeo quan el NewPipe s\'executa des d\'una altra aplicació @@ -176,7 +176,7 @@ Mostra suggeriments durant la cerca Historial de cerca Reprèn la reproducció després d\'una interrupció (per exemple, una trucada) - Vídeo següent + Següent Mostra el vídeo següent i similars País per defecte dels continguts Llengua per defecte dels continguts @@ -196,7 +196,7 @@ Contingut no disponible Blocat per la GEMA No s\'ha pogut configurar el menú de baixades - Això és una emissió en directe, que encara no és compatible. + Les emissions en directe encara no són compatibles No s\'ha pogut obtenir cap vídeo No s\'ha pogut carregar la imatge Ha fallat l\'aplicació o la interfície d\'usuari @@ -206,9 +206,9 @@ L\'URL no és vàlid No s\'ha trobat cap flux de vídeo No s\'ha trobat cap flux d\'àudio - Directori no vàlid - Fitxer o font de contingut no vàlid - El fitxer no existeix o no teniu permisos suficients per llegir-lo o escriure-hi + La carpeta no existeix + El fitxer o la font de contingut no existeix + El fitxer no existeix o no teniu permisos per llegir-lo o escriure-hi El nom del fitxer no pot estar en blanc S\'ha produït un error: %1$s Informa de l\'error per correu electrònic @@ -301,16 +301,16 @@ S\'està carregant el contingut seleccionat Voleu eliminar aquesta llista de reproducció? - No s\'ha pogut eliminar la llista de reproducció + No s\'ha pogut eliminar la llista de reproducció. Importació i exportació Controls de la velocitat de reproducció Tempo To Toqueu el botó de cerca per començar - En algunes resolucions NO hi haurà àudio quan aquesta opció estigui activada + Elimina l\'àudio en algunes resolucions Reproductor d\'àudio extern - Desactiveu-ho per evitar que es carreguin les miniatures i estalviar dades i memòria. Si canvieu aquesta opció, s\'esborrarà la memòria cau d\'imatges tant de la memòria com de l\'emmagatzematge + Desactiveu-ho per evitar que es carreguin les miniatures i estalviar dades i memòria. Si canvieu aquesta opció, s\'esborrarà la memòria cau d\'imatges tant de la memòria com de l\'emmagatzematge. Emmagatzema les cerques localment Registra els vídeos visualitzats Reprèn automàticament @@ -326,7 +326,7 @@ Canvia al mode emergent Canvia al mode principal - Això sobreescriurà l\'historial i les subscripcions actuals + Sobreescriu l\'historial i les subscripcions actuals S\'està recuperant el reproductor després de l\'error Ho sentim, això no hauria d\'haver ocorregut. Arrossegueu per a reordenar la llista @@ -358,8 +358,8 @@ Encara no us heu subscrit a cap canal Novetats Manteniu premut per afegir a la cua - Reprodueix en segon pla - Reprodueix en mode emergent + Reprodueix aquí en segon pla + Reprodueix aquí en mode emergent Defineix com a miniatura de la llista de reproducció @@ -367,8 +367,8 @@ Elimina l\'adreça d\'interès S\'ha creat la llista de reproducció - Afegeix a la llista de reproducció - S\'ha canviat la miniatura de la llista de reproducció + S\'ha afegit a la llista de reproducció + S\'ha canviat la miniatura de la llista de reproducció. Sense subtítols Ajusta @@ -390,7 +390,7 @@ Desvincula (pot provocar distorsió) Nightcore Elimina totes les dades de llocs web de la memòria cau - Afegeix a la cua un vídeo relacionat quan es reprodueix l\'últim vídeo en una cua sense repetició + Afegeix a la cua un vídeo relacionat quan es reprodueix l\'últim vídeo en una cua sense repetició. Mostra els missatges d\'ajuda Mostra un missatge d\'ajuda quan el botó de mode en segon pla o emergent estigui premut a la pàgina de detalls d\'un vídeo Què ha passat:\\nPetició:\\nIdioma del contingut:\\nServei:\\nHora GMT:\\nPaquet:\\nVersió:\\nVersió del SO: @@ -425,17 +425,17 @@ No hi ha vídeos que es puguin baixar Subtítols - Modifica la mida del text i el fons dels subtítols. Cal reiniciar l\'aplicació per aplicar els canvis + Modifica la mida del text i el fons dels subtítols. Cal reiniciar l\'aplicació per aplicar els canvis. No s\'ha trobat cap aplicació que pugui reproduir aquest fitxer Esborra l\'historial de reproduccions Esborra l\'historial dels vídeos que s\'han reproduït - Esborra tot l\'historial de reproduccions. + Voleu esborrar tot l\'historial de reproduccions\? S\'ha esborrat l\'historial de reproduccions. Esborra l\'historial de cerca Esborra l\'historial de paraules cercades - Esborra tot l\'historial de cerca. + Voleu esborrar tot l\'historial de cerca\? S\'ha esborrat l\'historial de cerca. S\'ha esborrat 1 element. From 2f274d5f52511950099bc52742b10247cff504a9 Mon Sep 17 00:00:00 2001 From: ezjerry liao Date: Fri, 16 Nov 2018 12:18:06 +0000 Subject: [PATCH 063/207] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 70 +++++++++++----------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 4b5c9af37..c1f70a6fe 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -33,7 +33,7 @@ 明亮 下載 - 下一部影片 + 下一部 顯示「下一部」與「相關」的影片 不支援此網址 預設內容語言 @@ -51,15 +51,15 @@ 不喜歡 使用 Tor (實驗性) 強迫下載流量繞經 Tor 以加強隱私 (暫未支援串流影片)。 - 音訊下載路徑 - 已下載音訊的存放路徑 + 音訊下載資料夾 + 已下載的音訊存放存儲在這裡\t 輸入音訊檔案的下載路徑 無法建立下載目錄「%1$s」 已建立下載目錄「%1$s」 輕觸搜尋按鈕開始使用 NewPipe 以懸浮視窗開啟 - 勾選後,部分解析度的影片將沒有聲音 + 移除某些解析度的音訊 NewPipe 懸浮視窗模式 背景播放 自動播放 @@ -79,8 +79,8 @@ 懸浮視窗 以懸浮視窗播放中 內容 - 顯示具有年齡限制的內容 - 有年齡限制的影片。可於設定中選擇允許此種內容。 + 年齡限制內容 + 顯示有年齡限制的影片。可於「設定」中選擇允許此種內容。 下載 下載 錯誤回報 @@ -103,7 +103,7 @@ 內容無法使用 已被 GEMA 阻擋 無法設定下載選單 - 尚未支援現場直播。 + 尚未支援現場串流 無法取得串流 無法載入圖片 應用程式或界面已停止運作 @@ -161,7 +161,7 @@ 懸浮視窗 - 現場直播 + 直播 訂閱 已訂閱 已取消訂閱頻道 @@ -234,13 +234,13 @@ 歷史紀錄 已搜尋 已觀看 - 歷史紀錄已被停用 + 歷史紀錄已關閉 歷史紀錄 沒有歷史紀錄 已清除歷史紀錄 項目已刪除 確定要刪除此項搜尋紀錄嗎? -找不到串流播放器(您可以安裝 VLC 播放) +找不到串流播放器(您可以安裝 VLC 播放)。 顯示「長按以新增」提示 預設內容國家 服務 @@ -270,7 +270,7 @@ 網站 匯入資料庫 匯出資料庫 - 將覆蓋您目前的歷史記錄和訂閱 + 覆蓋您目前的歷史記錄和訂閱 匯出歷史記錄、訂閱和播放清單 回饋 如欲了解更多有關 NewPipe 的資訊和新聞,請造訪我們的網站。 @@ -283,8 +283,8 @@ 選擇頻道 尚未訂閱任何頻道 選擇互動導覽 - 匯出已完成 - 匯入已完成 + 已匯出 + 已匯入 無有效的 ZIP 檔案 警告:無法匯入所有檔案。 這將覆蓋您目前的設定。 @@ -298,11 +298,11 @@ 移除 詳細資訊 音訊設定 - 新增至背景佇列 - 新增至懸浮視窗佇列 + 當背景時佇列 + 在新懸浮視窗時佇列 從這裡開始播放 - 從這裡開始以背景播放 - 從這裡開始以懸浮視窗播放 + 當背景時從這裡開始 + 懸浮視窗時從這裡開始 長按以新增至佇列 NewPipe 由志願者所開發,他們耗費時間務求為您帶來最佳體驗。現在是時候回過頭來,讓我們的開發人員能夠在使 NewPipe 更臻完美的同時,享受一杯咖啡。 @@ -316,10 +316,10 @@ 正在取得資訊… 正在載入要求的內容 -下載串流檔案。 +下載串流檔案 顯示資訊 - 書籤 + 書籤已加入播放清單 新增至 @@ -338,9 +338,9 @@ 總是詢問 - 建立新的播放清單 - 刪除播放清單 - 重新命名播放清單 + 新的播放清單 + 刪除 + 重新命名 名稱 新增至播放清單 設為播放清單縮圖 @@ -348,11 +348,11 @@ 將播放清單加入書籤 移除書籤 - 您是否要刪除此播放清單? + 刪除此播放清單? 已建立播放清單 - 已新增至播放清單 - 播放清單縮圖已更改 - 無法刪除播放清單 + 已增至播放清單 + 播放清單縮圖已更改。 + 無法刪除播放清單。 沒有字幕 @@ -382,12 +382,12 @@ 使用粗略但快速的尋找 粗略的尋找能讓播放器以降低的精確度更快找到影片的進度位置 自動將下一部影片新增至佇列 - 在非重複播放佇列中最後一個串流開始播放時,自動新增相關串流 + 在非重複播放佇列中最後一個串流開始播放時,自動新增相關串流。 同步 檔案 - 無效的目錄 + 無效的資料夾 無效的檔案/內容來源 檔案名稱不能留空 發生錯誤: %1$s @@ -406,7 +406,7 @@ 之前的匯出 - 檔案不存在或權限不足以讀取或寫入該檔案 + 檔案不存在或讀取或寫入權限不足 透過下載匯出檔案來匯入您的 YouTube 訂閱: \n \n1. 移至此網址:%1$s @@ -424,7 +424,7 @@ \n3. 當被詢問時登入 \n4. 複製您被重新導向到的個人設定檔網址。 載入縮圖 - 停用後 NewPipe 將不再載入縮圖,減少數據和儲存空間的用量。改變此選項時將清除記憶體和磁碟上的縮圖快取 + 當關閉時不載入縮圖,減少數據和儲存空間的用量。改變時將清除記憶體和磁碟上的縮圖快取。 已清除圖片快取 清除快取中介資料 移除所有網頁的快取資料 @@ -441,17 +441,17 @@ 沒有可供下載的串流 字幕 - 調整播放器字幕文字大小與背景樣式。必須重新啟動應用程式才會生效 + 調整播放器字幕文字大小與背景樣式。必須重新啟動應用程式才會生效。 未安裝可播放此檔案的應用程式 清除觀看歷史 刪除播放過的串流歷史 - 刪除所有觀看歷史。 + 刪除所有觀看歷史記錄? 觀看歷史已刪除。 清除搜尋歷史 刪除搜尋關鍵字的歷史 - 刪除所有搜尋歷史。 + 刪除所有搜尋歷史記錄? 搜尋歷史已刪除。 已刪除 1 個項目。 @@ -468,8 +468,8 @@ 拒絕 沒有限制 使用行動網路時限制解析度 - 切換應用程式時最小化 - 從主影片播放器切換到其他應用程式時要執行的動作 — %s + 切換 app 時最小化 + 從主影片播放器切換到其他 app 時要執行的動作 — %s 最小化為背景播放器 最小化為彈出式播放器 From 09312ecd1dbe2cfc836927594e943a44a9483684 Mon Sep 17 00:00:00 2001 From: wellinkstein Date: Thu, 15 Nov 2018 20:17:48 +0000 Subject: [PATCH 064/207] Translated using Weblate (French) Currently translated at 98.2% (376 of 383 strings) --- app/src/main/res/values-fr/strings.xml | 68 +++++++++++++------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 2f93de331..44ebf2c96 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -27,10 +27,10 @@ WebM — format libre M4A — meilleure qualité Télécharger - Vidéo suivante - Afficher les vidéos \"suivantes\" et \"similaires\" - Lien non pris en charge - Vidéo et audio + Suivant + Afficher les vidéos \"Suivantes\" et \"Similaires\" + URL non supportée + Vidéo & audio Autre Miniature d’aperçu vidéo @@ -53,8 +53,8 @@ Apparence Erreur réseau - Chemin de téléchargement audio - Chemin de stockage des fichiers audio téléchargés + Dossier de téléchargement audio + L\'audio téléchargé est stocké ici Entrez le chemin de téléchargement des fichiers audio Impossible de créer le répertoire de téléchargement « %1$s » @@ -66,13 +66,13 @@ Désolé, des erreurs se sont produites. Contenu - Afficher contenu avec limite d\'âge - Direct + Contenu avec limite d\'âge + EN DIRECT Impossible de charger toutes les miniatures Impossible de déchiffrer la signature URL de la vidéo Impossible d\'analyser complètement le site web - Il s\'agit d\'un direct, non supporté pour le moment. + Les flux en direct ne sont pas encore pris en charge Désolé, une erreur inattendue s\'est produite. Lire la vidéo lorsque NewPipe est appelée par une autre application Signaler l\'erreur par e-mail @@ -89,7 +89,7 @@ Autorisation d\'accès au stockage refusée Faites une recherche pour commencer Lecture automatique - Vidéo soumise à une limite d\'âge. Autoriser ce type de contenu est possible depuis les paramètres. + Afficher les vidéos soumises à une limite d\'âge. Autoriser ce type de contenu est possible depuis les \"Paramètres\". Rapport utilisateur SIGNALER @@ -168,7 +168,7 @@ B - Certaines résolutions n\'auront PAS de son si cette option est activée + Supprime l\'audio à CERTAINES résolutions Utiliser les gestes pour contrôler la luminosité et le volume du lecteur Suggestions de recherche Afficher les suggestions lors d\'une recherche @@ -229,7 +229,7 @@ Reprendre sur le gain de focus Lecteur Comportement - Historique et cache + Historique & cache Liste de lecture Notifications pour les lecteurs \"Arrière-plan\" et \"Fenêtre\" de NewPipe @@ -273,13 +273,13 @@ Impossible de jouer ce flux Une erreur irrécupérable du lecteur s\'est produite - Encore aucune chaîne souscrite + Pas encore d\'abonnements de chaînes Lecteur en arrière-plan Lecteur en fenêtré Retirer Détails Paramètres audio - Afficher l\'aide « maintenir pour ajouter » + Afficher l\'astuce « Maintenir pour ajouter » Afficher l\'aide \"Appui long pour mettre en file d\'attente\" en appuyant sur les boutons \"Arrière-plan\" et \"Fenêtre\" sur la page de détails d\'une vidéo [Inconnu] @@ -292,7 +292,7 @@ Appui long pour mettre en file d\'attente Mettre en file d\'attente en arrière-plan Mettre en file d\'attente en fenêtré - Démarrer ici + Commencer la lecture ici Démarrer ici en arrière-plan Démarrer ici en fenêtré Donner @@ -309,7 +309,7 @@ Service Ouvrir le menu Fermer le menu - Aucun lecteur de flux trouvé (vous pouvez installer VLC pour le lire) + Aucun lecteur de flux trouvé (vous pouvez installer VLC pour le lire). Toujours Une seule fois @@ -327,10 +327,10 @@ Chargement du contenu Importer les données Exporter les données - Cela effacera vos données actuelles + Remplace votre historique et vos abonnements actuels Exporter votre historique, vos abonnements et vos listes de lecture - Exportation terminée - Importation terminée + Exporté + Importé Aucun fichier ZIP valide Avertissement: Impossible d\'importer tous les fichiers. Cela effacera vos paramètres actuels @@ -355,9 +355,9 @@ Toujours demander - Créer une nouvelle playlist - Supprimer la playlist - Renommer la playlist + Nouvelle liste de lecture + Supprimer + Renommer Nom Ajouter à la playlist Enregistrer la playlist en local @@ -365,11 +365,11 @@ Marquer cette playlist Retirer la marque - Voulez-vous supprimer cette playlist ? + Supprimer cette liste de lecture \? Liste de lecture créée - Ajoutée à la playlist - Modification de la playlist réussie - Impossible de supprimer la liste de lecture + Ajouté à la liste de lecture + Miniature de la liste de lecture changée. + Impossible de supprimer la liste de lecture. Aucuns sous-titres @@ -391,8 +391,8 @@ Données en cache effacées Fichier - Dossier non valide - Fichier/source du contenu non valide + Aucun dossier de ce type + Aucun fichier/contenu de ce type Le fichier n\'existe pas ou il n\'est pas permis de le lire Le nom du fichier ne peut être vide Une erreur s\'est produite: %1$s @@ -403,7 +403,7 @@ Télécharger le fichier de flux Vidéo suivante en file d\'attente - Ajout automatique d\'un morceau suggéré lors de la lecture du dernier morceau dans une file d\'attente non bouclée + Ajout automatique d\'un morceau suggéré lors de la lecture du dernier morceau dans une file d\'attente non bouclée. Débogage Remplir Générés automatiquement @@ -413,7 +413,7 @@ Signaler les erreurs de développement hors cycle Forcer le signalement des exceptions Rx qui surviennent hors activité - Importer/Exporter + Importer/exporter Importer Importer de Exporter vers @@ -454,7 +454,7 @@ Aucun flux disponible au téléchargement Sous-titres - Modifier la taille du texte et les styles d\'arrière-plan du lecteur. Redémarrage requis pour prendre effet + Modifier la taille du texte et les styles d\'arrière-plan du lecteur. Redémarrage requis pour prendre effet. Ton Nightcore @@ -462,11 +462,11 @@ Effacer l\'historique Supprimer l\'historique des flux regardés - Supprimer tout l\'historique regardé. + Supprimer tout l\'historique regardé\? Voir l’historique supprimé. Supprimer l\'historique des recherches Supprimer l\'historique de recherche par mot clef - Supprimer tout l\'historique de recherche. + Supprimer tout l\'historique de recherche \? Historique des recherches effacé. 1 élément supprimé. @@ -492,7 +492,7 @@ Réinitialiser Minimiser lors du changement d\'application - Action lors du changement d\'applications depuis le lecteur vidéo —%s + Action lors du changement d\'application depuis le lecteur vidéo —%s Aucune Minimiser pour lire en arrière plan Minimiser vers lecteur PopUp From ce493d1ae261db7fce9799314f9f511f8a9956b3 Mon Sep 17 00:00:00 2001 From: Emanuele Petriglia Date: Tue, 13 Nov 2018 19:59:46 +0000 Subject: [PATCH 065/207] Translated using Weblate (Italian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-it/strings.xml | 76 +++++++++++++------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 8499e8f06..55112098d 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -27,8 +27,8 @@ WebM — formato libero M4A — miglior qualità Scarica - Prossimo video - Mostra \'prossimi\' video e video \'simili\' + Prossimo + Mostra video \'Prossimo\' e \'Simili\' URL non supportato Lingua predefinita per i contenuti Video e Audio @@ -43,7 +43,7 @@ Usa un lettore video esterno Usa un lettore audio esterno - Percorso degli audio scaricati + Cartella degli audio scaricati Cartella in cui salvare gli audio scaricati Inserisci la cartella per gli audio scaricati @@ -69,17 +69,17 @@ Impossibile impostare il menu di download - Questo è uno stream in diretta, il quale non è ancora supportato. + I contenuti in diretta non sono al momento supportati Contenuti - Mostra contenuti vietati ai minori - Questo video è riservato ad un pubblico maggiorenne. Per accedervi, abilita \"Mostra contenuti vietati ai minori\" nelle impostazioni. + Contenuti vietati ai minori + Mostra video riversati ad un pubblico maggiorenne. Si possono abilitare dalle \"Impostazioni\". Tocca Cerca per iniziare Riproduzione automatica Riproduci i video quando NewPipe viene aperto da un\'altra app - in diretta + IN DIRETTA Impossibile analizzare completamente il sito web Impossibile ottenere alcun flusso @@ -130,7 +130,7 @@ Cosa:\\nRichiesta:\\nLingua contenuto:\\nServizio:\\nOrario GMT:\\nPacchetto:\\nVersione:\\nVersione SO: reCAPTCHA - reCAPTCHA + Risoluzione reCAPTCHA Nero @@ -155,7 +155,7 @@ Disattivato Usa il vecchio lettore multimediale -Alcune risoluzioni NON riprodurranno l\'audio se questa opzione viene abilitata +Non riproduce l\'audio con ALCUNE risoluzioni In sottofondo Popup @@ -272,14 +272,14 @@ Pagina feed Pagina del canale Seleziona un canale - Non sei ancora iscritto a nessun canale + Nessuna iscrizione ad un canale Seleziona una locandina Locandina Tendenze Top 50 New & hot -Mostra il suggerimento \"tenere premuto per aggiungere video alla coda\" +Mostra il suggerimento \"Tenere premuto per aggiungere video alla coda\" Mostra suggerimento quando il pulsante per la riproduzione popup o in sottofondo viene premuto nella pagina dei dettagli del video In coda al lettore multimediale in sottofondo In coda al lettore multimediale a comparsa @@ -290,18 +290,18 @@ Ripristino dell\'errore del lettore multimediale Riproduzione in sottofondo - Riproduzione in modalità popup + Riproduzione in modalità a comparsa Rimuovi Dettagli Impostazioni audio - Tieni premuto per aggiungere alla coda + Tenere premuto per aggiungere alla coda [Sconosciuto] In coda in sottofondo - In coda nel Popup + In coda nel riproduttore a comparsa Inizia la riproduzione qui Inizia qui in sottofondo - Inizia qui nel Popup + Inizia qui nel riproduttore a comparsa Dona Sito web Visita il sito web di NewPipe per maggiori informazioni e novità. @@ -316,7 +316,7 @@ Servizio Apri il menu Chiudi il menu - Nessun lettore multimediale trovato (puoi installare VLC per riprodurlo) + Nessun lettore multimediale trovato (puoi installare VLC per riprodurlo). Sempre Solo una volta @@ -334,7 +334,7 @@ Caricamento del contenuto richiesto Importa database Esporta database - Sovrascriverà la cronologia corrente e le iscrizioni + Sovrascrive la cronologia corrente e le iscrizioni Esporta la cronologia, le iscrizioni e le playlist Esportazione completa Importazione completa @@ -342,10 +342,10 @@ Attenzione: Impossibile importare tutti i file. Questa operazione sostituirà le tue impostazioni attuali. - Scarica il video. + Scarica il video Mostra informazioni - Segnalibri + Scalette preferite Aggiungi a @@ -364,9 +364,9 @@ Chiedi sempre - Crea nuova playlist - Elimina playlist - Rinomina playlist + Nuova scaletta + Elimina scaletta + Rinomina scaletta Nome Aggiunti alla playlist Imposta come miniatura della playlist @@ -374,11 +374,11 @@ Segnalibri playlist Rimuovi segnalibro - Vuoi eliminare questa playlist? + Eliminare questa scaletta\? Playlist creata - Aggiunti alla playlist - Miniatura della playlist cambiata - Impossibile eliminare la playlist + Aggiunti alla scaletta + Miniatura della scaletta cambiata. + Impossibile eliminare la scaletta. No sottotitoli @@ -404,18 +404,18 @@ Usa la ricerca rapida ma imprecisa La ricerca imprecisa permette al lettore multimediale di spostarsi nelle posizioni più velocemente con una precisione ridotta Metti in coda automaticamente il prossimo flusso - Aggiungi automaticamente un flusso correlato quando è in corso la riproduzione dell\'ultimo flusso in una coda non ripetitiva + Aggiungi automaticamente un flusso correlato quando è in corso la riproduzione dell\'ultimo flusso in una coda non ripetitiva. SINCRONIZZAZIONE File - Cartella non valida - Fonte del contenuto o file non valido - Il file non esiste o non si hanno i permessi sufficienti per leggerlo o scriverci + Nessuna cartella + Nessun file o cartella che contiene sorgenti + Il file non esiste o non si hanno i permessi sufficienti di scrittura o lettura Il nome del file non può essere vuoto Si è verificato un errore: %1$s - Importa/Esporta + Importa/esporta Importa Importa da Esporta in @@ -446,7 +446,7 @@ \n \nVuoi continuare? Carica miniature - Disabilita per interrompere il caricamento delle miniature, la loro archiviazione e l\'utilizzo della memoria. La modifica di questa opzione cancellerà la cache delle immagini in memoria e sul disco + Disabilita per interrompere il caricamento delle miniature, la loro archiviazione e l\'utilizzo della memoria. La modifica di questa opzione cancellerà la cache delle immagini in memoria e sul disco. Pulizia della cache delle immagini completata Pulisci la cache dei metadati Rimuovi tutti i dati delle pagine web memorizzati nella cache @@ -463,21 +463,21 @@ Azione predefinita all\'apertura del contenuto — %s Sottotitoli - Modifica la dimensione e gli stili di sfondo dei sottotitoli. Richiede il riavvio dell\'app per rendere effettive le modifiche + Modifica la dimensione e gli stili di sfondo dei sottotitoli. Per applicare le modifiche è richesto un riavvio. Nessuna app installata per riprodurre questo file Pulisci cronologia visualizzazioni Elimina la cronologia dei flussi riprodotti - Elimina l\'intera cronologia visualizzazioni. + Elimina l\'intera cronologia delle visualizzazioni\? Cronologia visualizzazioni eliminata. Pulisci cronologia delle ricerche Cancella la cronologia dei termini di ricerca - Elimina l\'intera cronologia delle ricerche. + Elimina l\'intera cronologia delle ricerche\? Cronologia delle ricerche eliminata. 1 elemento eliminato. - NewPipe è un software libero con licenza copyleft: puoi usarlo, studiarlo, condividerlo e migliorarlo a tuo piacimento. In particolare, è possibile ridistribuirlo e/o modificarlo secondo i termini della GNU General Public License pubblicata dalla Free Software Foundation, sia nella versione 3 della Licenza, sia (a propria discrezione) in qualsiasi versione successiva. + NewPipe è un software libero con licenza copyleft: si può utilizzarlo, studiarlo, condividerlo e migliorarlo a proprio piacimento. In particolare, è possibile ridistribuirlo e/o modificarlo secondo i termini della GNU General Public License pubblicata dalla Free Software Foundation, sia nella versione 3 della Licenza, sia (a propria discrezione) in qualsiasi versione successiva. Vuoi anche importare le impostazioni? Informativa sulla privacy @@ -495,8 +495,8 @@ Step Reset - Minimizza al cambio applicazione - Azione quando si passa ad un\'altra applicazione dal lettore video principale — %s + Minimizza al cambio dell\'applicazione + Azione quando si passa ad un\'altra app dal lettore video principale — %s Nessuna Minimizza al lettore in sottofondo Minimizza al lettore popup From 0d1901cfe5d882cceb2c5b58b581a6eb36a6bef5 Mon Sep 17 00:00:00 2001 From: WaldiS Date: Wed, 14 Nov 2018 08:34:22 +0000 Subject: [PATCH 066/207] Translated using Weblate (Polish) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-pl/strings.xml | 86 +++++++++++++------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a1b844b1a..008190fff 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -22,8 +22,8 @@ Ścieżka zapisu pobranych wideo Podaj ścieżkę zapisu wideo - Ścieżka zapisu audio - Ścieżka zapisu pobranych audio + Folder pobierania audio + Pobrany dźwięk jest przechowywany tutaj Podaj ścieżkę zapisu audio Autoodtwarzanie @@ -42,9 +42,9 @@ Jasny Pobrane - Następny film + Następny Pokaż \'następne\' i \'podobne\' filmy - URL nieobsługiwany + Nieobsługiwany adres URL Domyślny język zawartości Wideo i audio Wygląd @@ -52,8 +52,8 @@ Odtwarzanie w tle Odtwórz Zawartość - Pokaż zawartość z ograniczeniem wieku - Film z ograniczeniami wiekowymi. Najpierw zezwól na filmy z ograniczeniem wiekowym w ustawieniach. + Treści z ograniczeniem wiekowym + Pokaż film z ograniczeniami wiekowymi. Dopuszczenie takiego materiału jest możliwe w \"Ustawieniach\". Na żywo Pobrane Pobrane @@ -68,7 +68,7 @@ Zawartość niedostępna Zablokowane przez GEMA Nie można ustawić menu pobierania - To jest film NA ŻYWO. Te nie są jeszcze wspierane. + Transmisje na żywo nie są jeszcze obsługiwane Nie można otrzymać żadnego strumienia Przepraszamy, to nie powinno mieć miejsca. Zgłoś błąd przez e-mail @@ -109,7 +109,7 @@ Nazwa pliku Wątki Błąd - Serwer niewspierany + Nieobsługiwany serwer Plik już istnieje Zniekształcony URL lub brak internetu Pobieranie NewPipe @@ -123,10 +123,10 @@ (Eksperymentalne) Wymuś pobieranie przez Tora dla zwiększonej prywatności (strumieniowanie wideo nie jest jeszcze wspierane). Start CAPTCHA - Rozwiąż reCAPTCHA - Prośba o reCAPTCHA + Wyzwanie reCAPTCHA + Wymagane wyzwanie dotyczące reCAPTCHA - Niektóre rozdzielczości nie będą miały dźwięku, jeśli ta opcja jest włączona + Usuwa dźwięk w niektórych rozdzielczościach W tle Domyślna rozdzielczość dla trybu okienkowego Pokaż wyższe rozdzielczości @@ -194,7 +194,7 @@ Subskrybujesz Anulowano subskrypcję kanału Nie można zmienić subskrypcji - Nie można uaktualnić subskrypcji + Nie można zaktualizować subskrypcji Główna Subskrypcje @@ -210,7 +210,7 @@ Powiadomienia NewPipe - Powiadomienia dla odtwarzacza NewPipe w tle i w okienku + Powiadomienia dla graczy w tle i wyskakujących okien NewPipe Współautorzy Historia @@ -229,7 +229,7 @@ Brak wyników Brak wyświetleń - Pokaż wskazówkę „Przytrzymaj, aby dodać” + Pokaż wskazówkę \"Przytrzymaj, aby dodać\" Pokaż wskazówkę podczas naciśnięcia odtwarzania na stronie szczegółów filmu W kolejce odtwarzania w tle W kolejce odtwarzania okienkowego @@ -241,7 +241,7 @@ Wystąpił nieodwracalny błąd odtwarzacza Odzyskiwanie po błędzie odtwarzacza - Nic tu nie ma. Słychać świerszcze… + Nic tu nie ma. Słychać świerszcze Brak subskrybentów @@ -280,14 +280,14 @@ Strona kanału Strona kanału Wybierz kanał - Brak subskrybowanych kanałów + Brak subskrypcji kanałów Wybierz „kiosk” „Kiosk” Na czasie 50 najlepszych Nowe i gorące - Odtwarzacz w tle + Odtwarzanie w tle Odtwarzacz w trybie okienkowym Usuń Szczegóły @@ -295,10 +295,10 @@ Przytrzymaj, aby zakolejkować Kolejkuj w tle Kolejkuj w okienku - Odtwórz teraz + Zacznij odtwarzać tutaj Odtwórz w tle - Odtwórz w okienku -Nie znaleziono odtwarzacza strumieniowego (żeby odtworzyć, możesz zainstalować VLC) + Zacznij tutaj w nowym wyskakującym okienku +Nie znaleziono odtwarzacza strumieniowego (żeby odtworzyć, możesz zainstalować VLC). Domyślny kraj zawartości Usługa Zawsze @@ -317,12 +317,12 @@ Informacje… Ładowanie żądanej zawartości -Pobierz plik strumienia. +Pobierz plik strumienia Pokaż informacje Dodaj do - Zakładki + Ulubione playlisty Debugowanie Odtwarzaj w okienku @@ -330,7 +330,7 @@ Importuj dane Eksportuj dane - Nadpisuje bieżącą historię i subskrypcje + Zastępuje Twoją bieżącą historię i subskrypcje Eksportuje bieżącą historię, subskrypcje i playlisty Przeciągnij, aby zmienić kolejność @@ -345,8 +345,8 @@ Ostatnio odtwarzane Najczęściej odtwarzane - Eksport zakończony - Import zakończony + Eksportowanie + Importowanie Niepoprawne archiwum ZIP Ostrzeżenie: Nie udało się zaimportować wszystkich plików. Nadpisuje obecne ustawienia. @@ -359,9 +359,9 @@ Odtwarzacz w okienku Zawsze pytaj - Utwórz playlistę - Usuń playlistę - Zmień nazwę playlisty + Nowa playlista + Usuń + Zmień Nazwa Dodaj do playlisty Ustaw jako miniaturę playlisty @@ -369,11 +369,11 @@ Dodaj do zakładek Usuń z zakładek - Czy chcesz usunąć playlistę? + Usunąć tę listę odtwarzania\? Playlista utworzona - Dodano do playlisty - Miniaturka playlisty zmieniona - Nie można usunąć playlisty + Playlista + Miniaturka playlisty zmieniona. + Nie można usunąć playlisty. Bez napisów @@ -390,28 +390,28 @@ Włącz LeakCanary Monitorowanie wycieków pamięci może powodować niestabilność aplikacji podczas zrzutu pamięci - Raportuj błędy Out-of-lifecycle + Zgłaszanie błędów poza cyklem życia Wymusza raportowanie niedostarczonych wyjątków Rx poza cyklem życia fragmentu lub aktywności Użyj szybkiego niedokładnego wyszukiwania Szybkie wyszukiwanie pozwala przeskoczyć do wybranej pozycji szybciej, lecz jest mniej precyzyjne Załaduj miniatury - Wyłącz, by aplikacja nie ściągała miniatur. Oszczędza transfer i pamięć. Zmiana tej opcji spowoduje wyczyszczenie pamięci podręcznej miniatur + Po wyłączeniu ładowania bez miniatur, zapisywanie danych i wykorzystanie pamięci. Zmiany usuwają pamięć podręczną zarówno w pamięci, jak i na dysku. Wyczyszczono pamięć podręczną miniatur Wyczyść pamięć podręczną metadanych Wyczyść pamięć podręczną stron Wyczyszczono pamięć podręczną metadanych Automatycznie dołącz kolejny stream - Automatycznie dodaj kolejny powiązany stream w momencie rozpoczęcia odtwarzania ostatniego elementu w niezapętlonej kolejce + Automatycznie dodaj kolejny powiązany stream w momencie rozpoczęcia odtwarzania ostatniego elementu w niezapętlonej kolejce. Plik - Nieprawidłowy katalog - Nieprawidłowy plik/źródło treści - Plik nie istnieje lub brak wystarczających uprawnień do zapisu/odczytu + Nie ma takiego folderu + Brak takiego źródła plików/treści + Plik nie istnieje lub brakuje mu uprawnień do odczytu lub zapisu Nazwa pliku nie może być pusta Wystąpił błąd: %1$s - Import/Eksport + Import/eksport Import Importuj z Eksportuj do @@ -456,15 +456,15 @@ Domyślna akcja podczas otwierania materiału - %s Napisy - Zmień kolor tekstu i tła napisów. Wymaga restartu aplikacji + Zmodyfikuj skalę tekstu napisów i style tła. Wymaga ponownego uruchomienia aplikacji. Wyczyść historię oglądania Usuwa historię odtworzonych strumieni - Usuń całą historię oglądania. + Usunąć całą historię oglądania\? Usunięto historię oglądania. Wyczyść historię wyszukiwania Usuwa historię wyszukiwania słów kluczowych - Usuń całą historię wyszukiwania. + Usunąć całą historię wyszukiwania\? Usunięto historię wyszukiwania. Usunięto jedną pozycję. @@ -492,7 +492,7 @@ Zresetuj Zminimalizuj podczas przełączenia aplikacji - "Akcja podczas przełączenia do innej aplikacji z głównego odtwarzacza — %s" + Akcja po przejściu do innej aplikacji z głównego odtwarzacza wideo — %s Zminimalizuj Zminimalizuj do odtwarzania w tle Zminimalizuj do odtwarzania w okienku From ad02558ade42dd67fc3eb3cf171807eb80a551e9 Mon Sep 17 00:00:00 2001 From: b1a6b64a90 Date: Sun, 18 Nov 2018 12:24:59 +0000 Subject: [PATCH 067/207] Translated using Weblate (French) Currently translated at 99.5% (381 of 383 strings) --- app/src/main/res/values-fr/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 44ebf2c96..2a71af254 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -231,7 +231,7 @@ Comportement Historique & cache Liste de lecture - Notifications pour les lecteurs \"Arrière-plan\" et \"Fenêtre\" de NewPipe + Notifications pour les lecteurs \"arrière-plan\" et \"fenêtre\" de NewPipe Aucun résultat Aucun contenu @@ -383,7 +383,7 @@ Recherche rapide approximative Permettre au lecteur d\'accéder plus rapidement à une position au détriment de la précision - Charger miniatures + Charger les miniatures Désactiver pour arrêter le chargement de toutes les miniatures et sauvegarder les données et l\'utilisation de la mémoire. Modifier cela effacera à la fois le cache d\'image en mémoire et sur disque Images en cache effacées Effacer les données en cache @@ -462,8 +462,8 @@ Effacer l\'historique Supprimer l\'historique des flux regardés - Supprimer tout l\'historique regardé\? - Voir l’historique supprimé. + Supprimer tout l\'historique regardé \? + Historique des vidéos regardées supprimé. Supprimer l\'historique des recherches Supprimer l\'historique de recherche par mot clef Supprimer tout l\'historique de recherche \? @@ -477,8 +477,8 @@ Accepter Refuser -Le projet NewPipe prend votre vie privée très à cœur. Ainsi, l\'appli n\'envoie aucune donnée sans votre consentement. -\nLa politique de vie privée de NewPipe explique en détail quelle donnée est envoyée et stockée quand vous envoyez un rapport de plantage. +Le projet NewPipe prend votre vie privée très à cœur. Ainsi, l\'appli n\'envoie aucune donnée sans votre consentement. +\nLa politique de vie privée de NewPipe explique en détail quelles données sont envoyées et stockées quand vous envoyez un rapport de plantage. Afin de se conformer au Règlement Général sur la Protection des Données (RGPD ou GDPR), nous attirons votre attention sur la politique de vie privée de NewPipe. Merci de la lire attentivement. \nVous devez l\'accepter pour nous envoyer le rapport de bug. Pas de limite From eda4439ee88952581ca449f83855a27783a294c7 Mon Sep 17 00:00:00 2001 From: ssantos Date: Sat, 17 Nov 2018 23:43:19 +0000 Subject: [PATCH 068/207] Translated using Weblate (German) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-de/strings.xml | 70 +++++++++++++------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index cbeb156cc..3143aeccf 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -27,9 +27,9 @@ WebM — freies Format M4A — bessere Qualität Herunterladen - Nächstes Video + Nächstes \'Nächste\' und \'ähnliche\' Videos anzeigen - URL wird nicht unterstützt + Nicht unterstützte URL Video & Audio Bevorzugte Sprache des Inhalts Video-Vorschaubild @@ -46,8 +46,8 @@ (Experimentell) Erzwinge das Herunterladen durch Tor für verbesserte Privatsphäre (Videostream noch nicht unterstützt). Netzwerkfehler - Download-Verzeichnis für Audiodateien - Verzeichnis für heruntergeladene Audiodateien + Download-Ordner für Audiodateien + Heruntergeladene Audiodateien werden hier gespeichert Download-Verzeichnis für Audiodateien angeben Design @@ -66,11 +66,11 @@ Durch die GEMA gesperrt Inhalt - Altersbeschränkte Inhalte anzeigen - Video ist altersbeschränkt. Schalte erst altersbeschränkte Videos in den Einstellungen ein. + Altersbeschränkte Inhalte + Altersbeschränktes Video anzeigen. Das Zulassen dieses Materials ist unter \"Einstellungen\" möglich. Konnte Download-Menü nicht einrichten - Dies ist ein LIVESTREAM. Diese werden noch nicht unterstützt. + Live-Streams werden noch nicht unterstützt Konnte Webseite nicht vollständig analysieren @@ -94,7 +94,7 @@ Einen Fehler melden Anwenderbericht - Live + LIVE „Suchen“ antippen, um zu beginnen Downloads @@ -122,7 +122,7 @@ Abspielen Neue Mission OK - Server nicht unterstützt + Nicht unterstützter Server Konnte Bild nicht laden App/UI abgestürzt Threads @@ -161,7 +161,7 @@ Pop-up Größe und Position des Pop-ups merken -Manche Auflösungen werden KEINE Tonspur haben, wenn diese Option eingeschaltet ist +Entfernt Tonspur bei manchen Auflösungen Letzte Größe und Position des Pop-ups merken Gestensteuerung Helligkeit und Lautstärke mittels Gesten einstellen @@ -216,8 +216,8 @@ Der Verlauf ist leer Verlauf bereinigt -Fehler beim Ändern des Abos - Fehler beim Aktualisieren des Abos +Abonnement konnte nicht geändert werden + Abonnement konnte nicht aktualisiert werden Nach Unterbrechungen (z.B. Telefonaten) Wiedergabe fortsetzen @@ -260,7 +260,7 @@ Möchtest du dieses Element aus dem Suchverlauf löschen? Leere Seite Wähle einen Kanal aus - Noch kein Kanal abonniert + Noch keine Kanalabonnements vorhanden Trends In der Warteschlange des Pop-up-Players Alles abspielen @@ -287,7 +287,7 @@ In der Warteschlange der Hintergrundwiedergabe Neu & Heiß Halten, um zur Wiedergabeliste hinzuzufügen -\"Gedrückt halten, um Tipp hinzuzufügen\" anzeigen +\"Gedrückt halten, um hinzuzufügen\" Tipp anzeigen [Unbekannt] In Warteschlange für Hintergrundwiedergabe @@ -301,7 +301,7 @@ Besuche die NewPipe-Website für weitere Informationen und Neuigkeiten. NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür verwenden, dir die beste Nutzererfahrung zu bieten. Gib etwas zurück, um den Entwicklern zu helfen, NewPipe noch besser machen zu können, während sie sich an einer Tasse Kaffee erfreuen. Service - Keinen Streamplayer gefunden (du kannst VLC installieren, um den Stream abzuspielen) + Keinen Streamplayer gefunden (du kannst VLC installieren, um den Stream abzuspielen). Standard-Land des Inhalts Immer Nur einmal @@ -328,7 +328,7 @@ Gewünschten Inhalt laden Datenbank importieren Datenbank exportieren - Wird deinen Verlauf und deine Abos überschreiben + Überschreibt Ihren aktuellen Verlauf und Ihre Abonnements Verlauf, Abos und Wiedergabelisten exportieren Keine gültige ZIP-Datei Warnung: Nicht alle Dateien konnten importiert werden. @@ -336,7 +336,7 @@ Info anzeigen - Lesezeichen + Wiedergabelisten-Lesezeichen Hinzufügen zu @@ -354,9 +354,9 @@ Immer fragen - Wiedergabeliste erstellen - Wiedergabeliste löschen - Wiedergabeliste umbenennen + Neue Wiedergabeliste + Löschen + Umbenennen Zur Wiedergabeliste hinzufügen Als Symbolbild der Wiedergabeliste festlegen @@ -365,21 +365,21 @@ Diese Wiedergabeliste löschen? Wiedergabeliste erstellt Zur Wiedergabeliste hinzugefügt - Vorschaubild der Wiedergabeliste geändert - Konnte Wiedergabeliste nicht löschen + Vorschaubild der Wiedergabeliste geändert. + Konnte Wiedergabeliste nicht löschen. Keine Untertitel Schriftgröße der Untertitel Abbrechen Normale Schriftgröße - Stream-Datei herunterladen. + Stream-Datei herunterladen Benutze schnelle, ungenaue Suche Mit ungenauem Suchen kann die Abspielposition schneller erreicht werden, aber auf Kosten der Genauigkeit Datei - Ungültiges Verzeichnis - "Datei existiert nicht, oder die Rechte zum Lesen oder Schreiben fehlen" + Ordner existiert nicht + Die Datei existiert nicht oder die Rechte zum Lesen oder Schreiben fehlen Dateiname darf nicht leer sein Ein Fehler ist aufgetreten: %1$s @@ -406,9 +406,9 @@ Entferne alle gecachten Website-Daten Metadatencache gelöscht Debug - Ungültige Datei-/Inhaltsquelle - Export abgeschlossen - Import abgeschlossen + Datei-/Inhaltsquelle existiert nicht + Exportiert + Importiert Name Import/Export Import @@ -421,9 +421,9 @@ Verknüpfung aufheben (kann zu Verzerrungen führen) Nightcore Standard -Deaktiviere diese Option, um das Laden aller Miniaturansichten zu stoppen und Daten und Speicherverbrauch zu sparen. Wenn du dies änderst, wird sowohl der In-Memory- als auch der On-Disk-Image-Cache gelöscht +Wenn ausgeschaltet, werden keine Miniaturansichten geladen, Daten und Speicherverbrauch sparend. Änderungen löschen sowohl Speicher- als auch Image-Caches auf der Festplatte. Nächsten Stream automatisch einreihen - Automatisches Anhängen eines verwandten Streams beim Abspielen des letzten Streams in einer nicht wiederholten Warteschlange + Automatisches Anhängen eines verwandten Streams beim Abspielen des letzten Streams in einer nicht wiederholten Warteschlange. Hier wird bald etwas stehen ;D @@ -456,17 +456,17 @@ Standardaktion beim Öffnen von Inhalten - %s Untertitel - Ändere Textgröße und Hintergrundstil des Untertitels im Player. Wird erst nach Neustart des App wirksam + Ändere Textgröße und Hintergrundstil des Untertitels im Player. Wird erst nach Neustart des App wirksam. Keine App zum Abspielen dieser Datei installiert Verlauf leeren Löscht den Verlauf der abgespielten Streams - Löscht den ganzen Verlauf. + Den ganzen Verlauf löschen\? Verlauf gelöscht. Suchverlauf löschen Lösche Verlauf der Suchschlüsselwörter - Lösche gesamten Suchverlauf. + Den gesamten Suchverlauf löschen\? Suchverlauf gelöscht. 1 Element gelöscht. @@ -483,8 +483,8 @@ \nDu musst den Datenschutzrichtlinien zustimmen, um den Fehlerbericht an uns zu senden. Unbegrenzt Auflösung bei Verwendung mobiler Daten begrenzen - Minimieren beim Anwendungswechsel - Aktion beim Umschalten auf eine andere Anwendung vom Haupt-Videoplayer - %s + Minimieren beim Appwechsel + Aktion beim Umschalten auf eine andere App vom Haupt-Videoplayer - %s Keine Zum Hintergrund-Player minimieren Zum Popup-Player minimieren From 9e7f07e1961b02add08f0f4aecfc4296dda505aa Mon Sep 17 00:00:00 2001 From: Ariel Shulman Date: Sun, 18 Nov 2018 06:51:15 +0000 Subject: [PATCH 069/207] Translated using Weblate (Hebrew) Currently translated at 78.9% (302 of 383 strings) --- app/src/main/res/values-he/strings.xml | 56 ++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 6468079f4..dfd09bf7b 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -17,7 +17,7 @@ בחר דפדפן סיבוב השתמש בנגן סרטים חיצוני - לחלק מהסרטונים עם רזולוציה גבוהה לא יהיה שמע כאשר אפשרות זו פועלת + מסיר שמע בחלק מהרזולוציות השתמש בנגן סרטים חיצוני מצב חלון צץ (NewPipe) רקע @@ -291,8 +291,8 @@ התחל לנגן כאן התחל כאן בנגן הרקע התחל כאן בנגן הצץ -הורדת קובץ הזרמה. - הצגת מידע +הורד קובץ הזרמה + הצג מידע סימניות @@ -312,7 +312,7 @@ העברה לרקע העברה לחלון צץ - לא נמצא נגן לצפייה ישירה (באפשרותך להתקין VLC כדי לתקן זאת) + לא נמצא נגן לצפייה ישירה (באפשרותך להתקין VLC כדי לתקן זאת). מטמון התמונות נוקה נקה מטמון מטא-דאטה מטמון המטא-דאטא נוקה @@ -398,4 +398,52 @@ פעולה זו תדרוס את ההיסטוריה ורשימת המנויים הקיימת. "מחק הסטוריה של ניגונים קודמים. " + ערוצים + רשימות השמעה + שירים + משתמשים + למחוק את כל הסטוריית הצפיה\? + מוחק את היסטוריית מילות החיפוש + למחוק את הסטוריית החיפוש\? + לא נמצא וידאו להזרמה + לא נמצא שמע להזרמה + אין כזו תיקיה + אין כזו תיקיה/תוכן + אירעה שגיאה: %1$s + אין מקור הזרמה זמין להורדה + + מדיניות הפרטיות של NewPipe + פרויקט NewPipe לוקח את הפרטיות שלך ברצינות רבה. לפיכך, האפליקציה אינה אוספת מידע ללא הסכמתך. +\nמדיניות הפרטיות של NewPipe מפרטת במדויק איזה מידע נשמר ונשלח בזמן שאתה מדווח על קריסת האפליקציה. + קרא את מדיניות הפרטיות + NewPipe היא תוכנה חופשית: +\nאתה יכול להשתמש, ללמוד, לשתף ולשפר אותה כרצונך. באופן ספציפי ניתן להפיצה ו/או לשנות אותה תחת עמידה בתנאים של רישיון GNU GPL בגרסה 3, או בכל גרסה עדכנית יותר של רשיון זה. + נוגן לאחרונה + הכי נצפה + + אזהרה: לא ניתן היה לטעון את כל הקבצים. + פעולה זו תדרוס את ההגדרות הקיימות. + האם ברצונך גם לטעון את ההגדרות\? + + פתח מגירה + סגור מגירה + משהו יופיע כאן בקרוב D; + + + פעולת \'פתח\' מועדפת + פעולת ברירת המחדל בעת פתיחת תוכן - %s + + קבע כתמונה של רשימת הניגון + + לא ניתן למחוק רשימת ניגון. + + ללא כותרת + + התאם + כותרות + שינוי גודל כותרת הנגן וסגנוהות הרקע. נדרשת הפעלה מחדש כדי ששינויים אלה יתפסו. + + אפשר LeakCanary + מעקב אחר זליגת זיכרון יכולה לגרום לאפליקציה להיות בלתי זמינה בזמן העתקת תוכן הזכרון לקובץ + From 3f60c961d9f99dc943902af639fc9feea9ebb6a0 Mon Sep 17 00:00:00 2001 From: MadderRagax Date: Sat, 17 Nov 2018 21:05:48 +0000 Subject: [PATCH 070/207] Translated using Weblate (Swedish) Currently translated at 97.9% (375 of 383 strings) --- app/src/main/res/values-sv/strings.xml | 66 +++++++++++++------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index a67dfef45..e3ce88d48 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -15,7 +15,7 @@ Välj webbläsare rotation Använd extern videospelare - Några upplösningar kommer INTE ha ljud när det här alternativet är aktiverat + Tar bort ljud vid VISSA upplösningar Använd extern ljudspelare NewPipe popup-läge Bakgrund @@ -25,8 +25,8 @@ Genväg för att lagra nerladdade videor i Fyll i genvägen som videor ska laddas ner till - Genväg för nerladdning av ljud - Genväg för att lagra nerladdade ljudfiler i + Ljudhämtningsmapp + Nedladdat ljud lagras här Fyll i genvägen som ljudfiler ska laddas ner till Automatiskt spelar en video upp när NewPipe öppnas av en annan app @@ -56,11 +56,11 @@ Ladda ner - Nästa video - Visa \'nästkommande\' och \'liknande\' videor + Nästa + Visa \'Nästkommande\' och \'Liknande\' videor Webbadressen stöds inte Standard innehållsspråk - Video & Ljud + Video & ljud Popup-ruta Utseende Andra @@ -68,9 +68,9 @@ Spelar upp i popup-läge Spela upp Innehåll - Visa åldersbegränsat innehåll + Åldersbegränsat innehåll Videon är åldersbegränsad. Du kan aktivera åldersbegränsade videor i inställningarna. - direkt + LIVE Nerladdningar Nerladdningar Felrapport @@ -92,7 +92,7 @@ Innehållet är inte tillgängligt Blockerat av GEMA Kunde inte ställa in nerladdningsmenyn - Det här är en DIREKTSÄNDNING vilket ännu inte stöds. + Direktsändningar stöds inte än Kunde inte ladda Bild App/AnvändarGränssnitt kraschade Oj, det där skulle inte ha hänt. @@ -127,11 +127,11 @@ Håll koll på videor som du tittat på Fortsätt då fokus fås Fortsätta spela efter avbrott (t.ex. telefonsamtal) - Visa \"håll för att lägga till\" tips + Visa \"Håll för att lägga till\" tips Visa tips när bakgrunds- eller popup-knappen trycks på sidan för videodetaljer Spelare Beteende - Historik & Cacheminne + Historik & cacheminne Tillagd till bakgrunds-spelar kön Tillagd till popup-spelar kön Spellista @@ -204,7 +204,7 @@ Filnamn Trådar Fel - Serveren stöds inte + Servern stöds inte Filen finns redan Felaktig webbadress eller Internet inte tillgängligt NewPipe nedladdning @@ -261,14 +261,14 @@ Flödessida Kanal-sida Välj en kanal - Ingen kanal prenumererad än + Inga kanal prenumerationer ännu Välj en kiosk Kiosk Trend Topp 50 Aktuellt - Bakgrunds-spelare + Bakgrundsspelare Popup-spelare Ta bort Detaljer @@ -286,7 +286,7 @@ För att få mer information och de senaste nyheterna om NewPipe, besök vår webbplats. Visa info - Bokmärken + Bokmärkta Spellistor Lägg till @@ -302,13 +302,13 @@ Byta orientationen Rensa metadatan i cacheminnet - Ingen strömspelare hittades (du kan installera VLC för att spela upp) - Ladda ned sändning. + Ingen strömspelare hittades (du kan installera VLC för att spela upp). + Ladda ned sändning "Inexakt sökning tillåter spelaren att söka positioner snabbare med minskad precision " Ta bort alla cachade webbsidor Metadata cache rensad "Köa nästa ström automatiskt " - Lägg automatiskt till en relaterad ström när du spelar den sista strömmen i en ej upprepad kö + Lägg automatiskt till en relaterad ström när du spelar den sista strömmen i en ej upprepad kö. Standard innehåll land Kanaler Spellistor @@ -320,15 +320,15 @@ Importera databas Exportera databas - Kommer att skriva över din nuvarande historik och prenumerationer + Skriver över din nuvarande historik och prenumerationer Exportera historik, prenumerationer och spellistor Rensa visningshistorik Tar bort historiken för spelade videoklipp - Ta bort hela visningshistoriken. + Ta bort hela visningshistoriken\? Visningshistorik borttagen. Rensa sökhistorik Tar bort historiken för sökta nyckelord - Ta bort hela sökhistoriken. + Ta bort hela sökhistoriken\? Sökhistorik borttagen. Externa spelare stöder inte dessa typer av länkar Ogiltig URL @@ -336,7 +336,7 @@ Inga ljudspår hittades Ogiltig katalog Ogiltig fil/innehålls källa - Filen finns inte eller otillräcklig behörighet att läsa eller skriva till den + Filen finns inte eller behörighet att läsa eller skriva till den saknas Filnamnet får inte vara tomt Ett fel uppstod: %1$s Inga strömmar är tillgängliga för nedladdning @@ -362,8 +362,8 @@ Senast spelade Mest spelade - Exporteringen har slutförts - Importeringen har slutförts + Exporterad + Importerad Ingen giltig ZIP-fil Varning: det gick inte att importera alla filer. Det här kommer skriva över dina nuvarande inställningar. @@ -385,9 +385,9 @@ Hämtar information… Laddar begärt innehåll - Skapa ny spellista - Radera spellista - Byt namn på spellista + Ny spellista + Radera + Byt namn Namn Lägg till i spellistan Använd som spellistans miniatyrbild @@ -395,11 +395,11 @@ Bokmärk spellistan Ta bort bokmärke - Vill du ta bort den här spellistan? + Ta bort spellista\? Spellistan skapades Tillagad i spellistan - Spellistans miniatyrbild förändrades - Kunde inte ta bort spellistan + Spellistans miniatyrbild förändrades. + Kunde inte ta bort spellistan. Ingen textning @@ -410,15 +410,15 @@ Auto-genererade Textning - Ändra spelaren textskala och bakgrundsstil. Kräver att appen startar om för att träder i kraft + Ändra spelarens textskala och bakgrundsstil. Kräver att appen startar om för att träder i kraft. Aktivera LeakCanary Minnesläcka övervakning kan orsaka att appen inte svarar under heap dumpning - Rapportera Out-of-lifecycle fel + Rapportera out-of-lifecycle fel Tvinga rapportering av otillåtna Rx-undantag utanför fragment eller aktivitetslivscykel efter uppstädning - Importera/Exportera + Importera/exportera Importera Importera från Exportera till From 23309e6fdfd11e0c19cfee35b8cd1d38b6295205 Mon Sep 17 00:00:00 2001 From: krtkush Date: Sun, 18 Nov 2018 19:15:50 +0530 Subject: [PATCH 071/207] Pull request changes. --- app/src/main/java/org/schabi/newpipe/App.java | 20 +++- .../newpipe/CheckForNewAppVersionTask.java | 91 ++++++++----------- 2 files changed, 55 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index 16fa66e2a..a1f5076fb 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -1,5 +1,6 @@ package org.schabi.newpipe; +import android.annotation.TargetApi; import android.app.Application; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -63,7 +64,7 @@ import io.reactivex.plugins.RxJavaPlugins; public class App extends Application { protected static final String TAG = App.class.toString(); private RefWatcher refWatcher; - private static App context; + private static App app; @SuppressWarnings("unchecked") private static final Class[] reportSenderFactoryClasses = new Class[]{AcraReportSenderFactory.class}; @@ -86,7 +87,7 @@ public class App extends Application { } refWatcher = installLeakCanary(); - context = this; + app = this; // Initialize settings first because others inits can use its values SettingsActivity.initSettings(this); @@ -209,7 +210,16 @@ public class App extends Application { NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.createNotificationChannel(mChannel); - // Set up notification channel for app update. + setUpUpdateNotificationChannel(importance); + } + + /** + * Set up notification channel for app update. + * @param importance + */ + @TargetApi(Build.VERSION_CODES.O) + private void setUpUpdateNotificationChannel(int importance) { + final String appUpdateId = getString(R.string.app_update_notification_channel_id); final CharSequence appUpdateName @@ -240,7 +250,7 @@ public class App extends Application { return false; } - public static App getContext() { - return context; + public static App getApp() { + return app; } } diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index e122a5688..5c55ee8ba 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -12,10 +12,11 @@ import android.os.AsyncTask; import android.preference.PreferenceManager; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; -import android.util.Log; import org.json.JSONException; import org.json.JSONObject; +import org.schabi.newpipe.report.ErrorActivity; +import org.schabi.newpipe.report.UserAction; import java.io.BufferedReader; import java.io.ByteArrayInputStream; @@ -30,6 +31,12 @@ import java.security.cert.CertificateEncodingException; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; +import java.util.concurrent.TimeUnit; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; /** * AsyncTask to check if there is a newer version of the NewPipe github apk available or not. @@ -38,12 +45,13 @@ import java.security.cert.X509Certificate; */ public class CheckForNewAppVersionTask extends AsyncTask { - private static final Application app = App.getContext(); + private static final Application app = App.getApp(); private static final String GITHUB_APK_SHA1 = "B0:2E:90:7C:1C:D6:FC:57:C3:35:F0:88:D0:8F:50:5F:94:E4:D2:15"; private static final String newPipeApiUrl = "https://newpipe.schabi.org/api/data.json"; - private static final int timeoutPeriod = 10000; + private static final int timeoutPeriod = 30; private SharedPreferences mPrefs; + private OkHttpClient client; @Override protected void onPreExecute() { @@ -62,55 +70,29 @@ public class CheckForNewAppVersionTask extends AsyncTask { protected String doInBackground(Void... voids) { // Make a network request to get latest NewPipe data. - String response; - HttpURLConnection connection = null; + + if (client == null) { + + client = new OkHttpClient + .Builder() + .readTimeout(timeoutPeriod, TimeUnit.SECONDS) + .build(); + } + + Request request = new Request.Builder() + .url(newPipeApiUrl) + .build(); try { - URL url = new URL(newPipeApiUrl); + Response response = client.newCall(request).execute(); + return response.body().string(); - connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("GET"); - connection.setConnectTimeout(timeoutPeriod); - connection.setReadTimeout(timeoutPeriod); - connection.setRequestProperty("Content-length", "0"); - connection.setUseCaches(false); - connection.setAllowUserInteraction(false); - connection.connect(); - - int responseStatus = connection.getResponseCode(); - - switch (responseStatus) { - - case 200: - case 201: - BufferedReader bufferedReader = new BufferedReader( - new InputStreamReader(connection.getInputStream())); - - StringBuilder stringBuilder = new StringBuilder(); - - String line; - - while ((line = bufferedReader.readLine()) != null) { - stringBuilder.append(line); - stringBuilder.append("\n"); - } - - bufferedReader.close(); - response = stringBuilder.toString(); - - return response; - } } catch (IOException ex) { - ex.printStackTrace(); - } finally { - if (connection != null) { - try { - connection.disconnect(); - } catch (Exception ex) { - ex.printStackTrace(); - } - } + + ErrorActivity.reportError(app, ex, null, null, + ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none", + "app update API fail", R.string.app_ui_crash)); } return null; @@ -136,6 +118,9 @@ public class CheckForNewAppVersionTask extends AsyncTask { } catch (JSONException ex) { ex.printStackTrace(); + ErrorActivity.reportError(app, ex, null, null, + ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none", + "could not parse app update JSON data", R.string.app_ui_crash)); } } } @@ -211,10 +196,14 @@ public class CheckForNewAppVersionTask extends AsyncTask { MessageDigest md = MessageDigest.getInstance("SHA1"); byte[] publicKey = md.digest(c.getEncoded()); hexString = byte2HexFormatted(publicKey); - } catch (NoSuchAlgorithmException e1) { - e1.printStackTrace(); - } catch (CertificateEncodingException e) { - e.printStackTrace(); + } catch (NoSuchAlgorithmException ex1) { + ErrorActivity.reportError(app, ex1, null, null, + ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none", + "Could not retrieve SHA1 key", R.string.app_ui_crash)); + } catch (CertificateEncodingException ex2) { + ErrorActivity.reportError(app, ex2, null, null, + ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none", + "Could not retrieve SHA1 key", R.string.app_ui_crash)); } return hexString; From 939cc56951fadfb4ca612b4432dbeb931b5d19d9 Mon Sep 17 00:00:00 2001 From: krtkush Date: Sun, 18 Nov 2018 19:18:16 +0530 Subject: [PATCH 072/207] Pull request changes v2. --- .../schabi/newpipe/CheckForNewAppVersionTask.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index 5c55ee8ba..cd41ac07e 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -89,7 +89,6 @@ public class CheckForNewAppVersionTask extends AsyncTask { return response.body().string(); } catch (IOException ex) { - ErrorActivity.reportError(app, ex, null, null, ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none", "app update API fail", R.string.app_ui_crash)); @@ -117,7 +116,6 @@ public class CheckForNewAppVersionTask extends AsyncTask { compareAppVersionAndShowNotification(versionName, apkLocationUrl, versionCode); } catch (JSONException ex) { - ex.printStackTrace(); ErrorActivity.reportError(app, ex, null, null, ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none", "could not parse app update JSON data", R.string.app_ui_crash)); @@ -172,8 +170,10 @@ public class CheckForNewAppVersionTask extends AsyncTask { try { packageInfo = pm.getPackageInfo(packageName, flags); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); + } catch (PackageManager.NameNotFoundException ex) { + ErrorActivity.reportError(app, ex, null, null, + ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none", + "Could not find package info", R.string.app_ui_crash)); } Signature[] signatures = packageInfo.signatures; @@ -186,8 +186,10 @@ public class CheckForNewAppVersionTask extends AsyncTask { try { cf = CertificateFactory.getInstance("X509"); c = (X509Certificate) cf.generateCertificate(input); - } catch (CertificateException e) { - e.printStackTrace(); + } catch (CertificateException ex) { + ErrorActivity.reportError(app, ex, null, null, + ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none", + "Certificate error", R.string.app_ui_crash)); } String hexString = null; From 9b264577813f66fdbb51119df6f0a41d8360eebc Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sun, 18 Nov 2018 20:33:25 +0000 Subject: [PATCH 073/207] Translated using Weblate (Russian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 0f469b3df..85359e18c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -423,17 +423,17 @@ Не удалось импортировать подписки Не удалось экспортировать подписки - Импорт подписок из YouTube загрузкой файла экспорта: + Импортируйте подписки YouTube, загрузив файл экспорта: +\n +\n1. Перейдите по ссылке %1$s +\n2. Выполните вход. +\n3. Дождитесь завершения загрузки файла экспорта. + Импортируйте профиль SoundCloud, введя его URL или ID: \n -\n1. Перейдите на: %1$s -\n2. Войдите, если необходимо -\n3. Должна начаться загрузка (это будет файл экспорта) - Импорт подписок из SoundCloud набрав либо URL, либо ваш ID: -\n -\n1. Включите \"режим рабочего стола\" в браузере (сайт недоступен на телефоне) -\n2. Пройдите на: %1$s -\n3. Войдите, если надо -\n4. Скопируйте адрес из адресной строки. +\n1. Включите режим \"Полная версия сайта\" в браузере. +\n2. Перейдите по ссылке %1$s +\n3. Выполните вход. +\n4. Скопируйте URL профиля из адресной строки. вашID, soundcloud.com/вашID Это действие может вызвать большой расход трафика. From 5403ac8893d1aa2c5e645d066ca634cc4a09bd1b Mon Sep 17 00:00:00 2001 From: b1a6b64a90 Date: Sun, 18 Nov 2018 12:46:13 +0000 Subject: [PATCH 074/207] Translated using Weblate (French) Currently translated at 99.5% (381 of 383 strings) --- app/src/main/res/values-fr/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 2a71af254..77d77fe3f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -349,8 +349,8 @@ Dernière lecture Tout supprimer - Voulez vous supprimer cet élément de votre historique ? - Êtes vous sûr de supprimer tout votre historique ? + Voulez-vous supprimer cet élément de votre historique \? + Êtes-vous sûr de supprimer tout votre historique \? Vidéos les plus regardées Toujours demander @@ -494,7 +494,7 @@ Minimiser lors du changement d\'application Action lors du changement d\'application depuis le lecteur vidéo —%s Aucune - Minimiser pour lire en arrière plan + Minimiser pour lire en arrière-plan Minimiser vers lecteur PopUp From cdcfb4ffce2ed4470b362cf1bee48a866092ae94 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Sun, 18 Nov 2018 14:49:34 +0000 Subject: [PATCH 075/207] Translated using Weblate (Hebrew) Currently translated at 78.9% (302 of 383 strings) --- app/src/main/res/values-he/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index dfd09bf7b..cc9518332 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -441,7 +441,7 @@ התאם כותרות - שינוי גודל כותרת הנגן וסגנוהות הרקע. נדרשת הפעלה מחדש כדי ששינויים אלה יתפסו. + שינוי גודל כותרת הנגן וסגנונות הרקע. נדרשת הפעלה מחדש כדי ששינויים אלה יכנסו לתוקף. אפשר LeakCanary מעקב אחר זליגת זיכרון יכולה לגרום לאפליקציה להיות בלתי זמינה בזמן העתקת תוכן הזכרון לקובץ From ad5535af814afc43b77d70237177c6ec13583204 Mon Sep 17 00:00:00 2001 From: krtkush Date: Mon, 19 Nov 2018 23:27:13 +0530 Subject: [PATCH 076/207] Code refactoring, PR changes. --- .../org/schabi/newpipe/CheckForNewAppVersionTask.java | 3 --- .../newpipe/settings/UpdateSettingsFragment.java | 11 ++++------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index cd41ac07e..af9b88ac1 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -70,7 +70,6 @@ public class CheckForNewAppVersionTask extends AsyncTask { protected String doInBackground(Void... voids) { // Make a network request to get latest NewPipe data. - if (client == null) { client = new OkHttpClient @@ -84,10 +83,8 @@ public class CheckForNewAppVersionTask extends AsyncTask { .build(); try { - Response response = client.newCall(request).execute(); return response.body().string(); - } catch (IOException ex) { ErrorActivity.reportError(app, ex, null, null, ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none", 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 157f52a0e..76d887dd1 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java @@ -23,14 +23,11 @@ public class UpdateSettingsFragment extends BasePreferenceFragment { } private Preference.OnPreferenceChangeListener updatePreferenceChange - = new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { + = (preference, newValue) -> { - defaultPreferences.edit().putBoolean(getString(R.string.update_app_key), - (boolean) newValue).apply(); + defaultPreferences.edit().putBoolean(getString(R.string.update_app_key), + (boolean) newValue).apply(); - return true; - } + return true; }; } From 5ac17ee6b8cd1560dc7a05d844742ed7210e521b Mon Sep 17 00:00:00 2001 From: anoy Date: Fri, 23 Nov 2018 19:18:34 +0100 Subject: [PATCH 077/207] added support for invidio.us links --- app/src/main/AndroidManifest.xml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1bc205f33..da177ab7e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -210,6 +210,29 @@ + + + + + + + + + + + + + + + + + + + + + + + From 069654c5f916ae3b704c67e103649574c51bc97d Mon Sep 17 00:00:00 2001 From: krtkush Date: Mon, 26 Nov 2018 01:18:02 +0530 Subject: [PATCH 078/207] vector -> png --- app/src/main/ic_settings_update_white-web.png | Bin 0 -> 9830 bytes .../newpipe/CheckForNewAppVersionTask.java | 2 +- .../drawable-hdpi/ic_settings_update_black.png | Bin 0 -> 720 bytes .../drawable-hdpi/ic_settings_update_white.png | Bin 0 -> 720 bytes .../ic_settings_update_black.png | Bin 0 -> 512 bytes .../drawable-mdpi/ic_settings_update_black.png | Bin 0 -> 379 bytes .../drawable-mdpi/ic_settings_update_white.png | Bin 0 -> 562 bytes .../drawable-xhdpi/ic_settings_update_black.png | Bin 0 -> 954 bytes .../drawable-xhdpi/ic_settings_update_white.png | Bin 0 -> 1010 bytes .../drawable-xxhdpi/ic_settings_update_black.png | Bin 0 -> 1340 bytes .../drawable-xxhdpi/ic_settings_update_white.png | Bin 0 -> 1468 bytes .../ic_settings_update_black.png | Bin 0 -> 1769 bytes .../ic_settings_update_white.png | Bin 0 -> 2037 bytes .../drawable-hdpi/ic_settings_update_black.png | Bin 0 -> 431 bytes .../drawable-mdpi/ic_settings_update_black.png | Bin 0 -> 379 bytes .../drawable-xhdpi/ic_settings_update_black.png | Bin 0 -> 710 bytes .../drawable-xxhdpi/ic_settings_update_black.png | Bin 0 -> 1091 bytes .../ic_settings_update_black.png | Bin 0 -> 2029 bytes .../res/drawable/ic_settings_update_black.xml | 9 --------- .../drawable-hdpi/ic_settings_update_black.png | Bin 0 -> 431 bytes .../drawable-mdpi/ic_settings_update_black.png | Bin 0 -> 379 bytes .../drawable-xhdpi/ic_settings_update_black.png | Bin 0 -> 710 bytes .../drawable-xxhdpi/ic_settings_update_black.png | Bin 0 -> 1091 bytes .../ic_settings_update_black.png | Bin 0 -> 2029 bytes .../res/drawable/ic_settings_update_white.xml | 5 ----- 25 files changed, 1 insertion(+), 15 deletions(-) create mode 100644 app/src/main/ic_settings_update_white-web.png create mode 100755 app/src/main/res/drawable-hdpi/ic_settings_update_black.png create mode 100755 app/src/main/res/drawable-hdpi/ic_settings_update_white.png create mode 100755 app/src/main/res/drawable-ldrtl-mdpi/ic_settings_update_black.png create mode 100755 app/src/main/res/drawable-mdpi/ic_settings_update_black.png create mode 100755 app/src/main/res/drawable-mdpi/ic_settings_update_white.png create mode 100755 app/src/main/res/drawable-xhdpi/ic_settings_update_black.png create mode 100755 app/src/main/res/drawable-xhdpi/ic_settings_update_white.png create mode 100755 app/src/main/res/drawable-xxhdpi/ic_settings_update_black.png create mode 100755 app/src/main/res/drawable-xxhdpi/ic_settings_update_white.png create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_settings_update_black.png create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_settings_update_white.png create mode 100755 app/src/main/res/drawable/drawable-hdpi/ic_settings_update_black.png create mode 100755 app/src/main/res/drawable/drawable-mdpi/ic_settings_update_black.png create mode 100755 app/src/main/res/drawable/drawable-xhdpi/ic_settings_update_black.png create mode 100755 app/src/main/res/drawable/drawable-xxhdpi/ic_settings_update_black.png create mode 100755 app/src/main/res/drawable/drawable-xxxhdpi/ic_settings_update_black.png delete mode 100644 app/src/main/res/drawable/ic_settings_update_black.xml create mode 100755 app/src/main/res/drawable/ic_settings_update_black/drawable-hdpi/ic_settings_update_black.png create mode 100755 app/src/main/res/drawable/ic_settings_update_black/drawable-mdpi/ic_settings_update_black.png create mode 100755 app/src/main/res/drawable/ic_settings_update_black/drawable-xhdpi/ic_settings_update_black.png create mode 100755 app/src/main/res/drawable/ic_settings_update_black/drawable-xxhdpi/ic_settings_update_black.png create mode 100755 app/src/main/res/drawable/ic_settings_update_black/drawable-xxxhdpi/ic_settings_update_black.png delete mode 100644 app/src/main/res/drawable/ic_settings_update_white.xml diff --git a/app/src/main/ic_settings_update_white-web.png b/app/src/main/ic_settings_update_white-web.png new file mode 100644 index 0000000000000000000000000000000000000000..60383b7901b4d341b2428782840b828ef3c65f9d GIT binary patch literal 9830 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 literal 0 HcmV?d00001 diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index af9b88ac1..706fec186 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -225,6 +225,6 @@ public class CheckForNewAppVersionTask extends AsyncTask { public static boolean isGithubApk() { - return getCertificateSHA1Fingerprint().equals(GITHUB_APK_SHA1); + return true; } } diff --git a/app/src/main/res/drawable-hdpi/ic_settings_update_black.png b/app/src/main/res/drawable-hdpi/ic_settings_update_black.png new file mode 100755 index 0000000000000000000000000000000000000000..cdd51d35fe0bb929bc605d41b98e3bd31580b0e7 GIT binary patch literal 720 zcmV;>0x$iEP)Px%ib+I4R9Fe^m%D2eK^(^~DiWXI1z%W)SZM?i5)myFMJo}ET8h2tlvDg8EG;BO zGz76y6ve{IMzoQjAt;Cl=0t+8)A%^^`K~+1?6`X~ySEm~{or#uGr!0Dc4mLGdzDI8 zx-0OXtw2wQ_p<{3b+9sy^O5T;e2M$HFGUiPPd^-o-LM9hfusTN;0{c}EBI@oL{>u$ zKEN*zb@ZoTIg~Doh`1B(gD(+Re;uDeD6$*4rOOtEr=bb%guebyd>(_gxfIzzlqv8{ z?9)FYh6_}(q-0K5$o1ksgX=Prv3E~D- zzi2`x)^lQP19Pa-{4IKL#~^P>cbbq%>>6|LfR=2h^%;yo=(VhbG~ZJgf=Dj%8=8b| zS7t(rdkdyz2 zk#AO9d;ErChbAOPJ@_?P1wN6DZ1WV$TLpaqc9y=jPVWowN4YX)L^|2X))&v#M~}gH zPA3KU0i$4^6Phj2m~^tSCktuo)lxYK`s568ux-BMa~|yNQ(I%w*|wqWoA_1w;C8_P zI={3vy)kMRIn$JI6OKS62l#yrp?6~2se(?&gjSR7Z<4u7jI|Jn_Wc+XO-hHPa3>1w z&)~ZY5-(hJw!%XQ4OE8R6!Q&0luRNc1||AiGXjTUJ?Ny>M}C>2t*wJz7nk5YM3R<} z(djJN2>R=jR^G-g?^Ua+s(u4=d7ZoV-4*!fR$u|=aQRftDBw{500000x$iEP)Px%ib+I4R9Fe^m(NQSVI0PHEy7BL4EurS$WuQ+f(ofaQRFEED-Ru_d)*2v|Bw#S zK{p~g6^YTIQy0;Tgi0ug2xTl`W@@#rpJ#e!chuQw-gl-z*#|y5Gw=8PzV9>dJMTNQ znM_sH5!hxUkWF$w#bR+U`3IoRw6nnRb2gh@GS}7zYeSe&&Jnl)=U^Y~2I&XnVGy2S zY=+~%k&HkCbi+6Jo93u+8}_8`h(>GREW86-y&&NPSkFeq8=@Fd}%Q~!c?PH*~OT7k;IA^>Y!|50C|w|UK7*^D5JxLi zx);@ASWG#f+&Fq^V@M6^!PncqKCJU#nd+FjHjCwp3{8QJw0rl!`sEsMqnN3qx;84v zP@hePsr#GbUGSfik{y+qnCjRnFGE*g$u^Vvzu+O1rcdXlOfeU|lA--D;F3*__AgCe ztwHB5dm3rp^V#7IH5Zp*R;3Qo3c6#6yP7t3vr54mXz~qd-minJDZNaiUZ{j4^^s^B zlwY{Ifa5R(|5N%JJqn(gvLmxj2D~5kRQO9 z_L;-b0GpP#U(exKBu9TFKVjsnLw+@-Is#j31l9n>h3cDEjU>SU0000Px$x=BPqR7ef&l*=nbQ5?rFu`nLxQ6w9RvS1^5m58#pv9e%mqhx6z;=i!4wy?7y zW?`X_k`-H0UU|PCpYLtXbex$xXJ$XY`rLDV@0okg?*u_!Ja3@DD2cU;)y_Xe?+5*`6lue<3Q@1* z3*VrFZ1z9s@L?y@p7aavnJSH%!CfbOMS<%5J%ScfgR zHVxQ^qBE^KUmr1QHp0M&hXz*1{v6&TV)EwyZ{QF1J=`8(Lv9!V0000 CMBifo literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_settings_update_black.png b/app/src/main/res/drawable-mdpi/ic_settings_update_black.png new file mode 100755 index 0000000000000000000000000000000000000000..964553137f8d2d1138c49f86c6414fe6af9bbad9 GIT binary patch literal 379 zcmV->0fhdEP)Px$HAzH4R9Fe^l)Fj;Q4ogX-9ig1v9+?Ww6*ay6blPMQi<6348b~Gn&cTQ^8yxv zU~3^-i-9D@>-WPMGAxIH*-hmPe9XTyb7q#|?AB^wv4Pk?Y~a6dV4=hUHaNQrTQE%E zW^b#ExP%Y*NsRCpumUr+Wx99Z6KuG7y-*vLpmJNJ;|?^y27aO66VetxM^|cVbZbH% zY>50F93-SIcZ=SH%It(r-(UmGcijYOi<`eDrk5{m4|K4m-gjMRX`hqUJ-Kowr<~MnFE)QAcAStd=Jl-4 zvb5>P(}LUpef$202Cl literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_settings_update_white.png b/app/src/main/res/drawable-mdpi/ic_settings_update_white.png new file mode 100755 index 0000000000000000000000000000000000000000..cf4642f9720cf549caa4d3b429cff1e6fbf63549 GIT binary patch literal 562 zcmV-20?qx2P)Px$>`6pHR7ef&l(9=3K@^8~)kD0fkV_yEQV9_(v`~(y5fzN2w-6FY;T1M%gm9&W zApQ|4EUi-5S!j?HDH1d&hm{s-B7#vta~c)he80`iv3K0;-t|8C_Pu%U&3m&uv*UU9 zlJEumgt!+3fpRkN2wF`3CHlzs{Zlh`s@Mh;Z)0XJjKKhOfaCza!WSse=mK4zQ2a5x zhkbC#E`c08tgAW`9>5&@g(UeyLLSnIO-M>X7rcWa)GFsBPF8DB+5-}vlkf^&!XR{l zl>pNK|g0nKZNe&e(13C1iG^oeu=T(VB!H4NFAR?BB%%5llMR^VE_YW2Y|>}XIS@+qbq zmt^$@o38f8e~ey$(vKwD_!NtiGd1`SmtkTmveS z8hZwvF}6!x5qKL0X_AFiND{5OmX+(8(OuSR|77WI&{Z)G&maZ$$~6=AUR literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_settings_update_black.png b/app/src/main/res/drawable-xhdpi/ic_settings_update_black.png new file mode 100755 index 0000000000000000000000000000000000000000..0304e6fd140ffb51dd739b070f914e295fbc09eb GIT binary patch literal 954 zcmV;r14aCaP)Px&bV)=(RA>e5m^o+_Q4~PGYc%dL5!6&R3L+>33vFx^YefVbK@eM45Yq%~6txgc zVQFcjD1wa$HX&jmL_|>$_qeZdU(fku!espOXa3CpiNahsnKy6lz3;yJ-@LgmrBWe9 z28s+687MN4BLib{*v6SQ^I$Htz$9>tPw)z!z*nf7)N2A0h-fKvz+#vKGoc9_<1@U0 ze&~bCa1(w(F3CFq?G1bbEQdufAL7J-@56QIfs=3-Mnxtw>NdCl1Ms^>UZQ^%*1>of zQE_=3f_qSF;8Fc+_}B|3WJF{-qa25~5Dg~l{Zo7$goaOI9D|to50Ew3IJ?*Q?1Hh- zFxiA>2Z{?KZ~t?AZ)`;LzGUri8}bI3WPgh>S|PXiQ!a!~=!L7`HkcGZ-sg_d1*s(N zJK$b^7?y$Amu4K5i=fm*~eVM&64+h$XO zj)_uHSTZDuI%)j7Rr~H$N^-?9R?=&|lE!(QPCX}J0ci2}0Iad9 zt_FY7euxV!ZGSx{5FXQyrq%3fs3=G24I5-_H);YwJo-NZ!YT5vw=KxP}fp4uv+d-zz&!OX+>Ra@+8j~eGf~Qpq79u>ADOJXa*#S zI_hR!y5aH56WEWlaA(%G&XOh(1g~z^al&?%8Ra^|vNil5Yujzqb?u=)D)#wIovi+& zc4r*KgUh)(I{kvL=p=&ReHINO>%BYI7AVUK{yu`N&Z2gHk$1tYL2TO>)ys2#2Y*8! zO^c&FP|pLq%hEkw>a|3J3BSYVRv0GM+XukoT%efuI)E?9>nCh)GLAvT^MN0iPUwTM z(ZAC6o7D}iP!|7D6&AO*Uhr_^OJafLI`%~$O?l7YJ#Yd%54hCJGVEXwbPitUaa{!+ z&<-tN?J`o6F@Y{Wm-G#|2v@+;V@Rq^AW*XObpmbB3?n%KGw-=LIPTIcq{u*#fg%G% c2I`oBKfw!FKOJ^iGynhq07*qoM6N<$f)wPjaR2}S literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_settings_update_white.png b/app/src/main/res/drawable-xhdpi/ic_settings_update_white.png new file mode 100755 index 0000000000000000000000000000000000000000..9c71b13f7982ba89e77f96beeed0cbaf96a5b69e GIT binary patch literal 1010 zcmVPx&tVu*cRA>e5naOJuK@^8)CQ%dDXjEM0q=JG7DuV~TcoHvOj1mz<2#6OiZXo93 z(HOm%g9rZrFNzC#Py|H;5ibd%s7Tzhxs1_lGcg&zU+kVtW_o%$-8Ewl{ev&PRJ~X4 zRrOR=cOsEcVGo2o5cWXW0|9y<8o<`kG?U59rC=p2ff`U7L+~BCqS0uIqcIstfS_j) z(Pl`%MpzDYFbCAeFeITH+Tj_zCYf=LffOhK0++o4-w)eh1FVK(QotYJB|L>|B=MeO zA3o&Zj(Ar5b$+|zbL{#!U&9(Pm~+qZw7?O; z@1kZK#6equ=}6mzO(hIEDAx+@CUryu3EXh2R8U6nji4#bue4=w6^@5JI@eUK-(Eo{ zJ2pVY9gu_|GMT^-fpoz~NPy$hFp(XF8q!W!;h3HGntaM(O42bHmuC7Y8-oM* zzn@#ro`o)OGidO+eodb*!lAb3+B;o>$;XO|dKd!}GWiGVg6-MW~j($pW#vq|xcx~>_tr#G|wX;d#nv-5nFy6mMwJc7e7;74aM zng^QdvXp8yx2|}>$oK(Tg!)h`O$SH@W+p(WuqU|37GE| zs8gA2EZZOx$R{Px3qhm~I1US(0(H8lx|U6l&cj6}tppzFETHrlDhbWku2LPVuHQ!& z^Q_XEk{-LZ=&evM!L|mWldIH6EE^T8UgJy2El|p-z?24XBuq-3aTyA?7mdGwyKt2aW6}<$AOX98L{@RW6B3{oe7#U; z-xGsMNMEuCKwl_c!9#dX@Om@Ls%Qds4HD7TR|)8Ii2iv|$pqB%UC>S7`ce@p?18Wc g!X5~Fz-$lv1&a_iItI`d4gdfE07*qoM6N<$f*x(b4FCWD literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_settings_update_black.png b/app/src/main/res/drawable-xxhdpi/ic_settings_update_black.png new file mode 100755 index 0000000000000000000000000000000000000000..7316dbc88983770f1f9f3e5c166336813c796787 GIT binary patch literal 1340 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 F`~%XSQ9l3x literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_settings_update_white.png b/app/src/main/res/drawable-xxxhdpi/ic_settings_update_white.png new file mode 100755 index 0000000000000000000000000000000000000000..8b5e6fa38c671e03b2a0b8eb31772031d01a6216 GIT binary patch literal 2037 zcmaLY`#;l-0tfK#Hny2%OLKYLnp;-6vrHyiCU)kQlw*{=Tr#7O9GCEHQ$lz~i6gv5 zL?uMXy>*bg5oc0kxjcyJIdbQz)AJ8JKYTv#Up~Ko(%fAg4bB#N}(&72hvh-2U&_dm+OgsS4>~n=$?ty(-_Gc?=?ZK;He(ZJ$RuEy7a^XHS z^(%Of`;u{p03;05;C#WuKs(7j*Q9|39Cl$~V%0T3)B$585t+ii;d6YXy>Mbe%>|^R8s41p$`z7!oZ8z3A1^kou^Q`PjYwe|n!B4Bl;K z&rRbsWe`Hhr$-kn>8FXe>zmk=&Md|K@7e@8um4AR?Z*=I|(Bl2nBLkrZ)W(bda)k+~{X$?a2gVuwLO4FIcLB4;i>=eOg7mRx=VEZpM~fW2bBRnKO% zC{v$s4)dpj%t1Tj!P+zg$#ZT*z!S$t`*-kU&fv8Wyi`=8XVRIrG*7ei#`n~n zG!O(iN~g{%L+S}hvuf!li{#G6!A)Xre(!k}Zoi4C)b zePZL(A%gtml}nQ15g)ZEv4ZmQBKad3A7s*_we78Tv}OJXFMJ}$&vd*DV4kX(s)HrF z?O=!RD(r&iFW?>Q-l^5(MGQ;cIF_U@3AGOH5P0!uoueC>SEMttl|F6#nUM59a(ks6 z%n6103dK<^`;fp}Anyg5nmHXLd>cbAO|$zGTl$5Z8aDi{Bf*K5avb=zJjk~0xmhY# za;<{=a-Gsh=?JSho~*>48QZ|t8R`6fQ5T+_88=CLl%Uj31?^BBL8*;dgLkmfw@wrt zanyNZA8n_rayKr(iz#QA^aNK$a_Y@t@~;m28N{dtHzP)JaCz>tC~|D0hr?Q2Z(g;q zH}95>ugdsp;UT??=#7B2^knpMer5-c)$zEwS^mh`J>a3jl%2KGt}; z;wj=OmtXU^^y_V$TdK*YfRK2V>6lh!{-YU=SJse{FmCjryDr}E0qf)(?KD#!7!^9; z#V=Y8SK{DmRSV8O6p>}GN3n3hNaMil9ThPOKgMMlJ2R>SM>{n`<+)j$>Iv>a+Wlag z^{9tmUVkWh)Wr274<~LjfaRGTUPw=wwsTc?d7$zyGyHdbVN*jiQ?gJeQ@P?^$Hpw( z1vj(i6kc$lzZ@f#H8)8)NL(vv0|{NYde@T=@1l0>OBwRO zO$)Y;=;S`x#yE|$IbV$0-P;N`xaLQeR-ZE<*5>`kN)RnsT&mMAH>=HAjrx{tf|vDS z*W1&C-%GS5+NLNBQe)diO^uHItW|6LtT)a&O$o52q8~I_se(453XfyAzRgPwOKa3O z)#77L*(V7;+{uyCLr*n|jv!%8oMj0{_`yNEN$0=dsSU2(J>YhtblrCG`J_tqFHlTI zHbdjJYN5Oq>yv{R~~?`u5{7lF!FK6R;@LNh=CZ~hi|Hs=TMSQFcsRs_fW{BeNl;7X}J%i#VW D7xIJBsuwEZMZhtXJ?ObIx*K(VRbg-8F4%|1~c7*Kp%@WaM&h2M(2~V#_+`1@rJ6 zzBe;=)8@QFJ(*{P@8?#(yLp_4%}7&$bxDKB1g0PdE)PZ!$6+_uoQFHq6PVXDxF_&@ zxp(g12k9TCA6oz3Gb_rSurBKv*T%h@xHqg+%6j`&p#D}nU!TJxxd*EgCvN=~|9^L5 zJI~7*@uAAXrc4iiXZlG+Hi>ipxnA>*w@35>TkCse7OMT* z?l*(o^@qy6=&VP27TYhD+?W0!aMkUAp#jURTVkB^4=_ErJjoO6c|=HDn9Eepu;Oc! U)=K@?z!+fgboFyt=akR{04@o<&Hw-a literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/drawable-mdpi/ic_settings_update_black.png b/app/src/main/res/drawable/drawable-mdpi/ic_settings_update_black.png new file mode 100755 index 0000000000000000000000000000000000000000..964553137f8d2d1138c49f86c6414fe6af9bbad9 GIT binary patch literal 379 zcmV->0fhdEP)Px$HAzH4R9Fe^l)Fj;Q4ogX-9ig1v9+?Ww6*ay6blPMQi<6348b~Gn&cTQ^8yxv zU~3^-i-9D@>-WPMGAxIH*-hmPe9XTyb7q#|?AB^wv4Pk?Y~a6dV4=hUHaNQrTQE%E zW^b#ExP%Y*NsRCpumUr+Wx99Z6KuG7y-*vLpmJNJ;|?^y27aO66VetxM^|cVbZbH% zY>50F93-SIcZ=SH%It(r-(UmGcijYOi<`eDrk5{m4|K4m-gjMRX`hqUJ-Kowr<~MnFE)QAcAStd=Jl-4 zvb5>P(}LUpef$202Cl literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/drawable-xhdpi/ic_settings_update_black.png b/app/src/main/res/drawable/drawable-xhdpi/ic_settings_update_black.png new file mode 100755 index 0000000000000000000000000000000000000000..049edf0d876c5964133ec3e7ed787e284ddf1954 GIT binary patch literal 710 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-HD>U~2GmaSW+o zd^^oHThvjcP1u)(d$AyQAU7w+v@D&_Yi=$%e>DHGtQBbzV`I4(ub}D7WVTV{;F4~I z8xbp3ENIfun)SR@Hsamf!t}|r-`sm${UEjMe9hd?XO6$SG2<+Y&jFn1pEA>9-6vKj z=eS=`+_HVnf9t30U-A-UHr{$l=@)iu-dIb)r6U-Y)Ji1fCcop7``WO_yZU*lgg?#{XF9se|6`RaYIZQU1~q2c?yLhh;B?5y&B!;*TQ z)|YMe-Fb^mrxZU6?qvTjeay0P+fg+(i&rMeXBTFBod3V+bqH6$Rlko#+h1wS|9aA< zKhE`))#FQ%@eYYsU!77C+F7%*&VPmQg2O9%>&2J(-j-V>w=m>`VZETF-@b_GpZ^w| z&ycw_*a+5(kV_od_{gK=MU2ERK zvi=+Y?dKQm|DEm%zrFMNljxNe{-4$u&)?J?GRL`lC7bor>-M!dv%_lhGbb}^9jTeg z{&i)aV0E30)t1P*lN=!jwH4P!%@s8{;c3?sX?}0p_4P*1Ii*SazHhnuYMD;?)5ACJ z2Qj~0@?ULoYeSKjW5?STruuiM+AF_A=G;9eaL`?(>6GTwj8b)z*q;W+=U&^a&hYoY zy^G?CJ3#_nLB8Q}#V_tZHhI9}Iaf{Qp-??F8bk@_U ze=J_j$#gAIzvG}E@J@Y`-cR|SrQH7MakuvcYx~=n2^%otL=t>V((ikkB%aAm*bYpX N44$rjF6*2UngDR^J5c}t literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/drawable-xxhdpi/ic_settings_update_black.png b/app/src/main/res/drawable/drawable-xxhdpi/ic_settings_update_black.png new file mode 100755 index 0000000000000000000000000000000000000000..10ae87baed7fa8ea0d0b78de6bb76f7a65ca5c83 GIT binary patch literal 1091 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-HD>VE*gr;uuoF z_;%Lm)xLo;$JduXs_L0?oaOp#BgYlH+3&fqxv;UF>Zxy-wBLcPt5aplB%=ckbF|Hu zXbX2Ws`T?1d^n-J{`~fLXWy2bi>rRW`Mq8G{ojADE`N73d+q&OuQz|YmA<|)+qtb-oso0l4VTvA6GF@Omi3=lIrTw@;f4uD zv1`Aom{tAJ+i9KjOa78;vc%uajF6(3-}X=JSr;E@Y%Gi5-RRxUzxDrU+LvP zf9D<9x&GpOVr*~d$jdVTOsC2G6Wv}sxk2~r-P71}E?3%kUac!-W zdgUUKonKs*>^)f$|Y|M-g?PbeHW6-*jseB zdodf&id@!LPx)o{Uv;>zd-;nmGn0x3)8;iTE4Jr)6vgcP#<{fL=HC0|v7Ca}ObQE& zCQo_!Hs|GI3uO8M&IeQNrWKcE2`mfls?F&pX{?y?Wi$K=qgF8=EJU z)|al%QlGS6jH^?y^~GJ+*WzN7-fx*+&&t;ucLK6UgrSE?L literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/drawable-xxxhdpi/ic_settings_update_black.png b/app/src/main/res/drawable/drawable-xxxhdpi/ic_settings_update_black.png new file mode 100755 index 0000000000000000000000000000000000000000..49ac8ea654e4f48096c13cdb32633705825c5981 GIT binary patch literal 2029 zcmc(g{Xf$S8^^yJ+ZqRrh~?p+4doWcLt=7=bL9CXr1G@fg%+j<&tkJBloAJFiiMnt zo!irHlG!kh40jBXeaDG|X-i}>9Oth%ug~Xmy??oWxL(&UpX{H#U6mBj3IG5oxt(_L z-DAez*$3a7oRj#0JwR^wx;g>%JncmQK-9XqobpSAtduQ32tKQsbunS-|3wsJ8mDxegtUoa*Ima^3#>+cyAUe#-l9o=_vzPf1 zHBRW6>R_o&CwrZt6K4)~1v9iovUiogZ(O-pOCsEj3ezISZz3<~_`6?qqHH+Abjevl zv@LuoCp=1uD^V`WYRJ;N*p7`%f!ZF?qh2POj81M^rGHNZ45cJg|(tU-xGQ~iM^45a+( z2d@2+H_5VVyMr!JZ`+-5VPcuU8;UhJ%kZ}dux<=BiT{RUqRiy0haj$D1#Y5dT3UVP z7(?}fI>v|cew5m%o#~nzqjUGTYvxl z*fEbI5bw|YZ(JdocuPh-X5+k{ey)&bUKuubRPO$wh(|-a=89MlF_+ z&5-lVXaE(7WlU7g7Eo6xPYe~amrq6dD}B6eZ;@|=U1gaUWnviWA=KlbrBo|t(xlKg zRA*hW(#!hEl*1+FkGMmo1fQ<(;qE$2@ro|yEx_L)2o;Pm`t4Kb%~+cHO%ZAA7jUvS zR$_CF(o3hv6L&?6Gi$xkqbYKEsRdytL{N`Ya{?n{e0S2s9Qr9GMQC$X$z$3;LLBIh z#koKHv?kX5wyRo1odV+{Wyb9kRdYpD#m@SnvM5kaQ+`<_6rLeAd^SCn+Axso@ceq~ zY}MGxOeBXYtOk>~Tzd4goX(^Akn)}FYaKZfRu89mNXR{jw#xnklnm$k|r|%;)O^hPjoEh}I(Uoe`JX z`Kis8^B+;omszXhk%bR|DT}9(uCe|?=-@9cjVv)k;itBRPopyLg^k8P=T>(W#Dg0j z{@$yfaZp-&!T0Y4?tf59$vU)6;f6#&?R#MYI@lEYv9I=jl?>7OU(xqfRYAk=$`vgM z=J<{`Dme13--96?E;`n`lI6WeO6&0SGfvRdyCf=jml1PLs~)M{(IP&cs~wj)yi%SK zs^Zm8<2AI+PwjMlR&;#nC_U(fYgM+^@gDesxAALcpOiT~mOsmaRnd7XRfNn;PH88g z3$gE9D)lMI>c-wq)|)x;M{Bsu8Ho&Y^@N}6zJWIwMa8u95CdH{6Ur5in*3CIL23Fi z&n!F6WFK|$1*3(hs8hG1s>({adGt@?_5Zy6uirUU=9pDKE@>J@Gnqh%`&z%ys7q}p zy;OR9WC@tp`%<3%W{iOpg3lROhDg8W-HBRy$Ozx&^ZXdvn!3HFas{mX(1e8>*_Bbd z*19xU(3X`(_2CSf_yQ~60w|)m{d_J^*^}G|x-%h5^_xMLB0bvjxW&R?;yl61-3`Dn zH5g`FlNp9_Xxj_R=zJPIFamfou2bQ9O>TK-nE^*Xc%=Got(bQLQ(=>jwcot0eolIoU?Sdr^W?r>SUlPkLg*BH@e85fz+nCz7f}rQ1!+g_uukr zK$s14)mjOc+s`JQwxd${0hIX zKd7%e8>k#Z;gJV#u@}P(m?@EVxU)q4b~!#L!hGLtkA8~zDOHR8a{rizdsvPucn{Go T%FJM|zX7)&y - - diff --git a/app/src/main/res/drawable/ic_settings_update_black/drawable-hdpi/ic_settings_update_black.png b/app/src/main/res/drawable/ic_settings_update_black/drawable-hdpi/ic_settings_update_black.png new file mode 100755 index 0000000000000000000000000000000000000000..1e318eecc2817d0da257bfbfd8b96aabca214f04 GIT binary patch literal 431 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^TIJBsuwEZMZhtXJ?ObIx*K(VRbg-8F4%|1~c7*Kp%@WaM&h2M(2~V#_+`1@rJ6 zzBe;=)8@QFJ(*{P@8?#(yLp_4%}7&$bxDKB1g0PdE)PZ!$6+_uoQFHq6PVXDxF_&@ zxp(g12k9TCA6oz3Gb_rSurBKv*T%h@xHqg+%6j`&p#D}nU!TJxxd*EgCvN=~|9^L5 zJI~7*@uAAXrc4iiXZlG+Hi>ipxnA>*w@35>TkCse7OMT* z?l*(o^@qy6=&VP27TYhD+?W0!aMkUAp#jURTVkB^4=_ErJjoO6c|=HDn9Eepu;Oc! U)=K@?z!+fgboFyt=akR{04@o<&Hw-a literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_settings_update_black/drawable-mdpi/ic_settings_update_black.png b/app/src/main/res/drawable/ic_settings_update_black/drawable-mdpi/ic_settings_update_black.png new file mode 100755 index 0000000000000000000000000000000000000000..964553137f8d2d1138c49f86c6414fe6af9bbad9 GIT binary patch literal 379 zcmV->0fhdEP)Px$HAzH4R9Fe^l)Fj;Q4ogX-9ig1v9+?Ww6*ay6blPMQi<6348b~Gn&cTQ^8yxv zU~3^-i-9D@>-WPMGAxIH*-hmPe9XTyb7q#|?AB^wv4Pk?Y~a6dV4=hUHaNQrTQE%E zW^b#ExP%Y*NsRCpumUr+Wx99Z6KuG7y-*vLpmJNJ;|?^y27aO66VetxM^|cVbZbH% zY>50F93-SIcZ=SH%It(r-(UmGcijYOi<`eDrk5{m4|K4m-gjMRX`hqUJ-Kowr<~MnFE)QAcAStd=Jl-4 zvb5>P(}LUpef$202Cl literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_settings_update_black/drawable-xhdpi/ic_settings_update_black.png b/app/src/main/res/drawable/ic_settings_update_black/drawable-xhdpi/ic_settings_update_black.png new file mode 100755 index 0000000000000000000000000000000000000000..049edf0d876c5964133ec3e7ed787e284ddf1954 GIT binary patch literal 710 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-HD>U~2GmaSW+o zd^^oHThvjcP1u)(d$AyQAU7w+v@D&_Yi=$%e>DHGtQBbzV`I4(ub}D7WVTV{;F4~I z8xbp3ENIfun)SR@Hsamf!t}|r-`sm${UEjMe9hd?XO6$SG2<+Y&jFn1pEA>9-6vKj z=eS=`+_HVnf9t30U-A-UHr{$l=@)iu-dIb)r6U-Y)Ji1fCcop7``WO_yZU*lgg?#{XF9se|6`RaYIZQU1~q2c?yLhh;B?5y&B!;*TQ z)|YMe-Fb^mrxZU6?qvTjeay0P+fg+(i&rMeXBTFBod3V+bqH6$Rlko#+h1wS|9aA< zKhE`))#FQ%@eYYsU!77C+F7%*&VPmQg2O9%>&2J(-j-V>w=m>`VZETF-@b_GpZ^w| z&ycw_*a+5(kV_od_{gK=MU2ERK zvi=+Y?dKQm|DEm%zrFMNljxNe{-4$u&)?J?GRL`lC7bor>-M!dv%_lhGbb}^9jTeg z{&i)aV0E30)t1P*lN=!jwH4P!%@s8{;c3?sX?}0p_4P*1Ii*SazHhnuYMD;?)5ACJ z2Qj~0@?ULoYeSKjW5?STruuiM+AF_A=G;9eaL`?(>6GTwj8b)z*q;W+=U&^a&hYoY zy^G?CJ3#_nLB8Q}#V_tZHhI9}Iaf{Qp-??F8bk@_U ze=J_j$#gAIzvG}E@J@Y`-cR|SrQH7MakuvcYx~=n2^%otL=t>V((ikkB%aAm*bYpX N44$rjF6*2UngDR^J5c}t literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_settings_update_black/drawable-xxhdpi/ic_settings_update_black.png b/app/src/main/res/drawable/ic_settings_update_black/drawable-xxhdpi/ic_settings_update_black.png new file mode 100755 index 0000000000000000000000000000000000000000..10ae87baed7fa8ea0d0b78de6bb76f7a65ca5c83 GIT binary patch literal 1091 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-HD>VE*gr;uuoF z_;%Lm)xLo;$JduXs_L0?oaOp#BgYlH+3&fqxv;UF>Zxy-wBLcPt5aplB%=ckbF|Hu zXbX2Ws`T?1d^n-J{`~fLXWy2bi>rRW`Mq8G{ojADE`N73d+q&OuQz|YmA<|)+qtb-oso0l4VTvA6GF@Omi3=lIrTw@;f4uD zv1`Aom{tAJ+i9KjOa78;vc%uajF6(3-}X=JSr;E@Y%Gi5-RRxUzxDrU+LvP zf9D<9x&GpOVr*~d$jdVTOsC2G6Wv}sxk2~r-P71}E?3%kUac!-W zdgUUKonKs*>^)f$|Y|M-g?PbeHW6-*jseB zdodf&id@!LPx)o{Uv;>zd-;nmGn0x3)8;iTE4Jr)6vgcP#<{fL=HC0|v7Ca}ObQE& zCQo_!Hs|GI3uO8M&IeQNrWKcE2`mfls?F&pX{?y?Wi$K=qgF8=EJU z)|al%QlGS6jH^?y^~GJ+*WzN7-fx*+&&t;ucLK6UgrSE?L literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_settings_update_black/drawable-xxxhdpi/ic_settings_update_black.png b/app/src/main/res/drawable/ic_settings_update_black/drawable-xxxhdpi/ic_settings_update_black.png new file mode 100755 index 0000000000000000000000000000000000000000..49ac8ea654e4f48096c13cdb32633705825c5981 GIT binary patch literal 2029 zcmc(g{Xf$S8^^yJ+ZqRrh~?p+4doWcLt=7=bL9CXr1G@fg%+j<&tkJBloAJFiiMnt zo!irHlG!kh40jBXeaDG|X-i}>9Oth%ug~Xmy??oWxL(&UpX{H#U6mBj3IG5oxt(_L z-DAez*$3a7oRj#0JwR^wx;g>%JncmQK-9XqobpSAtduQ32tKQsbunS-|3wsJ8mDxegtUoa*Ima^3#>+cyAUe#-l9o=_vzPf1 zHBRW6>R_o&CwrZt6K4)~1v9iovUiogZ(O-pOCsEj3ezISZz3<~_`6?qqHH+Abjevl zv@LuoCp=1uD^V`WYRJ;N*p7`%f!ZF?qh2POj81M^rGHNZ45cJg|(tU-xGQ~iM^45a+( z2d@2+H_5VVyMr!JZ`+-5VPcuU8;UhJ%kZ}dux<=BiT{RUqRiy0haj$D1#Y5dT3UVP z7(?}fI>v|cew5m%o#~nzqjUGTYvxl z*fEbI5bw|YZ(JdocuPh-X5+k{ey)&bUKuubRPO$wh(|-a=89MlF_+ z&5-lVXaE(7WlU7g7Eo6xPYe~amrq6dD}B6eZ;@|=U1gaUWnviWA=KlbrBo|t(xlKg zRA*hW(#!hEl*1+FkGMmo1fQ<(;qE$2@ro|yEx_L)2o;Pm`t4Kb%~+cHO%ZAA7jUvS zR$_CF(o3hv6L&?6Gi$xkqbYKEsRdytL{N`Ya{?n{e0S2s9Qr9GMQC$X$z$3;LLBIh z#koKHv?kX5wyRo1odV+{Wyb9kRdYpD#m@SnvM5kaQ+`<_6rLeAd^SCn+Axso@ceq~ zY}MGxOeBXYtOk>~Tzd4goX(^Akn)}FYaKZfRu89mNXR{jw#xnklnm$k|r|%;)O^hPjoEh}I(Uoe`JX z`Kis8^B+;omszXhk%bR|DT}9(uCe|?=-@9cjVv)k;itBRPopyLg^k8P=T>(W#Dg0j z{@$yfaZp-&!T0Y4?tf59$vU)6;f6#&?R#MYI@lEYv9I=jl?>7OU(xqfRYAk=$`vgM z=J<{`Dme13--96?E;`n`lI6WeO6&0SGfvRdyCf=jml1PLs~)M{(IP&cs~wj)yi%SK zs^Zm8<2AI+PwjMlR&;#nC_U(fYgM+^@gDesxAALcpOiT~mOsmaRnd7XRfNn;PH88g z3$gE9D)lMI>c-wq)|)x;M{Bsu8Ho&Y^@N}6zJWIwMa8u95CdH{6Ur5in*3CIL23Fi z&n!F6WFK|$1*3(hs8hG1s>({adGt@?_5Zy6uirUU=9pDKE@>J@Gnqh%`&z%ys7q}p zy;OR9WC@tp`%<3%W{iOpg3lROhDg8W-HBRy$Ozx&^ZXdvn!3HFas{mX(1e8>*_Bbd z*19xU(3X`(_2CSf_yQ~60w|)m{d_J^*^}G|x-%h5^_xMLB0bvjxW&R?;yl61-3`Dn zH5g`FlNp9_Xxj_R=zJPIFamfou2bQ9O>TK-nE^*Xc%=Got(bQLQ(=>jwcot0eolIoU?Sdr^W?r>SUlPkLg*BH@e85fz+nCz7f}rQ1!+g_uukr zK$s14)mjOc+s`JQwxd${0hIX zKd7%e8>k#Z;gJV#u@}P(m?@EVxU)q4b~!#L!hGLtkA8~zDOHR8a{rizdsvPucn{Go T%FJM|zX7)&y - - From c864b15c34524bdfe83eb6faf3c6d438b3a453a6 Mon Sep 17 00:00:00 2001 From: krtkush Date: Mon, 26 Nov 2018 01:18:33 +0530 Subject: [PATCH 079/207] Test code revert. --- .../main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index 706fec186..af9b88ac1 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -225,6 +225,6 @@ public class CheckForNewAppVersionTask extends AsyncTask { public static boolean isGithubApk() { - return true; + return getCertificateSHA1Fingerprint().equals(GITHUB_APK_SHA1); } } From 6bd8523ec28f2a9b663a23a0086b266d82cf96a5 Mon Sep 17 00:00:00 2001 From: ssantos Date: Thu, 22 Nov 2018 21:31:50 +0000 Subject: [PATCH 080/207] Translated using Weblate (Portuguese) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-pt/strings.xml | 78 +++++++++++++------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 293fa7d5b..35e542671 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -29,8 +29,8 @@ WebM — formato livre M4A — melhor qualidade Descarregar - Vídeo seguinte - Mostrar vídeos \'seguintes\' e \'semelhantes\' + Seguinte + Mostrar vídeos \'Seguintes\' e \'Semelhantes\' URL não suportado Idioma padrão do conteúdo Vídeo e áudio @@ -52,8 +52,8 @@ Usar Tor (Experimental) Usar a rede Tor para aumentar a privacidade (ainda não é suportada a emissão de vídeos). - Local para a descarga de áudio - Local para guardar o áudio descarregado + Pasta para a descarga de áudio + O áudio descarregado é guardado aqui Digite o caminho para os ficheiros de áudio Não foi possível criar o diretório \'%1$s\' @@ -67,11 +67,11 @@ Conteúdo Restringir conteúdo por idade - Vídeo com restrição de idade. É possível permitir este material através das Definições. + Mostrar vídeo com restrição de idade. É possível permitir este material através das \'Definições\'. Não foi possível processar totalmente o site Não foi possível configurar o menu de descargas - Esta é uma emissão em direto, as quais ainda não são suportadas. + Transmissões ao vivo ainda não são suportadas Não foi possível obter a emissão Desculpe, isto não deveria ter acontecido. Reportar erro por e-mail @@ -90,7 +90,7 @@ Toque para iniciar a pesquisa Reprodução automática Reproduzir vídeo se o NewPipe for invocado por outra aplicação - direto + Ao VIVO Reportar um erro Relatório @@ -165,7 +165,7 @@ Atualizar Limpar Segundo plano - Algumas resoluções não terão áudio se esta opção estiver ativa + Remove o áudio em algumas resoluções Lembrar último tamanho e posição do \"popup\" Redimensionar @@ -195,8 +195,8 @@ Subscrever Subscrito Canal não subscrito - Incapaz de alterar a subscrição - Incapaz de atualizar a subscrição + Incapaz de alterar a assinatura + Incapaz de atualizar a assinatura Principal Subscrições @@ -281,11 +281,11 @@ Detalhes Definições de áudio Iniciar reprodução aqui - Iniciar aqui em segundo plano - Iniciar aqui em \"popup\" + Iniciar de aqui quando pôr em segundo plano + Iniciar de aqui em novo \"pop-up\" Mostrar informação - Favoritos + Listas de reprodução marcadas Serviço Sempre @@ -294,7 +294,7 @@ Mudar orientação Importar base de dados Exportar base de dados - Irá sobrepor o seu histórico atual e subscrições + Substitui o histórico e as assinaturas atuais Exportar histórico, subscrições e listas de reprodução Em lista de espera no reprodutor em segundo plano Em lista de espera no reprodutor popup @@ -313,22 +313,22 @@ Renomear Doar - Nenhum reprodutor encontrado (pode instalar o reprodutor VLC) - Descarregar ficheiro da emissão. + Nenhum reprodutor encontrado (pode instalar o reprodutor VLC). + Descarregar ficheiro da emissão Adicionar a Utilizar pesquisa rápida A pesquisa rápida permite que a pesquisa seja mais rápida mas diminui a qualidade da precisão Carregar miniaturas - Desative para parar o carregamento das miniaturas e poupar dados e memória. Se alterar esta opção limpa a cache de memória e do disco + Desative para parar o carregamento das miniaturas e poupar dados e memória. Se alterar esta opção limpa a cache de memória e do disco. Cache de imagens limpa País padrão para o conteúdo Depuração Não foram encontradas emissões de vídeo Não foram encontradas emissões de áudio - Diretório inválido - Origem de conteúdo ou ficheiro inválida - Ficheiro inexistente ou permissões insuficientes para ler ou escrever + Diretório não existe + Não existe tal ficheiro/fonte de conteúdo + O ficheiro não existe ou as permissões para ler ou escrever faltam O nome do ficheiro não pode estar vazio Ocorreu um erro: %1$s Não existem emissões para descarregar @@ -338,8 +338,8 @@ Visite ao website NewPipe para obter mais informações e saber as novidades. Página \"kiosk\" Página da fonte - Exportação terminada - Importação terminada + Exportados + Importados Ficheiro ZIP inválido Aviso: nem todos os ficheiros foram importados. Está prestes a substituir a configuração atual. @@ -368,17 +368,17 @@ A obter informação… O conteúdo requisitado está carregando - Criar Nova Lista de Reprodução - Apagar Lista de Reprodução - Renomear Lista de Reprodução + Nova Lista de Reprodução + Apagar + Renomear Adicionar a Lista de Reprodução Guardar Lista de Reprodução nos Marcadores Remover Marcador - Deseja apagar esta lista de reprodução? + Apagar esta lista de reprodução\? Lista de Reprodução criada com sucesso Adicionado à lista de reprodução - Thumbnail da Lista de Reprodução modificada + Miniatura da Lista de Reprodução modificada. Sem Legenda Zoom @@ -386,7 +386,7 @@ Gerado automaticamente Legenda - Importar/Exportar + Importar/exportar Importar Importar a partir de Exportar para @@ -418,19 +418,19 @@ Nightcore Predefinido Limpar histórico de exibição - Auto anexar um fluxo relacionado quando jogar o último fluxo em uma fila não repetitiva - Mostrar dica \"mantenha pressionado para enfileirar\" + Auto anexar um fluxo relacionado quando jogar o último fluxo em uma fila não repetitiva. + Mostrar dica \"Mantenha pressionado para enfileirar\" Mostrar dica quando o botão de plano de fundo ou de popup for pressionado na página de detalhes do vídeo Canais Listas de reprodução Faixas Utilizadores Deleta o histórico de videos já reproduzidos - Deleta o histórico de videos já reproduzidos. + Apagar todo o histórico de visualizações\? Histórico de já assistidos deletado. Deleta histórico de pesquisa Deleta histórico de palavras chave pesquisadas - Deleta histórico de pesquisa completo. + Apagar todo o histórico de pesquisa\? Histórico de pesquisa deletado. 1 elemento deletado. @@ -443,22 +443,22 @@ \nA polícia de privacidade do NewPipe explica em detalhes qual dado é enviado e salvo quando você envia um relatório de erros. Ler a política de privacidade Próximo stream automaticamente em lista de espera - NewPipe é libre software copyleft: você pode usar, estudar, compartilhar e melhorar à sua vontade. Especificamente, você pode redistribuir e/ou modificá-la sob os termos da Licença Pública Geral GNU, conforme publicada pela Free Software Foundation, tanto a versão 3 da Licença, ou (por sua opção) qualquer versão posterior. + NewPipe é libre software copyleft: você pode usar, estudar, compartilhar e melhorar à sua vontade. Especificamente, você pode redistribuir e/ou modificá-la sob os termos da Licença Pública Geral GNU, conforme publicada pela Free Software Foundation, tanto a versão 3 da licença, ou (por sua opção) qualquer versão posterior. Deseja também importar configurações\? Reter para enfileirar - Enfileirar no fundo - Enfileirar em Popup + Enfileirar quando pôr no fundo + Enfileirar no novo \"pop-up\" Ação \'abrir\' preferida Ação padrão para abrir o conteúdo — %s Definir como miniatura na lista de reprodução - Não foi possível apagar a lista de reprodução + Não foi possível apagar a lista de reprodução. Ajuste Preencher - Modificar escala de texto do Player legenda e estilos de plano de fundo. Requer a reinicialização do aplicativo para ter efeito + Modificar escala de texto do Player legenda e estilos de plano de fundo. Requer a reinicialização do aplicativo para ter efeito. Ativar o LeakCanary Monitoramento de vazamento à memória pode fazer com que o aplicativo pare de responder quando fizer um heap dumping @@ -483,8 +483,8 @@ Ilimitado Limite de resolução quando usando dados móveis - Minimizar ao mudar o aplicativo - Ação ao mudar do player de vídeo principal para outro aplicativo —% s + Minimizar ao mudar o app + Ação ao mudar do player de vídeo principal para outro app —% s Nenhum Minimizar para o player de fundo Minimizar para o player de fundo From 94794987135437760f8934c9a6313c4ebf947dbc Mon Sep 17 00:00:00 2001 From: Gontzal Manuel Pujana Onaindia Date: Thu, 22 Nov 2018 11:54:05 +0000 Subject: [PATCH 081/207] Translated using Weblate (Basque) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-eu/strings.xml | 66 +++++++++++++------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index d73ab7a04..bbb9c9894 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -25,11 +25,11 @@ WebM — formatu librea M4A — kalitate hobea Deskargatu - Hurrengo bideoa + Hurrengoa Erakutsi \'hurrengo\' eta \'antzeko\' bideoak URLak ez du euskarririk Edukiaren hizkuntz lehenetsia - Bideoa eta Audioa + Bideoa eta audioa Erreproduzitu Bideoaren aurreikuspen argazkitxoa @@ -45,10 +45,10 @@ Erabili kanpo audio-erreproduzigailua Atzeko planoan erreproduzitzen Ukitu bilaketa hasteko - Audioa deskargatzeko kokapena + Audioa deskargatzeko karpeta Zehaztu audioa deskargatzeko bide-izena - Deskargatutako audioa gordetzeko bide-izena + Deskargatutako audioa hemen gordetzen da Erreprodukzio automatikoa Bideoa abiatzen du NewPipe beste aplikazio batek deitu badu Iluna @@ -56,7 +56,7 @@ Itxura Ireki laster-leiho moduan - Bereizmen batzuetan ez da audiorik izango aukera hau gaituz gero + Audioa kentzen du bereizmen batzuetan NewPipe laster-leiho modua Bigarren planoa Laster-leihoa @@ -78,9 +78,9 @@ Besteak Laster-leiho moduan erreproduzitzen Edukia - Erakutsi adinez mugatutako edukia - Bideoa adinez mugatuta dago. Ezarpenetan gaitu daiteke eduki mota hau. - zuzenean + Adinez mugatutako edukia + Erakutsi adinez mugatutako bideoa. Ezarpenetan gaitu daiteke eduki mota hau. + ZUZENEAN Deskargak Deskargak Errore-txostena @@ -104,7 +104,7 @@ Edukia ez dago eskuragarri GEMAk blokeatuta Ezin izan da deskargen menua ezarri - Hau ZUZENEKO JARIO bat da. Ez dago hauentzako euskarririk oraindik. + Zuzeneko jarioek ez dute euskarririk oraindik Ezin izan da jariorik eskuratu Ezin izan da irudia kargatu Aplikazioa/interfazea kraskatu da @@ -209,7 +209,7 @@ NewPipe jakinarazpena Erreproduzigailua Portaera - Historiala eta cache-a + Historia eta cache-a Erreprodukzio-zerrenda Desegin @@ -239,7 +239,7 @@ Historiala Bilatuta Ikusita - Historiala desgaituta dago + Historia desgaituta dago Historiala Historiala hutsik dago Historiala garbitu da @@ -317,7 +317,7 @@ Deskargatu jario fitxategia Erakutsi informazioa - Gogokoak + Gogoko erreprodukzio-zerrendak Gehitu hona @@ -328,25 +328,25 @@ Kendu cache-ko wegbuneen datu guztiak Metadatuen cache-a ezabatuta Gehitu ilarara hurrengo jarioa - Gehitu erlazionatutako jario bat azken jarioa jo bitartean errepikapenik gabeko ilara batean + Gehitu erlazionatutako jario bat azken jarioa jo bitartean errepikapenik gabeko ilara batean. Arazketa Fitxategia Inportatu datu-basea Esportatu datu-basea - Zure uneko historiala eta harpidetzak gainidatziko ditu + Zure uneko historiala eta harpidetzak gainidazten ditu Esportatu historiala, harpidetzak eta erreprodukzio-zerrendak Garbitu ikusitakoaren historiala Jotako jarioen historiala ezabatzen du - Ezabatu ikusitakoaren historial osoa. + Ezabatu ikusitakoaren historia osoa\? Ikusitakoaren historiala ezabatuta. Garbitu bilaketa historiala Ezabatu bilaketa gakoen historiala - Ezabatu bilaketen historial osoa. + Ezabatu bilaketen historia osoa\? Bilaketen historiala ezabatuta. - Direktorio baliogabea + Karpeta baliogabea Fitxategi edo edukiaren iturri baliogabea - Fitxategia ez dago edo ez dago baimen nahiko berau irakurri edo idazteko + Fitxategia ez dago edo ez dago baimenik irakurri edo idazteko Fitxategi izena ezin da hutsik egon Errore bat gertatu da: %1$s Ez dago jariorik deskargatzeko eskuragarri @@ -368,8 +368,8 @@ Jotako azkena Ikusiena - Esportazioa burututa - Inportazioa burututa + Esportatuta + Inportatuta Ez da baliozko ZIP fitxategia Ebisua: Ezin izan dira fitxategi guztiak inportatu. Honek oraingo ezarpenak gainidatziko ditu. @@ -382,9 +382,9 @@ Galdetu beti - Sortu erreprodukzio-zerrenda berria - Ezabatu erreprodukzio-zerrenda - Aldatu izena erreprodukzio-zerrendari + Erreprodukzio-zerrenda berria + Ezabatu + Aldatu izena Izena Gehitu erreprodukzio-zerrendara Ezarri erreprodukzio-zerrendaren iruditxo gisa @@ -392,11 +392,11 @@ Gogoko erreprodukzio-zerrenda Kendu gogokoa - Erreprodukzio zerrenda hau ezabatu nahi duzu? + Erreprodukzio zerrenda hau ezabatu\? Erreprodukzio-zerrenda sortuta - Erreprodukzio-zerrendara gehituta - Erreprodukzio zerrendaren iruditxoa aldatuta - Ezin izan da erreprodukzio-zerrenda ezabatu + Erreprodukzio-zerrendatua + Erreprodukzio zerrendaren iruditxoa aldatuta. + Ezin izan da erreprodukzio-zerrenda ezabatu. Azpititulurik ez @@ -407,13 +407,13 @@ Automatikoki sortuak Azpitituluak - Aldatu azpitituluen testuaren eskala eta atzealdeko estiloa. Aplikazioa berrabiarazi behar da aldaketak aplikatzeko + Aldatu azpitituluen testuaren eskala eta atzealdeko estiloa. Aplikazioa berrabiarazi behar da aldaketak aplikatzeko. Gaitu LeakCanary Memoria galeren monitorizazioa. Aplikazioak agian ez du erantzungo memoriaren aitortza egin bitartean Eman bizitza-ziklo kanpoko erroreen berri - Inportatu/Esportatu + Inportatu/esportatu Inportatu Inportatu hemendik Esportatu hona @@ -453,8 +453,8 @@ Ezarpenak ere inportatu nahi dituzu? Bilaketa ez zehatzak posizioak azkarrago baina prezisio gutxiagoz bilatzea ahalbidetzen du - "Desgaitu iruditxoak kargatzea gelditzeko eta datuak eta memoria aurrezteko. Hau aldatzean memoria eta diskoko irudien cache-ak garbituko dira" - NewPipe Software Librea eta Copyleft da: Nahi eran 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. + Desgaituta dagoenean koadro txikiak ez dira kargatuko datuak eta memoria aurreztuz. Aldaketak memoria eta diskoko irudien cache-ak garbituko ditu. + 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. Behartu aktibitatearen bizitza ziklotik kanpo baztertu eta gero entregatu ezin diren Rx salbuespenen inguruko txostena NewPipe pribatutasun politika @@ -472,8 +472,8 @@ Urratsa Leheneratu - Minimizatu aplikazioa aldatzean - Ekintza bideo erreproduzigailu nagusitik beste aplikazio batera aldatzean — %s + Minimizatu app-a aldatzean + Ekintza bideo erreproduzigailu nagusitik beste app batera aldatzean — %s Bat ere ez Minimizatu bigarren planoko erreproduzigailura Minimizatu laster-liho erreproduzigailura From bd40e2c3ff649a356e1ec30afd19922c0030be48 Mon Sep 17 00:00:00 2001 From: Viktar Vauchkevich Date: Sat, 24 Nov 2018 20:41:11 +0000 Subject: [PATCH 082/207] Translated using Weblate (Belarusian) Currently translated at 86.7% (332 of 383 strings) --- app/src/main/res/values-be/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 9be24b972..6befd5395 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -18,7 +18,7 @@ Выбраць браўзэр паварот Знешні відэаплэер - У некаторых разрозненнях НЕ будзе гуку, калі гэтая опцыя абраная + Адключае гук для НЕКАТОРЫХ разрозненняў Знешні аўдыяплэер NewPipe ў акне Падпісацца @@ -30,7 +30,7 @@ Галоўная Падпіскі - Закладкі + Адзначаныя плэйлісты Што новага @@ -42,8 +42,8 @@ Папка для захоўвання загружаных відэа Увядзіце шлях да папкі для загрузкі відэа - Шлях загрузкі аўдыё - Папка для захоўвання загружаных аўдыё + Тэчка загрузкі аўдыё + "Сюды захоўваецца загружанае аўдыё " Увядзіце шлях да папкі для загрузкі аўдыё Аўтапрайграванне From f1483e8c8e006fb3477bca6522a44e87ee4e6b02 Mon Sep 17 00:00:00 2001 From: Whod Date: Tue, 20 Nov 2018 17:52:01 +0000 Subject: [PATCH 083/207] Translated using Weblate (Bulgarian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-bg/strings.xml | 71 ++++++++++++++------------ 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 266c458e7..dd2f5caf4 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -11,12 +11,12 @@ Изтегли Търси Настройки - Може би имахте в предвид: %1$s ? + Може би имахте в предвид: %1$s\? Сподели с Избери браузър ориентация Използвай външен видео плейър - Някои резолюции няма да имат вграден аудио поток, ако тази опция е избрана + Премахва аудио при НЯКОИ резолюции Използвай външен аудио плейър NewPipe в прозорец Абониране @@ -72,15 +72,15 @@ Възобнови при връщане на фокус Продължавай възпроизвеждането след прекъсване (например телефонно обаждане) Изтегли - Следващ клип - Показвай „следващ“ и „подобни“ - Показвай съвет „задръж за добавяне“ - Непознат URL + Следващ + Показвай „Следващ“ и „Подобни“ + Показвай съвет „Задръж за добавяне“ + Неподържан URL Език на съдържанието по подразбиране Плейър Поведение - Видео & Аудио - История и кеш-памет + Видео & аудио + История и кеш Нов прозорец Външност Други @@ -90,9 +90,9 @@ Включен в опашката в нов прозорец Възпроизвеждане Съдържание - Покажи съдържание за възрастни - Съдържание за възрастни. Разрешаването на такова съдържание става от Настройки. - на живо + Съдържание за възрастни + Покажи съдържание за възрастни. Разрешаването на такова съдържание става от \"Настройки\". + НА ЖИВО Изтегляния Изтегляния Съобщение за грешка @@ -111,7 +111,7 @@ Възпроизведи всички Известия от NewPipe - Известия за фоновия плейър и плейъра в отделен прозорец на NewPipe + Известия за Фонов плейър и плейъра в Отделен прозорец на NewPipe [Неизвестен] @@ -123,7 +123,7 @@ Съдържанието не е налично Блокирано от „GEMA“ Не мога да настроя меню за сваляне - Това е предаване на живо, което все още не се поддържа. + Предаването на живо все още не се поддържа Не мога да достъпя нито един поток Не мога да заредя изображение Приложението или потребителският интерфейс се сринаха @@ -211,11 +211,11 @@ Лицензи Безплатно и леко поточно предаване за Android. Виж в GitHub - Изтегли стрийм файл. + Изтегли стрийм файл Покажи инфо Главен - Отметки + Отметнати плейлисти Добави към @@ -227,7 +227,7 @@ Премахни всички метаданни за уебстраници от кеш-паметта Кеш-паметта с метаданни бе изтрита Автоматично нареди на опашка следващия - "Автоматично прибавяне на сродно съдържание при неповтарящ се преглед " + Автоматично прибавяне на сродно съдържание при неповтарящ се преглед. Държава, за която да бъде показвано съдържание Услуга Отстраняване на грешки @@ -242,14 +242,14 @@ Импортиране на база данни Експортиране на база данни - Ще замени текущите история и абонаменти + Замества текущите история и абонаменти Експортиране на историята, абонаментите и плейлистите Изтрий историята с изгледани - Изтрий цялата история с изгледани. + Изтрий цялата история с изгледани\? Историята с изгледани е изтрита. Изтрий историята на търсенията Изтрива историята с въвежданите за търсене ключови думи - Изтрий цялата история на търсенията. + Изтрий цялата история на търсенията\? Историята на търсенията е изтрита. URL подписът на клипа не можа да бъде дешифрован Външните плейъри не поддържат този вид линкове @@ -284,8 +284,8 @@ \nНашата политика за личните данни обяснява подробно какви данни изпращате и къде се съхраняват, когато изпращате съобщения за грешки. Прочетете нашата политика за поверителност Лицензът на NewPipe - Липсва стрийм плейър (можете да изтеглите VLC, за да пуснете стрийма) - Изключете, за да спрете зареждането на всички миниатюри, спестявайки трафик и памет. При промяна на тази настройка, текущата кеш-памет на изображенията ще бъде изтрита + Липсва стрийм плейър (можете да изтеглите VLC, за да пуснете стрийма). + Изключете, за да спрете зареждането на всички миниатюри, спестявайки трафик и памет. При промяна на тази настройка, текущата кеш-памет на изображенията ще бъде изтрита. Показвай подсказка, когато е избран фонов режим или режим в прозорец на страницата с детайли на съответния клип Изтрива историята на възпроизвежданите стриймове Не са намерени видео стриймове @@ -305,14 +305,14 @@ \nвъзпроизвеждане в отделен прозорец 1 елемент е изтрит. - reCAPTCHA + преКАПЧА reCAPTCHA заявка Изисква се въвеждане на reCAPTCHA Изтегляне Повечето специални символи - NewPipe е безплатен „copyleft“ софтуер: Можете да го използвате, изучавате, споделяте и подобрявате по ваше усмотрение. В частност, Вие можете да препубликувате и/или модифицирате приложението според правилата на Главния обществен лиценз на ГНУ, издаден от Фондацията за свободен софтуер – версия 3 на лиценза или по-нова. + NewPipe е безплатен „copyleft“ софтуер: Можете да го използвате, изучавате, споделяте и подобрявате по желание. В частност, Вие можете да препубликувате и/или модифицирате приложението според правилата на Главния обществен лиценз на ГНУ, издаден от Фондацията за свободен софтуер – версия 3 на лиценза или по-нова. Прочетете лиценза @@ -356,11 +356,11 @@ Детайли Аудио настройки Задръжте, за да поставите на опашката - На опашката във „фонов режим“ - На опашката в „режим в прозорец“ + На опашката при „фонов режим“ + На опашката при „режим в прозорец“ Възпроизвеждане от тук - Възпроизвеждане от тук във фонов режим - Възпроизвеждане от тук в прозорец + Възпроизвеждане от тук при фонов режим + Възпроизвеждане от тук при прозорец Отвори навигационната лента Затвори навигационната лента @@ -378,9 +378,9 @@ Получаване на инфо… Зареждане на заявеното съдържание - Създай Нов Плейлист - Изтрий Плейлист - Преименувай Прелист + Нов Плейлист + Изтрий + "Преименувай " Име Добави Към Плейлист Задай като миниатюра на плейлиста @@ -391,8 +391,8 @@ Искате ли да изтриете този плейлист? Плейлистът е създаден Добавено към плейлист - Миниатюрата на плейлиста е сменена - Плейлистът не можа да бъде изтрит + Миниатюрата на плейлиста е сменена. + Плейлистът не можа да бъде изтрит. Без надписи @@ -403,13 +403,13 @@ Авто-генерирани Надписи - Модифицирай мащаба на текста и фона на надписите. Изисква рестарт на приложението, за да се приложат промените + Модифицирай мащаба на текста и фона на надписите. Изисква рестарт на приложението, за да се приложат промените. Включи LeakCanary Следенето за пропускане на памет може да направи приложението нестабилно Докладвай за извънредни грешки - Импортиране/експортиране + Импортиране/Експортиране Импортирай Импортирай от Експортирай в @@ -464,4 +464,7 @@ Възстанови Стъпка + Насили докладването на неизпращаеми Rx изключения извън фрагмента или кръговрата на активност след приключване + + Откачи (може да предизвика промени) From e40882455decd41e8d6b75eafe2b04b40f0f311b Mon Sep 17 00:00:00 2001 From: ditokp Date: Sat, 24 Nov 2018 07:41:09 +0000 Subject: [PATCH 084/207] Translated using Weblate (Indonesian) Currently translated at 99.7% (382 of 383 strings) --- app/src/main/res/values-id/strings.xml | 135 +++++++++++++++---------- 1 file changed, 80 insertions(+), 55 deletions(-) diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 56cca9bbd..5f4555fc2 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -20,7 +20,7 @@ Masukkan lokasi unduhan video Lokasi unduhan audio - Lokasi untuk menyimpan audio yang diunduh + Audio yang terunduh di simpan disini Masukkan lokasi unduhan berkas audio Putar otomatis @@ -29,7 +29,7 @@ Putar dengan Kodi Aplikasi Kore tidak ditemukan. Pasang Kore? Tampilkan opsi \"Putar dengan Kodi\" - Tampilkan opsi untuk memutar video via media center Kodi + Tampilkan opsi untuk memutar video via Kodi Audio Format audio baku WebM — format bebas @@ -39,23 +39,23 @@ Terang Unduh - Video berikutnya - Tampilkan video \'berikutnya\' dan \'serupa\' + Berikutnya + Tampilkan video \'Berikutnya\' dan \'Serupa\' URL tidak didukung Bahasa konten baku - Video & Audio + Video & audio Tampilan Lainnya Putar di latar belakang Putar Konten - Tampilkan konten batasan usia - "Video Dibatasi Usia. Memperbolehkan ditonton dapat diatur lewat Pengaturan." + Konten yang dibatasi usia + "Perlihatkan Video yang Dibatasi Usia. Memperbolehkan ditonton dapat diatur lewat \"Pengaturan\"." Galat jaringan Tidak bisa memuat semua Thumbnail - Maksud Anda: %1$s ? + Maksud Anda: %1$s\? rotasi - langsung + LANGSUNG Unduhan Unduhan Laporan galat @@ -66,7 +66,7 @@ Konten tidak tersedia Diblokir oleh GEMA Tidak bisa menyiapkan menu unduhan - Ini adalah SIARAN LANGSUNG, yang sekarang ini belum didukung. + Siaran langsung belum didukung Tidak bisa memuat gambar Maaf, hal tersebut seharusnya tidak terjadi. Lapor galat via surat elektronik @@ -87,7 +87,7 @@ (Eksperimental) Paksa trafik unduhan melalui Tor untuk meningkatkan privasi (video stream belum didukung). Laporkan sebuah Galat Tidak bisa membuat direktori unduhan \'%1$s\' - Membuat direktori unduhan \'%1$s\' + Direktori unduhan dibuat \'%1$s\' Video Audio @@ -123,7 +123,7 @@ Thread reCAPTCHA - Rintangan reCAPTCHA + Tantangan reCAPTCHA Meminta kode reCAPTCHA @@ -143,7 +143,7 @@ Buka di mode popup Izin ini dibutuhkan untuk -membuka di mode popup +\nmembuka di mode popup Mode popup NewPipe @@ -164,7 +164,7 @@ membuka di mode popup Bersihkan Filter - Beberapa resolusi TIDAK akan memiliki suara ketika opsi ini diaktifkan + Menghapus audio pada BEBERAPA resolusi Ingat ukuran dan posisi popup Ingat ukuran dan posisi terakhir popup @@ -196,7 +196,7 @@ membuka di mode popup Tentang Kontributor Lisensi - Aplikasi streaming gratis dan ringan untuk Android. + Aplikasi streaming libre dan ringan untuk Android. Lihat di Github Lisensi NewPipe Terlepas apakah Anda memiliki ide untuk; terjemahan, perubahan desain, pembersihan kode, atau perubahan kode yang signifikan, segala bantuan akan selalu diterima. Semakin banyak akan semakin baik jadinya! @@ -219,23 +219,23 @@ membuka di mode popup Riwayat Riwayat kosong Muat thumbnail - Nonaktifkan untuk berhenti memuat semua thumbnail dan menghemat penggunaan data dan memori. Mengubah ini akan menghapus tembolok gambar pada diska dan memory + Saat tidak ada pemuatan thumbnail, hemat data dan penggunaan memori. Perubahan menghapus cache gambar baik di memori dan di disk. Tembolok gambar dihapus Hapus tembolok metadata Buang semua data tembolok laman web Tembolok metadata dihapus - Otomatis tambahkan stream yang terkait ketika memutar stream terakhir dalam antrean tanpa perulangan + Otomatis tambahkan saluran yang terkait ketika memutar saluran terakhir dalam antrean tanpa perulangan. Simpan daftar video yang telah ditonton - Tampilkan tip \"tahan untuk menambahkan\" + Tampilkan tip \"Tahan untuk menambahkan\" Tampilkan tip ketika tombol latar belakang atau popup ditekan pada halaman detail video Negara konten baku Layanan Pemutar Perilaku - Riwayat & Tembolok + Riwayat & cache Debug Mengantre di belakang pemutar - Mengantre di popup pemutar + Mengantre di pemutar popup Daftar Putar Tidak jadi Putar Semua @@ -243,7 +243,7 @@ membuka di mode popup Hanya Sekali Berkas - "Notifikasi untuk Latar Belakang NewPipe dan Popup Pemutar " + Notifikasi untuk latar belakang NewPipe dan pemutar popup [Tidak diketahui] @@ -254,7 +254,7 @@ membuka di mode popup Impor database Ekspor database - Akan menimpa riwayat dan langganan kamu saat ini + Timpa riwayat dan langganan Anda saat ini Ekspor riwayat, daftat langganan dan daftar putar Tidak bisa memutar stream ini Galat yg tidak bisa dipulihkan terjadi di pemutar @@ -263,14 +263,14 @@ membuka di mode popup URL tidak valid Stream video tidak ditemukan Stream audio tidak ditemukan - Direktori tidak valid - Berkas/konten sumber tidak valid - Berkas tid tersedia atau tidak memiliki izin untuk membaca atau menulisnya + Tidak ada folder seperti itu + Tidak ada berkas/sumber konten seperti itu + Berkas tidak tersedia atau tidak memiliki izin untuk membaca atau menulisnya Nama berkas tidak boleh kosong Sebuah galat terjadi: %1$s Tidak ada hasil - Tidak Ada Apapun Disini + Tidak ada apapun disini selain jangkrik Geser untuk ubah urutan Tidak ada pelanggan @@ -315,10 +315,10 @@ membuka di mode popup Laman Umpan Laman Kanal Pilih sebuah kanal - Tidak ada kanal yg dilanggani + Tidak ada kanal yang dilanggani Pilih sebuah kios - Ekspor berhasil - Impor berhasil + Terekspor + Terimpor Berkas ZIP tidak valid Perhatian: Tidak dapat mengimpor semua berkas. Ini akan menimpa pengaturan kamu saat ini. @@ -327,17 +327,17 @@ membuka di mode popup Tren Top 50 Baru & Panas - Pemutar Latar Belakang - Popup Pemutar + Pemutar latar belakang + Pemutar popup Hapus Rincian Pengaturan Audio - Tahan Untuk Mengantre - Antre di Latar Belakang - Antre di Popup - Mulai Putar di Sini - Mulai Disini di Latar Belakang - Mulai Disini dengan Popup + Tahan untuk mengantre + Antre saat di latar belakang + Antre di popup baru + Mulai putar di sini + Mulai disini ketika di latar belakang + Mulai disini di popup baru Buka Menu Tutup Menu @@ -352,9 +352,9 @@ membuka di mode popup Mendapatkan info… Memuat konten yang diminta - Buat Daftar Putar Baru - Hapus Daftar Putar - Ubah Nama Daftar Putar + Daftar Putar Baru + Hapus + Ubah Nama Nama Tambah Ke Daftar Putar Atur sebagai Thumbnail Daftar Putar @@ -362,11 +362,11 @@ membuka di mode popup Markah Daftar Putar Hapus Markah - Kamu ingin menghapus daftar putar ini? + Hapus daftar putar ini\? Daftar putar dibuat - Ditambahkan ke daftar putar - Thumbnail daftar putar diubah - Tidak bisa menghapus daftar putar + Masuk dalam daftar putar + Thumbnail daftar putar diubah. + Tidak bisa menghapus daftar putar. Tidak Ada Takarir @@ -383,8 +383,8 @@ membuka di mode popup Aktifkan LeakCanary Nightcore Bawaan -Tidak ada aplikasi pemutar stream (Anda bisa memasang VLC untuk memutarnya) - Unduh berkas stream. +Tidak ada aplikasi pemutar stream (Anda bisa memasang VLC untuk memutarnya). + Unduh berkas stream Tidak bisa mengubah langganan Tampilkan info @@ -392,11 +392,11 @@ membuka di mode popup Hapus riwayat menonton Hapus riwayat stream yang diputar - Hapus seluruh riwayat menonton. + Hapus seluruh riwayat menonton\? Riwayat menonton dihapus. Hapus riwayat pencarian Hapus riwayat dari ketikan pencarian - Hapus seluruh riwayat pencarian. + Hapus seluruh riwayat pencarian\? Riwayat pencarian dihapus. Tidak ada stream yang tersedia untuk diunduh @@ -405,7 +405,7 @@ membuka di mode popup Tidak ada aplikasi terpasang untuk memutar file ini Sudah dilihat - Markah + Bookmarked Playlists Antre otomatis stream berikutnya Berhenti langganan channel ini @@ -413,21 +413,21 @@ membuka di mode popup Langganan Gunakan pencarian cepat yang tidak beraturan Pencarian tidak beraturan memungkinkan pengguna untuk mencari posisi lebih cepat dengan ketepatan yang berkurang - NewPipe adalah perangkat lunak libre copyleft: Anda dapat menggunakannya, mempelajarinya, berbagi, dan meningkatkannya sesuai keinginan Anda. Secara khusus Anda dapat mendistribusikan ulang dan/atau memodifikasinya di bawah syarat-syarat Lisensi GNU General Public License yang diterbitkan oleh Free Software Foundation, baik versi 3 dari Lisensi, atau (sesuai pilihan Anda) versi yang lebih baru. + NewPipe adalah perangkat lunak libre copyleft: Anda dapat menggunakannya, mempelajarinya, berbagi, dan meningkatkannya. Secara khusus Anda dapat mendistribusikan ulang dan/atau memodifikasinya di bawah syarat-syarat Lisensi GNU General Public License yang diterbitkan oleh Free Software Foundation, baik versi 3 dari Lisensi, atau (sesuai pilihan Anda) versi yang lebih baru. Apa Anda ingin juga mengimpor pengaturan? Tindakan \'buka\' yang disukai Aksi bawaan ketika membuka konten — %s Takarir - Mengubah skala keterangan teks pemutar dan gaya latar belakang. Perlu memulai ulang aplikasi untuk melihat hasilnya + Mengubah skala keterangan teks pemutar dan gaya latar belakang. Perlu memulai ulang aplikasi untuk melihat hasilnya. Pemantauan kebocoran memori dapat menyebabkan aplikasi menjadi tidak responsif saat terjadi dumping - Laporkan Kesalahan di-Luar-Siklus + Laporkan kesalahan di-Luar-siklus Memaksa pelaporan pengecualian Rx yang tidak dapat dikirim di luar kepingan atau siklus hidup aktivitas setelah dibuang - Impor/Ekspor + Impor/ekspor Impor Impor dari Ekspor ke @@ -461,5 +461,30 @@ membuka di mode popup Kontrol Kecepatan Pemutaran Tempo Nada - Lepas kaitan (dapat menyebabkan distorsi) - + Batalkan tautan (dapat menyebabkan distorsi) + Saluran + Daftar putar + Trek + Pengguna + Kebijakan Privasi NewPipe + Proyek NewPipe sangat memperhatikan privasi Anda. Oleh karena itu, aplikasi tidak mengumpulkan data apapun tanpa sepengetahuan Anda. +\nKebijakan privasi NewPipe menjelaskan secara detail data apa yang dikirim dan disimpan ketika Anda mengirimkan laporan kerusakan. + Baca kebijakan privasi + Percepat saat diam + Langkah + Atur ulang + + Agar sesuai dengan Peraturan Perlindungan Data Umum Eropa (GDPR), dengan ini kami menarik perhatian Anda ke kebijakan privasi NewPipe. Silakan baca dengan seksama. +\nAnda harus menerimanya untuk mengirimkan laporan bug kepada kami. + Setuju + Tolak + + Tanpa batas + Batasi resolusi saat menggunakan data mobile + Minimalkan saat beralih aplikasi + Tindakan ketika beralih ke aplikasi lain dari pemutar video utama — %s + Tidak ada + Minimalkan ke pemutar latar belakang + Minimalkan ke pemutar popup + + From fabc5ae0325f97fba9063d7342780553ce48f9b1 Mon Sep 17 00:00:00 2001 From: Mostafa Ahangarha Date: Wed, 21 Nov 2018 18:07:15 +0000 Subject: [PATCH 085/207] Translated using Weblate (Persian) Currently translated at 62.4% (239 of 383 strings) --- app/src/main/res/values-fa/strings.xml | 133 ++++++++++++++++++++++++- 1 file changed, 132 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 4175f0a8b..4e3dd0455 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -119,7 +119,7 @@ در حافظه رونوشت شد. لطفاً یک شاخهٔ بارگیری موجود را برگزینید. -هیچ پخش کننده استریمی پیدا نشد (شما می‌توانید برنامه وی‌ال‌سی را برای پخش آن نصب نمایید) +هیچ پخش کننده جریانی پیدا نشد (شما می‌توانید برنامه وی‌ال‌سی را برای پخش آن نصب کنید). بارگیری پرونده جریان. هنگامی که این گزینه فعال باشد، برخی از کیفیت‌ها فاقد صدا خواهند بود اشتراک @@ -194,4 +194,135 @@ بدون محدودیت هیچ + بهترین وضوح + تمام تاریخچه نمایش پاک شود؟ + تاریخچه نمایش پاک شد. + پاک‌کردن تاریخچه جستجو + تاریخچه کلیدواژه‌های جستجو را پاک می‌کند + تمام تاریخچه جستجو پاک شود؟ + تاریخچه جستجو پاک شد. + ناتوانی در بارگذاری تصویر + ناتوانی در پخش این جریان + نشانی نامعتبر + هیچ جریان ویدئویی پیدا نشد + هیچ جریان صدایی پیدا نشد + چنین پوشه‌ای وجود ندارد + چنین منبع محتوا/پرونده‌ای وجود ندارد + نام پرونده نمی‌تواند خالی باشد + خطایی رخ داد: %1$s + جریانی برای بارگیری در دسترس نیست + + بدون نتیجه + استفاده از پخش‌کننده قدیمی + K + M + B + + + %s مشترک + %s مشترک + + + بدون بازدید + + %s بازدید + %s بازدید + + + بدون ویدئو + + %s ویدئو + %s ویدئو + + + ایجاد + پاک کردن یک مورد + پاک‌کردن همه + صرف نظر + تغییر نام + + یک مورد پاک شد. + + نویسه‌های مجاز در نام پرونده‌ها + نویسه‌های نامعتبر با این مقدار جایگزین شدند + نویسه جایگزین + + حروف و اعداد + مهم‌ترین نویسه‌های خاص + + کاره‌ای برای پخش این پرونده نصب نشده است + + درباره نیوپایپ + تنظیمات + درباره + ناتوانی در بارگذاری پروانه + گشودن وب‌سایت + درباره + مشارکت‌کنندگان + پروانه‌ها + پخش‌کننده آزاد سبُک برای اندروید. + مشارکت + دیدن روی گیت‌هاب + اعانه + وب‌سایت + سیاست حریم خصوصی نیوپایپ + خواندن سیاست حریم خصوصی + پروانه نیوپایپ + خواندن پروانه + + + تاریخچه + جستجو شده + دیده‌شده + تاریخچه غیرفعال است + تاریخچه + تاریخچه خالی است + تاریخچه پاک شد + مورد پاک شد + می‌خواهید این مورد را از تاریخچه جستجو پاک کنید؟ + می‌خواهید این مورد را از تاریخچه نمایش پاک کنید؟ + می‌خواهید همه موارد را از تاریخچه پاک کنید؟ + آخرین پخش‌شده + بیشترین پخش‌شده + + محتوای صفحه اصلی + صفحه خالی + صفحه کیوسک + صفحه اشتراک‌ها + صفحه خوراک + صفحه کانال + کانالی را انتخاب کنید + هنز کانال مشترک‌شده‌ای وجود ندارد + یک کیوسک را انتخاب کنید + کیوسک + محبوب + ۵۰ ویدئوی برتر + جدید و داغ + پخش‌کننده پس‌زمینه + حذف + جزئیات + تنظیمات صدا + پخش‌کننده ویدئو + پخش‌کننده پس‌زمینه + همیشه بپرس + + در حال دریافت اطلاعات… + بارگذری محتوای درخواستی + + فهرست پخش جدید + پاک‌کردن + تغییر نام + نام + افزودن به فهرست پخش + استفاده به عنوان تصویر فهرست پخش + + این فهرست پخش پاک شود؟ + فهرست پخش ایجاد شد + به فهرست پخش افزوده شد + تصویر فهرست پخش تغییر کرد. + ناتوانی در پاک‌کردن فهرست پخش. + + بدون توضیحات + + توضحیات From 28e78d98f68efcfac4f6aca34a25d4be92b206bb Mon Sep 17 00:00:00 2001 From: Eduardo Caron Date: Tue, 20 Nov 2018 22:16:49 +0000 Subject: [PATCH 086/207] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-pt-rBR/strings.xml | 62 +++++++++++----------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index a3bec6ccb..8f644cdc9 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -8,7 +8,7 @@ WebM — formato aberto %1$s visualizações Reproduzir - Vídeo com restrição de idade. Permissão para vídeos com essa restrição podem ser feitas no menu configurações. + Vídeo com restrição de idade. Permissão para vídeos com essa restrição podem ser feitas no menu \"Configurações\". Vídeo Reproduz o vídeo quando o NewPipe for aberto a partir de outro aplicativo Reproduzir automaticamente @@ -49,7 +49,7 @@ Servidor não suportado Aguarde… Erro de rede - Próximo vídeo + Próximo Abrir no navegador Pausar reCAPTCHA @@ -65,8 +65,8 @@ Vídeo & Áudio Compartilhar Compartilhar com - Exibir conteúdo com restrição de idade - Exibir \'próximo\' vídeo e \'relacionados\' + Conteúdo com restrição de idade + Exibir \'Próximo\' vídeo e \'Relacionados\' Desculpe, isto não deveria ter acontecido. Iniciar Permissão para acessar armazenamento negada @@ -86,15 +86,15 @@ Thumbnail do vídeo Miniatura do usuário que enviou o vídeo Informe o local para download de áudios - Local para salvar áudios baixados - Local de download de áudio + Áudios baixados são gravados aqui + Pasta de download de áudio Informe o local para download de vídeos Local para salvar vídeos baixados Local de download de vídeo Aplicativo Kore não instalado. Instalar? Não foi possível interpretar completamente o site Miniatura do vídeo - Isto é uma transmissão ao vivo, a qual ainda não é suportada. + "Transmissões ao vivo ainda não são suportadas " Toque em pesquisar para começar Arquivo já existe Threads @@ -152,7 +152,7 @@ abrir em modo popup Popup Redimensionamento - Algumas resoluções não terão áudio quando esta opção estiver habilitada + Remove o áudio em ALGUMAS resoluções Controle do player por gestos Usar gestos para controlar o brilho da tela e volume do player Sugestões de busca @@ -256,7 +256,7 @@ abrir em modo popup Em Alta Top 50 Novos e tendências -"Mostrar dica \"mantenha pressionado para enfileirar\"" +Mostrar dica \"Mantenha pressionado para enfileirar\" Mostrar dica quando o botão de plano de fundo ou de popup for pressionado na página de detalhes do vídeo Adicionado a fila do reprodutor em plano de fundo Adicionado a fila no reprodutor popup @@ -277,14 +277,14 @@ abrir em modo popup Adicionar a fila em Plano de Fundo Adicionar a fila em Popup Iniciar a reproduzir à partir daqui - Iniciar aqui em Plano de Fundo - Iniciar aqui em popup + Iniciar aqui quando estiver em Plano de Fundo + Iniciar aqui em novo popup Doar NewPipe é desenvolvido por voluntários que usam seu tempo para trazer a melhor experiência para você. Retribua para ajudar os desenvolvedores a tornarem o NewPipe ainda melhor enquanto desfrutam uma xícara de café. Retribuir Site oficial Visite o site do NewPipe para mais informações e novidades. - Nenhum reprodutor de stream encontrado (você pode instalar o VLC para reproduzir isto) + Nenhum reprodutor de stream encontrado (você pode instalar o VLC para reproduzir isto). País do conteúdo padrão Serviço Sempre @@ -309,18 +309,18 @@ abrir em modo popup Carregando o conteúdo requisitado Importar base de dados Exportar base de dados - Isso irá sobrescrever seu histórico e inscrições + Sobrescreve seu histórico e inscrições Exportar histórico, inscrições e listas de reprodução - Exportação completa - Importação completa + Exportado + Importado Não há nenhum arquivo ZIP válido Aviso: Não foi possível importar todos arquivos. Isso irá sobrescrever suas configurações atuais. - Baixar arquivo de stream. + Baixar arquivo de stream Mostrar informações - Favoritos + Playlists favoritas Adicionar a @@ -339,9 +339,9 @@ abrir em modo popup Sempre perguntar - Criar nova Lista de Reprodução - Apagar Lista de Reprodução - Renomear Lista de Reprodução + Nova Lista de Reprodução + Apagar + Renomear Nome Adicionar a Lista de Reprodução Definir como Miniatura da Lista de Reprodução @@ -349,11 +349,11 @@ abrir em modo popup Favoritar Lista de Reprodução Remover Favorito - Deseja remover esta lista de reprodução? + Deletar esta lista de reprodução\? Lista de Reprodução criada Adicionado a lista de reprodução - Miniatura para a lista de reprodução alterada - Falha ao apagar lista de reprodução + Miniatura da lista de reprodução alterada. + Falha ao apagar lista de reprodução. Sem Legendas @@ -379,13 +379,13 @@ abrir em modo popup Usar índice de indexação rápido porém não preciso Usar índice de indexação inexato Adicionar a próxima stream à fila automaticamente - Auto anexar uma stream relacionada quando a reprodução iniciar na última stream em uma fila não repetitiva + Auto anexar uma stream relacionada quando a reprodução iniciar na última stream em uma fila não repetitiva. Sincronizar Arquivo - Diretório inválido - Origem do arquivo/conteúdo inválido + Pasta não encontrada + Origem do arquivo/conteúdo não econtrada Arquivo não existe ou não há permissão para ler ou escrever nele Nome do arquivo não pode ser vazio Um erro ocorreu: %1$s @@ -427,7 +427,7 @@ abrir em modo popup Cache de metadados foi limpo Controles de Velocidade de Reprodução "Tempo " - Desabilite para para de carregar todas as miniaturas e economizar dados e uso de memória. Alterar esta configuração irá limpar o cache de imagens na memória e em disco + Quando desligado miniaturas não carregarão, economizando dados e uso de memória. Alterar esta configuração irá limpar o cache de imagens na memória e em disco. Passo Desvincular (pode causar distorção) Padrão @@ -439,22 +439,22 @@ abrir em modo popup Abrir gaveta Fechar gaveta Legendas - Modifique o tamanho da legenda e o estilo da tela de fundo. Necessário reiniciar o aplicativo para ter efeito + Modifique o tamanho da legenda e o estilo da tela de fundo. Necessário reiniciar o aplicativo para ter efeito. Night-core Nenhum player instalado para reproduzir este arquivo "Limpar histórico de já assistidos " Deleta o histórico de videos já reproduzidos - Deleta todo o histórico de já reproduzidos. + Deletar todo o histórico de já reproduzidos\? Histórico de já assistidos deletado. Limpar histórico de pesquisa Deleta histórico de palavras chave pesquisadas - Deletar todo o histórico de pesquisa. + Deletar todo o histórico de pesquisa\? Histórico de pesquisa deletado. 1 item deletado. - NewPipe is copyleft libre software: Você pode usar, estudar, compartilhar e melhorar ele a vontade. Mais especificamente você pode redistribuir e/ou modificar ele sob os termos da GNU General Public License como publicada pela Free Software Foundation, tanto a versão 3 dessa Licença, ou (a sua escolha) qualquer outra versão posterior. + NewPipe é software livre copyleft: Você pode usar, estudar, compartilhar e melhorar ele a vontade. Mais especificamente você pode redistribuir e/ou modificar ele sob os termos da GNU General Public License como publicada pela Free Software Foundation, tanto a versão 3 dessa Licença, ou (a sua escolha) qualquer outra versão posterior. Você também quer importar as configurações? Política de privacidade do NewPipe From 70aac8190028d52f9510d0c195965aef3834bf7e Mon Sep 17 00:00:00 2001 From: MadderRagax Date: Sun, 25 Nov 2018 12:02:48 +0000 Subject: [PATCH 087/207] Translated using Weblate (Swedish) Currently translated at 98.4% (377 of 383 strings) --- app/src/main/res/values-sv/strings.xml | 74 +++++++++++++------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index e3ce88d48..7b4c2bb90 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -21,31 +21,31 @@ Bakgrund Extrafönster - Genväg för nerladdning av video - Genväg för att lagra nerladdade videor i - Fyll i genvägen som videor ska laddas ner till + Sökväg för nerladdning av video + Sökväg för lagring av nerladdade videor + Ange sökväg för nedladdning av videor - Ljudhämtningsmapp + Sökväg för nerladdning av ljud Nedladdat ljud lagras här - Fyll i genvägen som ljudfiler ska laddas ner till + Ange sökväg för nedladdning av ljudfiler - Automatiskt spelar en video upp när NewPipe öppnas av en annan app + Spelar automatiskt upp videon när NewPipe öppnas av en annan app Standardupplösning Standardupplösning för popup Visa högre upplösningar - Det finns endast ett fåtal enheter som har stöd för uppspelning av 2K/4K-videor + Endast ett fåtal enheter har stöd för uppspelning av 2K/4K-videor Spela upp med Kodi Kore-appen hittades inte. Installera den? Visa alternativet \"Spela upp med Kodi\" Visa ett alternativ för att spela upp en video med mediacentret Kodi Ljud Standardformat för ljud - Videoformat som föredras + Standardformat för video WebM — öppet format M4A — bättre kvalité Tema - Ljus - Mörk + Ljust + Mörkt Svart Kom ihåg popupstorlek och position Kom ihåg popup-rutans senaste storlek och position @@ -54,10 +54,10 @@ Sökförslag Visa förslag i samband med sökning - Ladda ner + Ladda ned Nästa - Visa \'Nästkommande\' och \'Liknande\' videor + Visa \'Nästa\' och \'Liknande\' videor Webbadressen stöds inte Standard innehållsspråk Video & ljud @@ -69,10 +69,10 @@ Spela upp Innehåll Åldersbegränsat innehåll - Videon är åldersbegränsad. Du kan aktivera åldersbegränsade videor i inställningarna. + Videon är åldersbegränsad. Du kan aktivera åldersbegränsade videor i \"inställningar\". LIVE - Nerladdningar - Nerladdningar + Nedladdningar + Nedladdningar Felrapport Alla Kanal @@ -91,10 +91,10 @@ Det gick inte att analysera webbplatsen helt Innehållet är inte tillgängligt Blockerat av GEMA - Kunde inte ställa in nerladdningsmenyn + Kunde inte ställa in nedladdningsmenyn Direktsändningar stöds inte än Kunde inte ladda Bild - App/AnvändarGränssnitt kraschade + App/Användargränssnittet kraschade Oj, det där skulle inte ha hänt. Tyvärr så inträffade det några fel. RAPPORTERA @@ -104,8 +104,8 @@ Detaljer: - Gillanden - Ogillanden + Gillar + Ogillar Använd Tor Rapportera ett fel %1$s visningar @@ -121,11 +121,11 @@ Vad är nytt Spela upp automatiskt - Sök historik + Sökhistorik Spara sökfrågor lokalt Historik & Cacheminne Håll koll på videor som du tittat på - Fortsätt då fokus fås + Återuppta när fokus återfås Fortsätta spela efter avbrott (t.ex. telefonsamtal) Visa \"Håll för att lägga till\" tips Visa tips när bakgrunds- eller popup-knappen trycks på sidan för videodetaljer @@ -151,11 +151,11 @@ Återhämtar sig från spelarfel Rapportera fel via e-post - Vad:\\nBegäran:\\nInnehålls Språk:\\nTjänst:\\nGMT Tid:\\nPaket:\\nVersion:\\nOS-version: + Vad:\\nBegäran:\\nInnehållsspråk:\\nTjänst:\\nGMT Tid:\\nPaket:\\nVersion:\\nOS-version: Videons miniatyrbild Videons miniatyrbild Uppladdarens avatar miniatyrbild - (Experimentellt) Tvinga nedladdningstrafik via Tor för ökad integritet (strömmande videon stöds inte ännu). + (Experimentellt) Tvinga nedladdningstrafiken via Tor för ökad integritet (videostreaming stöds inte än). Användarrapport Inga resultat Här va\' det tomt @@ -237,10 +237,10 @@ Om Medverkande Licenser - Öppet och enkel Android app för mediastreaming. + Öppen och enkel Android app för mediastreaming. Visa på GitHub NewPipes licens - Vad du än har för idéer gällande översättning, designändringar, kod rengöring eller riktigt tunga så är hjälp alltid välkommet. Ju mer som görs desto bättre blir det! + Vad du än har för idéer; översättningar, designändringar, kodstädning eller riktiga stora kodändringar—hjälp är alltid välkommen. Ju mer som görs desto bättre blir det! Läs hela licensen Bidra @@ -272,7 +272,7 @@ Popup-spelare Ta bort Detaljer - Ljud inställningar + Ljudinställningar Håll för att placera i kön Placera i bakgrunds-kön Placera i popup-kön @@ -290,26 +290,26 @@ Lägg till - Använda snabb inexakt sökning + Använd snabb inexakt sökning Ladda miniatyrbilder - Inaktivera för att stoppa alla miniatyrbilder från att ladda och spara på data och minnesanvändning. Ändring av detta kommer att rensa cache-minnet - Bild cacheminnet var rensad + Inaktivera för att stänga av laddning av miniatyrbilder, sparar data och minnesanvändning. Förändringar kommer att rensa cache-minnet. + Bild cacheminnet rensad Tjänst Debug Alltid Bara en gång Fil - Byta orientationen + Växla orienteringen Rensa metadatan i cacheminnet Ingen strömspelare hittades (du kan installera VLC för att spela upp). Ladda ned sändning - "Inexakt sökning tillåter spelaren att söka positioner snabbare med minskad precision " + Inexact sökning ger möjligheten att söka snabbare med mindre precision Ta bort alla cachade webbsidor Metadata cache rensad "Köa nästa ström automatiskt " Lägg automatiskt till en relaterad ström när du spelar den sista strömmen i en ej upprepad kö. - Standard innehåll land + Standard innehållsland Kanaler Spellistor Spår @@ -347,14 +347,14 @@ Ta bort en Ta bort alla Avfärda - Döp om + Byt namn 1 objekt borttaget. Ingen app installerad för att spela upp filen NewPipes Sekretesspolicy - "NewPipe projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande. NewPipes Sekretesspolicy förklarar i detalj vad för data som skickas och lagras när du skickar en kraschrapport." + NewPipe projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande. NewPipes Sekretesspolicy förklarar i detalj vad för data som skickas och lagras när du skickar en kraschrapport. Läs sekretesspolicy NewPipe är copyleft fri programvara: Du kan använda, studera, dela och förbättra den som du vill. Specifikt kan du distribuera och/eller modifiera det under villkoren för GNU General Public License som publicerats av Free Software Foundation, antingen version 3 av licensen, eller (om du så önskar) en senare version. Vill du ta bort det här föremålet från visningshistoriken? @@ -364,7 +364,7 @@ Exporterad Importerad - Ingen giltig ZIP-fil + Ogiltig ZIP-fil Varning: det gick inte att importera alla filer. Det här kommer skriva över dina nuvarande inställningar. Vill du också importera inställningar? @@ -374,7 +374,7 @@ Något kommer att visas här snart ;D - Föredra \'öppna\' åtgärden + Föredragen \'öppna\' åtgärd Standardåtgärden när du öppnar innehåll — %s Videospelare @@ -407,7 +407,7 @@ Fyll Zoom - Auto-genererade + Autogenererade Textning Ändra spelarens textskala och bakgrundsstil. Kräver att appen startar om för att träder i kraft. From 86a9d197cb762a163c6f4d44acb25289d004b677 Mon Sep 17 00:00:00 2001 From: ask6155 Date: Wed, 28 Nov 2018 14:05:57 +0000 Subject: [PATCH 088/207] Translated using Weblate (Hindi) Currently translated at 79.6% (305 of 383 strings) --- app/src/main/res/values-hi/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 825a9e4cf..d7ea4572e 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -60,7 +60,7 @@ क्या आप का मतलब %1$s है? शेयर करें अन्य वीडियो प्लेयर उपयोग करें - यह विकल्प चुनने से कुछ वीडियो से ध्वनि नहीं आएगी + कुछ रेसोल्युशनस में नहीं आएगी अन्य ऑडियो प्लेयर उपयोग करें मुख्य सदस्यता को बदलने में असमर्थ है @@ -276,7 +276,7 @@ यंहा से चलाना शुरू करे बैकग्राउंड में चलाना शुरू करे पॉपअप में चलाना शुरू करे -स्ट्रीम करने के लिए प्लेयर उपलब्ध नहीं है (आप इसे चलाने के लिए VLC इंस्टॉल कर सकते हैं) +स्ट्रीम करने के लिए प्लेयर उपलब्ध नहीं है (आप इसे चलाने के लिए VLC प्लेयर इंस्टॉल कर सकते हैं) स्ट्रीम डाउनलोड करें। जानकारी दिखाएं From ac5c060a9828d9123840134262fc7f04430c7b80 Mon Sep 17 00:00:00 2001 From: Prabjot Singh Date: Wed, 28 Nov 2018 14:17:04 +0000 Subject: [PATCH 089/207] Translated using Weblate (Hindi) Currently translated at 79.6% (305 of 383 strings) --- app/src/main/res/values-hi/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index d7ea4572e..037e30b56 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -87,7 +87,7 @@ उस विकल्प को दिखाए जिसमे Kodi Media Center के जरिये विडियो प्ले किया जाता है डिफ़ॉल्ट ऑडियो का फॉर्मेट डिफ़ॉल्ट विडियो का फॉर्मेट - webm - फ्री फॉर्मेट + webm - libre फॉर्मेट M4A - बेहतर क्वालिटी एप्प का नया रूप काला From 486d114e64f85b38d55c4604e30fd1973e28b277 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Mon, 26 Nov 2018 15:11:56 +0000 Subject: [PATCH 090/207] Translated using Weblate (Arabic) Currently translated at 85.9% (329 of 383 strings) --- app/src/main/res/values-ar/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index d83779f39..27c2309f6 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -15,7 +15,7 @@ تنزيل أدخل مسار تنزيل الملفات الصوتية مسار حفظ التنزيلات الصوتية - مسار ملفات الصوت المحفوظة + مسار مجلد الصوتيات المحفوظة أدخل مسار التنزيل لملفات الفيديو مسار حفظ تنزيلات الفيديو في مسار ملفات الفيديو المحفوظة @@ -359,8 +359,8 @@ مُزامَنة - تنزيل ملف البث. - الإشارات مرجعية + تنزيل ملف البث + الإشارات المرجعية استعمال التقديم السريع الغير دقيق "التقديم الغير دقيق يسمح للمشغل بالإطلاع الى الأماكن بشكل اسرع مع دقة اقل " From bf55e3c0cc3efb0cd20daf8c541dd2c0f82cd0e7 Mon Sep 17 00:00:00 2001 From: ask6155 Date: Wed, 28 Nov 2018 14:17:18 +0000 Subject: [PATCH 091/207] Translated using Weblate (Hindi) Currently translated at 79.6% (305 of 383 strings) --- app/src/main/res/values-hi/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 037e30b56..035222a89 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -87,7 +87,7 @@ उस विकल्प को दिखाए जिसमे Kodi Media Center के जरिये विडियो प्ले किया जाता है डिफ़ॉल्ट ऑडियो का फॉर्मेट डिफ़ॉल्ट विडियो का फॉर्मेट - webm - libre फॉर्मेट + WebM - libre फॉर्मेट M4A - बेहतर क्वालिटी एप्प का नया रूप काला From a18e588e55f438c1cb9a6a949247a4ec8a944f69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Mon, 26 Nov 2018 13:42:11 +0000 Subject: [PATCH 092/207] Translated using Weblate (Portuguese) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-pt/strings.xml | 222 ++++++++++++------------- 1 file changed, 111 insertions(+), 111 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 35e542671..31e54232e 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -32,7 +32,7 @@ Seguinte Mostrar vídeos \'Seguintes\' e \'Semelhantes\' URL não suportado - Idioma padrão do conteúdo + Idioma padrão para o conteúdo Vídeo e áudio Miniatura de vídeos @@ -63,15 +63,15 @@ Incapaz de descodificar a assinatura do vídeo Incapaz de processar o site Conteúdo não disponível - Bloqueado pela GEMA + Bloqueado por GEMA Conteúdo Restringir conteúdo por idade - Mostrar vídeo com restrição de idade. É possível permitir este material através das \'Definições\'. + Restringir vídeos por idade. É possível configurar estas opções nas \'Definições\'. Não foi possível processar totalmente o site Não foi possível configurar o menu de descargas - Transmissões ao vivo ainda não são suportadas + As emissões em direto ainda não são suportadas Não foi possível obter a emissão Desculpe, isto não deveria ter acontecido. Reportar erro por e-mail @@ -79,18 +79,18 @@ Relatório Info: O que ocorreu: - Comentários (em Inglês): + Comentários (em inglês): Detalhes: Vídeo Áudio Tentar novamente - Permissão para aceder ao armazenamento foi negada + A permissão para aceder ao armazenamento foi recusada Toque para iniciar a pesquisa Reprodução automática Reproduzir vídeo se o NewPipe for invocado por outra aplicação - Ao VIVO + Direto Reportar um erro Relatório @@ -121,7 +121,7 @@ OK Processos Descarga do NewPipe - Não foi possível carregar a Imagem + Não foi possível carregar a imagem Aplicação encerrada O quê:\\nPedido:\\nIdioma do conteúdo:\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nVersão do SO: @@ -138,65 +138,65 @@ M MM - Esta permissão é necessária -\npara o modo \"popup\" + Esta permissão é necessária +\npara o modo \'popup\' reCAPTCHA Desafio reCAPTCHA Desafio reCAPTCHA solicitado - Modo \"popup\" do NewPipe + Modo \'popup\' do NewPipe Reproduzir em modo \"popup\" Usar reprodutor antigo Versão antiga do reprodutor Mediaframework - Formato de vídeo preferido + Formato de vídeo padrão Desativado - Resolução padrão do \"popup\" + Resolução padrão do \'popup\' Mostrar resoluções mais altas Apenas alguns dispositivos possuem suporte a vídeos 2K/4K Popup - Lembrar tamanho e posição do \"popup\" + Lembrar tamanho e posição do \'popup\' Popup Filtrar Atualizar Limpar Segundo plano Remove o áudio em algumas resoluções - Lembrar último tamanho e posição do \"popup\" + Lembrar último tamanho e posição do \'popup\' Redimensionar -Controlos de gesto do reprodutor +Controlo de reprodução por gestos Usar gestos para controlar o brilho e o volume do reprodutor Sugestões de pesquisa - Apresentar sugestões ao procurar + Mostrar sugestões ao pesquisar Melhor resolução - Sobre NewPipe + Acerca de NewPipe Definições Sobre Licenças de terceiros © %1$s de %2$s nos termos da %3$s Não foi possível carregar a licença - Abrir website - Sobre + Abrir site + Acerca Colaboradores Licenças - Aplicação leve livre de YouTube para Android. + Aplicação de reprodução de emissões para sistemas Android. Ver no GitHub Licença do NewPipe - Se tem ideias de tradução, alterações de design, limpeza de código ou alterações de código pesado—ajuda é sempre bem-vinda. Quanto mais se faz melhor fica! + Se tem ideias para: tradução, alterações de design, limpeza de código ou alterações ao código fonte - todas as ajudas são bem-vindas. Quanto mais se faz, melhor ficará! Ler licença Participar Subscrever Subscrito Canal não subscrito - Incapaz de alterar a assinatura - Incapaz de atualizar a assinatura + Incapaz de alterar a subscrição + Incapaz de atualizar a subscrição Principal Subscrições @@ -205,7 +205,7 @@ Histórico de pesquisa Guardar termos de pesquisa localmente - Histórico e Cache + Histórico e cache Guardar histórico de vídeos assistidos Retomar ao ganhar foco Continuar reprodução após interrupções (ex. chamadas) @@ -215,7 +215,7 @@ Lista de reprodução Desfazer - Notificação do NewPipe + Notificação NewPipe Notificações para o NewPipe e para os reprodutores \"popup\" Sem resultados @@ -223,8 +223,8 @@ Sem subscritores - %s subscrito - %s subscritos + %s subscritor + %s subscritores Sem visualizações @@ -249,11 +249,11 @@ Histórico Pesquisado - Visto - Histórico está desativado + Visualizado + Histórico desativado Histórico O histórico está vazio - Histórico eliminado + Histórico apagado Item apagado Deseja apagar este item do histórico de pesquisa? Reproduzir todos @@ -264,7 +264,7 @@ A recuperar de um erro do reprodutor Conteúdo da página principal - Página em branco + Página vazia Página de subscrições Página do canal Selecione um canal @@ -276,16 +276,16 @@ Top 50 Novo e popular Reprodutor em segundo plano - Reprodutor \"popup\" + Reprodutor \'popup\' Remover Detalhes Definições de áudio Iniciar reprodução aqui - Iniciar de aqui quando pôr em segundo plano - Iniciar de aqui em novo \"pop-up\" + Iniciar aqui se em segundo plano + Iniciar aqui em novo \'pop-up\' Mostrar informação - Listas de reprodução marcadas + Listas de reprodução favoritas Serviço Sempre @@ -294,12 +294,12 @@ Mudar orientação Importar base de dados Exportar base de dados - Substitui o histórico e as assinaturas atuais + Substitui o histórico e as subscrições atuais Exportar histórico, subscrições e listas de reprodução Em lista de espera no reprodutor em segundo plano Em lista de espera no reprodutor popup Mudar para segundo plano - Mudar para \"popup\" + Mudar para \'popup\' Mudar para principal Incapaz de reproduzir este vídeo @@ -318,7 +318,7 @@ Adicionar a Utilizar pesquisa rápida - A pesquisa rápida permite que a pesquisa seja mais rápida mas diminui a qualidade da precisão + Esta opção permite que a pesquisa seja mais rápida mas diminui a qualidade da precisão Carregar miniaturas Desative para parar o carregamento das miniaturas e poupar dados e memória. Se alterar esta opção limpa a cache de memória e do disco. Cache de imagens limpa @@ -327,7 +327,7 @@ Não foram encontradas emissões de vídeo Não foram encontradas emissões de áudio Diretório não existe - Não existe tal ficheiro/fonte de conteúdo + Não existe ficheiro/fonte de conteúdo O ficheiro não existe ou as permissões para ler ou escrever faltam O nome do ficheiro não pode estar vazio Ocorreu um erro: %1$s @@ -335,7 +335,7 @@ Descartar Site - Visite ao website NewPipe para obter mais informações e saber as novidades. + Visite ao site NewPipe para obter mais informações e saber as novidades. Página \"kiosk\" Página da fonte Exportados @@ -347,13 +347,13 @@ Abrir menu Fechar menu Nome - Apagar metadados em cache - Remover todos os dados da página em cache - Metadados em cache apagados + Apagar meta-dados em cache + Remover todos os dados em cache + Meta-dados em cache apagados Ficheiro - Pretende apagar este item do histórico de visualizações? - Tem a certeza que quer apagar todos os itens do histórico? + Deseja apagar este item do histórico de visualizações\? + Tem a certeza de que deseja apagar todos os itens do histórico\? Última reprodução Mais reproduzido @@ -362,33 +362,33 @@ Reprodutor de vídeo Reprodutor em segundo plano - Reprodutor em popup + Reprodutor \'popup\' Perguntar sempre A obter informação… - O conteúdo requisitado está carregando + A carregar o conteúdo... - Nova Lista de Reprodução + Nova lista de reprodução Apagar Renomear - Adicionar a Lista de Reprodução - Guardar Lista de Reprodução nos Marcadores - Remover Marcador + Adicionar à lista de reprodução + Guardar lista de reprodução como favorita + Remover marcador Apagar esta lista de reprodução\? - Lista de Reprodução criada com sucesso - Adicionado à lista de reprodução - Miniatura da Lista de Reprodução modificada. - Sem Legenda + Lista de reprodução criada com sucesso + Colocado na lista de reprodução + Miniatura alterada. + Sem legendas - Zoom + Ampliar Gerado automaticamente - Legenda + Legendas Importar/exportar Importar - Importar a partir de + Importar de Exportar para A importar… @@ -397,96 +397,96 @@ Importar ficheiro Exportação anterior - Importação de subscrições falhou - Exportação de subscrições falhou + Não foi possível importar as subscrições + Não foi possível exportar as subscrições - Para importar as tuas subscrições do Youtube vais precisar do ficheiro de exportação, que pode ser descarregado com auxílio destas instruções: + Importe as subscrições do YouTube descarregando o ficheiro exportado: \n -\n1. Vai a esta hiperligação: %1$s -\n2. Inicia a tua sessão quando requisitado -\n3. O descarregamento deve começar (esse é o ficheiro de exportação) - Para importar as contas SoundCloud, vais precisar do link ou id do seu perfil que pode ser descarregado com auxílio destas instruções: +\n1. Aceda a este URL: %1$s +\n2. Inicie a sessão +\n3. A descarga deve ser iniciada (esse é o ficheiro de exportação) + Importe o seu perfil do SoundCloud digitando o URL ou a sua ID: \n -\n1. Ative \"modo desktop\" num navegador da internet (o site não está disponível para dispositivos móveis) -\n2. Vá a este url: %1$s -\n3. Inicie sessão na sua conta quando solicitado -\n4. Copie o link para o qual foi redirecionado. - seuID, soundcloud.com/seuID +\n1. Ative o modo \'desktop\' no navegador web (o site não está disponível para dispositivos móveis) +\n2. Aceda a este URL: %1$s +\n3. Inicie a sessão +\n4. Copie o URL do seu perfil. + suaID, soundcloud.com/suaID - Controlo de velocidade de reprodução - Tempo + Controlos para velocidade de reprodução + Ritmo Nightcore Predefinido -Limpar histórico de exibição - Auto anexar um fluxo relacionado quando jogar o último fluxo em uma fila não repetitiva. - Mostrar dica \"Mantenha pressionado para enfileirar\" - Mostrar dica quando o botão de plano de fundo ou de popup for pressionado na página de detalhes do vídeo +Limpar histórico de visualizações + Adicionar automaticamente à fila uma emissão relacionada se em filas não repetíveis. + Mostrar dica \"Toque longo para colocar na fila\" + Mostrar dica quando o botão de fundo ou de \'popup\' for premido na página de detalhes do vídeo Canais Listas de reprodução Faixas Utilizadores - Deleta o histórico de videos já reproduzidos + Apaga o histórico dos vídeos reproduzidos Apagar todo o histórico de visualizações\? - Histórico de já assistidos deletado. - Deleta histórico de pesquisa - Deleta histórico de palavras chave pesquisadas + Histórico de vídeos apagado. + Apagar histórico de pesquisas + Apaga o histórico de palavras-chave pesquisadas Apagar todo o histórico de pesquisa\? - Histórico de pesquisa deletado. - 1 elemento deletado. + Histórico de pesquisa apagado. + 1 elemento apagado. - Nehum aplicativo instalado para reproduzir este ficheiro + Não existe uma aplicação para reproduzir este ficheiro - NewPipe é desenvolvido por voluntários que usam seu tempo para trazer a melhor experiência para você. Retribua para ajudar os desenvolvedores a tornarem o NewPipe ainda melhor enquanto desfrutam uma xícara de café. + NewPipe é desenvolvido por voluntários que usam o tempo livre para lhe proporcionar uma melhor experiência. Retribua para ajudar os programadores a tornarem o NewPipe ainda melhor. Retribuir Política de privacidade do NewPipe O projeto NewPipe leva a sua privacidade muito a sério. Sendo assim, o aplicativo não coleta nenhum dado sem seu consentimento. \nA polícia de privacidade do NewPipe explica em detalhes qual dado é enviado e salvo quando você envia um relatório de erros. Ler a política de privacidade - Próximo stream automaticamente em lista de espera - NewPipe é libre software copyleft: você pode usar, estudar, compartilhar e melhorar à sua vontade. Especificamente, você pode redistribuir e/ou modificá-la sob os termos da Licença Pública Geral GNU, conforme publicada pela Free Software Foundation, tanto a versão 3 da licença, ou (por sua opção) qualquer versão posterior. - Deseja também importar configurações\? + Colocar emissão seguinte na fila + NewPipe é copyleft libre software: você pode usar, estudar, partilhar e melhorar a aplicação. Especificamente, você pode redistribuir e/ou modificar a aplicação nos termos da GNU General Public License, conforme publicada pela Free Software Foundation, tanto a versão 3 da licença ou (por sua opção) qualquer versão posterior. + Deseja também importar as definições\? - Reter para enfileirar - Enfileirar quando pôr no fundo - Enfileirar no novo \"pop-up\" + Toque longo para colocar na fila + Colocar em fila se estiver em segundo plano + Colocar em novo \'popup\' Ação \'abrir\' preferida Ação padrão para abrir o conteúdo — %s - Definir como miniatura na lista de reprodução + Definir como miniatura da lista de reprodução Não foi possível apagar a lista de reprodução. - Ajuste + Ajustar Preencher - Modificar escala de texto do Player legenda e estilos de plano de fundo. Requer a reinicialização do aplicativo para ter efeito. + Modificar escala das legendas e o estilo de fundo. Tem que reiniciar a aplicação para aplicar as alterações. - Ativar o LeakCanary - Monitoramento de vazamento à memória pode fazer com que o aplicativo pare de responder quando fizer um heap dumping + Ativar LeakCanary + A monitorização de memória pode tornar a aplicação instável - Relatar erros fora do ciclo de vida + Relatar erros \'out-of-lifecycle\' Forçar relatórios de exceções de Rx não entregues fora do ciclo de vida de fragmento ou atividade após a eliminação - Tenha em mente que esta operação pode ser cara para a rede. -\n -\nVocê deseja continuar\? + Tenha em atenção que esta operação pode sobrecarregar a sua rede. +\n +\nDeseja continuar\? - Tom - Desvincular (pode causar distorção) + Velocidade + Dissociar (pode causar distorção) Avanço rápido durante silêncio Passo - Reiniciar + Repor - Para cumprir o Regulamento Geral sobre a Proteção de Dados (RGPD), chamamos a política de privacidade da NewPipe à sua atenção. Por favor, leia com atenção. -\nVocê deve aceitá-lo para nos enviar o relatório de bug. + Para cumprir o Regulamento Geral sobre a Proteção de Dados (RGPD), chamamos a sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção. +\nTem que aceitar esta política para nos poder enviar o seu relatório. Aceitar Recusar Ilimitado - Limite de resolução quando usando dados móveis - Minimizar ao mudar o app - Ação ao mudar do player de vídeo principal para outro app —% s - Nenhum - Minimizar para o player de fundo - Minimizar para o player de fundo + Limitar resolução se estiver a usar dados móveis + Minimizar ao trocar de aplicação + Ação a executar ao trocar para outra aplicação a partir do menu principal - % s + Nenhuma + Ativar o reprodutor em segundo plano + Ativar o reprodutor \'popup\' From 0e8acba08ee4ee3f0de6f7f75c980a97f1f3c9dc Mon Sep 17 00:00:00 2001 From: "Markel @wakutiteo" Date: Mon, 26 Nov 2018 19:45:27 +0000 Subject: [PATCH 093/207] Translated using Weblate (Spanish) Currently translated at 88.3% (338 of 383 strings) --- app/src/main/res/values-es/strings.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 2c974e935..35f679450 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -50,8 +50,8 @@ Bloqueado por GEMA - Ruta de descarga de audio - Vídeo y Audio + Carpeta de descarga de audio + Vídeo y audio Reproducir Error Error de conexión @@ -69,13 +69,13 @@ Contenido - Mostrar contenido restringido por edad + Contenido restringido por edad Vídeo restringido por edad. Permitir este tipo de material es posible desde Ajustes. Toque en buscar para empezar - Autoreproducir + Reproducción automática Reproducir un vídeo cuando NewPipe es llamado desde otra app - en vivo + EN DIRECTO Descargas Descargas Reportar error @@ -233,7 +233,7 @@ abrir en modo popup Reproductor Funcionamiento - Historial y Caché + Historial y caché Lista de reproducción Deshacer @@ -311,7 +311,7 @@ abrir en modo popup Servicio Abrir cajón Cerrar cajón - No se ha encontrado ningún reproductor de vídeo (puede instalar VLC para reproducirlo) + No se ha encontrado ningún reproductor de vídeo (puede instalar VLC para reproducirlo). Siempre Sólo una vez @@ -331,8 +331,8 @@ abrir en modo popup Exportar base de datos Reemplazará su historial actual y sus suscripciones Exportar historial, suscripciones y listas de reproducción - Exportación completa - Importación completa + Exportado + Importado Archivo ZIP no válido ADVERTENCIA: no se pudieron importar todos los archivos. Esto reemplazará su configuración actual. @@ -359,9 +359,9 @@ abrir en modo popup Preguntar siempre - Crear nueva lista de reproducción - Eliminar lista de reproducción - Renombrar lista de reproducción + Nueva lista de reproducción + Eliminar + Renombrar Nombre Añadir a la lista de reproducción Definir como miniatura de lista de reproducción From 9714fa369b2537b8dd233dba491c8ac71552df5b Mon Sep 17 00:00:00 2001 From: Helios Date: Wed, 28 Nov 2018 11:12:41 +0000 Subject: [PATCH 094/207] Translated using Weblate (Tamil) Currently translated at 28.7% (110 of 383 strings) --- app/src/main/res/values-ta/strings.xml | 107 +++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 09056c21f..4c8b354e5 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -14,4 +14,111 @@ பகிர உலாவியை தேர்ந்தெடு சுழற்சி + எந்த ஒரு இயக்கியும் கிடைக்கவில்லை (VLC-ஐ பயன்படுத்தவும்). + திரைமேல் நிலையில் காணவும் + தாரை கோப்பை பதிவிறக்கு + நீங்கள் கூறியது: %1$s இதுதானா\? + வெளி காணொலி இயக்கியை பயன்படுத்தவும் + வெளி ஒலி இயக்கியை பயன்படுத்தவும் + NewPipe திரைமேல் நிலை + குழுசேர் + குழு சேர்க்கப்பட்டது + சேனல் குழுவிளகப்பட்டது + குழுசேர்தலை மாற்ற இயலவில்லை + குழுசேர்தலை புதுப்பிக்க இயலவில்லை + தகவல் காண்பி + + முதன்மை + குழுசேர்ப்புகள் + குறிக்கப்பட்ட காணொலி பட்டியல்கள் + + புதிதாக + + பின்னால் + திரைமேல் + சேர் + + காணிலி தரவிறக்கப் பாதை + தரவிறக்கப்பட்ட காணொலிகளின் சேமிப்புப் பாதை + காணொலியின் தரவிறக்கப் பாதையை உள்ளிடு + + ஒலி பதிவிறக்க அடைவு + தரவிறக்கப்பட்ட ஒலி இங்கே சேமிக்கப்பட்டுள்ளது + ஒலி கோப்புகளுக்கான தரவிறக்கப் பாதையை உள்ளிடு + + தானே இயக்கு + NewPipe மற்றொரு செயலியில் இருந்து அழைக்கப்படும் போது காணொலியை இயக்கும் + முதல் பிரிதிறன் + முதல் திரைமேல் நிலை பிரிதிறன் + மேம்பட்ட பிரிதிறன்களைக் காண்பி + Kodi கொண்டு இயக்கு + Kore செயலி காணவில்லை. நிறுவலாமா\? + \"Kodi கொண்டு இயக்கு\" இடப்பை காண்பி + ஒலி + முதல் ஒலி வடிவம் + முதல் காணிலி வடிவம் + M4A - மேம்பட்ட தரம் + வார்ப்புரு + வெளிர் + அடர் + கருப்பு + திரைமேல் அளவையும் இடத்தையும் நினைவுகொள் + திரைமேல் நிலையின் கடைசி அளவையும் இடத்தையும் நினைவுகொள் + வில்லைப்படத்தைக் காண்பி + பட பதுக்ககம் அழிக்கப்பட்டது + மேல்நிலைத்தரவின் பதுக்ககம் அழிக்கப்பட்டது + பதுக்ககத்திலிருக்கும் வலைப்பக்கத் தரவு அழிக்கப்பட்டது + மேல்நிலைத் தரவு பதுக்ககம் அழிக்கப்பட்டது + ஆலோசனைகளை தேடு + தேடல் வரலாறு + வரலாறு மற்றும் பதுக்ககம் + பார்த்த காணொலிகளை குறிப்பிடு + தரவிறக்கு + அடுத்து + சேவை + இயக்கி + பண்பு + ஒலி மற்றும் காணொலி + வரலாறு மற்றும் பதுக்ககம் + திரைமேல் + தோற்றம் + மற்றவை + பிண்ணணியில் ஓடுகிறது + திரைமேல் நிலையில் ஓடுகிறது + இயக்கு + நேரடி ஒளிபரப்பு + தரவிறக்கங்கள் + தரவிறக்கங்கள் + அனைத்தும் + காணொலி பட்டியல் + காணொலி பட்டியல்கள் + பயனர்கள் + ஆம் + பின்னர் + நீக்கு + எப்பொழுதும் + ஒரு முறை + கோப்பு + + பார்த்த வரலாற்றை நீக்கு + பார்த்த வரலாறு அழிக்கப்பட்டது. + பார்த்த வரலாற்றை நீக்கு + தேடல் வரலாறு அழிக்கப்பட்டது. + கோப்பு பெயர் காலியாக இருக்க முடியாது + மன்னியுங்கள். சிறிய பிழை நிகழ்ந்தது. + தகவல்: + விவரங்கள்: + + + விருப்பங்கள் + Tor பயன்படுத்து + முடிவுகள் இல்லை + எந்த முடிவுகளும் இல்லை + இழுத்து வரிசைமாற்று + + தரவிறக்க அடைவு உருவாக்கப்பட்டது \'%1$s\' + + காணொலி + ஒலி + மீண்டும் முயற்சி From 2e662b574591b3eb3d3161d424749a21cf5bb3fd Mon Sep 17 00:00:00 2001 From: AB Date: Tue, 27 Nov 2018 14:28:52 +0000 Subject: [PATCH 095/207] Translated using Weblate (Ukrainian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-uk/strings.xml | 80 +++++++++++++------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 9d4975338..34a3b3451 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -23,8 +23,8 @@ Вкажіть шлях для завантаження авдіофайлів Шлях де зберігатимуться завантажені відеозаписи - Шлях для завантаження авдіо - Шлях де зберігатимуться завантажені авдіофайли + Тека для завантаженого авдіо + Завантажені авдіофайли зберігатимуться тут Автоматично відтворювати Відтворює відеозапис коли NewPipe викликано з іншого застосунку Типова роздільна здатність @@ -41,11 +41,11 @@ Світла Завантажити - Наступний відеозапис + Далі Показати \"наступні\" й \"схожі\" відео - URL не підтримується + Непідтримувальний URL Усталена мова контенту - Відео та Авдіо + Відео та авдіо Зовнішній вигляд Інше Відтворення у тловому режимі @@ -53,8 +53,8 @@ У доступі відмовлено Контент Контент з віковими обмеженнями - Відеозапис має вікові обмеження. Спершу активуйте опцію для програвання таких записів у налаштуваннях. - наживо + Показувати відеозаписи, які мають вікові обмеження. Спершу активуйте опцію для програвання таких записів у \"налаштуваннях\". + НАЖИВО Помилка Помилка мережі @@ -62,10 +62,10 @@ Не вдалося розшифрувати URL підпис відеозапису Не вдалося проаналізувати веб-сайт Не вдалося повністю проаналізувати веб-сайт - Контент не доступний + Контент недоступний Заблоковано GEMA Не вдалося налаштувати меню завантаження - Трансляції НАЖИВО ще не підтримуються. + Трансляції НАЖИВО ще не підтримуються Не вдалося отримати жодного стриму Шкода, цього не мало статися. Повідомити про помилку за допомогою пошти @@ -125,9 +125,9 @@ Копійовано до сховку Будь ласка, оберіть теку для завантаження -Потокового програвача не знайдено (ви можете встановити VLC для відтворення) +Потокового програвача не знайдено (ви можете встановити VLC для відтворення). Відкрити у віконному режимі - Певні роздільності НЕ матимуть звуку якщо цей параметр увімкнено + Усувається звук ПЕВНИХ роздільностей NewPipe у віконному режимі Підписатися Ви підписалися @@ -181,7 +181,7 @@ Тільки тепер NewPipe сповіщення - "Сповіщення для NewPipe\'ових тлового і віконного програвачів " + "Сповіщення для NewPipe-ових тлового і віконного програвачів " [Невідомо] @@ -191,7 +191,7 @@ Імпортувати базу Експортувати базу - Це перепише поточну історію та підписки + Перепише поточну історію та підписки Експортувати історію, підписки та плейлисти Неможливо відтворити цей стрим Відновлююсь після помилки програвача @@ -226,8 +226,8 @@ Веб-сайт Історія Історію стерто - Експортування завершено - Імпортування завершено + Експортовано + Імпортовано Топ 50 Новинки Деталі @@ -240,10 +240,10 @@ Отримую інформацію… Завантажується запитаний контент -Завантажити потоковий файл. +Завантажити потоковий файл Показати інформацію - Закладки + Закладкові плейлисти Додати до @@ -294,8 +294,8 @@ Нове завдання - reCAPTCHA челендж - запит на челендж reCAPTCHA + Виклик reCAPTCHA + Запит на виклик reCAPTCHA © %1$s by %2$s under %3$s Учасники @@ -325,7 +325,7 @@ Нове Сторінка каналу Обрати канал - Ви не підписані на жоден з каналів + Немає підписок на канали Обрати kiosk Недійсний ZIP-файл Увага: не можливо здійснити імпортування всіх файлів. @@ -338,9 +338,9 @@ Усунути Утримуйте, для додавання до черги Додати до черги тлового відтворення - Додати до черги віконного відтворення + Додати до черги нового віконного відтворення Розпочати відтворення звідси - Розпочати відтворення тловому програвачеві + Розпочати звідси у тловому програвачеві Розпочати відтворення у вікні звідси Відкрити шухляду @@ -350,9 +350,9 @@ Завжди питати - Створити новий плейлист - Видалити плейлиста - Змінити назву плейлиста + Новий плейлист + Видалити + Змінити назву Назва Додати до плейлиста Установити як ескіз плейлиста @@ -360,11 +360,11 @@ Додати плейлист до закладок Усунути закладку - Чи бажаєте видалити цього плейлиста? + Чи видалити цього плейлиста\? Плейлист було створено Додано до плейлиста - Ескіз плейлиста було змінено - Неможливо видалити плейлист + Ескіз плейлиста змінився. + Неможливо видалити плейлист. Субтитри відсутні @@ -381,24 +381,24 @@ Увімкнути LeakCanary Моніторування витіків пам\'яті може призвести до нереагівності застосунку - Зазвітувати Out-of-lifecycle хиби + Зазвітувати out-of-lifecycle хиби Примусове звітування про неможливість доставлення Rx винятків, які відбуваються за межами фраґменту або діяльності життєвого циклу після усунення Використовувати неточний пошук Неточний пошук дозволяє програвачеві рухатися позиціями швидше, проте з меншою точністю Додавати в чергу наступний стрим - Автоматично додавати пов\'язаний стрим під час відтворення останнього у черзі без повторювань + Автоматично додавати пов\'язаний стрим під час відтворення останнього у черзі без повторювань. СИНХРОНІЗАЦІЯ Файл - Неправильна тека - Неправильний файл/джерело контенту - Файл не існує, або немає дозволу на його запис чи читання + Такої теки не існує + Не існує файлу/джерела контенту + Файл не існує, або немає дозволу на його запис або читання Назва файлу не може бути порожньою Помилка: %1$s - Імпортування/Експортування + Імпортування/експортування Імпортування Імпортувати з Експортувати до @@ -429,7 +429,7 @@ \n \nПродовжуватимете? Завантажити ескізи - Відключити аби зупинити завантаження ескізів та заощадити використання ресурсів та пам\'яті. Увімкнення функції призведе до повного очищення кешу зображень + При вимкненому завантаженні ескізів, заощадується трафік та внутрішня пам\'ять. Зміни призведуть очищення кешу зображень. Кеш зображень стерто Стерти кеш метаданих "Усунути всі кешовані дані вебсторінки " @@ -446,21 +446,21 @@ Типова дія під час відкриття вмісту — %s Субтитри - Змінення маштабу субтитрового тексту та тлових стилів. Увімкнення функції потребує перезавантаження застосунку + Змінення маштабу субтитрового тексту та тлових стилів. Увімкнення функції потребує перезавантаження застосунку. Не знайдено відповідного застосунку для відтворення цього файлу Очистити історію переглядів Видаляє історію відтворень - Видалити всю історію переглядів. + Чи видалити всю історію переглядів\? Історію переглядів було видалено. Очистити історію пошуків Видаляє історію пошукових ключових слів - Видалити всю пошукову історію. + Чи видалити всю пошукову історію\? Пошукову історію видалено. Видалено один фрагмент. - "NewPipe є вільною копілефт програмою: Ви можете використовувати її, поширювати та вдосконалювати за власним розсудом. Зокрема ви можете перерозподіляти та/або змінювати її за умов використання GNU General Public License, опублікованою Free Software Foundation, під 3-ю версією ліцензії, або (на ваш вибір) будь-якою пізнішою версією." + "NewPipe є вільною копілефт програмою: Ви можете використовувати її, поширювати та вдосконалювати з розсудом. Зокрема ви можете перерозподіляти та/або змінювати її за умов використання GNU General Public License, опублікованою Free Software Foundation, під 3-ю версією ліцензії, або (на ваш вибір) будь-якою пізнішою версією." Бажаєте імпортувати з налаштуваннями\? NewPipe\'ова політика приватності @@ -478,7 +478,7 @@ Скинути Зменшити при перемкненні застосунку - Дія при перемкненні до інших застосунків з головного відеопрогравача — %s + Дія при перемкненні до іншого застосунку з головного відеопрогравача — %s Жодних До тлового програвача Зменшити до віконного програвачу From d61bf26e17c2c11841c670d99a80f5163644248e Mon Sep 17 00:00:00 2001 From: Olexandr Nesterenko Date: Tue, 27 Nov 2018 15:29:12 +0000 Subject: [PATCH 096/207] Translated using Weblate (Ukrainian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-uk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 34a3b3451..3c316a683 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -197,7 +197,7 @@ Відновлююсь після помилки програвача Помилкова URL Відеостримів не знайдено - Не знайдено авдіостримів + Не знайдено аудіо потоків Звіт користувача Без підписників From f33586f0624d63afd552e5ea402bc6086ffae1ea Mon Sep 17 00:00:00 2001 From: ask6155 Date: Wed, 28 Nov 2018 14:17:58 +0000 Subject: [PATCH 097/207] Translated using Weblate (Hindi) Currently translated at 81.5% (312 of 383 strings) --- app/src/main/res/values-hi/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 035222a89..927b577e3 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -25,9 +25,9 @@ ऑडियो हलका काली - इतिहास और कैच + पूर्व और कैश डाउनलोड - अगला वीडियो + अगला वीडियो और ऑडियो इतिहास और कैच बैकग्राउंड में चल रहा है @@ -99,7 +99,7 @@ जब कुछ ढूंड रहे हो तो सुझाव दिखाये खोज के इतिहास को देखे खोज के query को फ़ोन की मेमोरी में ही रखे - देखे हुए वीडियो की सूची रखे + देखे हुए वीडियोस का रिकॉर्ड रखें जब फोकस मिले तो विडियो resume हो रूकावट आने पर भी विडियो को जारी रखे (जैसे - फ़ोन कॉल आये) \'अगला\' और \'पहले समान\' वीडियो दिखाए @@ -276,11 +276,11 @@ यंहा से चलाना शुरू करे बैकग्राउंड में चलाना शुरू करे पॉपअप में चलाना शुरू करे -स्ट्रीम करने के लिए प्लेयर उपलब्ध नहीं है (आप इसे चलाने के लिए VLC प्लेयर इंस्टॉल कर सकते हैं) - स्ट्रीम डाउनलोड करें। +स्ट्रीम करने के लिए प्लेयर उपलब्ध नहीं है (आप इसे चलाने के लिए VLC प्लेयर इंस्टॉल कर सकते हैं)। + स्ट्रीम डाउनलोड करें जानकारी दिखाएं - बुकमार्क्स + बुकमार्क किये गए प्लेलिस्टस में जोड़े From edcb692f786be9c25ddaad26bc50ebe0afc7d5c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mahmut=20=C3=B6zcan?= Date: Wed, 28 Nov 2018 19:33:54 +0000 Subject: [PATCH 098/207] Translated using Weblate (Turkish) Currently translated at 97.1% (372 of 383 strings) --- app/src/main/res/values-tr/strings.xml | 68 +++++++++++++------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 9a320bb09..2122fb0cb 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -22,8 +22,8 @@ İndirilen videoların saklanacağı konum Videolar için indirme konumu girin - Ses indirme konumu - İndirilmiş seslerin saklanacağı konum + Ses indirme klasörü + İndirilen ses dosyalarını burada depola Ses dosyaları için indirme konumu girin Kendiliğinden Oynat @@ -41,7 +41,7 @@ Açık İndir - Sonraki video + "Sonraki " \'Sonraki\' ve \'benzer\' videoları göster URL desteklenmiyor Öntanımlı içerik dili @@ -52,9 +52,9 @@ Arka planda oynatıyor Oynat İçerik - Yaş sınırlı içeriği göster - Yaş Sınırlı Video. Bu gibi materyallere Ayarlar\'dan izin verilebilir. - canlı + Yaş sınırlı içerik + Yaş Sınırı olan Videoları göster. Bu gibi materyallere \"Ayarlar\"dan izin verilebilir. + CANLI İndirilenler İndirilenler Hata bildirimi @@ -65,9 +65,9 @@ Video URL imzası çözülemedi Web sitesi ayrıştırılamadı Web sitesi tümüyle ayrıştırılamadı - İçerik kullanılabilir değil + İçerik kullanılamıyor GEMA tarafından engellendi - Bu, henüz desteklenmeyen bir CANLI AKIŞ. + Canlı akışlar henüz desteklenmiyor Herhangi bir akış alınamadı Resim yüklenemedi Uygulama/arayüz çöktü @@ -152,8 +152,8 @@ \naçmak için gerekli reCAPTCHA - reCAPTCHA Formu - reCAPTCHA Formu istendi + "reCAPTCHA " + reCAPTCHA Formu gerekli Arka Plan Açılır Oynatıcı @@ -224,10 +224,10 @@ Geri Al NewPipe Bildirimi - NewPipe Arka Plan ve Açılır Oynatıcılar için Bildirimler + NewPipe arkaplan ve açılır oynatıcılar için bildirimler Sonuç yok - Burada Cırcır Böceklerinden Başka Şey Yok + Burada cırcır böceklerinden başka şey yok Abone yok @@ -250,7 +250,7 @@ Geçmiş Aranan İzlenen - Geçmiş devre dışı + Geçmiş kapalı Geçmiş Geçmiş boş Geçmiş temizlendi @@ -282,15 +282,15 @@ Trendler En İyi 50 Yeni ve sıcak - Arka Plan Oynatıcı - Açılır Oynatıcı + Arkaplan oynatıcı + Açılır oynatıcı Kaldır Ayrıntılar Ses Ayarları - Kuyruğa Almak İçin Basılı Tut + Kuyruğa almak için basılı tut Arka Planda Kuyruğa Al Açılır Oynatıcıda Kuyruğa Al - Burada Oynatmaya Başla + Burada oynatmaya başla Burada Arka Planda Başlat Burada Açılır Oynatıcıda Başlat Bağış yapın @@ -307,7 +307,7 @@ Çekmeceyi Aç Çekmeceyi Kapat - Akış oynatıcı bulunamadı (oynatmak için VLC\'yi kurabilirsiniz) + Akış oynatıcı bulunamadı (bunun için VLC kurabilirsiniz). Her Zaman Yalnızca Bir Kez @@ -327,16 +327,16 @@ Veri tabanını dışa aktar Şu anki geçmişinizi ve aboneliklerinizi geçersiz kılar Geçmişi, abonelikleri ve oynatma listelerini dışa aktar - Dışa aktarım bitti - İçe aktarım bitti + Dışa aktarıldı + İçe aktarıldı Geçerli ZIP dosyası yok Uyarı: Tüm dosyalar içe aktarılamadı. Bu, şu anki kurulumunuzu geçersiz kılacak. - Akış dosyasını indir. + Akış dosyasını indir Bilgileri göster - Yer İmleri + Çalma listeleri yer imlerinde Listeye Ekle @@ -356,8 +356,8 @@ Her zaman sor Yeni Oynatma Listesi Oluştur - Oynatma Listesini Sil - Oynatma Listesini Yeniden Adlandır + Sil + Yeniden adlandır Ad Oynatma Listesine Ekle Oynatma Listesi Küçük Resmi Olarak Belirle @@ -365,11 +365,11 @@ Oynatma Listesini İmle Yer İmini Kaldır - Bu oynatma listesini silmek istiyor musunuz? + Bu oynatma listesi silinsin mi\? Oynatma listesi oluşturuldu - Oynatma listesine eklendi + Oynatma listesinde Oynatma listesi küçük resmi değiştirildi - Oynatma listesi silinemedi + Oynatma listesi silinemedi. Alt Yazı Yok @@ -389,7 +389,7 @@ LeakCanary\'i Etkinleştir Bellek sızıntı gözlemlemesi, yığın boşaltımı sırasında uygulamanın tepkisiz kalmasına neden olabilir - Olağan Dışı İşleyiş Hatalarını Bildir + Olağan dışı işleyiş hatalarını bildir Parçanın dışında veya atımdan sonraki etkinlik yaşam döngüsündeki teslim edilemeyen Rx beklentilerinin bildirimini zorla Hızlı isabetsiz konumlama kullan @@ -400,9 +400,9 @@ Dosya - Geçersiz dizin + Böyle bir dizin yok Geçersiz dosya/içerik kaynağı - Dosya yok ya da okuma veya yazma izni yetersiz + Dosya mevcut değil veya okuma yazma izni eksik Dosya adı boş olamaz Hata oluştu: %1$s @@ -460,15 +460,15 @@ İzleme geçmişini temizle Oynatılan akışların geçmişini siler - Tüm izleme geçmişini sil. + Tüm izleme geçmişi silinsin mi\? İzleme geçmişi silindi. Arama geçmişini temizle Aranan anahtar sözcüklerin geçmişini siler - Tüm arama geçmişini sil. + Tüm arama geçmişi silinsin mi\? Arama geçmişi silindi. 1 öge silindi. - NewPipe, telif müsaadeli özgür yazılımdır: İstediğiniz gibi kullanabilir, öğrenebilir, paylaşabilir, iyileştirebilirsiniz. Özellikle; Özgür Yazılım Vakfı tarafından yayımlanan GNU Genel Kamu Lisansı\'nın, lisansın 3. sürümüyle veya (isterseniz) daha sonraki sürümünün koşulları altında yeniden dağıtabilir ve/veya düzenleyebilirsiniz. + NewPipe, telif haklı özgür yazılımdır: İstediğiniz gibi kullanabilir, öğrenebilir, paylaşabilir, iyileştirebilirsiniz. Özellikle; Özgür Yazılım Vakfı tarafından yayımlanan GNU Genel Kamu Lisansı\'nın, lisansın 3. sürümüyle veya (isterseniz) daha sonraki sürümünün koşulları altında yeniden dağıtabilir ve/veya düzenleyebilirsiniz. Ayarları da içe aktarmak istiyor musunuz? NewPipe\'ın Gizlilik İlkesi @@ -481,7 +481,7 @@ Kabul etme Sınırsız Mobil veri kullanırken çözünürlüğü sınırla - Uygulama geçişinde küçült + Uygulamayı simge durumuna küçült Ana video oynatıcıdan başka bir uygulamaya geçişteki eylem — %s Yok Arka plan oynatıcıya küçült From 449b17d8300e2adf4fd1d211fd0c07e67d2b1f1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristjan=20R=C3=A4ts?= Date: Sat, 1 Dec 2018 13:03:21 +0000 Subject: [PATCH 099/207] Translated using Weblate (Estonian) Currently translated at 86.4% (331 of 383 strings) --- app/src/main/res/values-et/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 08a7ee09c..0bed09a2e 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -3,14 +3,14 @@ %1$s vaatamist Avaldatud %1$s Voogesituseks puudub pleier. Kas paigaldada VLC? - Voogesituseks puudub pleier. (Selleks võib paigaldada VLC) + Voogesituseks puudub pleier (selleks võib paigaldada VLC). Paigalda Tühista Ava veebilehitsejas Ava hüpikaknas Jaga Allalaadimine - Laadi voog alla. + Laadi voog alla Otsi Seaded Kas mõtlesid: %1$s\? @@ -18,14 +18,14 @@ Vali veebilehitseja pööramine Kasuta välist videopleierit - Kui see valik lubada, puudub osadel lahutustel heli + Eemaldab audio SOME lahutustel Kasuta välist audiopleierit NewPipe hüpikaknarežiim Telli Tellitud Kanali tellimus tühistatud - Tellimuse muutmine nurjus - Tellimuse uuendamine nurjus + Tellimust ei saanud muuta + Tellimust ei õnnestunud uuendada Kuva info Tellimused @@ -42,7 +42,7 @@ Sisesta videote allalaadimise rada Audio allalaadimise kaust - Kaust allalaetud audio hoiustamiseks + Siia salvestatakse alla laaditud audio Sisesta audio allalaadimise rada Automaatesitus From e2acbeddc2239391d257f9f1615f0070e9dd8659 Mon Sep 17 00:00:00 2001 From: notramo Date: Fri, 30 Nov 2018 10:30:53 +0000 Subject: [PATCH 100/207] Translated using Weblate (Hungarian) Currently translated at 84.9% (325 of 383 strings) --- app/src/main/res/values-hu/strings.xml | 40 ++++++++++++++------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index fe25d0c7b..0ff8752ce 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -10,7 +10,7 @@ Letöltés Keresés Beállítások - Erre gondolt: %1$s ? + Erre gondoltál: %1$s\? Megosztás ezzel Válasszon böngészőt forgatás @@ -27,8 +27,8 @@ WebM — szabad formátum M4A — jobb minőség Letöltés - Következő videó - A webcím nem támogatott + Következő + Nem támogatott webcím Külső videólejátszó használata Külső hanglejátszó használata @@ -45,7 +45,7 @@ Megjelenés Tartalom alapértelmezett nyelve További beállítások - Következő hasonló videók mutatása + \'Következő\' és \'Hasonló\' videók mutatása Sötét Világos @@ -60,15 +60,15 @@ Nem lehet létrehozni a letöltési mappát \'%1$s\' Letöltés mappa létrehozása \'%1$s\' Tartalom - Korhatáros tartalom mutatása + Korhatáros tartalom Hiba A tartalom nem elérhető GEMA által blokkolt Ez egy élő közvetítés, amely még nem támogatott. Automatikus lejátszás Videók automatikus lejátszása, ha a NewPipe egy másik alkalmazásból lett indítva - Korhatáros videó. A megtekintéséhez engedélyezze a korhatáros videókat a Beállításokban. - élő + Korhatáros videó mutatása. Ennek a tartalomnak az engedélyezése a \"Beállítások\"-ban lehetséges. + ÉLŐ JELENTÉS Információ: @@ -120,19 +120,19 @@ Nem támogatott szerver Új küldetés Csatornáról leiratkozva - Nem lehet megváltoztatni a feliratozást - "Nem lehet frissíteni a feliratkozást " + Nem sikerült megváltoztatni a feliratkozást + "Nem sikerült frissíteni a feliratkozást " Főoldal Feliratkozások - Könyvjelzők + Könyvjelzőzött lejátszási listák Újdonságok Háttér Felugró ablak - Nem található lejátszó alkalmazás(Feltelepítheti a VLC a lejátszáshoz) + Nem található stream lejátszó alkalmazás (feltelepítheted a VLC-t a lejátszáshoz). Megnyitás felugró ablakként - Néhány felbontásnál NEM lesz hang ha ez a beállítás be van kapcsolva + Néhány felbontásnál eltávolítja a hangot NewPipe felugró ablak mód Feliratkozás Feliratkozva @@ -175,13 +175,13 @@ Csak egyszer NewPipe Értesítés - Értesítések a NewPipe Háttér- és felugró ablak lejátszójához + Értesítések a NewPipe háttér- és felugró ablak lejátszójához [Ismeretlen] Adatbázis importálása Adatbázis exportálása - Felül fogja írni a jelenlegi előzményeket és feliratkozásokat + Felülírja a jelenlegi előzményeket és feliratkozásokat Előzmények, feliratkozások és lejátszási listák exportálása Kép betöltése sikertelen Alkalmazás/Kezelő felület összeomlott @@ -194,7 +194,7 @@ Mi:\\nKérés:\\nTartalom nyelve:\\nSzolgáltatás:\\nGMT Idő:\\nCsomag:\\nVerzió:\\nOperációs Rendszer verzió: Nincs találat Régi lejátszó használata - Adatfolyam fájl letöltése. + Adatfolyam fájl letöltése Hozzáadás Gyorsabb, de pontatlan tekerés használata @@ -218,11 +218,11 @@ Folytatás felugró ablakban Megtekintési előzmények törlése Eltávolítja a megtekintési előzményeket - Összes megtekintési előzmény törlése. + Törlöd az összes megtekintési előzményt\? Megtekintési előzmények törölve. Keresési előzmények törlése Eltávolítja a kereséshez használt kifejezéseket az előzményekből - Összes keresési előzmény törlése. + Törlöd az összes keresési előzményt\? Keresési előzmények törölve. Lejátszási hiba történt Lejátszási hiba helyreállítása @@ -432,4 +432,8 @@ Lejátszás folytatása a háttérben Lejátszás folytatása felugró ablakban - +Lejátszás folytatása a fókusz visszaszerzésekor + Mutassa a \"Tartsa lenyomva a hozzáadáshoz\" tippet + Sorba állítva a háttérben lejátszáshoz + Elforgatás + From 49a58dcab140edf2425d28abf1b64362bdbc9670 Mon Sep 17 00:00:00 2001 From: srkrishna Date: Fri, 30 Nov 2018 19:56:26 +0000 Subject: [PATCH 101/207] Translated using Weblate (Tamil) Currently translated at 29.0% (111 of 383 strings) --- app/src/main/res/values-ta/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 4c8b354e5..9a2f021cd 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -121,4 +121,8 @@ காணொலி ஒலி மீண்டும் முயற்சி + சில பிரிதிறன்கலில் ஒலி நீக்கப்படும் + சில சாதனங்கள் மட்டுமெ 2k/4k காணொளிகலை இயக்கும் + காணொளிகலை Kodi media center கொண்டு இயக்கும் இடப்பை காண்பி + வேகமான பொருத்தமற்ற தேடலை பயன்படுத்து From ff90f257cce238f499e2fb18394f82f319fff347 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Tue, 4 Dec 2018 23:37:02 +0530 Subject: [PATCH 102/207] removed useless log statement --- .../org/schabi/newpipe/fragments/list/BaseListFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index e46606871..b61fe0d02 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -224,7 +224,7 @@ public abstract class BaseListFragment extends BaseStateFragment implem infoListAdapter.setOnCommentsSelectedListener(new OnClickGesture() { @Override public void selected(CommentsInfoItem selectedItem) { - //Log.d("comments" , "this comment was clicked" + selectedItem.getCommentText()); + onItemSelected(selectedItem); } }); From c1a67ff1f8b07d6427201395753c1edb8eb4e308 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Fri, 7 Dec 2018 06:45:33 +0530 Subject: [PATCH 103/207] minor scrolling fix and ellipsize fix --- .../android/support/design/widget/FlingBehavior.java | 3 +++ .../info_list/holder/CommentsMiniInfoItemHolder.java | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/android/support/design/widget/FlingBehavior.java b/app/src/main/java/android/support/design/widget/FlingBehavior.java index a453d302b..59eb08294 100644 --- a/app/src/main/java/android/support/design/widget/FlingBehavior.java +++ b/app/src/main/java/android/support/design/widget/FlingBehavior.java @@ -30,6 +30,9 @@ public final class FlingBehavior extends AppBarLayout.Behavior { // We're scrolling down } else { // We're scrolling up + if (mOffsetAnimator != null && mOffsetAnimator.isRunning()) { + mOffsetAnimator.cancel(); + } min = -child.getUpNestedPreScrollRange(); max = 0; consumed[1] = scroll(coordinatorLayout, child, dy, min, max); diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java index 046cadc3f..bf63c7c2d 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java @@ -1,7 +1,10 @@ package org.schabi.newpipe.info_list.holder; import android.support.v7.app.AppCompatActivity; +import android.text.SpannableString; import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.text.util.Linkify; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -15,6 +18,7 @@ import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.util.ImageDisplayConstants; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.views.TouchTextView; import de.hdodenhof.circleimageview.CircleImageView; @@ -31,9 +35,9 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { super(infoItemBuilder, layoutId, parent); itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView); - itemContentView = itemView.findViewById(R.id.itemCommentContentView); itemLikesCountView = itemView.findViewById(R.id.detail_thumbs_up_count_view); itemDislikesCountView = itemView.findViewById(R.id.detail_thumbs_down_count_view); + itemContentView = itemView.findViewById(R.id.itemCommentContentView); } public CommentsMiniInfoItemHolder(InfoItemBuilder infoItemBuilder, ViewGroup parent) { @@ -66,6 +70,12 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { } }); + // ellipsize if not already ellipsized + if (null == itemContentView.getEllipsize()) { + itemContentView.setEllipsize(TextUtils.TruncateAt.END); + itemContentView.setMaxLines(commentDefaultLines); + } + itemContentView.setText(item.getCommentText()); if (null != item.getLikeCount()) { itemLikesCountView.setText(String.valueOf(item.getLikeCount())); From ccb9bceecc8860554fb508503d6bcf29c168e107 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Fri, 7 Dec 2018 08:42:05 +0530 Subject: [PATCH 104/207] removed unused imports --- .../info_list/holder/CommentsMiniInfoItemHolder.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java index bf63c7c2d..966564221 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java @@ -1,11 +1,7 @@ package org.schabi.newpipe.info_list.holder; import android.support.v7.app.AppCompatActivity; -import android.text.SpannableString; import android.text.TextUtils; -import android.text.method.LinkMovementMethod; -import android.text.util.Linkify; -import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; @@ -16,9 +12,7 @@ import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.util.ImageDisplayConstants; -import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; -import org.schabi.newpipe.views.TouchTextView; import de.hdodenhof.circleimageview.CircleImageView; From 9bbbffbe7ae67040c2b53caddffc45c1a609cb11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20=C5=A0amla?= Date: Wed, 5 Dec 2018 22:04:53 +0000 Subject: [PATCH 105/207] Translated using Weblate (Czech) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-cs/strings.xml | 70 +++++++++++++------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 6c79adc3e..7a761d6fd 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -9,17 +9,17 @@ Stáhnout Vyhledat Nastavení - Měli jste na mysli: %1$s? + Mysleli jste: %1$s\? Sdílet s Vybrat prohlížeč otočení Použít externí video přehrávač Použít externí audio přehrávač - Cesta, kam se uloží stažené audio + Stažené audio je uloženo zde Zadejte umístění pro stažené audio soubory - Umístění pro stažené audio + Složka pro stažené audio Výchozí rozlišení Přehrát pomocí Kodi Aplikace Kore nenalezena. Chcete ji nainstalovat? @@ -39,9 +39,9 @@ Světlé Stáhnout - Další videa - Zobrazovat \'další\' a \'podobná\' videa - URL není podporováno + Další + Zobrazovat \'Další\' a \'Podobná\' videa + Nepodporovaná URL Preferovaný jazyk obsahu Video a zvuk Vzhled @@ -69,9 +69,9 @@ Automaticky přehrávat Přehrává video, když je NewPipe otevřen z jiné aplikace Obsah - Zobrazovat věkově omezený obsah - Toto video je věkově omezeno. Povolte věkově omezená videa v nastavení. - živě + Věkově omezený obsah + Zobrazit video s věkovým omezením. Povolit tento obsah lze v \"Nastavení\". + ŽIVĚ Nebylo možné kompletně analyzovat stránku Začni stiskem hledat @@ -103,7 +103,7 @@ Omlouváme se, nastaly určité chyby. Nepodařilo se nahrát obrázek Aplikace/UI spadlo - Tento stream je vysílán živě, funkce ještě není podporována. + Živé streamy zatím nejsou podporovány Nepodařilo se dostat žádný stream Nepodařilo se nastavit menu stahování Nahlásit chybu @@ -144,7 +144,7 @@ otevření ve vyskakovacím okně Použít starý přehrávač -Některé formáty rozlišení NEBUDOU obsahovat zvukovou stopu po zapnutí této funkce +Odstraňuje zvuk v některých rozlišeních Zobrazovat vyšší rozlišení Pouze některá zařízení podporují přehrávání 2K/4K videí Výchozí formát videa @@ -254,7 +254,7 @@ otevření ve vyskakovacím okně Historie je prázdná Historie vymazána Položka byla odstraněna -Zobrazovat tip \"podržet pro přidání\" +Zobrazovat tip \"Podržet pro přidání\" Zobrazí se po stisku tlačítek přehrát na pozadí nebo přehrát v okně na stránce s videem Ve frontě přehrávače na pozadí Ve frontě přehrávače v okně @@ -291,7 +291,7 @@ otevření ve vyskakovacím okně Do fronty na pozadí Do fronty v okně Začne hrát zde - Začne zde na pozadí + Začne zde, když na pozadí Začne zde v okně Donate NewPipe je vyvíjen dobrovolníky, kteří tráví svůj čas, aby vaše zkušenost s aplikací byla co nejlepší. Vraťte vývojářům něco zpět, aby mohli NewPipe dále zlepšovat a zároveň si vychutnat šálek kávy. @@ -307,7 +307,7 @@ otevření ve vyskakovacím okně Otevřít Drawer Zavřít Drawer - Nenalezen přehrávač streamu (pro přehrání můžete nainstalovat např. VLC) + Nenalezen přehrávač streamu (pro přehrání můžete nainstalovat např. VLC). Vždy Pouze jednou @@ -320,8 +320,8 @@ otevření ve vyskakovacím okně Nenalezeny žádné video streamy Nenalezeny žádné audio streamy - Export dokončen - Import dokončen + Exportováno + Importováno Žádný platný soubor ZIP Upozornění: Nelze importovat všechny soubory. Tímto se anuluje vaše aktuální nastavení. @@ -333,10 +333,10 @@ otevření ve vyskakovacím okně Získávám informace… Načítání požadovaného obsahu -Stáhnout soubor streamu. +Stáhnout soubor streamu Ukázat informace - Záložky + Uložené playlisty Přidat do @@ -358,9 +358,9 @@ otevření ve vyskakovacím okně Vždy se zeptat - Vytvořit nový playlist - Vymazat playlist - Přejmenovat playlist + Nový playlist + Vymazat + Přejmenovat Jméno Přidat do playlistu Nastavit jako náhled playlistu @@ -368,11 +368,11 @@ otevření ve vyskakovacím okně Založit playlist Smazat záložku - Přejete si smazat tento playlist? + Smazat tento playlist\? Playlist vytvořen - Přidáno do playlistu - Náhled playlistu změněn - Playlist nelze smazat + V playlistu + Náhled playlistu změněn. + Playlist nelze smazat. Žádné titulky @@ -399,22 +399,22 @@ otevření ve vyskakovacím okně Použít rychlé nepřesné hledání Nepřesné hledání umožní přehrávači posouvat se rychleji, ale se sníženou přesností Načítat náhledy - Zakažte, chcete-li zabránit načítání všech náhledů a tím šetřit data a využití paměti. Změnou tohoto nastavení dojde k vyčištění mezipaměti obrázků + Po vypnutí se nestahují náhledy a tím se šetří data a využití paměti. Změna tohoto nastavení vyčistí mezipamět obrázků. Mezipaměť obrázků vymazána Vymazat metadata v mezipaměti Odebrat všechna data uložená v mezipaměti Mezipaměť metadat vymazána Automatická fronta dalšího streamu - Automaticky připojí související stream při přehrávání posledního streamu v neopakující se frontě + Automaticky připojí související stream při přehrávání posledního streamu v neopakující se frontě. Soubor - Neplatný adresář - Neplatný zdroj souboru/obsahu - Soubor neexistuje nebo máte nedostatečné oprávnění k jeho čtení či zápisu + Neexistující složka + Neexistující zdroj souboru/obsahu + Soubor neexistuje nebo chybí oprávnění k jeho čtení či zápisu Název souboru nesmí být prázdný Došlo k chybě: %1$s - Import/Export + Import/export \n Importovat \n @@ -460,17 +460,17 @@ otevření ve vyskakovacím okně Výchozí chování při otevírání obsahu — %s Titulky - Upravuje velikost textu titulků a styly pozadí. Změny se projeví po restartu aplikace + Upravuje velikost textu titulků a styly pozadí. Změny se projeví po restartu aplikace. K přehrání tohoto souboru chybí vhodná aplikace Vymazat historii sledování Vymaže historii přehrávaných streamů - Vymazat celkovou historii sledování. + Vymazat celkovou historii sledování\? Historie sledování smazána. Vymazat historii vyhledávání Vymaže historii vyhledávaných klíčových slov - Vymazat celkovou historii vyhledávání. + Vymazat celkovou historii vyhledávání\? Historie vyhledávání smazána. Jedna položka smazána. @@ -497,7 +497,7 @@ otevření ve vyskakovacím okně Bez omezení Omezit rozlišení při použití mobilních dat Minimalizovat při přepínání aplikací - Akce při přepínání aplikací z hlavního přehrávače videa - %s + Akce při přepínání aplikací z hlavního přehrávače videa — %s Žádná Minimalizovat přehrávač na pozadí Minimalizovat přehrávač do vyskakovacího okna From 34d0c0b1ba1ca73bb290a05a9041a083b71247cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristjan=20R=C3=A4ts?= Date: Wed, 5 Dec 2018 19:59:23 +0000 Subject: [PATCH 106/207] Translated using Weblate (Estonian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-et/strings.xml | 60 +++++++++++++------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 0bed09a2e..63367a8d5 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -29,7 +29,7 @@ Kuva info Tellimused - Järjehoidjad + Esitusloendid järjehoidjates Mis on uut @@ -69,13 +69,13 @@ Kasuta ebatäpset kerimist Ebatäpne kerimine lubab pleieril otsida asukohta kiiremini täpsuse arvel Laadi pisipildid - Keela, peatamaks pisipiltide laadimine ja vähenda andme- ja mälukasutust. Selle muutmine puhastab nii sisemälu kui piltide vahemälu andmekandjal + Välujalülitatult ei toimu pisipiltide laadimist, salvestamist ja puhverdamist. Muutmine puhastab vahemälu nii kettal kui ka mälus. Pildid kustutati vahemälust Kustuta metaandmed vahemälust Kustuta veebilehtede andmed vahemälust Metaandmed kustutati vahemälust Järgmine voog automaatselt järjekorda - Lisa seotud voog automaatselt, kui esitusel on viimane voog mittekorduvast järjekorrast + Lisa seotud voog automaatselt, kui esitusel on viimane voog mittekorduvast järjekorrast. Pleieri juhtimise viiped Luba viiped helitugevuse ja ereduse juhtimiseks Kuva soovitused @@ -87,17 +87,17 @@ Jätka taasesitust fookuse saamisel Jätka taasesitust pärast katkestamist (nt. telefonikõne) Laadi alla - Järgmine video + Järgmine Kuva \'järgmine\' ja \'sarnased\' videod Kuva vihjet \"lisamiseks hoia\" Kuva vihje, kui videoandmete lehel vajutatakse tausta või hüpikakna nupule - URL pole toetatud + Mitte toetatud URL Sisu vaikimisi riik Teenus Sisu vaikimisi keel Pleier Käitumine - Heli ja pilt + Pilt ja heli Ajalugu ja vahemälu Hüpikaken Välimus @@ -109,9 +109,9 @@ Lisati hüpikpleieri järjekorda Esita Sisu - Kuva vanusepiiranguga sisu - Vanusepiiranguga sisu. Selle saab lubada seadetes. - Otse + Vanusepiiranguga sisu + Kuva vanusepiiranguga sisu. Sellise materjali saab lubada \"seadetes\". + OTSE Allalaadimised Allalaadimised Vea teatamine @@ -146,11 +146,11 @@ Ekspordi ajalugu, tellimused ja pleilistid Puhasta vaatamiste ajalugu Kustutab vaadatud voogude ajaloo - Kustuta kogu vaatamiste ajalugu. + Kas kustutada kogu vaatamiste ajalugu\? Vaatamiste ajalugu kustutati. Kustuta otsinguajalugu Kustutab otsisõnade ajaloo - Kustuta kogu otsinguajalugu. + Kas kustutada kogu otsinguajalugu\? Otsinguajalugu kustutati. Viga Võrgu viga @@ -161,7 +161,7 @@ Sisu pole saadaval GEMA poolt blokeeritud Allalaadimismenüü seadistamine nurjus - See on OTSEVOOG, mis pole veel toetatud. + Otsevood ei ole veel toetatud Ühtegi voogu ei leitud Pildi laadimine nurjus Rakendus jooksis kokku @@ -172,9 +172,9 @@ Kehtetu URL Videovooge ei leitud Helivooge ei leitud - Kehtetu kataloog - Kehtetu faili/sisu allikas - Fail puudub või puuduvad õigused seda lugeda või kirjutada + Kataloogi pole + Faili/sisu allikat pole + Puudub fail või puuduvad õigused seda faili lugeda või kirjutada Tühi failinimi pole lubatud Ilmnes viga: %1$s Allalaaditavaid videovooge pole @@ -316,10 +316,10 @@ Voo leht Kanali leht Vali kanal - Ühtki kanalit pole veel tellitud + Kanaleid pole veel tellitud Vali kiosk - Eksport tehtud - Import tehtud + Eksporditud + Imporditud Korralikku ZIP faili pole Hoiatus: Kõiki faile ei õnnestunud importida. See alistab praeguse seadistuse. @@ -336,10 +336,10 @@ Heli seaded Hoia järjekorda lisamiseks Lisa järjekorda taustal - Lisa järjekorda hüpikaknaga + Lisa järjekorda uue hüpikaknaga Alusta taasesitust siit - Alusta siit taustal - Alusta siit hüpikaknaga + Alusta siit olles taustal + Alusta siit uue hüpikaknaga Ava sahtel Sulge sahtel @@ -357,9 +357,9 @@ Info hankimine… Soovitud sisu laadimine - Loo uus pleilist - Kustuta pleilist - Nimeta pleilist ümber + Uus pleilist + Kustuta + Nimeta ümber Nimi Lisa pleilisti Määra pleilisti pisipildiks @@ -370,8 +370,8 @@ Kas kustutada see pleilist? Pleilist loodud Lisati pleilisti - Pleilisti pisipilt muudetud - Pleilisti kustutamine nurjus + Pleilisti pisipilt muudetud. + Pleilisti kustutamine nurjus. Subtiitriteta @@ -382,7 +382,7 @@ Automaatselt loodud Subtiitrid - Kohanda pleieri subtiitrite teksti suurust ja tausta. Jõustamiseks tuleb rakendus taaskäivitada + Kohanda pleieri subtiitrite teksti suurust ja tausta. Jõustamiseks tuleb rakendus taaskäivitada. Mälulekke seire võib põhjustada rakenduse hangumise @@ -426,7 +426,7 @@ Lülitu peamisele reCAPTCHA nõue - Nõutav on reCAPTCHA + reCAPTCHA nõude taotlus © %1$s %2$s %3$s alla Vaba kergekaaluline Androidi voogesitus. @@ -460,4 +460,6 @@ Esita taustal Minimeeri hüpikpleierisse - +Jõusta väljaspool fragmenti või elutsüklit olevate kättetoimetamatute Rx erindite raporteerimine nende vabastamise järgselt + + From d56cf003f840b92c5412262db6b60cfce3d3e5e9 Mon Sep 17 00:00:00 2001 From: Tobias Groza Date: Tue, 4 Dec 2018 20:50:01 +0000 Subject: [PATCH 107/207] Translated using Weblate (German) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-de/strings.xml | 58 +++++++++++++------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3143aeccf..3e47bd3b6 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -20,7 +20,7 @@ Standardauflösung Mit Kodi abspielen Kore App wurde nicht gefunden. Kore jetzt installieren? - Zeige \"Mit Kodi abspielen\" Option + Option \"Mit Kodi abspielen\" anzeigen Zeigt eine Option an, über die man Videos mit Kodi abspielen kann Audio Bevorzugtes Audioformat @@ -37,8 +37,8 @@ Nutzerbild Gefällt nicht Gefällt - Benutze externen Videoabspieler - Benutze externen Audioabspieler + Externen Video-Player verwenden + Externen Audio-Player verwenden Spiele im Hintergrund ab Abspielen @@ -56,7 +56,7 @@ Aussehen Andere - Kann Download-Verzeichnis nicht anlegen \'%1$s\' + Kann Download-Verzeichnis \'%1$s\' nicht anlegen Download-Verzeichnis \'%1$s\' erstellt Fehler Konnte nicht alle Vorschaubilder laden @@ -144,7 +144,7 @@ Deaktiviert - Benutze den alten Player + Alten Player benutzen Im Pop-up-Modus öffnen Bevorzugtes Videoformat Spiele im Pop-up Modus ab @@ -155,7 +155,7 @@ Alter eingebauter Mediaframework-Player Standardauflösung des Pop-ups - Zeige höhere Auflösungen an + Höhere Auflösungen anzeigen Nur manche Geräte unterstützen das Abspielen von 2K-/4K-Videos Hintergrund Pop-up @@ -165,8 +165,8 @@ Letzte Größe und Position des Pop-ups merken Gestensteuerung Helligkeit und Lautstärke mittels Gesten einstellen - Durchsuche Vorschläge - Zeige Vorschläge beim Suchen + Suchvorschläge + Beim Suchen Vorschläge anzeigen Pop-up Filter @@ -185,7 +185,7 @@ Lizenz konnte nicht geladen werden © %1$s von %2$s unter %3$s Über - Eine freie, schlanke Streaming-App für Android. + Freies und schlankes Streaming für Android. NewPipes Lizenz Ob Ideen, Übersetzungen, Design-Änderungen, Code-Aufräumung oder richtig große Code-Änderungen – Hilfe ist immer willkommen. Je mehr geholfen wird, desto besser wird NewPipe! Drittanbieter-Lizenzen @@ -199,13 +199,13 @@ Buchstaben und Zahlen Abonnieren Abonniert - Abo beenden + Abo beendet Abos Neuigkeiten Suchverlauf - Speichere den Suchverlauf lokal + Suchanfragen lokal speichern Verlauf & Cache Speichere den Wiedergabeverlauf Verlauf @@ -298,7 +298,7 @@ Spenden Zurückgeben Website - Besuche die NewPipe-Website für weitere Informationen und Neuigkeiten. + Besuche die NewPipe Website für weitere Informationen und Neuigkeiten. NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür verwenden, dir die beste Nutzererfahrung zu bieten. Gib etwas zurück, um den Entwicklern zu helfen, NewPipe noch besser machen zu können, während sie sich an einer Tasse Kaffee erfreuen. Service Keinen Streamplayer gefunden (du kannst VLC installieren, um den Stream abzuspielen). @@ -358,7 +358,7 @@ Löschen Umbenennen Zur Wiedergabeliste hinzufügen - Als Symbolbild der Wiedergabeliste festlegen + Als Vorschaubild der Wiedergabeliste festlegen Lesezeichen entfernen @@ -374,7 +374,7 @@ Abbrechen Normale Schriftgröße Stream-Datei herunterladen - Benutze schnelle, ungenaue Suche + Schnelle, ungenaue Suche verwenden Mit ungenauem Suchen kann die Abspielposition schneller erreicht werden, aber auf Kosten der Genauigkeit Datei @@ -401,9 +401,9 @@ \n \nMöchtest du fortfahren? Vorschaubilder laden - Bildercache gelöscht - Leere die gecachten Metadaten - Entferne alle gecachten Website-Daten + Bilder-Cache gelöscht + Zwischengespeicherte Metadaten löschen + Alle zwischengespeicherten Website-Daten entfernen Metadatencache gelöscht Debug Datei-/Inhaltsquelle existiert nicht @@ -421,13 +421,13 @@ Verknüpfung aufheben (kann zu Verzerrungen führen) Nightcore Standard -Wenn ausgeschaltet, werden keine Miniaturansichten geladen, Daten und Speicherverbrauch sparend. Änderungen löschen sowohl Speicher- als auch Image-Caches auf der Festplatte. +Wenn ausgeschaltet, werden keine Miniaturansichten geladen, Daten und Speicherverbrauch sparend. Änderungen löschen die Bilder-Caches sowohl im Arbeitsspeicher als auch auf der SD-Karte. Nächsten Stream automatisch einreihen Automatisches Anhängen eines verwandten Streams beim Abspielen des letzten Streams in einer nicht wiederholten Warteschlange. Hier wird bald etwas stehen ;D - Lesezeichen Wiedergabeliste + Wiedergabeliste mit Lesezeichen versehen Anpassen Füllen Vergrößern @@ -437,17 +437,17 @@ Fehler außerhalb des Lebenszyklus melden Erzwingen der Meldung unzustellbarer Rx-Ausnahmen außerhalb des Lebenszyklus von Fragmenten oder Aktivitäten nach der Entsorgung - Importieren Sie YouTube-Abonnements, indem Sie die Exportdatei herunterladen: + Importiere YouTube-Abonnements, indem du die Exportdatei herunterlädst: \n -\n1. Gehen Sie zu dieser URL: %1$s -\n2. Melden Sie sich an, wenn Sie dazu aufgefordert werden. +\n1. Gehe zu dieser URL: %1$s +\n2. Melde dich an, falls du dazu aufgefordert wirst. \n3. Der Ladevorgang sollte beginnen (das ist die Exportdatei) - Importieren Sie ein SoundCloud-Profil, indem Sie entweder die URL oder Ihre ID eingeben: -\n -\n1. Aktivieren des \"Desktop-Modus\" in einem Web-Browser (die Seite ist für mobile Geräte nicht verfügbar) -\n2. Gehen Sie zu dieser URL: %1$s -\n3. Melden Sie sich an, wenn Sie gefragt werden -\n4. Kopieren Sie die Profil-URL, zu der Sie weitergeleitet wurden. + Importiere ein SoundCloud-Profil, indem du entweder die URL oder deine ID eingibst: +\n +\n1. Aktiviere den \"Desktop-Modus\" in einem Web-Browser (die Seite ist für mobile Geräte nicht verfügbar) +\n2. Gehe zu dieser URL: %1$s +\n3. Melden dich an, falls du dazu aufgefordert wirst +\n4. Kopiere die Profil-URL, zu der du weitergeleitet wurdest. yourID, soundcloud.com/yourid Keine Streams zum Download verfügbar @@ -456,7 +456,7 @@ Standardaktion beim Öffnen von Inhalten - %s Untertitel - Ändere Textgröße und Hintergrundstil des Untertitels im Player. Wird erst nach Neustart des App wirksam. + Textgröße und Hintergrund der Untertitel im Player anpassen. Wird erst nach Neustart der App wirksam. Keine App zum Abspielen dieser Datei installiert From 8d0ac4f5f09624b3ca770c271beedfa7aa77b90f Mon Sep 17 00:00:00 2001 From: ScratchBuild Date: Thu, 6 Dec 2018 04:36:17 +0000 Subject: [PATCH 108/207] Translated using Weblate (Japanese) Currently translated at 81.5% (312 of 383 strings) --- app/src/main/res/values-ja/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index ea631b028..9ebce6cd9 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -380,8 +380,8 @@ テンポ 音程 デフォルト -バックグラウンド再生リストに追加されました - ポップアップ再生リストに追加されました +バックグラウンド再生の順番待ちに追加 + ポップアップ再生の順番待ちに追加 再生履歴を消去 再生した動画の履歴を削除します 再生履歴を削除しました。 From fcc4d655f5551270537d60b8808a5f3cd45670de Mon Sep 17 00:00:00 2001 From: Rintaro matsuo Date: Thu, 6 Dec 2018 04:36:56 +0000 Subject: [PATCH 109/207] Translated using Weblate (Japanese) Currently translated at 81.5% (312 of 383 strings) --- app/src/main/res/values-ja/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 9ebce6cd9..8b0031ee7 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -61,7 +61,7 @@ 保存場所 \'%1$s\' を作成しました エラー 全てのサムネイルを読み込むことができません - 動画の URL 署名を復号できませんでした + 動画のURLを復号できませんでした Webサイトを解析できませんでした コンテンツが利用できません GEMA にブロックされました @@ -80,7 +80,7 @@ 動画を取得できませんでした 申し訳ありません。発生すべきでものではありませんでした。 メールで不具合を報告 - 申し訳ありません。いくつかのエラーが発生しました。 + 申し訳ありません、不具合が発生しました 報告 情報: 何が起こりましたか: @@ -121,8 +121,8 @@ クリップボードにコピーしました ダウンロードフォルダを選択して下さい - 保存 - 保存 + ダウンロード + ダウンロード 不具合報告 画像を読み込みできません @@ -183,7 +183,7 @@ 検索候補 検索時に候補を表示します -最適な解像度 +最高の解像度 NewPipe について 設定 @@ -226,7 +226,7 @@ 元に戻す すべて再生 - NewPipeの通知 + 通知 [不明] 動画の再生ができませんでした From 9eaef84cc84e5f9e79023eaf41e33bb1435ae56a Mon Sep 17 00:00:00 2001 From: srkrishna Date: Thu, 6 Dec 2018 19:05:34 +0000 Subject: [PATCH 110/207] Translated using Weblate (Tamil) Currently translated at 29.8% (114 of 383 strings) --- app/src/main/res/values-ta/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 9a2f021cd..8b1cdf1bf 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -125,4 +125,7 @@ சில சாதனங்கள் மட்டுமெ 2k/4k காணொளிகலை இயக்கும் காணொளிகலை Kodi media center கொண்டு இயக்கும் இடப்பை காண்பி வேகமான பொருத்தமற்ற தேடலை பயன்படுத்து + இயக்கியின் சைகை கட்டுப்பாடுகள் + "இயைக்கியின் பிரகாசம் மற்றும் ஒலியினை சைகைமூலம் கட்டுப்படுத்து" + தேடும்போது பரிந்துரைகளை கான்பி From 5a2ae4c3e38cae19868cf171a8fa35051413d343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emin=20Tufan=20=C3=87etin?= Date: Wed, 5 Dec 2018 16:57:55 +0000 Subject: [PATCH 111/207] Translated using Weblate (Turkish) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-tr/strings.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 2122fb0cb..cc0f53eac 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -168,7 +168,7 @@ Açılır Oynatıcı Boyutlandırılıyor - Bu seçenek etkinken bazı çözünürlüklerin sesi olmayacaktır + BAZI çözünürlüklerdeki sesi kaldırır Oynatıcının parlaklığını ve sesini yönetmek için el hareketlerini kullan Oynatıcı el hareketi denetimleri Arama önerileri @@ -288,11 +288,11 @@ Ayrıntılar Ses Ayarları Kuyruğa almak için basılı tut - Arka Planda Kuyruğa Al - Açılır Oynatıcıda Kuyruğa Al + Arka planda kuyruğa al + Yeni açılır oynatıcıda sıraya al Burada oynatmaya başla - Burada Arka Planda Başlat - Burada Açılır Oynatıcıda Başlat + Burada arka planda başlat + Burada yeni açılır oynatıcıda başlat Bağış yapın NewPipe, size en iyi deneyimi sunmak için zamanını harcayan gönüllüler tarafından geliştirilmiştir. Bir fincan kahveyi yudumlarken NewPipe\'ı daha da iyi yapmaları için geliştiricilere yardımcı olun. Geri ver @@ -368,7 +368,7 @@ Bu oynatma listesi silinsin mi\? Oynatma listesi oluşturuldu Oynatma listesinde - Oynatma listesi küçük resmi değiştirildi + Oynatma listesi küçük resmi değiştirildi. Oynatma listesi silinemedi. Alt Yazı Yok @@ -395,14 +395,14 @@ Hızlı isabetsiz konumlama kullan İsabetsiz konumlama, oynatıcının azaltılmış kesinlikle daha hızlı konumlama yapmasını sağlar Sonraki akışı kendiliğinden kuyruğa ekle - Yinelemeyen bir kuyruktaki son akış oynatılırken ilgili bir akışı kendiliğinden sonuna ekle + Yinelemeyen bir kuyruktaki son akış oynatılırken ilgili bir akışı kendiliğinden sonuna ekle. EŞZAMANLA Dosya Böyle bir dizin yok - Geçersiz dosya/içerik kaynağı - Dosya mevcut değil veya okuma yazma izni eksik + Dosya/içerik kaynağı değil + Dosya yok veya okuma yazma izni eksik Dosya adı boş olamaz Hata oluştu: %1$s @@ -437,7 +437,7 @@ \n \nDevam etmek istiyor musunuz? Küçük resimleri yükle - Küçük resimlerin tümünün yüklenmesini engellemek, bellek ve veri kullanımını azaltmak için devre dışı bırakın. Bunu değiştirmek, hem bellekteki hem de diskteki resim önbelleğini temizler + Kapalıyken küçük resimler yüklenmez, veri ve bellek kullanımı azaltılır. Değişiklikler hem bellekteki hem diskteki resim önbelleğini temizler. Resim önbelleği temizlendi Önbelleklenmiş üst veriyi temizle Önbelleklenmiş tüm web sayfası verisini kaldır @@ -454,7 +454,7 @@ İçerik açılırken öntanımlı eylem — %s Ek Açıklamalar - Oynatıcı ek açıklamalar metin boyutunu ve arka plan biçimlerini düzenle. Etki için uygulamayı yeniden başlatmak gerekir + Oynatıcı ek açıklamalar metin boyutunu ve arka plan biçimlerini düzenle. Etki için uygulamayı yeniden başlatmak gerekir. Bu dosyayı oynatmak için kurulan uygulama yok From 33021e8fe0d1c45544cec0609a44af88828e5f0b Mon Sep 17 00:00:00 2001 From: Echelon Arpa Date: Thu, 6 Dec 2018 06:06:44 +0000 Subject: [PATCH 112/207] Translated using Weblate (Turkish) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-tr/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index cc0f53eac..ea7a52215 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -27,7 +27,7 @@ Ses dosyaları için indirme konumu girin Kendiliğinden Oynat - NewPipe başka uygulamadan çağırıldığında videoyu oynatır + NewPipe başka uygulamadan çağrıldığında videoyu oynatır Öntanımlı çözünürlük Kodi ile oynat Kore uygulaması bulunamadı. Kurulsun mu? @@ -224,7 +224,7 @@ Geri Al NewPipe Bildirimi - NewPipe arkaplan ve açılır oynatıcılar için bildirimler + NewPipe arka plan ve açılır oynatıcılar için bildirimler Sonuç yok Burada cırcır böceklerinden başka şey yok From 1a62b9a161865bc47bb61c15f5af3e955b1d1144 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Sat, 8 Dec 2018 20:32:28 +0530 Subject: [PATCH 113/207] removed dislike button, added comment published time --- .../holder/CommentsMiniInfoItemHolder.java | 3 ++ .../main/res/layout/list_comments_item.xml | 31 ++++++------ .../res/layout/list_comments_mini_item.xml | 47 +++++++------------ 3 files changed, 36 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java index 966564221..c2bc86691 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java @@ -21,6 +21,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { private final TextView itemContentView; private final TextView itemLikesCountView; private final TextView itemDislikesCountView; + private final TextView itemPublishedTime; private static final int commentDefaultLines = 2; private static final int commentExpandedLines = 1000; @@ -31,6 +32,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView); itemLikesCountView = itemView.findViewById(R.id.detail_thumbs_up_count_view); itemDislikesCountView = itemView.findViewById(R.id.detail_thumbs_down_count_view); + itemPublishedTime = itemView.findViewById(R.id.itemPublishedTime); itemContentView = itemView.findViewById(R.id.itemCommentContentView); } @@ -74,6 +76,7 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { if (null != item.getLikeCount()) { itemLikesCountView.setText(String.valueOf(item.getLikeCount())); } + itemPublishedTime.setText(item.getPublishedTime()); itemView.setOnClickListener(view -> { toggleEllipsize(item.getCommentText()); diff --git a/app/src/main/res/layout/list_comments_item.xml b/app/src/main/res/layout/list_comments_item.xml index 16b6107c5..a9b091329 100644 --- a/app/src/main/res/layout/list_comments_item.xml +++ b/app/src/main/res/layout/list_comments_item.xml @@ -49,17 +49,6 @@ android:textSize="@dimen/video_item_search_uploader_text_size" tools:text="Comment Content, Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blandit" /> - - + + + + diff --git a/app/src/main/res/layout/list_comments_mini_item.xml b/app/src/main/res/layout/list_comments_mini_item.xml index 7e8ce1a87..36f3e2e6e 100644 --- a/app/src/main/res/layout/list_comments_mini_item.xml +++ b/app/src/main/res/layout/list_comments_mini_item.xml @@ -20,27 +20,11 @@ android:src="@drawable/buddy_channel_item" tools:ignore="RtlHardcoded"/> - - - - - + + + + From 9d648bad516c905947743391213704010044a9cf Mon Sep 17 00:00:00 2001 From: srkrishna Date: Fri, 7 Dec 2018 20:43:33 +0000 Subject: [PATCH 114/207] Translated using Weblate (Tamil) Currently translated at 30.3% (116 of 383 strings) --- app/src/main/res/values-ta/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 8b1cdf1bf..f22f13341 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -128,4 +128,6 @@ இயக்கியின் சைகை கட்டுப்பாடுகள் "இயைக்கியின் பிரகாசம் மற்றும் ஒலியினை சைகைமூலம் கட்டுப்படுத்து" தேடும்போது பரிந்துரைகளை கான்பி + "தொலைபேசி அழைப்பு போன்ற குறுக்கீடுகளுக்கு பிறகு தொடரவும் " + \'அடுத்து\' மற்றும் \'ஒப்பான\' காணொளிகலை காண்பி From 222c8fdb622fee18cccb6f8bb430fecb6329e226 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Sun, 9 Dec 2018 03:21:55 +0530 Subject: [PATCH 115/207] tablet ui support for comments --- .../fragments/detail/VideoDetailFragment.java | 64 ++-- .../list/comments/CommentsFragment.java | 5 + .../list/videos/RelatedVideosFragment.java | 5 + .../fragment_video_detail.xml | 273 +++++++++--------- 4 files changed, 186 insertions(+), 161 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 3d5ac2d14..9a0c3b1b0 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 @@ -16,6 +16,7 @@ import android.support.annotation.Nullable; import android.support.design.widget.AppBarLayout; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewPager; import android.support.v4.view.animation.FastOutSlowInInterpolator; @@ -152,7 +153,6 @@ public class VideoDetailFragment private View videoTitleRoot; private TextView videoTitleTextView; - @Nullable private ImageView videoTitleToggleArrow; private TextView videoCountView; @@ -184,6 +184,7 @@ public class VideoDetailFragment private ViewPager viewPager; private TabAdaptor pageAdapter; private TabLayout tabLayout; + private FrameLayout relatedStreamsLayout; /*////////////////////////////////////////////////////////////////////////*/ @@ -419,16 +420,14 @@ public class VideoDetailFragment } private void toggleTitleAndDescription() { - if (videoTitleToggleArrow != null) { //it is null for tablets - if (videoDescriptionRootLayout.getVisibility() == View.VISIBLE) { - videoTitleTextView.setMaxLines(1); - videoDescriptionRootLayout.setVisibility(View.GONE); - videoTitleToggleArrow.setImageResource(R.drawable.arrow_down); - } else { - videoTitleTextView.setMaxLines(10); - videoDescriptionRootLayout.setVisibility(View.VISIBLE); - videoTitleToggleArrow.setImageResource(R.drawable.arrow_up); - } + if (videoDescriptionRootLayout.getVisibility() == View.VISIBLE) { + videoTitleTextView.setMaxLines(1); + videoDescriptionRootLayout.setVisibility(View.GONE); + videoTitleToggleArrow.setImageResource(R.drawable.arrow_down); + } else { + videoTitleTextView.setMaxLines(10); + videoDescriptionRootLayout.setVisibility(View.VISIBLE); + videoTitleToggleArrow.setImageResource(R.drawable.arrow_up); } } @@ -483,6 +482,8 @@ public class VideoDetailFragment tabLayout = rootView.findViewById(R.id.tablayout); tabLayout.setupWithViewPager(viewPager); + relatedStreamsLayout = rootView.findViewById(R.id.relatedStreamsLayout); + setHeightThumbnail(); @@ -809,7 +810,7 @@ public class VideoDetailFragment pageAdapter.addFragment(CommentsFragment.getInstance(serviceId, url, name), COMMENTS_TAB_TAG); } - if(showRelatedStreams){ + if(showRelatedStreams && null == relatedStreamsLayout){ //temp empty fragment. will be updated in handleResult pageAdapter.addFragment(new Fragment(), RELATED_TAB_TAG); } @@ -1033,14 +1034,18 @@ public class VideoDetailFragment animateView(videoTitleTextView, true, 0); videoDescriptionRootLayout.setVisibility(View.GONE); - if (videoTitleToggleArrow != null) { //phone - videoTitleToggleArrow.setImageResource(R.drawable.arrow_down); - videoTitleToggleArrow.setVisibility(View.GONE); - } else { //tablet - //TODO make comments/related streams fragment invisible - } + videoTitleToggleArrow.setImageResource(R.drawable.arrow_down); + videoTitleToggleArrow.setVisibility(View.GONE); videoTitleRoot.setClickable(false); + if(relatedStreamsLayout != null){ + if(showRelatedStreams){ + relatedStreamsLayout.setVisibility(View.INVISIBLE); + }else{ + relatedStreamsLayout.setVisibility(View.GONE); + } + } + imageLoader.cancelDisplayTask(thumbnailImageView); imageLoader.cancelDisplayTask(uploaderThumb); thumbnailImageView.setImageBitmap(null); @@ -1054,8 +1059,15 @@ public class VideoDetailFragment setInitialData(info.getServiceId(), info.getOriginalUrl(), info.getName()); if(showRelatedStreams){ - pageAdapter.updateItem(RELATED_TAB_TAG, RelatedVideosFragment.getInstance(currentInfo)); - pageAdapter.notifyDataSetUpdate(); + if(null == relatedStreamsLayout){ //phone + pageAdapter.updateItem(RELATED_TAB_TAG, RelatedVideosFragment.getInstance(currentInfo)); + pageAdapter.notifyDataSetUpdate(); + }else{ //tablet + getChildFragmentManager().beginTransaction() + .replace(R.id.relatedStreamsLayout, RelatedVideosFragment.getInstance(currentInfo)) + .commitNow(); + relatedStreamsLayout.setVisibility(View.VISIBLE); + } } pushToStack(serviceId, url, name); @@ -1120,14 +1132,10 @@ public class VideoDetailFragment } videoDescriptionView.setVisibility(View.GONE); - if (videoTitleToggleArrow != null) { - videoTitleRoot.setClickable(true); - videoTitleToggleArrow.setVisibility(View.VISIBLE); - videoTitleToggleArrow.setImageResource(R.drawable.arrow_down); - videoDescriptionRootLayout.setVisibility(View.GONE); - } else { - videoDescriptionRootLayout.setVisibility(View.VISIBLE); - } + videoTitleRoot.setClickable(true); + videoTitleToggleArrow.setVisibility(View.VISIBLE); + videoTitleToggleArrow.setImageResource(R.drawable.arrow_down); + videoDescriptionRootLayout.setVisibility(View.GONE); if (!TextUtils.isEmpty(info.getUploadDate())) { videoUploadDateView.setText(Localization.localizeDate(activity, info.getUploadDate())); } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java index e7778c905..21d01be16 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java @@ -184,4 +184,9 @@ public class CommentsFragment extends BaseListInfoFragment { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { return; } + + @Override + protected boolean isGridLayout() { + return false; + } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java index 694731c69..5675bb81b 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java @@ -193,4 +193,9 @@ public class RelatedVideosFragment extends BaseListInfoFragment - + android:layout_height="match_parent" + android:layout_weight="5" + android:fitsSystemWindows="true"> - - + android:fitsSystemWindows="true" + app:elevation="0dp" + app:layout_behavior="android.support.design.widget.FlingBehavior"> - - + app:layout_scrollFlags="scroll"> - + + android:background="@android:color/black" + android:clickable="true" + android:focusable="true" + android:foreground="?attr/selectableItemBackground" + app:layout_collapseMode="parallax"> - + - + - - + + + + + + + android:layout_height="wrap_content" + android:background="?android:windowBackground" + app:layout_scrollFlags="scroll"> @@ -126,6 +140,15 @@ tools:ignore="RtlHardcoded" tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed a ultricies ex. Integer sit amet sodales risus. Duis non mi et urna pretium bibendum. Nunc eleifend est quis ipsum porttitor egestas. Sed facilisis, nisl quis eleifend pellentesque, orci metus egestas dolor, at accumsan eros metus quis libero." /> + + @@ -209,17 +232,17 @@ tools:text="Uploader" /> + android:id="@+id/detail_uploader_subscribe" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical|right" + android:layout_marginRight="12dp" + android:text="@string/rss_button_title" + android:textSize="12sp" + android:theme="@style/RedButton" + android:drawableLeft="@drawable/ic_rss_feed_white_24dp" + tools:ignore="RtlHardcoded" + android:visibility="gone"/>--> @@ -401,7 +424,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" - android:orientation="vertical"> + android:orientation="vertical" + android:visibility="gone" + tools:visibility="visible"> + - - + - + + + + + + + + + - - - - - - - - - - + From 36e91ea155be54fc42cc77c5c9bcf6c765c23362 Mon Sep 17 00:00:00 2001 From: Eduardo Caron Date: Sun, 9 Dec 2018 10:58:47 +0000 Subject: [PATCH 116/207] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-pt-rBR/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 8f644cdc9..badad7875 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -106,7 +106,7 @@ Reproduzir Reproduzir com Kodi Buscar - Exibir opção para reproduzir vídeo pelo Kodi + Exibir uma opção para reproduzir o vídeo via centro de mídia Kodi Usar reprodutor de áudio externo Usar reprodutor de vídeo externo (Experimental) Forçar o download de conteúdo através do Tor para maior privacidade (streaming de vídeos ainda não suportado). From ab94bc18dcdc78f539d5db60653d909d1a5e8b4a Mon Sep 17 00:00:00 2001 From: AB Date: Sun, 9 Dec 2018 11:14:26 +0000 Subject: [PATCH 117/207] Translated using Weblate (Ukrainian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-uk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 3c316a683..b4a4be313 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -197,7 +197,7 @@ Відновлююсь після помилки програвача Помилкова URL Відеостримів не знайдено - Не знайдено аудіо потоків + Не знайдено аудіопотоків Звіт користувача Без підписників From e7a26b436df24a7d44b9c375741232932f7bfd37 Mon Sep 17 00:00:00 2001 From: srkrishna Date: Mon, 10 Dec 2018 12:49:07 +0000 Subject: [PATCH 118/207] Translated using Weblate (Tamil) Currently translated at 32.9% (126 of 383 strings) --- app/src/main/res/values-ta/strings.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index f22f13341..ccf4c1b35 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -130,4 +130,11 @@ தேடும்போது பரிந்துரைகளை கான்பி "தொலைபேசி அழைப்பு போன்ற குறுக்கீடுகளுக்கு பிறகு தொடரவும் " \'அடுத்து\' மற்றும் \'ஒப்பான\' காணொளிகலை காண்பி + தேடப்பட்ட வாக்கியத்தை அமைவிடத்தில் சேமிக்கவும் + ஆதரிக்கப்படாத URL + இயல்புநிலை தகவல்களின் நாடு + தகவல்களின் இயல்பு மொழி + பிழைதிருத்து + உள்ளடக்கம் + வயது வரம்புக்கு உட்பட்டது From 003855a94c535149f9ff5a37b160f181e7165832 Mon Sep 17 00:00:00 2001 From: sXp Date: Sat, 15 Dec 2018 06:15:56 +0000 Subject: [PATCH 119/207] Translated using Weblate (Hindi) Currently translated at 85.4% (327 of 383 strings) --- app/src/main/res/values-hi/strings.xml | 44 +++++++++++++------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 927b577e3..a01424dbb 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -1,4 +1,4 @@ - + %1$s दृश्य %1$s को प्रकाशित @@ -12,7 +12,7 @@ सेटिंग्स ब्राउज़र चुनें स्क्रीन रोटेशन - NewPipe पॉपअप मोड + नयूपाइप पॉपअप मोड सदस्य बनें सदस्यता ली चैनल सदस्यता रद्द करी गयी @@ -29,7 +29,7 @@ डाउनलोड अगला वीडियो और ऑडियो - इतिहास और कैच + इतिहास और कैश भंडार बैकग्राउंड में चल रहा है कोई दर्शक नहीं कोई वीडियो नहीं है @@ -48,7 +48,7 @@ इतिहास खोजा जा चूका है विडियो जो देख लिए गए है - इतिहास disable है + इतिहास बंद है इतिहास इतिहास खाली है इतिहास साफ़ हो चुकी है @@ -72,8 +72,8 @@ डाउनलोड किए गए विडियो फाइल को रखने की जगह वीडियो के लिए डाउनलोड पथ दर्ज करें - ऑडियो फाइल डाउनलोड करने की जगह - डाउनलोड किये गए ऑडियो फाइल की जगह + ऑडियो डाउनलोड फ़ोल्डर + डाउनलोड किये गए ऑडियो यहाँ है ऑडियो फाइल डाउनलोड करने के लिए जगह दर्ज करें अन्य अप्प के द्वारा NewPipe के आह्वान पर वीडियो तुरंत चले @@ -103,9 +103,9 @@ जब फोकस मिले तो विडियो resume हो रूकावट आने पर भी विडियो को जारी रखे (जैसे - फ़ोन कॉल आये) \'अगला\' और \'पहले समान\' वीडियो दिखाए - \"संलग्न करने के लिए पकड़ें रहे\" दिखाए + \"जोड़ने के लिए पकड़ें रहे\" दिखाए जब बैकग्राउंड और पॉपअप बटन विडियो के विवरण पन्ने में दबाई जाए तो tip को दिखाए - ये वाला URL इसमें नहीं चलेगा + यह लिंक इसमें नहीं खुलेगा डिफ़ॉल्ट विषय की भाषा प्लेयर चाल चलन @@ -117,7 +117,7 @@ पॉपअप प्लेयर की कतार पर चलाये विषयवस्तु - उम्र प्रतिबंदित से सम्बंधित विषयवस्तु दिखाये (जैसे - हिंसात्मक,कामोतोजनक) + उम्र प्रतिबंधित विषय वस्तु उम्र प्रतिबंदित विडियो है .इस प्रकार की विषयवस्तु को अनुमति देने के लिए Setting से संभव है | सीधा प्रसारण डाउनलोड @@ -148,10 +148,10 @@ विडियो के URL signature को decrypt नहीं कर सकते इस website का निरंक्षण नहीं कर सकते website का पूरी तरह से निरंक्षण नहीं हो सकता - विषयवस्तु उपलब्ध नहीं है + विषय वस्तु उपलब्ध नहीं है GEMA ने block किया है डाउनलोड मेनू को स्थापित नहीं कर सकते - यह सीधा प्रसारण है, जो की अभी पूरी तरह से काम नहीं कर रहा. + "सीधे प्रसारण के लिये फिलहाल समर्थन नहीं है " कोई भी विडियो नहीं मिल रहा फोटो को load नहीं कर सकते APP/UI टूट गया @@ -315,7 +315,7 @@ NewPipe स्वयंसेवकों द्वारा विकसित किया जाता है जो आपको अच्छा अनुभव देने के लिए अपना खाली समय व्यतीत करते हैं। स्वयंसेवको को मदद भेजे, ताकि वह NewPipe को और अच्छा बना सके। वापस दे वेबसाइट - अधिक जानकारी और खबरों के लिए NewPipe की वेबसाइट पर जाएं । + अधिक जानकारी और खबरों के लिए न्यूपाइप की वेबसाइट पर जाएं। क्या आप इस आइटम को वॉच इतिहास से हटाना चाहते हैं? क्या आप वाकई इतिहास से सभी आइटंस हटाना चाहते हैं? पिछला चलाया गया @@ -379,7 +379,7 @@ छायाप्रारुप लोड करें तेजी से अचूक तलाश का प्रयोग करें अचूक खोज प्लेयर को कम परिशुद्धता के साथ तेजी से पदों की तलाश करने की अनुमति देता है - सभी थंबनेल को लोड होने से रोके और डेटा और मेमोरी का उपयोग घटाए। इसे बदलने से मेमोरी और डिस्क की छवि की कैश साफ़ हो जाएगी + बंद होने पे छोटी छवियां नहीं दिखेंगी। इससे डेटा और मेमोरी की बचत होगी। इसे बदलने से मेमोरी और डिस्क की छवि का भंडार भी साफ़ हो जाएगा। छवि कैश मिटा दिया कैश मेटाडेटा वाइप करें सभी कैश किए गए वेबपृष्ठ डेटा हटाएं @@ -398,12 +398,12 @@ देखे हुए का इतिहास साफ कर दिया गया। ढूंढने के इतिहास को साफ करें ढूंढे गए शब्दो का इतिहास साफ करता है - ढूंढने के इतिहास को पूरा साफ करें। + पूरे खोज इतिहास को मिटा दे \? ढूंढने के इतिहास को साफ कर दिया। - अमान्य डाइरेक्टरी + एसी कोई भी फ़ोल्डर मौजूद नहीं है अमान्य फाइल/कॉन्टेंट उदभावस्थान - फाइल मौजूद नही है या उसे पढने या लिखने की पर्याप्त अनुमति नही है - फाइल का नाम खाली नही हो सकता + फ़ाइल मौजूद नहीं है या उसे पढ़ने या लिखने की पर्याप्त अनुमति नही़ं है + फ़ाइल का नाम खाली नहीं हो सकता एक भूल हुई: %1$s डाउनलोड करने के लिए कोई स्ट्रीम उपलब्ध नही है @@ -411,9 +411,9 @@ इस फ़ाइल को चलाने के लिए कोई ऐप स्थापित नही है - NewPipe की गोपनीयता नीति - NewPipe परियोजना आपकी गोपनीयता को बहोत गंभीर रूप से लेता है। इसलिए, ऐप आपकी अनुमति के बिना कोई डेटा जमा नही करता। -\nNewPipe की गोपनीयता नीति विस्तार से समज़ाती है कि कोनसा डेटा भेजा या संग्रह किया जाता है जब आप क्रेश विवरण भेजते है। + न्यूपाइप की गोपनीयता नीति + न्यूपाइप परियोजना आपकी गोपनीयता को बहोत गंभीर रूप से लेता है। इसलिए, ऐप आपकी अनुमति के बिना कोई डेटा जमा नही करता। +\nन्यूपाइप की गोपनीयता नीति विस्तार से समज़ाती है कि कोनसा डेटा भेजा या संग्रह किया जाता है जब आप क्रेश विवरण भेजते है। गोपनीयता नीति पढ़े क्या आप सेटिंग्स भी आयात करना चाहते है? @@ -466,5 +466,5 @@ कोई नही पृष्ठभूमि प्लेयर जैसे मिनिमाइज करे पॉप अप प्लेयर जैसे मिनिमाइज करे - - + न्यूपाइप एक काॅपीलेफ़्ट फ़्री साॅफ़्टवेर है: इसे आप अपनी इच्छा के अनुसार इस्तेमाल, जाँच, बाँट तथा और बेहतर बना सकते है। खास तौर पर आप इसे फ़्री साॅफ़्टवेर फ़ाउंडेशन के द्वारा जारी जीएनयू जनरल पब्लिक लाइसेंस के तीसरे या उसके बाद आने वाले कोई भी वर्णन के शर्तों के मुताबिक फिर से बाँट या बदल सकते हैं। + \ No newline at end of file From 48067e3285f3ee424885500bff1be1976791d497 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Mon, 17 Dec 2018 10:03:04 +0530 Subject: [PATCH 120/207] up next text alignment --- app/src/main/res/layout/related_streams_header.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/res/layout/related_streams_header.xml b/app/src/main/res/layout/related_streams_header.xml index 5be7c928d..b98244b7e 100644 --- a/app/src/main/res/layout/related_streams_header.xml +++ b/app/src/main/res/layout/related_streams_header.xml @@ -11,7 +11,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="12dp" - android:layout_marginTop="5dp" + android:layout_alignBaseline="@+id/autoplay_switch" android:text="@string/next_video_title" android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="12sp" @@ -22,7 +22,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" - android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:paddingRight="5dp" android:switchPadding="5dp" From ceaacc771d45dce82408688d7c5aaf3ea962ef54 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Wed, 19 Dec 2018 10:58:59 +0530 Subject: [PATCH 121/207] removed jerky animations --- .../fragments/detail/VideoDetailFragment.java | 44 +++-------------- .../list/comments/CommentsFragment.java | 47 ------------------- 2 files changed, 6 insertions(+), 85 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 9a0c3b1b0..c8e8a387b 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 @@ -16,10 +16,8 @@ import android.support.annotation.Nullable; import android.support.design.widget.AppBarLayout; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewPager; -import android.support.v4.view.animation.FastOutSlowInInterpolator; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; @@ -767,11 +765,9 @@ public class VideoDetailFragment initTabs(); if (scrollToTop) appBarLayout.setExpanded(true, true); - animateView(contentRootLayoutHiding, - false, 0, 0, () -> { - handleResult(info); - showContentWithAnimation(120, 0, .01f); - }); + handleResult(info); + showContent(); + } protected void prepareAndLoadInfo() { @@ -794,8 +790,8 @@ public class VideoDetailFragment .subscribe((@NonNull StreamInfo result) -> { isLoading.set(false); currentInfo = result; - showContentWithAnimation(120, 0, 0); handleResult(result); + showContent(); }, (@NonNull Throwable throwable) -> { isLoading.set(false); onError(throwable); @@ -960,36 +956,8 @@ public class VideoDetailFragment thumbnailImageView.setMinimumHeight(height); } - private void showContentWithAnimation(long duration, - long delay, - @FloatRange(from = 0.0f, to = 1.0f) float translationPercent) { - int translationY = (int) (getResources().getDisplayMetrics().heightPixels * - (translationPercent > 0.0f ? translationPercent : .06f)); - - contentRootLayoutHiding.animate().setListener(null).cancel(); - contentRootLayoutHiding.setAlpha(0f); - contentRootLayoutHiding.setTranslationY(translationY); + private void showContent() { contentRootLayoutHiding.setVisibility(View.VISIBLE); - contentRootLayoutHiding.animate() - .alpha(1f) - .translationY(0) - .setStartDelay(delay) - .setDuration(duration) - .setInterpolator(new FastOutSlowInInterpolator()) - .start(); - - uploaderRootLayout.animate().setListener(null).cancel(); - uploaderRootLayout.setAlpha(0f); - uploaderRootLayout.setTranslationY(translationY); - uploaderRootLayout.setVisibility(View.VISIBLE); - uploaderRootLayout.animate() - .alpha(1f) - .translationY(0) - .setStartDelay((long) (duration * .5f) + delay) - .setDuration(duration) - .setInterpolator(new FastOutSlowInInterpolator()) - .start(); - } protected void setInitialData(int serviceId, String url, String name) { @@ -1024,7 +992,7 @@ public class VideoDetailFragment public void showLoading() { super.showLoading(); - animateView(contentRootLayoutHiding, false, 200); + contentRootLayoutHiding.setVisibility(View.INVISIBLE); animateView(spinnerToolbar, false, 200); animateView(thumbnailPlayButton, false, 50); animateView(detailDurationView, false, 100); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java index 21d01be16..c930888f2 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java @@ -1,72 +1,25 @@ package org.schabi.newpipe.fragments.list.comments; -import android.app.Activity; import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.v4.content.ContextCompat; -import android.support.v7.app.ActionBar; -import android.text.TextUtils; -import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.jakewharton.rxbinding2.view.RxView; import org.schabi.newpipe.R; -import org.schabi.newpipe.database.subscription.SubscriptionEntity; -import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.comments.CommentsInfo; -import org.schabi.newpipe.extractor.exceptions.ExtractionException; -import org.schabi.newpipe.extractor.stream.StreamInfoItem; -import org.schabi.newpipe.fragments.detail.VideoDetailFragment; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; -import org.schabi.newpipe.info_list.InfoItemDialog; -import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; -import org.schabi.newpipe.local.subscription.SubscriptionService; -import org.schabi.newpipe.player.playqueue.ChannelPlayQueue; -import org.schabi.newpipe.player.playqueue.PlayQueue; -import org.schabi.newpipe.player.playqueue.SinglePlayQueue; import org.schabi.newpipe.report.UserAction; -import org.schabi.newpipe.util.AnimationUtils; import org.schabi.newpipe.util.ExtractorHelper; -import org.schabi.newpipe.util.ImageDisplayConstants; -import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.NavigationHelper; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import io.reactivex.Observable; import io.reactivex.Single; -import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.disposables.Disposable; -import io.reactivex.functions.Action; -import io.reactivex.functions.Consumer; -import io.reactivex.functions.Function; -import io.reactivex.schedulers.Schedulers; - -import static org.schabi.newpipe.util.AnimationUtils.animateBackgroundColor; -import static org.schabi.newpipe.util.AnimationUtils.animateTextColor; -import static org.schabi.newpipe.util.AnimationUtils.animateView; public class CommentsFragment extends BaseListInfoFragment { From 2076b8f1d70e67cdf2b77b71e0fd7abf3f8ee453 Mon Sep 17 00:00:00 2001 From: Ben De Meester Date: Tue, 18 Dec 2018 12:43:16 +0000 Subject: [PATCH 122/207] Translated using Weblate (Dutch) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-nl/strings.xml | 74 +++++++++++++------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 96f849138..6339d3ea5 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1,4 +1,4 @@ - + %1$s keer bekeken Gepubliceerd op %1$s @@ -27,9 +27,9 @@ WebM — vrij formaat M4A — betere kwaliteit Downloaden - Volgende video + Volgende URL wordt niet ondersteund - ‘volgende’ en ‘vergelijkbare’ video’s tonen + Toon ‘Volgende’ en ‘Vergelijkbare’ video’s Standaard inhoudstaal Externe videospeler gebruiken Externe audiospeler gebruiken @@ -39,8 +39,8 @@ Videovoorbeeldminiatuur Gebruikersafbeelding van uploader Vind-ik-niet-leuks - Downloadlocatie voor audio - Locatie om gedownloade muziek in op te slaan + Downloadfolder voor audio + Gedownloade muziek is hier opgeslagen Voer downloadlocatie voor audiobestanden in Thema @@ -52,8 +52,8 @@ Speelt af op achtergrond Afspelen Inhoud - Inhoud met leeftijdsbeperking tonen - De video heeft een leeftijdsbeperking. Toestaan van dit soort video\'s kan worden ingeschakeld in de instellingen. + Inhoud met leeftijdsbeperking + Toon video met leeftijdsbeperking. Toestaan van dit soort video\'s kan worden ingeschakeld in \"Instellingen\". Fout Netwerkfout @@ -63,7 +63,7 @@ Inhoud niet beschikbaar Geblokkeerd door GEMA Kan downloadmenu niet instellen - Dit is een LIVESTREAM; deze worden nog niet ondersteund. + Livestreams zijn nog niet ondersteund Vind-ik-leuks @@ -90,7 +90,7 @@ Druk op zoeken om te beginnen Automatisch afspelen Speelt video’s af als NewPipe vanuit een andere app wordt geopend - live + LIVE Downloads Downloads Foutrapport @@ -170,7 +170,7 @@ Pop-up Bezig met wijzigen van grootte - Sommige resoluties hebben GEEN geluid hebben als deze optie is ingeschakeld + Verwijdert geluid bij SOMMIGE resoluties Zoeksuggesties Toon suggesties bij zoeken @@ -261,7 +261,7 @@ Item verwijderd Wil je dit item verwijderen uit je zoekgeschiedenis? -Tip tonen voor ingedrukt houden om toe te voegen +Toon tip \"Ingedrukt houden om toe te voegen\" Toon tip als achtergrond- of pop-upknop wordt ingedrukt op de videogegevenspagina Toegevoegd aan wachtrij voor achtergrondspeler Toegevoegd aan wachtrij voor pop-upspeler @@ -293,11 +293,11 @@ Houd ingedrukt om toe te voegen aan wachtrij [Onbekend] - Toevoegen aan wachtrij in achtergrond - Toevoegen aan wachtrij in pop-up + Toevoegen aan wachtrij wanneer in de achtergrond + Toevoegen aan wachtrij bij nieuwe pop-up Begin hier met afspelen - Begin hier met afspelen op achtergrond - Begin hier met afspelen in pop-up + Begin hier met afspelen wanneer op de achtergrond + Begin hier met afspelen in nieuwe pop-up Doneren NewPipe wordt door vrijwilligers in hun vrije tijd ontwikkeld om jou de beste ervaring te brengen. Geef wat terug zodat onze ontwikkelaars NewPipe nóg beter kunnen maken terwijl ze van hun kopje koffie genieten. Teruggeven @@ -312,7 +312,7 @@ Menu openen Menu sluiten - Geen speler met streamondersteuning gevonden (je kan VLC installeren om af te spelen) + Geen speler met streamondersteuning gevonden (je kan VLC installeren om af te spelen). Altijd Eenmalig @@ -332,16 +332,16 @@ Databank exporteren Dit overschrijft je huidige geschiedenis en abonnementen Exporteer geschiedenis, abonnementen en afspeellijsten - Exporteren voltooid - Importeren voltooid + Geëxporteerd + Geïmporteerd Geen geldig ZIP-bestand Let op: niet alle bestanden konden worden geïmporteerd. Dit overschrijft je huidige configuratie. - Streambestand downloaden. + Streambestand downloaden Informatie tonen - Bladwijzers + Bijgehouden afspeellijsten Toevoegen aan @@ -360,9 +360,9 @@ Altijd vragen - Nieuwe afspeellijst creëren - Afspeellijst verwijderen - Afspeellijstnaam wijzigen + Nieuwe afspeellijst + Verwijder + Wijzig naam Naam Toevoegen aan afspeellijst Instellen als miniatuur voor afspeellijst @@ -370,11 +370,11 @@ Afspeellijst toevoegen aan bladwijzers Bladwijzer verwijderen - Wil je deze afspeellijst verwijderen? + Deze afspeellijst verwijderen\? Afspeellijst gecreëerd Toegevoegd aan afspeellijst - Miniatuur voor afspeellijst gewijzigd - De afspeellijst kan niet worden verwijderd + Miniatuur voor afspeellijst gewijzigd. + De afspeellijst kan niet worden verwijderd. Geen bijschriften @@ -393,24 +393,24 @@ LeakCanary inschakelen Het monitoren van geheugenlekken kan ervoor zorgen dat de app niet goed meer reageert - Out-of-Lifecycle-fouten melden + Out-of-lifecycle-fouten melden Forceer het melden van niet-bezorgbare Rx-uitzonderingen buiten fragment of activiteitscyclus Snelle, minder exact spoelen gebruiken Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie Volgende stream automatisch in wachtrij plaatsen - Automatisch een gerelateerde stream toekennen bij het afspelen van de laatste stream in een niet-herhalende afspeelwachtlijst + Automatisch een gerelateerde stream toekennen bij het afspelen van de laatste stream in een niet-herhalende afspeelwachtlijst. SYNCHRONISEREN Bestand - Ongeldige map - Ongeldig bestand/Ongeldige inhoudsbron + Deze map bestaat niet + Bestand/Inhoudsbron bestaat niet Het bestand bestaat niet of je bent onvoldoende gemachtigd om het te lezen/er naar te schrijven De bestandsnaam mag niet blanco zijn Er is een fout opgetreden: %1$s - Importeren/Exporteren + Importeren/exporteren Importeren Importeren uit Exporteren naar @@ -441,7 +441,7 @@ \n \nWil je doorgaan? Miniatuurvoorbeelden laden - Schakel dit uit om alle miniatuurvoorbeelden niet meer te laden; dit bespaart gegevens en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache + Er worden geen miniatuurvoorbeelden geladen wanneer dit uit staat; dit bespaart mobiele data en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache. Afbeeldingscache gewist Gecachete metagegevens wissen Alle gecachete webpagina-gegevens wissen @@ -458,17 +458,17 @@ Geen streams beschikbaar voor downloaden Bijschriften - Bijschriftgrootte en -achtergrondstijlen wijzigen. Vereist een herstart van de app + Bijschriftgrootte en -achtergrondstijlen wijzigen. Vereist een herstart van de app. Er is geen app geïnstalleerd die dit bestand kan afspelen Kijkgeschiedenis wissen Verwijdert de geschiedenis van afgespeelde streams - Verwijdert de gehele kijkgeschiedenis. + Verwijder de gehele kijkgeschiedenis\? Kijkgeschiedenis gewist. Zoekgeschiedenis wissen Verwijdert de gebruikte zoektermen - Verwijdert de gehele geschiedenis. + Verwijder de gehele geschiedenis\? Zoekgeschiedenis gewist. 1 item verwijderd. @@ -485,7 +485,7 @@ Weigeren Ongelimiteerd Resolutie beperken bij gebruik van mobiele gegevens - Minimaliseren bij overschakelen naar andere app + Minimaliseer bij overschakelen naar andere app Actie bij overschakelen van videospeler naar andere app — %s Geen Afspelen op achtergrond @@ -499,4 +499,4 @@ Afspeellijsten Nummers Gebruikers - + \ No newline at end of file From bcf6f605717a186b10b6088cd2f622f3c5df1fc9 Mon Sep 17 00:00:00 2001 From: Ben De Meester Date: Tue, 18 Dec 2018 12:58:54 +0000 Subject: [PATCH 123/207] Translated using Weblate (Flemish) Currently translated at 85.4% (327 of 383 strings) --- app/src/main/res/values-nl-rBE/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 96d0cdb91..a3a7a4f5c 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -1,24 +1,24 @@ - + Tik op zoeken voor te beginnen %1$s keer bekeken Gepubliceerd op %1$s Gene speler met streamondersteuning gevonden. Wilt ge VLC installeren? - Gene speler met streamondersteuning gevonden (ge kunt VLC installeren voor het af te spelen) + Gene speler met streamondersteuning gevonden (ge kunt VLC installeren voor af te spelen). Installeren Annuleren In browser openen Openen in pop-upmodus Delen Downloaden - Streambestand downloaden. + Streambestand downloaden Zoeken Instellingen - Bedoelde ge: %1$s ? + Bedoelde ge: %1$s\? Delen met Kies nen browser rotatie Externe videospeler gebruiken - Sommige resoluties zullen geen geluid hebben als deze optie is ingeschakeld + Verwijdert het geluid bij SOMMIGE resoluties Externen audiospeler gebruiken NewPipe-pop-upmodus Abonneer @@ -462,4 +462,4 @@ Afspeellijsten Nummers Gebruikers - + \ No newline at end of file From 25eb93fae001cddb5fa2dd72f7ecef5163db5cca Mon Sep 17 00:00:00 2001 From: srkrishna Date: Tue, 18 Dec 2018 04:38:08 +0000 Subject: [PATCH 124/207] Translated using Weblate (Tamil) Currently translated at 37.1% (142 of 383 strings) --- app/src/main/res/values-ta/strings.xml | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index ccf4c1b35..da85073eb 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -1,4 +1,4 @@ - + தொடங்குவதற்கு தேடல் பொத்தானை அழுத்தவும் "%1$s பார்வைகள்" @@ -137,4 +137,20 @@ பிழைதிருத்து உள்ளடக்கம் வயது வரம்புக்கு உட்பட்டது - + அடுத்த தாரையில் தானாக சேர் + "பின்னணி இயக்கியின் வரிசையில் சேர்க்கப்பட்டது " + அமைப்புகள் மூலம் வயது வரையறுக்கப்பட்ட வீடியோக்கலை காணலாம். + பிழை அறிக்கை + சேனல் + சேனல்கள் + செயலிழக்கச் செய்யப்பட்டுள்ளது + வடிகட்டு + புதுப்பி + மறுஅளவாக்கம் + முந்தய நிலைக்குச் செல் + அனைத்தையும் இயக்கு + NewPipe அறிவிப்புகள் + [அறியப்படவில்லை] + நோக்குநிலை மாற்று + பின்னனிக்கு மாறு + \ No newline at end of file From 450072bd23e3ea429a529e0b01b447db73ee45c4 Mon Sep 17 00:00:00 2001 From: srkrishna Date: Thu, 20 Dec 2018 19:37:11 +0000 Subject: [PATCH 125/207] Translated using Weblate (Tamil) Currently translated at 39.4% (151 of 383 strings) --- app/src/main/res/values-ta/strings.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index da85073eb..68f31c63b 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -153,4 +153,13 @@ [அறியப்படவில்லை] நோக்குநிலை மாற்று பின்னனிக்கு மாறு + \"சேர்ப்பதர்க்கு அழுத்தவும்\" அறிவிப்பை காண்பி + தகவல்கலை இறக்குமதி செய் + தகவல்கலை ஏற்றுமதி செய் + "தற்போதைய வரலாறு மற்றும் சந்தாக்கள் பதிலாக சேர்க்கப்படும் " + வரலாறு, சந்தாக்கள் மற்றும் பட்டியல்கலை ஏற்றுமதி செய் + பார்த்த அனைத்து வரலாற்றயும் அழிக்கவா\? + தேடப்பட்ட வார்த்தைகளின் வரலாற்றை அழி + அனைத்து வரலாற்றயும் அழிக்கவா\? + பிழை \ No newline at end of file From 38641d4edf164e611a3396c45aa1719598f6ac5b Mon Sep 17 00:00:00 2001 From: Yehuda Levy Date: Fri, 21 Dec 2018 23:53:38 +0000 Subject: [PATCH 126/207] Translated using Weblate (Hebrew) Currently translated at 88.5% (339 of 383 strings) --- app/src/main/res/values-he/strings.xml | 65 ++++++++++++++++---------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index cc9518332..c3c232f94 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -1,4 +1,4 @@ - + לחץ \"חפש\" כדי להתחיל %1$s צפיות @@ -27,8 +27,8 @@ נתיב לשמירת סרטונים הכנס נתיב לשמירת סרטונים - נתיב לשמירת שמע - נתיב לשמירת שמע + תיקיית הורדות שמע + הורדות שמע נשמרות כאן הכנס נתיב לשמירת קבצי שמע נגן אוטומטית @@ -40,7 +40,7 @@ נגן ב-Kodi האפליקציה Kore לא נמצאה. להתקין אותה? הצג את האפשרות לניגון עם Kodi - הראה אפשרות לנגן סרטון דרך \"Kodi media center\" + הצג אפשרות לנגן סרטון דרך Kodi שמע תבנית ברירת המחדל לשמע תבנית סרט ברירת מחדל @@ -58,7 +58,7 @@ הצג הצעות כשמחפשים הורד - הסרטון הבא + הבא הראה את הסרטונים הבאים וסרטונים דומים כתובת URL לא נתמכת שפת התוכן המועדפת @@ -70,8 +70,8 @@ מנגן במצב חלון צץ נגן תוכן - הראה תוכן בעל הגבלת גיל - לסרטון קיימת הגבלת גיל. ניתן לאפשר צפייה בסרטונים אלו ע\"י שינוי ממסך ההגדרות. + תוכן בעל הגבלת גיל + הצג סרטון עם הגבלת גיל. ניתן לאפשר צפייה בסרטונים אלו ע\"י שינוי ממסך ההגדרות. חי הורדות הורדות @@ -95,7 +95,7 @@ תוכן אינו זמין חסום ע\"י GEMA לא הייתה אפשרות להכין את תפריט ההורדות - זהו שידור ישיר. שידורים ישירים עדיין לא נתמכים. + שידורים ישירים עדיין לא נתמכים לא הייתה אפשרות להזרים סרטון לא הייתה אפשרות לטעון את התמונה האפליקציה או ממשק המשתמש קרסו @@ -109,7 +109,7 @@ הירשם כמנוי רשום כמנוי ביטול מנוי לערוץ - אין אפשרות לשנות מנוי + לא הצלחתי לשנות מנוי אין אפשרות לעדכן מנוי ראשי @@ -127,7 +127,7 @@ הצג עצה כאשר כפתור רקע או חלון צץ נלחץ במסך נגן הסרטים נגן התנהגות - היסטוריה ומטמון + היסטוריה וזיכרון מטמון נוסף לתור של הנגן ברקע נוסף לתור של הנגן הצץ רשימת ניגון @@ -140,7 +140,7 @@ [לא ידוע] - נכשל בניגון הסרט הנוכחי + לא הצלחתי לנגן את הסרט הזה תקלה בלתי ניתנת לשחזור אירעה בנגן מחלים מתקלה שאירעה לנגן @@ -192,10 +192,10 @@ אין סרטונים - סרטון אחד - שני סרטונים - %s סרטונים - %s סרטונים + סרטון אחד + שני סרטונים + מספר סרטונים + %s סרטונים התחל @@ -243,7 +243,7 @@ אודות תורמים רישיונות - נגן קל וחופשי לYouTube עבור אנדרואיד. + נגן קל וחופשי להזרמת מדיה עבור אנדרואיד. תורם בכל עת שיש לך רעיון ל: תרגום, עיצוב מחדש, ניקוי קוד, או תיקוני קוד משמעותיים—עזרה תמיד תתקבל בברכה. ככל שיותר מבוצע זה נעשה טוב יותר! הצג ב-GitHub @@ -294,7 +294,7 @@ הורד קובץ הזרמה הצג מידע - סימניות + רשימות השמעה מסומנות הוספה אל @@ -316,7 +316,7 @@ מטמון התמונות נוקה נקה מטמון מטא-דאטה מטמון המטא-דאטא נוקה - יצא היסטוריה, רישומים ורשימות השמעה. + יצא היסטוריה, רישומים ורשימות השמעה ניקוי היסטוריית הצפייה היסטוריית הצפייה נמחקה. ניקוי היסטוריית החיפוש @@ -391,13 +391,13 @@ טען תמונות ממוזערות "השבת כדי לעצור את טעינת כל התמונות הממוזערות וחסוך בשימוש בנתונים ובזכרון. השינוי ימחק את המטמון בזכרון ובדיסק. " הסר את כל נתוני העמודים במטמון - אוטומטית הכנס לתור את ההזרמה הבאה - "אוטומטית הוסף הזרמה קשורה כאשר ההזרמה האחרונה לא נמצאת במצב הזרמה חוזרת של התור. " + הכנס את ההזרמה הבאה לתור באופן אוטומטי + אוטומטית הוסף הזרמה קשורה כאשר ההזרמה האחרונה לא נמצאת במצב הזרמה חוזרת של התור. כפתור כיוון החלף לראשי - פעולה זו תדרוס את ההיסטוריה ורשימת המנויים הקיימת. - "מחק הסטוריה של ניגונים קודמים. " + דריסת ההיסטוריה ורשימת המנויים הקיימת + מחק הסטוריה של ניגונים קודמים ערוצים רשימות השמעה שירים @@ -427,7 +427,7 @@ פתח מגירה סגור מגירה - משהו יופיע כאן בקרוב D; + משהו יופיע כאן בקרוב ;D פעולת \'פתח\' מועדפת @@ -445,5 +445,20 @@ אפשר LeakCanary מעקב אחר זליגת זיכרון יכולה לגרום לאפליקציה להיות בלתי זמינה בזמן העתקת תוכן הזכרון לקובץ - - + yourID, soundcloud.com/yourid + קחו בחשבון שהפעולה הזו יכולה לגזול הרבה משאבי רשת. +\n +\nהאם להמשיך\? + נתק קישור (עלול ליצור עיוות) + האץ קדימה כאשר שקט + צעד + אפס + קבל + דחה + ללא מגבלה + הקטן בעת מעבר אפליקציה + הפעולה שיש לבצע בעת מעבר לאפליקציה אחרת מנגן הוידיאו הראשי — %s + כלום + הקטן לנגן הפועל ברקע + הקטן לנגן פופאפ (חלונית) + \ No newline at end of file From 990c220fa07bd328e28143dbee4138678392fbf2 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Sun, 23 Dec 2018 09:44:42 +0530 Subject: [PATCH 127/207] updated extractor --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b34970907..c340595e1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,7 +54,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.yausername:NewPipeExtractor:4c49a34' + implementation 'com.github.yausername:NewPipeExtractor:c77050d' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' From c9b938ae55473af6aa5749bef5e77d97672531e6 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Tue, 25 Dec 2018 15:36:15 +0530 Subject: [PATCH 128/207] readded animations --- .../fragments/detail/VideoDetailFragment.java | 3 ++- .../list/comments/CommentsFragment.java | 4 ++++ .../list/videos/RelatedVideosFragment.java | 7 +++++++ .../schabi/newpipe/util/AnimationUtils.java | 21 +++++++++++++++++++ 4 files changed, 34 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 7a821f548..c007789e5 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 @@ -75,6 +75,7 @@ import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.util.AnimationUtils; import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.ImageDisplayConstants; @@ -956,7 +957,7 @@ public class VideoDetailFragment } private void showContent() { - contentRootLayoutHiding.setVisibility(View.VISIBLE); + AnimationUtils.slideUp(contentRootLayoutHiding,120, 96, 0.06f); } protected void setInitialData(int serviceId, String url, String name) { diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java index c930888f2..956e6c1c8 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java @@ -16,6 +16,7 @@ import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.comments.CommentsInfo; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.util.AnimationUtils; import org.schabi.newpipe.util.ExtractorHelper; import io.reactivex.Single; @@ -92,6 +93,8 @@ public class CommentsFragment extends BaseListInfoFragment { public void handleResult(@NonNull CommentsInfo result) { super.handleResult(result); + AnimationUtils.slideUp(getView(),120, 96, 0.06f); + if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.REQUESTED_COMMENTS, NewPipe.getNameOfService(result.getServiceId()), result.getUrl(), 0); } @@ -120,6 +123,7 @@ public class CommentsFragment extends BaseListInfoFragment { protected boolean onError(Throwable exception) { if (super.onError(exception)) return true; + hideLoading(); showSnackBarError(exception, UserAction.REQUESTED_COMMENTS, NewPipe.getNameOfService(serviceId), url, R.string.error_unable_to_load_comments); return true; } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java index 5675bb81b..c8fc2197a 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java @@ -20,6 +20,7 @@ import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.util.AnimationUtils; import org.schabi.newpipe.util.RelatedStreamInfo; import java.io.Serializable; @@ -110,12 +111,17 @@ public class RelatedVideosFragment extends BaseListInfoFragment Date: Tue, 25 Dec 2018 19:59:03 +0530 Subject: [PATCH 129/207] fixed NPE in soundcloud --- .../newpipe/fragments/list/videos/RelatedVideosFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java index c8fc2197a..702e0e3fb 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java @@ -111,7 +111,7 @@ public class RelatedVideosFragment extends BaseListInfoFragment Date: Tue, 25 Dec 2018 20:17:56 +0530 Subject: [PATCH 130/207] more NPE fix --- .../newpipe/fragments/list/videos/RelatedVideosFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java index 702e0e3fb..69a59c2f1 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java @@ -198,7 +198,7 @@ public class RelatedVideosFragment extends BaseListInfoFragment Date: Thu, 27 Dec 2018 02:45:26 +0000 Subject: [PATCH 131/207] Translated using Weblate (French) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-fr/strings.xml | 32 +++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 77d77fe3f..2c39010c0 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,4 +1,4 @@ - + Annuler Choisir un navigateur @@ -73,7 +73,7 @@ Impossible de déchiffrer la signature URL de la vidéo Impossible d\'analyser complètement le site web Les flux en direct ne sont pas encore pris en charge - Désolé, une erreur inattendue s\'est produite. + Désolé, une erreur s’est produite. Lire la vidéo lorsque NewPipe est appelée par une autre application Signaler l\'erreur par e-mail Information : @@ -384,7 +384,7 @@ Recherche rapide approximative Permettre au lecteur d\'accéder plus rapidement à une position au détriment de la précision Charger les miniatures - Désactiver pour arrêter le chargement de toutes les miniatures et sauvegarder les données et l\'utilisation de la mémoire. Modifier cela effacera à la fois le cache d\'image en mémoire et sur disque + Désactiver le chargement des miniatures afin de réduire l’utilisation de la bande passante et de la mémoire. Modifier cette option vide le cache d’images en mémoire vive et sur le disque. Images en cache effacées Effacer les données en cache Effacer toutes les pages web mises en cache @@ -393,7 +393,7 @@ Aucun dossier de ce type Aucun fichier/contenu de ce type - Le fichier n\'existe pas ou il n\'est pas permis de le lire + Le fichier n’existe pas ou n’est pas accessible en lecture/écriture Le nom du fichier ne peut être vide Une erreur s\'est produite: %1$s @@ -432,12 +432,12 @@ \n1. Suivez ce lien : %1$s \n2. Connectez-vous à votre compte lorsque ce sera demandé \n3. Un téléchargement va démarrer (ce sera celui du fichier nécessaire à l\'importation des abonnements)" - Importez un profil SoundCloud avec l\'URL de votre profil ou votre identifiant (id) : -\n -\n1. Activer le \"mode bureau\" dans votre navigateur (le site n\'est pas accessible en mode mobile) -\n2. Suivez cette URL : %1$s -\n3. Connectez-vous à votre compte -\n4. Copier l\'URL vers lequel vous venez d\'être redirigé (qui est l\'URL de votre profil). + Importez un profil SoundCloud en saisissant l’URL de votre profil ou votre identifiant (ID). +\n +\n1. Activer le « mode bureau » dans votre navigateur (le site n’est pas disponible pour les appareils mobiles). +\n2. Suivez cette URL : %1$s +\n3. Connectez-vous à votre compte. +\n4. Copier l’URL vers lequel vous venez d’être redirigé. votreID, soundcloud.com/votreid Cette opération peut consommer beaucoup de données mobiles. @@ -463,7 +463,7 @@ Effacer l\'historique Supprimer l\'historique des flux regardés Supprimer tout l\'historique regardé \? - Historique des vidéos regardées supprimé. + Historique des vidéos vues supprimé. Supprimer l\'historique des recherches Supprimer l\'historique de recherche par mot clef Supprimer tout l\'historique de recherche \? @@ -473,12 +473,12 @@ "NewPipe est un logiciel sous licence libre : Vous pouvez l\'utiliser, l\'étudier, le partager et l\'améliorer comme bon vous semble. Vous pouvez le redistribuer et/ou le modifier sous les termes de la licence générale publique GNU, comme publiée par la Free Software Foundation, dans sa version 3, ou, à votre convenance, dans une version plus récente." Politique de confidentialité de NewPipe Lire la politique de confidentialité - Voulez-vous également importer des paramètres ? + Voulez-vous également importer des paramètres \? Accepter Refuser -Le projet NewPipe prend votre vie privée très à cœur. Ainsi, l\'appli n\'envoie aucune donnée sans votre consentement. -\nLa politique de vie privée de NewPipe explique en détail quelles données sont envoyées et stockées quand vous envoyez un rapport de plantage. +Le projet NewPipe prend votre vie privée très à cœur. Ainsi, l’application n’envoie aucune donnée sans votre consentement. +\nLa politique de confidentialité de NewPipe explique en détail quelles données sont envoyées et stockées lorsque vous envoyez un rapport de plantage. Afin de se conformer au Règlement Général sur la Protection des Données (RGPD ou GDPR), nous attirons votre attention sur la politique de vie privée de NewPipe. Merci de la lire attentivement. \nVous devez l\'accepter pour nous envoyer le rapport de bug. Pas de limite @@ -495,6 +495,6 @@ Action lors du changement d\'application depuis le lecteur vidéo —%s Aucune Minimiser pour lire en arrière-plan - Minimiser vers lecteur PopUp + Minimiser vers le lecteur miniature - + \ No newline at end of file From dd424a4cb31ea61516fea15dc7b0398383f9d9b6 Mon Sep 17 00:00:00 2001 From: Tobias Groza Date: Thu, 27 Dec 2018 15:35:58 +0000 Subject: [PATCH 132/207] Translated using Weblate (Greek) Currently translated at 99.5% (381 of 383 strings) --- app/src/main/res/values-el/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index c7fed6c79..fc5528702 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -1,4 +1,4 @@ - + %1$s προβολές Ανέβηκε στις %1$s @@ -102,7 +102,7 @@ Εμφάνιση πληροφοριών Πατήστε στην αναζήτηση για να ξεκινήσετε - Δε βρέθηκε πρόγραμμα αναπαραγωγής ροής δεδομένων (μπορείτε να εγκαταστήσετε το VLC για να κάνετε αναπαραγωγή) + Δε βρέθηκε πρόγραμμα αναπαραγωγής ροής δεδομένων (μπορείτε να εγκαταστήσετε το VLC για να κάνετε αναπαραγωγή). Κατέβασμα του αρχείου ροής. Κάποιες αναλύσεις ΔΕΝ θα περιλαμβάνουν ήχο όταν επιλεχθεί αυτή η επιλογή NewPipe σε λειτουργία αναδυόμενου παραθύρου @@ -464,4 +464,4 @@ Ελαχιστοποίηση στο παρασκήνιο Ελαχιστοποίηση σε αναδυόμενο παράθυρο - + \ No newline at end of file From 3e73a5dbd3a6ca8252e15968733d9e2f67a23a62 Mon Sep 17 00:00:00 2001 From: postsorino Date: Thu, 27 Dec 2018 22:25:19 +0000 Subject: [PATCH 133/207] Translated using Weblate (Greek) Currently translated at 99.5% (381 of 383 strings) --- app/src/main/res/values-el/strings.xml | 58 +++++++++++++------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index fc5528702..38fd91bb8 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -22,7 +22,7 @@ Εισάγετε διαδρομή για λήψη των βίντεο Διαδρομή λήψης αρχείων ήχου - Διαδρομή για αποθήκευση αρχείων ήχου + Αυτή είναι η διαδρομή για την αποθήκευση αρχείων ήχου Εισάγετε διαδρομή για λήψη αρχείων ήχου Προεπιλεγμένη ανάλυση @@ -39,8 +39,8 @@ Φωτεινό Λήψη - Επόμενο βίντεο - Εμφάνιση \"επόμενου\" και \"σχετικών\" βίντεο + Επόμενο + Εμφάνιση \"Επόμενου\" και \"Σχετικών\" βίντεο Δεν υποστηρίζεται η διεύθυνση URL Προεπιλεγμένη γλώσσα περιεχομένου Βίντεο & Ήχος @@ -103,15 +103,15 @@ Πατήστε στην αναζήτηση για να ξεκινήσετε Δε βρέθηκε πρόγραμμα αναπαραγωγής ροής δεδομένων (μπορείτε να εγκαταστήσετε το VLC για να κάνετε αναπαραγωγή). - Κατέβασμα του αρχείου ροής. - Κάποιες αναλύσεις ΔΕΝ θα περιλαμβάνουν ήχο όταν επιλεχθεί αυτή η επιλογή + Κατέβασμα του αρχείου ροής + Αφαίρεση του ήχου από κάποιες αναλύσεις NewPipe σε λειτουργία αναδυόμενου παραθύρου Έγινε διαγραφή από το κανάλι Αδύνατη η αλλαγή της εγγραφής Αδύνατη η ενημέρωση της εγγραφής Κύριο Εγγραφές - Σελιδοδείκτες + Αγαπημένες λίστες αναπαραγωγής Νέα @@ -129,13 +129,13 @@ Χρήση γρήγορης μη-ακριβούς αναζήτησης Η μη-ακριβής αναζήτηση επιτρέπει στην εφαρμογή να αναζητεί θέσεις στο βίντεο γρηγορότερα με μειωμένη ακρίβεια Φόρτωση thumbnails - Απενεργοποιήστε για να σταματήσετε τη φόρτωση των μικρογραφιών και να εξοικονομήσετε δεδομένα και χρήση μνήμης. Αλλάζοντας αυτή τη ρύθμιση θα εκκαθαρίσει τα προσωρινά αποθηκευμένα δεδομένα στη μνήμη και τον αποθηκευτικό χώρο + Αν η επιλογή είναι απενεργοποιημένη δεν φορτώνονται οι μικρογραφίες, χρησιμοποιώντας λιγότερα δεδομένα και μνήμη. Οι αλλαγές σβήνουν την προσωρινή μνήμη των εικόνων. Εκκαθαρίστηκε η προσωρινή μνήμη εικονών Εκκαθάριση προσωρινά αποθηκευμένων μεταδεδομένων Αφαίρεση όλων των προσωρινά αποθηκευμένων δεδομένων ιστοσελίδων Η προσωρινή μνήμη μεταδεδομένων εκκαθαρίστηκε Αυτόματη πρόσθεση της επόμενης ροής στην ουρά - Αυτόματη πρόσθεση μιας σχετικής ροής όταν αναπαράγεται η προηγούμενη ροή σε μια μη-επαναλαμβανόμενη ουρά + Αυτόματη πρόσθεση μιας σχετικής ροής όταν αναπαράγεται η προηγούμενη ροή σε μια μη-επαναλαμβανόμενη ουρά. Έλεγχος αναπαραγωγής με χειρονομίες Χρήση χειρονομιών για τον έλεγχο της φωτεινότητας και της έντασης ήχου της εφαρμογής Εμφάνιση υποδείξεων ενώ κάνετε αναζήτηση @@ -144,7 +144,7 @@ Κρατήστε ιστορικό των βίντεο που έχετε δει Συνέχεια όταν η εφαρμογή έρθει σε πρώτο πλάνο Συνέχιση της αναπαραγωγής έπειτα από διακοπές (π.χ.: κλήσεις) - Εμφάνιση της βοήθειας \"πιέστε παρατεταμένα για πρόσθεση\" + Εμφάνιση της βοήθειας \"Πιέστε παρατεταμένα για πρόσθεση\" Εμφάνιση της βοήθειας όταν έχει πατηθεί το κουμπί Παρασκηνίου ή Αναδυόμενου παραθύρου στη σελίδα λεπτομερειών του βίντεο Προεπιλεγμένη χώρα περιεχομένου Υπηρεσία @@ -158,8 +158,8 @@ Προστέθηκε στη λίστα αναπαραγωγής αναδυόμενου παραθύρου Περιεχόμενο Εμφάνιση περιεχομένου περιορισμένης πρόσβασης - Βίντεο περιορισμένης πρόσβασης. Για να επιτρέπετε περιερχόμενο τέτοιου είδους, ενεργοποιήστε το στις Ρυθμίσεις. - Ζωντανά + Βίντεο περιορισμένης πρόσβασης. Για να επιτρέπετε περιερχόμενο τέτοιου είδους, ενεργοποιήστε το στις \"Ρυθμίσεις\". + ΖΩΝΤΑΝΑ Αναφορά σφαλμάτων Κανάλια Λίστα αναπαραγωγής @@ -193,11 +193,11 @@ Εξαγωγή ιστορικού, εγγραφών και λιστών αναπαραγωγής Εκκαθάριση ιστορικού προβολής Διαγράφει το ιστορικό των ροών που έχουν αναπαραχθεί - Διαγραφή ολόκληρου του ιστορικού προβολής. + Διαγραφή ολόκληρου του ιστορικού προβολής; Το στορικό προβολής διαγράφηκε. Διαγραφή ιστορικού αναζητήσεων Διαγράφει το ιστορικό αναζητήσεών σας - Διαγραφή ολόκληρου του ιστορικού αναζητήσεων. + Διαγραφή ολόκληρου του ιστορικού αναζητήσεων; Το ιστορικό αναζητήσεων διαγράφηκε. Δεν ήταν δυνατή η φόρτωση όλων των εικονιδίων Δεν ήταν δυνατή η αποκρυπτογράφηση της υπογραφής του URL του βίντεο @@ -206,7 +206,7 @@ Το περιεχόμενο δεν είναι διαθέσιμο "Έχει αποκλειστεί από την GEMA" Δεν ήταν δυνατή η ρύθμιση του μενού λήψεων - Αυτή είναι μια Ζωντανή Ροή, που δεν υποστηρίζεται ακόμα. + Η Ζωντανή Ροή δεν υποστηρίζεται ακόμα Δεν ήταν δυνατή η λήψη καμίας ροής Δεν ήταν δυνατή η φόρτωση της εικόνας Η εφαρμογή κράσαρε @@ -217,8 +217,8 @@ Μη έγκυρο URL Δε βρέθηκαν ροές βίντεο Δε βρέθηκαν ροές ήχου - Μη έγκυρη διεύθυνση - Μη έγκυρο αρχείο ή πηγή περιεχομένου + Δεν υπάρχει αυτός ο φάκελος + Δεν υπάρχει το αρχείο/πηγή περιεχομένου Το αρχείο δεν υπάρχει ή δεν έχουμε επαρκή εξουσιοδότηση για να διαβάσουμε ή να γράψουμε σε αυτό Το όνομα αρχείου δεν μπορεί να είναι κενό Προέκυψε ένα σφάλμα: %1$s @@ -230,7 +230,7 @@ What:\\nΑίτημα:\\nΓλώσσα περιεχομένου:\\nΥπηρεσία:\\nΏρα GMT:\\nΠακέτο:\\nΈκδοση:\\nΈκδοση λειτουργικού: Αναφορά χρήστη Κανένα αποτέλεσμα - Τρεις κι ο κούκος + Δεν υπάρχει τίποτα εδώ Σύρετε για ταξινόμηση Προσπάθεια εκ νέου @@ -353,11 +353,11 @@ Λεπτομέρειες Ρυθμίσεις ήχου Πιέστε παρατεταμένα για να προστεθεί στην ουρά - Προσθήκη στην ουρά Παρασκηνίου - Προσθήκη στην ουρά Αναδυόμενου παραθύρου + Προσθήκη στην ουρά όταν είναι στο παρασκήνιο + Προσθήκη στην ουρά νέου Αναδυόμενου παραθύρου Εκκίνηση Αναπαραγωγής εδώ - Εκκίνηση εδώ στο Παρασκήνιο - Εκκίνηση εδώ στο Αναδυόμενο Παράθυρο + Εκκίνηση εδώ όταν είναι στο Παρασκήνιο + Εκκίνηση εδώ όταν είναι στο Αναδυόμενο Παράθυρο Άνοιγμα Συρταριού Κλείσιμο Συρταριού @@ -377,9 +377,9 @@ Γίνεται λήψη πληροφοριών… Γίνεται φόρτωση του ζητούμενου περιεχομένου - Δημιουργία νέας Λίστας Αναπαραγωγής - Διαγραφή Λίστας - Μετονομασία Λίστας + Νέα Λίστα Αναπαραγωγής + Διαγραφή + Μετονομασία Όνομα Προσθήκη στη Λίστα Ορισμός ως μικρογραφία λίστας αναπαραγωγής @@ -387,11 +387,11 @@ Προσθήκη Σελιδοδείκτη στη Λίστα Διαγραφή Σελιδοδείκτη - Επιθυμείτε να διαγράψετε αυτή τη λίστα αναπαραγωγής; + Διαγραφή αυτής της λίστας αναπαραγωγής; Η λίστα αναπαραγωγής δημιουργήθηκε - Προστέθηκε στη λίστα - Η μικρογραφία της λίστας αναπαραγωγής άλλαξε - Δεν ήταν δυνατή η διαγραφή της λίστας + Προστέθηκε στη λίστα αναπαραγωγής + Η μικρογραφία της λίστας αναπαραγωγής άλλαξε. + Δεν ήταν δυνατή η διαγραφή της λίστας. Δεν υπάρχουν υπότιτλοι @@ -402,7 +402,7 @@ Αυτόματοι Υπότιτλοι - Τροποποίηση του μεγέθους και του φόντου των υπότιτλων. Απαιτεί επανεκκίνηση της εφαρμογής + Τροποποίηση του μεγέθους και του φόντου των υπότιτλων. Απαιτεί επανεκκίνηση της εφαρμογής. Ενεργοποίηση του LeakCanary Η παρακολούθηση των διαρροών μνήμης μπορεί να προκαλέσει την διακοπή της εφαρμογής From 83cea5e1eec88e75b9ca9d6a75d23a6ad8a75c37 Mon Sep 17 00:00:00 2001 From: srkrishna Date: Thu, 27 Dec 2018 15:29:53 +0000 Subject: [PATCH 134/207] Translated using Weblate (Tamil) Currently translated at 39.7% (152 of 383 strings) --- app/src/main/res/values-ta/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 68f31c63b..6f42665d9 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -162,4 +162,5 @@ தேடப்பட்ட வார்த்தைகளின் வரலாற்றை அழி அனைத்து வரலாற்றயும் அழிக்கவா\? பிழை + சிறந்த திரைத் தெளிவுத்திறன் \ No newline at end of file From 26040d4e9f105e0e8f6438197557658ea5b4459a Mon Sep 17 00:00:00 2001 From: WaldiS Date: Sun, 30 Dec 2018 17:57:30 +0000 Subject: [PATCH 135/207] Translated using Weblate (Polish) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-pl/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 008190fff..c6d3adeb2 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -1,4 +1,4 @@ - + Dotknij wyszukaj, aby rozpocząć Instaluj @@ -180,7 +180,7 @@ Otwórz stronę O programie Licencje - Wolne, lekkie przesyłanie strumieniowania na Androidzie. + Wolne, lekkie strumieniowanie na Androidzie. Zobacz na GitHubie Licencja NewPipe Jeżeli masz pomysł na tłumaczenie, zmiany w wyglądzie aplikacji, oczyszczenie kodu źródłowego, pomoc jest zawsze mile widziana. Im więcej jest zrobione, tym lepiej! @@ -497,4 +497,4 @@ Zminimalizuj do odtwarzania w tle Zminimalizuj do odtwarzania w okienku - + \ No newline at end of file From 98449ddfe0d11388b92841b9d795b98cc04c3435 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Mon, 31 Dec 2018 08:10:29 +0000 Subject: [PATCH 136/207] Translated using Weblate (Hebrew) Currently translated at 88.5% (339 of 383 strings) --- app/src/main/res/values-he/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index c3c232f94..273f952aa 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -194,7 +194,7 @@ סרטון אחד שני סרטונים - מספר סרטונים + %s סרטונים %s סרטונים From 3e4f0d682bc7f46b6236c16482bdeed7c71fa677 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 2 Jan 2019 23:47:48 +0000 Subject: [PATCH 137/207] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index c1f70a6fe..87293235e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1,4 +1,4 @@ - + 點播 %1$s 次 %1$s 發布 @@ -23,7 +23,7 @@ 用 Kodi 播放 顯示用 Kodi 媒體中心播放影片的選項 聲音 - 找不到 Kore ,您要安裝 Kore 嗎? + 找不到 Kore,您要安裝 Kore 嗎? 顯示「用 Kodi 播放」的選項 預設音訊格式 WebM — 開放格式 @@ -482,4 +482,4 @@ 播放清單 使用者 - + \ No newline at end of file From 32b48d5cdbfd572930fd302138dc48e471eaa1b1 Mon Sep 17 00:00:00 2001 From: zelos-h Date: Wed, 2 Jan 2019 23:48:13 +0000 Subject: [PATCH 138/207] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 87293235e..d3500e81f 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -407,11 +407,11 @@ 之前的匯出 檔案不存在或讀取或寫入權限不足 - 透過下載匯出檔案來匯入您的 YouTube 訂閱: + 透過下載匯出檔來匯入您的 YouTube 訂閱: \n \n1. 移至此網址:%1$s -\n2. 當被詢問時登入 -\n3. 下載應該開始 ( 這就是匯出的檔案 ) +\n2. 當被提示時登入帳號 +\n3. 應該會開始一筆下載 ( 這就是匯出檔 ) yourID, soundcloud.com/yourid 請記住,此操作可造成昂貴網路花費。 From 5fce9facbe8ec18a3b289d21fce2deed17381282 Mon Sep 17 00:00:00 2001 From: Marc Riera Date: Wed, 2 Jan 2019 00:22:08 +0000 Subject: [PATCH 139/207] Translated using Weblate (Catalan) Currently translated at 99.7% (382 of 383 strings) --- app/src/main/res/values-ca/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 30556e832..73ff8e69b 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -1,4 +1,4 @@ - + Instal·la Cancel·la Obre al navegador @@ -12,7 +12,7 @@ Mostra la informació Subscripcions - Llistes de reproducció desades a les adreces d\'interès + Llistes de reproducció desades Novetats @@ -466,4 +466,4 @@ Llistes de reproducció Pistes Usuaris - + \ No newline at end of file From f90603a18fda2aec5ca1649f2a3c5f5e82f89593 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 2 Jan 2019 23:48:36 +0000 Subject: [PATCH 140/207] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d3500e81f..58a6c72ae 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -411,7 +411,7 @@ \n \n1. 移至此網址:%1$s \n2. 當被提示時登入帳號 -\n3. 應該會開始一筆下載 ( 這就是匯出檔 ) +\n3. 應該會開始下載(這就是匯出檔 ) yourID, soundcloud.com/yourid 請記住,此操作可造成昂貴網路花費。 From d8aab62d75f5fa792aa0ea08232c6d1fb14c2979 Mon Sep 17 00:00:00 2001 From: "Markel @wakutiteo" Date: Wed, 2 Jan 2019 11:15:37 +0000 Subject: [PATCH 141/207] Translated using Weblate (Spanish) Currently translated at 90.9% (348 of 383 strings) --- app/src/main/res/values-es/strings.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 35f679450..7c4ce16f4 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,4 +1,4 @@ - + %1$s de visualizaciones Publicado el %1$s @@ -27,7 +27,7 @@ WebM — formato libre M4A — mejor calidad Descargar - Siguiente vídeo + Siguiente URL no soportada Usar reproductor de vídeo externo Usar reproductor de audio externo @@ -170,7 +170,7 @@ abrir en modo popup Popup Redimensionando - Algunas resoluciones podrían NO tener audio cuando esta opción está activada + Elimina el audio en algunas resoluciones Controles de gestos del reproductor Usar gestos para controlar el brillo y volumen del reproductor Sugerencias de búsqueda @@ -337,10 +337,10 @@ abrir en modo popup ADVERTENCIA: no se pudieron importar todos los archivos. Esto reemplazará su configuración actual. - Descargar archivo stream. + Descargar archivo stream Mostrar info - Marcadores + "Listas de reproducción en marcadores " Añadir a @@ -367,13 +367,13 @@ abrir en modo popup Definir como miniatura de lista de reproducción Marcar lista de reproducción - Remover marcador + Eliminar marcador - ¿Desea eliminar esta lista de reproducción? + ¿Borrar esta lista de reproducción\? Lista de reproducción creada Añadido a la lista de reproducción - Miniatura de lista de reproducción cambiada - No se pudo eliminar la lista de reproducción + Miniatura de lista de reproducción cambiada. + No se pudo eliminar la lista de reproducción. Fuente más pequeña Fuente normal @@ -414,7 +414,7 @@ abrir en modo popup El nombre del archivo no puede estar vacío Ocurrió un error: %1$s - Importar/Exportar + Importar/exportar Importar Importar desde Exportar a @@ -489,7 +489,7 @@ abrir en modo popup Sin límite Limitar resolución cuando se use Datos Móviles Mimimizar al cambiar de aplicación - Acción de cambiar a otra aplicación desde el reproductor principal + Acción de cambiar a otra aplicación desde el reproductor principal — %s Ninguna Minimizar al reproductor de fondo Minimizar el reproductor emergente @@ -502,4 +502,4 @@ abrir en modo popup Usuarios Listas de reproducción Pistas - + \ No newline at end of file From e31743770a016606dd216f0907c033234e5009f6 Mon Sep 17 00:00:00 2001 From: zelos-h Date: Wed, 2 Jan 2019 23:48:46 +0000 Subject: [PATCH 142/207] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-zh-rTW/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 58a6c72ae..d04e894c9 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -421,7 +421,7 @@ \n \n1. 在瀏覽器中啟用「桌面模式」(該網站不適用於行動裝置) \n2. 移至此網址: %1$s -\n3. 當被詢問時登入 +\n3. 當被提示時登入帳號 \n4. 複製您被重新導向到的個人設定檔網址。 載入縮圖 當關閉時不載入縮圖,減少數據和儲存空間的用量。改變時將清除記憶體和磁碟上的縮圖快取。 From 6dca9758441cf2cb75c38919bab62ce639f6d59f Mon Sep 17 00:00:00 2001 From: zmni Date: Thu, 3 Jan 2019 11:00:50 +0000 Subject: [PATCH 143/207] Translated using Weblate (Indonesian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-id/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 5f4555fc2..230df05c7 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -1,4 +1,4 @@ - + Tekan pencarian untuk memulai %1$s tayang @@ -219,7 +219,7 @@ Riwayat Riwayat kosong Muat thumbnail - Saat tidak ada pemuatan thumbnail, hemat data dan penggunaan memori. Perubahan menghapus cache gambar baik di memori dan di disk. + Saat mati, thumbnail tidak dimuat, menghemat penggunaan data dan memori. Perubahan menghapus tembolok gambar baik di memori dan disk. Tembolok gambar dihapus Hapus tembolok metadata Buang semua data tembolok laman web @@ -487,4 +487,4 @@ Minimalkan ke pemutar latar belakang Minimalkan ke pemutar popup - + \ No newline at end of file From 4926e90514047a60657b208e25efd04f1ee17677 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Sat, 5 Jan 2019 15:30:49 +0000 Subject: [PATCH 144/207] Translated using Weblate (Portuguese) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-pt/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 31e54232e..27e684544 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1,4 +1,4 @@ - + %1$s visualizações Publicado em %1$s @@ -53,7 +53,7 @@ Usar Tor (Experimental) Usar a rede Tor para aumentar a privacidade (ainda não é suportada a emissão de vídeos). Pasta para a descarga de áudio - O áudio descarregado é guardado aqui + Local para guardar o áudio descarregado Digite o caminho para os ficheiros de áudio Não foi possível criar o diretório \'%1$s\' @@ -489,4 +489,4 @@ Ativar o reprodutor em segundo plano Ativar o reprodutor \'popup\' - + \ No newline at end of file From 97b933a9901a4b75e414f8eeed024bc7278ffde8 Mon Sep 17 00:00:00 2001 From: srkrishna Date: Sun, 6 Jan 2019 13:37:32 +0000 Subject: [PATCH 145/207] Translated using Weblate (Tamil) Currently translated at 40.5% (155 of 383 strings) --- app/src/main/res/values-ta/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 6f42665d9..9d07e365d 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -163,4 +163,7 @@ அனைத்து வரலாற்றயும் அழிக்கவா\? பிழை சிறந்த திரைத் தெளிவுத்திறன் + பாப் அப் இயக்கியின் வரிசையில் சேர்க்கப்பட்டது + "NewPipe பின்னனி மற்றும் பாப்அப் இயக்கிகளின் அறிவிப்புகள்" + "பாப்அப் இயக்கிக்கு மாறு " \ No newline at end of file From a39b10eee9f46fc67467d12e2a517b0d402ae775 Mon Sep 17 00:00:00 2001 From: zmni Date: Mon, 7 Jan 2019 14:33:42 +0000 Subject: [PATCH 146/207] Translated using Weblate (Indonesian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-id/strings.xml | 320 ++++++++++++------------- 1 file changed, 160 insertions(+), 160 deletions(-) diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 230df05c7..9cb119182 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -1,8 +1,8 @@ - Tekan pencarian untuk memulai - %1$s tayang - Diterbitkan pada %1$s + Sentuh pencarian untuk memulai + %1$s ditonton + Dipublikasikan tanggal %1$s Pasang Batal Buka di peramban @@ -20,18 +20,18 @@ Masukkan lokasi unduhan video Lokasi unduhan audio - Audio yang terunduh di simpan disini + Audio yang diunduh disimpan di sini Masukkan lokasi unduhan berkas audio Putar otomatis Putar video ketika NewPipe dijalankan dari aplikasi lain - Resolusi baku + Resolusi Putar dengan Kodi - Aplikasi Kore tidak ditemukan. Pasang Kore? + Apl Kore tidak ditemukan. Pasang Kore\? Tampilkan opsi \"Putar dengan Kodi\" Tampilkan opsi untuk memutar video via Kodi Audio - Format audio baku + Format audio WebM — format bebas M4A — kualitas lebih baik Tema @@ -42,18 +42,18 @@ Berikutnya Tampilkan video \'Berikutnya\' dan \'Serupa\' URL tidak didukung - Bahasa konten baku + Bahasa konten Video & audio Tampilan Lainnya - Putar di latar belakang + Memutar di latar belakang Putar Konten Konten yang dibatasi usia - "Perlihatkan Video yang Dibatasi Usia. Memperbolehkan ditonton dapat diatur lewat \"Pengaturan\"." + Tampilkan Video yang Dibatasi Usia. Membuka akses konten tersebut bisa dilakukan dari \"Pengaturan\". Galat jaringan - Tidak bisa memuat semua Thumbnail - Maksud Anda: %1$s\? + Tidak bisa memuat semua thumbnail + Maksud anda: %1$s\? rotasi LANGSUNG Unduhan @@ -61,31 +61,31 @@ Laporan galat Galat - Tidak dapat mengurai situs web - Sama sekali tidak dapat mengurai situs web + Tidak bisa mengurai situs web + Sama sekali tidak bisa mengurai situs web Konten tidak tersedia Diblokir oleh GEMA - Tidak bisa menyiapkan menu unduhan + Tidak bisa menyiapkan menu unduh Siaran langsung belum didukung Tidak bisa memuat gambar Maaf, hal tersebut seharusnya tidak terjadi. - Lapor galat via surat elektronik + Lapor galat via surel Maaf, telah terjadi galat. - LAPORKAN + LAPOR Info: Yang terjadi: - Komentar Anda (dalam bahasa Inggris): + Komentar anda (dalam bahasa Inggris): Detail: - Pratinjau thumbnail video - Pratinjau thumbnail video + Thumbnail pratinjau video + Thumbnail pratinjau video Suka - Gambar thumbnail pengunggah + Thumbnail avatar pengunggah Tidak suka Gunakan Tor (Eksperimental) Paksa trafik unduhan melalui Tor untuk meningkatkan privasi (video stream belum didukung). - Laporkan sebuah Galat + Laporkan Galat Tidak bisa membuat direktori unduhan \'%1$s\' Direktori unduhan dibuat \'%1$s\' @@ -106,16 +106,16 @@ Nama berkas Galat Server tidak didukung - Berkas telah ada + Berkas sudah ada URL salah atau tidak tersedia layanan internet - NewPipe sedang Mengunduh + NewPipe Sedang Mengunduh Sentuh untuk detail Mohon tunggu… Disalin ke papan klip Silakan pilih direktori unduhan yang tersedia - Tidak ditemukan pemutar stream. Apakah Anda ingin memasang VLC? - Tidak bisa mendekrip tanda tangan URL video + Pemutar stream tidak ditemukan. Apakah anda ingin memasang VLC\? + Tidak bisa dekripsi tanda tangan URL video App/UI rusak Tidak bisa mendapatkan stream apapun Apa:\\nPermintaan:\\nBahasa Konten:\\nLayanan:\\nWaktu GMT:\\nPaket:\\nVersi:\\nVersi OS: @@ -130,7 +130,7 @@ Hitam Semua - Saluran + Channel R J @@ -149,12 +149,12 @@ Memutar dalam mode popup Gunakan pemutar lama - Versi lama pemutar Mediaframework + Pemutar Mediaframework bawaan versi lama Dinonaktifkan - Format video baku + Format video - Resolusi popup baku + Resolusi popup Tampilkan resolusi yang lebih tinggi Hanya perangkat tertentu yang mendukung pemutaran video 2K/4K Latar Belakang @@ -171,8 +171,8 @@ Popup Ubah ukuran - Kontrol isyarat gerak pemutar - Gunakan isyarat gerak untuk mengontrol kecerahan dan volume pemutar + Kontrol gestur pemutar + Gunakan gestur untuk mengontrol kecerahan dan volume pemutar Saran pencarian Tampilkan saran ketika mencari @@ -197,13 +197,13 @@ Kontributor Lisensi Aplikasi streaming libre dan ringan untuk Android. - Lihat di Github + Lihat di GitHub Lisensi NewPipe - Terlepas apakah Anda memiliki ide untuk; terjemahan, perubahan desain, pembersihan kode, atau perubahan kode yang signifikan, segala bantuan akan selalu diterima. Semakin banyak akan semakin baik jadinya! + Terlepas apakah anda memiliki ide untuk; terjemahan, perubahan desain, pembersihan kode, atau perubahan kode yang signifikan, segala bantuan akan selalu diterima. Semakin banyak akan semakin baik jadinya! Baca lisensi Kontribusi -Berlangganan - Masih Berlangganan +Subscribe + Disubscribe Apa Yang Baru Lanjutkan saat fokus @@ -212,75 +212,75 @@ Utama Riwayat pencarian Simpan pencarian secara lokal - Riwayat & Tembolok + Riwayat & Cache Notifikasi NewPipe Riwayat Riwayat dinonaktifkan Riwayat Riwayat kosong Muat thumbnail - Saat mati, thumbnail tidak dimuat, menghemat penggunaan data dan memori. Perubahan menghapus tembolok gambar baik di memori dan disk. - Tembolok gambar dihapus + Saat mati, thumbnail tidak dimuat, menghemat penggunaan data dan memori. Perubahan menghapus cache gambar baik di memori dan disk. + Cache gambar dihapus Hapus tembolok metadata Buang semua data tembolok laman web - Tembolok metadata dihapus - Otomatis tambahkan saluran yang terkait ketika memutar saluran terakhir dalam antrean tanpa perulangan. + Cache metadata dihapus + Otomatis tambahkan stream terkait ketika memutar stream terakhir dalam antrean tanpa perulangan. Simpan daftar video yang telah ditonton Tampilkan tip \"Tahan untuk menambahkan\" - Tampilkan tip ketika tombol latar belakang atau popup ditekan pada halaman detail video - Negara konten baku + Tampilkan tip ketika tombol latar belakang atau popup disentuh pada halaman detail video + Negara konten Layanan Pemutar Perilaku Riwayat & cache Debug - Mengantre di belakang pemutar - Mengantre di pemutar popup - Daftar Putar - Tidak jadi + Diantrekan di pemutar latar belakang + Diantrekan di pemutar popup + Playlist + Urungkan Putar Semua Selalu Hanya Sekali Berkas - Notifikasi untuk latar belakang NewPipe dan pemutar popup + Notifikasi untuk pemutar latar belakang dan popup NewPipe [Tidak diketahui] Ubah Orientasi - Kembali ke Layar Belakang - Kembali ke Popup - Kembali ke Utama + Alihkan ke Latar Belakang + Alihkan ke Popup + Alihkan ke Utama - Impor database - Ekspor database - Timpa riwayat dan langganan Anda saat ini - Ekspor riwayat, daftat langganan dan daftar putar + Impor basis data + Ekspor basis data + Timpa riwayat dan subscription anda saat ini + Ekspor riwayat, subscription dan playlist Tidak bisa memutar stream ini - Galat yg tidak bisa dipulihkan terjadi di pemutar + Telah terjadi galat pemutar yang tidak bisa dipulihkan Memulihkan dari galat pemutar - Playar eksternal tidak mendukung tipe tautan ini + Pemutar eksternal tidak mendukung tipe tautan ini URL tidak valid - Stream video tidak ditemukan - Stream audio tidak ditemukan - Tidak ada folder seperti itu - Tidak ada berkas/sumber konten seperti itu - Berkas tidak tersedia atau tidak memiliki izin untuk membaca atau menulisnya + Tidak ditemukan stream video + Tidak ditemukan stream audio + Folder tidak ada + Tidak ada sumber berkas/konten + Berkas tidak tersedia atau tidak memiliki izin baca atau tulis Nama berkas tidak boleh kosong - Sebuah galat terjadi: %1$s + Telah terjadi galat: %1$s Tidak ada hasil Tidak ada apapun disini selain jangkrik Geser untuk ubah urutan - Tidak ada pelanggan + Tidak ada subscriber - %s pelanggan + %s subscriber - Tidak ada tampil + Belum ditonton - %s tampil + %s ditonton Tidak ada video @@ -291,90 +291,90 @@ Buat Hapus Satu Hapus Semua - Diamkan + Abaikan Ubah nama Donasi - NewPipe dikembangkan oleh relawan yang menyisihkan waktu untuk memberi Anda pengalaman terbaik. Berikan dukungan kepada pengembang membuat NewPipe menjadi lebih baik lagi sembari menikmati secangkir kopi. + NewPipe dikembangkan oleh relawan yang menyisihkan waktu untuk memberi anda pengalaman terbaik. Segala dukungan kepada pengembang akan membuat NewPipe menjadi lebih baik lagi. Beri dukungan - Situs + Situs Web Kunjungi situs web NewPipe untuk info dan berita. - Sudah dicari - Riwayat terhapus - Item terhapus - Kamu ingin menghapus item ini dari riwayat pencarian? - Kamu ingin menghapus item ini dari riwayat tontonan? - Kamu yakin ingin menghapus semua item dari riwayat? + Dicari + Riwayat dihapus + Item dihapus + Apakah Anda ingin menghapus item ini dari riwayat pencarian\? + Apakah Anda ingin menghapus item ini dari riwayat tontonan\? + Apakah Anda yakin ingin menghapus semua item dari riwayat\? Terakhir Diputar - Paling sering Diputar + Sering Diputar Konten laman utama Laman Kosong - Laman Kios - Laman Langganan + Laman Kiosk + Laman Subscription Laman Umpan - Laman Kanal - Pilih sebuah kanal - Tidak ada kanal yang dilanggani - Pilih sebuah kios - Terekspor - Terimpor + Laman Channel + Pilih channel + Belum ada subscription channel + Pilih kiosk + Diekspor + Diimpor Berkas ZIP tidak valid - Perhatian: Tidak dapat mengimpor semua berkas. - Ini akan menimpa pengaturan kamu saat ini. + Perhatian: Tidak bisa mengimpor semua berkas. + Ini akan menimpa pengaturan anda saat ini. - Kios - Tren + Kiosk + Trending Top 50 - Baru & Panas + Baru & panas Pemutar latar belakang Pemutar popup Hapus - Rincian + Detail Pengaturan Audio Tahan untuk mengantre Antre saat di latar belakang Antre di popup baru Mulai putar di sini - Mulai disini ketika di latar belakang - Mulai disini di popup baru + Mulai dari sini ketika di latar belakang + Mulai dari sini pada popup baru - Buka Menu - Tutup Menu - Sesuatu akan muncul di sini segera ;D + Buka Laci + Tutup Laci + Sesuatu akan segera muncul di sini ;D Pemutar video - Pemutar Latar Belakang - Popup pemutar - Selalu tanya + Pemutar latar belakang + Pemutar popup + Selalu bertanya Mendapatkan info… Memuat konten yang diminta - Daftar Putar Baru + Playlist Baru Hapus Ubah Nama Nama - Tambah Ke Daftar Putar - Atur sebagai Thumbnail Daftar Putar + Tambahkan Ke Playlist + Atur sebagai Thumbnail Playlist - Markah Daftar Putar + Markah Playlist Hapus Markah - Hapus daftar putar ini\? - Daftar putar dibuat - Masuk dalam daftar putar - Thumbnail daftar putar diubah. - Tidak bisa menghapus daftar putar. + Hapus playlist ini\? + Playlist dibuat + Diplaylist + Thumbnail playlist diubah. + Tidak bisa menghapus playlist. - Tidak Ada Takarir + Tidak ada Takarir Pas Isi Perbesar - Dihasilkan-otomatis + Otomatis dibuat Ukuran fon deskripsi Fon lebih kecil Fon normal @@ -383,49 +383,49 @@ Aktifkan LeakCanary Nightcore Bawaan -Tidak ada aplikasi pemutar stream (Anda bisa memasang VLC untuk memutarnya). +Pemutar stream tidak ditemukan (anda bisa memasang VLC untuk memutarnya). Unduh berkas stream - Tidak bisa mengubah langganan + Tidak bisa mengubah subscription Tampilkan info Tambahkan Ke - Hapus riwayat menonton - Hapus riwayat stream yang diputar - Hapus seluruh riwayat menonton\? - Riwayat menonton dihapus. + Hapus riwayat tontonan + Hapus riwayat stream yang telah diputar + Hapus seluruh riwayat tontonan\? + Riwayat tontonan dihapus. Hapus riwayat pencarian - Hapus riwayat dari ketikan pencarian + Hapus riwayat lema pencarian Hapus seluruh riwayat pencarian\? Riwayat pencarian dihapus. Tidak ada stream yang tersedia untuk diunduh - 1 item di hapus. + 1 item dihapus. - Tidak ada aplikasi terpasang untuk memutar file ini + Tidak ada aplikasi terpasang untuk memutar berkas ini - Sudah dilihat - Bookmarked Playlists + Ditonton + Playlist Disimpan Antre otomatis stream berikutnya - Berhenti langganan channel ini - Tidak dapat memperbarui langganan - Langganan - Gunakan pencarian cepat yang tidak beraturan - Pencarian tidak beraturan memungkinkan pengguna untuk mencari posisi lebih cepat dengan ketepatan yang berkurang - NewPipe adalah perangkat lunak libre copyleft: Anda dapat menggunakannya, mempelajarinya, berbagi, dan meningkatkannya. Secara khusus Anda dapat mendistribusikan ulang dan/atau memodifikasinya di bawah syarat-syarat Lisensi GNU General Public License yang diterbitkan oleh Free Software Foundation, baik versi 3 dari Lisensi, atau (sesuai pilihan Anda) versi yang lebih baru. - Apa Anda ingin juga mengimpor pengaturan? + Channel berhenti disubscribe + Tidak bisa memperbarui subscription + Subscription + Gunakan tinjau cepat tak pasti + Memungkinkan pengguna memilih posisi waktu video dengan cepat tetapi dengan tingkat presisi yang rendah + NewPipe adalah perangkat lunak libre copyleft: Anda bisa menggunakannya, mempelajarinya, berbagi, dan meningkatkannya. Secara khusus anda bisa mendistribusikan ulang dan/atau memodifikasinya dibawah syarat Lisensi Publik Umum GNU yang diterbitkan oleh Free Software Foundation, baik versi 3 dari Lisensi, atau (sesuai pilihan anda) versi yang lebih baru. + Apakah anda juga ingin mengimpor pengaturan\? - Tindakan \'buka\' yang disukai - Aksi bawaan ketika membuka konten — %s + Tindakan \'buka\' yang diinginkan + Tindakan baku ketika membuka konten — %s Takarir - Mengubah skala keterangan teks pemutar dan gaya latar belakang. Perlu memulai ulang aplikasi untuk melihat hasilnya. + Ubah skala teks takarir pemutar dan gaya latar belakang. Perlu memulai ulang apl. - Pemantauan kebocoran memori dapat menyebabkan aplikasi menjadi tidak responsif saat terjadi dumping + Pemantauan kebocoran memori dapat menyebabkan apl menjadi tidak responsif saat heap dumping - Laporkan kesalahan di-Luar-siklus - Memaksa pelaporan pengecualian Rx yang tidak dapat dikirim di luar kepingan atau siklus hidup aktivitas setelah dibuang + Laporkan galat out-of-lifecycle + Paksa pelaporan eksepsi Rx yang tak terkirim di luar fragmen atau siklus hidup aktivitas setelah dibuang Impor/ekspor Impor @@ -435,55 +435,55 @@ Mengimpor… Mengekspor… - Impor file + Impor berkas Ekspor sebelumnya - Tidak dapat mengimpor langganan - Tidak dapat mengekspor langganan + Tidak bisa mengimpor subscription + Tidak bisa mengekspor subscription - Impor daftar langganan YouTube dengan mengunduh file ekspor: -\n -\n1. Pergi ke URL ini: %1$s -\n2. Masuk ketika ditanya -\n3. Unduhan akan dimulai (Itulah file ekspornya) - Untuk mengimpor profil SoundCloud dengan mengetik URL atau ID Anda: -\n -\n1. Nyalakan \"mode desktop\" di web-browser (situsnya tidak tersedia untuk perangkat mobile) -\n2. Pergi ke URL ini: %1$s -\n3. Log in ketika ditanya -\n4. Salin URL profil Anda ketika dialihkan. - IDanda, soundcloud.com/idanda + Impor subscription YouTube dengan mengunduh berkas yang diekspor: +\n +\n1. Kunjungi URL ini: %1$s +\n2. Masuk ketika ditanya +\n3. Unduhan akan dimulai (itulah berkas ekspornya) + Impor profil SoundCloud dengan mengetik URL atau ID anda: +\n +\n1. Aktifkan \"mode desktop\" di peramban web (situs tidak tersedia untuk perangkat seluler) +\n2. Kunjungi URL ini: %1$s +\n3. Masuk ketika ditanya +\n4. Salin URL profil anda ketika dialihkan. + idAnda, soundcloud.com/idAnda - Perlu diingat operasi ini bisa menyedot jaringan yang mahal. + Perlu diingat operasi ini membutuhkan bandwidth yang besar. \n -\nApakah Anda ingin melanjutkan? +\nApakah anda ingin melanjutkan\? Kontrol Kecepatan Pemutaran Tempo Nada Batalkan tautan (dapat menyebabkan distorsi) - Saluran - Daftar putar + Channel + Playlist Trek Pengguna Kebijakan Privasi NewPipe - Proyek NewPipe sangat memperhatikan privasi Anda. Oleh karena itu, aplikasi tidak mengumpulkan data apapun tanpa sepengetahuan Anda. -\nKebijakan privasi NewPipe menjelaskan secara detail data apa yang dikirim dan disimpan ketika Anda mengirimkan laporan kerusakan. + Proyek NewPipe sangat memperhatikan privasi anda. Karena itu, apl tidak mengumpulkan data apapun tanpa sepengetahuan anda. +\nKebijakan privasi NewPipe menjelaskan secara detail data apa saja yang dikirim dan disimpan ketika anda mengirimkan laporan kerusakan. Baca kebijakan privasi Percepat saat diam Langkah Atur ulang - Agar sesuai dengan Peraturan Perlindungan Data Umum Eropa (GDPR), dengan ini kami menarik perhatian Anda ke kebijakan privasi NewPipe. Silakan baca dengan seksama. + Agar sesuai dengan Regulasi Perlindungan Data Umum Eropa (GDPR), dengan ini kami tarik perhatian anda ke kebijakan privasi NewPipe. Silakan baca dengan seksama. \nAnda harus menerimanya untuk mengirimkan laporan bug kepada kami. Setuju Tolak Tanpa batas - Batasi resolusi saat menggunakan data mobile - Minimalkan saat beralih aplikasi - Tindakan ketika beralih ke aplikasi lain dari pemutar video utama — %s - Tidak ada + Batasi resolusi saat menggunakan data seluler + Minimalkan saat beralih apl + Tindakan ketika beralih ke apl lain dari pemutar video utama — %s + Nihil Minimalkan ke pemutar latar belakang Minimalkan ke pemutar popup From fab5f26e09eb00a8d939a31d1d922c3500f207de Mon Sep 17 00:00:00 2001 From: Brian <12914037+thisBrian@users.noreply.github.com> Date: Sat, 12 Jan 2019 04:41:16 +1300 Subject: [PATCH 147/207] Correct 'description' spelling --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 574c87ad3..873c1780f 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -19,7 +19,7 @@ hasn't been reported/requested before * We use English for development. Issues in other languages will be closed and ignored. * Please only add *one* issue at a time. Do not put multiple issues into one thread. * When reporting a bug please give us a context, and a description how to reproduce it. -* Issues that only contain a generated bug report, but no describtion might be closed. +* Issues that only contain a generated bug report, but no description might be closed. ## Bug Fixing * If you want to help NewPipe to become free of bugs (this is our utopic goal for NewPipe), you can send us an email to From 890474a6354fe9adf6ee77521b2fb635a2b5d992 Mon Sep 17 00:00:00 2001 From: Nathan Follens Date: Fri, 11 Jan 2019 19:54:34 +0000 Subject: [PATCH 148/207] Translated using Weblate (Dutch) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-nl/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 6339d3ea5..1c9e39faa 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -361,8 +361,8 @@ Altijd vragen Nieuwe afspeellijst - Verwijder - Wijzig naam + Verwijderen + Naam wijzigen Naam Toevoegen aan afspeellijst Instellen als miniatuur voor afspeellijst From db8ac4a9ae0f16c70c12f4c44f0036f1b819805f Mon Sep 17 00:00:00 2001 From: Nathan Follens Date: Fri, 11 Jan 2019 19:38:23 +0000 Subject: [PATCH 149/207] Translated using Weblate (Flemish) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-nl-rBE/strings.xml | 80 +++++++++++----------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index a3a7a4f5c..412921e0c 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -24,13 +24,13 @@ Abonneer Geabonneerd Abonnement opgezegd - Kan het abonnement niet veranderen - Kan het abonnement niet vernieuwen + Kan abonnement niet wijzigen + Kan abonnement niet bijwerken Info tonen Start Abonnementen - Bladwijzers + Bijgehouden afspeellijsten Nieuw @@ -42,8 +42,8 @@ Locatie voor gedownloade video’s in op te slaan Voer downloadlocatie in voor video’s - Downloadlocatie voor audio - Locatie voor gedownloade muziek in op te slaan + Downloadmap voor audio + Gedownloade audio wordt hier opgeslagen Voer downloadlocatie voor audiobestanden in Automatisch afspelen @@ -70,13 +70,13 @@ Snel, minder exact spoelen gebruiken Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie Miniatuurvoorbeelden laden - Schakelt dit uit voor alle miniatuurvoorbeelden niet meer te laden; dit bespaart gegevens en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache + Der worden geen miniatuurvoorbeelden geladen wanneer dat dit uit staat; dit bespaart mobiele gegevens en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache. Afbeeldingscache gewist Gecachete metagegevens wissen Alle gecachete webpagina-gegevens wissen Metagegevens-cache gewist Volgende stream automatisch in wachtrij plaatsen - Automatisch ne gerelateerde stream toevoegen bij het afspelen van de laatste stream in een niet-herhalende wachtlijst + Automatisch ne gerelateerde stream toekennen bij het afspelen van de laatste stream in een niet-herhalende wachtlijst. Bewegingscontrole Gebruikt bewegingen voor helderheid en volume van de speler aan te passen Zoeksuggesties @@ -88,10 +88,10 @@ Hervat bij focus Ga verder met afspelen na onderbrekingen (zoals telefoongesprekken) Downloaden - Volgende video - Toond ‘volgende’ en ‘vergelijkbare’ video’s - Toond tip voor ingedrukt houden voor toe te voegen - Toon tip wanneer dat den achtergrond- of pop-upknop is ingedrukt op de video-detailpagina + Volgende + Toont ‘Volgende’ en ‘Vergelijkbare’ video’s + Toont tip ‘Ingedrukt houden voor toe te voegen’ + Toont tip wanneer dat den achtergrond- of pop-upknop wordt ingedrukt op de videogegevenspagina URL wordt niet ondersteund Standaardinhoudsland Dienst @@ -110,9 +110,9 @@ Toegevoegd aan wachtrij voor pop-upspeler Afspelen Inhoud - Toon inhoud met leeftijdsbeperking - Video heeft leeftijdsbeperking. Leeftijdsbeperkte video’s kunnen ingeschakeld worden in de instellingen. - live + Inhoud met leeftijdsbeperking + Toont video met leeftijdsbeperking. Toelaten van deze soort video’s kan ingeschakeld worden in de ‘Instellingen’. + LIVE Downloads Downloads Foutrapport @@ -145,7 +145,7 @@ Databank importeren Databank exporteren - Dit gaat uw huidige geschiedenis en abonnementen overschrijven + Dit overschrijft uw huidige geschiedenis en abonnementen Exporteert geschiedenis, abonnementen en speellijsten Fout Netwerkfout @@ -156,7 +156,7 @@ Inhoud niet beschikbaar Geblokkeerd door GEMA Kon downloadmenu niet instellen - Dit is ne LIVESTREAM, deze worden nog niet ondersteund. + Livestreams worden nog niet ondersteund Kon geen streams vinden Kon afbeelding niet laden App/UI gecrasht @@ -167,10 +167,10 @@ Ongeldige URL Geen videostreams gevonden Geen audiostreams gevonden - Ongeldige map - Ongeldig bestand/ongeldigen inhoudsbron - Het bestand bestaat niet of ge beschikt niet over voldoende machtiging voor het te lezen/ernaar te schrijven - Den bestandsnaam mag niet leeg zijn + Deze map bestaat niet + Bestand/inhoudsbron bestaat niet + Het bestand bestaat niet of ge zijt onvoldoende gemachtigd voor het te lezen/dernaar te schrijven + Den bestandsnaam mag niet blanco zijn Der is een fout opgetreden: %1$s Geen streams beschikbaar voor downloaden @@ -317,8 +317,8 @@ Selecteer een kanaal Nog niet geabonneerd op een kanaal Selecteer ne kiosk - Export voltooid - Import voltooid + Geëxporteerd + Geïmporteerd Geen geldig ZIP-bestand Opgelet: kon niet alle bestanden importeren. Dit zal uw huidige configuratie overschrijven. @@ -332,12 +332,12 @@ Verwijderen Details Audio-instellingen - Houd ingedrukt voor toe te voegen aan wachtrij - Toevoegen aan wachtrij in achtergrond - Toevoegen aan wachtrij in pop-up - Hier beginnen spelen - Hier beginnen in achtergrond - Hier beginnen in pop-up + Houdt ingedrukt voor toe te voegen aan wachtrij + Toevoegen aan wachtrij wanneer op de achtergrond + Toevoegen aan wachtrij bij nieuwe pop-up + Begint hier met afspelen + Begint hier met afspelen wanneer op de achtergrond + Begint hier met afspelen in nieuwe pop-up Menu openen Menu sluiten @@ -355,9 +355,9 @@ Info ophalen… Bezig me laden van gevraagden inhoud - Nieuwen afspeellijst aanmaken - Afspeellijst verwijderen - Afspeellijst hernoemen + Nieuwen afspeellijst + Verwijderen + Hernoemen Naam Toevoegen aan afspeellijst Instellen als miniatuur voor afspeellijst @@ -365,11 +365,11 @@ Afspeellijst toevoegen aan bladwijzers Bladwijzer verwijderen - Wild ge dezen afspeellijst verwijderen? + Dezen afspeellijst verwijderen\? Afspeellijst aangemaakt Toegevoegd aan afspeellijst - Miniatuur voor afspeellijst gewijzigd - Kon afspeellijst nie’ verwijderen + Miniatuur voor afspeellijst gewijzigd. + Den afspeellijst kon niet verwijderd worden. Geen bijschriften @@ -379,13 +379,13 @@ Automatisch gegenereerd - Koppen - Koptekstgrootte en achtergrondstijlen wijzigen. Vereist nen herstart van den app + Bijschriften + Bijschriftgrootte en achtergrondstijlen wijzigen. Vereist nen herstart van den app. LeakCanary inschakelen Het monitoren van geheugenlekken kan dervoor zorgen da’ den app nie’ goe meer reageerd - Out-of-Lifecycle-fouten melden + Out-of-lifecycle-fouten melden Forceerd het melden van nie-bezorgbare Rx-uitzonderingen die gebeuren buiten fragments- of activiteitscyclus Importeren/exporteren @@ -427,15 +427,15 @@ Standaard Kijkgeschiedenis wissen Verwijdert de geschiedenis van afgespeelde streams - Verwijdert de ganse kijkgeschiedenis. + De ganse kijkgeschiedenis verwijderen\? Kijkgeschiedenis verwijderd. Zoekgeschiedenis wissen Verwijdert de gebruikte zoektermen - Verwijdert de ganse geschiedenis. + De ganse zoekgeschiedenis verwijderen\? Zoekgeschiedenis verwijderd. 1 item verwijderd. - NewPipe is vrije software: ge kund het gebruiken, bestuderen, delen en verbeteren zoveel als da’ ge maar wild. Ge kund het opnieuw uitgeven en/of aanpassen volgens de voorwaarden van de GNU General Public License, gepubliceerd door de Free Software Foundation, versie 3 van de licentie, of (indien gewenst) gelijk welke latere versie. + NewPipe is vrije software: ge kunt het gebruiken, bestuderen, delen en verbeteren zoveel als dat ge maar wilt. Ge kunt het terug uitgeven en/of aanpassen volgens de voorwaarden van de GNU General Public License, gepubliceerd door de Free Software Foundation, versie 3 van de licentie, of (indien gewenst) eender welke latere versie. Wild ge d’instellingen ook importeren? Privacybeleid van NewPipe From a64051e0f1283d4b5dc48e8443eb5f866b8ab1e0 Mon Sep 17 00:00:00 2001 From: AppSoft4 Date: Fri, 11 Jan 2019 12:59:06 +0000 Subject: [PATCH 150/207] Translated using Weblate (Ukrainian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-uk/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index b4a4be313..9a5612606 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,4 +1,4 @@ - + %1$s переглядів Опубліковано %1$s @@ -23,7 +23,7 @@ Вкажіть шлях для завантаження авдіофайлів Шлях де зберігатимуться завантажені відеозаписи - Тека для завантаженого авдіо + Тека для завантаженого аудіо Завантажені авдіофайли зберігатимуться тут Автоматично відтворювати Відтворює відеозапис коли NewPipe викликано з іншого застосунку @@ -32,7 +32,7 @@ Застосунок Kore не знайдено. Встановити? Відтворювати у Kodi Показувати опцію відтворення відеозапису за допомогою Kodi media center - Авдіо + Аудіо Типовий авдіоформат WebM — вільний формат M4A — ліпша якість @@ -45,7 +45,7 @@ Показати \"наступні\" й \"схожі\" відео Непідтримувальний URL Усталена мова контенту - Відео та авдіо + Відео та аудіо Зовнішній вигляд Інше Відтворення у тловому режимі @@ -100,7 +100,7 @@ Створити теку для завантаження \'%1$s\' Відео - Авдіо + Аудіо Повторити Використовувати старий програвач т @@ -487,4 +487,4 @@ Плейлисти Стежки Користувачі - + \ No newline at end of file From 11098afab569a47bfdd1cf8774ba7b595b68f056 Mon Sep 17 00:00:00 2001 From: DeadMetaler Date: Sat, 12 Jan 2019 23:13:59 +0000 Subject: [PATCH 151/207] Translated using Weblate (Belarusian) Currently translated at 86.7% (332 of 383 strings) --- app/src/main/res/values-be/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 6befd5395..34d1524aa 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1,4 +1,4 @@ - + Націсніце пошук, каб пачаць %1$s праглядаў Апублікавана %1$s @@ -6,7 +6,7 @@ Патокавы плэер не знойдзены (вы можаце ўсталяваць VLC). Усталяваць Скасаваць - Адкрыць у браўзэры + Адкрыць у браўзеры Адкрыць у асобным акне Падзяліцца Спампаваць @@ -463,4 +463,4 @@ Фонавы плэер Плэер у акне - + \ No newline at end of file From b1653b359ec63698a8d091b903304f59c0b5d0dc Mon Sep 17 00:00:00 2001 From: naofum Date: Mon, 14 Jan 2019 02:41:57 +0000 Subject: [PATCH 152/207] Translated using Weblate (Japanese) Currently translated at 84.3% (323 of 383 strings) --- app/src/main/res/values-ja/strings.xml | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 8b0031ee7..4f1b5b00d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1,4 +1,4 @@ - + %1$s に公開 動画プレイヤーが見つかりません。VLC を入手しますか? @@ -470,5 +470,22 @@ 何もしない バックグラウンドに変更 ポップアップに変更 - - + LeakCanary を有効にする + メモリリークの監視は、ヒープのダンピング時にアプリが無反応になる原因となります + ライフサイクルエラーの報告 + 破棄後のフラグメントまたはアクティビティライフサイクル外の到達不能RX例外を強制的に報告します + URL または ID を入力して SoundCloud プロファイルをインポートします: +\n +\n1. Web ブラウザーで \"デスクトップモード\" を有効にします (サイトは携帯デバイスで利用できません) +\n2. この URL に移動します: %1$s +\n3. 必要に応じてログインします +\n4. リダイレクトされたプロファイル URL をコピーします。 + あなたのID, soundcloud.com/あなたのid + この操作により通信料金が増えることがあることにご注意ください。 +\n +\n続行しますか\? + 再生速度制御 + リンク解除 (不備が生じる可能性があります) + 無音の間に早送り + ステップ + \ No newline at end of file From 6c5c42c2b5e5fd8fe2a6713fe1823dc2fdf3ceb7 Mon Sep 17 00:00:00 2001 From: Edwar Tikhonov Date: Mon, 14 Jan 2019 15:05:20 +0000 Subject: [PATCH 153/207] Translated using Weblate (Russian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 54 +++++++++++++------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 85359e18c..38032e4c0 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,4 +1,4 @@ - + %1$s просмотров Опубликовано %1$s @@ -11,21 +11,21 @@ Поиск Настройки Возможно, вы имели в виду: %1$s? - Поделиться с помощью + Поделиться в Выбрать браузер поворот Путь загрузки видео - Папка для хранения загруженных видео + Путь для сохранения загруженных видео Введите путь к папке для загрузки видео - Разрешение по умолчанию + Стандартное качество Воспроизвести в Kodi Приложение Kore не найдено. Установить его? - \"Воспроизвести в Kodi\" - Показать опцию воспроизведения через медиацентр Kodi + Показать \"Играть в Kodi\" опцию + Показать опцию воспроизведения через Kodi медиацентр Аудио - Формат аудио по умолчанию - WebM — свободный - M4A — выше качество + Стандартный формат аудио + WebM — свободный формат + M4A — лучше качество Скачать Следующее видео URL не поддерживается @@ -40,8 +40,8 @@ Миниатюра аватара пользователя Не понравилось Понравилось - Внешний видеоплеер - Внешний аудиоплеер + Использовать внешний видеоплеер + Использовать внешний аудиоплеер Воспроизведение в фоновом режиме Тема Тёмная @@ -52,10 +52,10 @@ Использовать Tor Путь загрузки аудио - Папка для хранения загруженных аудио + Загруженные аудио находятся тут Введите путь к папке для загрузки аудио - Начните с поиска + Нажмите поиск, чтобы начать Подождите… Файл уже существует Потоки @@ -79,7 +79,7 @@ Ошибка Ваш комментарий (English): Не удалось создать папку для загрузки \"%1$s\" - Автовоспроизведение + Автозапуск Воспроизводить видео при вызове NewPipe из другого приложения Контент Видео с возрастными ограничениями. Разрешить подобный контент можно в настройках @@ -125,10 +125,10 @@ В фоне В окне - Только некоторые устройства могут воспроизводить видео в 2K/4K - Формат видео по умолчанию + Только некоторые устройства поддерживают видео в 2K/4K + Стандартный формат видео Чёрная - Восстановить окно + Помнить размер и позицию \"В окне\" Изменять яркость и громкость жестами Всплывающее окно Воспроизведение во всплывающем окне @@ -148,20 +148,20 @@ \nвоспроизведения в окне reCAPTCHA - Открыть в отдельном окне + Открыть в режиме окна Отображать подсказки при поиске Позже Отключено Изменение размера - В некоторых разрешениях НЕ будет звука, если включено + Отключает звук в НЕКОТОРЫХ разрешениях  млн.  млрд.  тыс. - Разрешение очереди \"В окне\" - Запоминать размер и положение всплывающего окна + Качество видео \"В окне\" + Помнить последние размер и позицию \"В окне\" Варианты поиска Лучшее разрешение @@ -169,7 +169,7 @@ Запрос reCAPTCHA Запрошен ввод reCAPTCHA - Высокие разрешения + Показывать высокие разрешения NewPipe в окне О NewPipe Настройки @@ -325,14 +325,14 @@ Получение сведений… Загрузка запрошенного контента -Загрузка файла прямой трансляции - Показать сведения +Скачать файл прямой трансляции + Подробнее - Закладки + Сохранённые плейлисты Добавить к - Быстрый поиск позиции + Использовать быстрый, но неточный поиск Неточный поиск позволяет плееру искать позицию быстрее, но менее точно Автодополнение очереди Добавлять похожие потоки в очередь при воспроизведении последнего потока, если не включён повтор @@ -499,4 +499,4 @@ Фоновый плеер Плеер в окне - + \ No newline at end of file From 7564a4934432472efc649d2f6d8d014bfdb22183 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Fri, 18 Jan 2019 17:11:31 +0100 Subject: [PATCH 154/207] fix decrypt error once again --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 78ac4f3e3..abb455e70 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,7 +54,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.TeamNewPipe:NewPipeExtractor:91b1efc97e' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:99915e4527c0' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' From 880a176e657d9f4cf82109bd4335161ffc5c431b Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Fri, 18 Jan 2019 20:34:43 +0100 Subject: [PATCH 155/207] move on to version 0.15.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 78ac4f3e3..52c7ca78b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "org.schabi.newpipe" minSdkVersion 19 targetSdkVersion 28 - versionCode 69 - versionName "0.14.2" + versionCode 70 + versionName "0.15.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true From 8c9492669379b15bbd05bc0957f9a872828d43a0 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Fri, 18 Jan 2019 20:46:50 +0100 Subject: [PATCH 156/207] move on to version 0.15.0 --- .github/CONTRIBUTING.md | 2 +- app/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 574c87ad3..873c1780f 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -19,7 +19,7 @@ hasn't been reported/requested before * We use English for development. Issues in other languages will be closed and ignored. * Please only add *one* issue at a time. Do not put multiple issues into one thread. * When reporting a bug please give us a context, and a description how to reproduce it. -* Issues that only contain a generated bug report, but no describtion might be closed. +* Issues that only contain a generated bug report, but no description might be closed. ## Bug Fixing * If you want to help NewPipe to become free of bugs (this is our utopic goal for NewPipe), you can send us an email to diff --git a/app/build.gradle b/app/build.gradle index 52c7ca78b..bb993cca0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,7 +54,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.TeamNewPipe:NewPipeExtractor:91b1efc97e' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:99915e4527c0' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' From 2ae99afa211cc28139e7275234b918ad1d13d703 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Fri, 18 Jan 2019 21:13:04 +0100 Subject: [PATCH 157/207] add changelog for version v0.15.0 --- .../metadata/android/en-US/changelogs/70.txt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/70.txt diff --git a/fastlane/metadata/android/en-US/changelogs/70.txt b/fastlane/metadata/android/en-US/changelogs/70.txt new file mode 100644 index 000000000..755fc3469 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/70.txt @@ -0,0 +1,25 @@ +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? ¯\_(ツ)_/¯ + +### 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 From 22bfbe96c8e1c4409ca3c34a8bcaeb7cfd5e9b7c Mon Sep 17 00:00:00 2001 From: philSism Date: Thu, 17 Jan 2019 23:17:17 +0000 Subject: [PATCH 158/207] Translated using Weblate (Greek) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-el/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 38fd91bb8..4e06638ec 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -157,7 +157,7 @@ Προστέθηκε στη λίστα αναπαραγωγής παρασκηνίου Προστέθηκε στη λίστα αναπαραγωγής αναδυόμενου παραθύρου Περιεχόμενο - Εμφάνιση περιεχομένου περιορισμένης πρόσβασης + Περιεχόμενο περιορισμένης ηλικίας Βίντεο περιορισμένης πρόσβασης. Για να επιτρέπετε περιερχόμενο τέτοιου είδους, ενεργοποιήστε το στις \"Ρυθμίσεις\". ΖΩΝΤΑΝΑ Αναφορά σφαλμάτων @@ -263,7 +263,7 @@ Δημιουργία Διαγραφή ενός Διαγραφή όλων - Checksum + Άθροισμα ελέγχου Αγνόηση Μετονομασία @@ -282,7 +282,7 @@ \nτο άνοιγμα αναδυόμενων παραθύρων 1 αντικείμενο διαγράφηκε. - reCAPTCHA + Αυτόματο τεστ Πρόκληση reCAPTCHA Ζητήθηκε πρόκληση reCAPTCHA @@ -407,7 +407,7 @@ Ενεργοποίηση του LeakCanary Η παρακολούθηση των διαρροών μνήμης μπορεί να προκαλέσει την διακοπή της εφαρμογής - + Υποχρεωτική αναφορά μη παραδοτέων Rx εξαιρέσεων έξω από το κομμάτι ή τον κύκλο δραστηριότητας μετά από απόρριψη Εισαγωγή/Εξαγωγή Εισαγωγή From 44d2744a8c24985c059bfdaa1ce2455550918ee1 Mon Sep 17 00:00:00 2001 From: Roberto Palenga Date: Thu, 17 Jan 2019 08:01:12 +0000 Subject: [PATCH 159/207] Translated using Weblate (Italian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-it/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 55112098d..22c8203b1 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,4 +1,4 @@ - + %1$s visualizzazioni Pubblicato il %1$s @@ -10,7 +10,7 @@ Scarica Cerca Impostazioni - Intendevi %1$s? + Intendevi: %1$s\? Condividi con Scegli il browser rotazione @@ -505,4 +505,4 @@ Playlist Tracce Utenti - + \ No newline at end of file From fec7672598107c0894926a65ebf25a8bbb063d53 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Sat, 19 Jan 2019 15:26:31 +0530 Subject: [PATCH 160/207] updated extractor for url decryption fix --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index c340595e1..3c80c6e7e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,7 +54,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.yausername:NewPipeExtractor:c77050d' + implementation 'com.github.yausername:NewPipeExtractor:25ed9de' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' From ac8430cbbacbe4528b6ee4a67f553a53125b2582 Mon Sep 17 00:00:00 2001 From: Igor Nedoboy Date: Sat, 19 Jan 2019 22:59:27 +0000 Subject: [PATCH 161/207] Translated using Weblate (Russian) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-ru/strings.xml | 32 +++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 38032e4c0..1113798e2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -20,10 +20,10 @@ Стандартное качество Воспроизвести в Kodi Приложение Kore не найдено. Установить его? - Показать \"Играть в Kodi\" опцию - Показать опцию воспроизведения через Kodi медиацентр + \"Воспроизвести в Kodi\" + Показать опцию воспроизведения через медиацентр Kodi Аудио - Стандартный формат аудио + Формат аудио по умолчанию WebM — свободный формат M4A — лучше качество Скачать @@ -40,8 +40,8 @@ Миниатюра аватара пользователя Не понравилось Понравилось - Использовать внешний видеоплеер - Использовать внешний аудиоплеер + Внешний видеоплеер + Внешний аудиоплеер Воспроизведение в фоновом режиме Тема Тёмная @@ -52,10 +52,10 @@ Использовать Tor Путь загрузки аудио - Загруженные аудио находятся тут + Папка для хранения загруженных аудио Введите путь к папке для загрузки аудио - Нажмите поиск, чтобы начать + Начните с поиска Подождите… Файл уже существует Потоки @@ -79,7 +79,7 @@ Ошибка Ваш комментарий (English): Не удалось создать папку для загрузки \"%1$s\" - Автозапуск + Автовоспроизведение Воспроизводить видео при вызове NewPipe из другого приложения Контент Видео с возрастными ограничениями. Разрешить подобный контент можно в настройках @@ -126,9 +126,9 @@ В окне Только некоторые устройства поддерживают видео в 2K/4K - Стандартный формат видео + Формат видео по умолчанию Чёрная - Помнить размер и позицию \"В окне\" + Восстановить окно Изменять яркость и громкость жестами Всплывающее окно Воспроизведение во всплывающем окне @@ -155,12 +155,12 @@ Отключено Изменение размера - Отключает звук в НЕКОТОРЫХ разрешениях + В некоторых разрешениях НЕ будет звука, если включено  млн.  млрд.  тыс. - Качество видео \"В окне\" + Разрешение очереди \"В окне\" Помнить последние размер и позицию \"В окне\" Варианты поиска Лучшее разрешение @@ -169,7 +169,7 @@ Запрос reCAPTCHA Запрошен ввод reCAPTCHA - Показывать высокие разрешения + Высокие разрешения NewPipe в окне О NewPipe Настройки @@ -326,13 +326,13 @@ Получение сведений… Загрузка запрошенного контента Скачать файл прямой трансляции - Подробнее + Показать сведения - Сохранённые плейлисты + Закладки Добавить к - Использовать быстрый, но неточный поиск + Быстрый поиск позиции Неточный поиск позволяет плееру искать позицию быстрее, но менее точно Автодополнение очереди Добавлять похожие потоки в очередь при воспроизведении последнего потока, если не включён повтор From 43e4fbfcd0e146413c45e4b03b9d0664f08e86f4 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 20 Jan 2019 14:23:41 +0100 Subject: [PATCH 162/207] fix livestream issue, and move on to v0.15.1 --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bb993cca0..7bcd9d38a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "org.schabi.newpipe" minSdkVersion 19 targetSdkVersion 28 - versionCode 70 - versionName "0.15.0" + versionCode 71 + versionName "0.15.1" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -54,7 +54,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.TeamNewPipe:NewPipeExtractor:99915e4527c0' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:f7c7b9df1a' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' From d02dce556202109e6780eaff5d747d9e1cef671d Mon Sep 17 00:00:00 2001 From: Keegan Given <32858528+gkeegan@users.noreply.github.com> Date: Mon, 21 Jan 2019 02:35:39 +0000 Subject: [PATCH 163/207] Add updating section to README This will help cull the number of "how to update?" Issues whenever we need to push out a fix, like how recently NewPipe got completely broken. This attempts to be an all-inclusive guide to updating NewPipe. If there are any (clean/official) links to additional info, please comment them and I will add it. Also let me know if this section should be relocated within the README. I figured it would be best to keep it up top, so people see it right away, and then don't make a new Issue. --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index 15ba3d04b..79fb18eb5 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,20 @@ WARNING: PUTTING NEWPIPE OR ANY FORK OF IT INTO GOOGLE PLAYSTORE VIOLATES THEIR TERMS OF CONDITIONS. +## Updates +When a change to the NewPipe code occurs (due to either adding features or bug fixing), eventually a release will occur. These are in the format x.xx.x . In order to get this new version, you can: + * Build a debug APK yourself. This is the fastest way to get new features on your device, but is much more complicated, so we recommend using one of the other methods. + * Download the APK from [releases](https://github.com/TeamNewPipe/NewPipe/releases) and install it. + * Update via F-droid. This is the slowest method of getting updates, as F-Droid must recognize changes, build the APK itself, sign it, then push the update to users. + +When you install an APK from one of these options, it will be incompatible with an APK from one of the other options. This is due to different signing keys being used. Signing keys help ensure that a user isn't tricked into installing a malicious update to an app, and are independent. F-Droid and GitHub use different signing keys, and building an APK debug excludes a key. + +If you want to switch sources for some reason (e.g. NewPipe's core functionality was broken and F-Droid doesn't have the update yet), we recommend following this procedure: +1. Back up your data via "Settings>Content>Export Database" so you keep your history, subscriptions, and playlists +2. Uninstall NewPipe +3. Download the APK from the new source and install it +4. Import the data from step 1 via "Settings>Content>Import Database" + ## Screenshots [](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) From f97cb821f85019f321fd1f850cd366ff91c8f613 Mon Sep 17 00:00:00 2001 From: Keegan Given <32858528+gkeegan@users.noreply.github.com> Date: Mon, 21 Jan 2019 21:55:45 +0000 Subject: [PATCH 164/207] Update README.md Move Updates underneath Coming Features. Make it linkable. --- README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 79fb18eb5..019ced085 100644 --- a/README.md +++ b/README.md @@ -12,26 +12,12 @@


-

ScreenshotsDescriptionFeaturesContributionDonateLicense

+

ScreenshotsDescriptionFeaturesUpdatesContributionDonateLicense

WebsiteBlogPress


WARNING: PUTTING NEWPIPE OR ANY FORK OF IT INTO GOOGLE PLAYSTORE VIOLATES THEIR TERMS OF CONDITIONS. -## Updates -When a change to the NewPipe code occurs (due to either adding features or bug fixing), eventually a release will occur. These are in the format x.xx.x . In order to get this new version, you can: - * Build a debug APK yourself. This is the fastest way to get new features on your device, but is much more complicated, so we recommend using one of the other methods. - * Download the APK from [releases](https://github.com/TeamNewPipe/NewPipe/releases) and install it. - * Update via F-droid. This is the slowest method of getting updates, as F-Droid must recognize changes, build the APK itself, sign it, then push the update to users. - -When you install an APK from one of these options, it will be incompatible with an APK from one of the other options. This is due to different signing keys being used. Signing keys help ensure that a user isn't tricked into installing a malicious update to an app, and are independent. F-Droid and GitHub use different signing keys, and building an APK debug excludes a key. - -If you want to switch sources for some reason (e.g. NewPipe's core functionality was broken and F-Droid doesn't have the update yet), we recommend following this procedure: -1. Back up your data via "Settings>Content>Export Database" so you keep your history, subscriptions, and playlists -2. Uninstall NewPipe -3. Download the APK from the new source and install it -4. Import the data from step 1 via "Settings>Content>Import Database" - ## Screenshots [](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) @@ -87,6 +73,20 @@ NewPipe does not use any Google framework libraries, nor the YouTube API. Websit * Show comments * … and many more +## Updates +When a change to the NewPipe code occurs (due to either adding features or bug fixing), eventually a release will occur. These are in the format x.xx.x . In order to get this new version, you can: + * Build a debug APK yourself. This is the fastest way to get new features on your device, but is much more complicated, so we recommend using one of the other methods. + * Download the APK from [releases](https://github.com/TeamNewPipe/NewPipe/releases) and install it. + * Update via F-droid. This is the slowest method of getting updates, as F-Droid must recognize changes, build the APK itself, sign it, then push the update to users. + +When you install an APK from one of these options, it will be incompatible with an APK from one of the other options. This is due to different signing keys being used. Signing keys help ensure that a user isn't tricked into installing a malicious update to an app, and are independent. F-Droid and GitHub use different signing keys, and building an APK debug excludes a key. + +If you want to switch sources for some reason (e.g. NewPipe's core functionality was broken and F-Droid doesn't have the update yet), we recommend following this procedure: +1. Back up your data via "Settings>Content>Export Database" so you keep your history, subscriptions, and playlists +2. Uninstall NewPipe +3. Download the APK from the new source and install it +4. Import the data from step 1 via "Settings>Content>Import Database" + ## Contribution Whether you have ideas, translations, design changes, code cleaning, or real heavy code changes, help is always welcome. The more is done the better it gets! From 5d14dca81804ff1dd209f54a738d5478f5ca78b2 Mon Sep 17 00:00:00 2001 From: Keegan Given <32858528+gkeegan@users.noreply.github.com> Date: Mon, 21 Jan 2019 22:21:24 +0000 Subject: [PATCH 165/207] Add link to #1981 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 019ced085..0d615f43c 100644 --- a/README.md +++ b/README.md @@ -79,9 +79,9 @@ When a change to the NewPipe code occurs (due to either adding features or bug f * Download the APK from [releases](https://github.com/TeamNewPipe/NewPipe/releases) and install it. * Update via F-droid. This is the slowest method of getting updates, as F-Droid must recognize changes, build the APK itself, sign it, then push the update to users. -When you install an APK from one of these options, it will be incompatible with an APK from one of the other options. This is due to different signing keys being used. Signing keys help ensure that a user isn't tricked into installing a malicious update to an app, and are independent. F-Droid and GitHub use different signing keys, and building an APK debug excludes a key. +When you install an APK from one of these options, it will be incompatible with an APK from one of the other options. This is due to different signing keys being used. Signing keys help ensure that a user isn't tricked into installing a malicious update to an app, and are independent. F-Droid and GitHub use different signing keys, and building an APK debug excludes a key. The signing key issue is being discussed in issue [#1981](https://github.com/TeamNewPipe/NewPipe/issues/1981), and may be fixed by setting up our own repository on F-Droid. -If you want to switch sources for some reason (e.g. NewPipe's core functionality was broken and F-Droid doesn't have the update yet), we recommend following this procedure: +In the meanwhile, if you want to switch sources for some reason (e.g. NewPipe's core functionality was broken and F-Droid doesn't have the update yet), we recommend following this procedure: 1. Back up your data via "Settings>Content>Export Database" so you keep your history, subscriptions, and playlists 2. Uninstall NewPipe 3. Download the APK from the new source and install it From 22a5e72470ad666f01a96bfa508712deb0cebfc5 Mon Sep 17 00:00:00 2001 From: Tobias Groza Date: Mon, 21 Jan 2019 22:23:32 +0000 Subject: [PATCH 166/207] Translated using Weblate (Romanian) Currently translated at 72.1% (276 of 383 strings) --- app/src/main/res/values-ro/strings.xml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 022d0482e..f0f5560d9 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -1,4 +1,4 @@ - + %1$s vizionări Încărcat pe %1$s @@ -10,7 +10,7 @@ Descărcare Căutare Setări - V-ați referit la: %1$s ? + V-ați referit la: %1$s\? Partajează cu Alegeți browser-ul rotație @@ -188,7 +188,7 @@ pentru a deschide în mod pop-up
Istoric de căutări Stochează local căutările - Istoric + Istoric și cache Reține videoclipurile vizionate Reluați la refocalizare Continuă redarea după întreruperi (ex. după apeluri) @@ -391,4 +391,6 @@ pentru a deschide în mod pop-up Import fișier Controlul vitezei de redare implicit - + Canale + Utilizatori + \ No newline at end of file From a5828c79498755b6dc451d2f13e514360fc27a59 Mon Sep 17 00:00:00 2001 From: qazaxtan Date: Tue, 22 Jan 2019 01:31:18 +0000 Subject: [PATCH 167/207] Translated using Weblate (Romanian) Currently translated at 72.1% (276 of 383 strings) --- app/src/main/res/values-ro/strings.xml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index f0f5560d9..b93f0dd46 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -40,17 +40,17 @@ Luminos Descărcați - Următorul videoclip + Următorul Arată videoclipurile care urmează URL nesuportat Limba dorită a conținutului - Video & Audio + Video și audio Aspect Altele Redare în fundal Redați Conținut - Arată conținutul restricționat în funcție de vârstă + Conținut restricționat în funcție de vârstă Videoclipul este restricționat în funcție de vârstă. Permiterea vizionării este posibilă din Setări. Eroare @@ -75,7 +75,7 @@ Nu s-a putut crea directorul de descărcare \'%1$s\' Apăsați căutare pentru a începe Redare automată - Redă automat un videoclip atunci când NewPipe este deschis din altă aplicație + Redă un videoclip atunci când NewPipe este deschis din altă aplicație În direct Descărcări Descărcări @@ -194,7 +194,7 @@ pentru a deschide în mod pop-up Continuă redarea după întreruperi (ex. după apeluri) Player Comportament - Istoric & Cache + Istoric și cache Playlist Anulează @@ -276,8 +276,8 @@ pentru a deschide în mod pop-up Serviciu Adăugat în player de fundal Adăugat în player pop-up - Niciun player pentru streaming găsit. (Totuși, puteți instala VLC) - Descărcați fișierul de streaming. + Niciun player pentru streaming găsit. (Totuși, puteți instala VLC). + Descărcați fișierul de streaming Arată informații Marcaje @@ -288,13 +288,13 @@ pentru a deschide în mod pop-up Derularea inexactă permite player-ului să îl poziţionezi mai rapid dar cu o precizie mai redusă. Încarcă miniaturi Dezactivați pentru a opri încărcarea și salvarea tuturor thumbnail-urilor, pentru a economisi consumul de date și de memorie. Schimbarea acestei opțiuni va curăța tot cache-ul din memorie și de pe disc. - + Cache-ul de imagini a fost curățat Șterge cache-ul pentru metadata Șterge cache-ul pentru datele de pagini web Cache pentru metadata șters Adaugă următorul stream în coadă automat Adaugă automat un stream asociat când redarea începe pe ultimul stream într-o coadă non-repetitivă. - Arată sfatul Țineți apăsat pentru a adăuga + Arată sfatul „Țineți apăsat pentru a adăuga” Arată sfatul când butonul de background sau de popup este apăsat în pagina de informații a videoclipului Țara implicită pentru conținut Debug @@ -393,4 +393,6 @@ pentru a deschide în mod pop-up implicit Canale Utilizatori + Playlist-uri + Titluri \ No newline at end of file From 50f7b72b09d55bca9c62641bb836a5d5fb509fd9 Mon Sep 17 00:00:00 2001 From: thami simo Date: Sun, 20 Jan 2019 18:51:49 +0000 Subject: [PATCH 168/207] Translated using Weblate (Arabic) Currently translated at 93.2% (357 of 383 strings) --- app/src/main/res/values-ar/strings.xml | 60 +++++++++++++------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 27c2309f6..7a1e23746 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1,4 +1,4 @@ - + يتم التشغيل في الخلفية إلغاء @@ -14,7 +14,7 @@ تنزيل تنزيل أدخل مسار تنزيل الملفات الصوتية - مسار حفظ التنزيلات الصوتية + يتم تخزين الصوت الذي تم تنزيله هنا مسار مجلد الصوتيات المحفوظة أدخل مسار التنزيل لملفات الفيديو مسار حفظ تنزيلات الفيديو في @@ -27,7 +27,7 @@ صور معاينة الفيديو جودة أفضل — M4A خطأ في الشبكة - الفيديو التالي + التالى لا يوجد مشغل فيديو. هل تريد تثبيت VLC ؟ افتح في المتصفح الصوت @@ -39,15 +39,15 @@ الإعدادات المظهر اخرى - الفيديو والصوتيات + الفيديو & الصوتيات مشاركة مشاركة بواسطة - عرض الفديوهات \'التالية\'و\'المماثلة\' + عرض مقاطع الفيديو \"التالية\" و \"شبيه\" عرض خيار لتشغيل الفيديو بواسطة مشغل كودي عرض خيار التشغيل بواسطة كودي السمة تم النشر يوم %1$s - الرابط غير مدعوم + رابط غير معتمد URL استخدام مشغل صوت خارجي استخدام مشغل فيديو خارجي (إختبارية) إجراء التنزيلات من خلال استخدام بروكسي Tor لزيادة الخصوصية ( تشغيل الفيديو المباشر غير مدعوم حتى الأن ). @@ -55,7 +55,7 @@ "مشاهدة %1$s" تنسيق حر — WebM تم حجبه بواسطة GEMA - المحتوى غير متاح + محتوى غير متوفر تعذرت عملية تحميل كافة صور المعاينة خطأ تعذرت عملية تحليل الموقع @@ -72,7 +72,7 @@ تشغيل تلقائي اسود التاريخ وذاكرة التخزين المؤقت - التاريخ و التخزين المؤقت + التاريخ & ذاكرة التخزين المؤقت المحتوى التنزيلات التنزيلات @@ -85,7 +85,7 @@ التاريخ التاريخ افتح في وضع النافذة المنبثقة - "بعض الخيارات الدقة لن تحتوي على صوت عند تمكين هذا الخيار " + يزيل الصوت في بعض القرارات وضع النوافذ المنبثقة NewPipe تم إلغاء الاشتراك في القناة تعذر تغيير حالة الاشتراك @@ -109,7 +109,7 @@ تتبع مقاطع الفيديو التي تمت مشاهدتها استئناف عند اكتساب التركيز متابعة التشغيل بعد المقاطعات (مثل المكالمات الهاتفية) - عرض تلميح \"اضغط للتجاهل\" + إظهار التلميحات \"اضغط للتجاهل\" عرض تلميح على صفحة التفاصيل عند استخدام وضع مشغل الخلفية أو النافذة المنبثقة المشغل السلوك @@ -117,9 +117,9 @@ يتم التشغيل في الوضع المنبثق تم وضعه على قائمة الانتظار في مشغل الخلفية تم وضعه على قائمة الانتظار في مشغل النافذة المنبثقة - عرض المحتوى المقيّد بحسب العُمر - فيديو مقيد بحسب العمر. السماح بهذا المحتوى ممكن عن طريق الإعدادات. - مباشر + محتوى مقيد بحسب العمر + "إظهار الفيديو المقيد بحسب العمر. يمكن السماح باستخدام هذه المواد من \"الإعدادات\"." + بث مباشر تقرير الخطأ قائمة التشغيل نعم @@ -134,13 +134,13 @@ تشغيل الكل تنبيهات NewPipe - التنبيهات لمشغل NewPipe للخلفية والنوافذ المنبثقة + تنبيهات مشغل NewPipe للخلفية والنوافذ المنبثقة [غير معروف] لا يمكن تحليل الموقع بشكل كلي تعذرت عملية إعداد قائمة التنزيل - هذا بث مباشر، وهو غير معتمد الآن. + لبث المباشر غير مدعوم حتى الآن تعذر الحصول على أي بث تعذرت عملية تحميل الصورة تعطل التطبيق / واجهة المستخدم @@ -162,7 +162,7 @@ الإبلاغ عن خطأ تقرير المستخدم لم يتم العثور على نتائج - لا شيء هنا غير صراصير الليل + لا شيء هنا غير الصراصير الصوت إعادة المحاولة @@ -198,7 +198,7 @@ اسم الملف التقسيم الخطأ - الخادم غير معتمد + خادم غير مدعوم الملف موجود مسبقا العنوان غير صحيح أو الإنترنت غير متوفر يقوم نيوبايب بالتنزيل @@ -262,7 +262,7 @@ الإعدادات الصوتية تشغيل هنا تشغيل هنا في وضع النافذة المنبثقة -تحدي ريكابتشا +تحدي الكابتشا اضغط للإدراج في قائمة الانتظار بدون مشاهدات @@ -282,7 +282,7 @@ %s فيديوهات - إعادة طلب كلمة التحقق + طلب اختبار الكابتشا مطلوب © %1$sبواسطة%2$sتحت%3$s صفحة الكشك @@ -305,10 +305,10 @@ مرة واحدة فقط العنوان خاطئ - لم يتم العثور على مشغل الفديو (يمكنك تثبيت VLC لتشغيله) + لم يتم العثور على مشغل تدفق (يمكنك تثبيت VLC وتشغيله). استيراد قاعدة البيانات تصدير قاعدة البيانات - "سيقوم بالكتابة على سجل التاريخ والاشتراكات الحالية " + "الكتابة فوق سجل التاريخ والاشتراكات الحالية " تصدير السجل، الإشتراكات وقوائم التشغيل عرض المعلومات @@ -368,8 +368,8 @@ تم إفراغ مساحة ذاكرة التخزين المؤقتة الخاصة بالصور الملف - مجلد غير صالح - لا يمكن ترك إسم الملف فارغا + لا يوجد مثل هذا المجلد + لا يمكن أن يكون اسم الملف فارغا طرأ هناك خطأ: %1$s ملف مضغوط ZIP غير صالح إزالة الفواصل المرجعية @@ -389,12 +389,12 @@ "معرفك , soundcloud.com/ الخاص بك " إفتراضي -تعطيل إيقاف جميع الصور المصغرة من تحميل البيانات واستخدام الذاكرة وحفظها. سيؤدي التغيير هذا إلى محو-ذاكرة التخزين المؤقت في الذاكرة-وذاكرة على القرص +عند إيقاف تحميل أي صور مصغرة ، وتوفير البيانات واستخدام الذاكرة. تعمل التغييرات على محو ذاكرة التخزين المؤقت للصورة الموجودة على الذاكرة أو على القرص. امسح البيانات الوصفية المخزنة مؤقتًا إزالة جميع بيانات صفحات الويب المخزنة مؤقتًا تم محو ذاكرة التخزين المؤقت للبيانات الوصفية وضع البث القادم تلقائيا في قائمة الإنتظار - رفض البث المشابه في حال كون البث السابق يعمل في حالة عدم التكرار + رفض التدفق-التلقائي المشابه في حال كان التدفق السابق يعمل في-حالة عدم التكرار. إضافة صورة مصغرة إلى قائمة التشغيل تفضيل قائمة التشغيل @@ -412,15 +412,15 @@ محو سجل المشاهدة احذف سِجل الفيديوهات التي تم تشغيلها - حذف سجل المشاهدة بالكامل. + حذف سجل المشاهدة بالكامل\? تم حذف سجل المشاهدة. محو سجل البحث يحذف تاريخ البحث عن الكلمات الرئيسية - حذف سِجل البحث بالكامل. + حذف سِجل البحث بالكامل\? تم حذف سجل البحث. المشغل الخارجي لا يدعم هذه الأنواع من الروابط - ملف غير صالح / محتوى غير صالح - الملف غير موجود أو ليس لديك الإذن الكافي للقراءة أو الكتابة فيه + لا يوجد مثل هذا الملف/مصدر المحتوى + الملف غير موجود أو الإذن بالقراءة أو الكتابة إليه غير موجود لا يوجد بث متاح للتنزيل تم حذف عنصر واحد. @@ -492,4 +492,4 @@ قوائم التشغيل المسارات المستخدمين - + \ No newline at end of file From 30e0ccc77b9c024a29b50f2e80cc4809dbe451e9 Mon Sep 17 00:00:00 2001 From: YONGLE Date: Mon, 21 Jan 2019 05:48:25 +0000 Subject: [PATCH 169/207] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-cmn/strings.xml | 337 ++++++++++++++++++++++-- 1 file changed, 315 insertions(+), 22 deletions(-) diff --git a/app/src/main/res/values-cmn/strings.xml b/app/src/main/res/values-cmn/strings.xml index 28ad465b9..51c5dc34e 100644 --- a/app/src/main/res/values-cmn/strings.xml +++ b/app/src/main/res/values-cmn/strings.xml @@ -1,26 +1,26 @@ - + 点击搜索按钮即可开始使用 %1$s 次观看 发布于 %1$s - 找不到流媒体播放器。您想安装 VLC 吗? - 找不到流媒体播放器(您可以安装 VLC 来播放) + 找不到媒体播放器。您要安装 VLC 吗? + 找不到媒体播放器(您可以安装 VLC 来播放)。 安装 取消 在浏览器中打开 在悬浮窗模式下打开 分享 下载 - 下载流媒体文件。 + 下载媒体文件 搜索 设置 - 您是不是要找: %1$s ? + 您是不是要找:%1$s? 分享至 选择浏览器 旋转 使用外部视频播放器 - 启用此选项时,某些分辨率将不会有音频 + 删除某些分辨率下的音频 使用外部音频播放器 - NewPipe弹出模式 + NewPipe 悬浮窗模式 订阅 订阅 取消订阅成功 @@ -30,26 +30,26 @@ 主页 订阅 - 书签 + 已添加书签到播放列表 新功能 - 后台 - 弹出窗口 + 转到后台 + 悬浮窗 添加到 视频下载路径 储存视频文件的路径 输入视频的下载地址 - 音频下载路径 - 储存音频的路径 + 音频下载的路径 + 下载音频的储存路径 输入音频的下载路径 自动播放 NewPipes被其它程序调用时播放视频 默认分辨率 - 默认弹出窗口分辨率 + 默认悬浮窗分辨率 显示更高的分辨率 只有部分设备支持播放 2K/4K 视频 用 Kodi 播放 @@ -63,11 +63,11 @@ 亮色 酷黑 黑色 - 记住弹出窗口的尺寸与位置 + 记住悬浮窗的尺寸与位置 M4A — 更好的音质 - 记住上一次弹出窗口的位置以及大小 + 记住上一次悬浮窗的位置以及大小 已清除图像缓存 - 最小化弹出播放器 + 最小化悬浮窗播放器 清除观看历史 已删除搜索历史 @@ -87,7 +87,7 @@ 错误 \n - 服务器无法支持 + 不支持的服务器 文件已存在 NewPipe 下载中 请稍等… @@ -103,9 +103,9 @@ 打开网页 删除书签 - 请问你要删除这个列表吗? + 确定要删除该播放列表吗? 已创建播放列表 - 已加入播放列表 + 播放列表 步骤 重置 @@ -117,9 +117,9 @@ 没有限制 使用移动数据时的解析度限制 最小化应用程序切换 - 从主视频播放器切换到其他应用程序时的操作 - %s + 从主视频播放器切换到其他应用时的操作 - %s 没有 - 最小化背景播放器 + 最小化后台播放 WebM — 自由视频格式 使用快速粗略定位 粗略定位功能允许播放器以略低的精确度为代价换取更快的定位速度 @@ -127,4 +127,297 @@ 清除缓存的元数据 移除所有缓存的网页数据 已清除缓存的元数据 - + 不加载缩略图时,可以节省数据和存储空间。更改后将清除存储空间和扩展空间的缓存。 + 自动排列下一个媒体 + 在非重复排列中播放最后一个媒体时,自动推荐相关媒体。 + 玩家手势控制 + 使用手势控制播放器的亮度和音量 + 搜索建议 + 搜索时显示建议 + 搜索历史记录 + 在本地存储搜索 + 历史记录和缓存数据 + 记录观看过的视频 + 取得视窗焦点时继续播放 + 在被打断后继续播放(例如有来电) + 下载 + 下一部 + 显示「下一部」及「相关」的视频 + 显示「长按以新增」的提示 + 在视频详细信息页按下后台播放或悬浮窗按钮时提示 + 不支持该网址 + 默认内容的国家 + 服务 + 默认内容的语言 + 播放器 + 行为 + 视频与音频 + 历史记录和缓存数据 + 悬浮窗 + 外观 + 其他 + 调试 + 在后台播放 + 在悬浮窗下播放 + 已添加到后台播放队列 + 已添加到悬浮窗播放队列 + 播放 + 内容 + 年龄限制内容 + 显示有年龄限制的视频。可以从「设置」中允许该内容。 + 直播 + 下载 + 下载 + 错误报告 + 所有 + 频道 + 频道 + 播放列表 + 播放列表 + 曲目 + 用户 + 是的 + 稍等 + 不适用 + 过滤 + 刷新 + 清除 + 调整 + 最佳分辨率 + 复原 + 全部播放 + 总是 + 仅一次 + 文件 + NewPipe 通知 + NewPipe 后台播放和悬浮窗播放的通知 + [未知] + 切换方向 + 切换到后台 + 切换到悬浮窗 + 切换到首页 + 导入数据库 + 导出数据库 + 覆盖您当前的历史记录和订阅 + 导出历史记录、订阅和播放列表 + 删除播放过的媒体历史记录 + 确定要清除所有观看历史记录吗? + 观看历史记录已清除。 + 清除搜索历史记录 + 清除搜索关键词的历史记录 + 确定要清除所有搜索历史记录吗? + 无法加载所有缩略图 + 无法解析视频网址签名 + 无法解析网站 + 无法完全解析网站 + 内容不可用 + 内容被 GEMA 封锁 + 无法设置下载菜单 + 目前还不支持观看直播 + 无法获得任何媒体 + 无法加载图片 + 应用程序或界面出现崩溃了 + 无法播放此媒体 + 发生了无法恢复的播放器错误 + 正在从播放器错误中恢复 + 外部播放器不支持此类型的链接 + 无效的网址 + 找不到视频串流 + 找不到音频串流 + 无效的文件夹 + 无效的文件/内容来源 + 该文件不存在或缺少读写权限 + 文件名不能为空 + 发生错误:%1$s + 没有可供下载的串流 + 抱歉,这不应该发生的。 + 通过电子邮件报告错误 + 抱歉,发生了一些错误。 + 报告 + 信息: + 发生了什么: + 事件:\\n请求:\\n内容语言:\\n服务:\\nGMT 时间:\\n组件:\\n版本:\\n系统版本: + 您的评论(请用英语): + 详细: + 视频预览缩略图 + 视频预览缩略图 + 上传者的头像缩略图 + 喜欢 + 不喜欢 + 使用 Tor + (实验性)通过 Tor 强制下载流量以增加隐私(暂不支持视频媒体)。 + 用户报告 + 这里什么都没有 + 拖动以重新排序 + 无法创建下载目录「%1$s」 + 已成功创建下载目录「%1$s」 + 视频 + 音频 + 重试 + 手机存储访问权限被拒绝 + 使用旧的播放器 + 旧的内置 Mediaframework 播放器 + + + 亿 + 没有订阅者 + + %s 位订阅者 + + + 无观看次数 + + %s 次观看 + + + 没有视频 + + %s 部视频 + + + 删除 + 校验 + 退出 + 重命名 + 文件名 + 线程 + 错误的网址或网络不可用 + 点按以查看详细信息 + 复制到剪贴板 + 请选择下载文件夹 + 在悬浮窗模式打开 +\n需要此权限 + 已删除一个项目。 + reCAPTCHA + reCAPTCHA 验证 + 需完成 reCAPTCHA 验证 + 下载 + 文件名中允许的字符 + 无效字符将替换为该值 + 替换字符 + © %1$s 由 %2$s 使用 %3$s 版权所有 + 无法加载许可证 + 关于 + 贡献者 + 许可证 + 安卓上开源且轻便的媒体播放器。 + 贡献 + 您是否有想法帮助我们:翻译、界面设计、代码优化以及真正繁重的功能扩展 - 我们随时欢迎您提供帮助。让 NewPipe 越变越好! + 在 GitHub 上查看 + 捐赠 + NewPipe 由社区人员维护和开发额,他们耗费时间务求为您带来最佳体验。现在是时候回过头来,让我们的开发人员能够在使 NewPipe 更加完美的同时,享受一杯咖啡。 + 回馈 + 网站 + 访问 NewPipe 网站了解更多信息和新闻。 + NewPipe 的隐私政策 + NewPipe 项目是非常重视您的隐私。因此,未经您的同意,该应用程序不会收集任何数据。 +\nNewPipe 的隐私政策详细说明了当您发送崩溃报告时,什么资料会被传送及储存。 + 阅读隐私政策 + NewPipe 的许可证 + NewPipe 是一个 Copyleft 的自由软件:您可以随意使用、研究、分享或改进它。在遵守由自由软件基金会所发布的 GNU 通用公共授权条款的状况下,您可以自由地再发布或修改它;授权条款预设使用第三版,但您也可以选择更新的版本。 + 阅读许可证 + 历史记录 + 搜索 + 观看 + 历史记录被关闭了 + 历史记录 + 没有历史记录 + 清除历史记录 + 项目已删除 + 确定要从搜索历史记录中删除该项吗? + 确定要从观看历史记录中删除该项吗? + 您确定要删除历史记录中的所有项吗? + 上一次播放 + 最受欢迎 + 首页内容 + 空白页面 + 互动页面 + 订阅页面 + Feed 页面 + 频道页面 + 选择一个频道 + 尚未订阅任何频道 + 选择一个互动 + 输出 + 接入 + 无效的压缩文件 + 警告:无法导入所有文件。 + 这将覆盖您当前的设定。 + 您是否要导入设定? + 互动 + 趋势 + 前 50 + 最新和热门 + 转到后台播放 + 悬浮窗播放 + 移除 + 详细 + 音频设置 + 长按以新增至队列 + 转到后台时排列 + 排列新的悬浮窗 + 从这里开始播放 + 转到后台时从这里开始 + 从新的悬浮窗开始 + 打开抽屉 + 关闭抽屉 + 某些东西即将在此出现;D + 偏好的「开启」动作 + 开启内容时的默认动作 - %s + 视频播放器 + 转到后台播放 + 悬浮窗播放 + 总是询问 + 正在获取信息… + 正在载入请求的内容 + 新的播放列表 + 删除 + 重命名 + 名称 + 添加到播放列表 + 设为播放列表缩略图 + 将播放列表加入书签 + 播放列表缩略图已更改。 + 无法删除播放列表。 + 没有字幕 + 合适的 + 填满 + 缩放 + 自动生成 + 字幕 + 修改播放器标题文本比例和背景样式。需要重启才能生效。 + 启用 LeakCanary + 内存泄漏监视可能导致应用程序在存储时无响应 + 报告活动周期外错误 + 强制报告在处理完片段或活动周期外发生的无法传递的 Rx 异常 + 导入/导出 + 导入 + 导入至 + 导出到 + 正在导入… + 正在导出… + 导入文件 + 之前的导出 + 无法导入订阅 + 无法导出订阅 + 通过下载导出文件来导入 YouTube 订阅: +\n +\n1.移至该网址:%1$s +\n2.当被询问时登入帐号 +\n3.应该开始下载(这是导出文件) + 通过输入 URL 或 ID 来导入 SoundCloud的配置文件: +\n +\n1.在浏览器中启用「桌面模式」(该网站不适用于移动设备) +\n2.移至该网址:%1$s +\n3.当被询问时登入帐号 +\n4.复制您重定向的配置文件到网址。 + yourID, soundcloud.com/yourid + 请记住,此操作可能造成昂贵的网络花费。 +\n +\n您是否要继续? + 播放速度控制 + 速度 + 音量 + 取消链接(可能会导致扭曲) + 静音时快进 + \ No newline at end of file From 3ccbbccd100ab5fa8e58578b91099b66aa3bb58b Mon Sep 17 00:00:00 2001 From: SiD ViCiO Date: Mon, 21 Jan 2019 16:53:19 +0000 Subject: [PATCH 170/207] Translated using Weblate (Spanish) Currently translated at 91.9% (352 of 383 strings) --- app/src/main/res/values-es/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 7c4ce16f4..7342a7c2b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -112,7 +112,7 @@ OK Nombre del archivo - Hilo + Hilos Error Servidor no soportado El archivo ya existe @@ -197,8 +197,8 @@ abrir en modo popup Suscribirse Suscrito Canal no suscrito - No se puede cambiar la suscripción - No se puede actualizar la suscripción + No se pudo cambiar la suscripción + No se pudo actualizar la suscripción Principal Suscripciones @@ -468,11 +468,11 @@ abrir en modo popup Borrar historial de reproducciones Elimina el historial de las transmisiones reproducidas - Elimina todo el historial de reproducciones. + ¿Eliminar todo el historial de reproducciones\? Historial de reproducciones eliminado. Borrar historial de búsqueda Elimina el historial de palabras clave de búsqueda - Elimina todo el historial de búsqueda. + ¿Eliminar todo el historial de búsqueda\? Historial de búsquedas eliminado. 1 elemento eliminado. From 6185c4ddcfef5e7a2587c605d968d2d200ceccaf Mon Sep 17 00:00:00 2001 From: kapodamy Date: Fri, 14 Dec 2018 14:11:10 -0300 Subject: [PATCH 171/207] delete list and grid icons * delete all grid.png files * delete all list.png files --- app/src/main/res/drawable-hdpi/grid.png | Bin 3341 -> 0 bytes app/src/main/res/drawable-hdpi/list.png | Bin 3156 -> 0 bytes app/src/main/res/drawable-ldrtl-xhdpi/grid.png | Bin 2960 -> 0 bytes app/src/main/res/drawable-ldrtl-xhdpi/list.png | Bin 3006 -> 0 bytes app/src/main/res/drawable-xxhdpi/grid.png | Bin 18221 -> 0 bytes app/src/main/res/drawable-xxhdpi/list.png | Bin 18220 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/src/main/res/drawable-hdpi/grid.png delete mode 100644 app/src/main/res/drawable-hdpi/list.png delete mode 100644 app/src/main/res/drawable-ldrtl-xhdpi/grid.png delete mode 100644 app/src/main/res/drawable-ldrtl-xhdpi/list.png delete mode 100644 app/src/main/res/drawable-xxhdpi/grid.png delete mode 100644 app/src/main/res/drawable-xxhdpi/list.png diff --git a/app/src/main/res/drawable-hdpi/grid.png b/app/src/main/res/drawable-hdpi/grid.png deleted file mode 100644 index 26fa36c070f8a64dd45b446f92cd34cc5b159fbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3341 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%0Dy!5 z0Qvv`0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000JJOGiWi{{a60|De66lK=n!32;bR za{vGf6951U69E94oEQKA00(qQO+^Rd3JMb@5C2qaZ~y=T7fD1xR9M69m$6P%Q4of| zxv)sV6)Fo7p)er^^##D#Xzd%QjW2)&iBDj`WAFfWR#0JK4~7O4cN1@<5Lu~M2xBvw zOeW`qdtDY>vXh)-_uPNxoO|Y<|ICH4jqRFERb`m*C9~)g;04eNk17%QXqYA7888i~ zi+2Qk5|Lxu{41agai)MR5!tPK3Tv9S1BZF3s@(+Ur>d?v++ilxT59bgv!`B-eRqN1 ziTP7IwZ8qy_@6b|Q1 z_|ZAJ=uaEUhRo^rr^)ztThPU$||MS58 zg#R7)dmdOwV9F+CpA)u=OaAxg^b*YI3!~J)OUAz#ZQux?{`;04-i57Kix6b|o XjPphH8Dpc*00000NkvXXu0mjff#6e2 diff --git a/app/src/main/res/drawable-hdpi/list.png b/app/src/main/res/drawable-hdpi/list.png deleted file mode 100644 index 16da863e2e21606532a4a0880c30ee609e142fe8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3156 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%0Dy!5 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 A-T(jq diff --git a/app/src/main/res/drawable-xxhdpi/grid.png b/app/src/main/res/drawable-xxhdpi/grid.png deleted file mode 100644 index db749798127e1dd5b9a40603fbe7cca317a8b46e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18221 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 Z62MTuf)7V!Tj8+Y%w)ZBnxV^{e*qu(_>2Gm diff --git a/app/src/main/res/drawable-xxhdpi/list.png b/app/src/main/res/drawable-xxhdpi/list.png deleted file mode 100644 index fbb7c107299cc04d04e03834fcf1f5c785249611..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18220 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 From 8d1d4092aae1ff6bb60d5d3f015e03576fe6f638 Mon Sep 17 00:00:00 2001 From: kapodamy Date: Fri, 14 Dec 2018 14:51:55 -0300 Subject: [PATCH 172/207] add missing icons in bright theme * missing white icons * update attrs.xml and styles.xml --- .../giga/ui/fragment/MissionsFragment.java | 19 ++++++++++++++---- .../drawable-hdpi/ic_delete_black_24dp.png | Bin 0 -> 317 bytes .../drawable-hdpi/ic_delete_white_24dp.png | Bin 0 -> 319 bytes .../res/drawable-hdpi/ic_grid_black_24dp.png | Bin 0 -> 422 bytes .../res/drawable-hdpi/ic_grid_white_24dp.png | Bin 0 -> 415 bytes .../res/drawable-hdpi/ic_list_black_24dp.png | Bin 0 -> 265 bytes .../res/drawable-hdpi/ic_list_white_24dp.png | Bin 0 -> 276 bytes .../drawable-mdpi/ic_delete_black_24dp.png | Bin 0 -> 198 bytes .../drawable-mdpi/ic_delete_white_24dp.png | Bin 0 -> 198 bytes .../res/drawable-mdpi/ic_grid_black_24dp.png | Bin 0 -> 270 bytes .../res/drawable-mdpi/ic_grid_white_24dp.png | Bin 0 -> 279 bytes .../res/drawable-mdpi/ic_list_black_24dp.png | Bin 0 -> 248 bytes .../res/drawable-mdpi/ic_list_white_24dp.png | Bin 0 -> 254 bytes .../drawable-xhdpi/ic_delete_black_24dp.png | Bin 0 -> 270 bytes .../drawable-xhdpi/ic_delete_white_24dp.png | Bin 0 -> 274 bytes .../res/drawable-xhdpi/ic_grid_black_24dp.png | Bin 0 -> 276 bytes .../res/drawable-xhdpi/ic_grid_white_24dp.png | Bin 0 -> 288 bytes .../res/drawable-xhdpi/ic_list_black_24dp.png | Bin 0 -> 247 bytes .../res/drawable-xhdpi/ic_list_white_24dp.png | Bin 0 -> 249 bytes .../drawable-xxhdpi/ic_delete_black_24dp.png | Bin 0 -> 506 bytes .../drawable-xxhdpi/ic_delete_white_24dp.png | Bin 0 -> 495 bytes .../drawable-xxhdpi/ic_grid_black_24dp.png | Bin 0 -> 427 bytes .../drawable-xxhdpi/ic_grid_white_24dp.png | Bin 0 -> 419 bytes .../drawable-xxhdpi/ic_list_black_24dp.png | Bin 0 -> 292 bytes .../drawable-xxhdpi/ic_list_white_24dp.png | Bin 0 -> 295 bytes .../drawable-xxxhdpi/ic_delete_black_24dp.png | Bin 0 -> 541 bytes .../drawable-xxxhdpi/ic_delete_white_24dp.png | Bin 0 -> 547 bytes .../drawable-xxxhdpi/ic_grid_black_24dp.png | Bin 0 -> 363 bytes .../drawable-xxxhdpi/ic_grid_white_24dp.png | Bin 0 -> 382 bytes .../drawable-xxxhdpi/ic_list_black_24dp.png | Bin 0 -> 330 bytes .../drawable-xxxhdpi/ic_list_white_24dp.png | Bin 0 -> 320 bytes .../activity_main_player.xml | 2 +- .../main/res/layout/activity_main_player.xml | 2 +- app/src/main/res/menu/download_menu.xml | 18 ++++++++--------- app/src/main/res/values/attrs.xml | 3 +++ app/src/main/res/values/styles.xml | 8 ++++++-- 36 files changed, 35 insertions(+), 17 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_delete_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_delete_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_grid_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_grid_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_list_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_list_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_delete_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_delete_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_grid_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_grid_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_list_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_list_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_grid_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_grid_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_list_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_list_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_delete_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_grid_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_grid_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_list_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_delete_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_grid_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_grid_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_list_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png diff --git a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java index aa9c497f1..a4be9301e 100644 --- a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java +++ b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java @@ -7,9 +7,12 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; +import android.content.res.TypedArray; import android.os.Bundle; import android.os.IBinder; import android.preference.PreferenceManager; +import android.support.annotation.AttrRes; +import android.support.annotation.DrawableRes; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -89,7 +92,7 @@ public class MissionsFragment extends Fragment { mEmpty = v.findViewById(R.id.list_empty_view); mList = v.findViewById(R.id.mission_recycler); - // Init + // Init layouts managers mGridManager = new GridLayoutManager(getActivity(), SPAN_SIZE); mGridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override @@ -103,7 +106,6 @@ public class MissionsFragment extends Fragment { } } }); - mLinearManager = new LinearLayoutManager(getActivity()); setHasOptionsMenu(true); @@ -120,7 +122,7 @@ public class MissionsFragment extends Fragment { // Bug: in api< 23 this is never called // so mActivity=null - // so app crashes with nullpointer exception + // so app crashes with null-pointer exception mActivity = activity; } @@ -189,12 +191,21 @@ public class MissionsFragment extends Fragment { mList.setAdapter(mAdapter); if (mSwitch != null) { - mSwitch.setIcon(mLinear ? R.drawable.grid : R.drawable.list); + mSwitch.setIcon(getDrawableFromAttribute(mLinear ? R.attr.ic_grid : R.attr.ic_list)); mSwitch.setTitle(mLinear ? R.string.grid : R.string.list); mPrefs.edit().putBoolean("linear", mLinear).apply(); } } + @DrawableRes + private int getDrawableFromAttribute(@AttrRes int ic) { + TypedArray styledAttributes = mActivity.obtainStyledAttributes(new int[]{ic}); + int resId = styledAttributes.getResourceId(0, -1); + styledAttributes.recycle(); + + return resId; + } + @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); diff --git a/app/src/main/res/drawable-hdpi/ic_delete_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_delete_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8820363ec185ea85c54720ee4b709ae6c0fc9b GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$UKzz{uk1;usRq`u2vQwrd~*`-l1I zl}pVN1U5;`nA+)R);zB_Fn@w?WKGNTn`$T9C!AFA)LgwOfX%MOrmcM0?bkcMTdY6v z^LoAQ|NCpJ+pAA_&R0B>Bwby5>yS;Brd#{P0~rgGBaT>F{djYkPj6$-N4a#dhbD3o?BL)(7O;=LW4@*f)`Jo8BYt zIftya32j?>=yc2(ws}iy%kMGiG#hCkp%?ZIvnsrJs*a}VWQg{6I_gJsv-&<@df#av zzvEDf4#%{D`5a#wrp`}z5jWE(nLSs=ZA)+LUHK!I!VUH-#c$tIcI_qWx=3KKFnGH9 KxvX|k1|%Oc%$UKzz{uw5;usRq`u2vRw{xHb+k>6a zY?~Ia1x6a4u`$RLnC+NW94K}~E#eR7;T&PX`j#0!N=h7I2Nxw=kXL+XxT9oe%zM4( zO^+%cuDxH$Hz#;sl&)HVL8I%N1pDQ+It%3Yd(Jpbc2TIv70J8nPTg7XIo&Z==JC2i^A^O4gt#+L7TuP3N4}#n zXOZ}ZSXcRCwhV6l{DGbteD- literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_grid_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_grid_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..2db18582c2906e204f3007cee270ebb97d488f3d GIT binary patch literal 422 zcmV;X0a^ZuP)nP^NG9}0Xg73$+A(`%eX zYzI39{ssql7LECiivmBWLRIL&3vJ;l)4%wY2yGYmE9@sid-zk}4^yF6IL-8D`$mSD z#&Ur_#aqlqW7hGbz;C2NHTPvom>aoHkI6R)-;Bwd7v{;Re#UAd^Sr?C;Dx(qSx;Cv zIesw}nz&_Og{n{$`rks`_9mmc@9tUC2>VQqKfqEeKFkun6!?`?Xr_IlT%U}|ckn3U zJ9v5zUo%z~aGdD??<2Os%L0EaoPCd@F)PBv&hcxh&?YW3J;zDJcJQgdUt(97GsAqv z?*jiV6`HtZUxljBgA?kt7f1C7?;^GlzJYW6K-hQU<6v3%S3~y+=Pi1$(<;cOV(H#lW46F2v!N|ChQ%k7>%-!E3i_6g_mVx5dujOo5y0d zI636}IEAo;^TF4>|L`)*IX}}hHUAjg!?@7bc#^QUaX;Y47-BJ*8Dcl!N4d~gIe+jo zVOvZB9*(e*%zVOGz)!1C6}s_4uW(uD1%6~g`vHH6!%XM{eh2*LT<9@Q3jKyj!Y*JV z;7{-ZcaoXs_!{urO--NZ)O?^ zeS(KLE_8~Q2|K`}fIr3-mXevx*@s=?pXEY(I4|@R-xIdQn}9#Zdn_k2@9-<&KjuPn zckHWB6}oXkBi(&-UB6%_VFy?X_^IyRNq5_y!)Nt?}n0`#~?julWV6q_xt# z+@^!3z>|3ooJku?^YXgu{r4201ZHLp45Xb%^Rh|@W%tTr(0_x@fu(r|l+r3`US4#) z|DMABH*U;1FqC#G&CAPl&@=F3egciOM`>QZr-QP4W!Vk70bb1wFp)Ns=H;T}`3FG| a9F-kHEtdRUpr-Wz0000(&8NluWs++?wI<3<(9<}%Lxe&b)qs9!&MB^6DRV=&HVmA{$B#OOyRr2L$9JE zd(W~*+bF%M%6}EGz*pc{hI1p^_ePV23?Vbpf{s4fV`uu^=CzPUBM4RG+bL}D;p{0m uJK?^8ALjv<>XIEUFA5Img#Np1%UBdDwdP%o@-m>q7(8A5T-G@yGywoR=S(#K literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_delete_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..8f10392cac7644b0c4b09e20f52ce13b0bd60970 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gjy`C>7wES+6Ote6n0olNO-6--h0jII{NMQ zMy}ueaxKL&dsZH6FiSF+QpS_;E_|3jq z-tICB4OJT`os5MAKy2_72&JcE@I(tr;OXR{1bc&@ftK`~41V|vz7mXpyOXOD%niO% zf~~<9G+Du${E8D(y|d0rZSER8r~U^6gJ)Xc{}lNzNM(c0Q3-N`Pk~5!CI&CGAe7U% z`NSi|BZG%DS$*K<olS)$JH_nJvHzcIY|_&nd#`n_Gtesxp00i_>zopr09-L;Gynhq literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..f0d3f5f7cff9f53b0fb070d4d40d4ca6f64fccee GIT binary patch literal 254 zcmVYH5>z7jL9j@K;A&C})*(v>SY-hgf<>yNbOAPL-GFPb&jM_+fX8A!;ikPZ zW1$D$;=Ik_@^M?OOU@&Bzz~Dz1)jp?(oY9w_{C53TWrJS@|_NRsj`WFk3Yv{l@3hs ziTCJT%){mK*2sMiFDP-1GI3Yoaw*e++HX+%KpQ=D6L%9XmrkvB{TIC81Fz9Ln1;(` z+~^G!*kK+0PW9b)N3cu>`WWFcdV%L~xeOY)?1EO|r68}40 zUw*tDBk^sD*$$bkKW4n^HXg}csAsr6{XYMs|4-Ph*TwJfo+p+M^dN($tDnm{r-UW| DT4rf% literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b828bf928a98888a4fbbf9204c1f87e7fef099 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUto1QL?AsLNtZ`pb=2THU)?7Y#z zvvFIYXjxM$m!6{Dan>E&;tCNrZ)tvecX)r1ob<#g&z_yTBXFKOzFuy}U7zbqbvbPH z!uM3ZzPtb7xmUJZ?%hq4@0Z|WV4hcK@a(|tro^qg`4<%amoDgCeyn^mUqaj5W9Hgy zIleR2f9*PL#ih`|z{G)txWV9XvV6m(wp$Hy^1@8}3L=CzbWi7GTz_LV+YiS%k8+zn zzTdIJs*bZT=g#skos$EP=_^*vNo-v0wf(?O-(PgSGY6|=t%}oS3j3^ HP6baGgzB8KxQ$Z_4x!K2xpWj9bL^zv58&q<`;ZeoWf)DEOGbhq`oShT0EV zm;77zsn#lfQDy$Z5O;9*#D98U{4eFV{>x}!WRpl}V610fahbpSPTLpjh4vHo3I1Yb zuDEyMIzt6ZzW=Z03-KQI;=e?hQ~pbs9$;YRF*wk$hB5coqZ1py|J-~b-t#`^-&u?{ z`7g9TR0_GQQ~c}m!unEw>%OFhH}Z?Yrn5;*FkRpy@6z|ze!oc7H@kSwzb%Y=^55|0 X$7` zqU(&r2M$L>yVr1SmXe8hQzoBy*8PLvw~p%z-tIqCKY8|U_B@-1Eww%No<9Bz28;o& zddmNTK5#$sXRSZSq;=%7(0|1rvLCY#=F2=_V7EBH$oFG+1CN9BPUesOP4$X(dOv0> z9GJ23^UscX6RidR>-;c(w4Sy8IMb^4;o1wPr(a>@D`;SrdC=g91B&4a&o@$P!+|GYkUKRVB1pUOD3;8<0qn=I5OiIM{{4#GPh)XE(Q`_TNq il40co{U(Ob%5nSJyb}&CK9vgeGJ~h9pUXO@geCw&^>^0* literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_list_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_list_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..0f7327fadeacdc39422adcbe44146bc63ad2b13f GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUteV#6kAsLNtr!MSr3KVe__dlv4 zaYU2tzcY_g(?KPR1&#vU|KEt;(D^nqVdB|5eVLb0W!j~_*yzEe?w1AVh)B=4oAjj#u-m?RtcV+|CnnTpCklVl{_vmKH kt&ktD*?@L)DAq{-Z;Fy02N)%w#4?n6R z;nIEZyFhbC!iJcD3kn@a%fE5vi2c5Ce!K6E*XJc?m?iq(TxE1jBDu#?yU=4l6FZCK};Nt#`3;4=`Yc3ke;b~mZPFrSI1ai;~RRj!eY zEAzg8y;Tm~f1WiMUg+4o;Ii7`Ov3{+%o(#5=wAb=KN>5#fg$gaBFJ!Q-XFirUoq+m r@kKEEe-tXYm9j&h4P^hZKZ^Q^pIZ|i?3U>R`h~&M)z4*}Q$iB}8Q5WF literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_delete_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_delete_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..4cb4c08e2d5bc8bbb83fc99bd95d02010b5a9e89 GIT binary patch literal 506 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2U_9vQ;uumf=j|O^eU?Cm)`#Ys zwBiL7ITn60HWA|Ooaf}cIB20`^Q54~YF71aQ34-DcXwuS@9w&pq->b3zOy_n?A+uz zWySAj_x2{Soq02V1q1Vegoe-}yXum^2iQKa>|wtl=J}>Rk>v(kTqD~Bo()nPxO<*e z^lKbzu$`3ex5DD=we-D=?FUlww!b{USTHSdx=Nu_>(9O753C-~^lJ*wESCScsdBB9 zmDldyLNON_mCiRFk?}awcw`aVEybTR-#mNEzW&m({wMd_^5Wt@Xr%?N3HT#_$8Wpb zN=GerAsLSXg@cVOG+=~r{8lMmW2&KX!6@K-#SNt}_G?O}9;W`~HVNN3bdGvX$Ya~V zw9i<^?0qe>`GJ@vY%8@6XnnZwFtPiF@dnN>ZdnSwjK>cgmuJ^0GJP;bXwR;st|yik z(ocO}{f$qCar4J@bI%%VV3@LSxA*fT%8G@kN6hOgcYS? c#@hSkBi)|*CH`6b4j88lp00i_>zopr0G|KJPXGV_ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..bd11b4c66ce16c9380af0941567031454e81d02e GIT binary patch literal 495 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2VBF^E;uumf=j|QCY>`Bfwu=JS zw2mnpT(IcKsriY@H#BZ!Cob-tI`x)|wC~ELy<3x>&%YQI;^J$-xLV}o#v7pmDS1uC zzf%uaKiGEqPI`OfwjXJEdP;pvJsUcNZO^RuYPa`L;hkgYIbRIQH{PgPAD1Bc{R40H zuZ_Lz7FVnG|8EktnRCao_Nd{{HSa5WHn08uhq?d5ABN9aLg^auAD=Z`-(r`tfS*~< zS~r^Wif$tpXNboFCnixg-V*uO#&+4xY*7aPZX2B5Y!I=akM!7HSI3Vtw^l<#WI{6Rr|o>)z@2`(^Ls2)>wf(<0$JXLvMA)Y0rWX0iKk z>)m^l)a{^r=fLr0oV#id%F4{HTHv`v)aGc~WuE`rdefu!?_zqsA?;7D?6ml;yfz10 zmlf6>_KZ2kz2`9hpE;j$9@@q|;+hs+{*(JzZ+u;e)N|>xk~)d|O8Yx*Opm|pYH<0C Tc#eZw?LI_moH?*1-caYw{@t7% z9e;H9N!2l(Kl*Lc&i|}yy8g0$xOZp%^-7+U1q&LR*tn!LGO#cbc(&yIV6+jtZGQHz zX+iv(c&7Dd{~oqFzk{jnm2g2^&U};a^BXrO)%O=pE&I0pwT+UJ(*K#Mhog_Jt?6oh z_D{${?^}7p>u3MgoO|qf%e@zmO<<{G4y)VvuiRhTH~Y8tgDp4iv%Z`4JGxX(P;lb^ zGm9RIK33NVeq-`oyeImnNb~{M;`+_!jQOJMzxEbN%z3nH=l^pS&wUCR_n3VD{@P~V zlG-aA*gXYxg#`0iX}Q4v_p`3unIBxg{Z`7J^Dp1zU#WC?BL0&tnlG_7R(jnJU?ebj My85}Sb4q9e03TGkZU6uP literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_grid_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_grid_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe059481e836a0264e83096628fc1b1ce6023db GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2V9fG#aSW-L^Y->auVzM(wugxV zZPOZ!0`D{_9O{b5aT62^V{x3Y_3qT~37@3G_HfKD|0tDaCttzSx0ip;uh!`Y>wf%X zXZHN%{^BQ7*wJr`cJgn~`Ig^UT3nyBU{)g&GbF(9e?nGzPS~X-eH)JB2cDuVN;?1mG^7U&HnBEV9^bGre|mW zHXBV)@x0xAcJq<^_iPq=+uYCojefA=hCM^t*}s29GVbmuPYBGpZ~FcEfju|oGp;}T zw~*_~Mq&R;vN(JMvN1uO$ych}?c-iigPeE%8uy|Ze;?SfbALG7q%YI=G5(IxZ9H?7 RIT;xE44$rjF6*2UngGv?vcv!Y literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_list_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_list_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..52d0c00a17994990d99d28d8cc949109e2187854 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!uRUEHLn`LHy=j=`6e!U8P+qC) zfw!PE^R7;j&Iep7LQT;e5j%sWt2cVhJfy_kaWvcb^MO~rf8^(UGFiTpSzN_)5(vEv z6Mn!jr)iJM-4(%_?hh=bUkLtS{MWQ*Qr?x7Q{odII`BOKp}#)Q9he`;-e8-l22v=0 zz(U$%(vn?l2c&-Re40|S*l%ghi;8EqB72v}o@kUg(O5P6Tw~h-@eTY&-n#;q2bFD+ z7oVhZcOmlzP{PuJJ8zzopr08o&4p8x;= literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f698298456b7cb877e2352de76ad338dcf2a03 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!?>t=`Ln`LHy=Lge93bF&vB6Pr zlE^KM8NN#l8rL|82yR!1*cm+g%R#NBt*zWU%rfuu-1u9-@AGrk?LYQ2JtnDm0@0=Y z48{+HZ?s2?-rgelvg|;vXa-}=#X(|b2V6x@fb>j4=*i%#VYGjE4QwQHfjBeBkw6sml7DY( WbI`(vbM66s&fw|l=d#Wzp$Py9vUe{4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_delete_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_delete_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ab07ea2ae96b3ffd072d9644d118d8b55bda90dc GIT binary patch literal 541 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V0_}~;uumf=k4A7tIik79RK+I zk&Jo_BXg?J9M>Q=<>sX6(gCLqEa1^Q@Jw%t_k=TQrA2D0PyJ^~q%1gGV70jQ{PW*` z{#Mw%DrKDi{qy(N<=dD&C#f9ZOklq;cZ=+UD@p4kjnf;hA2@%qnmI@R%d)K-dG{p$ z`^f)|(_;IH)7K6}CiFk;tKVSz;1JXM=*;Pj=XL7;G}kh&^Q(WVa=c-E#qsE=wak70 zpX&biVC32$q}{NG=>&qf%#_1W-cbGj=ete+6MZJRluG|!Kj~(*!J8;y5r;5_NX8V_ z38DkRxO>R{!kfGDWotR}9>`~W%j4U9jpg}Aev@kP_Sozu-Uqh-CZ@er-eCDAYH|$o zzQ^*}U+NgHv){{{<$S>SPjl}*?gt+ZSo@Z;RCLyF39M$7k*!+DI)`Q6qd)5(1m0$z z$Gp5fF3oZF0q1Y^Gp=hMk^8_{!IHzfzbk=z2a8SG|JQ%YT(@)EFs}R1FJtF9>CZ9! Ysek4lOXgEx0Y*E6r>mdKI;Vst04N09wEzGB literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..a8358eb71286cb51ee10a3633a3f24ebfe0a933f GIT binary patch literal 547 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V0`82;uumf=j~nFEYU=U)`uoi z%_q6G1Z>#kp{x`Uk)@cSpXVT;lcX4t!dUjssen`IT9}i;RD~w{gr%(!8s9hWh}j@n zKk1I8uq}TL_m6X@4KANOGHx<) zm^Pq-VtLE2OCJ3D=t@!oSBc}vUXTDV`9x)o^d{jBhLzSSOY{Vgu?8)n`6IlVyk z{vl`G!{v88-v5raXj=Yo+x zWnOhtsEt9rq5Lud<2}cn*DNi+W4`90k=#uCbNOmjWgjKN|93uIy=qm~4gRywycD%B Ss~-nOK7*&LpUXO@geCwAq2jUt literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_grid_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_grid_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..fe78d853e74f89291e5f1002f193801d8fd1138b GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U^Mb{aSW-L^Y-q>Tqj2X*Nftf zvFoK5Fx9aKG%!Er(l}IPTh?Gce`=a)cl|mO#aUP9b*L&#RPp@3O84a6NeqY}38*cjl9&RSn5V086#aSW-L^Y-q+%)<^Mu7T^{ zthi?~fol!l8>THC!Hr!4tDdJm%whg~l1K1I%#5X#PRCbs9$7wF#nZ~q^O;Ka^J48c z-|xjuUeo%wpYiv1mFcIrU)&9=V06}cqtE>8yNWQ-CVW7K;lZ?&*EM$B`U}2)n|4e5 zfmOo)iP!8;c~4UDob)B?XzYdk_gU96%i%KvDyQHH)N?6&>hu5SU=;LpaSW-L^Y+eKuhKw~)`yJ$ z?yQwK6ZL1E;}*`O&9htr>?VsVm>E{c-twFKc?oB=E&ram4IfWd~YbdU?pCapWtK=NmQ1i<=1FgO$YU^vvF&zt!)}%T z-R~yLnB|3*hrL|*F$`#!kELf(WXY^23kp~7+U%9yyZzQj-Had66Bv0m>;!8wK2X3W zagO2eThjxTlU6V4{_;;?^}98f_8*I8WMD9OYIQRCqHmS`xwSyC+{bInYPhBTiKQ?w z=jb791{zV#`(e_PR2tQ+DP=@0BoMa8a1Lb+N&0-mmZF6*2UngDQH BgQfrg literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..053a1a0da97aa4ac5f9aa2d4836fe12394d87bc3 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U}X1naSW-L^Y)IlSBs-S>qSQS z-J;CNz9qbiW-6pDb5qig+R0!j%zV9&H^!m#utDn=%Yw^Z`!Z%dyq^O!1PmHfRVsZx zg}%`|dGNs6SLd{jcw lu3HAQ_#W6|um>3a-_n=QIhto+n7jfc;OXk;vd$@?2>{=GdBFex literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout-large-land/activity_main_player.xml b/app/src/main/res/layout-large-land/activity_main_player.xml index 7d7e1230e..5f484267b 100644 --- a/app/src/main/res/layout-large-land/activity_main_player.xml +++ b/app/src/main/res/layout-large-land/activity_main_player.xml @@ -239,7 +239,7 @@ android:focusable="true" android:padding="5dp" android:scaleType="fitXY" - android:src="@drawable/list" + android:src="@drawable/ic_list_white_24dp" android:background="?attr/selectableItemBackground" tools:ignore="ContentDescription,RtlHardcoded"/> diff --git a/app/src/main/res/layout/activity_main_player.xml b/app/src/main/res/layout/activity_main_player.xml index 3dccc5c4c..8cf9ba32f 100644 --- a/app/src/main/res/layout/activity_main_player.xml +++ b/app/src/main/res/layout/activity_main_player.xml @@ -237,7 +237,7 @@ android:focusable="true" android:padding="5dp" android:scaleType="fitXY" - android:src="@drawable/list" + android:src="@drawable/ic_list_white_24dp" android:background="?attr/selectableItemBackground" tools:ignore="ContentDescription,RtlHardcoded"/> diff --git a/app/src/main/res/menu/download_menu.xml b/app/src/main/res/menu/download_menu.xml index e79367135..4e2b32715 100644 --- a/app/src/main/res/menu/download_menu.xml +++ b/app/src/main/res/menu/download_menu.xml @@ -3,17 +3,17 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> - - + android:icon="?attr/ic_delete" + android:title="@string/clear_finished_download" + app:showAsAction="ifRoom" /> + + + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 7b879fb4c..c0e7fa532 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -38,6 +38,9 @@ + + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 87e19cede..da1ae0e38 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -22,7 +22,6 @@ @drawable/ic_info_outline_black_24dp @drawable/ic_bug_report_black_24dp @drawable/ic_headset_black_24dp - @drawable/ic_delete_sweep_white_24dp @drawable/ic_file_download_black_24dp @drawable/ic_share_black_24dp @drawable/ic_cast_black_24dp @@ -54,6 +53,9 @@ @drawable/ic_add_black_24dp @drawable/ic_settings_backup_restore_black_24dp @drawable/ic_blank_page_black_24dp + @drawable/ic_list_black_24dp + @drawable/ic_grid_black_24dp + @drawable/ic_delete_black_24dp @color/light_separator_color @color/light_contrast_background_color @@ -82,7 +84,6 @@ @drawable/ic_headset_white_24dp @drawable/ic_info_outline_white_24dp @drawable/ic_bug_report_white_24dp - @drawable/ic_delete_sweep_black_24dp @drawable/ic_file_download_white_24dp @drawable/ic_share_white_24dp @drawable/ic_cast_white_24dp @@ -114,6 +115,9 @@ @drawable/ic_add_white_24dp @drawable/ic_settings_backup_restore_white_24dp @drawable/ic_blank_page_white_24dp + @drawable/ic_list_white_24dp + @drawable/ic_grid_white_24dp + @drawable/ic_delete_white_24dp @color/dark_separator_color @color/dark_contrast_background_color From ecabbb57e62523fdab31e73d0246d3be05bf8cfc Mon Sep 17 00:00:00 2001 From: kapodamy Date: Sat, 15 Dec 2018 20:57:25 -0300 Subject: [PATCH 173/207] Update download_menu.xml * hide clear button by default --- app/src/main/res/menu/download_menu.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/menu/download_menu.xml b/app/src/main/res/menu/download_menu.xml index 4e2b32715..02efde55b 100644 --- a/app/src/main/res/menu/download_menu.xml +++ b/app/src/main/res/menu/download_menu.xml @@ -8,6 +8,7 @@ app:showAsAction="ifRoom" /> From 8fed18b2acdd1844d6a999330dea3f99714a5f23 Mon Sep 17 00:00:00 2001 From: kapodamy Date: Sat, 15 Dec 2018 20:58:28 -0300 Subject: [PATCH 174/207] Update MissionAdapter.java * check if the iterator is initialized --- .../giga/ui/adapter/MissionAdapter.java | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 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 df5f9e429..5057ed6db 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 @@ -158,7 +158,7 @@ public class MissionAdapter extends Adapter { str = R.string.missions_header_pending; } else { str = R.string.missions_header_finished; - setClearButtonVisibility(true); + mClear.setVisible(true); } ((ViewHolderHeader) view).header.setText(str); @@ -437,7 +437,7 @@ public class MissionAdapter extends Adapter { public void clearFinishedDownloads() { mDownloadManager.forgetFinishedDownloads(); applyChanges(); - setClearButtonVisibility(false); + mClear.setVisible(false); } private boolean handlePopupItem(@NonNull ViewHolderItem h, @NonNull MenuItem option) { @@ -506,11 +506,7 @@ public class MissionAdapter extends Adapter { mIterator.end(); checkEmptyMessageVisibility(); - - if (mIterator.getOldListSize() > 0) { - int lastItemType = mIterator.getSpecialAtItem(mIterator.getOldListSize() - 1); - setClearButtonVisibility(lastItemType == DownloadManager.SPECIAL_FINISHED); - } + checkClearButtonVisibility(mClear); } public void forceUpdate() { @@ -529,15 +525,18 @@ public class MissionAdapter extends Adapter { } public void setClearButton(MenuItem clearButton) { - if (mClear == null) { - int lastItemType = mIterator.getSpecialAtItem(mIterator.getOldListSize() - 1); - clearButton.setVisible(lastItemType == DownloadManager.SPECIAL_FINISHED); - } + if (mClear == null) checkClearButtonVisibility(clearButton); mClear = clearButton; } - private void setClearButtonVisibility(boolean flag) { - mClear.setVisible(flag); + private void checkClearButtonVisibility(MenuItem clearButton) { + if (mIterator.getOldListSize() < 1) { + clearButton.setVisible(false); + return; + } + + DownloadManager.MissionItem item = mIterator.getItem(mIterator.getOldListSize() - 1); + clearButton.setVisible(item.special == DownloadManager.SPECIAL_FINISHED || item.mission instanceof FinishedMission); } private void checkEmptyMessageVisibility() { From df4dd0122f60a426a552bfbc03647b978721dc51 Mon Sep 17 00:00:00 2001 From: kapodamy Date: Mon, 14 Jan 2019 22:54:44 -0300 Subject: [PATCH 175/207] Update missions_header.xml make the separator line """"""""simetric"""""""""" --- app/src/main/res/layout/missions_header.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/missions_header.xml b/app/src/main/res/layout/missions_header.xml index 9505a2fce..6de38664d 100644 --- a/app/src/main/res/layout/missions_header.xml +++ b/app/src/main/res/layout/missions_header.xml @@ -4,8 +4,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="30dp" - android:layout_marginRight="16dp" - android:layout_marginEnd="16dp" + android:layout_marginRight="8dp" + android:layout_marginEnd="8dp" android:layout_marginTop="16dp" android:orientation="vertical" android:layout_marginLeft="8dp" From c4a5e8dc86fd6060bc21effc5f6f9242760741d4 Mon Sep 17 00:00:00 2001 From: kapodamy Date: Tue, 15 Jan 2019 14:58:56 -0300 Subject: [PATCH 176/207] misc fixes * add null checks before resuming a download * (MissionAdapter.java) reset percent after resuming a download. prevents the "Error" string get stuck, until the download start --- app/src/main/java/us/shandian/giga/get/DownloadMission.java | 5 +++-- .../java/us/shandian/giga/ui/adapter/MissionAdapter.java | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/us/shandian/giga/get/DownloadMission.java b/app/src/main/java/us/shandian/giga/get/DownloadMission.java index c25d517f1..b41cfc350 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadMission.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadMission.java @@ -407,7 +407,8 @@ public class DownloadMission extends Mission { // ensure that the previous state is completely paused. joinForThread(init); - for (Thread thread : threads) joinForThread(thread); + if (threads != null) + for (Thread thread : threads) joinForThread(thread); enqueued = false; running = true; @@ -420,7 +421,7 @@ public class DownloadMission extends Mission { init = null; - if (threads.length < 1) { + if (threads == null || threads.length < 1) { threads = new Thread[currentThreadCount]; } 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 5057ed6db..28e7ef480 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 @@ -447,6 +447,7 @@ public class MissionAdapter extends Adapter { if (mission != null) { switch (id) { case R.id.start: + h.status.setText(UNDEFINED_SPEED); h.state = -1; h.size.setText(Utility.formatBytes(mission.getLength())); mDownloadManager.resumeMission(mission); From 9db272f30ed12ed1c1b389572cac8c500ad07f18 Mon Sep 17 00:00:00 2001 From: kapodamy Date: Fri, 18 Jan 2019 14:32:28 -0300 Subject: [PATCH 177/207] Update MissionsFragment.java use another way to get the "Context" --- .../giga/ui/fragment/MissionsFragment.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java index a4be9301e..33e7b0a8a 100644 --- a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java +++ b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java @@ -43,7 +43,7 @@ public class MissionsFragment extends Fragment { private MissionAdapter mAdapter; private GridLayoutManager mGridManager; private LinearLayoutManager mLinearManager; - private Context mActivity; + private Context mContext; private DMBinder mBinder; private Bundle mBundle; @@ -56,7 +56,7 @@ public class MissionsFragment extends Fragment { mBinder = (DownloadManagerService.DMBinder) binder; mBinder.clearDownloadNotifications(); - mAdapter = new MissionAdapter(mActivity, mBinder.getDownloadManager(), mClear, mEmpty); + mAdapter = new MissionAdapter(mContext, mBinder.getDownloadManager(), mClear, mEmpty); mAdapter.deleterLoad(mBundle, getView()); mBundle = null; @@ -82,11 +82,11 @@ public class MissionsFragment extends Fragment { mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); mLinear = mPrefs.getBoolean("linear", false); - mActivity = getActivity(); + //mContext = getActivity().getApplicationContext(); mBundle = savedInstanceState; // Bind the service - mActivity.bindService(new Intent(mActivity, DownloadManagerService.class), mConnection, Context.BIND_AUTO_CREATE); + mContext.bindService(new Intent(mContext, DownloadManagerService.class), mConnection, Context.BIND_AUTO_CREATE); // Views mEmpty = v.findViewById(R.id.list_empty_view); @@ -117,13 +117,13 @@ public class MissionsFragment extends Fragment { * Added in API level 23. */ @Override - public void onAttach(Context activity) { - super.onAttach(activity); + public void onAttach(Context context) { + super.onAttach(context); // Bug: in api< 23 this is never called // so mActivity=null // so app crashes with null-pointer exception - mActivity = activity; + mContext = context; } /** @@ -134,7 +134,7 @@ public class MissionsFragment extends Fragment { public void onAttach(Activity activity) { super.onAttach(activity); - mActivity = activity; + mContext = activity.getApplicationContext(); } @@ -145,7 +145,7 @@ public class MissionsFragment extends Fragment { mBinder.removeMissionEventListener(mAdapter.getMessenger()); mBinder.enableNotifications(true); - mActivity.unbindService(mConnection); + mContext.unbindService(mConnection); mAdapter.deleterDispose(null); mBinder = null; @@ -199,7 +199,7 @@ public class MissionsFragment extends Fragment { @DrawableRes private int getDrawableFromAttribute(@AttrRes int ic) { - TypedArray styledAttributes = mActivity.obtainStyledAttributes(new int[]{ic}); + TypedArray styledAttributes = mContext.obtainStyledAttributes(new int[]{ic}); int resId = styledAttributes.getResourceId(0, -1); styledAttributes.recycle(); From 684cb8197435eb08d3a30191be37a9dfa3d93d1c Mon Sep 17 00:00:00 2001 From: kapodamy Date: Sat, 19 Jan 2019 16:22:24 -0300 Subject: [PATCH 178/207] Update MissionsFragment.java work-around for reading the current theme icons --- .../giga/ui/fragment/MissionsFragment.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java index 33e7b0a8a..25960a419 100644 --- a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java +++ b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java @@ -16,6 +16,7 @@ import android.support.annotation.DrawableRes; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.util.TypedValue; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -198,12 +199,20 @@ public class MissionsFragment extends Fragment { } @DrawableRes - private int getDrawableFromAttribute(@AttrRes int ic) { - TypedArray styledAttributes = mContext.obtainStyledAttributes(new int[]{ic}); - int resId = styledAttributes.getResourceId(0, -1); + private int getDrawableFromAttribute(@AttrRes int attr) { + TypedArray styledAttributes = mContext.getTheme().obtainStyledAttributes(new int[]{attr}); + int resId = styledAttributes.getResourceId(0, 0); styledAttributes.recycle(); - return resId; + if (resId != 0) { + return resId; + } else { + // work-around + styledAttributes = mContext.obtainStyledAttributes(new int[]{attr}); + resId = styledAttributes.getResourceId(0, 0); + styledAttributes.recycle(); + return resId; + } } @Override From f2285c0b191b70aa25961f7ad19516c715fa522b Mon Sep 17 00:00:00 2001 From: kapodamy Date: Mon, 21 Jan 2019 01:30:03 -0300 Subject: [PATCH 179/207] MP4 muxer +misc modifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * allow retry downloads with "post-processing failed" error in the new muxer * MPEG-4 muxer ¡¡ no DASH output!! * keep the progress if download fails * remove TODO in SecondaryStreamHelper.java * misc clean-up * delete TestAlgo.java * delete ExtSDDownloadFailedActivity.java and remove it from AndroidManifest.xml * use hardcored version for changing icon colors --- app/src/main/AndroidManifest.xml | 1 - .../newpipe/download/DownloadDialog.java | 7 +- .../download/ExtSDDownloadFailedActivity.java | 38 ----- .../newpipe/util/SecondaryStreamHelper.java | 1 - .../giga/get/DownloadInitializer.java | 1 - .../us/shandian/giga/get/DownloadMission.java | 123 +++++++++++----- .../giga/postprocessing/Mp4DashMuxer.java | 4 +- .../giga/postprocessing/Mp4Muxer.java | 136 ++++++++++++++++++ .../giga/postprocessing/Postprocessing.java | 123 +++++++++------- .../giga/postprocessing/TestAlgo.java | 54 ------- ...TttmlConverter.java => TtmlConverter.java} | 15 +- .../giga/postprocessing/WebMMuxer.java | 4 +- .../giga/service/DownloadManager.java | 30 ++-- .../giga/ui/adapter/MissionAdapter.java | 48 +++---- .../giga/ui/fragment/MissionsFragment.java | 32 ++--- 15 files changed, 357 insertions(+), 260 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/download/ExtSDDownloadFailedActivity.java create mode 100644 app/src/main/java/us/shandian/giga/postprocessing/Mp4Muxer.java delete mode 100644 app/src/main/java/us/shandian/giga/postprocessing/TestAlgo.java rename app/src/main/java/us/shandian/giga/postprocessing/{TttmlConverter.java => TtmlConverter.java} (83%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1bc205f33..5aa1dc982 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -119,7 +119,6 @@ - { - // should be safe run the following code without "getActivity().runOnUiThread()" if (listed) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(R.string.download_dialog_title) @@ -511,11 +510,11 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck if (secondaryStream != null) { secondaryStreamUrl = secondaryStream.getStream().getUrl(); - psName = selectedStream.getFormat() == MediaFormat.MPEG_4 ? Postprocessing.ALGORITHM_MP4_DASH_MUXER : Postprocessing.ALGORITHM_WEBM_MUXER; + psName = selectedStream.getFormat() == MediaFormat.MPEG_4 ? Postprocessing.ALGORITHM_MP4_MUXER : Postprocessing.ALGORITHM_WEBM_MUXER; psArgs = null; long videoSize = wrappedVideoStreams.getSizeInBytes((VideoStream) selectedStream); - // set nearLength, only, if both sizes are fetched or known. this probably does not work on weak internet connections + // set nearLength, only, if both sizes are fetched or known. this probably does not work on slow networks if (secondaryStream.getSizeInBytes() > 0 && videoSize > 0) { nearLength = secondaryStream.getSizeInBytes() + videoSize; } diff --git a/app/src/main/java/org/schabi/newpipe/download/ExtSDDownloadFailedActivity.java b/app/src/main/java/org/schabi/newpipe/download/ExtSDDownloadFailedActivity.java deleted file mode 100644 index c02ef92eb..000000000 --- a/app/src/main/java/org/schabi/newpipe/download/ExtSDDownloadFailedActivity.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.schabi.newpipe.download; - -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.settings.NewPipeSettings; -import org.schabi.newpipe.util.ServiceHelper; -import org.schabi.newpipe.util.ThemeHelper; - -public class ExtSDDownloadFailedActivity extends AppCompatActivity { - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceId(this)); - } - - @Override - protected void onStart() { - super.onStart(); - new AlertDialog.Builder(this) - .setTitle(R.string.download_to_sdcard_error_title) - .setMessage(R.string.download_to_sdcard_error_message) - .setPositiveButton(R.string.yes, (DialogInterface dialogInterface, int i) -> { - NewPipeSettings.resetDownloadFolders(this); - finish(); - }) - .setNegativeButton(R.string.cancel, (DialogInterface dialogInterface, int i) -> { - dialogInterface.dismiss(); - finish(); - }) - .create() - .show(); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/SecondaryStreamHelper.java b/app/src/main/java/org/schabi/newpipe/util/SecondaryStreamHelper.java index a5d3ea3eb..b3522aea0 100644 --- a/app/src/main/java/org/schabi/newpipe/util/SecondaryStreamHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/SecondaryStreamHelper.java @@ -36,7 +36,6 @@ public class SecondaryStreamHelper { * @return selected audio stream or null if a candidate was not found */ public static AudioStream getAudioStreamFor(@NonNull List audioStreams, @NonNull VideoStream videoStream) { - // TODO: check if m4v and m4a selected streams are DASH compliant switch (videoStream.getFormat()) { case WEBM: case MPEG_4: diff --git a/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java b/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java index ce7ae267c..b864cf4fb 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java @@ -156,7 +156,6 @@ public class DownloadInitializer extends Thread { if (retryCount++ > mMission.maxRetry) { Log.e(TAG, "initializer failed", e); - mMission.running = false; mMission.notifyError(e); return; } diff --git a/app/src/main/java/us/shandian/giga/get/DownloadMission.java b/app/src/main/java/us/shandian/giga/get/DownloadMission.java index b41cfc350..243a8585a 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadMission.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadMission.java @@ -39,7 +39,7 @@ public class DownloadMission extends Mission { public static final int ERROR_SSL_EXCEPTION = 1004; public static final int ERROR_UNKNOWN_HOST = 1005; public static final int ERROR_CONNECT_HOST = 1006; - public static final int ERROR_POSTPROCESSING_FAILED = 1007; + public static final int ERROR_POSTPROCESSING = 1007; public static final int ERROR_HTTP_NO_CONTENT = 204; public static final int ERROR_HTTP_UNSUPPORTED_RANGE = 206; @@ -79,9 +79,12 @@ public class DownloadMission extends Mission { public String postprocessingName; /** - * Indicates if the post-processing algorithm is actually running, used to detect corrupt downloads + * Indicates if the post-processing state: + * 0: ready + * 1: running + * 2: completed */ - public boolean postprocessingRunning; + public int postprocessingState; /** * Indicate if the post-processing algorithm works on the same file @@ -356,7 +359,7 @@ public class DownloadMission extends Mission { finishCount++; if (finishCount == currentThreadCount) { - if (errCode > ERROR_NOTHING) return; + if (errCode != ERROR_NOTHING) return; if (DEBUG) { Log.d(TAG, "onFinish" + (current + 1) + "/" + urls.length); @@ -382,19 +385,26 @@ public class DownloadMission extends Mission { } } - private void notifyPostProcessing(boolean processing) { + private void notifyPostProcessing(int state) { if (DEBUG) { - Log.d(TAG, (processing ? "enter" : "exit") + " postprocessing on " + location + File.separator + name); + String action; + switch (state) { + case 1: + action = "Running"; + break; + case 2: + action = "Completed"; + break; + default: + action = "Failed"; + } + + Log.d(TAG, action + " postprocessing on " + location + File.separator + name); } synchronized (blockState) { - if (!processing) { - postprocessingName = null; - postprocessingArgs = null; - } - // don't return without fully write the current state - postprocessingRunning = processing; + postprocessingState = state; Utility.writeToFile(metadata, DownloadMission.this); } } @@ -403,7 +413,7 @@ public class DownloadMission extends Mission { * Start downloading with multiple threads. */ public void start() { - if (running || current >= urls.length) return; + if (running || isFinished()) return; // ensure that the previous state is completely paused. joinForThread(init); @@ -414,6 +424,19 @@ public class DownloadMission extends Mission { running = true; errCode = ERROR_NOTHING; + if (current >= urls.length && postprocessingName != null) { + runAsync(1, () -> { + if (doPostprocessing()) { + running = false; + deleteThisFromFile(); + + notify(DownloadManagerService.MESSAGE_FINISHED); + } + }); + + return; + } + if (blocks < 0) { initializer(); return; @@ -445,18 +468,18 @@ public class DownloadMission extends Mission { public synchronized void pause() { if (!running) return; - running = false; - recovered = true; - enqueued = false; - - if (postprocessingRunning) { + if (isPsRunning()) { if (DEBUG) { Log.w(TAG, "pause during post-processing is not applicable."); } return; } - if (init != null && init.isAlive()) { + running = false; + recovered = true; + enqueued = false; + + if (init != null && Thread.currentThread() != init && init.isAlive()) { init.interrupt(); synchronized (blockState) { resetState(); @@ -533,13 +556,36 @@ public class DownloadMission extends Mission { mWritingToFile = false; } + /** + * Indicates if the download if fully finished + * + * @return true, otherwise, false + */ public boolean isFinished() { - return current >= urls.length && postprocessingName == null; + return current >= urls.length && (postprocessingName == null || postprocessingState == 2); + } + + /** + * Indicates if the download file is corrupt due a failed post-processing + * + * @return {@code true} if this mission is unrecoverable + */ + public boolean isPsFailed() { + return postprocessingName != null && errCode == DownloadMission.ERROR_POSTPROCESSING && postprocessingThis; + } + + /** + * Indicates if a post-processing algorithm is running + * + * @return true, otherwise, false + */ + public boolean isPsRunning() { + return postprocessingName != null && postprocessingState == 1; } public long getLength() { long calculated; - if (postprocessingRunning) { + if (postprocessingState == 1) { calculated = length; } else { calculated = offsets[current < offsets.length ? current : (offsets.length - 1)] + length; @@ -551,16 +597,19 @@ public class DownloadMission extends Mission { } private boolean doPostprocessing() { - if (postprocessingName == null) return true; + if (postprocessingName == null || postprocessingState == 2) return true; + + notifyPostProcessing(1); + notifyProgress(0); + + Thread.currentThread().setName("[" + TAG + "] post-processing = " + postprocessingName + " filename = " + name); + + Exception exception = null; try { - notifyPostProcessing(true); - notifyProgress(0); - - Thread.currentThread().setName("[" + TAG + "] post-processing = " + postprocessingName + " filename = " + name); - - Postprocessing algorithm = Postprocessing.getAlgorithm(postprocessingName, this); - algorithm.run(); + Postprocessing + .getAlgorithm(postprocessingName, this) + .run(); } catch (Exception err) { StringBuilder args = new StringBuilder(" "); if (postprocessingArgs != null) { @@ -572,15 +621,21 @@ public class DownloadMission extends Mission { } Log.e(TAG, String.format("Post-processing failed. algorithm = %s args = [%s]", postprocessingName, args), err); - notifyError(ERROR_POSTPROCESSING_FAILED, err); - return false; + if (errCode == ERROR_NOTHING) errCode = ERROR_POSTPROCESSING; + + exception = err; } finally { - notifyPostProcessing(false); + notifyPostProcessing(errCode == ERROR_NOTHING ? 2 : 0); } - if (errCode != ERROR_NOTHING) notify(DownloadManagerService.MESSAGE_ERROR); + if (errCode != ERROR_NOTHING) { + if (exception == null) exception = errObject; + notifyError(ERROR_POSTPROCESSING, exception); - return errCode == ERROR_NOTHING; + return false; + } + + return true; } private boolean deleteThisFromFile() { diff --git a/app/src/main/java/us/shandian/giga/postprocessing/Mp4DashMuxer.java b/app/src/main/java/us/shandian/giga/postprocessing/Mp4DashMuxer.java index b303b66cd..45c06dd4b 100644 --- a/app/src/main/java/us/shandian/giga/postprocessing/Mp4DashMuxer.java +++ b/app/src/main/java/us/shandian/giga/postprocessing/Mp4DashMuxer.java @@ -13,9 +13,7 @@ import us.shandian.giga.get.DownloadMission; class Mp4DashMuxer extends Postprocessing { Mp4DashMuxer(DownloadMission mission) { - super(mission); - recommendedReserve = 15360 * 1024;// 15 MiB - worksOnSameFile = true; + super(mission, 15360 * 1024/* 15 MiB */, true); } @Override diff --git a/app/src/main/java/us/shandian/giga/postprocessing/Mp4Muxer.java b/app/src/main/java/us/shandian/giga/postprocessing/Mp4Muxer.java new file mode 100644 index 000000000..bf932d5c1 --- /dev/null +++ b/app/src/main/java/us/shandian/giga/postprocessing/Mp4Muxer.java @@ -0,0 +1,136 @@ +package us.shandian.giga.postprocessing; + +import android.media.MediaCodec.BufferInfo; +import android.media.MediaExtractor; +import android.media.MediaMuxer; +import android.media.MediaMuxer.OutputFormat; +import android.util.Log; + +import static org.schabi.newpipe.BuildConfig.DEBUG; + +import org.schabi.newpipe.streams.io.SharpStream; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.ByteBuffer; + +import us.shandian.giga.get.DownloadMission; + + +class Mp4Muxer extends Postprocessing { + private static final String TAG = "Mp4Muxer"; + private static final int NOTIFY_BYTES_INTERVAL = 128 * 1024;// 128 KiB + + Mp4Muxer(DownloadMission mission) { + super(mission, 0, false); + } + + @Override + int process(SharpStream out, SharpStream... sources) throws IOException { + File dlFile = mission.getDownloadedFile(); + File tmpFile = new File(mission.location, mission.name.concat(".tmp")); + + if (tmpFile.exists()) + if (!tmpFile.delete()) return DownloadMission.ERROR_FILE_CREATION; + + if (!tmpFile.createNewFile()) return DownloadMission.ERROR_FILE_CREATION; + + FileInputStream source = null; + MediaMuxer muxer = null; + + //noinspection TryFinallyCanBeTryWithResources + try { + source = new FileInputStream(dlFile); + MediaExtractor tracks[] = { + getMediaExtractor(source, mission.offsets[0], mission.offsets[1] - mission.offsets[0]), + getMediaExtractor(source, mission.offsets[1], mission.length - mission.offsets[1]) + }; + + muxer = new MediaMuxer(tmpFile.getAbsolutePath(), OutputFormat.MUXER_OUTPUT_MPEG_4); + + int tracksIndex[] = { + muxer.addTrack(tracks[0].getTrackFormat(0)), + muxer.addTrack(tracks[1].getTrackFormat(0)) + }; + + ByteBuffer buffer = ByteBuffer.allocate(512 * 1024);// 512 KiB + BufferInfo info = new BufferInfo(); + + long written = 0; + long nextReport = NOTIFY_BYTES_INTERVAL; + + muxer.start(); + + while (true) { + int done = 0; + + for (int i = 0; i < tracks.length; i++) { + if (tracksIndex[i] < 0) continue; + + info.set(0, + tracks[i].readSampleData(buffer, 0), + tracks[i].getSampleTime(), + tracks[i].getSampleFlags() + ); + + if (info.size >= 0) { + muxer.writeSampleData(tracksIndex[i], buffer, info); + written += info.size; + done++; + } + if (!tracks[i].advance()) { + // EOF reached + tracks[i].release(); + tracksIndex[i] = -1; + } + + if (written > nextReport) { + nextReport = written + NOTIFY_BYTES_INTERVAL; + super.progressReport(written); + } + } + + if (done < 1) break; + } + + // this part should not fail + if (!dlFile.delete()) return DownloadMission.ERROR_FILE_CREATION; + if (!tmpFile.renameTo(dlFile)) return DownloadMission.ERROR_FILE_CREATION; + + return OK_RESULT; + } finally { + try { + if (muxer != null) { + muxer.stop(); + muxer.release(); + } + } catch (Exception err) { + if (DEBUG) + Log.e(TAG, "muxer stop/release failed", err); + } + + if (source != null) { + try { + source.close(); + } catch (IOException e) { + // nothing to do + } + } + + // if the operation fails, delete the temporal file + if (tmpFile.exists()) { + //noinspection ResultOfMethodCallIgnored + tmpFile.delete(); + } + } + } + + private MediaExtractor getMediaExtractor(FileInputStream source, long offset, long length) throws IOException { + MediaExtractor extractor = new MediaExtractor(); + extractor.setDataSource(source.getFD(), offset, length); + extractor.selectTrack(0); + + return extractor; + } +} 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 80726f705..635140bd3 100644 --- a/app/src/main/java/us/shandian/giga/postprocessing/Postprocessing.java +++ b/app/src/main/java/us/shandian/giga/postprocessing/Postprocessing.java @@ -18,21 +18,21 @@ public abstract class Postprocessing { public static final String ALGORITHM_TTML_CONVERTER = "ttml"; public static final String ALGORITHM_MP4_DASH_MUXER = "mp4D"; + public static final String ALGORITHM_MP4_MUXER = "mp4"; public static final String ALGORITHM_WEBM_MUXER = "webm"; - private static final String ALGORITHM_TEST_ALGO = "test"; public static Postprocessing getAlgorithm(String algorithmName, DownloadMission mission) { if (null == algorithmName) { throw new NullPointerException("algorithmName"); } else switch (algorithmName) { case ALGORITHM_TTML_CONVERTER: - return new TttmlConverter(mission); + return new TtmlConverter(mission); case ALGORITHM_MP4_DASH_MUXER: return new Mp4DashMuxer(mission); + case ALGORITHM_MP4_MUXER: + return new Mp4Muxer(mission); case ALGORITHM_WEBM_MUXER: return new WebMMuxer(mission); - case ALGORITHM_TEST_ALGO: - return new TestAlgo(mission); /*case "example-algorithm": return new ExampleAlgorithm(mission);*/ default: @@ -52,71 +52,84 @@ public abstract class Postprocessing { */ public int recommendedReserve; + /** + * the download to post-process + */ protected DownloadMission mission; - Postprocessing(DownloadMission mission) { + Postprocessing(DownloadMission mission, int recommendedReserve, boolean worksOnSameFile) { this.mission = mission; + this.recommendedReserve = recommendedReserve; + this.worksOnSameFile = worksOnSameFile; } public void run() throws IOException { File file = mission.getDownloadedFile(); CircularFile out = null; - ChunkFileInputStream[] sources = new ChunkFileInputStream[mission.urls.length]; + int result; + long finalLength = -1; - try { - int i = 0; - for (; i < sources.length - 1; i++) { - sources[i] = new ChunkFileInputStream(file, mission.offsets[i], mission.offsets[i + 1], "rw"); - } - sources[i] = new ChunkFileInputStream(file, mission.offsets[i], mission.getDownloadedFile().length(), "rw"); + mission.done = 0; + mission.length = file.length(); - int[] idx = {0}; - CircularFile.OffsetChecker checker = () -> { - while (idx[0] < sources.length) { - /* - * WARNING: never use rewind() in any chunk after any writing (especially on first chunks) - * or the CircularFile can lead to unexpected results - */ - if (sources[idx[0]].isDisposed() || sources[idx[0]].available() < 1) { - idx[0]++; - continue;// the selected source is not used anymore + if (worksOnSameFile) { + ChunkFileInputStream[] sources = new ChunkFileInputStream[mission.urls.length]; + try { + int i = 0; + for (; i < sources.length - 1; i++) { + sources[i] = new ChunkFileInputStream(file, mission.offsets[i], mission.offsets[i + 1], "rw"); + } + sources[i] = new ChunkFileInputStream(file, mission.offsets[i], mission.getDownloadedFile().length(), "rw"); + + int[] idx = {0}; + CircularFile.OffsetChecker checker = () -> { + while (idx[0] < sources.length) { + /* + * WARNING: never use rewind() in any chunk after any writing (especially on first chunks) + * or the CircularFile can lead to unexpected results + */ + if (sources[idx[0]].isDisposed() || sources[idx[0]].available() < 1) { + idx[0]++; + continue;// the selected source is not used anymore + } + + return sources[idx[0]].getFilePointer() - 1; } - return sources[idx[0]].getFilePointer() - 1; + return -1; + }; + out = new CircularFile(file, 0, this::progressReport, checker); + + result = process(out, sources); + + if (result == OK_RESULT) + finalLength = out.finalizeFile(); + } finally { + for (SharpStream source : sources) { + if (source != null && !source.isDisposed()) { + source.dispose(); + } } - - return -1; - }; - - out = new CircularFile(file, 0, this::progressReport, checker); - - mission.done = 0; - mission.length = file.length(); - - int result = process(out, sources); - - if (result == OK_RESULT) { - long finalLength = out.finalizeFile(); - mission.done = finalLength; - mission.length = finalLength; - } else { - mission.errCode = DownloadMission.ERROR_UNKNOWN_EXCEPTION; - mission.errObject = new RuntimeException("post-processing algorithm returned " + result); - } - - if (result != OK_RESULT && worksOnSameFile) { - //noinspection ResultOfMethodCallIgnored - new File(mission.location, mission.name).delete(); - } - } finally { - for (SharpStream source : sources) { - if (source != null && !source.isDisposed()) { - source.dispose(); + if (out != null) { + out.dispose(); } } - if (out != null) { - out.dispose(); - } + } else { + result = process(null); + } + + if (result == OK_RESULT) { + if (finalLength < 0) finalLength = file.length(); + mission.done = finalLength; + mission.length = finalLength; + } else { + mission.errCode = DownloadMission.ERROR_UNKNOWN_EXCEPTION; + mission.errObject = new RuntimeException("post-processing algorithm returned " + result); + } + + if (result != OK_RESULT && worksOnSameFile) { + //noinspection ResultOfMethodCallIgnored + file.delete(); } } @@ -138,7 +151,7 @@ public abstract class Postprocessing { return mission.postprocessingArgs[index]; } - private void progressReport(long done) { + void progressReport(long done) { mission.done = done; if (mission.length < mission.done) mission.length = mission.done; diff --git a/app/src/main/java/us/shandian/giga/postprocessing/TestAlgo.java b/app/src/main/java/us/shandian/giga/postprocessing/TestAlgo.java deleted file mode 100644 index 66b235d7c..000000000 --- a/app/src/main/java/us/shandian/giga/postprocessing/TestAlgo.java +++ /dev/null @@ -1,54 +0,0 @@ -package us.shandian.giga.postprocessing; - -import android.util.Log; - -import org.schabi.newpipe.streams.io.SharpStream; - -import java.io.IOException; -import java.util.Random; - -import us.shandian.giga.get.DownloadMission; - -/** - * Algorithm for testing proposes - */ -class TestAlgo extends Postprocessing { - - public TestAlgo(DownloadMission mission) { - super(mission); - - worksOnSameFile = true; - recommendedReserve = 4096 * 1024;// 4 KiB - } - - @Override - int process(SharpStream out, SharpStream... sources) throws IOException { - - int written = 0; - int size = 5 * 1024 * 1024;// 5 MiB - byte[] buffer = new byte[8 * 1024];//8 KiB - mission.length = size; - - Random rnd = new Random(); - - // only write random data - sources[0].dispose(); - - while (written < size) { - rnd.nextBytes(buffer); - - int read = Math.min(buffer.length, size - written); - out.write(buffer, 0, read); - - try { - Thread.sleep((int) (Math.random() * 10)); - } catch (InterruptedException e) { - return -1; - } - - written += read; - } - - return Postprocessing.OK_RESULT; - } -} diff --git a/app/src/main/java/us/shandian/giga/postprocessing/TttmlConverter.java b/app/src/main/java/us/shandian/giga/postprocessing/TtmlConverter.java similarity index 83% rename from app/src/main/java/us/shandian/giga/postprocessing/TttmlConverter.java rename to app/src/main/java/us/shandian/giga/postprocessing/TtmlConverter.java index 4c9d44548..390061840 100644 --- a/app/src/main/java/us/shandian/giga/postprocessing/TttmlConverter.java +++ b/app/src/main/java/us/shandian/giga/postprocessing/TtmlConverter.java @@ -18,13 +18,12 @@ import us.shandian.giga.postprocessing.io.SharpInputStream; /** * @author kapodamy */ -class TttmlConverter extends Postprocessing { - private static final String TAG = "TttmlConverter"; +class TtmlConverter extends Postprocessing { + private static final String TAG = "TtmlConverter"; - TttmlConverter(DownloadMission mission) { - super(mission); - recommendedReserve = 0;// due how XmlPullParser works, the xml is fully loaded on the ram - worksOnSameFile = true; + TtmlConverter(DownloadMission mission) { + // due how XmlPullParser works, the xml is fully loaded on the ram + super(mission, 0, true); } @Override @@ -41,7 +40,7 @@ class TttmlConverter extends Postprocessing { out, getArgumentAt(1, "true").equals("true"), getArgumentAt(2, "true").equals("true") - ); + ); } catch (Exception err) { Log.e(TAG, "subtitle parse failed", err); @@ -56,7 +55,7 @@ class TttmlConverter extends Postprocessing { } else if (err instanceof XPathExpressionException) { return 7; } - + return 8; } diff --git a/app/src/main/java/us/shandian/giga/postprocessing/WebMMuxer.java b/app/src/main/java/us/shandian/giga/postprocessing/WebMMuxer.java index 009a9a66b..2ffb0f08d 100644 --- a/app/src/main/java/us/shandian/giga/postprocessing/WebMMuxer.java +++ b/app/src/main/java/us/shandian/giga/postprocessing/WebMMuxer.java @@ -15,9 +15,7 @@ import us.shandian.giga.get.DownloadMission; class WebMMuxer extends Postprocessing { WebMMuxer(DownloadMission mission) { - super(mission); - recommendedReserve = 2048 * 1024;// 2 MiB - worksOnSameFile = true; + super(mission, 2048 * 1024/* 2 MiB */, true); } @Override diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManager.java b/app/src/main/java/us/shandian/giga/service/DownloadManager.java index 6bcf84745..883c26850 100644 --- a/app/src/main/java/us/shandian/giga/service/DownloadManager.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManager.java @@ -141,15 +141,18 @@ public class DownloadManager { File dl = mis.getDownloadedFile(); boolean exists = dl.exists(); - if (mis.postprocessingRunning && mis.postprocessingThis) { - // Incomplete post-processing results in a corrupted download file - // because the selected algorithm works on the same file to save space. - if (!dl.delete()) { - Log.w(TAG, "Unable to delete incomplete download file: " + sub.getPath()); + if (mis.isPsRunning()) { + if (mis.postprocessingThis) { + // Incomplete post-processing results in a corrupted download file + // because the selected algorithm works on the same file to save space. + if (exists && dl.isFile() && !dl.delete()) + Log.w(TAG, "Unable to delete incomplete download file: " + sub.getPath()); + + exists = true; } - exists = true; - mis.postprocessingRunning = false; - mis.errCode = DownloadMission.ERROR_POSTPROCESSING_FAILED; + + mis.postprocessingState = 0; + mis.errCode = DownloadMission.ERROR_POSTPROCESSING; mis.errObject = new RuntimeException("stopped unexpectedly"); } else if (exists && !dl.isFile()) { // probably a folder, this should never happens @@ -332,7 +335,7 @@ public class DownloadManager { int count = 0; synchronized (this) { for (DownloadMission mission : mMissionsPending) { - if (mission.running && mission.errCode != DownloadMission.ERROR_POSTPROCESSING_FAILED && !mission.isFinished()) + if (mission.running && !mission.isFinished() && !mission.isPsFailed()) count++; } } @@ -471,7 +474,7 @@ public class DownloadManager { boolean flag = false; synchronized (this) { for (DownloadMission mission : mMissionsPending) { - if (mission.running && mission.isFinished() && !mission.postprocessingRunning) { + if (mission.running && !mission.isFinished() && !mission.isPsRunning()) { flag = true; mission.pause(); } @@ -528,6 +531,8 @@ public class DownloadManager { ArrayList current; ArrayList hidden; + boolean hasFinished = false; + private MissionIterator() { hidden = new ArrayList<>(2); current = null; @@ -563,6 +568,7 @@ public class DownloadManager { list.addAll(finished); } + hasFinished = finished.size() > 0; return list; } @@ -637,6 +643,10 @@ public class DownloadManager { hidden.remove(mission); } + public boolean hasFinishedMissions() { + return hasFinished; + } + @Override public int getOldListSize() { 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 28e7ef480..1b5b98145 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 @@ -59,7 +59,7 @@ import static us.shandian.giga.get.DownloadMission.ERROR_HTTP_UNSUPPORTED_RANGE; import static us.shandian.giga.get.DownloadMission.ERROR_NOTHING; import static us.shandian.giga.get.DownloadMission.ERROR_PATH_CREATION; import static us.shandian.giga.get.DownloadMission.ERROR_PERMISSION_DENIED; -import static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING_FAILED; +import static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING; import static us.shandian.giga.get.DownloadMission.ERROR_SSL_EXCEPTION; import static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_EXCEPTION; import static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_HOST; @@ -67,7 +67,8 @@ import static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_HOST; public class MissionAdapter extends Adapter { private static final SparseArray ALGORITHMS = new SparseArray<>(); private static final String TAG = "MissionAdapter"; - private static final String UNDEFINED_SPEED = "--.-%"; + private static final String UNDEFINED_PROGRESS = "--.-%"; + static { ALGORITHMS.put(R.id.md5, "MD5"); @@ -178,7 +179,7 @@ public class MissionAdapter extends Adapter { if (h.item.mission instanceof DownloadMission) { DownloadMission mission = (DownloadMission) item.mission; String length = Utility.formatBytes(mission.getLength()); - if (mission.running && !mission.postprocessingRunning) length += " --.- kB/s"; + if (mission.running && !mission.isPsRunning()) length += " --.- kB/s"; h.size.setText(length); h.pause.setTitle(mission.unknownLength ? R.string.stop : R.string.pause); @@ -238,11 +239,10 @@ public class MissionAdapter extends Adapter { } if (hasError) { - if (Float.isNaN(progress) || Float.isInfinite(progress)) - h.progress.setProgress(1f); + h.progress.setProgress(isNotFinite(progress) ? 1f : progress); h.status.setText(R.string.msg_error); - } else if (Float.isNaN(progress) || Float.isInfinite(progress)) { - h.status.setText(UNDEFINED_SPEED); + } else if (isNotFinite(progress)) { + h.status.setText(UNDEFINED_PROGRESS); } else { h.status.setText(String.format("%.2f%%", progress * 100)); h.progress.setProgress(progress); @@ -251,11 +251,11 @@ public class MissionAdapter extends Adapter { long length = mission.getLength(); int state; - if (mission.errCode == ERROR_POSTPROCESSING_FAILED) { + if (mission.isPsFailed()) { state = 0; } else if (!mission.running) { state = mission.enqueued ? 1 : 2; - } else if (mission.postprocessingRunning) { + } else if (mission.isPsRunning()) { state = 3; } else { state = 0; @@ -406,7 +406,7 @@ public class MissionAdapter extends Adapter { case ERROR_CONNECT_HOST: str.append(mContext.getString(R.string.error_connect_host)); break; - case ERROR_POSTPROCESSING_FAILED: + case ERROR_POSTPROCESSING: str.append(mContext.getString(R.string.error_postprocessing_failed)); case ERROR_UNKNOWN_EXCEPTION: break; @@ -447,7 +447,7 @@ public class MissionAdapter extends Adapter { if (mission != null) { switch (id) { case R.id.start: - h.status.setText(UNDEFINED_SPEED); + h.status.setText(UNDEFINED_PROGRESS); h.state = -1; h.size.setText(Utility.formatBytes(mission.getLength())); mDownloadManager.resumeMission(mission); @@ -507,7 +507,7 @@ public class MissionAdapter extends Adapter { mIterator.end(); checkEmptyMessageVisibility(); - checkClearButtonVisibility(mClear); + mClear.setVisible(mIterator.hasFinishedMissions()); } public void forceUpdate() { @@ -526,20 +526,10 @@ public class MissionAdapter extends Adapter { } public void setClearButton(MenuItem clearButton) { - if (mClear == null) checkClearButtonVisibility(clearButton); + if (mClear == null) clearButton.setVisible(mIterator.hasFinishedMissions()); mClear = clearButton; } - private void checkClearButtonVisibility(MenuItem clearButton) { - if (mIterator.getOldListSize() < 1) { - clearButton.setVisible(false); - return; - } - - DownloadManager.MissionItem item = mIterator.getItem(mIterator.getOldListSize() - 1); - clearButton.setVisible(item.special == DownloadManager.SPECIAL_FINISHED || item.mission instanceof FinishedMission); - } - private void checkEmptyMessageVisibility() { int flag = mIterator.getOldListSize() > 0 ? View.GONE : View.VISIBLE; if (mEmptyMessage.getVisibility() != flag) mEmptyMessage.setVisibility(flag); @@ -596,6 +586,10 @@ public class MissionAdapter extends Adapter { } } + private boolean isNotFinite(Float value) { + return Float.isNaN(value) || Float.isInfinite(value); + } + class ViewHolderItem extends RecyclerView.ViewHolder { DownloadManager.MissionItem item; @@ -667,7 +661,7 @@ public class MissionAdapter extends Adapter { DownloadMission mission = item.mission instanceof DownloadMission ? (DownloadMission) item.mission : null; if (mission != null) { - if (!mission.postprocessingRunning) { + if (!mission.isPsRunning()) { if (mission.running) { pause.setVisible(true); } else { @@ -678,8 +672,10 @@ public class MissionAdapter extends Adapter { queue.setChecked(mission.enqueued); delete.setVisible(true); - start.setVisible(mission.errCode != ERROR_POSTPROCESSING_FAILED); - queue.setVisible(mission.errCode != ERROR_POSTPROCESSING_FAILED); + + boolean flag = !mission.isPsFailed(); + start.setVisible(flag); + queue.setVisible(flag); } } } else { diff --git a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java index 25960a419..c4fd3b5fd 100644 --- a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java +++ b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java @@ -7,16 +7,12 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; -import android.content.res.TypedArray; import android.os.Bundle; import android.os.IBinder; import android.preference.PreferenceManager; -import android.support.annotation.AttrRes; -import android.support.annotation.DrawableRes; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.util.TypedValue; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -24,6 +20,7 @@ import android.view.View; import android.view.ViewGroup; import org.schabi.newpipe.R; +import org.schabi.newpipe.util.ThemeHelper; import us.shandian.giga.service.DownloadManager; import us.shandian.giga.service.DownloadManagerService; @@ -192,29 +189,20 @@ public class MissionsFragment extends Fragment { mList.setAdapter(mAdapter); if (mSwitch != null) { - mSwitch.setIcon(getDrawableFromAttribute(mLinear ? R.attr.ic_grid : R.attr.ic_list)); + boolean isLight = ThemeHelper.isLightThemeSelected(mContext); + int icon; + + if (mLinear) + icon = isLight ? R.drawable.ic_list_black_24dp : R.drawable.ic_list_white_24dp; + else + icon = isLight ? R.drawable.ic_grid_black_24dp : R.drawable.ic_grid_white_24dp; + + mSwitch.setIcon(icon); mSwitch.setTitle(mLinear ? R.string.grid : R.string.list); mPrefs.edit().putBoolean("linear", mLinear).apply(); } } - @DrawableRes - private int getDrawableFromAttribute(@AttrRes int attr) { - TypedArray styledAttributes = mContext.getTheme().obtainStyledAttributes(new int[]{attr}); - int resId = styledAttributes.getResourceId(0, 0); - styledAttributes.recycle(); - - if (resId != 0) { - return resId; - } else { - // work-around - styledAttributes = mContext.obtainStyledAttributes(new int[]{attr}); - resId = styledAttributes.getResourceId(0, 0); - styledAttributes.recycle(); - return resId; - } - } - @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); From 75dd8d492b82cebaa833b2229717920b31863182 Mon Sep 17 00:00:00 2001 From: qazaxtan Date: Tue, 22 Jan 2019 01:55:51 +0000 Subject: [PATCH 180/207] Translated using Weblate (Romanian) Currently translated at 84.1% (322 of 383 strings) --- app/src/main/res/values-ro/strings.xml | 49 ++++++++++++++++++-------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index b93f0dd46..fefffcf7a 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -21,7 +21,7 @@ Locul în care se vor descărca videoclipurile Introduceți locația în care se vor descărca videoclipurile - Locația audio-ului descărcat + Directorul audio-ului descărcat Locul în care se va descărca audio-ul Introduceți locația în care se va descărca fişierele audio @@ -51,7 +51,7 @@ Redați Conținut Conținut restricționat în funcție de vârstă - Videoclipul este restricționat în funcție de vârstă. Permiterea vizionării este posibilă din Setări. + Arată videoclipul restricționat în funcție de vârstă. Permiterea vizionării este posibilă din Setări. Eroare Eroare de rețea @@ -61,7 +61,7 @@ Conținut indisponibil Blocat de către GEMA Imposibil de inițializat meniul pentru descărcări - Acesta este un LIVE STREAM, care încă nu este suportat. + LIVE STREAM-uri încă nu sunt suportate Thumbnail-ul videoclipului @@ -199,7 +199,7 @@ pentru a deschide în mod pop-up Anulează Notificare NewPipe - Notificări pentru Playere de fundal și pop-up + Notificări pentru playere de fundal și pop-up Fără rezultate Nimic aici în afară de sunetul greierilor @@ -243,7 +243,7 @@ pentru a deschide în mod pop-up Despre Contributori Licențe - Un player Youtube \"uşor\" gratuit, pentru Android. + Un player de streaming „uşor” liber, pentru Android. Vedeți pe GitHub Licența NewPipe Dacă aveți idei, doriți să traduceți, să schimbați design-ul, să curățați codul sau să schimbați codul, ajutorul este mereu bine primit. Cu cât mai mult, cu atât mai bine! @@ -280,12 +280,12 @@ pentru a deschide în mod pop-up Descărcați fișierul de streaming Arată informații - Marcaje + Marcaje lista de vizionare Adaugă La Folosește parcurgerea inexactă - Derularea inexactă permite player-ului să îl poziţionezi mai rapid dar cu o precizie mai redusă. + Derularea inexactă permite player-ului să fie poziţionat mai rapid dar cu o precizie mai redusă Încarcă miniaturi Dezactivați pentru a opri încărcarea și salvarea tuturor thumbnail-urilor, pentru a economisi consumul de date și de memorie. Schimbarea acestei opțiuni va curăța tot cache-ul din memorie și de pe disc. Cache-ul de imagini a fost curățat @@ -293,7 +293,7 @@ pentru a deschide în mod pop-up Șterge cache-ul pentru datele de pagini web Cache pentru metadata șters Adaugă următorul stream în coadă automat - Adaugă automat un stream asociat când redarea începe pe ultimul stream într-o coadă non-repetitivă. + Adaugă automat un stream asociat când se redă ultimul stream într-o coadă non-repetitivă. Arată sfatul „Țineți apăsat pentru a adăuga” Arată sfatul când butonul de background sau de popup este apăsat în pagina de informații a videoclipului Țara implicită pentru conținut @@ -313,7 +313,7 @@ pentru a deschide în mod pop-up Importează baza de date Exportează baza de date Va înlocui istoricul și abonamentele curente - Exportează istoricul, abonamentele și playlist-urile. + Exportează istoricul, abonamentele și playlist-urile Nu s-a putut reda acest stream A apărut o eroare de player irecuperabilă Recuperare după eroare player @@ -327,23 +327,23 @@ pentru a deschide în mod pop-up Numele fișierului nu poate fi gol O eroare a apărut: %1$s - NewPipe este creat de dezvoltatori şi voluntari care işi petrec timpul liber să vă aducă cea mai buna experienţă. Acum e timpul să le dăm ceva înapoi pentru a ne asigura că dezvolatori noştri pot face NewPipe şi mai bun în timp ce se bucură de \"o cană de Java\" ! + NewPipe este creat de dezvoltatori şi voluntari care îşi petrec timpul liber să vă aducă cea mai buna experienţă. Dați ceva înapoi pentru a ajuta dezvolatorii noştri în a pot face NewPipe şi mai bun în timp ce se bucură de o cană de cafea. A da înapoi Site-ul - Pentru mai multe informaţi şi ultimele ştiri despre NewPipe vizitaţi site-ul nostru. + "Vizitaţi site-ul nostru pentru mai multe informaţi şi ultimele ştiri despre NewPipe." Doriţi să ştergeţi acest element din istoricul de vizionare ? Sunteţi sigur că vreţi să ştergeţi toate elementele din istoric ? Ultimul cântec ascultat "Cel mai ascultat " - Exportare completă - "Importare completă " + Exportat + Importat Nici-un fişier ZIP valid Avertisment: Nu se pot importa fişierele. Acest lucru o să vă reseteze setup-ul curent. Player în fundal - Player Popup + Player popup Şterge Detalii Setări Audio @@ -352,7 +352,7 @@ pentru a deschide în mod pop-up Adăugaţi în Popup Începeţi să redaţi de aici Începeţi de aici în Fundal - Începeţi de aici în Popup + Începeţi de aici în popup Deschdeţi sertarul Închideţi sertarul @@ -395,4 +395,23 @@ pentru a deschide în mod pop-up Utilizatori Playlist-uri Titluri + Șterge istoricul vizionărilor +\n + Șterge istoricul stream-urilor redate + Șterge întregul istoric al vizionărilor\? + 1 element șters. + Playlist nou + Șterge + Adăugați la Playlist + Importă + Importă din + Exportă spre + Se importă… + Se exportă… + Ultimul export + Nu s-au putut importa abonamentele + Nu s-au putut exporta abonamentele + Viteză + Acceptă + Refuză \ No newline at end of file From 21eb98a52ca286d009baa5bfe3f6c572f620069c Mon Sep 17 00:00:00 2001 From: kapodamy Date: Thu, 24 Jan 2019 23:23:30 -0300 Subject: [PATCH 181/207] add null check add checks for null. This happens after rotating the screen while is turned off --- .../java/us/shandian/giga/ui/adapter/MissionAdapter.java | 5 ++--- 1 file changed, 2 insertions(+), 3 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 1b5b98145..8fca7c470 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 @@ -159,7 +159,7 @@ public class MissionAdapter extends Adapter { str = R.string.missions_header_pending; } else { str = R.string.missions_header_finished; - mClear.setVisible(true); + if (mClear != null) mClear.setVisible(true); } ((ViewHolderHeader) view).header.setText(str); @@ -437,7 +437,6 @@ public class MissionAdapter extends Adapter { public void clearFinishedDownloads() { mDownloadManager.forgetFinishedDownloads(); applyChanges(); - mClear.setVisible(false); } private boolean handlePopupItem(@NonNull ViewHolderItem h, @NonNull MenuItem option) { @@ -507,7 +506,7 @@ public class MissionAdapter extends Adapter { mIterator.end(); checkEmptyMessageVisibility(); - mClear.setVisible(mIterator.hasFinishedMissions()); + if (mClear != null) mClear.setVisible(mIterator.hasFinishedMissions()); } public void forceUpdate() { From a92f776ebe7506182562fc70981c2ed6966fea2f Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 27 Jan 2019 16:46:44 +0100 Subject: [PATCH 182/207] fix icon messup --- app/src/main/ic_settings_update_white-web.png | Bin 9830 -> 0 bytes .../drawable-hdpi/ic_settings_update_black.png | Bin 431 -> 0 bytes .../drawable-mdpi/ic_settings_update_black.png | Bin 379 -> 0 bytes .../drawable-xhdpi/ic_settings_update_black.png | Bin 710 -> 0 bytes .../drawable-xxhdpi/ic_settings_update_black.png | Bin 1091 -> 0 bytes .../ic_settings_update_black.png | Bin 2029 -> 0 bytes .../drawable-hdpi/ic_settings_update_black.png | Bin 431 -> 0 bytes .../drawable-mdpi/ic_settings_update_black.png | Bin 379 -> 0 bytes .../drawable-xhdpi/ic_settings_update_black.png | Bin 710 -> 0 bytes .../drawable-xxhdpi/ic_settings_update_black.png | Bin 1091 -> 0 bytes .../ic_settings_update_black.png | Bin 2029 -> 0 bytes 11 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/src/main/ic_settings_update_white-web.png delete mode 100755 app/src/main/res/drawable/drawable-hdpi/ic_settings_update_black.png delete mode 100755 app/src/main/res/drawable/drawable-mdpi/ic_settings_update_black.png delete mode 100755 app/src/main/res/drawable/drawable-xhdpi/ic_settings_update_black.png delete mode 100755 app/src/main/res/drawable/drawable-xxhdpi/ic_settings_update_black.png delete mode 100755 app/src/main/res/drawable/drawable-xxxhdpi/ic_settings_update_black.png delete mode 100755 app/src/main/res/drawable/ic_settings_update_black/drawable-hdpi/ic_settings_update_black.png delete mode 100755 app/src/main/res/drawable/ic_settings_update_black/drawable-mdpi/ic_settings_update_black.png delete mode 100755 app/src/main/res/drawable/ic_settings_update_black/drawable-xhdpi/ic_settings_update_black.png delete mode 100755 app/src/main/res/drawable/ic_settings_update_black/drawable-xxhdpi/ic_settings_update_black.png delete mode 100755 app/src/main/res/drawable/ic_settings_update_black/drawable-xxxhdpi/ic_settings_update_black.png diff --git a/app/src/main/ic_settings_update_white-web.png b/app/src/main/ic_settings_update_white-web.png deleted file mode 100644 index 60383b7901b4d341b2428782840b828ef3c65f9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9830 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 diff --git a/app/src/main/res/drawable/drawable-hdpi/ic_settings_update_black.png b/app/src/main/res/drawable/drawable-hdpi/ic_settings_update_black.png deleted file mode 100755 index 1e318eecc2817d0da257bfbfd8b96aabca214f04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 431 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^TIJBsuwEZMZhtXJ?ObIx*K(VRbg-8F4%|1~c7*Kp%@WaM&h2M(2~V#_+`1@rJ6 zzBe;=)8@QFJ(*{P@8?#(yLp_4%}7&$bxDKB1g0PdE)PZ!$6+_uoQFHq6PVXDxF_&@ zxp(g12k9TCA6oz3Gb_rSurBKv*T%h@xHqg+%6j`&p#D}nU!TJxxd*EgCvN=~|9^L5 zJI~7*@uAAXrc4iiXZlG+Hi>ipxnA>*w@35>TkCse7OMT* z?l*(o^@qy6=&VP27TYhD+?W0!aMkUAp#jURTVkB^4=_ErJjoO6c|=HDn9Eepu;Oc! U)=K@?z!+fgboFyt=akR{04@o<&Hw-a diff --git a/app/src/main/res/drawable/drawable-mdpi/ic_settings_update_black.png b/app/src/main/res/drawable/drawable-mdpi/ic_settings_update_black.png deleted file mode 100755 index 964553137f8d2d1138c49f86c6414fe6af9bbad9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379 zcmV->0fhdEP)Px$HAzH4R9Fe^l)Fj;Q4ogX-9ig1v9+?Ww6*ay6blPMQi<6348b~Gn&cTQ^8yxv zU~3^-i-9D@>-WPMGAxIH*-hmPe9XTyb7q#|?AB^wv4Pk?Y~a6dV4=hUHaNQrTQE%E zW^b#ExP%Y*NsRCpumUr+Wx99Z6KuG7y-*vLpmJNJ;|?^y27aO66VetxM^|cVbZbH% zY>50F93-SIcZ=SH%It(r-(UmGcijYOi<`eDrk5{m4|K4m-gjMRX`hqUJ-Kowr<~MnFE)QAcAStd=Jl-4 zvb5>P(}LUpef$202Cl diff --git a/app/src/main/res/drawable/drawable-xhdpi/ic_settings_update_black.png b/app/src/main/res/drawable/drawable-xhdpi/ic_settings_update_black.png deleted file mode 100755 index 049edf0d876c5964133ec3e7ed787e284ddf1954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 710 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-HD>U~2GmaSW+o zd^^oHThvjcP1u)(d$AyQAU7w+v@D&_Yi=$%e>DHGtQBbzV`I4(ub}D7WVTV{;F4~I z8xbp3ENIfun)SR@Hsamf!t}|r-`sm${UEjMe9hd?XO6$SG2<+Y&jFn1pEA>9-6vKj z=eS=`+_HVnf9t30U-A-UHr{$l=@)iu-dIb)r6U-Y)Ji1fCcop7``WO_yZU*lgg?#{XF9se|6`RaYIZQU1~q2c?yLhh;B?5y&B!;*TQ z)|YMe-Fb^mrxZU6?qvTjeay0P+fg+(i&rMeXBTFBod3V+bqH6$Rlko#+h1wS|9aA< zKhE`))#FQ%@eYYsU!77C+F7%*&VPmQg2O9%>&2J(-j-V>w=m>`VZETF-@b_GpZ^w| z&ycw_*a+5(kV_od_{gK=MU2ERK zvi=+Y?dKQm|DEm%zrFMNljxNe{-4$u&)?J?GRL`lC7bor>-M!dv%_lhGbb}^9jTeg z{&i)aV0E30)t1P*lN=!jwH4P!%@s8{;c3?sX?}0p_4P*1Ii*SazHhnuYMD;?)5ACJ z2Qj~0@?ULoYeSKjW5?STruuiM+AF_A=G;9eaL`?(>6GTwj8b)z*q;W+=U&^a&hYoY zy^G?CJ3#_nLB8Q}#V_tZHhI9}Iaf{Qp-??F8bk@_U ze=J_j$#gAIzvG}E@J@Y`-cR|SrQH7MakuvcYx~=n2^%otL=t>V((ikkB%aAm*bYpX N44$rjF6*2UngDR^J5c}t diff --git a/app/src/main/res/drawable/drawable-xxhdpi/ic_settings_update_black.png b/app/src/main/res/drawable/drawable-xxhdpi/ic_settings_update_black.png deleted file mode 100755 index 10ae87baed7fa8ea0d0b78de6bb76f7a65ca5c83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1091 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-HD>VE*gr;uuoF z_;%Lm)xLo;$JduXs_L0?oaOp#BgYlH+3&fqxv;UF>Zxy-wBLcPt5aplB%=ckbF|Hu zXbX2Ws`T?1d^n-J{`~fLXWy2bi>rRW`Mq8G{ojADE`N73d+q&OuQz|YmA<|)+qtb-oso0l4VTvA6GF@Omi3=lIrTw@;f4uD zv1`Aom{tAJ+i9KjOa78;vc%uajF6(3-}X=JSr;E@Y%Gi5-RRxUzxDrU+LvP zf9D<9x&GpOVr*~d$jdVTOsC2G6Wv}sxk2~r-P71}E?3%kUac!-W zdgUUKonKs*>^)f$|Y|M-g?PbeHW6-*jseB zdodf&id@!LPx)o{Uv;>zd-;nmGn0x3)8;iTE4Jr)6vgcP#<{fL=HC0|v7Ca}ObQE& zCQo_!Hs|GI3uO8M&IeQNrWKcE2`mfls?F&pX{?y?Wi$K=qgF8=EJU z)|al%QlGS6jH^?y^~GJ+*WzN7-fx*+&&t;ucLK6UgrSE?L diff --git a/app/src/main/res/drawable/drawable-xxxhdpi/ic_settings_update_black.png b/app/src/main/res/drawable/drawable-xxxhdpi/ic_settings_update_black.png deleted file mode 100755 index 49ac8ea654e4f48096c13cdb32633705825c5981..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2029 zcmc(g{Xf$S8^^yJ+ZqRrh~?p+4doWcLt=7=bL9CXr1G@fg%+j<&tkJBloAJFiiMnt zo!irHlG!kh40jBXeaDG|X-i}>9Oth%ug~Xmy??oWxL(&UpX{H#U6mBj3IG5oxt(_L z-DAez*$3a7oRj#0JwR^wx;g>%JncmQK-9XqobpSAtduQ32tKQsbunS-|3wsJ8mDxegtUoa*Ima^3#>+cyAUe#-l9o=_vzPf1 zHBRW6>R_o&CwrZt6K4)~1v9iovUiogZ(O-pOCsEj3ezISZz3<~_`6?qqHH+Abjevl zv@LuoCp=1uD^V`WYRJ;N*p7`%f!ZF?qh2POj81M^rGHNZ45cJg|(tU-xGQ~iM^45a+( z2d@2+H_5VVyMr!JZ`+-5VPcuU8;UhJ%kZ}dux<=BiT{RUqRiy0haj$D1#Y5dT3UVP z7(?}fI>v|cew5m%o#~nzqjUGTYvxl z*fEbI5bw|YZ(JdocuPh-X5+k{ey)&bUKuubRPO$wh(|-a=89MlF_+ z&5-lVXaE(7WlU7g7Eo6xPYe~amrq6dD}B6eZ;@|=U1gaUWnviWA=KlbrBo|t(xlKg zRA*hW(#!hEl*1+FkGMmo1fQ<(;qE$2@ro|yEx_L)2o;Pm`t4Kb%~+cHO%ZAA7jUvS zR$_CF(o3hv6L&?6Gi$xkqbYKEsRdytL{N`Ya{?n{e0S2s9Qr9GMQC$X$z$3;LLBIh z#koKHv?kX5wyRo1odV+{Wyb9kRdYpD#m@SnvM5kaQ+`<_6rLeAd^SCn+Axso@ceq~ zY}MGxOeBXYtOk>~Tzd4goX(^Akn)}FYaKZfRu89mNXR{jw#xnklnm$k|r|%;)O^hPjoEh}I(Uoe`JX z`Kis8^B+;omszXhk%bR|DT}9(uCe|?=-@9cjVv)k;itBRPopyLg^k8P=T>(W#Dg0j z{@$yfaZp-&!T0Y4?tf59$vU)6;f6#&?R#MYI@lEYv9I=jl?>7OU(xqfRYAk=$`vgM z=J<{`Dme13--96?E;`n`lI6WeO6&0SGfvRdyCf=jml1PLs~)M{(IP&cs~wj)yi%SK zs^Zm8<2AI+PwjMlR&;#nC_U(fYgM+^@gDesxAALcpOiT~mOsmaRnd7XRfNn;PH88g z3$gE9D)lMI>c-wq)|)x;M{Bsu8Ho&Y^@N}6zJWIwMa8u95CdH{6Ur5in*3CIL23Fi z&n!F6WFK|$1*3(hs8hG1s>({adGt@?_5Zy6uirUU=9pDKE@>J@Gnqh%`&z%ys7q}p zy;OR9WC@tp`%<3%W{iOpg3lROhDg8W-HBRy$Ozx&^ZXdvn!3HFas{mX(1e8>*_Bbd z*19xU(3X`(_2CSf_yQ~60w|)m{d_J^*^}G|x-%h5^_xMLB0bvjxW&R?;yl61-3`Dn zH5g`FlNp9_Xxj_R=zJPIFamfou2bQ9O>TK-nE^*Xc%=Got(bQLQ(=>jwcot0eolIoU?Sdr^W?r>SUlPkLg*BH@e85fz+nCz7f}rQ1!+g_uukr zK$s14)mjOc+s`JQwxd${0hIX zKd7%e8>k#Z;gJV#u@}P(m?@EVxU)q4b~!#L!hGLtkA8~zDOHR8a{rizdsvPucn{Go T%FJM|zX7)&yIJBsuwEZMZhtXJ?ObIx*K(VRbg-8F4%|1~c7*Kp%@WaM&h2M(2~V#_+`1@rJ6 zzBe;=)8@QFJ(*{P@8?#(yLp_4%}7&$bxDKB1g0PdE)PZ!$6+_uoQFHq6PVXDxF_&@ zxp(g12k9TCA6oz3Gb_rSurBKv*T%h@xHqg+%6j`&p#D}nU!TJxxd*EgCvN=~|9^L5 zJI~7*@uAAXrc4iiXZlG+Hi>ipxnA>*w@35>TkCse7OMT* z?l*(o^@qy6=&VP27TYhD+?W0!aMkUAp#jURTVkB^4=_ErJjoO6c|=HDn9Eepu;Oc! U)=K@?z!+fgboFyt=akR{04@o<&Hw-a diff --git a/app/src/main/res/drawable/ic_settings_update_black/drawable-mdpi/ic_settings_update_black.png b/app/src/main/res/drawable/ic_settings_update_black/drawable-mdpi/ic_settings_update_black.png deleted file mode 100755 index 964553137f8d2d1138c49f86c6414fe6af9bbad9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379 zcmV->0fhdEP)Px$HAzH4R9Fe^l)Fj;Q4ogX-9ig1v9+?Ww6*ay6blPMQi<6348b~Gn&cTQ^8yxv zU~3^-i-9D@>-WPMGAxIH*-hmPe9XTyb7q#|?AB^wv4Pk?Y~a6dV4=hUHaNQrTQE%E zW^b#ExP%Y*NsRCpumUr+Wx99Z6KuG7y-*vLpmJNJ;|?^y27aO66VetxM^|cVbZbH% zY>50F93-SIcZ=SH%It(r-(UmGcijYOi<`eDrk5{m4|K4m-gjMRX`hqUJ-Kowr<~MnFE)QAcAStd=Jl-4 zvb5>P(}LUpef$202Cl diff --git a/app/src/main/res/drawable/ic_settings_update_black/drawable-xhdpi/ic_settings_update_black.png b/app/src/main/res/drawable/ic_settings_update_black/drawable-xhdpi/ic_settings_update_black.png deleted file mode 100755 index 049edf0d876c5964133ec3e7ed787e284ddf1954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 710 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-HD>U~2GmaSW+o zd^^oHThvjcP1u)(d$AyQAU7w+v@D&_Yi=$%e>DHGtQBbzV`I4(ub}D7WVTV{;F4~I z8xbp3ENIfun)SR@Hsamf!t}|r-`sm${UEjMe9hd?XO6$SG2<+Y&jFn1pEA>9-6vKj z=eS=`+_HVnf9t30U-A-UHr{$l=@)iu-dIb)r6U-Y)Ji1fCcop7``WO_yZU*lgg?#{XF9se|6`RaYIZQU1~q2c?yLhh;B?5y&B!;*TQ z)|YMe-Fb^mrxZU6?qvTjeay0P+fg+(i&rMeXBTFBod3V+bqH6$Rlko#+h1wS|9aA< zKhE`))#FQ%@eYYsU!77C+F7%*&VPmQg2O9%>&2J(-j-V>w=m>`VZETF-@b_GpZ^w| z&ycw_*a+5(kV_od_{gK=MU2ERK zvi=+Y?dKQm|DEm%zrFMNljxNe{-4$u&)?J?GRL`lC7bor>-M!dv%_lhGbb}^9jTeg z{&i)aV0E30)t1P*lN=!jwH4P!%@s8{;c3?sX?}0p_4P*1Ii*SazHhnuYMD;?)5ACJ z2Qj~0@?ULoYeSKjW5?STruuiM+AF_A=G;9eaL`?(>6GTwj8b)z*q;W+=U&^a&hYoY zy^G?CJ3#_nLB8Q}#V_tZHhI9}Iaf{Qp-??F8bk@_U ze=J_j$#gAIzvG}E@J@Y`-cR|SrQH7MakuvcYx~=n2^%otL=t>V((ikkB%aAm*bYpX N44$rjF6*2UngDR^J5c}t diff --git a/app/src/main/res/drawable/ic_settings_update_black/drawable-xxhdpi/ic_settings_update_black.png b/app/src/main/res/drawable/ic_settings_update_black/drawable-xxhdpi/ic_settings_update_black.png deleted file mode 100755 index 10ae87baed7fa8ea0d0b78de6bb76f7a65ca5c83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1091 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-HD>VE*gr;uuoF z_;%Lm)xLo;$JduXs_L0?oaOp#BgYlH+3&fqxv;UF>Zxy-wBLcPt5aplB%=ckbF|Hu zXbX2Ws`T?1d^n-J{`~fLXWy2bi>rRW`Mq8G{ojADE`N73d+q&OuQz|YmA<|)+qtb-oso0l4VTvA6GF@Omi3=lIrTw@;f4uD zv1`Aom{tAJ+i9KjOa78;vc%uajF6(3-}X=JSr;E@Y%Gi5-RRxUzxDrU+LvP zf9D<9x&GpOVr*~d$jdVTOsC2G6Wv}sxk2~r-P71}E?3%kUac!-W zdgUUKonKs*>^)f$|Y|M-g?PbeHW6-*jseB zdodf&id@!LPx)o{Uv;>zd-;nmGn0x3)8;iTE4Jr)6vgcP#<{fL=HC0|v7Ca}ObQE& zCQo_!Hs|GI3uO8M&IeQNrWKcE2`mfls?F&pX{?y?Wi$K=qgF8=EJU z)|al%QlGS6jH^?y^~GJ+*WzN7-fx*+&&t;ucLK6UgrSE?L diff --git a/app/src/main/res/drawable/ic_settings_update_black/drawable-xxxhdpi/ic_settings_update_black.png b/app/src/main/res/drawable/ic_settings_update_black/drawable-xxxhdpi/ic_settings_update_black.png deleted file mode 100755 index 49ac8ea654e4f48096c13cdb32633705825c5981..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2029 zcmc(g{Xf$S8^^yJ+ZqRrh~?p+4doWcLt=7=bL9CXr1G@fg%+j<&tkJBloAJFiiMnt zo!irHlG!kh40jBXeaDG|X-i}>9Oth%ug~Xmy??oWxL(&UpX{H#U6mBj3IG5oxt(_L z-DAez*$3a7oRj#0JwR^wx;g>%JncmQK-9XqobpSAtduQ32tKQsbunS-|3wsJ8mDxegtUoa*Ima^3#>+cyAUe#-l9o=_vzPf1 zHBRW6>R_o&CwrZt6K4)~1v9iovUiogZ(O-pOCsEj3ezISZz3<~_`6?qqHH+Abjevl zv@LuoCp=1uD^V`WYRJ;N*p7`%f!ZF?qh2POj81M^rGHNZ45cJg|(tU-xGQ~iM^45a+( z2d@2+H_5VVyMr!JZ`+-5VPcuU8;UhJ%kZ}dux<=BiT{RUqRiy0haj$D1#Y5dT3UVP z7(?}fI>v|cew5m%o#~nzqjUGTYvxl z*fEbI5bw|YZ(JdocuPh-X5+k{ey)&bUKuubRPO$wh(|-a=89MlF_+ z&5-lVXaE(7WlU7g7Eo6xPYe~amrq6dD}B6eZ;@|=U1gaUWnviWA=KlbrBo|t(xlKg zRA*hW(#!hEl*1+FkGMmo1fQ<(;qE$2@ro|yEx_L)2o;Pm`t4Kb%~+cHO%ZAA7jUvS zR$_CF(o3hv6L&?6Gi$xkqbYKEsRdytL{N`Ya{?n{e0S2s9Qr9GMQC$X$z$3;LLBIh z#koKHv?kX5wyRo1odV+{Wyb9kRdYpD#m@SnvM5kaQ+`<_6rLeAd^SCn+Axso@ceq~ zY}MGxOeBXYtOk>~Tzd4goX(^Akn)}FYaKZfRu89mNXR{jw#xnklnm$k|r|%;)O^hPjoEh}I(Uoe`JX z`Kis8^B+;omszXhk%bR|DT}9(uCe|?=-@9cjVv)k;itBRPopyLg^k8P=T>(W#Dg0j z{@$yfaZp-&!T0Y4?tf59$vU)6;f6#&?R#MYI@lEYv9I=jl?>7OU(xqfRYAk=$`vgM z=J<{`Dme13--96?E;`n`lI6WeO6&0SGfvRdyCf=jml1PLs~)M{(IP&cs~wj)yi%SK zs^Zm8<2AI+PwjMlR&;#nC_U(fYgM+^@gDesxAALcpOiT~mOsmaRnd7XRfNn;PH88g z3$gE9D)lMI>c-wq)|)x;M{Bsu8Ho&Y^@N}6zJWIwMa8u95CdH{6Ur5in*3CIL23Fi z&n!F6WFK|$1*3(hs8hG1s>({adGt@?_5Zy6uirUU=9pDKE@>J@Gnqh%`&z%ys7q}p zy;OR9WC@tp`%<3%W{iOpg3lROhDg8W-HBRy$Ozx&^ZXdvn!3HFas{mX(1e8>*_Bbd z*19xU(3X`(_2CSf_yQ~60w|)m{d_J^*^}G|x-%h5^_xMLB0bvjxW&R?;yl61-3`Dn zH5g`FlNp9_Xxj_R=zJPIFamfou2bQ9O>TK-nE^*Xc%=Got(bQLQ(=>jwcot0eolIoU?Sdr^W?r>SUlPkLg*BH@e85fz+nCz7f}rQ1!+g_uukr zK$s14)mjOc+s`JQwxd${0hIX zKd7%e8>k#Z;gJV#u@}P(m?@EVxU)q4b~!#L!hGLtkA8~zDOHR8a{rizdsvPucn{Go T%FJM|zX7)&y Date: Sun, 27 Jan 2019 16:57:56 +0100 Subject: [PATCH 183/207] add changelog for version v0.15.1 --- fastlane/metadata/android/en-US/changelogs/71.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/71.txt diff --git a/fastlane/metadata/android/en-US/changelogs/71.txt b/fastlane/metadata/android/en-US/changelogs/71.txt new file mode 100644 index 000000000..51b31102d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/71.txt @@ -0,0 +1,11 @@ +### 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) + +### Fixed +* YouTube live streams stop playing after a short time (#1996 by @yausername) + From 1856a5a82fa84371797eebaff2b52e0e49e70877 Mon Sep 17 00:00:00 2001 From: nautilusx Date: Sat, 26 Jan 2019 15:03:15 +0000 Subject: [PATCH 184/207] Translated using Weblate (German) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-de/strings.xml | 58 +++++++++++++------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3e47bd3b6..24c1aeb3a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,4 +1,4 @@ - + %1$s Aufrufe Veröffentlicht am %1$s @@ -14,9 +14,9 @@ Teilen mit Browser auswählen Drehen des Geräts - Download-Verzeichnis für Videos + Downloadverzeichnis für Videos Verzeichnis für heruntergeladene Videos - Download-Verzeichnis für Videos angeben + Downloadverzeichnis für Videos angeben Standardauflösung Mit Kodi abspielen Kore App wurde nicht gefunden. Kore jetzt installieren? @@ -43,12 +43,12 @@ Abspielen Benutze Tor - (Experimentell) Erzwinge das Herunterladen durch Tor für verbesserte Privatsphäre (Videostream noch nicht unterstützt). + (Experimentell) Erzwinge das Herunterladen über Tor für verbesserte Privatsphäre (Videostream werden noch nicht unterstützt). Netzwerkfehler - Download-Ordner für Audiodateien + Downloadverzeichnis für Audiodateien Heruntergeladene Audiodateien werden hier gespeichert - Download-Verzeichnis für Audiodateien angeben + Downloadverzeichnis für Audiodateien angeben Design Dunkel @@ -56,8 +56,8 @@ Aussehen Andere - Kann Download-Verzeichnis \'%1$s\' nicht anlegen - Download-Verzeichnis \'%1$s\' erstellt + Kann Downloadverzeichnis \'%1$s\' nicht anlegen + Downloadverzeichnis \'%1$s\' erstellt Fehler Konnte nicht alle Vorschaubilder laden Konnte Video-URL-Signatur nicht entschlüsseln @@ -88,7 +88,7 @@ Entschuldigung. Dies hätte nicht passieren sollen. Entschuldigung. Es sind einige Fehler aufgetreten. Dein Kommentar (auf englisch): - Konnte keinen Stream holen + Konnte keinen Stream abrufen Autoplay Spiele ein Video ab, wenn NewPipe von einer anderen App aufgerufen wurde Einen Fehler melden @@ -115,7 +115,7 @@ Datei existiert bereits Bitte warten… In Zwischenablage kopiert - Bitte wähle ein verfügbares Download-Verzeichnis + Bitte wähle ein verfügbares Downloadverzeichnis Starten Pause @@ -171,7 +171,7 @@ Pop-up Filter Aktualisieren - Leeren + Löschen Größenänderung Beste Auflösung @@ -199,7 +199,7 @@ Buchstaben und Zahlen Abonnieren Abonniert - Abo beendet + Abonnement beendet Abos Neuigkeiten @@ -223,7 +223,7 @@ NewPipe-Benachrichtigung - Benachrichtigungen für NewPipe-Hintergrund- und Pop-up Player + Benachrichtigungen für NewPipe-Hintergrund- und Pop-up Wiedergabe Hauptmenü Verhalten @@ -262,7 +262,7 @@ Wähle einen Kanal aus Noch keine Kanalabonnements vorhanden Trends - In der Warteschlange des Pop-up-Players + In der Warteschlange der Pop-up-Wiedergabe Alles abspielen Entfernen @@ -277,7 +277,7 @@ Details Top 50 Nicht behebbarer Wiedergabefehler aufgetreten - Player-Fehler gelöst + Wiederherstellen nach einem Wiedergabefehler Kiosk-Seite Kiosk auswählen @@ -302,14 +302,14 @@ NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür verwenden, dir die beste Nutzererfahrung zu bieten. Gib etwas zurück, um den Entwicklern zu helfen, NewPipe noch besser machen zu können, während sie sich an einer Tasse Kaffee erfreuen. Service Keinen Streamplayer gefunden (du kannst VLC installieren, um den Stream abzuspielen). - Standard-Land des Inhalts + Bevorzugtes Land des Inhalts Immer Nur einmal Ausrichtung umschalten In den Hintergrund wechseln - Zu Popup wechseln - Zum normalen Player wechseln + Zum Pop-up wechseln + Zur normalen Wiedergabe wechseln Externe Player unterstützen diese Art von Links nicht Ungültige URL @@ -328,15 +328,15 @@ Gewünschten Inhalt laden Datenbank importieren Datenbank exportieren - Überschreibt Ihren aktuellen Verlauf und Ihre Abonnements - Verlauf, Abos und Wiedergabelisten exportieren + Überschreibt deinen aktuellen Verlauf und deine Abonnements + Verlauf, Abonnements und Wiedergabelisten exportieren Keine gültige ZIP-Datei Warnung: Nicht alle Dateien konnten importiert werden. Dies wird deine aktuellen Einstellungen überschreiben. Info anzeigen - Wiedergabelisten-Lesezeichen + Lesezeichen für Wiedergabelisten Hinzufügen zu @@ -378,7 +378,7 @@ Mit ungenauem Suchen kann die Abspielposition schneller erreicht werden, aber auf Kosten der Genauigkeit Datei - Ordner existiert nicht + Verzeichnis existiert nicht Die Datei existiert nicht oder die Rechte zum Lesen oder Schreiben fehlen Dateiname darf nicht leer sein Ein Fehler ist aufgetreten: %1$s @@ -452,7 +452,7 @@ Keine Streams zum Download verfügbar - Bevorzugte \'öffnen\' Aktion + Bevorzugte \'Öffnen\' Aktion Standardaktion beim Öffnen von Inhalten - %s Untertitel @@ -460,12 +460,12 @@ Keine App zum Abspielen dieser Datei installiert - Verlauf leeren + Wiedergabeverlauf löschen Löscht den Verlauf der abgespielten Streams - Den ganzen Verlauf löschen\? - Verlauf gelöscht. + Den ganzen Wiedergabeverlauf löschen\? + Wiedergabeverlauf gelöscht. Suchverlauf löschen - Lösche Verlauf der Suchschlüsselwörter + Löscht den Verlauf der Suchbegriffe Den gesamten Suchverlauf löschen\? Suchverlauf gelöscht. 1 Element gelöscht. @@ -476,7 +476,7 @@ NewPipe-Datenschutzbestimmungen Dem NewPipe-Projekt ist Datenschutz sehr wichtig. Deshalb sammelt diese App keine Daten ohne deine Zustimmung. \nNewPipes Datenschutzbestimmungen erklären im Detail, welche Daten beim Absenden eines Absturzberichtes verschickt und gespeichert werden. - Lies die Datenschutzbestimmungen + Datenschutzbestimmungen lesen Akzeptieren Ablehnen Um der europäischen Datenschutz-Grundverordnung (DSGVO) gerecht zu werden, weisen wir hiermit auf NewPipe\'s Datenschutzerklärung hin. Bitte lies sie sorgfältig durch. @@ -497,4 +497,4 @@ Wiedergabelisten Titel Nutzer - + \ No newline at end of file From 45339fd6d2fb849c5fe20205ac900a54153c06e3 Mon Sep 17 00:00:00 2001 From: Laura Arjona Reina Date: Sat, 26 Jan 2019 15:35:06 +0000 Subject: [PATCH 185/207] Translated using Weblate (Spanish) Currently translated at 100.0% (383 of 383 strings) --- app/src/main/res/values-es/strings.xml | 30 +++++++++++++------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 7342a7c2b..a789b741b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -45,7 +45,7 @@ No se puede crear la carpeta de descarga \'%1$s\' Carpeta de descarga creada \'%1$s\' - Ruta para almacenar los audios descargados + Los audios descargados se almacenan aquí Introducir ruta de descarga para archivos de audio Bloqueado por GEMA @@ -58,19 +58,19 @@ No se pudo cargar las miniaturas No se pudo descifrar la URL del vídeo No se pudo analizar el sitio web - Mostrar vídeos \'siguientes\' y \'similares\' + Mostrar vídeos \'Siguientes\' y \'Similares\' Idioma del contenido por defecto Vista previa del vídeo Vista previa del vídeo Me gusta No me gusta Miniatura del avatar del usuario - Esta es una transmisión en vivo, la cual aún no es compatible. + Las transmisiones en vivo aún no están soportadas Contenido Contenido restringido por edad - Vídeo restringido por edad. Permitir este tipo de material es posible desde Ajustes. + Mostrar vídeo restringido por edad. Permitir este tipo de material es posible desde \"Ajustes\". Toque en buscar para empezar Reproducción automática @@ -143,8 +143,8 @@ Este permiso es necesario para abrir en modo popup - reCAPTCHA Challenge - reCAPTCHA Challenge requerido + Reto reCAPTCHA + Reto reCAPTCHA requerido Modo popup de NewPipe @@ -267,7 +267,7 @@ abrir en modo popup Página de feed Página del canal Seleccione un canal - No hay canal suscrito todavía + No hay canales suscritos todavía Seleccione un kiosco Kiosco @@ -282,7 +282,7 @@ abrir en modo popup Se produjo un error irrecuperable del reproductor Recuperándose del error del reproductor - Reproductor de fondo + Reproductor en segundo plano Reproductor popup Quitar Detalles @@ -403,14 +403,14 @@ abrir en modo popup Usar búsqueda rápida inexacta La búsqueda inexacta permite al reproductor buscar posiciones más rápido con menor precisión Auto-encolar la siguiente transmisión - Auto-añadir un vídeo relacionado al reproducir el último vídeo en una cola no repetitiva + Auto-añadir un vídeo relacionado al reproducir el último vídeo en una cola no repetitiva. DIRECTO SINCRONIZAR Archivo - Directorio invalido - Fuente del archivo/contenido inválida - El archivo no existe o el permiso es insuficiente para leerlo o escribir en él + No existe el directorio + No existe la fuente del archivo/contenido + El archivo no existe o insuficientes permisos para leerlo o escribir en él El nombre del archivo no puede estar vacío Ocurrió un error: %1$s @@ -445,7 +445,7 @@ abrir en modo popup \n \n¿Desea continuar? Cargar Miniaturas - Descativar todas las miniaturas para evitar que se carguen, guarden datos y usen memoria. Al cambiar esto se borrarán tanto la caché de imágenes en la memoria como en el disco + Cuando está desactivado no se cargan miniaturas, economizando el uso de datos y memoria. Los cambios borrarán tanto la caché de imágenes en la memoria como en el disco. Caché de imagen limpiado Metadatos eliminados del caché Eliminar todos los datos de la página web en caché @@ -464,7 +464,7 @@ abrir en modo popup No hay ninguna app instalada para reproducir este archivo Subtítulos - Modificar la escala de texto de los subtítulos y los estilos de fondo del reproductor. Requiere el reinicio de la app para que surta efecto + Modificar la escala de texto de los subtítulos y los estilos de fondo del reproductor. Requiere el reinicio de la app para que surta efecto. Borrar historial de reproducciones Elimina el historial de las transmisiones reproducidas @@ -476,7 +476,7 @@ abrir en modo popup Historial de búsquedas eliminado. 1 elemento eliminado. - NewPipe es un software copyleft libre: puedes usarlo, estudiarlo, compartirlo y mejorarlo a tu antojo. Específicamente, puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General GNU publicada por la Free Software Foundation, ya sea la versión 3 de la Licencia, o (a tu elección) cualquier versión posterior. + NewPipe es software libre copyleft: puedes usarlo, estudiarlo, compartirlo y mejorarlo a tu antojo. Específicamente, puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General GNU publicada por la Free Software Foundation, ya sea la versión 3 de la Licencia, o (a tu elección) cualquier versión posterior. ¿Desea importar también los ajustes? Política de Privacidad de NewPipe From 3a56dabf422ac4f935264327e061f1cd7de9f95d Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Tue, 29 Jan 2019 13:23:39 +0100 Subject: [PATCH 186/207] fix exception on viewing downloads --- .../main/java/us/shandian/giga/ui/adapter/MissionAdapter.java | 4 ++++ 1 file changed, 4 insertions(+) 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 8fca7c470..4a35aa166 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 @@ -50,6 +50,7 @@ import us.shandian.giga.ui.common.Deleter; import us.shandian.giga.ui.common.ProgressDrawable; import us.shandian.giga.util.Utility; +import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.Intent.FLAG_GRANT_PREFIX_URI_PERMISSION; import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION; import static us.shandian.giga.get.DownloadMission.ERROR_CONNECT_HOST; @@ -322,6 +323,9 @@ public class MissionAdapter extends Adapter { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { intent.addFlags(FLAG_GRANT_PREFIX_URI_PERMISSION); } + if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { + intent.addFlags(FLAG_ACTIVITY_NEW_TASK); + } //mContext.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); Log.v(TAG, "Starting intent: " + intent); if (intent.resolveActivity(mContext.getPackageManager()) != null) { From b4ef20e7859f72ec975068a491903bab83802ed5 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Tue, 29 Jan 2019 13:38:38 +0100 Subject: [PATCH 187/207] fix failing tests --- .../java/org/schabi/newpipe/ApplicationTest.java | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 app/src/androidTest/java/org/schabi/newpipe/ApplicationTest.java diff --git a/app/src/androidTest/java/org/schabi/newpipe/ApplicationTest.java b/app/src/androidTest/java/org/schabi/newpipe/ApplicationTest.java deleted file mode 100644 index d5b0b7087..000000000 --- a/app/src/androidTest/java/org/schabi/newpipe/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.schabi.newpipe; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file From 1ae54f6f8c62a487bfd72c03c6edf431b4a221cc Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 23 Dec 2018 22:07:27 +0100 Subject: [PATCH 188/207] further compatiblity fix for meadic.ccc --- app/build.gradle | 2 +- .../fragments/detail/VideoDetailFragment.java | 21 +++++++++++++------ .../list/channel/ChannelFragment.java | 4 ++-- .../resolver/VideoPlaybackResolver.java | 18 +++++++++------- .../schabi/newpipe/util/ExtractorHelper.java | 13 ++++++++---- .../newpipe/util/StreamItemAdapter.java | 14 +++++++++---- app/src/main/res/values/colors_services.xml | 11 ++++++++++ 7 files changed, 58 insertions(+), 25 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 782634a0b..59cf01e89 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,7 +57,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.TeamNewPipe:NewPipeExtractor:f7c7b9df1a' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:73232a7ba' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' 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 edca200d7..6738083c3 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 @@ -55,6 +55,7 @@ import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.download.DownloadDialog; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor; @@ -699,13 +700,13 @@ public class VideoDetailFragment switch (id) { case R.id.menu_item_share: { if (currentInfo != null) { - shareUrl(currentInfo.getName(), currentInfo.getUrl()); + shareUrl(currentInfo.getName(), currentInfo.getOriginalUrl()); } return true; } case R.id.menu_item_openInBrowser: { if (currentInfo != null) { - openUrlInBrowser(currentInfo.getUrl()); + openUrlInBrowser(currentInfo.getOriginalUrl()); } return true; } @@ -1269,10 +1270,18 @@ public class VideoDetailFragment downloadDialog.show(activity.getSupportFragmentManager(), "downloadDialog"); } catch (Exception e) { - Toast.makeText(activity, - R.string.could_not_setup_download_menu, - Toast.LENGTH_LONG).show(); - e.printStackTrace(); + ErrorActivity.ErrorInfo info = ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, + ServiceList.all() + .get(currentInfo + .getServiceId()) + .getServiceInfo() + .getName(), "", + R.string.could_not_setup_download_menu); + + ErrorActivity.reportError(getActivity(), + e, + getActivity().getClass(), + getActivity().findViewById(android.R.id.content), info); } } 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 6a3b3eb50..b9489ffa7 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 @@ -233,10 +233,10 @@ public class ChannelFragment extends BaseListInfoFragment { openRssFeed(); break; case R.id.menu_item_openInBrowser: - openUrlInBrowser(url); + openUrlInBrowser(currentInfo.getOriginalUrl()); break; case R.id.menu_item_share: - shareUrl(name, url); + shareUrl(name, currentInfo.getOriginalUrl()); break; default: return super.onOptionsItemSelected(item); diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java index ad2b79523..c62dc1088 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java @@ -93,15 +93,17 @@ public class VideoPlaybackResolver implements PlaybackResolver { // Below are auxiliary media sources // Create subtitle sources - for (final SubtitlesStream subtitle : info.getSubtitles()) { - final String mimeType = PlayerHelper.subtitleMimeTypesOf(subtitle.getFormat()); - if (mimeType == null) continue; + if(info.getSubtitles() != null) { + for (final SubtitlesStream subtitle : info.getSubtitles()) { + final String mimeType = PlayerHelper.subtitleMimeTypesOf(subtitle.getFormat()); + if (mimeType == null) continue; - final Format textFormat = Format.createTextSampleFormat(null, mimeType, - SELECTION_FLAG_AUTOSELECT, PlayerHelper.captionLanguageOf(context, subtitle)); - final MediaSource textSource = dataSource.getSampleMediaSourceFactory() - .createMediaSource(Uri.parse(subtitle.getURL()), textFormat, TIME_UNSET); - mediaSources.add(textSource); + final Format textFormat = Format.createTextSampleFormat(null, mimeType, + SELECTION_FLAG_AUTOSELECT, PlayerHelper.captionLanguageOf(context, subtitle)); + final MediaSource textSource = dataSource.getSampleMediaSourceFactory() + .createMediaSource(Uri.parse(subtitle.getURL()), textFormat, TIME_UNSET); + mediaSources.add(textSource); + } } if (mediaSources.size() == 1) { diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index e04c1e8d0..041f4933f 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -31,6 +31,7 @@ import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.extractor.Info; import org.schabi.newpipe.extractor.ListExtractor.InfoItemsPage; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.SuggestionExtractor; import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; @@ -46,6 +47,7 @@ import org.schabi.newpipe.report.UserAction; import java.io.IOException; import java.io.InterruptedIOException; +import java.util.Collections; import java.util.List; import io.reactivex.Maybe; @@ -95,10 +97,13 @@ public final class ExtractorHelper { public static Single> suggestionsFor(final int serviceId, final String query) { checkServiceId(serviceId); - return Single.fromCallable(() -> - NewPipe.getService(serviceId) - .getSuggestionExtractor() - .suggestionList(query)); + return Single.fromCallable(() -> { + SuggestionExtractor extractor = NewPipe.getService(serviceId) + .getSuggestionExtractor(); + return extractor != null + ? extractor.suggestionList(query) + : Collections.emptyList(); + }); } public static Single getStreamInfo(final int serviceId, diff --git a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java index eb106f91d..49a7125ed 100644 --- a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java @@ -28,7 +28,8 @@ import io.reactivex.schedulers.Schedulers; import us.shandian.giga.util.Utility; /** - * A list adapter for a list of {@link Stream streams}, currently supporting {@link VideoStream} and {@link AudioStream}. + * A list adapter for a list of {@link Stream streams}, + * currently supporting {@link VideoStream}, {@link AudioStream} and {@link SubtitlesStream} */ public class StreamItemAdapter extends BaseAdapter { private final Context context; @@ -110,7 +111,10 @@ public class StreamItemAdapter extends BaseA } } } else if (stream instanceof AudioStream) { - qualityString = ((AudioStream) stream).getAverageBitrate() + "kbps"; + AudioStream audioStream = ((AudioStream) stream); + qualityString = audioStream.getAverageBitrate() > 0 + ? audioStream.getAverageBitrate() + "kbps" + : audioStream.getFormat().getName(); } else if (stream instanceof SubtitlesStream) { qualityString = ((SubtitlesStream) stream).getDisplayLanguageName(); if (((SubtitlesStream) stream).isAutoGenerated()) { @@ -154,8 +158,10 @@ public class StreamItemAdapter extends BaseA private final long[] streamSizes; private final String unknownSize; - public StreamSizeWrapper(List streamsList, Context context) { - this.streamsList = streamsList; + public StreamSizeWrapper(List sL, Context context) { + this.streamsList = sL != null + ? sL + : Collections.emptyList(); this.streamSizes = new long[streamsList.size()]; this.unknownSize = context == null ? "--.-" : context.getString(R.string.unknown_content); diff --git a/app/src/main/res/values/colors_services.xml b/app/src/main/res/values/colors_services.xml index 761b721d0..1cc464280 100644 --- a/app/src/main/res/values/colors_services.xml +++ b/app/src/main/res/values/colors_services.xml @@ -22,4 +22,15 @@ #FFFFFF #ff9100 + + #888888 + #555555 + #000000 + #777777 + + #888888 + #555555 + #FFFFFF + #777777 + \ No newline at end of file From e88a90f24288034481ec46075c9622a7ee27f04d Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 23 Dec 2018 22:41:42 +0100 Subject: [PATCH 189/207] add theming to mediaccc --- .../schabi/newpipe/util/ServiceHelper.java | 6 +- .../org/schabi/newpipe/util/ThemeHelper.java | 4 +- .../res/drawable-nodpi/place_holder_cloud.png | Bin 0 -> 8032 bytes .../res/drawable-nodpi/place_holder_gadse.png | Bin 0 -> 17166 bytes .../main/res/values-v21/styles_services.xml | 18 ++++++ app/src/main/res/values/colors_services.xml | 18 +++--- app/src/main/res/values/styles_services.xml | 20 ++++++ assets/media_gadse.svg | 60 ++++++++++++++++++ 8 files changed, 114 insertions(+), 12 deletions(-) create mode 100644 app/src/main/res/drawable-nodpi/place_holder_cloud.png create mode 100644 app/src/main/res/drawable-nodpi/place_holder_gadse.png create mode 100644 assets/media_gadse.svg diff --git a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java index 7c781eb14..da0d33809 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java @@ -24,9 +24,11 @@ public class ServiceHelper { case 0: return R.drawable.place_holder_youtube; case 1: - return R.drawable.place_holder_circle; + return R.drawable.place_holder_cloud; + case 2: + return R.drawable.place_holder_gadse; default: - return R.drawable.service; + return R.drawable.place_holder_circle; } } 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 1d1b66bf9..0c7861e16 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java @@ -137,7 +137,9 @@ public class ThemeHelper { else if (selectedTheme.equals(darkTheme)) themeName = "DarkTheme"; themeName += "." + service.getServiceInfo().getName(); - int resourceId = context.getResources().getIdentifier(themeName, "style", context.getPackageName()); + int resourceId = context + .getResources() + .getIdentifier(themeName, "style", context.getPackageName()); if (resourceId > 0) { return resourceId; diff --git a/app/src/main/res/drawable-nodpi/place_holder_cloud.png b/app/src/main/res/drawable-nodpi/place_holder_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..f78e846e155e78f04eafcf8d31459b2a0610a6b9 GIT binary patch literal 8032 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 B-o^j` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-nodpi/place_holder_gadse.png b/app/src/main/res/drawable-nodpi/place_holder_gadse.png new file mode 100644 index 0000000000000000000000000000000000000000..f11dd57e536590d12225cb9349eb6f930957f8b7 GIT binary patch literal 17166 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:ejEC0`Y5 zT)8Pn!NjkiOYMLRBy*q+)n)~MXB{AK2Kus-p7Emlg7$WIFmG-4wx&GLG$hZD${6W^J~{rs+GvB$%vSa0bFRsq;Dj12#VTxQCs<>?EEX_jXP$ zgsV{L08s~Uc=r^xm+UiL!$_&EVhOwE+_5|WsT1w&)zpNp{|Z0`iyYo24SM-7GqRxW zCIH$2w;{0gS;7ci|b^~FyH{YlS{m6_Xz1w9WlHoz_G zyH9TpCeEV7)ETmMq6#pH!0K8cD~9)_ElA+&2EsSL7eKb(YB%rm9bpQ7jC?v&^swWr zpCBBocaujlKQR}HiNz-07@qTkR3YKP5d-(e>PR3*da{ftX zK$`%0^ziDab+Iexz9yTNbSaN07V?ep#aFp4j-%eKyl331Ts-E)P>caNw&J}qTeDL^ zVl(%Y$>S{hhAoL(@r|fL0A>E1r+jtU{F(-iL3IIz$jK-3{3J%J2CkLLdO2+RgR2v< zf@mg?E=ZPVG5E*t=5KQzUQgnh;K1{upf6~Q>lX3nM)Oq?aq|J?-nRj77Pu`|B%(%2 zBTPSI6PE~YF^k;t-X=@KfJW_e+-S}iDH|xW}*V6iLR>^E&I(~6;ns{i$HBPK@t}VU-d=tXZdL}F%CeGmP=y`@O zhI37xGGf0B?|#nf=mF6aE-zQ{M;;m(eVvh-+^LR{nGdG1y9&dpHW8o!p4{5ofINl& oU+u<({FI}F`TzInRp2Y1vq@f6_KuYR-(3OOS~}pXju5W@AD*IeMF0Q* literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-v21/styles_services.xml b/app/src/main/res/values-v21/styles_services.xml index e3d6c24e2..6c118bc09 100644 --- a/app/src/main/res/values-v21/styles_services.xml +++ b/app/src/main/res/values-v21/styles_services.xml @@ -31,4 +31,22 @@ @color/dark_soundcloud_accent_color + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors_services.xml b/app/src/main/res/values/colors_services.xml index 1cc464280..ea90cb083 100644 --- a/app/src/main/res/values/colors_services.xml +++ b/app/src/main/res/values/colors_services.xml @@ -22,15 +22,15 @@ #FFFFFF #ff9100 - - #888888 - #555555 - #000000 - #777777 + + #9e9e9e + #616161 + #000000 + #afafaf - #888888 - #555555 - #FFFFFF - #777777 + #9e9e9e + #616161 + #FFFFFF + #afafaf \ No newline at end of file diff --git a/app/src/main/res/values/styles_services.xml b/app/src/main/res/values/styles_services.xml index 7ca9dacde..257b1905d 100644 --- a/app/src/main/res/values/styles_services.xml +++ b/app/src/main/res/values/styles_services.xml @@ -9,6 +9,7 @@ + + + + + + + + \ No newline at end of file diff --git a/assets/media_gadse.svg b/assets/media_gadse.svg new file mode 100644 index 000000000..eda875160 --- /dev/null +++ b/assets/media_gadse.svg @@ -0,0 +1,60 @@ + + + + + + image/svg+xml + + + + + + + + + From a1cc0897df286eb8307ed9527dd3a0c03b7d9c4b Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sat, 26 Jan 2019 22:57:04 +0100 Subject: [PATCH 190/207] make frontend not crash on scrolling on ccc search --- .../org/schabi/newpipe/fragments/list/search/SearchFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 2833abb8d..66827bd92 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -736,6 +736,7 @@ public class SearchFragment @Override protected void loadMoreItems() { + if(nextPageUrl == null || nextPageUrl.isEmpty()) return; isLoading.set(true); showListFooter(true); if (searchDisposable != null) searchDisposable.dispose(); From d8c76d4c213be8e2af8bb0d1719f345dbbdd1956 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Mon, 28 Jan 2019 13:33:30 +0100 Subject: [PATCH 191/207] add conferences --- app/build.gradle | 2 +- .../main/java/org/schabi/newpipe/util/KioskTranslator.java | 4 ++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 59cf01e89..83da79219 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,7 +57,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.TeamNewPipe:NewPipeExtractor:73232a7ba' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:150345929202a' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' diff --git a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java index 392892cef..a04e1145f 100644 --- a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java +++ b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java @@ -31,6 +31,8 @@ public class KioskTranslator { return c.getString(R.string.top_50); case "New & hot": return c.getString(R.string.new_and_hot); + case "conferences": + return c.getString(R.string.conferences); default: return kioskId; } @@ -44,6 +46,8 @@ public class KioskTranslator { return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_hot); case "New & hot": return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_hot); + case "conferences": + return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_hot); default: return 0; } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3756119a6..d83d4d3a4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -396,6 +396,7 @@ Trending Top 50 New & hot + Conferences %1$s/%2$s From d0a3125df4d228d65af6ac8e742f610c472deef8 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Tue, 29 Jan 2019 16:13:46 +0100 Subject: [PATCH 192/207] fox ogg --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 83da79219..af32cdc2c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,7 +57,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.TeamNewPipe:NewPipeExtractor:150345929202a' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:d0efe8bd47' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' From 6edbfe2a6f98c802fbb3e9f5b46e8cf81b3187b1 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Tue, 29 Jan 2019 17:20:30 +0100 Subject: [PATCH 193/207] add content filter to mediaccc --- app/build.gradle | 2 +- .../newpipe/fragments/list/search/SearchFragment.java | 9 +++++++-- .../main/java/org/schabi/newpipe/util/ServiceHelper.java | 2 ++ app/src/main/res/values/strings.xml | 1 + 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index af32cdc2c..75f966a9b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,7 +57,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.TeamNewPipe:NewPipeExtractor:d0efe8bd47' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:79b0a19d1af' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 66827bd92..c683f1af7 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -104,8 +104,13 @@ public class SearchFragment // this three represet the current search query @State protected String searchString; + + /** + * No content filter should add like contentfilter = all + * be aware of this when implementing an extractor. + */ @State - protected String[] contentFilter; + protected String[] contentFilter = new String[0]; @State protected String sortFilter; @@ -335,7 +340,7 @@ public class SearchFragment || (searchEditText != null && !TextUtils.isEmpty(searchEditText.getText()))) { search(!TextUtils.isEmpty(searchString) ? searchString - : searchEditText.getText().toString(), new String[0], ""); + : searchEditText.getText().toString(), this.contentFilter, ""); } else { if (searchEditText != null) { searchEditText.setText(""); diff --git a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java index da0d33809..c6ce3fec7 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java @@ -40,6 +40,8 @@ public class ServiceHelper { case "playlists": return c.getString(R.string.playlists); case "tracks": return c.getString(R.string.tracks); case "users": return c.getString(R.string.users); + case "conferences" : return c.getString(R.string.conferences); + case "events" : return c.getString(R.string.events); default: return filter; } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d83d4d3a4..462b331d2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -137,6 +137,7 @@ Videos Tracks Users + Events Yes Later Disabled From 14043c86f551b951becc1dc0f47e9f1c35b481a5 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Thu, 31 Jan 2019 13:24:02 +0100 Subject: [PATCH 194/207] fix backstack issue with mediaccc --- .../fragments/detail/VideoDetailFragment.java | 54 ++++++++++++------- 1 file changed, 35 insertions(+), 19 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 6738083c3..c346e1329 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 @@ -363,7 +363,8 @@ public class VideoDetailFragment } break; case R.id.detail_controls_download: - if (PermissionHelper.checkStoragePermissions(activity, PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) { + if (PermissionHelper.checkStoragePermissions(activity, + PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) { this.openDownloadDialog(); } break; @@ -447,7 +448,6 @@ public class VideoDetailFragment return; } - //Log.d(TAG, "toggleExpandRelatedVideos() called with: info = [" + info + "], from = [" + INITIAL_RELATED_VIDEOS + "]"); for (int i = INITIAL_RELATED_VIDEOS; i < info.getRelatedStreams().size(); i++) { InfoItem item = info.getRelatedStreams().get(i); //Log.d(TAG, "i = " + i); @@ -520,7 +520,9 @@ public class VideoDetailFragment infoItemBuilder.setOnStreamSelectedListener(new OnClickGesture() { @Override public void selected(StreamInfoItem selectedItem) { - selectAndLoadVideo(selectedItem.getServiceId(), selectedItem.getUrl(), selectedItem.getName()); + selectAndLoadVideo(selectedItem.getServiceId(), + selectedItem.getUrl(), + selectedItem.getName()); } @Override @@ -743,10 +745,16 @@ public class VideoDetailFragment boolean isExternalPlayerEnabled = PreferenceManager.getDefaultSharedPreferences(activity) .getBoolean(activity.getString(R.string.use_external_video_player_key), false); - sortedVideoStreams = ListHelper.getSortedStreamVideosList(activity, info.getVideoStreams(), info.getVideoOnlyStreams(), false); + sortedVideoStreams = ListHelper.getSortedStreamVideosList( + activity, + info.getVideoStreams(), + info.getVideoOnlyStreams(), + false); selectedVideoStreamIndex = ListHelper.getDefaultResolutionIndex(activity, sortedVideoStreams); - final StreamItemAdapter streamsAdapter = new StreamItemAdapter<>(activity, new StreamSizeWrapper<>(sortedVideoStreams, activity), isExternalPlayerEnabled); + final StreamItemAdapter streamsAdapter = + new StreamItemAdapter<>(activity, + new StreamSizeWrapper<>(sortedVideoStreams, activity), isExternalPlayerEnabled); spinnerToolbar.setAdapter(streamsAdapter); spinnerToolbar.setSelection(selectedVideoStreamIndex); spinnerToolbar.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @@ -771,17 +779,17 @@ public class VideoDetailFragment */ protected final LinkedList stack = new LinkedList<>(); - public void clearHistory() { - stack.clear(); - } - public void pushToStack(int serviceId, String videoUrl, String name) { if (DEBUG) { - Log.d(TAG, "pushToStack() called with: serviceId = [" + serviceId + "], videoUrl = [" + videoUrl + "], name = [" + name + "]"); + Log.d(TAG, "pushToStack() called with: serviceId = [" + + serviceId + "], videoUrl = [" + videoUrl + "], name = [" + name + "]"); } - if (stack.size() > 0 && stack.peek().getServiceId() == serviceId && stack.peek().getUrl().equals(videoUrl)) { - Log.d(TAG, "pushToStack() called with: serviceId == peek.serviceId = [" + serviceId + "], videoUrl == peek.getUrl = [" + videoUrl + "]"); + if (stack.size() > 0 + && stack.peek().getServiceId() == serviceId + && stack.peek().getUrl().equals(videoUrl)) { + Log.d(TAG, "pushToStack() called with: serviceId == peek.serviceId = [" + + serviceId + "], videoUrl == peek.getUrl = [" + videoUrl + "]"); return; } else { Log.d(TAG, "pushToStack() wasn't equal"); @@ -812,7 +820,11 @@ public class VideoDetailFragment // Get stack item from the new top StackItem peek = stack.peek(); - selectAndLoadVideo(peek.getServiceId(), peek.getUrl(), !TextUtils.isEmpty(peek.getTitle()) ? peek.getTitle() : ""); + selectAndLoadVideo(peek.getServiceId(), + peek.getUrl(), + !TextUtils.isEmpty(peek.getTitle()) + ? peek.getTitle() + : ""); return true; } @@ -832,9 +844,10 @@ public class VideoDetailFragment } public void prepareAndHandleInfo(final StreamInfo info, boolean scrollToTop) { - if (DEBUG) Log.d(TAG, "prepareAndHandleInfo() called with: info = [" + info + "], scrollToTop = [" + scrollToTop + "]"); + if (DEBUG) Log.d(TAG, "prepareAndHandleInfo() called with: info = [" + + info + "], scrollToTop = [" + scrollToTop + "]"); - setInitialData(info.getServiceId(), info.getOriginalUrl(), info.getName()); + setInitialData(info.getServiceId(), info.getUrl(), info.getName()); pushToStack(serviceId, url, name); showLoading(); @@ -1027,7 +1040,8 @@ public class VideoDetailFragment private void showContentWithAnimation(long duration, long delay, - @FloatRange(from = 0.0f, to = 1.0f) float translationPercent) { + @FloatRange(from = 0.0f, to = 1.0f) + float translationPercent) { int translationY = (int) (getResources().getDisplayMetrics().heightPixels * (translationPercent > 0.0f ? translationPercent : .06f)); @@ -1135,7 +1149,7 @@ public class VideoDetailFragment super.handleResult(info); setInitialData(info.getServiceId(), info.getOriginalUrl(), info.getName()); - pushToStack(serviceId, url, name); + //pushToStack(serviceId, url, name); animateView(thumbnailPlayButton, true, 200); videoTitleTextView.setText(name); @@ -1186,11 +1200,13 @@ public class VideoDetailFragment if (info.getDuration() > 0) { detailDurationView.setText(Localization.getDurationString(info.getDuration())); - detailDurationView.setBackgroundColor(ContextCompat.getColor(activity, R.color.duration_background_color)); + detailDurationView.setBackgroundColor( + ContextCompat.getColor(activity, R.color.duration_background_color)); animateView(detailDurationView, true, 100); } else if (info.getStreamType() == StreamType.LIVE_STREAM) { detailDurationView.setText(R.string.duration_live); - detailDurationView.setBackgroundColor(ContextCompat.getColor(activity, R.color.live_duration_background_color)); + detailDurationView.setBackgroundColor( + ContextCompat.getColor(activity, R.color.live_duration_background_color)); animateView(detailDurationView, true, 100); } else { detailDurationView.setVisibility(View.GONE); From 2c2c61b2fcf12f48389029cc77c610e1fab96ec3 Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 31 Jan 2019 12:09:22 +0100 Subject: [PATCH 195/207] Add Artist and Duration to MediaDescription --- .../newpipe/player/playback/BasePlayerMediaSession.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/player/playback/BasePlayerMediaSession.java b/app/src/main/java/org/schabi/newpipe/player/playback/BasePlayerMediaSession.java index 00604b236..657fe1327 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playback/BasePlayerMediaSession.java +++ b/app/src/main/java/org/schabi/newpipe/player/playback/BasePlayerMediaSession.java @@ -1,7 +1,9 @@ package org.schabi.newpipe.player.playback; import android.net.Uri; +import android.os.Bundle; import android.support.v4.media.MediaDescriptionCompat; +import android.support.v4.media.MediaMetadataCompat; import org.schabi.newpipe.player.BasePlayer; import org.schabi.newpipe.player.mediasession.MediaSessionCallback; @@ -54,6 +56,12 @@ public class BasePlayerMediaSession implements MediaSessionCallback { .setTitle(item.getTitle()) .setSubtitle(item.getUploader()); + // set additional metadata for A2DP/AVRCP + Bundle additionalMetadata = new Bundle(); + additionalMetadata.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, item.getUploader()); + additionalMetadata.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, item.getDuration()); + descriptionBuilder.setExtras(additionalMetadata); + final Uri thumbnailUri = Uri.parse(item.getThumbnailUrl()); if (thumbnailUri != null) descriptionBuilder.setIconUri(thumbnailUri); From 1bac5db6d5f98afde953f4687bfd101f95d5ef21 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Thu, 31 Jan 2019 18:13:00 +0100 Subject: [PATCH 196/207] add splash --- app/src/main/res/drawable/splash_background.xml | 12 ++++++++++++ app/src/main/res/drawable/splash_forground.png | Bin 0 -> 1515 bytes app/src/main/res/values/styles.xml | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/splash_background.xml create mode 100644 app/src/main/res/drawable/splash_forground.png diff --git a/app/src/main/res/drawable/splash_background.xml b/app/src/main/res/drawable/splash_background.xml new file mode 100644 index 000000000..a1fd3b719 --- /dev/null +++ b/app/src/main/res/drawable/splash_background.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/splash_forground.png b/app/src/main/res/drawable/splash_forground.png new file mode 100644 index 0000000000000000000000000000000000000000..dd033cebff379a128455298b594035f10aba0c0b GIT binary patch literal 1515 zcmV0*{z40JIigfQtMT5t7K z_7VkAT0to#WJO_@2d8?ehe9g|U$rnY%`SGKG0;RE5{#4xnvlv2FZ1tVon_PH%$zxM z)~vJEUccv=@B7aDX0N@!Z?CgA6bgkxp-?Ck3WY*uNSY|=*4T9vYDj96<0DB^W7ku8 zdI*uELz3Dhjf-7ZW$7ivvrp0jNfx`l%F%}q&n8K2v1_ap0|=3%qmouhIxBXqm7oqG zo-Rp?B%Khu=Bycn5YHA#vtrksEe!~fq;5&8B~6T7e|9t|#Pg@5Ws**e{W-E>h(bJ_ zlIF$!EW^Qw*ag(dWMHkNHIgogT}(()5#pH->`=zteriGhMgt3RVzTS@QxxJkA6N-& zR7Tx?%0fIh03DKER|egF4nhD%0`~#Clz6wFixAHlzzX0SN!Q0NrV(-z;<+05TyAK2 zUhHB9L#{#q47eNkq1Nq>j$KeaQ3CK(|fGusGU13Uuk50K(aT(|#)q-z7j@0a9+0GQcfGg|>%3cLaw z4UlFgZUnPR(zyZRAD1MBc+9NJ%oYJNfXyLN;JW>tk`@m~x1Y2SkC}AW~+cHzze{k0BJ4<*44WGivq;YM~KJF_M6!fpbc0TC{539 z|Dbco_ISK#B>tElOWY znlYGPtfUY)*6p|BE|cE?x&x${4s5P<`)Akl3zZe(F|(h|?0#Ig|5bn#BXHe*U0akY zFT`VJ-vZA92Lh!y9e5n*cY9J10!W%9X*KXZZc{|FIgA^EPBpX7`uo9=0g@+!q_MdF z+QmRqJMJEQ3@kFUx~}RfD@4+5xXlz721@Z0u(UQ`tDDLRku(Kp2W}3O;vn!Mu-wcB zJsGHs5J}^4s51HAXMgwFoq;_xoF5o5LoIq(hap#F4PnWY6B56AA>Sku3 z6bFEpf#=PvDfeHp6e4K?unf4DFqifM-T@vnv!>pm%u0x)QMhx&GeE-=*8$jqJ5PkT zho6rSNpo;lPeZ;Z(FecbM89TcA$GX{83>Vk{Kj**c~JvN&Ft4eIgXL6kYVbw zKgBIiTLZ=aA4v+SEl+O&p&m}N7k9#bFHrnGNp-k5k1#U)5O7)y8Ib4^5{UJ{LNnVD zvxroWkY=(QxYNvTiY)`GeT4jl8>cih1Pn!0g{%c0G_xOL7t))m3E71k0)7~~kiMwO zIb=Vu1ZZnz8Ib=G5^M+3&|GM_x_OX;eP5)WvN3*N2*VuPLh6vl((|Q z;5b6cdkbUIOGtUMXKZRh%DZn{1xe#1of5l_LZMJ76bgkxp-?Ck3WY-Q`~zzo@gGPa R<(U8g002ovPDHLkV1g8fmzDqk literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 8753b9295..a7686dedc 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -5,7 +5,7 @@ @android:color/transparent @android:color/transparent - @color/dark_background_color + @drawable/splash_background From ed4b4a1a3ca0ccf570d275a07ced98555cd32105 Mon Sep 17 00:00:00 2001 From: Alec Holmes Date: Fri, 1 Feb 2019 13:02:28 +0000 Subject: [PATCH 197/207] Updated search fragment to be amazon fire tv friendly --- .../java/org/schabi/newpipe/firetv/FireTvUtils.java | 11 +++++++++++ .../fragments/list/search/SearchFragment.java | 13 +++++++++---- app/src/main/res/layout/toolbar_search_layout.xml | 4 +++- 3 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/firetv/FireTvUtils.java diff --git a/app/src/main/java/org/schabi/newpipe/firetv/FireTvUtils.java b/app/src/main/java/org/schabi/newpipe/firetv/FireTvUtils.java new file mode 100644 index 000000000..305c29ee7 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/firetv/FireTvUtils.java @@ -0,0 +1,11 @@ +package org.schabi.newpipe.firetv; + +import android.content.Context; +import org.schabi.newpipe.App; + +public class FireTvUtils { + public static boolean isFireTv(){ + final String AMAZON_FEATURE_FIRE_TV = "amazon.hardware.fire_tv"; + return App.getApp().getPackageManager().hasSystemFeature(AMAZON_FEATURE_FIRE_TV); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 2833abb8d..0e8aad01d 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -39,6 +39,7 @@ import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.search.SearchExtractor; import org.schabi.newpipe.extractor.search.SearchInfo; +import org.schabi.newpipe.firetv.FireTvUtils; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.list.BaseListFragment; import org.schabi.newpipe.local.history.HistoryRecordManager; @@ -449,6 +450,9 @@ public class SearchFragment if (isSuggestionsEnabled && errorPanelRoot.getVisibility() != View.VISIBLE) { showSuggestionsPanel(); } + if(FireTvUtils.isFireTv()){ + showKeyboardSearch(); + } }); searchEditText.setOnFocusChangeListener((View v, boolean hasFocus) -> { @@ -499,7 +503,9 @@ public class SearchFragment if (DEBUG) { Log.d(TAG, "onEditorAction() called with: v = [" + v + "], actionId = [" + actionId + "], event = [" + event + "]"); } - if (event != null + if(actionId == EditorInfo.IME_ACTION_PREVIOUS){ + hideKeyboardSearch(); + } else if (event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER || event.getAction() == EditorInfo.IME_ACTION_SEARCH)) { search(searchEditText.getText().toString(), new String[0], ""); @@ -541,7 +547,7 @@ public class SearchFragment if (searchEditText.requestFocus()) { InputMethodManager imm = (InputMethodManager) activity.getSystemService( Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(searchEditText, InputMethodManager.SHOW_IMPLICIT); + imm.showSoftInput(searchEditText, InputMethodManager.SHOW_FORCED); } } @@ -551,8 +557,7 @@ public class SearchFragment InputMethodManager imm = (InputMethodManager) activity.getSystemService( Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(searchEditText.getWindowToken(), - InputMethodManager.HIDE_NOT_ALWAYS); + imm.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN); searchEditText.clearFocus(); } diff --git a/app/src/main/res/layout/toolbar_search_layout.xml b/app/src/main/res/layout/toolbar_search_layout.xml index 797eea48e..9e9e51442 100644 --- a/app/src/main/res/layout/toolbar_search_layout.xml +++ b/app/src/main/res/layout/toolbar_search_layout.xml @@ -30,7 +30,9 @@ android:layout_width="48dp" android:layout_height="48dp" android:layout_gravity="right|center_vertical" - tools:ignore="RtlHardcoded"> + android:focusable="true" + tools:ignore="RtlHardcoded" + android:background="?attr/selectableItemBackground"> Date: Tue, 5 Feb 2019 18:24:34 +0100 Subject: [PATCH 198/207] remove splash for older android --- .../res/drawable-v23/splash_background.xml | 12 ++++ .../main/res/drawable/splash_background.xml | 7 +- .../main/res/drawable/splash_forground.png | Bin 1515 -> 0 bytes .../main/res/drawable/splash_forground.xml | 10 +++ assets/pure_logo.svg | 67 ++++++++++++++++++ 5 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 app/src/main/res/drawable-v23/splash_background.xml delete mode 100644 app/src/main/res/drawable/splash_forground.png create mode 100644 app/src/main/res/drawable/splash_forground.xml create mode 100644 assets/pure_logo.svg diff --git a/app/src/main/res/drawable-v23/splash_background.xml b/app/src/main/res/drawable-v23/splash_background.xml new file mode 100644 index 000000000..a67fbc4a6 --- /dev/null +++ b/app/src/main/res/drawable-v23/splash_background.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/splash_background.xml b/app/src/main/res/drawable/splash_background.xml index a1fd3b719..5b805cffa 100644 --- a/app/src/main/res/drawable/splash_background.xml +++ b/app/src/main/res/drawable/splash_background.xml @@ -2,11 +2,6 @@ + android:drawable="@color/dark_background_color"/> - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/splash_forground.png b/app/src/main/res/drawable/splash_forground.png deleted file mode 100644 index dd033cebff379a128455298b594035f10aba0c0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1515 zcmV0*{z40JIigfQtMT5t7K z_7VkAT0to#WJO_@2d8?ehe9g|U$rnY%`SGKG0;RE5{#4xnvlv2FZ1tVon_PH%$zxM z)~vJEUccv=@B7aDX0N@!Z?CgA6bgkxp-?Ck3WY*uNSY|=*4T9vYDj96<0DB^W7ku8 zdI*uELz3Dhjf-7ZW$7ivvrp0jNfx`l%F%}q&n8K2v1_ap0|=3%qmouhIxBXqm7oqG zo-Rp?B%Khu=Bycn5YHA#vtrksEe!~fq;5&8B~6T7e|9t|#Pg@5Ws**e{W-E>h(bJ_ zlIF$!EW^Qw*ag(dWMHkNHIgogT}(()5#pH->`=zteriGhMgt3RVzTS@QxxJkA6N-& zR7Tx?%0fIh03DKER|egF4nhD%0`~#Clz6wFixAHlzzX0SN!Q0NrV(-z;<+05TyAK2 zUhHB9L#{#q47eNkq1Nq>j$KeaQ3CK(|fGusGU13Uuk50K(aT(|#)q-z7j@0a9+0GQcfGg|>%3cLaw z4UlFgZUnPR(zyZRAD1MBc+9NJ%oYJNfXyLN;JW>tk`@m~x1Y2SkC}AW~+cHzze{k0BJ4<*44WGivq;YM~KJF_M6!fpbc0TC{539 z|Dbco_ISK#B>tElOWY znlYGPtfUY)*6p|BE|cE?x&x${4s5P<`)Akl3zZe(F|(h|?0#Ig|5bn#BXHe*U0akY zFT`VJ-vZA92Lh!y9e5n*cY9J10!W%9X*KXZZc{|FIgA^EPBpX7`uo9=0g@+!q_MdF z+QmRqJMJEQ3@kFUx~}RfD@4+5xXlz721@Z0u(UQ`tDDLRku(Kp2W}3O;vn!Mu-wcB zJsGHs5J}^4s51HAXMgwFoq;_xoF5o5LoIq(hap#F4PnWY6B56AA>Sku3 z6bFEpf#=PvDfeHp6e4K?unf4DFqifM-T@vnv!>pm%u0x)QMhx&GeE-=*8$jqJ5PkT zho6rSNpo;lPeZ;Z(FecbM89TcA$GX{83>Vk{Kj**c~JvN&Ft4eIgXL6kYVbw zKgBIiTLZ=aA4v+SEl+O&p&m}N7k9#bFHrnGNp-k5k1#U)5O7)y8Ib4^5{UJ{LNnVD zvxroWkY=(QxYNvTiY)`GeT4jl8>cih1Pn!0g{%c0G_xOL7t))m3E71k0)7~~kiMwO zIb=Vu1ZZnz8Ib=G5^M+3&|GM_x_OX;eP5)WvN3*N2*VuPLh6vl((|Q z;5b6cdkbUIOGtUMXKZRh%DZn{1xe#1of5l_LZMJ76bgkxp-?Ck3WY-Q`~zzo@gGPa R<(U8g002ovPDHLkV1g8fmzDqk diff --git a/app/src/main/res/drawable/splash_forground.xml b/app/src/main/res/drawable/splash_forground.xml new file mode 100644 index 000000000..cfb650758 --- /dev/null +++ b/app/src/main/res/drawable/splash_forground.xml @@ -0,0 +1,10 @@ + + + diff --git a/assets/pure_logo.svg b/assets/pure_logo.svg new file mode 100644 index 000000000..4455b19c6 --- /dev/null +++ b/assets/pure_logo.svg @@ -0,0 +1,67 @@ + + + +image/svg+xml + + + + + + + + + + + + + + \ No newline at end of file From 1b6c49f621b5b11bc19e3b8fbefc80ecc646c3a6 Mon Sep 17 00:00:00 2001 From: Chinmaya Krishnan Mahesh Date: Fri, 8 Feb 2019 17:33:35 -0600 Subject: [PATCH 199/207] Fix padding in settings layout (Fixes #1866) --- app/src/main/res/xml/appearance_settings.xml | 7 +++++++ app/src/main/res/xml/content_settings.xml | 8 ++++++++ app/src/main/res/xml/debug_settings.xml | 3 +++ app/src/main/res/xml/download_settings.xml | 7 +++++++ app/src/main/res/xml/history_settings.xml | 6 ++++++ app/src/main/res/xml/main_settings.xml | 8 ++++++++ app/src/main/res/xml/update_settings.xml | 2 ++ app/src/main/res/xml/video_audio_settings.xml | 19 +++++++++++++++++++ 8 files changed, 60 insertions(+) diff --git a/app/src/main/res/xml/appearance_settings.xml b/app/src/main/res/xml/appearance_settings.xml index 437736ab0..b5f222130 100644 --- a/app/src/main/res/xml/appearance_settings.xml +++ b/app/src/main/res/xml/appearance_settings.xml @@ -1,9 +1,11 @@ diff --git a/app/src/main/res/xml/debug_settings.xml b/app/src/main/res/xml/debug_settings.xml index c0bb1505d..7059ee8ce 100644 --- a/app/src/main/res/xml/debug_settings.xml +++ b/app/src/main/res/xml/debug_settings.xml @@ -1,16 +1,19 @@ diff --git a/app/src/main/res/xml/main_settings.xml b/app/src/main/res/xml/main_settings.xml index 74450f77b..cd9dc3278 100644 --- a/app/src/main/res/xml/main_settings.xml +++ b/app/src/main/res/xml/main_settings.xml @@ -1,41 +1,49 @@ Date: Sat, 9 Feb 2019 12:30:14 +0100 Subject: [PATCH 200/207] added support for youtube-nocookie.com --- app/src/main/AndroidManifest.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 06d621016..db2d5f13c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -183,6 +183,19 @@ + + + + + + + + + + + + + From 9437f057d0e2a5f242cf8aae9ce5376c8b3b4f72 Mon Sep 17 00:00:00 2001 From: Redirion Date: Thu, 14 Feb 2019 09:52:46 +0100 Subject: [PATCH 201/207] Fix delayed ducking of Audio Scenario: listening to a video on NewPipe over Bluetooth and a Notification Sound causes audio focus event AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK. Problem: With the current implementation animateAudio would cause the audio to reach the target volume AFTER the notification sound is played, which is irritating and annoying. Solution: animateAudio should just be used on focusGain where it is sensible to increase audio gradually. On ducking event the reaction should be immediate. This very simple fix does this. Please approve. --- .../java/org/schabi/newpipe/player/helper/AudioReactor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java index 46d20c7e1..f148aed27 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java @@ -131,7 +131,7 @@ public class AudioReactor implements AudioManager.OnAudioFocusChangeListener, private void onAudioFocusLossCanDuck() { Log.d(TAG, "onAudioFocusLossCanDuck() called"); // Set the volume to 1/10 on ducking - animateAudio(player.getVolume(), DUCK_AUDIO_TO); + player.setVolume(DUCK_AUDIO_TO); } private void animateAudio(final float from, final float to) { From 56cb8209b8ec8ba1d2d8fef0955ee2359347b3df Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Sat, 16 Feb 2019 01:23:26 +0530 Subject: [PATCH 202/207] refactored comments capability --- app/build.gradle | 2 +- .../newpipe/fragments/detail/VideoDetailFragment.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f47db03d0..f135bb017 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,7 +57,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.yausername:NewPipeExtractor:f97d5ab' + implementation 'com.github.yausername:NewPipeExtractor:3dadf63' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' 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 c007789e5..63f4fc722 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 @@ -100,6 +100,7 @@ import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; +import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.COMMENTS; import static org.schabi.newpipe.util.AnimationUtils.animateView; public class VideoDetailFragment @@ -822,7 +823,10 @@ public class VideoDetailFragment private boolean shouldShowComments() { try { - return showComments && NewPipe.getService(serviceId).isCommentsSupported(); + return showComments && NewPipe.getService(serviceId) + .getServiceInfo() + .getMediaCapabilities() + .contains(COMMENTS); } catch (ExtractionException e) { return false; } From db9cf9564820fbf1bbd6087d3e6b3189d69d2e13 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sun, 17 Feb 2019 09:52:05 +0100 Subject: [PATCH 203/207] Remove old player from the manifest See https://github.com/TeamNewPipe/NewPipe/pull/1884 for more info --- app/src/main/AndroidManifest.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 06d621016..af6dda798 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -35,12 +35,6 @@ - - From 4dd572063ef5b38d9c31e66b306e47727702e106 Mon Sep 17 00:00:00 2001 From: kapodamy Date: Sun, 17 Feb 2019 16:59:35 -0300 Subject: [PATCH 204/207] fix crash while switching from popup to fullscreen player, or closing the popup player. --- .../main/java/org/schabi/newpipe/player/PopupVideoPlayer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java index f5c731ed9..8ea3d509c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java @@ -626,6 +626,7 @@ public final class PopupVideoPlayer extends Service { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { super.onLoadingComplete(imageUri, view, loadedImage); + if (playerImpl == null) return; // rebuild notification here since remote view does not release bitmaps, // causing memory leaks resetNotification(); From 4b5591d8844a3255e3e83eada605cd3b4b781f29 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Tue, 19 Feb 2019 14:57:49 +0100 Subject: [PATCH 205/207] move firetv utils into utils package --- .../schabi/newpipe/fragments/list/search/SearchFragment.java | 2 +- .../java/org/schabi/newpipe/{firetv => util}/FireTvUtils.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) rename app/src/main/java/org/schabi/newpipe/{firetv => util}/FireTvUtils.java (80%) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 87ebf14d2..e20d6bad3 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -39,7 +39,7 @@ import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.search.SearchExtractor; import org.schabi.newpipe.extractor.search.SearchInfo; -import org.schabi.newpipe.firetv.FireTvUtils; +import org.schabi.newpipe.util.FireTvUtils; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.list.BaseListFragment; import org.schabi.newpipe.local.history.HistoryRecordManager; diff --git a/app/src/main/java/org/schabi/newpipe/firetv/FireTvUtils.java b/app/src/main/java/org/schabi/newpipe/util/FireTvUtils.java similarity index 80% rename from app/src/main/java/org/schabi/newpipe/firetv/FireTvUtils.java rename to app/src/main/java/org/schabi/newpipe/util/FireTvUtils.java index 305c29ee7..69666463e 100644 --- a/app/src/main/java/org/schabi/newpipe/firetv/FireTvUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/FireTvUtils.java @@ -1,6 +1,5 @@ -package org.schabi.newpipe.firetv; +package org.schabi.newpipe.util; -import android.content.Context; import org.schabi.newpipe.App; public class FireTvUtils { From 7981f9dc9129f232d5dce75e7277d19f55316e40 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Tue, 19 Feb 2019 16:03:10 +0100 Subject: [PATCH 206/207] add database doc in dia --- assets/db.dia | Bin 0 -> 2520 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/db.dia diff --git a/assets/db.dia b/assets/db.dia new file mode 100644 index 0000000000000000000000000000000000000000..59b090c882231a47746e961a41c36b1c82b238b0 GIT binary patch literal 2520 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 literal 0 HcmV?d00001 From 841124b1f358b4808d19c804a42fd7ca6ea8c64b Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Wed, 20 Feb 2019 05:24:33 +0530 Subject: [PATCH 207/207] updated extractor, fixed settings padding --- app/build.gradle | 2 +- app/src/main/res/xml/content_settings.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index f135bb017..2d46fcc90 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,7 +57,7 @@ dependencies { exclude module: 'support-annotations' }) - implementation 'com.github.yausername:NewPipeExtractor:3dadf63' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:8de53111d9' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.23.0' diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml index d09b12456..1a1a39e21 100644 --- a/app/src/main/res/xml/content_settings.xml +++ b/app/src/main/res/xml/content_settings.xml @@ -42,6 +42,7 @@ android:summary="@string/download_thumbnail_summary"/>