From 96d6b309ec394dafb98ab944c842fda905af649e Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Wed, 13 Apr 2022 19:41:07 +0800 Subject: [PATCH 001/645] Migrate database --- .../6.json | 737 ++++++++++++++++++ .../newpipe/database/DatabaseMigrationTest.kt | 5 + .../org/schabi/newpipe/NewPipeDatabase.java | 4 +- .../schabi/newpipe/database/AppDatabase.java | 4 +- .../schabi/newpipe/database/Migrations.java | 42 +- .../playlist/model/PlaylistEntity.java | 12 + 6 files changed, 800 insertions(+), 4 deletions(-) create mode 100644 app/schemas/org.schabi.newpipe.database.AppDatabase/6.json diff --git a/app/schemas/org.schabi.newpipe.database.AppDatabase/6.json b/app/schemas/org.schabi.newpipe.database.AppDatabase/6.json new file mode 100644 index 00000000000..34d457f83ea --- /dev/null +++ b/app/schemas/org.schabi.newpipe.database.AppDatabase/6.json @@ -0,0 +1,737 @@ +{ + "formatVersion": 1, + "database": { + "version": 6, + "identityHash": "cc9c4d84f52f49105b1c4216b948b5f7", + "entities": [ + { + "tableName": "subscriptions", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT, `name` TEXT, `avatar_url` TEXT, `subscriber_count` INTEGER, `description` TEXT, `notification_mode` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "avatarUrl", + "columnName": "avatar_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "subscriberCount", + "columnName": "subscriber_count", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "notificationMode", + "columnName": "notification_mode", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_subscriptions_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "search_history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "creationDate", + "columnName": "creation_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "search", + "columnName": "search", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_search_history_search", + "unique": false, + "columnNames": [ + "search" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "streams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `stream_type` TEXT NOT NULL, `duration` INTEGER NOT NULL, `uploader` TEXT NOT NULL, `uploader_url` TEXT, `thumbnail_url` TEXT, `view_count` INTEGER, `textual_upload_date` TEXT, `upload_date` INTEGER, `is_upload_date_approximation` INTEGER)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "streamType", + "columnName": "stream_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "duration", + "columnName": "duration", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "uploader", + "columnName": "uploader", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "uploaderUrl", + "columnName": "uploader_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "viewCount", + "columnName": "view_count", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "textualUploadDate", + "columnName": "textual_upload_date", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uploadDate", + "columnName": "upload_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "isUploadDateApproximation", + "columnName": "is_upload_date_approximation", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_streams_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "stream_history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, `repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "accessDate", + "columnName": "access_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatCount", + "columnName": "repeat_count", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "stream_id", + "access_date" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_stream_history_stream_id", + "unique": false, + "columnNames": [ + "stream_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)" + } + ], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "stream_state", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "progressMillis", + "columnName": "progress_time", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "stream_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "playlists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `thumbnail_url` TEXT, `display_index` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "displayIndex", + "columnName": "display_index", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_playlists_name", + "unique": false, + "columnNames": [ + "name" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_playlists_name` ON `${TABLE_NAME}` (`name`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "playlist_stream_join", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, `join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "playlistUid", + "columnName": "playlist_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "index", + "columnName": "join_index", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "playlist_id", + "join_index" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_playlist_stream_join_playlist_id_join_index", + "unique": true, + "columnNames": [ + "playlist_id", + "join_index" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)" + }, + { + "name": "index_playlist_stream_join_stream_id", + "unique": false, + "columnNames": [ + "stream_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)" + } + ], + "foreignKeys": [ + { + "table": "playlists", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "playlist_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "remote_playlists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, `thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uploader", + "columnName": "uploader", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "streamCount", + "columnName": "stream_count", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_remote_playlists_name", + "unique": false, + "columnNames": [ + "name" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)" + }, + { + "name": "index_remote_playlists_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "feed", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `subscription_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "streamId", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "stream_id", + "subscription_id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_feed_subscription_id", + "unique": false, + "columnNames": [ + "subscription_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)" + } + ], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "feed_group", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `icon_id` INTEGER NOT NULL, `sort_order` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "icon", + "columnName": "icon_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sortOrder", + "columnName": "sort_order", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_feed_group_sort_order", + "unique": false, + "columnNames": [ + "sort_order" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "feed_group_subscription_join", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`group_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`group_id`, `subscription_id`), FOREIGN KEY(`group_id`) REFERENCES `feed_group`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "feedGroupId", + "columnName": "group_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "group_id", + "subscription_id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_feed_group_subscription_join_subscription_id", + "unique": false, + "columnNames": [ + "subscription_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)" + } + ], + "foreignKeys": [ + { + "table": "feed_group", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "group_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "feed_last_updated", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`subscription_id` INTEGER NOT NULL, `last_updated` INTEGER, PRIMARY KEY(`subscription_id`), FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastUpdated", + "columnName": "last_updated", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "subscription_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [ + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'cc9c4d84f52f49105b1c4216b948b5f7')" + ] + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt index 28dea13e9f0..6d05a45bf9e 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt @@ -84,6 +84,11 @@ class DatabaseMigrationTest { true, Migrations.MIGRATION_4_5 ) + testHelper.runMigrationsAndValidate( + AppDatabase.DATABASE_NAME, Migrations.DB_VER_6, + true, Migrations.MIGRATION_5_6 + ) + val migratedDatabaseV3 = getMigratedDatabase() val listFromDB = migratedDatabaseV3.streamDAO().all.blockingFirst() diff --git a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java index 402d4648d7f..fc3423994e8 100644 --- a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java +++ b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java @@ -5,6 +5,7 @@ import static org.schabi.newpipe.database.Migrations.MIGRATION_2_3; import static org.schabi.newpipe.database.Migrations.MIGRATION_3_4; import static org.schabi.newpipe.database.Migrations.MIGRATION_4_5; +import static org.schabi.newpipe.database.Migrations.MIGRATION_5_6; import android.content.Context; import android.database.Cursor; @@ -24,7 +25,8 @@ private NewPipeDatabase() { private static AppDatabase getDatabase(final Context context) { return Room .databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME) - .addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5) + .addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5, + MIGRATION_5_6) .build(); } diff --git a/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java b/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java index 28ddc818494..563e80b1780 100644 --- a/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java +++ b/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java @@ -1,6 +1,6 @@ package org.schabi.newpipe.database; -import static org.schabi.newpipe.database.Migrations.DB_VER_5; +import static org.schabi.newpipe.database.Migrations.DB_VER_6; import androidx.room.Database; import androidx.room.RoomDatabase; @@ -38,7 +38,7 @@ FeedEntity.class, FeedGroupEntity.class, FeedGroupSubscriptionEntity.class, FeedLastUpdatedEntity.class }, - version = DB_VER_5 + version = DB_VER_6 ) public abstract class AppDatabase extends RoomDatabase { public static final String DATABASE_NAME = "newpipe.db"; diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.java b/app/src/main/java/org/schabi/newpipe/database/Migrations.java index 7de08442c34..a8f093ba017 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Migrations.java +++ b/app/src/main/java/org/schabi/newpipe/database/Migrations.java @@ -23,6 +23,7 @@ public final class Migrations { public static final int DB_VER_3 = 3; public static final int DB_VER_4 = 4; public static final int DB_VER_5 = 5; + public static final int DB_VER_6 = 6; private static final String TAG = Migrations.class.getName(); public static final boolean DEBUG = MainActivity.DEBUG; @@ -184,7 +185,46 @@ public void migrate(@NonNull final SupportSQLiteDatabase database) { @Override public void migrate(@NonNull final SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE `subscriptions` ADD COLUMN `notification_mode` " - + "INTEGER NOT NULL DEFAULT 0"); + + "INTEGER NOT NULL DEFAULT 0"); + } + }; + + public static final Migration MIGRATION_5_6 = new Migration(DB_VER_5, DB_VER_6) { + @Override + public void migrate(@NonNull final SupportSQLiteDatabase database) { + try { + database.beginTransaction(); + + // create a temp table to initialize display_index + database.execSQL("CREATE TABLE `playlists_tmp` " + + "(`uid` INTEGER NOT NULL, " + + "`name` TEXT, `thumbnail_url` TEXT," + + "`display_index` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)"); + database.execSQL("INSERT INTO `playlists_tmp` (`uid`, `name`, `thumbnail_url`)" + + "SELECT `uid`, `name`, `thumbnail_url` FROM `playlists`"); + + // drop the old table and create new one + database.execSQL("DROP TABLE `playlists`"); + database.execSQL("CREATE TABLE `playlists` " + + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`name` TEXT, `thumbnail_url` TEXT," + + "`display_index` INTEGER NOT NULL UNIQUE)"); + + // insert temp data into the new table + // set display_index start from zero + database.execSQL("INSERT INTO `playlists` SELECT * FROM `playlists_tmp`"); + database.execSQL("UPDATE `playlists` SET `display_index` = `display_index` - 1"); + + // drop tmp table + database.execSQL("DROP TABLE `playlists_tmp`"); + + // create index on the new table + database.execSQL("CREATE INDEX `index_playlists_name` ON `playlists` (`name`)"); + + database.setTransactionSuccessful(); + } finally { + database.endTransaction(); + } } }; diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java index 71abf27322b..c1ae0a2b368 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java @@ -15,6 +15,7 @@ public class PlaylistEntity { public static final String PLAYLIST_ID = "uid"; public static final String PLAYLIST_NAME = "name"; public static final String PLAYLIST_THUMBNAIL_URL = "thumbnail_url"; + public static final String PLAYLIST_DISPLAY_INDEX = "display_index"; @PrimaryKey(autoGenerate = true) @ColumnInfo(name = PLAYLIST_ID) @@ -26,6 +27,9 @@ public class PlaylistEntity { @ColumnInfo(name = PLAYLIST_THUMBNAIL_URL) private String thumbnailUrl; + @ColumnInfo(name = PLAYLIST_DISPLAY_INDEX) + private long displayIndex = 0; + public PlaylistEntity(final String name, final String thumbnailUrl) { this.name = name; this.thumbnailUrl = thumbnailUrl; @@ -54,4 +58,12 @@ public String getThumbnailUrl() { public void setThumbnailUrl(final String thumbnailUrl) { this.thumbnailUrl = thumbnailUrl; } + + public long getDisplayIndex() { + return displayIndex; + } + + public void setDisplayIndex(final long displayIndex) { + this.displayIndex = displayIndex; + } } From c34549a47d0c39050ddd34357e43adfce56ea638 Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Wed, 13 Apr 2022 21:35:38 +0800 Subject: [PATCH 002/645] Update database migrations and getter/setter --- .../6.json | 12 ++++-- .../schabi/newpipe/database/Migrations.java | 42 ++++++++++++------- .../database/playlist/PlaylistLocalItem.java | 1 + .../playlist/PlaylistMetadataEntry.java | 6 ++- .../playlist/dao/PlaylistStreamDAO.java | 2 + .../playlist/model/PlaylistRemoteEntity.java | 25 +++++++++++ .../local/bookmark/BookmarkFragment.java | 1 - .../local/playlist/LocalPlaylistManager.java | 15 +++++-- 8 files changed, 82 insertions(+), 22 deletions(-) diff --git a/app/schemas/org.schabi.newpipe.database.AppDatabase/6.json b/app/schemas/org.schabi.newpipe.database.AppDatabase/6.json index 34d457f83ea..3ef363e3086 100644 --- a/app/schemas/org.schabi.newpipe.database.AppDatabase/6.json +++ b/app/schemas/org.schabi.newpipe.database.AppDatabase/6.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 6, - "identityHash": "cc9c4d84f52f49105b1c4216b948b5f7", + "identityHash": "9ffc14521c566beed378d77430de3f0c", "entities": [ { "tableName": "subscriptions", @@ -447,7 +447,7 @@ }, { "tableName": "remote_playlists", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, `thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, `thumbnail_url` TEXT, `uploader` TEXT, `display_index` INTEGER NOT NULL, `stream_count` INTEGER)", "fields": [ { "fieldPath": "uid", @@ -485,6 +485,12 @@ "affinity": "TEXT", "notNull": false }, + { + "fieldPath": "displayIndex", + "columnName": "display_index", + "affinity": "INTEGER", + "notNull": true + }, { "fieldPath": "streamCount", "columnName": "stream_count", @@ -731,7 +737,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'cc9c4d84f52f49105b1c4216b948b5f7')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9ffc14521c566beed378d77430de3f0c')" ] } } \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.java b/app/src/main/java/org/schabi/newpipe/database/Migrations.java index a8f093ba017..ffca6cca58c 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Migrations.java +++ b/app/src/main/java/org/schabi/newpipe/database/Migrations.java @@ -195,31 +195,45 @@ public void migrate(@NonNull final SupportSQLiteDatabase database) { try { database.beginTransaction(); + // update playlists // create a temp table to initialize display_index database.execSQL("CREATE TABLE `playlists_tmp` " - + "(`uid` INTEGER NOT NULL, " + + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "`name` TEXT, `thumbnail_url` TEXT," - + "`display_index` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)"); + + "`display_index` INTEGER NOT NULL DEFAULT 0)"); database.execSQL("INSERT INTO `playlists_tmp` (`uid`, `name`, `thumbnail_url`)" + "SELECT `uid`, `name`, `thumbnail_url` FROM `playlists`"); - // drop the old table and create new one + // replace the old table database.execSQL("DROP TABLE `playlists`"); - database.execSQL("CREATE TABLE `playlists` " - + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " - + "`name` TEXT, `thumbnail_url` TEXT," - + "`display_index` INTEGER NOT NULL UNIQUE)"); + database.execSQL("ALTER TABLE `playlists_tmp` RENAME TO `playlists`"); - // insert temp data into the new table - // set display_index start from zero - database.execSQL("INSERT INTO `playlists` SELECT * FROM `playlists_tmp`"); - database.execSQL("UPDATE `playlists` SET `display_index` = `display_index` - 1"); + // create index on the new table + database.execSQL("CREATE INDEX `index_playlists_name` ON `playlists` (`name`)"); - // drop tmp table - database.execSQL("DROP TABLE `playlists_tmp`"); + + // update remote_playlists + // create a temp table to initialize display_index + database.execSQL("CREATE TABLE `remote_playlists_tmp` " + + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, " + + "`thumbnail_url` TEXT, `uploader` TEXT, " + + "`display_index` INTEGER NOT NULL DEFAULT 0," + + "`stream_count` INTEGER)"); + database.execSQL("INSERT INTO `remote_playlists_tmp` (`uid`, `service_id`, " + + "`name`, `url`, `thumbnail_url`, `uploader`, `stream_count`)" + + "SELECT `uid`, `service_id`, `name`, `url`, `thumbnail_url`, `uploader`, " + + "`stream_count` FROM `remote_playlists`"); + + // replace the old table + database.execSQL("DROP TABLE `remote_playlists`"); + database.execSQL("ALTER TABLE `remote_playlists_tmp` RENAME TO `remote_playlists`"); // create index on the new table - database.execSQL("CREATE INDEX `index_playlists_name` ON `playlists` (`name`)"); + database.execSQL("CREATE INDEX `index_remote_playlists_name` " + + "ON `remote_playlists` (`name`)"); + database.execSQL("CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` " + + "ON `remote_playlists` (`service_id`, `url`)"); database.setTransactionSuccessful(); } finally { diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java index 43dbd89ea46..bc17c51c43e 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java @@ -14,6 +14,7 @@ public interface PlaylistLocalItem extends LocalItem { static List merge( final List localPlaylists, final List remotePlaylists) { + // todo: merge algorithm final List items = new ArrayList<>( localPlaylists.size() + remotePlaylists.size()); items.addAll(localPlaylists); diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java index a13894030a6..29bad45dc4c 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java @@ -2,6 +2,7 @@ import androidx.room.ColumnInfo; +import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_DISPLAY_INDEX; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_ID; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_NAME; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_URL; @@ -15,14 +16,17 @@ public class PlaylistMetadataEntry implements PlaylistLocalItem { public final String name; @ColumnInfo(name = PLAYLIST_THUMBNAIL_URL) public final String thumbnailUrl; + @ColumnInfo(name = PLAYLIST_DISPLAY_INDEX) + public final long displayIndex; @ColumnInfo(name = PLAYLIST_STREAM_COUNT) public final long streamCount; public PlaylistMetadataEntry(final long uid, final String name, final String thumbnailUrl, - final long streamCount) { + final long displayIndex, final long streamCount) { this.uid = uid; this.name = name; this.thumbnailUrl = thumbnailUrl; + this.displayIndex = displayIndex; this.streamCount = streamCount; } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java index 4941d939507..3fb96a21ffc 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java @@ -15,6 +15,7 @@ import io.reactivex.rxjava3.core.Flowable; import static org.schabi.newpipe.database.playlist.PlaylistMetadataEntry.PLAYLIST_STREAM_COUNT; +import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_DISPLAY_INDEX; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_ID; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_NAME; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_TABLE; @@ -75,6 +76,7 @@ default Flowable> listByService(final int serviceId) @Transaction @Query("SELECT " + PLAYLIST_ID + ", " + PLAYLIST_NAME + ", " + PLAYLIST_THUMBNAIL_URL + ", " + + PLAYLIST_DISPLAY_INDEX + ", " + "COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT + " FROM " + PLAYLIST_TABLE diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java index 2e9a15d7dac..1fddfa73236 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java @@ -31,6 +31,7 @@ public class PlaylistRemoteEntity implements PlaylistLocalItem { public static final String REMOTE_PLAYLIST_URL = "url"; public static final String REMOTE_PLAYLIST_THUMBNAIL_URL = "thumbnail_url"; public static final String REMOTE_PLAYLIST_UPLOADER_NAME = "uploader"; + public static final String REMOTE_PLAYLIST_DISPLAY_INDEX = "display_index"; public static final String REMOTE_PLAYLIST_STREAM_COUNT = "stream_count"; @PrimaryKey(autoGenerate = true) @@ -52,6 +53,9 @@ public class PlaylistRemoteEntity implements PlaylistLocalItem { @ColumnInfo(name = REMOTE_PLAYLIST_UPLOADER_NAME) private String uploader; + @ColumnInfo(name = REMOTE_PLAYLIST_DISPLAY_INDEX) + private long displayIndex; + @ColumnInfo(name = REMOTE_PLAYLIST_STREAM_COUNT) private Long streamCount; @@ -66,6 +70,19 @@ public PlaylistRemoteEntity(final int serviceId, final String name, final String this.streamCount = streamCount; } + @Ignore + public PlaylistRemoteEntity(final int serviceId, final String name, final String url, + final String thumbnailUrl, final String uploader, + final long displayIndex, final Long streamCount) { + this.serviceId = serviceId; + this.name = name; + this.url = url; + this.thumbnailUrl = thumbnailUrl; + this.uploader = uploader; + this.displayIndex = displayIndex; + this.streamCount = streamCount; + } + @Ignore public PlaylistRemoteEntity(final PlaylistInfo info) { this(info.getServiceId(), info.getName(), info.getUrl(), @@ -136,6 +153,14 @@ public void setUploader(final String uploader) { this.uploader = uploader; } + public long getDisplayIndex() { + return displayIndex; + } + + public void setDisplayIndex(final long displayIndex) { + this.displayIndex = displayIndex; + } + public Long getStreamCount() { return streamCount; } diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index f272a8831f4..2f36cbd55eb 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -308,7 +308,6 @@ private void changeLocalPlaylistName(final long id, final String name) { + "with new name=[" + name + "] items"); } - localPlaylistManager.renamePlaylist(id, name); final Disposable disposable = localPlaylistManager.renamePlaylist(id, name) .observeOn(AndroidSchedulers.mainThread()) .subscribe(longs -> { /*Do nothing on success*/ }, throwable -> showError( diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index 33296aa8433..aabda1bf064 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -96,12 +96,17 @@ public Single deletePlaylist(final long playlistId) { } public Maybe renamePlaylist(final long playlistId, final String name) { - return modifyPlaylist(playlistId, name, null); + return modifyPlaylist(playlistId, name, null, -1); } public Maybe changePlaylistThumbnail(final long playlistId, final String thumbnailUrl) { - return modifyPlaylist(playlistId, null, thumbnailUrl); + return modifyPlaylist(playlistId, null, thumbnailUrl, -1); + } + + public Maybe changePlaylistDisplayIndex(final long playlistId, + final long displayIndex) { + return modifyPlaylist(playlistId, null, null, displayIndex); } public String getPlaylistThumbnail(final long playlistId) { @@ -110,7 +115,8 @@ public String getPlaylistThumbnail(final long playlistId) { private Maybe modifyPlaylist(final long playlistId, @Nullable final String name, - @Nullable final String thumbnailUrl) { + @Nullable final String thumbnailUrl, + final long displayIndex) { return playlistTable.getPlaylist(playlistId) .firstElement() .filter(playlistEntities -> !playlistEntities.isEmpty()) @@ -122,6 +128,9 @@ private Maybe modifyPlaylist(final long playlistId, if (thumbnailUrl != null) { playlist.setThumbnailUrl(thumbnailUrl); } + if (displayIndex != -1) { + playlist.setDisplayIndex(displayIndex); + } return playlistTable.update(playlist); }).subscribeOn(Schedulers.io()); } From 270a541a7c98e975d6c848fce9ee232b6620432b Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Wed, 13 Apr 2022 22:46:24 +0800 Subject: [PATCH 003/645] Implement algorithm to merge playlists --- .../database/playlist/PlaylistLocalItem.java | 58 ++++++++++++++++--- .../playlist/PlaylistMetadataEntry.java | 5 ++ .../playlist/model/PlaylistRemoteEntity.java | 1 + 3 files changed, 57 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java index bc17c51c43e..ae81ce3f5c0 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java @@ -11,18 +11,62 @@ public interface PlaylistLocalItem extends LocalItem { String getOrderingName(); + long getDisplayIndex(); + static List merge( final List localPlaylists, final List remotePlaylists) { - // todo: merge algorithm - final List items = new ArrayList<>( + + // Merge localPlaylists and remotePlaylists by displayIndex. + // If two items have the same displayIndex, sort them in CASE_INSENSITIVE_ORDER. + // This algorithm is similar to the merge operation in merge sort. + + final List result = new ArrayList<>( localPlaylists.size() + remotePlaylists.size()); - items.addAll(localPlaylists); - items.addAll(remotePlaylists); + final List itemsWithSameIndex = new ArrayList<>(); + int i = 0; + int j = 0; + while (i < localPlaylists.size()) { + while (j < remotePlaylists.size()) { + if (remotePlaylists.get(j).getDisplayIndex() + <= localPlaylists.get(i).getDisplayIndex()) { + addItem(result, remotePlaylists.get(j), itemsWithSameIndex); + j++; + } else { + break; + } + } + addItem(result, localPlaylists.get(i), itemsWithSameIndex); + i++; + } + addItemsWithSameIndex(result, itemsWithSameIndex); + + // If displayIndex does not match actual index, update displayIndex. + // This may happen when a new list is created with default displayIndex = 0. + // todo: update displayIndex - Collections.sort(items, Comparator.comparing(PlaylistLocalItem::getOrderingName, - Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER))); + return result; + } + + static void addItem(final List result, final PlaylistLocalItem item, + final List itemsWithSameIndex) { + if (!itemsWithSameIndex.isEmpty() + && itemsWithSameIndex.get(0).getDisplayIndex() != item.getDisplayIndex()) { + // The new item has a different displayIndex, + // add previous items with same index to the result. + addItemsWithSameIndex(result, itemsWithSameIndex); + itemsWithSameIndex.clear(); + } + itemsWithSameIndex.add(item); + } - return items; + static void addItemsWithSameIndex(final List result, + final List itemsWithSameIndex) { + if (itemsWithSameIndex.size() > 1) { + Collections.sort(itemsWithSameIndex, + Comparator.comparing(PlaylistLocalItem::getOrderingName, + Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER))); + } + result.addAll(itemsWithSameIndex); } } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java index 29bad45dc4c..f54ffff134d 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java @@ -39,4 +39,9 @@ public LocalItemType getLocalItemType() { public String getOrderingName() { return name; } + + @Override + public long getDisplayIndex() { + return displayIndex; + } } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java index 1fddfa73236..4545267697c 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java @@ -153,6 +153,7 @@ public void setUploader(final String uploader) { this.uploader = uploader; } + @Override public long getDisplayIndex() { return displayIndex; } From ba8370bcfd980089ef5984b6ca55e4b072a69fee Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Thu, 14 Apr 2022 12:13:42 +0800 Subject: [PATCH 004/645] Save changes to the database and bugfix --- .../database/playlist/PlaylistLocalItem.java | 14 ++-- .../playlist/dao/PlaylistRemoteDAO.java | 4 ++ .../playlist/model/PlaylistEntity.java | 6 +- .../newpipe/local/LocalItemListAdapter.java | 1 + .../local/bookmark/BookmarkFragment.java | 65 ++++++++++++++++++- .../local/playlist/LocalPlaylistManager.java | 5 +- .../local/playlist/RemotePlaylistManager.java | 15 +++++ 7 files changed, 100 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java index ae81ce3f5c0..5bf50cd97eb 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java @@ -24,6 +24,12 @@ static List merge( final List result = new ArrayList<>( localPlaylists.size() + remotePlaylists.size()); final List itemsWithSameIndex = new ArrayList<>(); + + // The data from database may not be in the displayIndex order + Collections.sort(localPlaylists, + Comparator.comparingLong(PlaylistMetadataEntry::getDisplayIndex)); + Collections.sort(remotePlaylists, + Comparator.comparingLong(PlaylistRemoteEntity::getDisplayIndex)); int i = 0; int j = 0; while (i < localPlaylists.size()) { @@ -41,10 +47,6 @@ static List merge( } addItemsWithSameIndex(result, itemsWithSameIndex); - // If displayIndex does not match actual index, update displayIndex. - // This may happen when a new list is created with default displayIndex = 0. - // todo: update displayIndex - return result; } @@ -52,8 +54,8 @@ static void addItem(final List result, final PlaylistLocalIte final List itemsWithSameIndex) { if (!itemsWithSameIndex.isEmpty() && itemsWithSameIndex.get(0).getDisplayIndex() != item.getDisplayIndex()) { - // The new item has a different displayIndex, - // add previous items with same index to the result. + // The new item has a different displayIndex, add previous items with same + // index to the result. addItemsWithSameIndex(result, itemsWithSameIndex); itemsWithSameIndex.clear(); } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java index 6bb84942817..ade85746471 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java @@ -31,6 +31,10 @@ public interface PlaylistRemoteDAO extends BasicDAO { + " WHERE " + REMOTE_PLAYLIST_SERVICE_ID + " = :serviceId") Flowable> listByService(int serviceId); + @Query("SELECT * FROM " + REMOTE_PLAYLIST_TABLE + " WHERE " + + REMOTE_PLAYLIST_ID + " = :playlistId") + Flowable> getPlaylist(long playlistId); + @Query("SELECT * FROM " + REMOTE_PLAYLIST_TABLE + " WHERE " + REMOTE_PLAYLIST_URL + " = :url AND " + REMOTE_PLAYLIST_SERVICE_ID + " = :serviceId") Flowable> getPlaylist(long serviceId, String url); diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java index c1ae0a2b368..82f697ab3e3 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java @@ -2,6 +2,7 @@ import androidx.room.ColumnInfo; import androidx.room.Entity; +import androidx.room.Ignore; import androidx.room.Index; import androidx.room.PrimaryKey; @@ -28,11 +29,12 @@ public class PlaylistEntity { private String thumbnailUrl; @ColumnInfo(name = PLAYLIST_DISPLAY_INDEX) - private long displayIndex = 0; + private long displayIndex; - public PlaylistEntity(final String name, final String thumbnailUrl) { + public PlaylistEntity(final String name, final String thumbnailUrl, final long displayIndex) { this.name = name; this.thumbnailUrl = thumbnailUrl; + this.displayIndex = displayIndex; } public long getUid() { diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index 05e2fdac083..e2bfd59778e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -142,6 +142,7 @@ public void removeItem(final LocalItem data) { } public boolean swapItems(final int fromAdapterPosition, final int toAdapterPosition) { + // todo: reuse this code? final int actualFrom = adapterOffsetWithoutHeader(fromAdapterPosition); final int actualTo = adapterOffsetWithoutHeader(toAdapterPosition); diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index 2f36cbd55eb..6d2fbfbfcf5 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -199,6 +199,13 @@ public void onSubscribe(final Subscription s) { @Override public void onNext(final List subscriptions) { + + // If displayIndex does not match actual index, update displayIndex. + // This may happen when a new list is created + // or on the first run after database update + // or displayIndex is not continuous for some reason. + checkDisplayIndexUpdate(subscriptions); + handleResult(subscriptions); if (databaseSubscription != null) { databaseSubscription.request(1); @@ -212,7 +219,8 @@ public void onError(final Throwable exception) { } @Override - public void onComplete() { } + public void onComplete() { + } }; } @@ -316,5 +324,60 @@ private void changeLocalPlaylistName(final long id, final String name) { "Changing playlist name"))); disposables.add(disposable); } + + private void changeLocalPlaylistDisplayIndex(final long id, final long displayIndex) { + + if (localPlaylistManager == null) { + return; + } + + if (DEBUG) { + Log.d(TAG, "Updating local playlist id=[" + id + "] " + + "with new display_index=[" + displayIndex + "]"); + } + + final Disposable disposable = + localPlaylistManager.changePlaylistDisplayIndex(id, displayIndex) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(longs -> { /*Do nothing on success*/ }, throwable -> showError( + new ErrorInfo(throwable, + UserAction.REQUESTED_BOOKMARK, + "Changing local playlist display_index"))); + disposables.add(disposable); + } + + private void changeRemotePlaylistDisplayIndex(final long id, final long displayIndex) { + + if (remotePlaylistManager == null) { + return; + } + + if (DEBUG) { + Log.d(TAG, "Updating remote playlist id=[" + id + "] " + + "with new display_index=[" + displayIndex + "]"); + } + + final Disposable disposable = + remotePlaylistManager.changePlaylistDisplayIndex(id, displayIndex) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(longs -> { /*Do nothing on success*/ }, throwable -> showError( + new ErrorInfo(throwable, + UserAction.REQUESTED_BOOKMARK, + "Changing remote playlist display_index"))); + disposables.add(disposable); + } + + private void checkDisplayIndexUpdate(@NonNull final List result) { + for (int i = 0; i < result.size(); i++) { + final PlaylistLocalItem item = result.get(i); + if (item.getDisplayIndex() != i) { + if (item instanceof PlaylistMetadataEntry) { + changeLocalPlaylistDisplayIndex(((PlaylistMetadataEntry) item).uid, i); + } else if (item instanceof PlaylistRemoteEntity) { + changeRemotePlaylistDisplayIndex(((PlaylistRemoteEntity) item).getUid(), i); + } + } + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index aabda1bf064..47817f9e473 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -40,8 +40,11 @@ public Maybe> createPlaylist(final String name, final List database.runInTransaction(() -> upsertStreams(playlistTable.insert(newPlaylist), streams, 0)) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java index 5221139e34f..b49f149d64f 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java @@ -8,6 +8,7 @@ import java.util.List; import io.reactivex.rxjava3.core.Flowable; +import io.reactivex.rxjava3.core.Maybe; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.schedulers.Schedulers; @@ -33,6 +34,20 @@ public Single deletePlaylist(final long playlistId) { .subscribeOn(Schedulers.io()); } + public Maybe changePlaylistDisplayIndex(final long playlistId, + final long displayIndex) { + return playlistRemoteTable.getPlaylist(playlistId) + .firstElement() + .filter(playlistRemoteEntities -> !playlistRemoteEntities.isEmpty()) + .map(playlistRemoteEntities -> { + final PlaylistRemoteEntity playlist = playlistRemoteEntities.get(0); + if (displayIndex != -1) { + playlist.setDisplayIndex(displayIndex); + } + return playlistRemoteTable.update(playlist); + }).subscribeOn(Schedulers.io()); + } + public Single onBookmark(final PlaylistInfo playlistInfo) { return Single.fromCallable(() -> { final PlaylistRemoteEntity playlist = new PlaylistRemoteEntity(playlistInfo); From bfb56b4144f1fec9680dbafd5fe79420d731e0a7 Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Thu, 14 Apr 2022 16:59:52 +0800 Subject: [PATCH 005/645] UI design and behavior --- .../playlist/model/PlaylistEntity.java | 1 - .../local/bookmark/BookmarkFragment.java | 207 +++++++++++++----- .../local/holder/LocalPlaylistItemHolder.java | 21 +- .../holder/RemotePlaylistItemHolder.java | 22 +- .../layout/list_playlist_bookmark_item.xml | 84 +++++++ 5 files changed, 282 insertions(+), 53 deletions(-) create mode 100644 app/src/main/res/layout/list_playlist_bookmark_item.xml diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java index 82f697ab3e3..cdbbdebc08f 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java @@ -2,7 +2,6 @@ import androidx.room.ColumnInfo; import androidx.room.Entity; -import androidx.room.Ignore; import androidx.room.Index; import androidx.room.PrimaryKey; diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index 6d2fbfbfcf5..63c63c1e036 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.local.bookmark; +import static org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout; + import android.os.Bundle; import android.os.Parcelable; import android.text.InputType; @@ -12,6 +14,8 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentManager; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; @@ -41,6 +45,7 @@ import io.reactivex.rxjava3.disposables.Disposable; public final class BookmarkFragment extends BaseLocalListFragment, Void> { + private static final int MINIMUM_INITIAL_DRAG_VELOCITY = 12; @State protected Parcelable itemsListState; @@ -48,6 +53,7 @@ public final class BookmarkFragment extends BaseLocalListFragment() { @Override public void selected(final LocalItem selectedItem) { @@ -126,6 +135,14 @@ public void held(final LocalItem selectedItem) { showRemoteDeleteDialog((PlaylistRemoteEntity) selectedItem); } } + + @Override + public void drag(final LocalItem selectedItem, + final RecyclerView.ViewHolder viewHolder) { + if (itemTouchHelper != null) { + itemTouchHelper.startDrag(viewHolder); + } + } }); } @@ -166,6 +183,7 @@ public void onDestroyView() { } databaseSubscription = null; + itemTouchHelper = null; } @Override @@ -255,56 +273,9 @@ protected void resetFragment() { } } - /////////////////////////////////////////////////////////////////////////// - // Utils - /////////////////////////////////////////////////////////////////////////// - - private void showRemoteDeleteDialog(final PlaylistRemoteEntity item) { - showDeleteDialog(item.getName(), remotePlaylistManager.deletePlaylist(item.getUid())); - } - - private void showLocalDialog(final PlaylistMetadataEntry selectedItem) { - final DialogEditTextBinding dialogBinding - = DialogEditTextBinding.inflate(getLayoutInflater()); - dialogBinding.dialogEditText.setHint(R.string.name); - dialogBinding.dialogEditText.setInputType(InputType.TYPE_CLASS_TEXT); - dialogBinding.dialogEditText.setText(selectedItem.name); - - final AlertDialog.Builder builder = new AlertDialog.Builder(activity); - builder.setView(dialogBinding.getRoot()) - .setPositiveButton(R.string.rename_playlist, (dialog, which) -> - changeLocalPlaylistName( - selectedItem.uid, - dialogBinding.dialogEditText.getText().toString())) - .setNegativeButton(R.string.cancel, null) - .setNeutralButton(R.string.delete, (dialog, which) -> { - showDeleteDialog(selectedItem.name, - localPlaylistManager.deletePlaylist(selectedItem.uid)); - dialog.dismiss(); - }) - .create() - .show(); - } - - private void showDeleteDialog(final String name, final Single deleteReactor) { - if (activity == null || disposables == null) { - return; - } - - new AlertDialog.Builder(activity) - .setTitle(name) - .setMessage(R.string.delete_playlist_prompt) - .setCancelable(true) - .setPositiveButton(R.string.delete, (dialog, i) -> - disposables.add(deleteReactor - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(ignored -> { /*Do nothing on success*/ }, throwable -> - showError(new ErrorInfo(throwable, - UserAction.REQUESTED_BOOKMARK, - "Deleting playlist"))))) - .setNegativeButton(R.string.cancel, null) - .show(); - } + /*////////////////////////////////////////////////////////////////////////// + // Playlist Metadata Manipulation + //////////////////////////////////////////////////////////////////////////*/ private void changeLocalPlaylistName(final long id, final String name) { if (localPlaylistManager == null) { @@ -379,5 +350,141 @@ private void checkDisplayIndexUpdate(@NonNull final List resu } } } + + private void saveImmediate() { + if (localPlaylistManager == null || remotePlaylistManager == null + || itemListAdapter == null) { + return; + } + // todo: debounce + /* + // List must be loaded and modified in order to save + if (isLoadingComplete == null || isModified == null + || !isLoadingComplete.get() || !isModified.get()) { + Log.w(TAG, "Attempting to save playlist when local playlist " + + "is not loaded or not modified: playlist id=[" + playlistId + "]"); + return; + } + */ + // todo: is it correct? + final List items = itemListAdapter.getItemsList(); + for (int i = 0; i < items.size(); i++) { + final LocalItem item = items.get(i); + if (item instanceof PlaylistMetadataEntry) { + changeLocalPlaylistDisplayIndex(((PlaylistMetadataEntry) item).uid, i); + } else if (item instanceof PlaylistRemoteEntity) { + changeLocalPlaylistDisplayIndex(((PlaylistRemoteEntity) item).getUid(), i); + } + } + } + + private ItemTouchHelper.SimpleCallback getItemTouchCallback() { + int directions = ItemTouchHelper.UP | ItemTouchHelper.DOWN; + if (shouldUseGridLayout(requireContext())) { + directions |= ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; + } + return new ItemTouchHelper.SimpleCallback(directions, + ItemTouchHelper.ACTION_STATE_IDLE) { + @Override + public int interpolateOutOfBoundsScroll(@NonNull final RecyclerView recyclerView, + final int viewSize, + final int viewSizeOutOfBounds, + final int totalSize, + final long msSinceStartScroll) { + final int standardSpeed = super.interpolateOutOfBoundsScroll(recyclerView, + viewSize, viewSizeOutOfBounds, totalSize, msSinceStartScroll); + final int minimumAbsVelocity = Math.max(MINIMUM_INITIAL_DRAG_VELOCITY, + Math.abs(standardSpeed)); + return minimumAbsVelocity * (int) Math.signum(viewSizeOutOfBounds); + } + + @Override + public boolean onMove(@NonNull final RecyclerView recyclerView, + @NonNull final RecyclerView.ViewHolder source, + @NonNull final RecyclerView.ViewHolder target) { + if (source.getItemViewType() != target.getItemViewType() + || itemListAdapter == null) { + return false; + } + + // todo: is it correct + final int sourceIndex = source.getBindingAdapterPosition(); + final int targetIndex = target.getBindingAdapterPosition(); + final boolean isSwapped = itemListAdapter.swapItems(sourceIndex, targetIndex); + if (isSwapped) { + // todo + //saveChanges(); + saveImmediate(); + } + return isSwapped; + } + + @Override + public boolean isLongPressDragEnabled() { + return false; + } + + @Override + public boolean isItemViewSwipeEnabled() { + return false; + } + + @Override + public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, + final int swipeDir) { + } + }; + } + + /////////////////////////////////////////////////////////////////////////// + // Utils + /////////////////////////////////////////////////////////////////////////// + + private void showRemoteDeleteDialog(final PlaylistRemoteEntity item) { + showDeleteDialog(item.getName(), remotePlaylistManager.deletePlaylist(item.getUid())); + } + + private void showLocalDialog(final PlaylistMetadataEntry selectedItem) { + final DialogEditTextBinding dialogBinding + = DialogEditTextBinding.inflate(getLayoutInflater()); + dialogBinding.dialogEditText.setHint(R.string.name); + dialogBinding.dialogEditText.setInputType(InputType.TYPE_CLASS_TEXT); + dialogBinding.dialogEditText.setText(selectedItem.name); + + final AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setView(dialogBinding.getRoot()) + .setPositiveButton(R.string.rename_playlist, (dialog, which) -> + changeLocalPlaylistName( + selectedItem.uid, + dialogBinding.dialogEditText.getText().toString())) + .setNegativeButton(R.string.cancel, null) + .setNeutralButton(R.string.delete, (dialog, which) -> { + showDeleteDialog(selectedItem.name, + localPlaylistManager.deletePlaylist(selectedItem.uid)); + dialog.dismiss(); + }) + .create() + .show(); + } + + private void showDeleteDialog(final String name, final Single deleteReactor) { + if (activity == null || disposables == null) { + return; + } + + new AlertDialog.Builder(activity) + .setTitle(name) + .setMessage(R.string.delete_playlist_prompt) + .setCancelable(true) + .setPositiveButton(R.string.delete, (dialog, i) -> + disposables.add(deleteReactor + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(ignored -> { /*Do nothing on success*/ }, throwable -> + showError(new ErrorInfo(throwable, + UserAction.REQUESTED_BOOKMARK, + "Deleting playlist"))))) + .setNegativeButton(R.string.cancel, null) + .show(); + } } diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java index f8c5176ec2d..57a94470969 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java @@ -1,8 +1,10 @@ package org.schabi.newpipe.local.holder; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import org.schabi.newpipe.R; import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.local.LocalItemBuilder; @@ -13,13 +15,16 @@ import java.time.format.DateTimeFormatter; public class LocalPlaylistItemHolder extends PlaylistItemHolder { + private final View itemHandleView; + public LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final ViewGroup parent) { - super(infoItemBuilder, parent); + this(infoItemBuilder, R.layout.list_playlist_bookmark_item, parent); } LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId, final ViewGroup parent) { super(infoItemBuilder, layoutId, parent); + itemHandleView = itemView.findViewById(R.id.itemHandle); } @Override @@ -38,6 +43,20 @@ public void updateFromItem(final LocalItem localItem, PicassoHelper.loadPlaylistThumbnail(item.thumbnailUrl).into(itemThumbnailView); + itemHandleView.setOnTouchListener(getOnTouchListener(item)); + super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter); } + + private View.OnTouchListener getOnTouchListener(final PlaylistMetadataEntry item) { + return (view, motionEvent) -> { + view.performClick(); + if (itemBuilder != null && itemBuilder.getOnItemSelectedListener() != null + && motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) { + itemBuilder.getOnItemSelectedListener().drag(item, + LocalPlaylistItemHolder.this); + } + return false; + }; + } } diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java index 440353ac71c..9ecfa6979a2 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java @@ -1,8 +1,11 @@ package org.schabi.newpipe.local.holder; import android.text.TextUtils; +import android.view.MotionEvent; +import android.view.View; import android.view.ViewGroup; +import org.schabi.newpipe.R; import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; import org.schabi.newpipe.extractor.NewPipe; @@ -14,14 +17,17 @@ import java.time.format.DateTimeFormatter; public class RemotePlaylistItemHolder extends PlaylistItemHolder { + private final View itemHandleView; + public RemotePlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final ViewGroup parent) { - super(infoItemBuilder, parent); + this(infoItemBuilder, R.layout.list_playlist_bookmark_item, parent); } RemotePlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId, final ViewGroup parent) { super(infoItemBuilder, layoutId, parent); + itemHandleView = itemView.findViewById(R.id.itemHandle); } @Override @@ -46,6 +52,20 @@ public void updateFromItem(final LocalItem localItem, PicassoHelper.loadPlaylistThumbnail(item.getThumbnailUrl()).into(itemThumbnailView); + itemHandleView.setOnTouchListener(getOnTouchListener(item)); + super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter); } + + private View.OnTouchListener getOnTouchListener(final PlaylistRemoteEntity item) { + return (view, motionEvent) -> { + view.performClick(); + if (itemBuilder != null && itemBuilder.getOnItemSelectedListener() != null + && motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) { + itemBuilder.getOnItemSelectedListener().drag(item, + RemotePlaylistItemHolder.this); + } + return false; + }; + } } diff --git a/app/src/main/res/layout/list_playlist_bookmark_item.xml b/app/src/main/res/layout/list_playlist_bookmark_item.xml new file mode 100644 index 00000000000..642ea294949 --- /dev/null +++ b/app/src/main/res/layout/list_playlist_bookmark_item.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + From 3c4882569931f91de0fc5dd0a980739781d6526c Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Fri, 15 Apr 2022 20:44:54 +0800 Subject: [PATCH 006/645] Debounced saver & bugfix & clean code --- .../database/playlist/PlaylistLocalItem.java | 4 + .../playlist/PlaylistMetadataEntry.java | 2 +- .../database/playlist/dao/PlaylistDAO.java | 14 + .../playlist/dao/PlaylistStreamDAO.java | 14 +- .../playlist/model/PlaylistEntity.java | 11 + .../playlist/model/PlaylistRemoteEntity.java | 2 +- .../newpipe/local/LocalItemListAdapter.java | 1 - .../local/bookmark/BookmarkFragment.java | 276 +++++++++++++----- .../local/dialog/PlaylistAppendDialog.java | 2 +- .../local/playlist/LocalPlaylistManager.java | 24 +- .../local/playlist/RemotePlaylistManager.java | 26 +- 11 files changed, 283 insertions(+), 93 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java index 5bf50cd97eb..47c6dd6175a 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java @@ -45,6 +45,10 @@ static List merge( addItem(result, localPlaylists.get(i), itemsWithSameIndex); i++; } + while (j < remotePlaylists.size()) { + addItem(result, remotePlaylists.get(j), itemsWithSameIndex); + j++; + } addItemsWithSameIndex(result, itemsWithSameIndex); return result; diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java index f54ffff134d..ff80049a30a 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java @@ -17,7 +17,7 @@ public class PlaylistMetadataEntry implements PlaylistLocalItem { @ColumnInfo(name = PLAYLIST_THUMBNAIL_URL) public final String thumbnailUrl; @ColumnInfo(name = PLAYLIST_DISPLAY_INDEX) - public final long displayIndex; + public long displayIndex; @ColumnInfo(name = PLAYLIST_STREAM_COUNT) public final long streamCount; diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java index 70aaa3b2dc9..d8071e0af3a 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.java @@ -2,6 +2,7 @@ import androidx.room.Dao; import androidx.room.Query; +import androidx.room.Transaction; import org.schabi.newpipe.database.BasicDAO; import org.schabi.newpipe.database.playlist.model.PlaylistEntity; @@ -36,4 +37,17 @@ default Flowable> listByService(final int serviceId) { @Query("SELECT COUNT(*) FROM " + PLAYLIST_TABLE) Flowable getCount(); + + @Transaction + default long upsertPlaylist(final PlaylistEntity playlist) { + final long playlistId = playlist.getUid(); + + if (playlistId == -1) { + // This situation is probably impossible. + return insert(playlist); + } else { + update(playlist); + return playlistId; + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java index 3fb96a21ffc..0fce984f38b 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java @@ -82,7 +82,19 @@ default Flowable> listByService(final int serviceId) + " FROM " + PLAYLIST_TABLE + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE + " ON " + PLAYLIST_ID + " = " + JOIN_PLAYLIST_ID - + " GROUP BY " + JOIN_PLAYLIST_ID + + " GROUP BY " + PLAYLIST_ID + " ORDER BY " + PLAYLIST_NAME + " COLLATE NOCASE ASC") Flowable> getPlaylistMetadata(); + + @Transaction + @Query("SELECT " + PLAYLIST_ID + ", " + PLAYLIST_NAME + ", " + PLAYLIST_THUMBNAIL_URL + ", " + + PLAYLIST_DISPLAY_INDEX + ", " + + "COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT + + + " FROM " + PLAYLIST_TABLE + + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE + + " ON " + PLAYLIST_ID + " = " + JOIN_PLAYLIST_ID + + " GROUP BY " + PLAYLIST_ID + + " ORDER BY " + PLAYLIST_DISPLAY_INDEX) + Flowable> getDisplayIndexOrderedPlaylistMetadata(); } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java index cdbbdebc08f..272e8a5bcdd 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java @@ -2,12 +2,15 @@ import androidx.room.ColumnInfo; import androidx.room.Entity; +import androidx.room.Ignore; import androidx.room.Index; import androidx.room.PrimaryKey; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_NAME; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_TABLE; +import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; + @Entity(tableName = PLAYLIST_TABLE, indices = {@Index(value = {PLAYLIST_NAME})}) public class PlaylistEntity { @@ -36,6 +39,14 @@ public PlaylistEntity(final String name, final String thumbnailUrl, final long d this.displayIndex = displayIndex; } + @Ignore + public PlaylistEntity(final PlaylistMetadataEntry item) { + this.uid = item.uid; + this.name = item.name; + this.thumbnailUrl = item.thumbnailUrl; + this.displayIndex = item.displayIndex; + } + public long getUid() { return uid; } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java index 4545267697c..adea2738bda 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java @@ -54,7 +54,7 @@ public class PlaylistRemoteEntity implements PlaylistLocalItem { private String uploader; @ColumnInfo(name = REMOTE_PLAYLIST_DISPLAY_INDEX) - private long displayIndex; + private long displayIndex = -1; // Make sure the new item is on the top @ColumnInfo(name = REMOTE_PLAYLIST_STREAM_COUNT) private Long streamCount; diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index e2bfd59778e..05e2fdac083 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -142,7 +142,6 @@ public void removeItem(final LocalItem data) { } public boolean swapItems(final int fromAdapterPosition, final int toAdapterPosition) { - // todo: reuse this code? final int actualFrom = adapterOffsetWithoutHeader(fromAdapterPosition); final int actualTo = adapterOffsetWithoutHeader(toAdapterPosition); diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index 63c63c1e036..4eac0f5ead4 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -6,6 +6,7 @@ import android.os.Parcelable; import android.text.InputType; import android.util.Log; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -30,21 +31,32 @@ import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.local.BaseLocalListFragment; +import org.schabi.newpipe.local.holder.LocalPlaylistItemHolder; +import org.schabi.newpipe.local.holder.RemotePlaylistItemHolder; import org.schabi.newpipe.local.playlist.LocalPlaylistManager; import org.schabi.newpipe.local.playlist.RemotePlaylistManager; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import icepick.State; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Flowable; -import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.subjects.PublishSubject; public final class BookmarkFragment extends BaseLocalListFragment, Void> { + // todo: add to playlists, item handle should be invisible + + // Save the list 10s after the last change occurred + private static final long SAVE_DEBOUNCE_MILLIS = 10000; private static final int MINIMUM_INITIAL_DRAG_VELOCITY = 12; @State protected Parcelable itemsListState; @@ -55,6 +67,16 @@ public final class BookmarkFragment extends BaseLocalListFragment debouncedSaveSignal; + + /* Has the playlist been fully loaded from db */ + private AtomicBoolean isLoadingComplete; + /* Has the playlist been modified (e.g. items reordered or deleted) */ + private AtomicBoolean isModified; + + // Map from (uid, local/remote item) to the saved display index in the database. + private Map, Long> displayIndexInDatabase; + /////////////////////////////////////////////////////////////////////////// // Fragment LifeCycle - Creation /////////////////////////////////////////////////////////////////////////// @@ -69,6 +91,12 @@ public void onCreate(final Bundle savedInstanceState) { localPlaylistManager = new LocalPlaylistManager(database); remotePlaylistManager = new RemotePlaylistManager(database); disposables = new CompositeDisposable(); + + debouncedSaveSignal = PublishSubject.create(); + isLoadingComplete = new AtomicBoolean(); + isModified = new AtomicBoolean(); + + displayIndexInDatabase = new HashMap<>(); } @Nullable @@ -154,6 +182,10 @@ public void drag(final LocalItem selectedItem, public void startLoading(final boolean forceLoad) { super.startLoading(forceLoad); + disposables.add(getDebouncedSaver()); + isLoadingComplete.set(false); + isModified.set(false); + Flowable.combineLatest(localPlaylistManager.getPlaylists(), remotePlaylistManager.getPlaylists(), PlaylistLocalItem::merge) .onBackpressureLatest() @@ -169,6 +201,9 @@ public void startLoading(final boolean forceLoad) { public void onPause() { super.onPause(); itemsListState = itemsList.getLayoutManager().onSaveInstanceState(); + + // Save on exit + saveImmediate(); } @Override @@ -189,14 +224,22 @@ public void onDestroyView() { @Override public void onDestroy() { super.onDestroy(); + if (debouncedSaveSignal != null) { + debouncedSaveSignal.onComplete(); + } if (disposables != null) { disposables.dispose(); } + debouncedSaveSignal = null; disposables = null; localPlaylistManager = null; remotePlaylistManager = null; itemsListState = null; + + isLoadingComplete = null; + isModified = null; + displayIndexInDatabase = null; } /////////////////////////////////////////////////////////////////////////// @@ -208,6 +251,8 @@ private Subscriber> getPlaylistsSubscriber() { @Override public void onSubscribe(final Subscription s) { showLoading(); + isLoadingComplete.set(false); + if (databaseSubscription != null) { databaseSubscription.cancel(); } @@ -217,14 +262,11 @@ public void onSubscribe(final Subscription s) { @Override public void onNext(final List subscriptions) { - - // If displayIndex does not match actual index, update displayIndex. - // This may happen when a new list is created - // or on the first run after database update - // or displayIndex is not continuous for some reason. - checkDisplayIndexUpdate(subscriptions); - - handleResult(subscriptions); + if (isModified == null || !isModified.get()) { + checkDisplayIndexModified(subscriptions); + handleResult(subscriptions); + isLoadingComplete.set(true); + } if (databaseSubscription != null) { databaseSubscription.request(1); } @@ -296,86 +338,170 @@ private void changeLocalPlaylistName(final long id, final String name) { disposables.add(disposable); } - private void changeLocalPlaylistDisplayIndex(final long id, final long displayIndex) { - - if (localPlaylistManager == null) { + private void deleteItem(final PlaylistLocalItem item) { + if (itemListAdapter == null) { return; } + itemListAdapter.removeItem(item); - if (DEBUG) { - Log.d(TAG, "Updating local playlist id=[" + id + "] " - + "with new display_index=[" + displayIndex + "]"); - } - - final Disposable disposable = - localPlaylistManager.changePlaylistDisplayIndex(id, displayIndex) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(longs -> { /*Do nothing on success*/ }, throwable -> showError( - new ErrorInfo(throwable, - UserAction.REQUESTED_BOOKMARK, - "Changing local playlist display_index"))); - disposables.add(disposable); + saveChanges(); } - private void changeRemotePlaylistDisplayIndex(final long id, final long displayIndex) { - - if (remotePlaylistManager == null) { + private void checkDisplayIndexModified(@NonNull final List result) { + if (isModified != null && isModified.get()) { return; } - if (DEBUG) { - Log.d(TAG, "Updating remote playlist id=[" + id + "] " - + "with new display_index=[" + displayIndex + "]"); - } - - final Disposable disposable = - remotePlaylistManager.changePlaylistDisplayIndex(id, displayIndex) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(longs -> { /*Do nothing on success*/ }, throwable -> showError( - new ErrorInfo(throwable, - UserAction.REQUESTED_BOOKMARK, - "Changing remote playlist display_index"))); - disposables.add(disposable); - } + displayIndexInDatabase.clear(); - private void checkDisplayIndexUpdate(@NonNull final List result) { + // If the display index does not match actual index in the list, update the display index. + // This may happen when a new list is created + // or on the first run after database update + // or displayIndex is not continuous for some reason. + boolean isDisplayIndexModified = false; for (int i = 0; i < result.size(); i++) { final PlaylistLocalItem item = result.get(i); if (item.getDisplayIndex() != i) { - if (item instanceof PlaylistMetadataEntry) { - changeLocalPlaylistDisplayIndex(((PlaylistMetadataEntry) item).uid, i); - } else if (item instanceof PlaylistRemoteEntity) { - changeRemotePlaylistDisplayIndex(((PlaylistRemoteEntity) item).getUid(), i); - } + isDisplayIndexModified = true; + } + + // Updating display index in the item does not affect the value inserts into + // database, which will be recalculated during the database update. Updating + // display index in the item here is to determine whether it is recently modified. + // Save the index read from the database. + if (item instanceof PlaylistMetadataEntry) { + + displayIndexInDatabase.put(new Pair<>(((PlaylistMetadataEntry) item).uid, + LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM), item.getDisplayIndex()); + ((PlaylistMetadataEntry) item).displayIndex = i; + + } else if (item instanceof PlaylistRemoteEntity) { + + displayIndexInDatabase.put(new Pair<>(((PlaylistRemoteEntity) item).getUid(), + LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM), + item.getDisplayIndex()); + ((PlaylistRemoteEntity) item).setDisplayIndex(i); + } } + + if (isDisplayIndexModified) { + saveChanges(); + } + } + + private void saveChanges() { + if (isModified == null || debouncedSaveSignal == null) { + return; + } + + isModified.set(true); + debouncedSaveSignal.onNext(System.currentTimeMillis()); + } + + private Disposable getDebouncedSaver() { + if (debouncedSaveSignal == null) { + return Disposable.empty(); + } + + return debouncedSaveSignal + .debounce(SAVE_DEBOUNCE_MILLIS, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(ignored -> saveImmediate(), throwable -> + showError(new ErrorInfo(throwable, UserAction.SOMETHING_ELSE, + "Debounced saver"))); } private void saveImmediate() { - if (localPlaylistManager == null || remotePlaylistManager == null - || itemListAdapter == null) { + if (itemListAdapter == null) { return; } - // todo: debounce - /* + // List must be loaded and modified in order to save if (isLoadingComplete == null || isModified == null || !isLoadingComplete.get() || !isModified.get()) { - Log.w(TAG, "Attempting to save playlist when local playlist " - + "is not loaded or not modified: playlist id=[" + playlistId + "]"); + Log.w(TAG, "Attempting to save playlists in bookmark when bookmark " + + "is not loaded or playlists not modified"); return; } - */ - // todo: is it correct? + final List items = itemListAdapter.getItemsList(); + final List localItemsUpdate = new ArrayList<>(); + final List localItemsDeleteUid = new ArrayList<>(); + final List remoteItemsUpdate = new ArrayList<>(); + final List remoteItemsDeleteUid = new ArrayList<>(); + + // Calculate display index for (int i = 0; i < items.size(); i++) { final LocalItem item = items.get(i); + if (item instanceof PlaylistMetadataEntry) { - changeLocalPlaylistDisplayIndex(((PlaylistMetadataEntry) item).uid, i); + ((PlaylistMetadataEntry) item).displayIndex = i; + + final Long uid = ((PlaylistMetadataEntry) item).uid; + final Pair key = new Pair<>(uid, + LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM); + final Long databaseIndex = displayIndexInDatabase.remove(key); + + if (databaseIndex != null) { + if (databaseIndex != i) { + localItemsUpdate.add((PlaylistMetadataEntry) item); + } + } else { + // This should be impossible. + continue; + } } else if (item instanceof PlaylistRemoteEntity) { - changeLocalPlaylistDisplayIndex(((PlaylistRemoteEntity) item).getUid(), i); + ((PlaylistRemoteEntity) item).setDisplayIndex(i); + + final Long uid = ((PlaylistRemoteEntity) item).getUid(); + final Pair key = new Pair<>(uid, + LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM); + final Long databaseIndex = displayIndexInDatabase.remove(key); + + if (databaseIndex != null) { + if (databaseIndex != i) { + remoteItemsUpdate.add((PlaylistRemoteEntity) item); + } + } else { + // This should be impossible. + continue; + } + } + } + + // Find deleted items + for (final Pair key : displayIndexInDatabase.keySet()) { + if (key.second.equals(LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM)) { + localItemsDeleteUid.add(key.first); + } else if (key.second.equals(LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM)) { + remoteItemsDeleteUid.add(key.first); } } + + displayIndexInDatabase.clear(); + + // 1. Update local playlists + // 2. Update remote playlists + // 3. Set isModified false + disposables.add(localPlaylistManager.updatePlaylists(localItemsUpdate, localItemsDeleteUid) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(() -> disposables.add(remotePlaylistManager.updatePlaylists( + remoteItemsUpdate, remoteItemsDeleteUid) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(() -> { + if (isModified != null) { + isModified.set(false); + } + }, + throwable -> showError(new ErrorInfo(throwable, + UserAction.REQUESTED_BOOKMARK, + "Saving playlist")) + )), + throwable -> showError(new ErrorInfo(throwable, + UserAction.REQUESTED_BOOKMARK, "Saving playlist")) + )); + } private ItemTouchHelper.SimpleCallback getItemTouchCallback() { @@ -404,17 +530,26 @@ public boolean onMove(@NonNull final RecyclerView recyclerView, @NonNull final RecyclerView.ViewHolder target) { if (source.getItemViewType() != target.getItemViewType() || itemListAdapter == null) { - return false; + // Allow swap LocalPlaylistItemHolder and RemotePlaylistItemHolder. + if (!( + ( + (source instanceof LocalPlaylistItemHolder) + || (source instanceof RemotePlaylistItemHolder) + ) + && ( + (target instanceof LocalPlaylistItemHolder) + || (target instanceof RemotePlaylistItemHolder) + ) + )) { + return false; + } } - // todo: is it correct final int sourceIndex = source.getBindingAdapterPosition(); final int targetIndex = target.getBindingAdapterPosition(); final boolean isSwapped = itemListAdapter.swapItems(sourceIndex, targetIndex); if (isSwapped) { - // todo - //saveChanges(); - saveImmediate(); + saveChanges(); } return isSwapped; } @@ -441,7 +576,7 @@ public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, /////////////////////////////////////////////////////////////////////////// private void showRemoteDeleteDialog(final PlaylistRemoteEntity item) { - showDeleteDialog(item.getName(), remotePlaylistManager.deletePlaylist(item.getUid())); + showDeleteDialog(item.getName(), item); } private void showLocalDialog(final PlaylistMetadataEntry selectedItem) { @@ -459,15 +594,14 @@ private void showLocalDialog(final PlaylistMetadataEntry selectedItem) { dialogBinding.dialogEditText.getText().toString())) .setNegativeButton(R.string.cancel, null) .setNeutralButton(R.string.delete, (dialog, which) -> { - showDeleteDialog(selectedItem.name, - localPlaylistManager.deletePlaylist(selectedItem.uid)); + showDeleteDialog(selectedItem.name, selectedItem); dialog.dismiss(); }) .create() .show(); } - private void showDeleteDialog(final String name, final Single deleteReactor) { + private void showDeleteDialog(final String name, final PlaylistLocalItem item) { if (activity == null || disposables == null) { return; } @@ -476,13 +610,7 @@ private void showDeleteDialog(final String name, final Single deleteRea .setTitle(name) .setMessage(R.string.delete_playlist_prompt) .setCancelable(true) - .setPositiveButton(R.string.delete, (dialog, i) -> - disposables.add(deleteReactor - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(ignored -> { /*Do nothing on success*/ }, throwable -> - showError(new ErrorInfo(throwable, - UserAction.REQUESTED_BOOKMARK, - "Deleting playlist"))))) + .setPositiveButton(R.string.delete, (dialog, i) -> deleteItem(item)) .setNegativeButton(R.string.cancel, null) .show(); } diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index a874cdd621c..58a10af220d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -85,7 +85,7 @@ public void selected(final LocalItem selectedItem) { final View newPlaylistButton = view.findViewById(R.id.newPlaylist); newPlaylistButton.setOnClickListener(ignored -> openCreatePlaylistDialog()); - playlistDisposables.add(playlistManager.getPlaylists() + playlistDisposables.add(playlistManager.getDisplayIndexOrderedPlaylists() .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::onPlaylistsReceived)); } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index 47817f9e473..c68a22b011b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -41,6 +41,7 @@ public Maybe> createPlaylist(final String name, final List streamIds) })).subscribeOn(Schedulers.io()); } + public Completable updatePlaylists(final List updateItems, + final List deletedItems) { + final List items = new ArrayList<>(updateItems.size()); + for (final PlaylistMetadataEntry item : updateItems) { + items.add(new PlaylistEntity(item)); + } + return Completable.fromRunnable(() -> database.runInTransaction(() -> { + for (final Long uid: deletedItems) { + playlistTable.deletePlaylist(uid); + } + for (final PlaylistEntity item: items) { + playlistTable.upsertPlaylist(item); + } + })).subscribeOn(Schedulers.io()); + } + public Flowable> getPlaylists() { return playlistStreamTable.getPlaylistMetadata().subscribeOn(Schedulers.io()); } + public Flowable> getDisplayIndexOrderedPlaylists() { + return playlistStreamTable.getDisplayIndexOrderedPlaylistMetadata() + .subscribeOn(Schedulers.io()); + } + public Flowable> getPlaylistStreams(final long playlistId) { return playlistStreamTable.getOrderedStreamsOf(playlistId).subscribeOn(Schedulers.io()); } @@ -107,7 +129,7 @@ public Maybe changePlaylistThumbnail(final long playlistId, return modifyPlaylist(playlistId, null, thumbnailUrl, -1); } - public Maybe changePlaylistDisplayIndex(final long playlistId, + public Maybe updatePlaylistDisplayIndex(final long playlistId, final long displayIndex) { return modifyPlaylist(playlistId, null, null, displayIndex); } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java index b49f149d64f..1dbd726aef1 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java @@ -7,16 +7,18 @@ import java.util.List; +import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Flowable; -import io.reactivex.rxjava3.core.Maybe; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.schedulers.Schedulers; public class RemotePlaylistManager { + private final AppDatabase database; private final PlaylistRemoteDAO playlistRemoteTable; public RemotePlaylistManager(final AppDatabase db) { + database = db; playlistRemoteTable = db.playlistRemoteDAO(); } @@ -34,18 +36,16 @@ public Single deletePlaylist(final long playlistId) { .subscribeOn(Schedulers.io()); } - public Maybe changePlaylistDisplayIndex(final long playlistId, - final long displayIndex) { - return playlistRemoteTable.getPlaylist(playlistId) - .firstElement() - .filter(playlistRemoteEntities -> !playlistRemoteEntities.isEmpty()) - .map(playlistRemoteEntities -> { - final PlaylistRemoteEntity playlist = playlistRemoteEntities.get(0); - if (displayIndex != -1) { - playlist.setDisplayIndex(displayIndex); - } - return playlistRemoteTable.update(playlist); - }).subscribeOn(Schedulers.io()); + public Completable updatePlaylists(final List updateItems, + final List deletedItems) { + return Completable.fromRunnable(() -> database.runInTransaction(() -> { + for (final Long uid: deletedItems) { + playlistRemoteTable.deletePlaylist(uid); + } + for (final PlaylistRemoteEntity item: updateItems) { + playlistRemoteTable.upsert(item); + } + })).subscribeOn(Schedulers.io()); } public Single onBookmark(final PlaylistInfo playlistInfo) { From 0aa08a5e4049952bc830522b3053d347199ee3f7 Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Fri, 15 Apr 2022 23:19:24 +0800 Subject: [PATCH 007/645] Use new item holder --- .../newpipe/local/LocalItemListAdapter.java | 21 ++++-- .../local/bookmark/BookmarkFragment.java | 18 ++--- .../LocalBookmarkPlaylistItemHolder.java | 63 ++++++++++++++++ .../local/holder/LocalPlaylistItemHolder.java | 19 +---- .../RemoteBookmarkPlaylistItemHolder.java | 71 +++++++++++++++++++ .../holder/RemotePlaylistItemHolder.java | 20 +----- 6 files changed, 163 insertions(+), 49 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/local/holder/LocalBookmarkPlaylistItemHolder.java create mode 100644 app/src/main/java/org/schabi/newpipe/local/holder/RemoteBookmarkPlaylistItemHolder.java diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index 05e2fdac083..161d35ee591 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -13,6 +13,7 @@ import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.local.holder.LocalBookmarkPlaylistItemHolder; import org.schabi.newpipe.local.holder.LocalItemHolder; import org.schabi.newpipe.local.holder.LocalPlaylistGridItemHolder; import org.schabi.newpipe.local.holder.LocalPlaylistItemHolder; @@ -20,6 +21,7 @@ import org.schabi.newpipe.local.holder.LocalPlaylistStreamItemHolder; import org.schabi.newpipe.local.holder.LocalStatisticStreamGridItemHolder; import org.schabi.newpipe.local.holder.LocalStatisticStreamItemHolder; +import org.schabi.newpipe.local.holder.RemoteBookmarkPlaylistItemHolder; import org.schabi.newpipe.local.holder.RemotePlaylistGridItemHolder; import org.schabi.newpipe.local.holder.RemotePlaylistItemHolder; import org.schabi.newpipe.util.FallbackViewHolder; @@ -66,6 +68,8 @@ public class LocalItemListAdapter extends RecyclerView.Adapter localItems; @@ -74,6 +78,7 @@ public class LocalItemListAdapter extends RecyclerView.Adapter, Void> { - // todo: add to playlists, item handle should be invisible // Save the list 10s after the last change occurred private static final long SAVE_DEBOUNCE_MILLIS = 10000; @@ -126,6 +125,8 @@ public void onResume() { @Override protected void initViews(final View rootView, final Bundle savedInstanceState) { super.initViews(rootView, savedInstanceState); + + itemListAdapter.setUseItemHandle(true); } @Override @@ -530,15 +531,16 @@ public boolean onMove(@NonNull final RecyclerView recyclerView, @NonNull final RecyclerView.ViewHolder target) { if (source.getItemViewType() != target.getItemViewType() || itemListAdapter == null) { - // Allow swap LocalPlaylistItemHolder and RemotePlaylistItemHolder. + // Allow swap LocalBookmarkPlaylistItemHolder and + // RemoteBookmarkPlaylistItemHolder. if (!( ( - (source instanceof LocalPlaylistItemHolder) - || (source instanceof RemotePlaylistItemHolder) + (source instanceof LocalBookmarkPlaylistItemHolder) + || (source instanceof RemoteBookmarkPlaylistItemHolder) ) && ( - (target instanceof LocalPlaylistItemHolder) - || (target instanceof RemotePlaylistItemHolder) + (target instanceof LocalBookmarkPlaylistItemHolder) + || (target instanceof RemoteBookmarkPlaylistItemHolder) ) )) { return false; diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalBookmarkPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalBookmarkPlaylistItemHolder.java new file mode 100644 index 00000000000..697ef1072bd --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalBookmarkPlaylistItemHolder.java @@ -0,0 +1,63 @@ +package org.schabi.newpipe.local.holder; + +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.database.LocalItem; +import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; +import org.schabi.newpipe.local.LocalItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.util.Localization; +import org.schabi.newpipe.util.PicassoHelper; + +import java.time.format.DateTimeFormatter; + +public class LocalBookmarkPlaylistItemHolder extends PlaylistItemHolder { + private final View itemHandleView; + + public LocalBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, + final ViewGroup parent) { + this(infoItemBuilder, R.layout.list_playlist_bookmark_item, parent); + } + + LocalBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId, + final ViewGroup parent) { + super(infoItemBuilder, layoutId, parent); + itemHandleView = itemView.findViewById(R.id.itemHandle); + } + + @Override + public void updateFromItem(final LocalItem localItem, + final HistoryRecordManager historyRecordManager, + final DateTimeFormatter dateTimeFormatter) { + if (!(localItem instanceof PlaylistMetadataEntry)) { + return; + } + final PlaylistMetadataEntry item = (PlaylistMetadataEntry) localItem; + + itemTitleView.setText(item.name); + itemStreamCountView.setText(Localization.localizeStreamCountMini( + itemStreamCountView.getContext(), item.streamCount)); + itemUploaderView.setVisibility(View.INVISIBLE); + + PicassoHelper.loadPlaylistThumbnail(item.thumbnailUrl).into(itemThumbnailView); + + itemHandleView.setOnTouchListener(getOnTouchListener(item)); + + super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter); + } + + private View.OnTouchListener getOnTouchListener(final PlaylistMetadataEntry item) { + return (view, motionEvent) -> { + view.performClick(); + if (itemBuilder != null && itemBuilder.getOnItemSelectedListener() != null + && motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) { + itemBuilder.getOnItemSelectedListener().drag(item, + LocalBookmarkPlaylistItemHolder.this); + } + return false; + }; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java index 57a94470969..2cfc9446326 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java @@ -1,6 +1,5 @@ package org.schabi.newpipe.local.holder; -import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -15,16 +14,14 @@ import java.time.format.DateTimeFormatter; public class LocalPlaylistItemHolder extends PlaylistItemHolder { - private final View itemHandleView; public LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final ViewGroup parent) { - this(infoItemBuilder, R.layout.list_playlist_bookmark_item, parent); + this(infoItemBuilder, R.layout.list_playlist_mini_item, parent); } LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId, final ViewGroup parent) { super(infoItemBuilder, layoutId, parent); - itemHandleView = itemView.findViewById(R.id.itemHandle); } @Override @@ -43,20 +40,6 @@ public void updateFromItem(final LocalItem localItem, PicassoHelper.loadPlaylistThumbnail(item.thumbnailUrl).into(itemThumbnailView); - itemHandleView.setOnTouchListener(getOnTouchListener(item)); - super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter); } - - private View.OnTouchListener getOnTouchListener(final PlaylistMetadataEntry item) { - return (view, motionEvent) -> { - view.performClick(); - if (itemBuilder != null && itemBuilder.getOnItemSelectedListener() != null - && motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) { - itemBuilder.getOnItemSelectedListener().drag(item, - LocalPlaylistItemHolder.this); - } - return false; - }; - } } diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/RemoteBookmarkPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/RemoteBookmarkPlaylistItemHolder.java new file mode 100644 index 00000000000..345223b08ca --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/holder/RemoteBookmarkPlaylistItemHolder.java @@ -0,0 +1,71 @@ +package org.schabi.newpipe.local.holder; + +import android.text.TextUtils; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.database.LocalItem; +import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.local.LocalItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.util.Localization; +import org.schabi.newpipe.util.PicassoHelper; + +import java.time.format.DateTimeFormatter; + +public class RemoteBookmarkPlaylistItemHolder extends PlaylistItemHolder { + private final View itemHandleView; + + public RemoteBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, + final ViewGroup parent) { + this(infoItemBuilder, R.layout.list_playlist_bookmark_item, parent); + } + + RemoteBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId, + final ViewGroup parent) { + super(infoItemBuilder, layoutId, parent); + itemHandleView = itemView.findViewById(R.id.itemHandle); + } + + @Override + public void updateFromItem(final LocalItem localItem, + final HistoryRecordManager historyRecordManager, + final DateTimeFormatter dateTimeFormatter) { + if (!(localItem instanceof PlaylistRemoteEntity)) { + return; + } + final PlaylistRemoteEntity item = (PlaylistRemoteEntity) localItem; + + itemTitleView.setText(item.getName()); + itemStreamCountView.setText(Localization.localizeStreamCountMini( + itemStreamCountView.getContext(), item.getStreamCount())); + // Here is where the uploader name is set in the bookmarked playlists library + if (!TextUtils.isEmpty(item.getUploader())) { + itemUploaderView.setText(Localization.concatenateStrings(item.getUploader(), + NewPipe.getNameOfService(item.getServiceId()))); + } else { + itemUploaderView.setText(NewPipe.getNameOfService(item.getServiceId())); + } + + PicassoHelper.loadPlaylistThumbnail(item.getThumbnailUrl()).into(itemThumbnailView); + + itemHandleView.setOnTouchListener(getOnTouchListener(item)); + + super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter); + } + + private View.OnTouchListener getOnTouchListener(final PlaylistRemoteEntity item) { + return (view, motionEvent) -> { + view.performClick(); + if (itemBuilder != null && itemBuilder.getOnItemSelectedListener() != null + && motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) { + itemBuilder.getOnItemSelectedListener().drag(item, + RemoteBookmarkPlaylistItemHolder.this); + } + return false; + }; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java index 9ecfa6979a2..d2059bfed67 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java @@ -1,8 +1,6 @@ package org.schabi.newpipe.local.holder; import android.text.TextUtils; -import android.view.MotionEvent; -import android.view.View; import android.view.ViewGroup; import org.schabi.newpipe.R; @@ -17,17 +15,15 @@ import java.time.format.DateTimeFormatter; public class RemotePlaylistItemHolder extends PlaylistItemHolder { - private final View itemHandleView; public RemotePlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final ViewGroup parent) { - this(infoItemBuilder, R.layout.list_playlist_bookmark_item, parent); + this(infoItemBuilder, R.layout.list_playlist_mini_item, parent); } RemotePlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId, final ViewGroup parent) { super(infoItemBuilder, layoutId, parent); - itemHandleView = itemView.findViewById(R.id.itemHandle); } @Override @@ -52,20 +48,6 @@ public void updateFromItem(final LocalItem localItem, PicassoHelper.loadPlaylistThumbnail(item.getThumbnailUrl()).into(itemThumbnailView); - itemHandleView.setOnTouchListener(getOnTouchListener(item)); - super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter); } - - private View.OnTouchListener getOnTouchListener(final PlaylistRemoteEntity item) { - return (view, motionEvent) -> { - view.performClick(); - if (itemBuilder != null && itemBuilder.getOnItemSelectedListener() != null - && motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) { - itemBuilder.getOnItemSelectedListener().drag(item, - RemotePlaylistItemHolder.this); - } - return false; - }; - } } From c24aed054f9da7dcde634faf570f0314d44f6a87 Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Sat, 16 Apr 2022 12:00:02 +0800 Subject: [PATCH 008/645] Fix sonar warning and typo --- .../schabi/newpipe/database/Migrations.java | 16 ++--- .../newpipe/local/LocalItemListAdapter.java | 15 +++-- .../local/bookmark/BookmarkFragment.java | 64 +++++++++---------- .../LocalBookmarkPlaylistItemHolder.java | 11 +--- .../local/holder/LocalPlaylistItemHolder.java | 3 +- .../RemoteBookmarkPlaylistItemHolder.java | 19 +----- .../holder/RemotePlaylistItemHolder.java | 3 +- 7 files changed, 53 insertions(+), 78 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.java b/app/src/main/java/org/schabi/newpipe/database/Migrations.java index ffca6cca58c..1013899ca91 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Migrations.java +++ b/app/src/main/java/org/schabi/newpipe/database/Migrations.java @@ -195,8 +195,8 @@ public void migrate(@NonNull final SupportSQLiteDatabase database) { try { database.beginTransaction(); - // update playlists - // create a temp table to initialize display_index + // Update playlists. + // Create a temp table to initialize display_index. database.execSQL("CREATE TABLE `playlists_tmp` " + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "`name` TEXT, `thumbnail_url` TEXT," @@ -204,16 +204,16 @@ public void migrate(@NonNull final SupportSQLiteDatabase database) { database.execSQL("INSERT INTO `playlists_tmp` (`uid`, `name`, `thumbnail_url`)" + "SELECT `uid`, `name`, `thumbnail_url` FROM `playlists`"); - // replace the old table + // Replace the old table. database.execSQL("DROP TABLE `playlists`"); database.execSQL("ALTER TABLE `playlists_tmp` RENAME TO `playlists`"); - // create index on the new table + // Create index on the new table. database.execSQL("CREATE INDEX `index_playlists_name` ON `playlists` (`name`)"); - // update remote_playlists - // create a temp table to initialize display_index + // Update remote_playlists. + // Create a temp table to initialize display_index. database.execSQL("CREATE TABLE `remote_playlists_tmp` " + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, " @@ -225,11 +225,11 @@ public void migrate(@NonNull final SupportSQLiteDatabase database) { + "SELECT `uid`, `service_id`, `name`, `url`, `thumbnail_url`, `uploader`, " + "`stream_count` FROM `remote_playlists`"); - // replace the old table + // Replace the old table. database.execSQL("DROP TABLE `remote_playlists`"); database.execSQL("ALTER TABLE `remote_playlists_tmp` RENAME TO `remote_playlists`"); - // create index on the new table + // Create index on the new table. database.execSQL("CREATE INDEX `index_remote_playlists_name` " + "ON `remote_playlists` (`name`)"); database.execSQL("CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` " diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index 161d35ee591..5c22cee240d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -256,12 +256,17 @@ public int getItemViewType(int position) { switch (item.getLocalItemType()) { case PLAYLIST_LOCAL_ITEM: - return useItemHandle ? LOCAL_BOOKMARK_PLAYLIST_HOLDER_TYPE : (useGridVariant - ? LOCAL_PLAYLIST_GRID_HOLDER_TYPE : LOCAL_PLAYLIST_HOLDER_TYPE); + if (useItemHandle) { + return LOCAL_BOOKMARK_PLAYLIST_HOLDER_TYPE; + } + return useGridVariant ? LOCAL_PLAYLIST_GRID_HOLDER_TYPE + : LOCAL_PLAYLIST_HOLDER_TYPE; case PLAYLIST_REMOTE_ITEM: - return useItemHandle ? REMOTE_BOOKMARK_PLAYLIST_HOLDER_TYPE : (useGridVariant - ? REMOTE_PLAYLIST_GRID_HOLDER_TYPE : REMOTE_PLAYLIST_HOLDER_TYPE); - + if (useItemHandle) { + return REMOTE_BOOKMARK_PLAYLIST_HOLDER_TYPE; + } + return useGridVariant ? REMOTE_PLAYLIST_GRID_HOLDER_TYPE + : REMOTE_PLAYLIST_HOLDER_TYPE; case PLAYLIST_STREAM_ITEM: return useGridVariant ? STREAM_PLAYLIST_GRID_HOLDER_TYPE : STREAM_PLAYLIST_HOLDER_TYPE; diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index daa89a4f020..14100ef816e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -54,7 +54,7 @@ public final class BookmarkFragment extends BaseLocalListFragment, Void> { - // Save the list 10s after the last change occurred + // Save the list 10 seconds after the last change occurred private static final long SAVE_DEBOUNCE_MILLIS = 10000; private static final int MINIMUM_INITIAL_DRAG_VELOCITY = 12; @State @@ -281,6 +281,7 @@ public void onError(final Throwable exception) { @Override public void onComplete() { + // Do nothing. } }; } @@ -444,13 +445,13 @@ private void saveImmediate() { LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM); final Long databaseIndex = displayIndexInDatabase.remove(key); + // The database index should not be null because inserting new item into database + // is not dealt here. NullPointerException has occurred once, but I can't reproduce + // it. Enhance robustness here. if (databaseIndex != null) { if (databaseIndex != i) { localItemsUpdate.add((PlaylistMetadataEntry) item); } - } else { - // This should be impossible. - continue; } } else if (item instanceof PlaylistRemoteEntity) { ((PlaylistRemoteEntity) item).setDisplayIndex(i); @@ -464,9 +465,6 @@ private void saveImmediate() { if (databaseIndex != i) { remoteItemsUpdate.add((PlaylistRemoteEntity) item); } - } else { - // This should be impossible. - continue; } } } @@ -489,16 +487,16 @@ private void saveImmediate() { .observeOn(AndroidSchedulers.mainThread()) .subscribe(() -> disposables.add(remotePlaylistManager.updatePlaylists( remoteItemsUpdate, remoteItemsDeleteUid) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(() -> { - if (isModified != null) { - isModified.set(false); - } - }, - throwable -> showError(new ErrorInfo(throwable, - UserAction.REQUESTED_BOOKMARK, - "Saving playlist")) - )), + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(() -> { + if (isModified != null) { + isModified.set(false); + } + }, + throwable -> showError(new ErrorInfo(throwable, + UserAction.REQUESTED_BOOKMARK, + "Saving playlist")) + )), throwable -> showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK, "Saving playlist")) )); @@ -529,22 +527,21 @@ public int interpolateOutOfBoundsScroll(@NonNull final RecyclerView recyclerView public boolean onMove(@NonNull final RecyclerView recyclerView, @NonNull final RecyclerView.ViewHolder source, @NonNull final RecyclerView.ViewHolder target) { - if (source.getItemViewType() != target.getItemViewType() - || itemListAdapter == null) { - // Allow swap LocalBookmarkPlaylistItemHolder and - // RemoteBookmarkPlaylistItemHolder. - if (!( - ( - (source instanceof LocalBookmarkPlaylistItemHolder) - || (source instanceof RemoteBookmarkPlaylistItemHolder) - ) - && ( - (target instanceof LocalBookmarkPlaylistItemHolder) - || (target instanceof RemoteBookmarkPlaylistItemHolder) - ) - )) { - return false; - } + + // Allow swap LocalBookmarkPlaylistItemHolder and RemoteBookmarkPlaylistItemHolder. + if (itemListAdapter == null + || source.getItemViewType() != target.getItemViewType() + && !( + ( + (source instanceof LocalBookmarkPlaylistItemHolder) + || (source instanceof RemoteBookmarkPlaylistItemHolder) + ) + && ( + (target instanceof LocalBookmarkPlaylistItemHolder) + || (target instanceof RemoteBookmarkPlaylistItemHolder) + )) + ) { + return false; } final int sourceIndex = source.getBindingAdapterPosition(); @@ -569,6 +566,7 @@ public boolean isItemViewSwipeEnabled() { @Override public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, final int swipeDir) { + // Do nothing. } }; } diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalBookmarkPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalBookmarkPlaylistItemHolder.java index 697ef1072bd..16130009b6e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalBookmarkPlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalBookmarkPlaylistItemHolder.java @@ -9,12 +9,10 @@ import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PicassoHelper; import java.time.format.DateTimeFormatter; -public class LocalBookmarkPlaylistItemHolder extends PlaylistItemHolder { +public class LocalBookmarkPlaylistItemHolder extends LocalPlaylistItemHolder { private final View itemHandleView; public LocalBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, @@ -37,13 +35,6 @@ public void updateFromItem(final LocalItem localItem, } final PlaylistMetadataEntry item = (PlaylistMetadataEntry) localItem; - itemTitleView.setText(item.name); - itemStreamCountView.setText(Localization.localizeStreamCountMini( - itemStreamCountView.getContext(), item.streamCount)); - itemUploaderView.setVisibility(View.INVISIBLE); - - PicassoHelper.loadPlaylistThumbnail(item.thumbnailUrl).into(itemThumbnailView); - itemHandleView.setOnTouchListener(getOnTouchListener(item)); super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter); diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java index 2cfc9446326..50bbcd56676 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java @@ -3,7 +3,6 @@ import android.view.View; import android.view.ViewGroup; -import org.schabi.newpipe.R; import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.local.LocalItemBuilder; @@ -16,7 +15,7 @@ public class LocalPlaylistItemHolder extends PlaylistItemHolder { public LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final ViewGroup parent) { - this(infoItemBuilder, R.layout.list_playlist_mini_item, parent); + super(infoItemBuilder, parent); } LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId, diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/RemoteBookmarkPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/RemoteBookmarkPlaylistItemHolder.java index 345223b08ca..6d61d1e08bf 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/RemoteBookmarkPlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/RemoteBookmarkPlaylistItemHolder.java @@ -1,6 +1,5 @@ package org.schabi.newpipe.local.holder; -import android.text.TextUtils; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -8,15 +7,12 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; -import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PicassoHelper; import java.time.format.DateTimeFormatter; -public class RemoteBookmarkPlaylistItemHolder extends PlaylistItemHolder { +public class RemoteBookmarkPlaylistItemHolder extends RemotePlaylistItemHolder { private final View itemHandleView; public RemoteBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, @@ -39,19 +35,6 @@ public void updateFromItem(final LocalItem localItem, } final PlaylistRemoteEntity item = (PlaylistRemoteEntity) localItem; - itemTitleView.setText(item.getName()); - itemStreamCountView.setText(Localization.localizeStreamCountMini( - itemStreamCountView.getContext(), item.getStreamCount())); - // Here is where the uploader name is set in the bookmarked playlists library - if (!TextUtils.isEmpty(item.getUploader())) { - itemUploaderView.setText(Localization.concatenateStrings(item.getUploader(), - NewPipe.getNameOfService(item.getServiceId()))); - } else { - itemUploaderView.setText(NewPipe.getNameOfService(item.getServiceId())); - } - - PicassoHelper.loadPlaylistThumbnail(item.getThumbnailUrl()).into(itemThumbnailView); - itemHandleView.setOnTouchListener(getOnTouchListener(item)); super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter); diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java index d2059bfed67..865b2c4f719 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java @@ -3,7 +3,6 @@ import android.text.TextUtils; import android.view.ViewGroup; -import org.schabi.newpipe.R; import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; import org.schabi.newpipe.extractor.NewPipe; @@ -18,7 +17,7 @@ public class RemotePlaylistItemHolder extends PlaylistItemHolder { public RemotePlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final ViewGroup parent) { - this(infoItemBuilder, R.layout.list_playlist_mini_item, parent); + super(infoItemBuilder, parent); } RemotePlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId, From bd1aae8d66d68ca511740a7b3765b513354c4e6e Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Sat, 16 Apr 2022 12:44:24 +0800 Subject: [PATCH 009/645] Fix sonar warning --- .../newpipe/local/bookmark/BookmarkFragment.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index 14100ef816e..b1910781776 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -446,12 +446,10 @@ private void saveImmediate() { final Long databaseIndex = displayIndexInDatabase.remove(key); // The database index should not be null because inserting new item into database - // is not dealt here. NullPointerException has occurred once, but I can't reproduce - // it. Enhance robustness here. - if (databaseIndex != null) { - if (databaseIndex != i) { - localItemsUpdate.add((PlaylistMetadataEntry) item); - } + // is not handled here. NullPointerException has occurred once, but I can't + // reproduce it. Enhance robustness here. + if (databaseIndex != null && databaseIndex != i) { + localItemsUpdate.add((PlaylistMetadataEntry) item); } } else if (item instanceof PlaylistRemoteEntity) { ((PlaylistRemoteEntity) item).setDisplayIndex(i); @@ -461,10 +459,8 @@ private void saveImmediate() { LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM); final Long databaseIndex = displayIndexInDatabase.remove(key); - if (databaseIndex != null) { - if (databaseIndex != i) { - remoteItemsUpdate.add((PlaylistRemoteEntity) item); - } + if (databaseIndex != null && databaseIndex != i) { + remoteItemsUpdate.add((PlaylistRemoteEntity) item); } } } From bb5390d63a6737ce7b24add776e9e017ac544ae6 Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Sun, 17 Apr 2022 14:53:02 +0800 Subject: [PATCH 010/645] Reuse DebounceSaver --- .../database/playlist/PlaylistLocalItem.java | 8 +- .../local/bookmark/BookmarkFragment.java | 81 +++++++------------ .../local/playlist/LocalPlaylistFragment.java | 73 ++++++----------- .../schabi/newpipe/util/DebounceSavable.java | 15 ++++ .../schabi/newpipe/util/DebounceSaver.java | 68 ++++++++++++++++ 5 files changed, 142 insertions(+), 103 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/util/DebounceSavable.java create mode 100644 app/src/main/java/org/schabi/newpipe/util/DebounceSaver.java diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java index 47c6dd6175a..0e7beba4129 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java @@ -17,15 +17,15 @@ static List merge( final List localPlaylists, final List remotePlaylists) { - // Merge localPlaylists and remotePlaylists by displayIndex. - // If two items have the same displayIndex, sort them in CASE_INSENSITIVE_ORDER. + // Merge localPlaylists and remotePlaylists by display index. + // If two items have the same display index, sort them in CASE_INSENSITIVE_ORDER. // This algorithm is similar to the merge operation in merge sort. final List result = new ArrayList<>( localPlaylists.size() + remotePlaylists.size()); final List itemsWithSameIndex = new ArrayList<>(); - // The data from database may not be in the displayIndex order + // The data from database may not be in the display index order Collections.sort(localPlaylists, Comparator.comparingLong(PlaylistMetadataEntry::getDisplayIndex)); Collections.sort(remotePlaylists, @@ -58,7 +58,7 @@ static void addItem(final List result, final PlaylistLocalIte final List itemsWithSameIndex) { if (!itemsWithSameIndex.isEmpty() && itemsWithSameIndex.get(0).getDisplayIndex() != item.getDisplayIndex()) { - // The new item has a different displayIndex, add previous items with same + // The new item has a different display index, add previous items with same // index to the result. addItemsWithSameIndex(result, itemsWithSameIndex); itemsWithSameIndex.clear(); diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index b1910781776..ceeb980c7e0 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -35,6 +35,8 @@ import org.schabi.newpipe.local.holder.RemoteBookmarkPlaylistItemHolder; import org.schabi.newpipe.local.playlist.LocalPlaylistManager; import org.schabi.newpipe.local.playlist.RemotePlaylistManager; +import org.schabi.newpipe.util.DebounceSavable; +import org.schabi.newpipe.util.DebounceSaver; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; @@ -42,7 +44,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import icepick.State; @@ -50,12 +51,10 @@ import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; -import io.reactivex.rxjava3.subjects.PublishSubject; -public final class BookmarkFragment extends BaseLocalListFragment, Void> { +public final class BookmarkFragment extends BaseLocalListFragment, Void> + implements DebounceSavable { - // Save the list 10 seconds after the last change occurred - private static final long SAVE_DEBOUNCE_MILLIS = 10000; private static final int MINIMUM_INITIAL_DRAG_VELOCITY = 12; @State protected Parcelable itemsListState; @@ -66,12 +65,10 @@ public final class BookmarkFragment extends BaseLocalListFragment debouncedSaveSignal; - - /* Has the playlist been fully loaded from db */ + /* Have the bookmarked playlists been fully loaded from db */ private AtomicBoolean isLoadingComplete; - /* Has the playlist been modified (e.g. items reordered or deleted) */ - private AtomicBoolean isModified; + + private DebounceSaver debounceSaver; // Map from (uid, local/remote item) to the saved display index in the database. private Map, Long> displayIndexInDatabase; @@ -91,9 +88,8 @@ public void onCreate(final Bundle savedInstanceState) { remotePlaylistManager = new RemotePlaylistManager(database); disposables = new CompositeDisposable(); - debouncedSaveSignal = PublishSubject.create(); isLoadingComplete = new AtomicBoolean(); - isModified = new AtomicBoolean(); + debounceSaver = new DebounceSaver(10000, this); displayIndexInDatabase = new HashMap<>(); } @@ -183,9 +179,11 @@ public void drag(final LocalItem selectedItem, public void startLoading(final boolean forceLoad) { super.startLoading(forceLoad); - disposables.add(getDebouncedSaver()); + if (debounceSaver != null) { + disposables.add(debounceSaver.getDebouncedSaver()); + debounceSaver.setIsModified(false); + } isLoadingComplete.set(false); - isModified.set(false); Flowable.combineLatest(localPlaylistManager.getPlaylists(), remotePlaylistManager.getPlaylists(), PlaylistLocalItem::merge) @@ -225,21 +223,20 @@ public void onDestroyView() { @Override public void onDestroy() { super.onDestroy(); - if (debouncedSaveSignal != null) { - debouncedSaveSignal.onComplete(); + if (debounceSaver != null) { + debounceSaver.getDebouncedSaveSignal().onComplete(); } if (disposables != null) { disposables.dispose(); } - debouncedSaveSignal = null; + debounceSaver = null; disposables = null; localPlaylistManager = null; remotePlaylistManager = null; itemsListState = null; isLoadingComplete = null; - isModified = null; displayIndexInDatabase = null; } @@ -263,7 +260,7 @@ public void onSubscribe(final Subscription s) { @Override public void onNext(final List subscriptions) { - if (isModified == null || !isModified.get()) { + if (debounceSaver == null || !debounceSaver.getIsModified()) { checkDisplayIndexModified(subscriptions); handleResult(subscriptions); isLoadingComplete.set(true); @@ -346,11 +343,11 @@ private void deleteItem(final PlaylistLocalItem item) { } itemListAdapter.removeItem(item); - saveChanges(); + debounceSaver.saveChanges(); } private void checkDisplayIndexModified(@NonNull final List result) { - if (isModified != null && isModified.get()) { + if (debounceSaver != null && debounceSaver.getIsModified()) { return; } @@ -358,8 +355,9 @@ private void checkDisplayIndexModified(@NonNull final List re // If the display index does not match actual index in the list, update the display index. // This may happen when a new list is created - // or on the first run after database update - // or displayIndex is not continuous for some reason. + // or on the first run after database migration + // or display index is not continuous for some reason + // or the user changes the display index. boolean isDisplayIndexModified = false; for (int i = 0; i < result.size(); i++) { final PlaylistLocalItem item = result.get(i); @@ -388,40 +386,19 @@ private void checkDisplayIndexModified(@NonNull final List re } if (isDisplayIndexModified) { - saveChanges(); - } - } - - private void saveChanges() { - if (isModified == null || debouncedSaveSignal == null) { - return; + debounceSaver.saveChanges(); } - - isModified.set(true); - debouncedSaveSignal.onNext(System.currentTimeMillis()); } - private Disposable getDebouncedSaver() { - if (debouncedSaveSignal == null) { - return Disposable.empty(); - } - - return debouncedSaveSignal - .debounce(SAVE_DEBOUNCE_MILLIS, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(ignored -> saveImmediate(), throwable -> - showError(new ErrorInfo(throwable, UserAction.SOMETHING_ELSE, - "Debounced saver"))); - } - - private void saveImmediate() { + @Override + public void saveImmediate() { if (itemListAdapter == null) { return; } // List must be loaded and modified in order to save - if (isLoadingComplete == null || isModified == null - || !isLoadingComplete.get() || !isModified.get()) { + if (isLoadingComplete == null || debounceSaver == null + || !isLoadingComplete.get() || !debounceSaver.getIsModified()) { Log.w(TAG, "Attempting to save playlists in bookmark when bookmark " + "is not loaded or playlists not modified"); return; @@ -485,8 +462,8 @@ private void saveImmediate() { remoteItemsUpdate, remoteItemsDeleteUid) .observeOn(AndroidSchedulers.mainThread()) .subscribe(() -> { - if (isModified != null) { - isModified.set(false); + if (debounceSaver != null) { + debounceSaver.setIsModified(false); } }, throwable -> showError(new ErrorInfo(throwable, @@ -544,7 +521,7 @@ public boolean onMove(@NonNull final RecyclerView recyclerView, final int targetIndex = target.getBindingAdapterPosition(); final boolean isSwapped = itemListAdapter.swapItems(sourceIndex, targetIndex); if (isSwapped) { - saveChanges(); + debounceSaver.saveChanges(); } return isSwapped; } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 0eb56d7169c..d929c93a55d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -46,6 +46,8 @@ import org.schabi.newpipe.player.MainPlayer.PlayerType; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; +import org.schabi.newpipe.util.DebounceSavable; +import org.schabi.newpipe.util.DebounceSaver; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; @@ -55,7 +57,6 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import icepick.State; @@ -64,11 +65,9 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.schedulers.Schedulers; -import io.reactivex.rxjava3.subjects.PublishSubject; -public class LocalPlaylistFragment extends BaseLocalListFragment, Void> { - // Save the list 10 seconds after the last change occurred - private static final long SAVE_DEBOUNCE_MILLIS = 10000; +public class LocalPlaylistFragment extends BaseLocalListFragment, Void> + implements DebounceSavable { private static final int MINIMUM_INITIAL_DRAG_VELOCITY = 12; @State protected Long playlistId; @@ -85,13 +84,13 @@ public class LocalPlaylistFragment extends BaseLocalListFragment debouncedSaveSignal; private CompositeDisposable disposables; /* Has the playlist been fully loaded from db */ private AtomicBoolean isLoadingComplete; - /* Has the playlist been modified (e.g. items reordered or deleted) */ - private AtomicBoolean isModified; + + private DebounceSaver debounceSaver; + /* Is the playlist currently being processed to remove watched videos */ private boolean isRemovingWatched = false; @@ -109,12 +108,11 @@ public static LocalPlaylistFragment getInstance(final long playlistId, final Str public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); playlistManager = new LocalPlaylistManager(NewPipeDatabase.getInstance(requireContext())); - debouncedSaveSignal = PublishSubject.create(); disposables = new CompositeDisposable(); isLoadingComplete = new AtomicBoolean(); - isModified = new AtomicBoolean(); + debounceSaver = new DebounceSaver(10000, this); } @Override @@ -220,10 +218,13 @@ public void startLoading(final boolean forceLoad) { if (disposables != null) { disposables.clear(); } - disposables.add(getDebouncedSaver()); + + if (debounceSaver != null) { + disposables.add(debounceSaver.getDebouncedSaver()); + debounceSaver.setIsModified(false); + } isLoadingComplete.set(false); - isModified.set(false); playlistManager.getPlaylistStreams(playlistId) .onBackpressureLatest() @@ -285,19 +286,18 @@ public void onDestroyView() { @Override public void onDestroy() { super.onDestroy(); - if (debouncedSaveSignal != null) { - debouncedSaveSignal.onComplete(); + if (debounceSaver != null) { + debounceSaver.getDebouncedSaveSignal().onComplete(); } if (disposables != null) { disposables.dispose(); } - debouncedSaveSignal = null; + debounceSaver = null; playlistManager = null; disposables = null; isLoadingComplete = null; - isModified = null; } /////////////////////////////////////////////////////////////////////////// @@ -321,7 +321,7 @@ public void onSubscribe(final Subscription s) { @Override public void onNext(final List streams) { // Skip handling the result after it has been modified - if (isModified == null || !isModified.get()) { + if (debounceSaver == null || !debounceSaver.getIsModified()) { handleResult(streams); isLoadingComplete.set(true); } @@ -441,7 +441,7 @@ public void removeWatchedStreams(final boolean removePartiallyWatched) { itemListAdapter.clearStreamItemList(); itemListAdapter.addItems(notWatchedItems); - saveChanges(); + debounceSaver.saveChanges(); if (thumbnailVideoRemoved) { @@ -609,39 +609,18 @@ private void deleteItem(final PlaylistStreamEntry item) { } setVideoCount(itemListAdapter.getItemsList().size()); - saveChanges(); + debounceSaver.saveChanges(); } - private void saveChanges() { - if (isModified == null || debouncedSaveSignal == null) { - return; - } - - isModified.set(true); - debouncedSaveSignal.onNext(System.currentTimeMillis()); - } - - private Disposable getDebouncedSaver() { - if (debouncedSaveSignal == null) { - return Disposable.empty(); - } - - return debouncedSaveSignal - .debounce(SAVE_DEBOUNCE_MILLIS, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(ignored -> saveImmediate(), throwable -> - showError(new ErrorInfo(throwable, UserAction.SOMETHING_ELSE, - "Debounced saver"))); - } - - private void saveImmediate() { + @Override + public void saveImmediate() { if (playlistManager == null || itemListAdapter == null) { return; } // List must be loaded and modified in order to save - if (isLoadingComplete == null || isModified == null - || !isLoadingComplete.get() || !isModified.get()) { + if (isLoadingComplete == null || debounceSaver == null + || !isLoadingComplete.get() || !debounceSaver.getIsModified()) { Log.w(TAG, "Attempting to save playlist when local playlist " + "is not loaded or not modified: playlist id=[" + playlistId + "]"); return; @@ -664,8 +643,8 @@ private void saveImmediate() { .observeOn(AndroidSchedulers.mainThread()) .subscribe( () -> { - if (isModified != null) { - isModified.set(false); + if (debounceSaver != null) { + debounceSaver.setIsModified(false); } }, throwable -> showError(new ErrorInfo(throwable, @@ -708,7 +687,7 @@ public boolean onMove(@NonNull final RecyclerView recyclerView, final int targetIndex = target.getBindingAdapterPosition(); final boolean isSwapped = itemListAdapter.swapItems(sourceIndex, targetIndex); if (isSwapped) { - saveChanges(); + debounceSaver.saveChanges(); } return isSwapped; } diff --git a/app/src/main/java/org/schabi/newpipe/util/DebounceSavable.java b/app/src/main/java/org/schabi/newpipe/util/DebounceSavable.java new file mode 100644 index 00000000000..189dce9c64e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/DebounceSavable.java @@ -0,0 +1,15 @@ +package org.schabi.newpipe.util; + +import org.schabi.newpipe.error.ErrorInfo; + +public interface DebounceSavable { + + /** + * Execute operations to save the data.
+ * Must set {@link DebounceSaver#setIsModified(boolean)} false in this method manually + * after the data has been saved. + */ + void saveImmediate(); + + void showError(ErrorInfo errorInfo); +} diff --git a/app/src/main/java/org/schabi/newpipe/util/DebounceSaver.java b/app/src/main/java/org/schabi/newpipe/util/DebounceSaver.java new file mode 100644 index 00000000000..b17d7a29cc5 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/DebounceSaver.java @@ -0,0 +1,68 @@ +package org.schabi.newpipe.util; + +import org.schabi.newpipe.error.ErrorInfo; +import org.schabi.newpipe.error.UserAction; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.subjects.PublishSubject; + +public class DebounceSaver { + + private final long saveDebounceMillis; + + private final PublishSubject debouncedSaveSignal; + + private final DebounceSavable debounceSavable; + + // Has the object been modified + private final AtomicBoolean isModified; + + + /** + * Creates a new {@code DebounceSaver}. + * + * @param saveDebounceMillis Save the object milliseconds later after the last change + * occurred. + * @param debounceSavable The object containing data to be saved. + */ + public DebounceSaver(final long saveDebounceMillis, final DebounceSavable debounceSavable) { + this.saveDebounceMillis = saveDebounceMillis; + debouncedSaveSignal = PublishSubject.create(); + this.debounceSavable = debounceSavable; + this.isModified = new AtomicBoolean(); + } + + public boolean getIsModified() { + return isModified.get(); + } + + public void setIsModified(final boolean isModified) { + this.isModified.set(isModified); + } + + public PublishSubject getDebouncedSaveSignal() { + return debouncedSaveSignal; + } + + public Disposable getDebouncedSaver() { + return debouncedSaveSignal + .debounce(saveDebounceMillis, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(ignored -> debounceSavable.saveImmediate(), throwable -> + debounceSavable.showError(new ErrorInfo(throwable, + UserAction.SOMETHING_ELSE, "Debounced saver"))); + } + + public void saveChanges() { + if (isModified == null || debouncedSaveSignal == null) { + return; + } + + isModified.set(true); + debouncedSaveSignal.onNext(System.currentTimeMillis()); + } +} From 6526ff1612ad430325a5bf8af7b425055306a0e6 Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Sun, 17 Apr 2022 20:20:20 +0800 Subject: [PATCH 011/645] Add tests --- .../newpipe/database/DatabaseMigrationTest.kt | 92 ++++++++++++++- .../local/bookmark/BookmarkFragment.java | 3 +- .../playlist/PlaylistLocalItemTest.java | 105 ++++++++++++++++++ 3 files changed, 197 insertions(+), 3 deletions(-) create mode 100644 app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt index 6d05a45bf9e..73b6313db00 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt @@ -13,6 +13,8 @@ import org.junit.Assert.assertNull import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.schabi.newpipe.database.playlist.model.PlaylistEntity +import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity import org.schabi.newpipe.extractor.stream.StreamType @RunWith(AndroidJUnit4::class) @@ -21,13 +23,17 @@ class DatabaseMigrationTest { private const val DEFAULT_SERVICE_ID = 0 private const val DEFAULT_URL = "https://www.youtube.com/watch?v=cDphUib5iG4" private const val DEFAULT_TITLE = "Test Title" + private const val DEFAULT_NAME = "Test Name" private val DEFAULT_TYPE = StreamType.VIDEO_STREAM private const val DEFAULT_DURATION = 480L private const val DEFAULT_UPLOADER_NAME = "Uploader Test" private const val DEFAULT_THUMBNAIL = "https://example.com/example.jpg" - private const val DEFAULT_SECOND_SERVICE_ID = 0 + private const val DEFAULT_SECOND_SERVICE_ID = 1 private const val DEFAULT_SECOND_URL = "https://www.youtube.com/watch?v=ncQU6iBn5Fc" + + private const val DEFAULT_THIRD_SERVICE_ID = 2 + private const val DEFAULT_THIRD_URL = "https://www.youtube.com/watch?v=dQw4w9WgXcQ" } @get:Rule @@ -123,6 +129,90 @@ class DatabaseMigrationTest { assertNull(secondStreamFromMigratedDatabase.isUploadDateApproximation) } + @Test + fun migrateDatabaseFrom5to6() { + val databaseInV5 = testHelper.createDatabase(AppDatabase.DATABASE_NAME, Migrations.DB_VER_5) + + val localUid1: Long + val localUid2: Long + val remoteUid1: Long + val remoteUid2: Long + databaseInV5.run { + localUid1 = insert( + "playlists", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("name", DEFAULT_NAME + "1") + put("thumbnail_url", DEFAULT_THUMBNAIL) + } + ) + localUid2 = insert( + "playlists", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("name", DEFAULT_NAME + "2") + put("thumbnail_url", DEFAULT_THUMBNAIL) + } + ) + delete( + "playlists", "uid = ?", + Array(1) { localUid1 } + ) + remoteUid1 = insert( + "remote_playlists", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("service_id", DEFAULT_SERVICE_ID) + put("url", DEFAULT_URL) + } + ) + remoteUid2 = insert( + "remote_playlists", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("service_id", DEFAULT_SECOND_SERVICE_ID) + put("url", DEFAULT_SECOND_URL) + } + ) + delete( + "remote_playlists", "uid = ?", + Array(1) { remoteUid2 } + ) + close() + } + + testHelper.runMigrationsAndValidate( + AppDatabase.DATABASE_NAME, Migrations.DB_VER_6, + true, Migrations.MIGRATION_5_6 + ) + + val migratedDatabaseV6 = getMigratedDatabase() + var localListFromDB = migratedDatabaseV6.playlistDAO().all.blockingFirst() + var remoteListFromDB = migratedDatabaseV6.playlistRemoteDAO().all.blockingFirst() + + assertEquals(1, localListFromDB.size) + assertEquals(localUid2, localListFromDB[0].uid) + assertEquals(0, localListFromDB[0].displayIndex) + assertEquals(1, remoteListFromDB.size) + assertEquals(remoteUid1, remoteListFromDB[0].uid) + assertEquals(0, remoteListFromDB[0].displayIndex) + + val localUid3 = migratedDatabaseV6.playlistDAO().insert( + PlaylistEntity(DEFAULT_NAME + "3", DEFAULT_THUMBNAIL, -1) + ) + val remoteUid3 = migratedDatabaseV6.playlistRemoteDAO().insert( + PlaylistRemoteEntity( + DEFAULT_THIRD_SERVICE_ID, DEFAULT_NAME, DEFAULT_THIRD_URL, + DEFAULT_THUMBNAIL, DEFAULT_UPLOADER_NAME, -1, 10 + ) + ) + + localListFromDB = migratedDatabaseV6.playlistDAO().all.blockingFirst() + remoteListFromDB = migratedDatabaseV6.playlistRemoteDAO().all.blockingFirst() + assertEquals(2, localListFromDB.size) + assertEquals(localUid3, localListFromDB[1].uid) + assertEquals(-1, localListFromDB[1].displayIndex) + assertEquals(2, remoteListFromDB.size) + assertEquals(remoteUid3, remoteListFromDB[1].uid) + assertEquals(-1, remoteListFromDB[1].displayIndex) + } + private fun getMigratedDatabase(): AppDatabase { val database: AppDatabase = Room.databaseBuilder( ApplicationProvider.getApplicationContext(), diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index ceeb980c7e0..a797195252c 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -385,7 +385,7 @@ private void checkDisplayIndexModified(@NonNull final List re } } - if (isDisplayIndexModified) { + if (debounceSaver != null && isDisplayIndexModified) { debounceSaver.saveChanges(); } } @@ -588,4 +588,3 @@ private void showDeleteDialog(final String name, final PlaylistLocalItem item) { .show(); } } - diff --git a/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java b/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java new file mode 100644 index 00000000000..e5f717144a8 --- /dev/null +++ b/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java @@ -0,0 +1,105 @@ +package org.schabi.newpipe.database.playlist; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; + +import java.util.ArrayList; +import java.util.List; + +public class PlaylistLocalItemTest { + @Test + public void emptyPlaylists() { + final List localPlaylists = new ArrayList<>(); + final List remotePlaylists = new ArrayList<>(); + final List mergedPlaylists = + PlaylistLocalItem.merge(localPlaylists, remotePlaylists); + + assertEquals(0, mergedPlaylists.size()); + } + + @Test + public void onlyLocalPlaylists() { + final List localPlaylists = new ArrayList<>(); + final List remotePlaylists = new ArrayList<>(); + localPlaylists.add(new PlaylistMetadataEntry(1, "name1", "", 2, 1)); + localPlaylists.add(new PlaylistMetadataEntry(2, "name2", "", 1, 1)); + localPlaylists.add(new PlaylistMetadataEntry(3, "name3", "", 0, 1)); + final List mergedPlaylists = + PlaylistLocalItem.merge(localPlaylists, remotePlaylists); + + assertEquals(3, mergedPlaylists.size()); + assertEquals(0, mergedPlaylists.get(0).getDisplayIndex()); + assertEquals(1, mergedPlaylists.get(1).getDisplayIndex()); + assertEquals(2, mergedPlaylists.get(2).getDisplayIndex()); + } + + @Test + public void onlyRemotePlaylists() { + final List localPlaylists = new ArrayList<>(); + final List remotePlaylists = new ArrayList<>(); + remotePlaylists.add(new PlaylistRemoteEntity( + 1, "name1", "url1", "", "", 2, 1L)); + remotePlaylists.add(new PlaylistRemoteEntity( + 2, "name2", "url2", "", "", 1, 1L)); + remotePlaylists.add(new PlaylistRemoteEntity( + 3, "name3", "url3", "", "", 0, 1L)); + final List mergedPlaylists = + PlaylistLocalItem.merge(localPlaylists, remotePlaylists); + + assertEquals(3, mergedPlaylists.size()); + assertEquals(0, mergedPlaylists.get(0).getDisplayIndex()); + assertEquals(1, mergedPlaylists.get(1).getDisplayIndex()); + assertEquals(2, mergedPlaylists.get(2).getDisplayIndex()); + } + + @Test + public void sameIndexWithDifferentName() { + final List localPlaylists = new ArrayList<>(); + final List remotePlaylists = new ArrayList<>(); + localPlaylists.add(new PlaylistMetadataEntry(1, "name1", "", 0, 1)); + localPlaylists.add(new PlaylistMetadataEntry(2, "name2", "", 1, 1)); + remotePlaylists.add(new PlaylistRemoteEntity( + 1, "name3", "url1", "", "", 0, 1L)); + remotePlaylists.add(new PlaylistRemoteEntity( + 2, "name4", "url2", "", "", 1, 1L)); + final List mergedPlaylists = + PlaylistLocalItem.merge(localPlaylists, remotePlaylists); + + assertEquals(4, mergedPlaylists.size()); + assertTrue(mergedPlaylists.get(0) instanceof PlaylistMetadataEntry); + assertEquals("name1", ((PlaylistMetadataEntry) mergedPlaylists.get(0)).name); + assertTrue(mergedPlaylists.get(1) instanceof PlaylistRemoteEntity); + assertEquals("name3", ((PlaylistRemoteEntity) mergedPlaylists.get(1)).getName()); + assertTrue(mergedPlaylists.get(2) instanceof PlaylistMetadataEntry); + assertEquals("name2", ((PlaylistMetadataEntry) mergedPlaylists.get(2)).name); + assertTrue(mergedPlaylists.get(3) instanceof PlaylistRemoteEntity); + assertEquals("name4", ((PlaylistRemoteEntity) mergedPlaylists.get(3)).getName()); + } + + @Test + public void sameNameWithDifferentIndex() { + final List localPlaylists = new ArrayList<>(); + final List remotePlaylists = new ArrayList<>(); + localPlaylists.add(new PlaylistMetadataEntry(1, "name1", "", 1, 1)); + localPlaylists.add(new PlaylistMetadataEntry(2, "name2", "", 3, 1)); + remotePlaylists.add(new PlaylistRemoteEntity( + 1, "name1", "url1", "", "", 0, 1L)); + remotePlaylists.add(new PlaylistRemoteEntity( + 2, "name2", "url2", "", "", 2, 1L)); + final List mergedPlaylists = + PlaylistLocalItem.merge(localPlaylists, remotePlaylists); + + assertEquals(4, mergedPlaylists.size()); + assertTrue(mergedPlaylists.get(0) instanceof PlaylistRemoteEntity); + assertEquals("name1", ((PlaylistRemoteEntity) mergedPlaylists.get(0)).getName()); + assertTrue(mergedPlaylists.get(1) instanceof PlaylistMetadataEntry); + assertEquals("name1", ((PlaylistMetadataEntry) mergedPlaylists.get(1)).name); + assertTrue(mergedPlaylists.get(2) instanceof PlaylistRemoteEntity); + assertEquals("name2", ((PlaylistRemoteEntity) mergedPlaylists.get(2)).getName()); + assertTrue(mergedPlaylists.get(3) instanceof PlaylistMetadataEntry); + assertEquals("name2", ((PlaylistMetadataEntry) mergedPlaylists.get(3)).name); + } +} From d32490a4be288348a8377c84dbf8c82253240bf6 Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Wed, 11 May 2022 16:47:34 +0800 Subject: [PATCH 012/645] Create sub-package and default interval for DebounceSaver & sort playlists in db --- .../database/playlist/PlaylistLocalItem.java | 6 +----- .../database/playlist/dao/PlaylistRemoteDAO.java | 5 +++++ .../newpipe/local/bookmark/BookmarkFragment.java | 10 +++++----- .../local/playlist/LocalPlaylistFragment.java | 6 +++--- .../local/playlist/RemotePlaylistManager.java | 4 ++++ .../newpipe/settings/SelectPlaylistFragment.java | 4 ++-- .../util/{ => debounce}/DebounceSavable.java | 2 +- .../util/{ => debounce}/DebounceSaver.java | 15 ++++++++++++++- 8 files changed, 35 insertions(+), 17 deletions(-) rename app/src/main/java/org/schabi/newpipe/util/{ => debounce}/DebounceSavable.java (89%) rename app/src/main/java/org/schabi/newpipe/util/{ => debounce}/DebounceSaver.java (81%) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java index 0e7beba4129..8b01a636af5 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java @@ -16,6 +16,7 @@ public interface PlaylistLocalItem extends LocalItem { static List merge( final List localPlaylists, final List remotePlaylists) { + // The playlists from the database must be in the display index order. // Merge localPlaylists and remotePlaylists by display index. // If two items have the same display index, sort them in CASE_INSENSITIVE_ORDER. @@ -25,11 +26,6 @@ static List merge( localPlaylists.size() + remotePlaylists.size()); final List itemsWithSameIndex = new ArrayList<>(); - // The data from database may not be in the display index order - Collections.sort(localPlaylists, - Comparator.comparingLong(PlaylistMetadataEntry::getDisplayIndex)); - Collections.sort(remotePlaylists, - Comparator.comparingLong(PlaylistRemoteEntity::getDisplayIndex)); int i = 0; int j = 0; while (i < localPlaylists.size()) { diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java index ade85746471..8118bc40f16 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.java @@ -11,6 +11,7 @@ import io.reactivex.rxjava3.core.Flowable; +import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_DISPLAY_INDEX; import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_ID; import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_SERVICE_ID; import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_TABLE; @@ -39,6 +40,10 @@ public interface PlaylistRemoteDAO extends BasicDAO { + REMOTE_PLAYLIST_URL + " = :url AND " + REMOTE_PLAYLIST_SERVICE_ID + " = :serviceId") Flowable> getPlaylist(long serviceId, String url); + @Query("SELECT * FROM " + REMOTE_PLAYLIST_TABLE + + " ORDER BY " + REMOTE_PLAYLIST_DISPLAY_INDEX) + Flowable> getDisplayIndexOrderedPlaylists(); + @Query("SELECT " + REMOTE_PLAYLIST_ID + " FROM " + REMOTE_PLAYLIST_TABLE + " WHERE " + REMOTE_PLAYLIST_URL + " = :url " + "AND " + REMOTE_PLAYLIST_SERVICE_ID + " = :serviceId") diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index a797195252c..b0833dd9cc0 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -35,8 +35,8 @@ import org.schabi.newpipe.local.holder.RemoteBookmarkPlaylistItemHolder; import org.schabi.newpipe.local.playlist.LocalPlaylistManager; import org.schabi.newpipe.local.playlist.RemotePlaylistManager; -import org.schabi.newpipe.util.DebounceSavable; -import org.schabi.newpipe.util.DebounceSaver; +import org.schabi.newpipe.util.debounce.DebounceSavable; +import org.schabi.newpipe.util.debounce.DebounceSaver; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; @@ -89,7 +89,7 @@ public void onCreate(final Bundle savedInstanceState) { disposables = new CompositeDisposable(); isLoadingComplete = new AtomicBoolean(); - debounceSaver = new DebounceSaver(10000, this); + debounceSaver = new DebounceSaver(this); displayIndexInDatabase = new HashMap<>(); } @@ -185,8 +185,8 @@ public void startLoading(final boolean forceLoad) { } isLoadingComplete.set(false); - Flowable.combineLatest(localPlaylistManager.getPlaylists(), - remotePlaylistManager.getPlaylists(), PlaylistLocalItem::merge) + Flowable.combineLatest(localPlaylistManager.getDisplayIndexOrderedPlaylists(), + remotePlaylistManager.getDisplayIndexOrderedPlaylists(), PlaylistLocalItem::merge) .onBackpressureLatest() .observeOn(AndroidSchedulers.mainThread()) .subscribe(getPlaylistsSubscriber()); diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index d929c93a55d..1b8302cac51 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -46,8 +46,8 @@ import org.schabi.newpipe.player.MainPlayer.PlayerType; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; -import org.schabi.newpipe.util.DebounceSavable; -import org.schabi.newpipe.util.DebounceSaver; +import org.schabi.newpipe.util.debounce.DebounceSavable; +import org.schabi.newpipe.util.debounce.DebounceSaver; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; @@ -112,7 +112,7 @@ public void onCreate(final Bundle savedInstanceState) { disposables = new CompositeDisposable(); isLoadingComplete = new AtomicBoolean(); - debounceSaver = new DebounceSaver(10000, this); + debounceSaver = new DebounceSaver(this); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java index 1dbd726aef1..45d4ef644ef 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.java @@ -26,6 +26,10 @@ public Flowable> getPlaylists() { return playlistRemoteTable.getAll().subscribeOn(Schedulers.io()); } + public Flowable> getDisplayIndexOrderedPlaylists() { + return playlistRemoteTable.getDisplayIndexOrderedPlaylists().subscribeOn(Schedulers.io()); + } + public Flowable> getPlaylist(final PlaylistInfo info) { return playlistRemoteTable.getPlaylist(info.getServiceId(), info.getUrl()) .subscribeOn(Schedulers.io()); diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java index e8491d52cda..cc47c3f1c7c 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java @@ -90,8 +90,8 @@ private void loadPlaylists() { final LocalPlaylistManager localPlaylistManager = new LocalPlaylistManager(database); final RemotePlaylistManager remotePlaylistManager = new RemotePlaylistManager(database); - disposable = Flowable.combineLatest(localPlaylistManager.getPlaylists(), - remotePlaylistManager.getPlaylists(), PlaylistLocalItem::merge) + disposable = Flowable.combineLatest(localPlaylistManager.getDisplayIndexOrderedPlaylists(), + remotePlaylistManager.getDisplayIndexOrderedPlaylists(), PlaylistLocalItem::merge) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::displayPlaylists, this::onError); } diff --git a/app/src/main/java/org/schabi/newpipe/util/DebounceSavable.java b/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSavable.java similarity index 89% rename from app/src/main/java/org/schabi/newpipe/util/DebounceSavable.java rename to app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSavable.java index 189dce9c64e..acc515dd670 100644 --- a/app/src/main/java/org/schabi/newpipe/util/DebounceSavable.java +++ b/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSavable.java @@ -1,4 +1,4 @@ -package org.schabi.newpipe.util; +package org.schabi.newpipe.util.debounce; import org.schabi.newpipe.error.ErrorInfo; diff --git a/app/src/main/java/org/schabi/newpipe/util/DebounceSaver.java b/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java similarity index 81% rename from app/src/main/java/org/schabi/newpipe/util/DebounceSaver.java rename to app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java index b17d7a29cc5..367174ab79a 100644 --- a/app/src/main/java/org/schabi/newpipe/util/DebounceSaver.java +++ b/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java @@ -1,4 +1,4 @@ -package org.schabi.newpipe.util; +package org.schabi.newpipe.util.debounce; import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.UserAction; @@ -21,6 +21,9 @@ public class DebounceSaver { // Has the object been modified private final AtomicBoolean isModified; + // Default 10 seconds + private static final long DEFAULT_SAVE_DEBOUNCE_MILLIS = 10000; + /** * Creates a new {@code DebounceSaver}. @@ -36,6 +39,16 @@ public DebounceSaver(final long saveDebounceMillis, final DebounceSavable deboun this.isModified = new AtomicBoolean(); } + /** + * Creates a new {@code DebounceSaver}. Save the object 10 seconds later after the last change + * occurred. + * + * @param debounceSavable The object containing data to be saved. + */ + public DebounceSaver(final DebounceSavable debounceSavable) { + this(DEFAULT_SAVE_DEBOUNCE_MILLIS, debounceSavable); + } + public boolean getIsModified() { return isModified.get(); } From ba394a7ab4d3a0c1ee705565c8543e9160d9ebb5 Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Wed, 11 May 2022 18:08:14 +0800 Subject: [PATCH 013/645] Update test and Javadoc --- .../database/playlist/PlaylistLocalItem.java | 27 ++++++++++-- .../playlist/PlaylistLocalItemTest.java | 41 +++++++++++++++---- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java index 8b01a636af5..352d12d6bdd 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java @@ -13,13 +13,34 @@ public interface PlaylistLocalItem extends LocalItem { long getDisplayIndex(); + /** + * Merge localPlaylists and remotePlaylists by the display index. + * If two items have the same display index, sort them in {@code CASE_INSENSITIVE_ORDER}. + * + * @param localPlaylists local playlists in the display index order + * @param remotePlaylists remote playlists in the display index order + * @return merged playlists + */ static List merge( final List localPlaylists, final List remotePlaylists) { - // The playlists from the database must be in the display index order. - // Merge localPlaylists and remotePlaylists by display index. - // If two items have the same display index, sort them in CASE_INSENSITIVE_ORDER. + for (int i = 1; i < localPlaylists.size(); i++) { + if (localPlaylists.get(i).getDisplayIndex() + < localPlaylists.get(i - 1).getDisplayIndex()) { + throw new IllegalArgumentException( + "localPlaylists is not in the display index order"); + } + } + + for (int i = 1; i < remotePlaylists.size(); i++) { + if (remotePlaylists.get(i).getDisplayIndex() + < remotePlaylists.get(i - 1).getDisplayIndex()) { + throw new IllegalArgumentException( + "remotePlaylists is not in the display index order"); + } + } + // This algorithm is similar to the merge operation in merge sort. final List result = new ArrayList<>( diff --git a/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java b/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java index e5f717144a8..98f6110376f 100644 --- a/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java +++ b/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java @@ -24,16 +24,26 @@ public void emptyPlaylists() { public void onlyLocalPlaylists() { final List localPlaylists = new ArrayList<>(); final List remotePlaylists = new ArrayList<>(); - localPlaylists.add(new PlaylistMetadataEntry(1, "name1", "", 2, 1)); + localPlaylists.add(new PlaylistMetadataEntry(1, "name1", "", 0, 1)); localPlaylists.add(new PlaylistMetadataEntry(2, "name2", "", 1, 1)); - localPlaylists.add(new PlaylistMetadataEntry(3, "name3", "", 0, 1)); + localPlaylists.add(new PlaylistMetadataEntry(3, "name3", "", 3, 1)); final List mergedPlaylists = PlaylistLocalItem.merge(localPlaylists, remotePlaylists); assertEquals(3, mergedPlaylists.size()); assertEquals(0, mergedPlaylists.get(0).getDisplayIndex()); assertEquals(1, mergedPlaylists.get(1).getDisplayIndex()); - assertEquals(2, mergedPlaylists.get(2).getDisplayIndex()); + assertEquals(3, mergedPlaylists.get(2).getDisplayIndex()); + } + + @Test(expected = IllegalArgumentException.class) + public void invalidLocalPlaylists() { + final List localPlaylists = new ArrayList<>(); + final List remotePlaylists = new ArrayList<>(); + localPlaylists.add(new PlaylistMetadataEntry(1, "name1", "", 2, 1)); + localPlaylists.add(new PlaylistMetadataEntry(2, "name2", "", 1, 1)); + localPlaylists.add(new PlaylistMetadataEntry(3, "name3", "", 0, 1)); + PlaylistLocalItem.merge(localPlaylists, remotePlaylists); } @Test @@ -41,18 +51,31 @@ public void onlyRemotePlaylists() { final List localPlaylists = new ArrayList<>(); final List remotePlaylists = new ArrayList<>(); remotePlaylists.add(new PlaylistRemoteEntity( - 1, "name1", "url1", "", "", 2, 1L)); + 1, "name1", "url1", "", "", 1, 1L)); remotePlaylists.add(new PlaylistRemoteEntity( - 2, "name2", "url2", "", "", 1, 1L)); + 2, "name2", "url2", "", "", 2, 1L)); remotePlaylists.add(new PlaylistRemoteEntity( - 3, "name3", "url3", "", "", 0, 1L)); + 3, "name3", "url3", "", "", 4, 1L)); final List mergedPlaylists = PlaylistLocalItem.merge(localPlaylists, remotePlaylists); assertEquals(3, mergedPlaylists.size()); - assertEquals(0, mergedPlaylists.get(0).getDisplayIndex()); - assertEquals(1, mergedPlaylists.get(1).getDisplayIndex()); - assertEquals(2, mergedPlaylists.get(2).getDisplayIndex()); + assertEquals(1, mergedPlaylists.get(0).getDisplayIndex()); + assertEquals(2, mergedPlaylists.get(1).getDisplayIndex()); + assertEquals(4, mergedPlaylists.get(2).getDisplayIndex()); + } + + @Test(expected = IllegalArgumentException.class) + public void invalidRemotePlaylists() { + final List localPlaylists = new ArrayList<>(); + final List remotePlaylists = new ArrayList<>(); + remotePlaylists.add(new PlaylistRemoteEntity( + 1, "name1", "url1", "", "", 1, 1L)); + remotePlaylists.add(new PlaylistRemoteEntity( + 2, "name2", "url2", "", "", 3, 1L)); + remotePlaylists.add(new PlaylistRemoteEntity( + 3, "name3", "url3", "", "", 0, 1L)); + PlaylistLocalItem.merge(localPlaylists, remotePlaylists); } @Test From 9ecef6f01103fc3aa0c719dd7abea4169d06c7d6 Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Thu, 23 Jun 2022 19:20:16 +0800 Subject: [PATCH 014/645] Add abstract methods in PlaylistLocalItem & rename setIsModified --- .../database/playlist/PlaylistLocalItem.java | 4 ++++ .../playlist/PlaylistMetadataEntry.java | 14 +++++++++-- .../playlist/model/PlaylistEntity.java | 4 ++-- .../playlist/model/PlaylistRemoteEntity.java | 2 ++ .../local/bookmark/BookmarkFragment.java | 23 +++++++++---------- .../local/dialog/PlaylistAppendDialog.java | 4 ++-- .../local/playlist/LocalPlaylistFragment.java | 4 ++-- .../settings/SelectPlaylistFragment.java | 2 +- .../newpipe/util/debounce/DebounceSaver.java | 4 ++-- 9 files changed, 38 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java index 352d12d6bdd..3d58d3f7c21 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java @@ -13,6 +13,10 @@ public interface PlaylistLocalItem extends LocalItem { long getDisplayIndex(); + long getUid(); + + void setDisplayIndex(long displayIndex); + /** * Merge localPlaylists and remotePlaylists by the display index. * If two items have the same display index, sort them in {@code CASE_INSENSITIVE_ORDER}. diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java index ff80049a30a..f1ead0fa40d 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.java @@ -11,13 +11,13 @@ public class PlaylistMetadataEntry implements PlaylistLocalItem { public static final String PLAYLIST_STREAM_COUNT = "streamCount"; @ColumnInfo(name = PLAYLIST_ID) - public final long uid; + private final long uid; @ColumnInfo(name = PLAYLIST_NAME) public final String name; @ColumnInfo(name = PLAYLIST_THUMBNAIL_URL) public final String thumbnailUrl; @ColumnInfo(name = PLAYLIST_DISPLAY_INDEX) - public long displayIndex; + private long displayIndex; @ColumnInfo(name = PLAYLIST_STREAM_COUNT) public final long streamCount; @@ -44,4 +44,14 @@ public String getOrderingName() { public long getDisplayIndex() { return displayIndex; } + + @Override + public long getUid() { + return uid; + } + + @Override + public void setDisplayIndex(final long displayIndex) { + this.displayIndex = displayIndex; + } } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java index 272e8a5bcdd..508b555085a 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java @@ -41,10 +41,10 @@ public PlaylistEntity(final String name, final String thumbnailUrl, final long d @Ignore public PlaylistEntity(final PlaylistMetadataEntry item) { - this.uid = item.uid; + this.uid = item.getUid(); this.name = item.name; this.thumbnailUrl = item.thumbnailUrl; - this.displayIndex = item.displayIndex; + this.displayIndex = item.getDisplayIndex(); } public long getUid() { diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java index adea2738bda..82baed82ca8 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java @@ -105,6 +105,7 @@ && getStreamCount() == info.getStreamCount() && TextUtils.equals(getUploader(), info.getUploaderName()); } + @Override public long getUid() { return uid; } @@ -158,6 +159,7 @@ public long getDisplayIndex() { return displayIndex; } + @Override public void setDisplayIndex(final long displayIndex) { this.displayIndex = displayIndex; } diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index b0833dd9cc0..e9cf8323918 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -139,7 +139,7 @@ public void selected(final LocalItem selectedItem) { if (selectedItem instanceof PlaylistMetadataEntry) { final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem); - NavigationHelper.openLocalPlaylistFragment(fragmentManager, entry.uid, + NavigationHelper.openLocalPlaylistFragment(fragmentManager, entry.getUid(), entry.name); } else if (selectedItem instanceof PlaylistRemoteEntity) { @@ -181,7 +181,7 @@ public void startLoading(final boolean forceLoad) { if (debounceSaver != null) { disposables.add(debounceSaver.getDebouncedSaver()); - debounceSaver.setIsModified(false); + debounceSaver.setNoChangesToSave(); } isLoadingComplete.set(false); @@ -371,16 +371,15 @@ private void checkDisplayIndexModified(@NonNull final List re // Save the index read from the database. if (item instanceof PlaylistMetadataEntry) { - displayIndexInDatabase.put(new Pair<>(((PlaylistMetadataEntry) item).uid, + displayIndexInDatabase.put(new Pair<>(item.getUid(), LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM), item.getDisplayIndex()); - ((PlaylistMetadataEntry) item).displayIndex = i; + item.setDisplayIndex(i); } else if (item instanceof PlaylistRemoteEntity) { - displayIndexInDatabase.put(new Pair<>(((PlaylistRemoteEntity) item).getUid(), - LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM), - item.getDisplayIndex()); - ((PlaylistRemoteEntity) item).setDisplayIndex(i); + displayIndexInDatabase.put(new Pair<>(item.getUid(), + LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM), item.getDisplayIndex()); + item.setDisplayIndex(i); } } @@ -415,9 +414,9 @@ public void saveImmediate() { final LocalItem item = items.get(i); if (item instanceof PlaylistMetadataEntry) { - ((PlaylistMetadataEntry) item).displayIndex = i; + ((PlaylistMetadataEntry) item).setDisplayIndex(i); - final Long uid = ((PlaylistMetadataEntry) item).uid; + final Long uid = ((PlaylistMetadataEntry) item).getUid(); final Pair key = new Pair<>(uid, LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM); final Long databaseIndex = displayIndexInDatabase.remove(key); @@ -463,7 +462,7 @@ public void saveImmediate() { .observeOn(AndroidSchedulers.mainThread()) .subscribe(() -> { if (debounceSaver != null) { - debounceSaver.setIsModified(false); + debounceSaver.setNoChangesToSave(); } }, throwable -> showError(new ErrorInfo(throwable, @@ -563,7 +562,7 @@ private void showLocalDialog(final PlaylistMetadataEntry selectedItem) { builder.setView(dialogBinding.getRoot()) .setPositiveButton(R.string.rename_playlist, (dialog, which) -> changeLocalPlaylistName( - selectedItem.uid, + selectedItem.getUid(), dialogBinding.dialogEditText.getText().toString())) .setNegativeButton(R.string.cancel, null) .setNeutralButton(R.string.delete, (dialog, which) -> { diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index 58a10af220d..a778e6578eb 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -147,12 +147,12 @@ private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager, if (playlist.thumbnailUrl.equals("drawable://" + R.drawable.dummy_thumbnail_playlist)) { playlistDisposables.add(manager - .changePlaylistThumbnail(playlist.uid, streams.get(0).getThumbnailUrl()) + .changePlaylistThumbnail(playlist.getUid(), streams.get(0).getThumbnailUrl()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(ignored -> successToast.show())); } - playlistDisposables.add(manager.appendToPlaylist(playlist.uid, streams) + playlistDisposables.add(manager.appendToPlaylist(playlist.getUid(), streams) .observeOn(AndroidSchedulers.mainThread()) .subscribe(ignored -> successToast.show())); diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 1b8302cac51..d129e658e53 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -221,7 +221,7 @@ public void startLoading(final boolean forceLoad) { if (debounceSaver != null) { disposables.add(debounceSaver.getDebouncedSaver()); - debounceSaver.setIsModified(false); + debounceSaver.setNoChangesToSave(); } isLoadingComplete.set(false); @@ -644,7 +644,7 @@ public void saveImmediate() { .subscribe( () -> { if (debounceSaver != null) { - debounceSaver.setIsModified(false); + debounceSaver.setNoChangesToSave(); } }, throwable -> showError(new ErrorInfo(throwable, diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java index cc47c3f1c7c..905a44fd11f 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java @@ -118,7 +118,7 @@ private void clickedItem(final int position) { if (selectedItem instanceof PlaylistMetadataEntry) { final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem); - onSelectedListener.onLocalPlaylistSelected(entry.uid, entry.name); + onSelectedListener.onLocalPlaylistSelected(entry.getUid(), entry.name); } else if (selectedItem instanceof PlaylistRemoteEntity) { final PlaylistRemoteEntity entry = ((PlaylistRemoteEntity) selectedItem); diff --git a/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java b/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java index 367174ab79a..911e978ff47 100644 --- a/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java +++ b/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java @@ -53,8 +53,8 @@ public boolean getIsModified() { return isModified.get(); } - public void setIsModified(final boolean isModified) { - this.isModified.set(isModified); + public void setNoChangesToSave() { + isModified.set(false); } public PublishSubject getDebouncedSaveSignal() { From 4e401bc059ae1ede7f452fcfc68dd6d8c8987500 Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Thu, 23 Jun 2022 20:36:21 +0800 Subject: [PATCH 015/645] Update playlists in parallel --- .../local/bookmark/BookmarkFragment.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index e9cf8323918..9b93cc3e6c9 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -454,21 +454,16 @@ public void saveImmediate() { // 1. Update local playlists // 2. Update remote playlists - // 3. Set isModified false + // 3. Set NoChangesToSave disposables.add(localPlaylistManager.updatePlaylists(localItemsUpdate, localItemsDeleteUid) + .mergeWith(remotePlaylistManager.updatePlaylists( + remoteItemsUpdate, remoteItemsDeleteUid)) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(() -> disposables.add(remotePlaylistManager.updatePlaylists( - remoteItemsUpdate, remoteItemsDeleteUid) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(() -> { - if (debounceSaver != null) { - debounceSaver.setNoChangesToSave(); - } - }, - throwable -> showError(new ErrorInfo(throwable, - UserAction.REQUESTED_BOOKMARK, - "Saving playlist")) - )), + .subscribe(() -> { + if (debounceSaver != null) { + debounceSaver.setNoChangesToSave(); + } + }, throwable -> showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK, "Saving playlist")) )); From 898a936064f19830779b0bf22f7c75b4bd4dd4df Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Thu, 23 Jun 2022 23:19:59 +0800 Subject: [PATCH 016/645] Update index modification logic & redo sorting in the merge algorithm --- .../database/playlist/PlaylistLocalItem.java | 23 ++--- .../local/bookmark/BookmarkFragment.java | 86 +++++++------------ .../local/playlist/LocalPlaylistFragment.java | 6 +- .../newpipe/util/debounce/DebounceSaver.java | 2 +- .../playlist/PlaylistLocalItemTest.java | 23 ----- 5 files changed, 39 insertions(+), 101 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java index 3d58d3f7c21..4314b0f82f0 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.java @@ -21,29 +21,18 @@ public interface PlaylistLocalItem extends LocalItem { * Merge localPlaylists and remotePlaylists by the display index. * If two items have the same display index, sort them in {@code CASE_INSENSITIVE_ORDER}. * - * @param localPlaylists local playlists in the display index order - * @param remotePlaylists remote playlists in the display index order + * @param localPlaylists local playlists + * @param remotePlaylists remote playlists * @return merged playlists */ static List merge( final List localPlaylists, final List remotePlaylists) { - for (int i = 1; i < localPlaylists.size(); i++) { - if (localPlaylists.get(i).getDisplayIndex() - < localPlaylists.get(i - 1).getDisplayIndex()) { - throw new IllegalArgumentException( - "localPlaylists is not in the display index order"); - } - } - - for (int i = 1; i < remotePlaylists.size(); i++) { - if (remotePlaylists.get(i).getDisplayIndex() - < remotePlaylists.get(i - 1).getDisplayIndex()) { - throw new IllegalArgumentException( - "remotePlaylists is not in the display index order"); - } - } + Collections.sort(localPlaylists, + Comparator.comparingLong(PlaylistMetadataEntry::getDisplayIndex)); + Collections.sort(remotePlaylists, + Comparator.comparingLong(PlaylistRemoteEntity::getDisplayIndex)); // This algorithm is similar to the merge operation in merge sort. diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index 9b93cc3e6c9..200fde56206 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -41,9 +41,7 @@ import org.schabi.newpipe.util.OnClickGesture; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import icepick.State; @@ -70,8 +68,7 @@ public final class BookmarkFragment extends BaseLocalListFragment, Long> displayIndexInDatabase; + private List> deletedItems; /////////////////////////////////////////////////////////////////////////// // Fragment LifeCycle - Creation @@ -89,9 +86,9 @@ public void onCreate(final Bundle savedInstanceState) { disposables = new CompositeDisposable(); isLoadingComplete = new AtomicBoolean(); - debounceSaver = new DebounceSaver(this); + debounceSaver = new DebounceSaver(3000, this); - displayIndexInDatabase = new HashMap<>(); + deletedItems = new ArrayList<>(); } @Nullable @@ -186,7 +183,8 @@ public void startLoading(final boolean forceLoad) { isLoadingComplete.set(false); Flowable.combineLatest(localPlaylistManager.getDisplayIndexOrderedPlaylists(), - remotePlaylistManager.getDisplayIndexOrderedPlaylists(), PlaylistLocalItem::merge) + remotePlaylistManager.getDisplayIndexOrderedPlaylists(), + PlaylistLocalItem::merge) .onBackpressureLatest() .observeOn(AndroidSchedulers.mainThread()) .subscribe(getPlaylistsSubscriber()); @@ -237,7 +235,7 @@ public void onDestroy() { itemsListState = null; isLoadingComplete = null; - displayIndexInDatabase = null; + deletedItems = null; } /////////////////////////////////////////////////////////////////////////// @@ -343,7 +341,15 @@ private void deleteItem(final PlaylistLocalItem item) { } itemListAdapter.removeItem(item); - debounceSaver.saveChanges(); + if (item instanceof PlaylistMetadataEntry) { + deletedItems.add(new Pair<>(item.getUid(), + LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM)); + } else if (item instanceof PlaylistRemoteEntity) { + deletedItems.add(new Pair<>(item.getUid(), + LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM)); + } + + debounceSaver.setHasChangesToSave(); } private void checkDisplayIndexModified(@NonNull final List result) { @@ -351,9 +357,7 @@ private void checkDisplayIndexModified(@NonNull final List re return; } - displayIndexInDatabase.clear(); - - // If the display index does not match actual index in the list, update the display index. + // Check if the display index does not match the actual index in the list. // This may happen when a new list is created // or on the first run after database migration // or display index is not continuous for some reason @@ -363,29 +367,12 @@ private void checkDisplayIndexModified(@NonNull final List re final PlaylistLocalItem item = result.get(i); if (item.getDisplayIndex() != i) { isDisplayIndexModified = true; - } - - // Updating display index in the item does not affect the value inserts into - // database, which will be recalculated during the database update. Updating - // display index in the item here is to determine whether it is recently modified. - // Save the index read from the database. - if (item instanceof PlaylistMetadataEntry) { - - displayIndexInDatabase.put(new Pair<>(item.getUid(), - LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM), item.getDisplayIndex()); - item.setDisplayIndex(i); - - } else if (item instanceof PlaylistRemoteEntity) { - - displayIndexInDatabase.put(new Pair<>(item.getUid(), - LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM), item.getDisplayIndex()); - item.setDisplayIndex(i); - + break; } } if (debounceSaver != null && isDisplayIndexModified) { - debounceSaver.saveChanges(); + debounceSaver.setHasChangesToSave(); } } @@ -414,43 +401,28 @@ public void saveImmediate() { final LocalItem item = items.get(i); if (item instanceof PlaylistMetadataEntry) { - ((PlaylistMetadataEntry) item).setDisplayIndex(i); - - final Long uid = ((PlaylistMetadataEntry) item).getUid(); - final Pair key = new Pair<>(uid, - LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM); - final Long databaseIndex = displayIndexInDatabase.remove(key); - - // The database index should not be null because inserting new item into database - // is not handled here. NullPointerException has occurred once, but I can't - // reproduce it. Enhance robustness here. - if (databaseIndex != null && databaseIndex != i) { + if (((PlaylistMetadataEntry) item).getDisplayIndex() != i) { + ((PlaylistMetadataEntry) item).setDisplayIndex(i); localItemsUpdate.add((PlaylistMetadataEntry) item); } } else if (item instanceof PlaylistRemoteEntity) { - ((PlaylistRemoteEntity) item).setDisplayIndex(i); - - final Long uid = ((PlaylistRemoteEntity) item).getUid(); - final Pair key = new Pair<>(uid, - LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM); - final Long databaseIndex = displayIndexInDatabase.remove(key); - - if (databaseIndex != null && databaseIndex != i) { + if (((PlaylistRemoteEntity) item).getDisplayIndex() != i) { + ((PlaylistRemoteEntity) item).setDisplayIndex(i); remoteItemsUpdate.add((PlaylistRemoteEntity) item); } } } // Find deleted items - for (final Pair key : displayIndexInDatabase.keySet()) { - if (key.second.equals(LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM)) { - localItemsDeleteUid.add(key.first); - } else if (key.second.equals(LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM)) { - remoteItemsDeleteUid.add(key.first); + for (final Pair item : deletedItems) { + if (item.second.equals(LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM)) { + localItemsDeleteUid.add(item.first); + } else if (item.second.equals(LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM)) { + remoteItemsDeleteUid.add(item.first); } } - displayIndexInDatabase.clear(); + deletedItems.clear(); // 1. Update local playlists // 2. Update remote playlists @@ -515,7 +487,7 @@ public boolean onMove(@NonNull final RecyclerView recyclerView, final int targetIndex = target.getBindingAdapterPosition(); final boolean isSwapped = itemListAdapter.swapItems(sourceIndex, targetIndex); if (isSwapped) { - debounceSaver.saveChanges(); + debounceSaver.setHasChangesToSave(); } return isSwapped; } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index d129e658e53..10e5aea15cc 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -441,7 +441,7 @@ public void removeWatchedStreams(final boolean removePartiallyWatched) { itemListAdapter.clearStreamItemList(); itemListAdapter.addItems(notWatchedItems); - debounceSaver.saveChanges(); + debounceSaver.setHasChangesToSave(); if (thumbnailVideoRemoved) { @@ -609,7 +609,7 @@ private void deleteItem(final PlaylistStreamEntry item) { } setVideoCount(itemListAdapter.getItemsList().size()); - debounceSaver.saveChanges(); + debounceSaver.setHasChangesToSave(); } @Override @@ -687,7 +687,7 @@ public boolean onMove(@NonNull final RecyclerView recyclerView, final int targetIndex = target.getBindingAdapterPosition(); final boolean isSwapped = itemListAdapter.swapItems(sourceIndex, targetIndex); if (isSwapped) { - debounceSaver.saveChanges(); + debounceSaver.setHasChangesToSave(); } return isSwapped; } diff --git a/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java b/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java index 911e978ff47..5bd5cdd55f4 100644 --- a/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java +++ b/app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java @@ -70,7 +70,7 @@ public Disposable getDebouncedSaver() { UserAction.SOMETHING_ELSE, "Debounced saver"))); } - public void saveChanges() { + public void setHasChangesToSave() { if (isModified == null || debouncedSaveSignal == null) { return; } diff --git a/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java b/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java index 98f6110376f..ab6315d9170 100644 --- a/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java +++ b/app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.java @@ -36,16 +36,6 @@ public void onlyLocalPlaylists() { assertEquals(3, mergedPlaylists.get(2).getDisplayIndex()); } - @Test(expected = IllegalArgumentException.class) - public void invalidLocalPlaylists() { - final List localPlaylists = new ArrayList<>(); - final List remotePlaylists = new ArrayList<>(); - localPlaylists.add(new PlaylistMetadataEntry(1, "name1", "", 2, 1)); - localPlaylists.add(new PlaylistMetadataEntry(2, "name2", "", 1, 1)); - localPlaylists.add(new PlaylistMetadataEntry(3, "name3", "", 0, 1)); - PlaylistLocalItem.merge(localPlaylists, remotePlaylists); - } - @Test public void onlyRemotePlaylists() { final List localPlaylists = new ArrayList<>(); @@ -65,19 +55,6 @@ public void onlyRemotePlaylists() { assertEquals(4, mergedPlaylists.get(2).getDisplayIndex()); } - @Test(expected = IllegalArgumentException.class) - public void invalidRemotePlaylists() { - final List localPlaylists = new ArrayList<>(); - final List remotePlaylists = new ArrayList<>(); - remotePlaylists.add(new PlaylistRemoteEntity( - 1, "name1", "url1", "", "", 1, 1L)); - remotePlaylists.add(new PlaylistRemoteEntity( - 2, "name2", "url2", "", "", 3, 1L)); - remotePlaylists.add(new PlaylistRemoteEntity( - 3, "name3", "url3", "", "", 0, 1L)); - PlaylistLocalItem.merge(localPlaylists, remotePlaylists); - } - @Test public void sameIndexWithDifferentName() { final List localPlaylists = new ArrayList<>(); From 8ad7bf60d7ed3bcde5bda0d601ae5d920c042eb3 Mon Sep 17 00:00:00 2001 From: GGAutomaton <32899400+GGAutomaton@users.noreply.github.com> Date: Thu, 23 Jun 2022 23:31:56 +0800 Subject: [PATCH 017/645] Delete saveImmediate warnings & add comments --- .../org/schabi/newpipe/local/bookmark/BookmarkFragment.java | 3 +-- .../schabi/newpipe/local/playlist/LocalPlaylistFragment.java | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index 200fde56206..4be4838ec3c 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -66,6 +66,7 @@ public final class BookmarkFragment extends BaseLocalListFragment> deletedItems; @@ -385,8 +386,6 @@ public void saveImmediate() { // List must be loaded and modified in order to save if (isLoadingComplete == null || debounceSaver == null || !isLoadingComplete.get() || !debounceSaver.getIsModified()) { - Log.w(TAG, "Attempting to save playlists in bookmark when bookmark " - + "is not loaded or playlists not modified"); return; } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 10e5aea15cc..5ec51166030 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -621,8 +621,6 @@ public void saveImmediate() { // List must be loaded and modified in order to save if (isLoadingComplete == null || debounceSaver == null || !isLoadingComplete.get() || !debounceSaver.getIsModified()) { - Log.w(TAG, "Attempting to save playlist when local playlist " - + "is not loaded or not modified: playlist id=[" + playlistId + "]"); return; } From 16b0df69b15b68f03262662f0c036402c77022bf Mon Sep 17 00:00:00 2001 From: seojun0924 <106897282+seojun0924@users.noreply.github.com> Date: Sat, 19 Nov 2022 01:03:18 +0900 Subject: [PATCH 018/645] Update README.ko.md Updated Korean README with latest version of README --- doc/README.ko.md | 125 +++++++++++++++++++++++------------------------ 1 file changed, 62 insertions(+), 63 deletions(-) diff --git a/doc/README.ko.md b/doc/README.ko.md index 9703e6a4897..c2ede041562 100644 --- a/doc/README.ko.md +++ b/doc/README.ko.md @@ -19,11 +19,11 @@ *Read this in other languages: [English](../README.md), [Español](README.es.md), [हिन्दी](README.hi.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md).* -경고: 이 버전은 베타 버전이므로, 버그가 발생할 수도 있습니다. 만약 버그가 발생하였다면, 우리의 GITHUB 저장소에서 ISSUE를 열람하여 주십시오. +경고: 이 버전은 베타 버전이므로, 버그가 발생할 수도 있습니다. 만약 버그가 발생하였다면, 우리의 GitHub 저장소에서 Issue를 열람하여 주십시오. -NEWPIPE 또는 이것의 FORK을 구글 플레이스토어에 올리는 것은 그들의 이용약관을 위반합니다. +NewPipe 또는 NewPipe 포크를 구글 플레이스토어에 올리는 것은 그들의 이용약관을 위반합니다. -## Screenshots +## 스크린샷 [](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png) [](../fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png) @@ -38,81 +38,80 @@ [](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png) [](../fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) -## Description - -NewPipe는 어떤 구글 프레임워크 라이브러리나, 유튜브 API를 사용하지 않습니다. 웹사이트는 단지 필요한 정보를 가져오기 위해 구문 분석 됩니다. 따라서 이 앱은 구글 서비스의 설치 없이 기기에서 사용될 수 있습니다. 또한, 카피레프트 자유 소프트웨어인 NewPipe를 사용하기 위해 유튜브 계정이 필요하지 않습니다. - -### Features - -* 영상 검색 -* 영상의 일반적인 정보 표시 -* 유튜브 영상 보기 -* 유튜브 영상 듣기 -* 팝업 모드 (floating player) -* 영상 공유 -* 영상 다운로드 -* 음성만 다운로드 -* Kodi에서 영상 열람 -* 다음/관련된 영상 표시 -* 특정 언어로 유튜브 검색 -* 연령 제한 컨텐츠 시청/차단 -* 채널에 대한 일반적인 정보 표시 -* 채널 검색 -* 채널에서 영상 시청 -* Orbot/Tor 지원 (아직 직접적이지 않음) -* 1080p/2K/4K 지원 -* 기록 보기 -* 채널 구독 -* 기록 검색 -* 재생목록 검색/시청 -* 추가된 재생목록 시청 -* 영상 추가 -* 지역 재생목록 -* 자막 -* 실시간 방송 지원 -* 댓글 표시 - -### Supported Services - -NewPipe는 여러가지 서비스를 지원합니다. 우리의 [문서](https://teamnewpipe.github.io/documentation/)는 새로운 서비스가 앱과 추출기에 어떻게 추가될 수 있는지에 대한 더 많은 정보를 제공합니다. 만약 새로운 서비스를 추가하고자 한다면, 우리에게 연락해 주시기 바랍니다. 현재 지원되는 서비스: - -* YouTube -* SoundCloud \[beta\] -* media.ccc.de \[beta\] -* PeerTube instances \[beta\] -* Bandcamp \[beta\] - -## Updates -NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로 인해), 결국 릴리즈가 발생할 것입니다. 이것들의 형식은 x.xx.x 입니다. -이 새로운 버전을 얻기 위해서, 당신은: - 1. 직접 디버그 APK를 생성할 수 있습니다. 이 방법은 당신의 기기에서 새로운 기능을 얻을 수 있는 가장 빠른 방법이지만, 꽤 많이 복잡합니다. - 따라서 우리는 다른 방법들 중 하나를 사용하는 것을 추천합니다. - 2. 우리의 커스텀 저장소를 F-Droid에 추가하고 우리가 릴리즈를 게시하는 대로 저곳에서 릴리즈를 설치할 수 있습니다. - 이에 대한 설명서는 이곳에서 확인할 수 있습니다: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ - 3. 우리가 릴리즈를 게시하는 대로 [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases)에서 APK를 다운받고 이것을 설치할 수 있습니다. - 4. F-Droid를 통해 업데이트 할 수 있습니다. F-Droid는 변화를 인식하고, 스스로 APK를 생성하고, 이것에 서명하고, 사용자들에서 업데이트를 전달해야만 하기 때문에, +### 지원되는 서비스 + +NewPipe는 현재 이 서비스들을 지원합니다: + +* YouTube ([웹사이트](https://www.youtube.com/)) 와 YouTube Music ([웹사이트](https://music.youtube.com/)) ([위키](https://en.wikipedia.org/wiki/YouTube)) +* PeerTube ([웹사이트](https://joinpeertube.org/)) 와 모든 인스턴스 (인스턴스가 무엇인지 아려면 웹사이트를 참조하세요.) ([위키](https://en.wikipedia.org/wiki/PeerTube)) +* Bandcamp ([웹사이트](https://bandcamp.com/)) ([위키](https://en.wikipedia.org/wiki/Bandcamp)) +* SoundCloud ([웹사이트](https://soundcloud.com/)) ([위키](https://en.wikipedia.org/wiki/SoundCloud)) +* media.ccc.de ([웹사이트](https://media.ccc.de/)) ([위키](https://en.wikipedia.org/wiki/Chaos_Computer_Club)) + +NewPipe는 여러 영상·오디오 서비스를 지원합니다. YouTube부터 시작해서, 다른 사람들이 몇 년간 여러 서비스들을 추가해주어 NewPipe의 기능을 풍부하게 해 주었습니다. + +현재 상황과, YouTube의 인기로 인해 현재 서비스 중에서 YouTube가 가장 잘 지원됩니다. 다른 서비스를 사용하시거나, 잘 알고 계시다면 지원을 개선할 수 있도록 도와주세요! SoundCloud와 PeerTube의 관리자를 찾고 있습니다. + +새로운 서비스를 추가하고 싶으시다면, 먼저 저희에게 연락해 주세요! 저희의 [문서](https://teamnewpipe.github.io/documentation/)가 앱과 [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor)에 서비스를 추가하는 법에 대한 정보를 제공합니다. + +## 설명 + +NewPipe는 서비스의 공식 API를 이용하여 정보를 받아오는 방식으로 작동합니다. 공식 API가 저희의 목적을 제한하는 경우 (예: YouTube), 또는 독점적인 경우 NewPipe는 웹사이트의 구문을 분석하거나 내부 API를 사용합니다. 즉, NewPipe를 사용할 때 계정은 필요하지 않습니다. + +### 기능 + +* 최대 4K 화질로 영상 보기 +* 백그라운드에서 노래 듣기 (노래 데이터만을 가져오므로 데이터 절약) +* 팝업 모드 (floating player, 또는 Picture-in-Picture) +* 실시간 영상 보기 +* 부제/자막 표시/숨기기 +* 영상과 오디오 검색하기 (YouTube에서는 콘텐츠 언어를 지정할 수 있습니다) +* 영상 대기열 추가 (로컬 플레이리스트에 추가 가능) +* 영상에 대한 기본 정보 표시/숨기기 (설명이나 태그 등) +* 다음/관련 영상 표시/숨기기 +* 댓글 표시/숨기기 +* 영상, 오디오, 채널, 플레이리스트, 앨범 검색하기 +* 채널 내부에서 영상, 오디오 찾기 +* 채널 구독하기 (계정에 로그인 불필요!) +* 구독한 채널의 영상 알림 받기 +* 채널 그룹 생성, 수정 (쉬운 탐색과 관리를 위해) +* 채널 그룹에서 생성된 영상 피드 탐색 +* 시청 기록 보기, 검색 +* 플레이리스트 검색, 시청 (서비스에서 원격으로 받아옴) +* 로컬 플레이리스트 만들기/수정 (다른 서비스에서 할 필요 없이 NewPipe 내부에 저장) +* 영상/오디오/자막 다운로드 +* Kodi에서 열기 +* 나이 제한 영상 시청/차단 + +## 설치 및 업데이트 +당신은 NewPipe를 설치하기 위해 이 방법 중 하나를 사용할 수 있습니다: + 1. 우리의 커스텀 저장소를 F-Droid에 추가하고 우리가 릴리즈를 게시하는 대로 F-Droid에서 릴리즈를 설치할 수 있습니다. 지침은 여기 있습니다: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ + 2. 우리가 릴리즈를 게시하는 대로 [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases)에서 APK를 받고 이것을 설치할 수 있습니다. + 3. F-Droid를 통해 업데이트 할 수 있습니다. F-Droid는 변화를 인식하고, 스스로 APK를 생성하고, 이것에 서명하고, 사용자들에서 업데이트를 전달해야만 하기 때문에, 이것은 업데이트를 받는 가장 느린 방법입니다. + 4. 스스로 디버그 APK 빌드하기. 이것은 새 기능을 기기에 추가하는 가장 빠른 방법이지만, 매우 복잡하므로, 다른 방법 중 하나를 사용하는 것을 권장합니다. + 5. 이 저장소의 PR에 제공된 기능 또는 버그 픽스에 관심이 있다면, PR의 APK를 받을 수 있습니다. 지침을 위해선 PR 설명을 따르십시오. PR APK는 공식 APK와 같이 설치되기 때문에, 데이터를 잃거나 무언가 잘못될 걱정을 하지 않으도 됩니다. -우리는 대부분의 사용자에게 2번쨰 방법을 추천합니다. 방법 2 또는 3을 사용하여 설치된 APK는 서로 호환되지만, 방법 4를 사용하여 설치된 것들과는 호환되지 않습니다. 이것은 방법 2 또는 3에서는 같은 (우리의)서명 키가 사용되지만, 방법 4에서는 다른 (F-Droid의)서명 키가 사용되기 때문입니다. 방법 1을 사용하여 디버그 APK를 생성하는 것에서는 키가 완전히 제외됩니다. 서명 키는 사용자가 앱에 악의적인 업데이트를 설치하는 것에 대해 속지 않도록 보장하는 것을 도와줍니다. +우리는 대부분의 사용자에게 1번째 방법을 추천합니다. 방법 1 또는 2를 사용하여 설치된 APK는 서로 호환되지만 (NewPipe를 방법 1로 설치한 후 방법 2로 업데이트할 수 있음을 의미합니다), 방법 3을 사용하여 설치된 것들과는 호환되지 않습니다. 이것은 방법 1 또는 2에서는 같은 (우리의)서명 키가 사용되지만, 방법 3에서는 다른 (F-Droid의)서명 키가 사용되기 때문입니다. 방법 4를 사용하여 디버그 APK를 생성하는 것에서는 키가 완전히 제외됩니다. 서명 키는 사용자가 앱에 악의적인 업데이트를 설치하는 것에 대해 속지 않도록 보장하는 것을 도와줍니다. -한편, 만약 어떠한 이유(예. NewPipe의 핵심 기능이 손상되었고 F-Droid가 아직 업데이트를 가지지 않는 경우) 때문에 소스를 바꾸길 원한다면, +한편, 만약 어떠한 이유(예. NewPipe의 핵심 기능이 손상되었고 F-Droid에 아직 업데이트가 없는 경우) 때문에 소스를 바꾸길 원한다면, 우리는 다음과 같은 절차를 따르는 것을 권장합니다: 1. 당신의 기록, 구독, 그리고 재생목록을 유지할 수 있도록 Settings > Content > Export Database 를 통해 데이터를 백업하십시오. 2. NewPipe를 삭제하십시오. 3. 새로운 소스에서 APK를 다운로드하고 이것을 설치하십시오. 4. Step 1의 Settings > Content > Import Database 을 통해 데이터를 불러오십시오. -## Contribution +## 기여 당신이 아이디어, 번역, 디자인 변경, 코드 정리, 또는 정말 큰 코드 수정에 대한 의견이 있다면, 도움은 항상 환영합니다. 더 많이 수행될수록 더 많이 발전할 수 있습니다! -만약 참여하고 싶다면, 우리의 [컨트리뷰션 공지](../.github/CONTRIBUTING.md)를 참고하십시오. +만약 참여하고 싶다면, 우리의 [기여 공지](../.github/CONTRIBUTING.md)를 참고하십시오. Translation status -## Donate +## 기부 만약 NewPipe가 마음에 들었다면, 우리는 기부에 대해 기꺼이 환영합니다. bitcoin을 보내거나, Bountysource 또는 Liberapay를 통해 기부할 수 있습니다. NewPipe에 기부하는 것에 대한 자세한 정보를 원한다면, 우리의 [웹사이트](https://newpipe.net/donate)를 방문하여 주십시오. @@ -133,12 +132,12 @@ NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로
-## Privacy Policy +## 개인정보 보호 정책 NewPipe 프로젝트는 미디어 웹 서비스를 사용하는 것에 대한 사적의, 익명의 경험을 제공하는 것을 목표로 하고 있습니다. 그러므로, 앱은 당신의 동의 없이 어떤 데이터도 수집하지 않습니다. NewPipe의 개인정보보호정책은 당신이 충돌 리포트를 보내거나, 또는 우리의 블로그에 글을 남길 때 어떤 데이터가 보내지고 저장되는지에 대해 상세히 설명합니다. 이 문서는 [여기](https://newpipe.net/legal/privacy/)에서 확인할 수 있습니다. -## License +## 라이선스 [![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html) NewPipe는 자유 소프트웨어입니다: 당신의 마음대로 이것을 사용하고, 연구하고, 공유하고, 개선할 수 있습니다. From 9c19e9813a879209edf87c29a665054cc792468c Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Sun, 8 Jan 2023 11:53:42 +0100 Subject: [PATCH 019/645] Fixed a bug that caused multiple empty playlists to be not shown. --- .../schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java index 4941d939507..09355deed55 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java @@ -80,7 +80,7 @@ default Flowable> listByService(final int serviceId) + " FROM " + PLAYLIST_TABLE + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE + " ON " + PLAYLIST_ID + " = " + JOIN_PLAYLIST_ID - + " GROUP BY " + JOIN_PLAYLIST_ID + + " GROUP BY " + PLAYLIST_ID + " ORDER BY " + PLAYLIST_NAME + " COLLATE NOCASE ASC") Flowable> getPlaylistMetadata(); } From eb3363d4dd76a69a14777390023c159f42daf2dc Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Tue, 10 Jan 2023 20:55:18 +0100 Subject: [PATCH 020/645] Created the first draft. --- .../playlist/dao/PlaylistStreamDAO.java | 11 ++++++++++ .../local/playlist/LocalPlaylistFragment.java | 20 +++++++++++++++++++ .../local/playlist/LocalPlaylistManager.java | 6 ++++++ app/src/main/res/menu/menu_local_playlist.xml | 6 ++++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 44 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java index 4941d939507..594df5c2561 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java @@ -83,4 +83,15 @@ default Flowable> listByService(final int serviceId) + " GROUP BY " + JOIN_PLAYLIST_ID + " ORDER BY " + PLAYLIST_NAME + " COLLATE NOCASE ASC") Flowable> getPlaylistMetadata(); + + @Transaction + @Query("DELETE FROM " + PLAYLIST_STREAM_JOIN_TABLE + + " WHERE " + JOIN_PLAYLIST_ID + "=:playlistId" + + " AND " + JOIN_STREAM_ID + " IN (" + + " SELECT " + JOIN_STREAM_ID + + " FROM " + PLAYLIST_STREAM_JOIN_TABLE + + " WHERE " + JOIN_PLAYLIST_ID + "=:playlistId" + + " GROUP BY " + JOIN_STREAM_ID + + " HAVING COUNT(*) > 1 )" ) + Flowable> removeDuplicates(long playlistId); } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index d98ce4121fb..a5fb6757630 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -367,6 +367,8 @@ public boolean onOptionsItemSelected(final MenuItem item) { .create() .show(); } + } else if (item.getItemId() == R.id.menu_item_remove_duplicates) { + openRemoveDuplicatesDialog(); } else { return super.onOptionsItemSelected(item); } @@ -621,6 +623,24 @@ private void updateThumbnailUrl() { changeThumbnailUrl(newThumbnailUrl); } + + private void openRemoveDuplicatesDialog() { + final AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity()); + + builder.setTitle("R.string.duplicate_stream_in_playlist_title") + .setMessage("test") + .setPositiveButton(android.R.string.yes, (dialog, i) -> { + removeDuplicatesInPlaylist(); + }) + .setNeutralButton(R.string.cancel, null); + + builder.create().show(); + } + + private void removeDuplicatesInPlaylist() { + + } + private void deleteItem(final PlaylistStreamEntry item) { if (itemListAdapter == null) { return; diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index 33296aa8433..0752ab49d64 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -86,6 +86,12 @@ public Flowable> getPlaylists() { return playlistStreamTable.getPlaylistMetadata().subscribeOn(Schedulers.io()); } + public Flowable> removeDuplicateStreams() { + // TODO: Delete Duplicates and rebuild the index + // TODO: Rebuild the index + return playlistStreamTable.getPlaylistMetadata().subscribeOn(Schedulers.io()); + } + public Flowable> getPlaylistStreams(final long playlistId) { return playlistStreamTable.getOrderedStreamsOf(playlistId).subscribeOn(Schedulers.io()); } diff --git a/app/src/main/res/menu/menu_local_playlist.xml b/app/src/main/res/menu/menu_local_playlist.xml index 0ff182b48bd..c57e8ad9580 100644 --- a/app/src/main/res/menu/menu_local_playlist.xml +++ b/app/src/main/res/menu/menu_local_playlist.xml @@ -12,8 +12,14 @@ android:id="@+id/menu_item_rename_playlist" android:title="@string/rename_playlist" app:showAsAction="never" /> + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4e68893049b..5d8ddb6924c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -626,6 +626,7 @@ System default Remove watched Remove watched videos? + Remove duplicates Videos that have been watched before and after being added to the playlist will be removed. \nAre you sure\? This cannot be undone! Yes, and partially watched videos From 0a64eac7783fa8127b9a14781e14b2846384ab36 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Wed, 11 Jan 2023 16:06:11 +0100 Subject: [PATCH 021/645] Added the "What's New"-section to the default tabs --- .../java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java index 32f25ccbdf9..30676477c65 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java @@ -20,6 +20,7 @@ public final class TabsJsonHelper { private static final List FALLBACK_INITIAL_TABS_LIST = List.of( Tab.Type.DEFAULT_KIOSK.getTab(), + Tab.Type.FEED.getTab(), Tab.Type.SUBSCRIPTIONS.getTab(), Tab.Type.BOOKMARKS.getTab()); From b6e6d39985b34ac318258ce5e894ae06abf51208 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 12 Jan 2023 11:39:25 +0100 Subject: [PATCH 022/645] Fix toast crash on API 33 You shouldn't call getView() on toasts. Also simplified some duplicate code. --- .../org/schabi/newpipe/RouterActivity.java | 3 +- .../fragments/detail/VideoDetailFragment.java | 3 +- .../newpipe/player/PlayQueueActivity.java | 4 +-- .../schabi/newpipe/util/NavigationHelper.java | 6 ++-- .../schabi/newpipe/util/PermissionHelper.java | 29 ++++++++++--------- 5 files changed, 20 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index 2567df9938a..e9c19a22de0 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -631,8 +631,7 @@ private void handleChoice(final String selectedChoiceKey) { } if (selectedChoiceKey.equals(getString(R.string.popup_player_key)) - && !PermissionHelper.isPopupEnabled(this)) { - PermissionHelper.showPopupEnablementToast(this); + && !PermissionHelper.isPopupEnabledElseAsk(this)) { finish(); return; } 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 601135cbb59..6f4439ee9bc 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 @@ -1066,8 +1066,7 @@ private void openBackgroundPlayer(final boolean append) { } private void openPopupPlayer(final boolean append) { - if (!PermissionHelper.isPopupEnabled(activity)) { - PermissionHelper.showPopupEnablementToast(activity); + if (!PermissionHelper.isPopupEnabledElseAsk(activity)) { return; } diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index 94de7fef383..9ce99c15b4b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -143,11 +143,9 @@ public boolean onOptionsItemSelected(final MenuItem item) { NavigationHelper.playOnMainPlayer(this, player.getPlayQueue(), true); return true; case R.id.action_switch_popup: - if (PermissionHelper.isPopupEnabled(this)) { + if (PermissionHelper.isPopupEnabledElseAsk(this)) { this.player.setRecovery(); NavigationHelper.playOnPopupPlayer(this, player.getPlayQueue(), true); - } else { - PermissionHelper.showPopupEnablementToast(this); } return true; case R.id.action_switch_background: 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 483f5067ae1..b4556507cc5 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -156,8 +156,7 @@ public static void playOnMainPlayer(final Context context, public static void playOnPopupPlayer(final Context context, final PlayQueue queue, final boolean resumePlayback) { - if (!PermissionHelper.isPopupEnabled(context)) { - PermissionHelper.showPopupEnablementToast(context); + if (!PermissionHelper.isPopupEnabledElseAsk(context)) { return; } @@ -183,8 +182,7 @@ public static void playOnBackgroundPlayer(final Context context, public static void enqueueOnPlayer(final Context context, final PlayQueue queue, final PlayerType playerType) { - if ((playerType == PlayerType.POPUP) && !PermissionHelper.isPopupEnabled(context)) { - PermissionHelper.showPopupEnablementToast(context); + if (playerType == PlayerType.POPUP && !PermissionHelper.isPopupEnabledElseAsk(context)) { return; } diff --git a/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java b/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java index f47494770af..55193599e6f 100644 --- a/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java @@ -9,8 +9,6 @@ import android.net.Uri; import android.os.Build; import android.provider.Settings; -import android.view.Gravity; -import android.widget.TextView; import android.widget.Toast; import androidx.annotation.RequiresApi; @@ -128,18 +126,21 @@ public static boolean checkSystemAlertWindowPermission(final Context context) { } } - public static boolean isPopupEnabled(final Context context) { - return Build.VERSION.SDK_INT < Build.VERSION_CODES.M - || checkSystemAlertWindowPermission(context); - } - - public static void showPopupEnablementToast(final Context context) { - final Toast toast = - Toast.makeText(context, R.string.msg_popup_permission, Toast.LENGTH_LONG); - final TextView messageView = toast.getView().findViewById(android.R.id.message); - if (messageView != null) { - messageView.setGravity(Gravity.CENTER); + /** + * Determines whether the popup is enabled, and if it is not, starts the system activity to + * request the permission with {@link #checkSystemAlertWindowPermission(Context)} and shows a + * toast to the user explaining why the permission is needed. + * + * @param context the Android context + * @return whether the popup is enabled + */ + public static boolean isPopupEnabledElseAsk(final Context context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M + || checkSystemAlertWindowPermission(context)) { + return true; + } else { + Toast.makeText(context, R.string.msg_popup_permission, Toast.LENGTH_LONG).show(); + return false; } - toast.show(); } } From 5e3caf68a54b0b30808a31499049600800f6df39 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Fri, 13 Jan 2023 16:33:45 +0100 Subject: [PATCH 023/645] Chenged the What's New icon --- app/src/main/java/org/schabi/newpipe/MainActivity.java | 2 +- .../schabi/newpipe/local/subscription/FeedGroupIcon.kt | 3 ++- .../newpipe/local/subscription/SubscriptionFragment.kt | 4 ++-- .../java/org/schabi/newpipe/settings/tabs/Tab.java | 2 +- app/src/main/res/drawable/ic_whats_new.xml | 10 ++++++++++ 5 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable/ic_whats_new.xml diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 73a81450ec7..d05f3616d25 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -235,7 +235,7 @@ private void addDrawerMenuForCurrentService() throws ExtractionException { .setIcon(R.drawable.ic_tv); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_FEED, ORDER, R.string.fragment_feed_title) - .setIcon(R.drawable.ic_rss_feed); + .setIcon(R.drawable.ic_whats_new); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_BOOKMARKS, ORDER, R.string.tab_bookmarks) .setIcon(R.drawable.ic_bookmark); diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt index ac7197b48fd..23718fa53dc 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt @@ -51,7 +51,8 @@ enum class FeedGroupIcon( WORLD(34, R.drawable.ic_public), STAR(35, R.drawable.ic_stars), SUN(36, R.drawable.ic_wb_sunny), - RSS(37, R.drawable.ic_rss_feed); + RSS(37, R.drawable.ic_rss_feed), + WHATS_NEW(38, R.drawable.ic_whats_new); @DrawableRes fun getDrawableRes(): Int { diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt index 9e1e19fff74..7146a18d603 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt @@ -433,10 +433,10 @@ class SubscriptionFragment : BaseStateFragment() { clear() if (listViewMode) { add(FeedGroupAddNewItem()) - add(FeedGroupCardItem(GROUP_ALL_ID, getString(R.string.all), FeedGroupIcon.RSS)) + add(FeedGroupCardItem(GROUP_ALL_ID, getString(R.string.all), FeedGroupIcon.WHATS_NEW)) } else { add(FeedGroupAddNewGridItem()) - add(FeedGroupCardGridItem(GROUP_ALL_ID, getString(R.string.all), FeedGroupIcon.RSS)) + add(FeedGroupCardGridItem(GROUP_ALL_ID, getString(R.string.all), FeedGroupIcon.WHATS_NEW)) } addAll(groups) } diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java index 6b1d70a8668..a08fe6ef6bd 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java @@ -248,7 +248,7 @@ public String getTabName(final Context context) { @DrawableRes @Override public int getTabIconRes(final Context context) { - return R.drawable.ic_rss_feed; + return R.drawable.ic_whats_new; } @Override diff --git a/app/src/main/res/drawable/ic_whats_new.xml b/app/src/main/res/drawable/ic_whats_new.xml new file mode 100644 index 00000000000..f2ac7bec2dc --- /dev/null +++ b/app/src/main/res/drawable/ic_whats_new.xml @@ -0,0 +1,10 @@ + + + From 135fc082126529c0cc0dea2e3128d9fbaa86890a Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Fri, 13 Jan 2023 21:35:22 +0100 Subject: [PATCH 024/645] Implemented the "remove duplicates" feature. --- .../playlist/dao/PlaylistStreamDAO.java | 24 ++++++++++++------- .../local/playlist/LocalPlaylistFragment.java | 17 +++++++++++-- .../local/playlist/LocalPlaylistManager.java | 7 +++--- app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java index 594df5c2561..015a770029a 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java @@ -84,14 +84,22 @@ default Flowable> listByService(final int serviceId) + " ORDER BY " + PLAYLIST_NAME + " COLLATE NOCASE ASC") Flowable> getPlaylistMetadata(); + @RewriteQueriesToDropUnusedColumns @Transaction - @Query("DELETE FROM " + PLAYLIST_STREAM_JOIN_TABLE - + " WHERE " + JOIN_PLAYLIST_ID + "=:playlistId" - + " AND " + JOIN_STREAM_ID + " IN (" - + " SELECT " + JOIN_STREAM_ID + @Query("SELECT *, MIN(" + JOIN_INDEX + ") FROM " + STREAM_TABLE + " INNER JOIN " + + "(SELECT " + JOIN_STREAM_ID + "," + JOIN_INDEX + " FROM " + PLAYLIST_STREAM_JOIN_TABLE - + " WHERE " + JOIN_PLAYLIST_ID + "=:playlistId" - + " GROUP BY " + JOIN_STREAM_ID - + " HAVING COUNT(*) > 1 )" ) - Flowable> removeDuplicates(long playlistId); + + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId)" + + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID + + " LEFT JOIN " + + "(SELECT " + JOIN_STREAM_ID + " AS " + JOIN_STREAM_ID_ALIAS + ", " + + STREAM_PROGRESS_MILLIS + + " FROM " + STREAM_STATE_TABLE + " )" + + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID_ALIAS + + " GROUP BY " + STREAM_ID + + " ORDER BY " + JOIN_INDEX + " ASC") + Flowable> getStreamsWithoutDuplicates(long playlistId); + + + } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index a5fb6757630..9881a0a20c6 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -627,8 +627,8 @@ private void updateThumbnailUrl() { private void openRemoveDuplicatesDialog() { final AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity()); - builder.setTitle("R.string.duplicate_stream_in_playlist_title") - .setMessage("test") + builder.setTitle(R.string.remove_duplicates_title) + .setMessage(R.string.remove_duplicates_message) .setPositiveButton(android.R.string.yes, (dialog, i) -> { removeDuplicatesInPlaylist(); }) @@ -638,7 +638,20 @@ private void openRemoveDuplicatesDialog() { } private void removeDuplicatesInPlaylist() { + final List itemsToKeep = playlistManager + .getDistinctPlaylistStreams(playlistId).blockingFirst(); + itemListAdapter.clearStreamItemList(); + itemListAdapter.addItems(itemsToKeep); + saveChanges(); + + final long videoCount = itemListAdapter.getItemsList().size(); + setVideoCount(videoCount); + if (videoCount == 0) { + showEmptyState(); + } + //TODO: Do we have to show loading? + //hideLoading(); } private void deleteItem(final PlaylistStreamEntry item) { diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index 0752ab49d64..f397be0dfeb 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -86,10 +86,9 @@ public Flowable> getPlaylists() { return playlistStreamTable.getPlaylistMetadata().subscribeOn(Schedulers.io()); } - public Flowable> removeDuplicateStreams() { - // TODO: Delete Duplicates and rebuild the index - // TODO: Rebuild the index - return playlistStreamTable.getPlaylistMetadata().subscribeOn(Schedulers.io()); + public Flowable> getDistinctPlaylistStreams(final long playlistId) { + return playlistStreamTable + .getStreamsWithoutDuplicates(playlistId).subscribeOn(Schedulers.io()); } public Flowable> getPlaylistStreams(final long playlistId) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5d8ddb6924c..cdde2e5ee64 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -627,6 +627,8 @@ Remove watched Remove watched videos? Remove duplicates + Remove duplicates? + Do you want to remove all duplicate streams in this playlist? Videos that have been watched before and after being added to the playlist will be removed. \nAre you sure\? This cannot be undone! Yes, and partially watched videos From 223150aa423fdb988dbd3233f11770459d110c2d Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sat, 14 Jan 2023 11:00:00 +0530 Subject: [PATCH 025/645] Update desugar_jdk_libs to 2.0.0. --- app/build.gradle | 2 +- build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6066bce4316..79e07a190b1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -179,7 +179,7 @@ sonar { dependencies { /** Desugaring **/ - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.8' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.0' /** NewPipe libraries **/ // You can use a local version by uncommenting a few lines in settings.gradle diff --git a/build.gradle b/build.gradle index d2f1dc4c546..1384d0a9cef 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.3.1' + classpath 'com.android.tools.build:gradle:7.4.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong From 31396a632fb1693a6413a30ed9f0c7fd15b37de7 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Sat, 14 Jan 2023 09:21:37 +0100 Subject: [PATCH 026/645] Chenged the name of the icon --- app/src/main/java/org/schabi/newpipe/MainActivity.java | 2 +- .../java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt | 2 +- app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java | 2 +- .../res/drawable/{ic_whats_new.xml => ic_subscriptions.xml} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename app/src/main/res/drawable/{ic_whats_new.xml => ic_subscriptions.xml} (100%) diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index d05f3616d25..ee2bb3f0586 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -235,7 +235,7 @@ private void addDrawerMenuForCurrentService() throws ExtractionException { .setIcon(R.drawable.ic_tv); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_FEED, ORDER, R.string.fragment_feed_title) - .setIcon(R.drawable.ic_whats_new); + .setIcon(R.drawable.ic_subscriptions); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_BOOKMARKS, ORDER, R.string.tab_bookmarks) .setIcon(R.drawable.ic_bookmark); diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt index 23718fa53dc..1fa70e4d860 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt @@ -52,7 +52,7 @@ enum class FeedGroupIcon( STAR(35, R.drawable.ic_stars), SUN(36, R.drawable.ic_wb_sunny), RSS(37, R.drawable.ic_rss_feed), - WHATS_NEW(38, R.drawable.ic_whats_new); + WHATS_NEW(38, R.drawable.ic_subscriptions); @DrawableRes fun getDrawableRes(): Int { diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java index a08fe6ef6bd..7e3f5d0c825 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java @@ -248,7 +248,7 @@ public String getTabName(final Context context) { @DrawableRes @Override public int getTabIconRes(final Context context) { - return R.drawable.ic_whats_new; + return R.drawable.ic_subscriptions; } @Override diff --git a/app/src/main/res/drawable/ic_whats_new.xml b/app/src/main/res/drawable/ic_subscriptions.xml similarity index 100% rename from app/src/main/res/drawable/ic_whats_new.xml rename to app/src/main/res/drawable/ic_subscriptions.xml From fdfeac081ad9fe6094582d29a8df72d00e7d2271 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Mon, 5 Dec 2022 00:15:05 +0100 Subject: [PATCH 027/645] Implemented a warning before adding duplicate to playlist. --- .../playlist/dao/PlaylistStreamDAO.java | 11 +++++++ .../local/dialog/PlaylistAppendDialog.java | 32 ++++++++++++++++++- .../local/playlist/LocalPlaylistManager.java | 4 +++ app/src/main/res/values/strings.xml | 3 ++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java index 2036dc2057c..911baf7f3cd 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java @@ -26,6 +26,7 @@ import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_ID; import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_TABLE; import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_THUMBNAIL_URL; +import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_URL; import static org.schabi.newpipe.database.stream.model.StreamStateEntity.JOIN_STREAM_ID_ALIAS; import static org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_PROGRESS_MILLIS; import static org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_STATE_TABLE; @@ -49,6 +50,16 @@ default Flowable> listByService(final int serviceId) + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId") void deleteBatch(long playlistId); + @Query("SELECT COALESCE(COUNT(*), 0)" + + " FROM " + STREAM_TABLE + + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE + + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID + + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId " + + " AND " + STREAM_URL + " = :streamURL" + ) + Flowable getDuplicates(long playlistId, String streamURL); + + @Query("SELECT COALESCE(MAX(" + JOIN_INDEX + "), -1)" + " FROM " + PLAYLIST_STREAM_JOIN_TABLE + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId") diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index 88dec3911a5..c80e919bfb7 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.local.dialog; +import android.app.AlertDialog; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -128,6 +129,19 @@ private void onPlaylistsReceived(@NonNull final List play private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager, @NonNull final PlaylistMetadataEntry playlist, @NonNull final List streams) { + + final int numOfDuplicates = manager.getPlaylistDuplicates(playlist.uid, + streams.get(0).getUrl()).blockingFirst(); + if (numOfDuplicates > 0) { + createDuplicateDialog(numOfDuplicates, manager, playlist, streams); + } else { + addStreamToPlaylist(manager, playlist, streams); + } + } + + private void addStreamToPlaylist(@NonNull final LocalPlaylistManager manager, + @NonNull final PlaylistMetadataEntry playlist, + @NonNull final List streams) { final Toast successToast = Toast.makeText(getContext(), R.string.playlist_add_stream_success, Toast.LENGTH_SHORT); @@ -142,7 +156,23 @@ private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager, playlistDisposables.add(manager.appendToPlaylist(playlist.uid, streams) .observeOn(AndroidSchedulers.mainThread()) .subscribe(ignored -> successToast.show())); - requireDialog().dismiss(); } + + private void createDuplicateDialog(final int duplicates, + @NonNull final LocalPlaylistManager manager, + @NonNull final PlaylistMetadataEntry playlist, + @NonNull final List streams) { + //TODO: change color + final AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity()); + builder.setTitle(R.string.duplicate_stream_in_playlist_title); + builder.setMessage(getString(R.string.duplicate_stream_in_playlist_description, + duplicates)); + + builder.setPositiveButton(android.R.string.yes, (dialog, i) -> { + addStreamToPlaylist(manager, playlist, streams); + }); + builder.setNeutralButton(R.string.cancel, null); + builder.create().show(); + } } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index 4007d0e09bc..807c3c051ff 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -91,6 +91,10 @@ public Flowable> getPlaylistStreams(final long playlis return playlistStreamTable.getOrderedStreamsOf(playlistId).subscribeOn(Schedulers.io()); } + public Flowable getPlaylistDuplicates(final long playlistId, final String streamURL) { + return playlistStreamTable.getDuplicates(playlistId, streamURL); + } + public Single deletePlaylist(final long playlistId) { return Single.fromCallable(() -> playlistTable.deletePlaylist(playlistId)) .subscribeOn(Schedulers.io()); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c9e0bb49290..5b398abd128 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -447,6 +447,9 @@ Playlisted Playlist thumbnail changed. Auto-generated (no uploader found) + Duplicated Video Found + The playlist contains this stream + already %d time(s).\nDo you want to add it one more time? No Captions Fit From ac15339911a86399903c9bd974d6632c2b3088b6 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Sat, 10 Dec 2022 13:15:49 +0100 Subject: [PATCH 028/645] Started working on a way to show that items are already in a playlist --- .../playlist/dao/PlaylistStreamDAO.java | 8 +++++ .../newpipe/local/LocalItemListAdapter.java | 11 +++++++ .../local/dialog/PlaylistAppendDialog.java | 32 ++++++++++++++++++- .../local/playlist/LocalPlaylistManager.java | 4 +++ .../res/layout/list_playlist_mini_item.xml | 12 +++++++ 5 files changed, 66 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java index 911baf7f3cd..a9719c9fa0f 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java @@ -59,6 +59,14 @@ default Flowable> listByService(final int serviceId) ) Flowable getDuplicates(long playlistId, String streamURL); + @Query("SELECT " + JOIN_PLAYLIST_ID + + " FROM " + STREAM_TABLE + + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE + + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID + + " WHERE " + STREAM_URL + " = :streamURL" + ) + Flowable> getDuplicatePlaylists(String streamURL); + @Query("SELECT COALESCE(MAX(" + JOIN_INDEX + "), -1)" + " FROM " + PLAYLIST_STREAM_JOIN_TABLE diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index 05e2fdac083..93ea12b97ba 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.schabi.newpipe.database.LocalItem; +import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.local.holder.LocalItemHolder; @@ -344,6 +345,16 @@ public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, fina } } + @Override + public long getItemId(final int position) { + final LocalItem item = localItems.get(0); + if (item != null && item.getLocalItemType() == LocalItem.LocalItemType. + PLAYLIST_LOCAL_ITEM) { + return ((PlaylistMetadataEntry) item).uid; + } + return super.getItemId(position); + } + public GridLayoutManager.SpanSizeLookup getSpanSizeLookup(final int spanCount) { return new GridLayoutManager.SpanSizeLookup() { @Override diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index c80e919bfb7..f8c62c5cc3d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -19,6 +19,7 @@ import org.schabi.newpipe.local.LocalItemListAdapter; import org.schabi.newpipe.local.playlist.LocalPlaylistManager; +import java.util.HashMap; import java.util.List; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; @@ -62,6 +63,7 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle saved new LocalPlaylistManager(NewPipeDatabase.getInstance(requireContext())); playlistAdapter = new LocalItemListAdapter(getActivity()); + playlistAdapter.setHasStableIds(true); playlistAdapter.setSelectedListener(selectedItem -> { final List entities = getStreamEntities(); if (selectedItem instanceof PlaylistMetadataEntry && entities != null) { @@ -123,6 +125,35 @@ private void onPlaylistsReceived(@NonNull final List play playlistAdapter.clearStreamItemList(); playlistAdapter.addItems(playlists); playlistRecyclerView.setVisibility(View.VISIBLE); + + final LocalPlaylistManager playlistManager = + new LocalPlaylistManager(NewPipeDatabase.getInstance(requireContext())); + final List duplicateIds = playlistManager.getDuplicatePlaylist(getStreamEntities() + .get(0).getUrl()).blockingFirst(); + + final HashMap map = new HashMap<>(); + for (int i = 0; i < playlists.size(); i++) { + map.put(i, playlists.get(i).uid); + } + + playlistRecyclerView.postDelayed(new Runnable() { + @Override + public void run() { + if (playlistRecyclerView.getAdapter() == null) { + return; + } + final int count = playlistRecyclerView.getAdapter().getItemCount(); + System.out.println(" kasjdflkalk" + playlistRecyclerView.getAdapter() + .getItemId(0)); + for (int i = 0; i < count; i++) { + if (playlistRecyclerView.findViewHolderForAdapterPosition(i) != null + && duplicateIds.contains(playlistAdapter.getItemId(i))) { + playlistRecyclerView.findViewHolderForAdapterPosition(i).itemView + .findViewById(R.id.checkmark2).setVisibility(View.VISIBLE); + } + } + } + }, 1000); } } @@ -163,7 +194,6 @@ private void createDuplicateDialog(final int duplicates, @NonNull final LocalPlaylistManager manager, @NonNull final PlaylistMetadataEntry playlist, @NonNull final List streams) { - //TODO: change color final AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity()); builder.setTitle(R.string.duplicate_stream_in_playlist_title); builder.setMessage(getString(R.string.duplicate_stream_in_playlist_description, diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index 807c3c051ff..d017eac6c45 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -95,6 +95,10 @@ public Flowable getPlaylistDuplicates(final long playlistId, final Stri return playlistStreamTable.getDuplicates(playlistId, streamURL); } + public Flowable> getDuplicatePlaylist(final String streamURL) { + return playlistStreamTable.getDuplicatePlaylists(streamURL); + } + public Single deletePlaylist(final long playlistId) { return Single.fromCallable(() -> playlistTable.deletePlaylist(playlistId)) .subscribeOn(Schedulers.io()); diff --git a/app/src/main/res/layout/list_playlist_mini_item.xml b/app/src/main/res/layout/list_playlist_mini_item.xml index a1f70144d46..1b7065f2344 100644 --- a/app/src/main/res/layout/list_playlist_mini_item.xml +++ b/app/src/main/res/layout/list_playlist_mini_item.xml @@ -1,5 +1,6 @@ + + + Date: Sat, 10 Dec 2022 16:54:46 +0100 Subject: [PATCH 029/645] Continued working on a way to show that items are already in a playlist --- .../newpipe/local/LocalItemListAdapter.java | 2 +- .../local/dialog/PlaylistAppendDialog.java | 62 +++++++++++-------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index 93ea12b97ba..ea7bc290d58 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -347,7 +347,7 @@ public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, fina @Override public long getItemId(final int position) { - final LocalItem item = localItems.get(0); + final LocalItem item = localItems.get(position); if (item != null && item.getLocalItemType() == LocalItem.LocalItemType. PLAYLIST_LOCAL_ITEM) { return ((PlaylistMetadataEntry) item).uid; diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index f8c62c5cc3d..9616b06b3d6 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -16,10 +16,10 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.database.stream.model.StreamEntity; +import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.local.LocalItemListAdapter; import org.schabi.newpipe.local.playlist.LocalPlaylistManager; -import java.util.HashMap; import java.util.List; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; @@ -126,34 +126,44 @@ private void onPlaylistsReceived(@NonNull final List play playlistAdapter.addItems(playlists); playlistRecyclerView.setVisibility(View.VISIBLE); - final LocalPlaylistManager playlistManager = - new LocalPlaylistManager(NewPipeDatabase.getInstance(requireContext())); - final List duplicateIds = playlistManager.getDuplicatePlaylist(getStreamEntities() - .get(0).getUrl()).blockingFirst(); + playlistRecyclerView.addOnScrollListener(new DefaultItemListOnScrolledDownListener()); + initDuplicateIndicators(playlistRecyclerView); + } + } - final HashMap map = new HashMap<>(); - for (int i = 0; i < playlists.size(); i++) { - map.put(i, playlists.get(i).uid); + public class DefaultItemListOnScrolledDownListener extends OnScrollBelowItemsListener { + @Override + public void onScrolledDown(final RecyclerView recyclerView) { + showDuplicateIndicators(recyclerView); + } + } + + public void initDuplicateIndicators(@NonNull final RecyclerView view) { + view.postDelayed(new Runnable() { + @Override + public void run() { + showDuplicateIndicators(view); } + }, 50); + } - playlistRecyclerView.postDelayed(new Runnable() { - @Override - public void run() { - if (playlistRecyclerView.getAdapter() == null) { - return; - } - final int count = playlistRecyclerView.getAdapter().getItemCount(); - System.out.println(" kasjdflkalk" + playlistRecyclerView.getAdapter() - .getItemId(0)); - for (int i = 0; i < count; i++) { - if (playlistRecyclerView.findViewHolderForAdapterPosition(i) != null - && duplicateIds.contains(playlistAdapter.getItemId(i))) { - playlistRecyclerView.findViewHolderForAdapterPosition(i).itemView - .findViewById(R.id.checkmark2).setVisibility(View.VISIBLE); - } - } - } - }, 1000); + public void showDuplicateIndicators(final RecyclerView view) { + final LocalPlaylistManager playlistManager = + new LocalPlaylistManager(NewPipeDatabase.getInstance(requireContext())); + final List duplicateIds = playlistManager.getDuplicatePlaylist(getStreamEntities() + .get(0).getUrl()).blockingFirst(); + + if (view.getAdapter() == null) { + return; + } + + final int count = view.getAdapter().getItemCount(); + for (int i = 0; i < count; i++) { + if (view.findViewHolderForAdapterPosition(i) != null + && duplicateIds.contains(playlistAdapter.getItemId(i))) { + view.findViewHolderForAdapterPosition(i).itemView + .findViewById(R.id.checkmark2).setVisibility(View.VISIBLE); + } } } From 8b6e110635a0404a1faea8bba252823fffa49f31 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Mon, 12 Dec 2022 20:12:06 +0100 Subject: [PATCH 030/645] Fixed the functionality, improved performance & general code cleanup --- .../playlist/dao/PlaylistStreamDAO.java | 3 +- .../local/dialog/PlaylistAppendDialog.java | 68 +++++++++++-------- .../local/playlist/LocalPlaylistManager.java | 7 +- app/src/main/res/layout/dialog_playlists.xml | 17 ++++- .../res/layout/list_playlist_mini_item.xml | 12 ---- app/src/main/res/values/strings.xml | 1 + 6 files changed, 60 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java index a9719c9fa0f..27eb34b904f 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java @@ -57,7 +57,7 @@ default Flowable> listByService(final int serviceId) + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId " + " AND " + STREAM_URL + " = :streamURL" ) - Flowable getDuplicates(long playlistId, String streamURL); + Flowable getDuplicateCount(long playlistId, String streamURL); @Query("SELECT " + JOIN_PLAYLIST_ID + " FROM " + STREAM_TABLE @@ -67,7 +67,6 @@ default Flowable> listByService(final int serviceId) ) Flowable> getDuplicatePlaylists(String streamURL); - @Query("SELECT COALESCE(MAX(" + JOIN_INDEX + "), -1)" + " FROM " + PLAYLIST_STREAM_JOIN_TABLE + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId") diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index 9616b06b3d6..5767d616355 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -16,7 +16,6 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.database.stream.model.StreamEntity; -import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.local.LocalItemListAdapter; import org.schabi.newpipe.local.playlist.LocalPlaylistManager; @@ -28,8 +27,12 @@ public final class PlaylistAppendDialog extends PlaylistDialog { private static final String TAG = PlaylistAppendDialog.class.getCanonicalName(); + private static final float DEFAULT_ALPHA = 1f; + private static final float GRAYED_OUT_ALPHA = 0.3f; + private RecyclerView playlistRecyclerView; private LocalItemListAdapter playlistAdapter; + private List duplicateIds; private final CompositeDisposable playlistDisposables = new CompositeDisposable(); @@ -62,6 +65,9 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle saved final LocalPlaylistManager playlistManager = new LocalPlaylistManager(NewPipeDatabase.getInstance(requireContext())); + duplicateIds = playlistManager.getDuplicatePlaylists(getStreamEntities().get(0).getUrl()) + .blockingFirst(); + playlistAdapter = new LocalItemListAdapter(getActivity()); playlistAdapter.setHasStableIds(true); playlistAdapter.setSelectedListener(selectedItem -> { @@ -126,43 +132,43 @@ private void onPlaylistsReceived(@NonNull final List play playlistAdapter.addItems(playlists); playlistRecyclerView.setVisibility(View.VISIBLE); - playlistRecyclerView.addOnScrollListener(new DefaultItemListOnScrolledDownListener()); + playlistRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull final RecyclerView recyclerView, final int dx, + final int dy) { + showDuplicateIndicators(recyclerView); + } + }); initDuplicateIndicators(playlistRecyclerView); } } - public class DefaultItemListOnScrolledDownListener extends OnScrollBelowItemsListener { - @Override - public void onScrolledDown(final RecyclerView recyclerView) { - showDuplicateIndicators(recyclerView); - } - } - public void initDuplicateIndicators(@NonNull final RecyclerView view) { - view.postDelayed(new Runnable() { - @Override - public void run() { - showDuplicateIndicators(view); - } - }, 50); - } + showDuplicateIndicators(view); - public void showDuplicateIndicators(final RecyclerView view) { - final LocalPlaylistManager playlistManager = - new LocalPlaylistManager(NewPipeDatabase.getInstance(requireContext())); - final List duplicateIds = playlistManager.getDuplicatePlaylist(getStreamEntities() - .get(0).getUrl()).blockingFirst(); + if (!duplicateIds.isEmpty()) { + final View indicatorExplanation = getView() + .findViewById(R.id.playlist_duplicate); + indicatorExplanation.setVisibility(View.VISIBLE); + } + } + public void showDuplicateIndicators(@NonNull final RecyclerView view) { if (view.getAdapter() == null) { return; } final int count = view.getAdapter().getItemCount(); for (int i = 0; i < count; i++) { - if (view.findViewHolderForAdapterPosition(i) != null - && duplicateIds.contains(playlistAdapter.getItemId(i))) { - view.findViewHolderForAdapterPosition(i).itemView - .findViewById(R.id.checkmark2).setVisibility(View.VISIBLE); + + final RecyclerView.ViewHolder viewHolder = view.findViewHolderForAdapterPosition(i); + if (viewHolder != null) { + if (duplicateIds.contains(view.getAdapter().getItemId(i))) { + viewHolder.itemView.setAlpha(GRAYED_OUT_ALPHA); + } else { + viewHolder.itemView.setAlpha(DEFAULT_ALPHA); + } + } } } @@ -171,10 +177,10 @@ private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager, @NonNull final PlaylistMetadataEntry playlist, @NonNull final List streams) { - final int numOfDuplicates = manager.getPlaylistDuplicates(playlist.uid, + final int numberOfDuplicates = manager.getPlaylistDuplicateCount(playlist.uid, streams.get(0).getUrl()).blockingFirst(); - if (numOfDuplicates > 0) { - createDuplicateDialog(numOfDuplicates, manager, playlist, streams); + if (numberOfDuplicates > 0) { + createDuplicateDialog(numberOfDuplicates, manager, playlist, streams); } else { addStreamToPlaylist(manager, playlist, streams); } @@ -197,22 +203,24 @@ private void addStreamToPlaylist(@NonNull final LocalPlaylistManager manager, playlistDisposables.add(manager.appendToPlaylist(playlist.uid, streams) .observeOn(AndroidSchedulers.mainThread()) .subscribe(ignored -> successToast.show())); + requireDialog().dismiss(); } - private void createDuplicateDialog(final int duplicates, + private void createDuplicateDialog(final int numberOfDuplicates, @NonNull final LocalPlaylistManager manager, @NonNull final PlaylistMetadataEntry playlist, @NonNull final List streams) { final AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity()); builder.setTitle(R.string.duplicate_stream_in_playlist_title); builder.setMessage(getString(R.string.duplicate_stream_in_playlist_description, - duplicates)); + numberOfDuplicates)); builder.setPositiveButton(android.R.string.yes, (dialog, i) -> { addStreamToPlaylist(manager, playlist, streams); }); builder.setNeutralButton(R.string.cancel, null); + builder.create().show(); } } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index d017eac6c45..eaccb1e7105 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -91,11 +91,12 @@ public Flowable> getPlaylistStreams(final long playlis return playlistStreamTable.getOrderedStreamsOf(playlistId).subscribeOn(Schedulers.io()); } - public Flowable getPlaylistDuplicates(final long playlistId, final String streamURL) { - return playlistStreamTable.getDuplicates(playlistId, streamURL); + public Flowable getPlaylistDuplicateCount(final long playlistId, + final String streamURL) { + return playlistStreamTable.getDuplicateCount(playlistId, streamURL); } - public Flowable> getDuplicatePlaylist(final String streamURL) { + public Flowable> getDuplicatePlaylists(final String streamURL) { return playlistStreamTable.getDuplicatePlaylists(streamURL); } diff --git a/app/src/main/res/layout/dialog_playlists.xml b/app/src/main/res/layout/dialog_playlists.xml index 18b08d93c81..5771b400fd2 100644 --- a/app/src/main/res/layout/dialog_playlists.xml +++ b/app/src/main/res/layout/dialog_playlists.xml @@ -34,11 +34,26 @@ tools:ignore="RtlHardcoded" /> + + diff --git a/app/src/main/res/layout/list_playlist_mini_item.xml b/app/src/main/res/layout/list_playlist_mini_item.xml index 1b7065f2344..a1f70144d46 100644 --- a/app/src/main/res/layout/list_playlist_mini_item.xml +++ b/app/src/main/res/layout/list_playlist_mini_item.xml @@ -1,6 +1,5 @@ - - - "Loading requested content" New Playlist + The playlists that are grayed out already contain this item. Rename Name Add to playlist From 5fb7b3266b965cd725b0b4f72cb43e3f4427f3d6 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Fri, 16 Dec 2022 00:29:22 +0100 Subject: [PATCH 031/645] Removed the duplicate dialog and added another toast option --- .../local/dialog/PlaylistAppendDialog.java | 37 ++++--------------- app/src/main/res/values/strings.xml | 4 +- 2 files changed, 8 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index 5767d616355..3414d95ab26 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -1,6 +1,5 @@ package org.schabi.newpipe.local.dialog; -import android.app.AlertDialog; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -177,20 +176,15 @@ private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager, @NonNull final PlaylistMetadataEntry playlist, @NonNull final List streams) { - final int numberOfDuplicates = manager.getPlaylistDuplicateCount(playlist.uid, - streams.get(0).getUrl()).blockingFirst(); - if (numberOfDuplicates > 0) { - createDuplicateDialog(numberOfDuplicates, manager, playlist, streams); - } else { - addStreamToPlaylist(manager, playlist, streams); + final int numOfDuplicates = manager.getPlaylistDuplicateCount(playlist.uid, + streams.get(0).getUrl()).blockingFirst(); + String toastText = getString(R.string.playlist_add_stream_success); + + if (numOfDuplicates > 0) { + toastText = getString(R.string.playlist_add_stream_success_duplicate); } - } - private void addStreamToPlaylist(@NonNull final LocalPlaylistManager manager, - @NonNull final PlaylistMetadataEntry playlist, - @NonNull final List streams) { - final Toast successToast = Toast.makeText(getContext(), - R.string.playlist_add_stream_success, Toast.LENGTH_SHORT); + final Toast successToast = Toast.makeText(getContext(), toastText, Toast.LENGTH_SHORT); if (playlist.thumbnailUrl .equals("drawable://" + R.drawable.placeholder_thumbnail_playlist)) { @@ -206,21 +200,4 @@ private void addStreamToPlaylist(@NonNull final LocalPlaylistManager manager, requireDialog().dismiss(); } - - private void createDuplicateDialog(final int numberOfDuplicates, - @NonNull final LocalPlaylistManager manager, - @NonNull final PlaylistMetadataEntry playlist, - @NonNull final List streams) { - final AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity()); - builder.setTitle(R.string.duplicate_stream_in_playlist_title); - builder.setMessage(getString(R.string.duplicate_stream_in_playlist_description, - numberOfDuplicates)); - - builder.setPositiveButton(android.R.string.yes, (dialog, i) -> { - addStreamToPlaylist(manager, playlist, streams); - }); - builder.setNeutralButton(R.string.cancel, null); - - builder.create().show(); - } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 70687b8f480..4067381f480 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -446,11 +446,9 @@ Delete this playlist\? Playlist created Playlisted + Playlisted duplicate Playlist thumbnail changed. Auto-generated (no uploader found) - Duplicated Video Found - The playlist contains this stream - already %d time(s).\nDo you want to add it one more time? No Captions Fit From b3554a6a49206f35197341308aab26380667af96 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Fri, 30 Dec 2022 16:36:33 +0100 Subject: [PATCH 032/645] Added the number of duplicates to the toast text. --- .../org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java | 2 +- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index 3414d95ab26..85bce77840d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -181,7 +181,7 @@ private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager, String toastText = getString(R.string.playlist_add_stream_success); if (numOfDuplicates > 0) { - toastText = getString(R.string.playlist_add_stream_success_duplicate); + toastText = getString(R.string.playlist_add_stream_success_duplicate, numOfDuplicates); } final Toast successToast = Toast.makeText(getContext(), toastText, Toast.LENGTH_SHORT); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4067381f480..cf403926269 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -446,7 +446,7 @@ Delete this playlist\? Playlist created Playlisted - Playlisted duplicate + Duplicate added %d time(s) Playlist thumbnail changed. Auto-generated (no uploader found) From ef4a6238c88f26e50ba794caa071432a08da66e7 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sat, 14 Jan 2023 18:00:40 +0100 Subject: [PATCH 033/645] See if playlists already contain a stream from db --- .../playlist/PlaylistDuplicatesEntry.java | 24 +++++++ .../playlist/dao/PlaylistStreamDAO.java | 39 +++++----- .../local/dialog/PlaylistAppendDialog.java | 72 ++++--------------- .../local/holder/LocalPlaylistItemHolder.java | 11 +++ .../local/playlist/LocalPlaylistManager.java | 22 +++--- 5 files changed, 84 insertions(+), 84 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.java diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.java b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.java new file mode 100644 index 00000000000..0fcb4ced46e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.java @@ -0,0 +1,24 @@ +package org.schabi.newpipe.database.playlist; + +import androidx.room.ColumnInfo; + +/** + * This class adds a field to {@link PlaylistMetadataEntry} that contains an integer representing + * how many times a specific stream is already contained inside a local playlist. Used to be able + * to grey out playlists which already contain the current stream in the playlist append dialog. + * @see org.schabi.newpipe.local.playlist.LocalPlaylistManager#getPlaylistDuplicates(String) + */ +public class PlaylistDuplicatesEntry extends PlaylistMetadataEntry { + public static final String PLAYLIST_TIMES_STREAM_IS_CONTAINED = "timesStreamIsContained"; + @ColumnInfo(name = PLAYLIST_TIMES_STREAM_IS_CONTAINED) + public final long timesStreamIsContained; + + public PlaylistDuplicatesEntry(final long uid, + final String name, + final String thumbnailUrl, + final long streamCount, + final long timesStreamIsContained) { + super(uid, name, thumbnailUrl, streamCount); + this.timesStreamIsContained = timesStreamIsContained; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java index 27eb34b904f..f173ab0bc09 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java @@ -6,6 +6,7 @@ import androidx.room.Transaction; import org.schabi.newpipe.database.BasicDAO; +import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity; @@ -14,6 +15,7 @@ import io.reactivex.rxjava3.core.Flowable; +import static org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry.PLAYLIST_TIMES_STREAM_IS_CONTAINED; import static org.schabi.newpipe.database.playlist.PlaylistMetadataEntry.PLAYLIST_STREAM_COUNT; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_ID; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_NAME; @@ -50,23 +52,6 @@ default Flowable> listByService(final int serviceId) + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId") void deleteBatch(long playlistId); - @Query("SELECT COALESCE(COUNT(*), 0)" - + " FROM " + STREAM_TABLE - + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE - + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID - + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId " - + " AND " + STREAM_URL + " = :streamURL" - ) - Flowable getDuplicateCount(long playlistId, String streamURL); - - @Query("SELECT " + JOIN_PLAYLIST_ID - + " FROM " + STREAM_TABLE - + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE - + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID - + " WHERE " + STREAM_URL + " = :streamURL" - ) - Flowable> getDuplicatePlaylists(String streamURL); - @Query("SELECT COALESCE(MAX(" + JOIN_INDEX + "), -1)" + " FROM " + PLAYLIST_STREAM_JOIN_TABLE + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId") @@ -111,4 +96,24 @@ default Flowable> listByService(final int serviceId) + " GROUP BY " + PLAYLIST_ID + " ORDER BY " + PLAYLIST_NAME + " COLLATE NOCASE ASC") Flowable> getPlaylistMetadata(); + + @Transaction + @Query("SELECT " + PLAYLIST_TABLE + "." + PLAYLIST_ID + ", " + + PLAYLIST_NAME + ", " + + PLAYLIST_TABLE + "." + PLAYLIST_THUMBNAIL_URL + ", " + + "COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT + ", " + + "COALESCE(SUM(" + STREAM_URL + " = :streamUrl), 0) AS " + + PLAYLIST_TIMES_STREAM_IS_CONTAINED + + + " FROM " + PLAYLIST_TABLE + + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE + + " ON " + PLAYLIST_TABLE + "." + PLAYLIST_ID + " = " + JOIN_PLAYLIST_ID + + + " LEFT JOIN " + STREAM_TABLE + + " ON " + STREAM_TABLE + "." + STREAM_ID + " = " + JOIN_STREAM_ID + + " AND :streamUrl = :streamUrl" + + + " GROUP BY " + JOIN_PLAYLIST_ID + + " ORDER BY " + PLAYLIST_NAME + " COLLATE NOCASE ASC") + Flowable> getPlaylistDuplicatesMetadata(String streamUrl); } diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index 85bce77840d..79a355f5295 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -13,7 +13,7 @@ import org.schabi.newpipe.NewPipeDatabase; import org.schabi.newpipe.R; -import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; +import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry; import org.schabi.newpipe.database.stream.model.StreamEntity; import org.schabi.newpipe.local.LocalItemListAdapter; import org.schabi.newpipe.local.playlist.LocalPlaylistManager; @@ -26,12 +26,8 @@ public final class PlaylistAppendDialog extends PlaylistDialog { private static final String TAG = PlaylistAppendDialog.class.getCanonicalName(); - private static final float DEFAULT_ALPHA = 1f; - private static final float GRAYED_OUT_ALPHA = 0.3f; - private RecyclerView playlistRecyclerView; private LocalItemListAdapter playlistAdapter; - private List duplicateIds; private final CompositeDisposable playlistDisposables = new CompositeDisposable(); @@ -64,15 +60,13 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle saved final LocalPlaylistManager playlistManager = new LocalPlaylistManager(NewPipeDatabase.getInstance(requireContext())); - duplicateIds = playlistManager.getDuplicatePlaylists(getStreamEntities().get(0).getUrl()) - .blockingFirst(); - playlistAdapter = new LocalItemListAdapter(getActivity()); playlistAdapter.setHasStableIds(true); playlistAdapter.setSelectedListener(selectedItem -> { final List entities = getStreamEntities(); - if (selectedItem instanceof PlaylistMetadataEntry && entities != null) { - onPlaylistSelected(playlistManager, (PlaylistMetadataEntry) selectedItem, entities); + if (selectedItem instanceof PlaylistDuplicatesEntry && entities != null) { + onPlaylistSelected(playlistManager, + (PlaylistDuplicatesEntry) selectedItem, entities); } }); @@ -83,7 +77,8 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle saved final View newPlaylistButton = view.findViewById(R.id.newPlaylist); newPlaylistButton.setOnClickListener(ignored -> openCreatePlaylistDialog()); - playlistDisposables.add(playlistManager.getPlaylists() + playlistDisposables.add(playlistManager + .getPlaylistDuplicates(getStreamEntities().get(0).getUrl()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::onPlaylistsReceived)); } @@ -125,63 +120,24 @@ public void openCreatePlaylistDialog() { requireDialog().dismiss(); } - private void onPlaylistsReceived(@NonNull final List playlists) { + private void onPlaylistsReceived(@NonNull final List playlists) { if (playlistAdapter != null && playlistRecyclerView != null) { playlistAdapter.clearStreamItemList(); playlistAdapter.addItems(playlists); playlistRecyclerView.setVisibility(View.VISIBLE); - - playlistRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(@NonNull final RecyclerView recyclerView, final int dx, - final int dy) { - showDuplicateIndicators(recyclerView); - } - }); - initDuplicateIndicators(playlistRecyclerView); - } - } - - public void initDuplicateIndicators(@NonNull final RecyclerView view) { - showDuplicateIndicators(view); - - if (!duplicateIds.isEmpty()) { - final View indicatorExplanation = getView() - .findViewById(R.id.playlist_duplicate); - indicatorExplanation.setVisibility(View.VISIBLE); - } - } - - public void showDuplicateIndicators(@NonNull final RecyclerView view) { - if (view.getAdapter() == null) { - return; - } - - final int count = view.getAdapter().getItemCount(); - for (int i = 0; i < count; i++) { - - final RecyclerView.ViewHolder viewHolder = view.findViewHolderForAdapterPosition(i); - if (viewHolder != null) { - if (duplicateIds.contains(view.getAdapter().getItemId(i))) { - viewHolder.itemView.setAlpha(GRAYED_OUT_ALPHA); - } else { - viewHolder.itemView.setAlpha(DEFAULT_ALPHA); - } - - } } } private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager, - @NonNull final PlaylistMetadataEntry playlist, + @NonNull final PlaylistDuplicatesEntry playlist, @NonNull final List streams) { - final int numOfDuplicates = manager.getPlaylistDuplicateCount(playlist.uid, - streams.get(0).getUrl()).blockingFirst(); - String toastText = getString(R.string.playlist_add_stream_success); - - if (numOfDuplicates > 0) { - toastText = getString(R.string.playlist_add_stream_success_duplicate, numOfDuplicates); + final String toastText; + if (playlist.timesStreamIsContained > 0) { + toastText = getString(R.string.playlist_add_stream_success_duplicate, + playlist.timesStreamIsContained); + } else { + toastText = getString(R.string.playlist_add_stream_success); } final Toast successToast = Toast.makeText(getContext(), toastText, Toast.LENGTH_SHORT); diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java index f8c5176ec2d..240ca0462b2 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java @@ -4,6 +4,7 @@ import android.view.ViewGroup; import org.schabi.newpipe.database.LocalItem; +import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; @@ -13,6 +14,9 @@ import java.time.format.DateTimeFormatter; public class LocalPlaylistItemHolder extends PlaylistItemHolder { + + private static final float GRAYED_OUT_ALPHA = 0.6f; + public LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final ViewGroup parent) { super(infoItemBuilder, parent); } @@ -38,6 +42,13 @@ public void updateFromItem(final LocalItem localItem, PicassoHelper.loadPlaylistThumbnail(item.thumbnailUrl).into(itemThumbnailView); + if (item instanceof PlaylistDuplicatesEntry + && ((PlaylistDuplicatesEntry) item).timesStreamIsContained > 0) { + itemView.setAlpha(GRAYED_OUT_ALPHA); + } else { + itemView.setAlpha(1.0f); + } + super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter); } } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index eaccb1e7105..8ea64f34376 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -4,6 +4,7 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.database.AppDatabase; +import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; import org.schabi.newpipe.database.playlist.dao.PlaylistDAO; @@ -87,17 +88,20 @@ public Flowable> getPlaylists() { return playlistStreamTable.getPlaylistMetadata().subscribeOn(Schedulers.io()); } - public Flowable> getPlaylistStreams(final long playlistId) { - return playlistStreamTable.getOrderedStreamsOf(playlistId).subscribeOn(Schedulers.io()); - } - - public Flowable getPlaylistDuplicateCount(final long playlistId, - final String streamURL) { - return playlistStreamTable.getDuplicateCount(playlistId, streamURL); + /** + * Get playlists with attached information about how many times the provided stream is already + * contained in each playlist. + * + * @param streamUrl the stream url for which to check for duplicates + * @return a list of {@link PlaylistDuplicatesEntry} + */ + public Flowable> getPlaylistDuplicates(final String streamUrl) { + return playlistStreamTable.getPlaylistDuplicatesMetadata(streamUrl) + .subscribeOn(Schedulers.io()); } - public Flowable> getDuplicatePlaylists(final String streamURL) { - return playlistStreamTable.getDuplicatePlaylists(streamURL); + public Flowable> getPlaylistStreams(final long playlistId) { + return playlistStreamTable.getOrderedStreamsOf(playlistId).subscribeOn(Schedulers.io()); } public Single deletePlaylist(final long playlistId) { From f766ef2033f9e9f43c59feb0bb70d3a61620c96a Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sun, 28 Aug 2022 06:41:38 +0530 Subject: [PATCH 034/645] Replace the system UI visibility flags with WindowCompat calls. --- .../fragments/detail/VideoDetailFragment.java | 55 ++++++++----------- .../newpipe/player/ui/MainPlayerUi.java | 11 ++-- 2 files changed, 29 insertions(+), 37 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 679084bdfc9..df0e0e53730 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 @@ -27,7 +27,6 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -55,6 +54,9 @@ import androidx.appcompat.widget.Toolbar; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.content.ContextCompat; +import androidx.core.view.WindowCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.core.view.WindowInsetsControllerCompat; import androidx.preference.PreferenceManager; import com.google.android.exoplayer2.PlaybackException; @@ -1962,15 +1964,17 @@ private void showSystemUi() { return; } - // Prevent jumping of the player on devices with cutout - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - activity.getWindow().getAttributes().layoutInDisplayCutoutMode = - WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT; - } - activity.getWindow().getDecorView().setSystemUiVisibility(0); - activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - activity.getWindow().setStatusBarColor(ThemeHelper.resolveColorFromAttr( - requireContext(), android.R.attr.colorPrimary)); + final var window = activity.getWindow(); + final var windowInsetsController = WindowCompat.getInsetsController(window, + window.getDecorView()); + + WindowCompat.setDecorFitsSystemWindows(window, true); + windowInsetsController.setSystemBarsBehavior(WindowInsetsControllerCompat + .BEHAVIOR_SHOW_BARS_BY_TOUCH); + windowInsetsController.show(WindowInsetsCompat.Type.systemBars()); + + window.setStatusBarColor(ThemeHelper.resolveColorFromAttr(requireContext(), + android.R.attr.colorPrimary)); } private void hideSystemUi() { @@ -1982,30 +1986,19 @@ private void hideSystemUi() { return; } - // Prevent jumping of the player on devices with cutout - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - activity.getWindow().getAttributes().layoutInDisplayCutoutMode = - WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; - } - int visibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + final var window = activity.getWindow(); + final var windowInsetsController = WindowCompat.getInsetsController(window, + window.getDecorView()); - // In multiWindow mode status bar is not transparent for devices with cutout - // if I include this flag. So without it is better in this case - final boolean isInMultiWindow = DeviceUtils.isInMultiWindow(activity); - if (!isInMultiWindow) { - visibility |= View.SYSTEM_UI_FLAG_FULLSCREEN; - } - activity.getWindow().getDecorView().setSystemUiVisibility(visibility); + WindowCompat.setDecorFitsSystemWindows(window, false); + windowInsetsController.setSystemBarsBehavior(WindowInsetsControllerCompat + .BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE); + windowInsetsController.hide(WindowInsetsCompat.Type.systemBars()); - if (isInMultiWindow || isFullscreen()) { - activity.getWindow().setStatusBarColor(Color.TRANSPARENT); - activity.getWindow().setNavigationBarColor(Color.TRANSPARENT); + if (DeviceUtils.isInMultiWindow(activity) || isFullscreen()) { + window.setStatusBarColor(Color.TRANSPARENT); + window.setNavigationBarColor(Color.TRANSPARENT); } - activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); } // Listener implementation diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java index 6226900f60a..58729ace253 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java @@ -32,7 +32,6 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; -import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.LinearLayout; @@ -40,6 +39,8 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.content.res.AppCompatResources; +import androidx.core.view.WindowCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.FragmentActivity; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; @@ -451,11 +452,9 @@ public void showSystemUIPartially() { getParentActivity().map(Activity::getWindow).ifPresent(window -> { window.setStatusBarColor(Color.TRANSPARENT); window.setNavigationBarColor(Color.TRANSPARENT); - final int visibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; - window.getDecorView().setSystemUiVisibility(visibility); - window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + WindowCompat.setDecorFitsSystemWindows(window, false); + WindowCompat.getInsetsController(window, window.getDecorView()) + .show(WindowInsetsCompat.Type.systemBars()); }); } } From 764b6aa2b1284b8c48a9280eb93c17254cceeb37 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Sat, 17 Dec 2022 00:01:18 +0100 Subject: [PATCH 035/645] Made the channel-images in the grid list bigger Also improved the handling of additional information (expanded description, video count, subscriber count) --- .../holder/ChannelInfoItemHolder.java | 38 -------------- .../holder/ChannelMiniInfoItemHolder.java | 50 ++++++++++++++++--- .../res/layout/list_channel_grid_item.xml | 16 +++++- app/src/main/res/values/dimens.xml | 2 +- 4 files changed, 57 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java index cf1ed255b75..f8133d3de4e 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java @@ -1,14 +1,9 @@ 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.info_list.InfoItemBuilder; -import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.Localization; /* * Created by Christian Schabesberger on 12.02.17. @@ -31,40 +26,7 @@ */ public class ChannelInfoItemHolder extends ChannelMiniInfoItemHolder { - private final TextView itemChannelDescriptionView; - public ChannelInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewGroup parent) { super(infoItemBuilder, R.layout.list_channel_item, parent); - itemChannelDescriptionView = itemView.findViewById(R.id.itemChannelDescriptionView); - } - - @Override - public void updateFromItem(final InfoItem infoItem, - final HistoryRecordManager historyRecordManager) { - super.updateFromItem(infoItem, historyRecordManager); - - if (!(infoItem instanceof ChannelInfoItem)) { - return; - } - final ChannelInfoItem item = (ChannelInfoItem) infoItem; - - itemChannelDescriptionView.setText(item.getDescription()); - } - - @Override - protected String getDetailLine(final ChannelInfoItem item) { - String details = super.getDetailLine(item); - - if (item.getStreamCount() >= 0) { - final String formattedVideoAmount = Localization.localizeStreamCount( - itemBuilder.getContext(), item.getStreamCount()); - - if (!details.isEmpty()) { - details += " • " + formattedVideoAmount; - } else { - details = formattedVideoAmount; - } - } - return details; } } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java index 89398a1e52a..c625c3c5c20 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java @@ -1,21 +1,26 @@ package org.schabi.newpipe.info_list.holder; +import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.Nullable; + import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; +import org.schabi.newpipe.extractor.utils.Utils; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.PicassoHelper; import org.schabi.newpipe.util.Localization; public class ChannelMiniInfoItemHolder extends InfoItemHolder { - public final ImageView itemThumbnailView; - public final TextView itemTitleView; + private final ImageView itemThumbnailView; + private final TextView itemTitleView; private final TextView itemAdditionalDetailView; + private final TextView itemChannelDescriptionView; ChannelMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final int layoutId, final ViewGroup parent) { @@ -24,6 +29,7 @@ public class ChannelMiniInfoItemHolder extends InfoItemHolder { itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView); itemTitleView = itemView.findViewById(R.id.itemTitleView); itemAdditionalDetailView = itemView.findViewById(R.id.itemAdditionalDetails); + itemChannelDescriptionView = itemView.findViewById(R.id.itemChannelDescriptionView); } public ChannelMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, @@ -40,7 +46,14 @@ public void updateFromItem(final InfoItem infoItem, final ChannelInfoItem item = (ChannelInfoItem) infoItem; itemTitleView.setText(item.getName()); - itemAdditionalDetailView.setText(getDetailLine(item)); + + final String detailLine = getDetailLine(item); + if (detailLine == null) { + itemAdditionalDetailView.setVisibility(View.GONE); + } else { + itemAdditionalDetailView.setVisibility(View.VISIBLE); + itemAdditionalDetailView.setText(getDetailLine(item)); + } PicassoHelper.loadAvatar(item.getThumbnailUrl()).into(itemThumbnailView); @@ -56,14 +69,35 @@ public void updateFromItem(final InfoItem infoItem, } return true; }); + + if (itemChannelDescriptionView != null) { + // itemChannelDescriptionView will be null in the mini variant + if (Utils.isBlank(item.getDescription())) { + itemChannelDescriptionView.setVisibility(View.GONE); + } else { + itemChannelDescriptionView.setVisibility(View.VISIBLE); + itemChannelDescriptionView.setText(item.getDescription()); + itemChannelDescriptionView.setMaxLines(detailLine == null ? 3 : 2); + } + } } - protected String getDetailLine(final ChannelInfoItem item) { - String details = ""; - if (item.getSubscriberCount() >= 0) { - details += Localization.shortSubscriberCount(itemBuilder.getContext(), + @Nullable + private String getDetailLine(final ChannelInfoItem item) { + if (item.getStreamCount() >= 0 && item.getSubscriberCount() >= 0) { + return Localization.concatenateStrings( + Localization.shortSubscriberCount(itemBuilder.getContext(), + item.getSubscriberCount()), + Localization.localizeStreamCount(itemBuilder.getContext(), + item.getStreamCount())); + } else if (item.getStreamCount() >= 0) { + return Localization.localizeStreamCount(itemBuilder.getContext(), + item.getStreamCount()); + } else if (item.getSubscriberCount() >= 0) { + return Localization.shortSubscriberCount(itemBuilder.getContext(), item.getSubscriberCount()); + } else { + return null; } - return details; } } diff --git a/app/src/main/res/layout/list_channel_grid_item.xml b/app/src/main/res/layout/list_channel_grid_item.xml index 3112a849fb6..0aec4e6e06d 100644 --- a/app/src/main/res/layout/list_channel_grid_item.xml +++ b/app/src/main/res/layout/list_channel_grid_item.xml @@ -39,12 +39,24 @@ android:id="@+id/itemAdditionalDetails" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_below="@+id/itemTitleView" + android:layout_below="@id/itemTitleView" android:layout_centerHorizontal="true" android:lines="1" android:textAppearance="?android:attr/textAppearanceSmall" android:textSize="@dimen/video_item_search_upload_date_text_size" tools:ignore="RtlHardcoded" - tools:text="10M subscribers" /> + tools:text="10M subscribers • 100 videos" /> + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 9f7e50c199d..5693ec7c49b 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -30,7 +30,7 @@ 164dp 92dp - 42dp + 92dp 128dp 96dp From cdd5e89b863a86ad1425883589946c5c35bb20ee Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Sat, 16 Jul 2022 13:33:25 +0200 Subject: [PATCH 036/645] Add ability to copy hashtags, URLs and timestamps in descriptions on long-press This commit adds the ability to copy to clipboard hashtags, URLs and timestamps when long-pressing them. Some changes in our TextView class related to text setting have been required and metadata items are now using a NewPipeTextView instead of a standard TextView. Six new classes have been added: - a custom LinkMovementMethod class; - a custom ClickableSpan class, LongPressClickableSpan, in order to set a long press event; - a class to avoid code duplication in CommentTextOnTouchListener, TouchUtils; - three implementations of LongPressClickableSpan used when linkifying text: - HashtagLongPressClickableSpan for hashtags; - TimestampLongPressClickableSpan for timestamps; - UrlLongPressClickableSpan for URLs. --- .../fragments/detail/DescriptionFragment.java | 45 +-- .../util/CommentTextOnTouchListener.java | 26 +- .../org/schabi/newpipe/util/TouchUtils.java | 38 +++ .../HashtagLongPressClickableSpan.java | 38 +++ .../external_communication/ShareUtils.java | 13 +- .../external_communication/TextLinkifier.java | 303 +++++++++--------- .../TimestampExtractor.java | 20 +- .../TimestampLongPressClickableSpan.java | 75 +++++ .../UrlLongPressClickableSpan.java | 41 +++ .../newpipe/views/LongPressClickableSpan.java | 12 + .../views/LongPressLinkMovementMethod.java | 77 +++++ .../schabi/newpipe/views/NewPipeEditText.java | 5 +- .../schabi/newpipe/views/NewPipeTextView.java | 17 +- app/src/main/res/layout/item_metadata.xml | 4 +- app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 16 files changed, 507 insertions(+), 209 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/util/TouchUtils.java create mode 100644 app/src/main/java/org/schabi/newpipe/util/external_communication/HashtagLongPressClickableSpan.java create mode 100644 app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampLongPressClickableSpan.java create mode 100644 app/src/main/java/org/schabi/newpipe/util/external_communication/UrlLongPressClickableSpan.java create mode 100644 app/src/main/java/org/schabi/newpipe/views/LongPressClickableSpan.java create mode 100644 app/src/main/java/org/schabi/newpipe/views/LongPressLinkMovementMethod.java diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java index bf7f8fa5d97..96e01c622cf 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java @@ -3,6 +3,7 @@ import static android.text.TextUtils.isEmpty; import static org.schabi.newpipe.extractor.stream.StreamExtractor.NO_AGE_LIMIT; import static org.schabi.newpipe.extractor.utils.Utils.isBlank; +import static org.schabi.newpipe.util.Localization.getAppLocale; import android.os.Bundle; import android.view.LayoutInflater; @@ -134,7 +135,8 @@ private void loadDescriptionContent() { TextLinkifier.createLinksFromMarkdownText(binding.detailDescriptionView, description.getContent(), streamInfo, descriptionDisposables); break; - case Description.PLAIN_TEXT: default: + case Description.PLAIN_TEXT: + default: TextLinkifier.createLinksFromPlainText(binding.detailDescriptionView, description.getContent(), streamInfo, descriptionDisposables); break; @@ -144,30 +146,30 @@ private void loadDescriptionContent() { private void setupMetadata(final LayoutInflater inflater, final LinearLayout layout) { - addMetadataItem(inflater, layout, false, - R.string.metadata_category, streamInfo.getCategory()); + addMetadataItem(inflater, layout, false, R.string.metadata_category, + streamInfo.getCategory()); - addMetadataItem(inflater, layout, false, - R.string.metadata_licence, streamInfo.getLicence()); + addMetadataItem(inflater, layout, false, R.string.metadata_licence, + streamInfo.getLicence()); addPrivacyMetadataItem(inflater, layout); if (streamInfo.getAgeLimit() != NO_AGE_LIMIT) { - addMetadataItem(inflater, layout, false, - R.string.metadata_age_limit, String.valueOf(streamInfo.getAgeLimit())); + addMetadataItem(inflater, layout, false, R.string.metadata_age_limit, + String.valueOf(streamInfo.getAgeLimit())); } if (streamInfo.getLanguageInfo() != null) { - addMetadataItem(inflater, layout, false, - R.string.metadata_language, streamInfo.getLanguageInfo().getDisplayLanguage()); + addMetadataItem(inflater, layout, false, R.string.metadata_language, + streamInfo.getLanguageInfo().getDisplayLanguage(getAppLocale(getContext()))); } - addMetadataItem(inflater, layout, true, - R.string.metadata_support, streamInfo.getSupportInfo()); - addMetadataItem(inflater, layout, true, - R.string.metadata_host, streamInfo.getHost()); - addMetadataItem(inflater, layout, true, - R.string.metadata_thumbnail_url, streamInfo.getThumbnailUrl()); + addMetadataItem(inflater, layout, true, R.string.metadata_support, + streamInfo.getSupportInfo()); + addMetadataItem(inflater, layout, true, R.string.metadata_host, + streamInfo.getHost()); + addMetadataItem(inflater, layout, true, R.string.metadata_thumbnail_url, + streamInfo.getThumbnailUrl()); addTagsMetadataItem(inflater, layout); } @@ -191,12 +193,14 @@ private void addMetadataItem(final LayoutInflater inflater, }); if (linkifyContent) { - TextLinkifier.createLinksFromPlainText(itemBinding.metadataContentView, content, null, - descriptionDisposables); + TextLinkifier.createLinksFromPlainText(itemBinding.metadataContentView, content, + null, descriptionDisposables); } else { itemBinding.metadataContentView.setText(content); } + itemBinding.metadataContentView.setClickable(true); + layout.addView(itemBinding.getRoot()); } @@ -245,14 +249,15 @@ private void addPrivacyMetadataItem(final LayoutInflater inflater, final LinearL case INTERNAL: contentRes = R.string.metadata_privacy_internal; break; - case OTHER: default: + case OTHER: + default: contentRes = 0; break; } if (contentRes != 0) { - addMetadataItem(inflater, layout, false, - R.string.metadata_privacy, getString(contentRes)); + addMetadataItem(inflater, layout, false, R.string.metadata_privacy, + getString(contentRes)); } } } diff --git a/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java b/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java index 7c87e664ba8..ff8875e5aab 100644 --- a/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java +++ b/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.util; -import android.text.Layout; +import static org.schabi.newpipe.util.TouchUtils.getOffsetForHorizontalLine; + import android.text.Selection; import android.text.Spannable; import android.text.Spanned; @@ -30,23 +31,9 @@ public boolean onTouch(final View v, final MotionEvent event) { final int action = event.getAction(); - if (action == MotionEvent.ACTION_UP - || action == MotionEvent.ACTION_DOWN) { - int x = (int) event.getX(); - int y = (int) event.getY(); - - x -= widget.getTotalPaddingLeft(); - y -= widget.getTotalPaddingTop(); - - x += widget.getScrollX(); - y += widget.getScrollY(); - - final Layout layout = widget.getLayout(); - final int line = layout.getLineForVertical(y); - final int off = layout.getOffsetForHorizontal(line, x); - - final ClickableSpan[] link = buffer.getSpans(off, off, - ClickableSpan.class); + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { + final int offset = getOffsetForHorizontalLine(widget, event); + final ClickableSpan[] link = buffer.getSpans(offset, offset, ClickableSpan.class); if (link.length != 0) { if (action == MotionEvent.ACTION_UP) { @@ -58,8 +45,7 @@ public boolean onTouch(final View v, final MotionEvent event) { } } } else if (action == MotionEvent.ACTION_DOWN) { - Selection.setSelection(buffer, - buffer.getSpanStart(link[0]), + Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0])); } return true; diff --git a/app/src/main/java/org/schabi/newpipe/util/TouchUtils.java b/app/src/main/java/org/schabi/newpipe/util/TouchUtils.java new file mode 100644 index 00000000000..23bc5a4011f --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/TouchUtils.java @@ -0,0 +1,38 @@ +package org.schabi.newpipe.util; + +import android.text.Layout; +import android.view.MotionEvent; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +public final class TouchUtils { + + private TouchUtils() { + } + + /** + * Get the character offset on the closest line to the position pressed by the user of a + * {@link TextView} from a {@link MotionEvent} which was fired on this {@link TextView}. + * + * @param textView the {@link TextView} on which the {@link MotionEvent} was fired + * @param event the {@link MotionEvent} which was fired + * @return the character offset on the closest line to the position pressed by the user + */ + public static int getOffsetForHorizontalLine(@NonNull final TextView textView, + @NonNull final MotionEvent event) { + + int x = (int) event.getX(); + int y = (int) event.getY(); + + x -= textView.getTotalPaddingLeft(); + y -= textView.getTotalPaddingTop(); + + x += textView.getScrollX(); + y += textView.getScrollY(); + + final Layout layout = textView.getLayout(); + final int line = layout.getLineForVertical(y); + return layout.getOffsetForHorizontal(line, x); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/HashtagLongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/HashtagLongPressClickableSpan.java new file mode 100644 index 00000000000..9acedc12be1 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/HashtagLongPressClickableSpan.java @@ -0,0 +1,38 @@ +package org.schabi.newpipe.util.external_communication; + +import android.content.Context; +import android.view.View; + +import androidx.annotation.NonNull; + +import org.schabi.newpipe.extractor.Info; +import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.views.LongPressClickableSpan; + +final class HashtagLongPressClickableSpan extends LongPressClickableSpan { + + @NonNull + private final Context context; + @NonNull + private final String parsedHashtag; + @NonNull + private final Info relatedInfo; + + HashtagLongPressClickableSpan(@NonNull final Context context, + @NonNull final String parsedHashtag, + @NonNull final Info relatedInfo) { + this.context = context; + this.parsedHashtag = parsedHashtag; + this.relatedInfo = relatedInfo; + } + + @Override + public void onClick(@NonNull final View view) { + NavigationHelper.openSearch(context, relatedInfo.getServiceId(), parsedHashtag); + } + + @Override + public void onLongClick(@NonNull final View view) { + ShareUtils.copyToClipboard(context, parsedHashtag); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java index 9829ddd2e2e..332298b2292 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java @@ -313,10 +313,15 @@ public static void copyToClipboard(@NonNull final Context context, final String return; } - clipboardManager.setPrimaryClip(ClipData.newPlainText(null, text)); - if (Build.VERSION.SDK_INT < 33) { - // Android 13 has its own "copied to clipboard" dialog - Toast.makeText(context, R.string.msg_copied, Toast.LENGTH_SHORT).show(); + try { + clipboardManager.setPrimaryClip(ClipData.newPlainText(null, text)); + if (Build.VERSION.SDK_INT < 33) { + // Android 13 has its own "copied to clipboard" dialog + Toast.makeText(context, R.string.msg_copied, Toast.LENGTH_SHORT).show(); + } + } catch (final Exception e) { + Log.e(TAG, "Error when trying to copy text to clipboard", e); + Toast.makeText(context, R.string.msg_failed_to_copy, Toast.LENGTH_SHORT).show(); } } diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/TextLinkifier.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/TextLinkifier.java index 8b8eb265bb6..1bbd37cf53a 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/TextLinkifier.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/TextLinkifier.java @@ -2,8 +2,6 @@ import android.content.Context; import android.text.SpannableStringBuilder; -import android.text.method.LinkMovementMethod; -import android.text.style.ClickableSpan; import android.text.style.URLSpan; import android.text.util.Linkify; import android.util.Log; @@ -17,6 +15,8 @@ import org.schabi.newpipe.extractor.Info; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.views.LongPressClickableSpan; +import org.schabi.newpipe.views.LongPressLinkMovementMethod; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -28,27 +28,26 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.schedulers.Schedulers; -import static org.schabi.newpipe.util.external_communication.InternalUrlsHandler.playOnPopup; - public final class TextLinkifier { public static final String TAG = TextLinkifier.class.getSimpleName(); // Looks for hashtags with characters from any language (\p{L}), numbers, or underscores - private static final Pattern HASHTAGS_PATTERN = - Pattern.compile("(#[\\p{L}0-9_]+)"); + private static final Pattern HASHTAGS_PATTERN = Pattern.compile("(#[\\p{L}0-9_]+)"); private TextLinkifier() { } /** - * Create web links for contents with an HTML description. + * Create links for contents with an HTML description. + * *

- * This will call {@link TextLinkifier#changeIntentsOfDescriptionLinks(TextView, CharSequence, - * Info, CompositeDisposable)} after having linked the URLs with + * This method will call {@link #changeIntentsOfDescriptionLinks(TextView, CharSequence, Info, + * CompositeDisposable)} after having linked the URLs with * {@link HtmlCompat#fromHtml(String, int)}. + *

* - * @param textView the TextView to set the htmlBlock linked - * @param htmlBlock the htmlBlock to be linked + * @param textView the {@link TextView} to set the the HTML string block linked + * @param htmlBlock the HTML string block to be linked * @param htmlCompatFlag the int flag to be set when {@link HtmlCompat#fromHtml(String, int)} * will be called * @param relatedInfo if given, handle timestamps to open the stream in the popup player at @@ -58,50 +57,55 @@ private TextLinkifier() { * should be handled by the calling class */ public static void createLinksFromHtmlBlock(@NonNull final TextView textView, - final String htmlBlock, + @NonNull final String htmlBlock, final int htmlCompatFlag, @Nullable final Info relatedInfo, - final CompositeDisposable disposables) { - changeIntentsOfDescriptionLinks( - textView, HtmlCompat.fromHtml(htmlBlock, htmlCompatFlag), relatedInfo, disposables); + @NonNull final CompositeDisposable disposables) { + changeIntentsOfDescriptionLinks(textView, HtmlCompat.fromHtml(htmlBlock, htmlCompatFlag), + relatedInfo, disposables); } /** - * Create web links for contents with a plain text description. + * Create links for contents with a plain text description. + * *

- * This will call {@link TextLinkifier#changeIntentsOfDescriptionLinks(TextView, CharSequence, - * Info, CompositeDisposable)} after having linked the URLs with - * {@link TextView#setAutoLinkMask(int)} and - * {@link TextView#setText(CharSequence, TextView.BufferType)}. + * This method will call {@link #changeIntentsOfDescriptionLinks(TextView, CharSequence, Info, + * CompositeDisposable)} after having linked the URLs with {@link TextView#setAutoLinkMask(int)} + * and {@link TextView#setText(CharSequence, TextView.BufferType)}. + *

* - * @param textView the TextView to set the plain text block linked + * @param textView the {@link TextView} to set the plain text block linked * @param plainTextBlock the block of plain text to be linked - * @param relatedInfo if given, handle timestamps to open the stream in the popup player at - * the specific time, and hashtags to search for the term in the correct + * @param relatedInfo if given, handle timestamps to open the stream in the popup player, at + * the specified time, and hashtags to search for the term in the correct * service * @param disposables disposables created by the method are added here and their lifecycle * should be handled by the calling class */ public static void createLinksFromPlainText(@NonNull final TextView textView, - final String plainTextBlock, + @NonNull final String plainTextBlock, @Nullable final Info relatedInfo, - final CompositeDisposable disposables) { + @NonNull final CompositeDisposable disposables) { textView.setAutoLinkMask(Linkify.WEB_URLS); textView.setText(plainTextBlock, TextView.BufferType.SPANNABLE); - changeIntentsOfDescriptionLinks(textView, textView.getText(), relatedInfo, disposables); + changeIntentsOfDescriptionLinks(textView, textView.getText(), relatedInfo, disposables + ); } /** - * Create web links for contents with a markdown description. + * Create links for contents with a markdown description. + * *

- * This will call {@link TextLinkifier#changeIntentsOfDescriptionLinks(TextView, CharSequence, - * Info, CompositeDisposable)} after creating an {@link Markwon} object and using + * This method will call {@link #changeIntentsOfDescriptionLinks(TextView, CharSequence, Info, + * CompositeDisposable)} after creating a {@link Markwon} object and using * {@link Markwon#setMarkdown(TextView, String)}. + *

* - * @param textView the TextView to set the plain text block linked + * @param textView the {@link TextView} to set the plain text block linked * @param markdownBlock the block of markdown text to be linked * @param relatedInfo if given, handle timestamps to open the stream in the popup player at * the specific time, and hashtags to search for the term in the correct + * service * @param disposables disposables created by the method are added here and their lifecycle * should be handled by the calling class */ @@ -115,23 +119,108 @@ public static void createLinksFromMarkdownText(@NonNull final TextView textView, disposables); } + /** + * Change links generated by libraries in the description of a content to a custom link action + * and add click listeners on timestamps in this description. + * + *

+ * Instead of using an {@link android.content.Intent#ACTION_VIEW} intent in the description of + * a content, this method will parse the {@link CharSequence} and replace all current web links + * with {@link ShareUtils#openUrlInBrowser(Context, String, boolean)}. + *

+ * + *

+ * This method will also add click listeners on timestamps in this description, which will play + * the content in the popup player at the time indicated in the timestamp, by using + * {@link TextLinkifier#addClickListenersOnTimestamps(Context, SpannableStringBuilder, + * StreamInfo, CompositeDisposable)} method and click listeners on hashtags, by using + * {@link TextLinkifier#addClickListenersOnHashtags(Context, SpannableStringBuilder, Info)})}, + * which will open a search on the current service with the hashtag. + *

+ * + *

+ * This method is required in order to intercept links and e.g. show a confirmation dialog + * before opening a web link. + *

+ * + * @param textView the {@link TextView} in which the converted {@link CharSequence} will be + * applied + * @param chars the {@link CharSequence} to be parsed + * @param relatedInfo if given, handle timestamps to open the stream in the popup player at the + * specific time, and hashtags to search for the term in the correct service + * @param disposables disposables created by the method are added here and their lifecycle + * should be handled by the calling class + */ + private static void changeIntentsOfDescriptionLinks( + @NonNull final TextView textView, + @NonNull final CharSequence chars, + @Nullable final Info relatedInfo, + @NonNull final CompositeDisposable disposables) { + textView.setMovementMethod(LongPressLinkMovementMethod.getInstance()); + disposables.add(Single.fromCallable(() -> { + final Context context = textView.getContext(); + + // add custom click actions on web links + final SpannableStringBuilder textBlockLinked = + new SpannableStringBuilder(chars); + final URLSpan[] urls = textBlockLinked.getSpans(0, chars.length(), + URLSpan.class); + + for (final URLSpan span : urls) { + final String url = span.getURL(); + final LongPressClickableSpan longPressClickableSpan = + new UrlLongPressClickableSpan(context, disposables, url); + + textBlockLinked.setSpan(longPressClickableSpan, + textBlockLinked.getSpanStart(span), + textBlockLinked.getSpanEnd(span), + textBlockLinked.getSpanFlags(span)); + textBlockLinked.removeSpan(span); + } + + if (relatedInfo != null) { + // add click actions on plain text timestamps only for description of + // contents, unneeded for meta-info or other TextViews + if (relatedInfo instanceof StreamInfo) { + addClickListenersOnTimestamps(context, textBlockLinked, + (StreamInfo) relatedInfo, disposables); + } + + addClickListenersOnHashtags(context, textBlockLinked, relatedInfo); + } + + return textBlockLinked; + }).subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + textBlockLinked -> setTextViewCharSequence(textView, textBlockLinked), + throwable -> { + Log.e(TAG, "Unable to linkify text", throwable); + // this should never happen, but if it does, just fallback to it + setTextViewCharSequence(textView, chars); + })); + } + /** * Add click listeners which opens a search on hashtags in a plain text. + * *

* This method finds all timestamps in the {@link SpannableStringBuilder} of the description - * using a regular expression, adds for each a {@link ClickableSpan} which opens + * using a regular expression, adds for each a {@link LongPressClickableSpan} which opens * {@link NavigationHelper#openSearch(Context, int, String)} and makes a search on the hashtag, - * in the service of the content. + * in the service of the content when pressed, and copy the hashtag to clipboard when + * long-pressed, if allowed by the caller method (parameter {@code addLongClickCopyListener}). + *

* - * @param context the context to use - * @param spannableDescription the SpannableStringBuilder with the text of the + * @param context the {@link Context} to use + * @param spannableDescription the {@link SpannableStringBuilder} with the text of the * content description * @param relatedInfo used to search for the term in the correct service */ - private static void addClickListenersOnHashtags(final Context context, - @NonNull final SpannableStringBuilder - spannableDescription, - final Info relatedInfo) { + private static void addClickListenersOnHashtags( + @NonNull final Context context, + @NonNull final SpannableStringBuilder spannableDescription, + @NonNull final Info relatedInfo) { final String descriptionText = spannableDescription.toString(); final Matcher hashtagsMatches = HASHTAGS_PATTERN.matcher(descriptionText); @@ -140,150 +229,62 @@ private static void addClickListenersOnHashtags(final Context context, final int hashtagEnd = hashtagsMatches.end(1); final String parsedHashtag = descriptionText.substring(hashtagStart, hashtagEnd); - // don't add a ClickableSpan if there is already one, which should be a part of an URL, - // already parsed before + // Don't add a LongPressClickableSpan if there is already one, which should be a part + // of an URL, already parsed before if (spannableDescription.getSpans(hashtagStart, hashtagEnd, - ClickableSpan.class).length == 0) { - spannableDescription.setSpan(new ClickableSpan() { - @Override - public void onClick(@NonNull final View view) { - NavigationHelper.openSearch(context, relatedInfo.getServiceId(), - parsedHashtag); - } - }, hashtagStart, hashtagEnd, 0); + LongPressClickableSpan.class).length == 0) { + spannableDescription.setSpan( + new HashtagLongPressClickableSpan(context, parsedHashtag, relatedInfo), + hashtagStart, hashtagEnd, 0); } } } /** * Add click listeners which opens the popup player on timestamps in a plain text. + * *

* This method finds all timestamps in the {@link SpannableStringBuilder} of the description - * using a regular expression, adds for each a {@link ClickableSpan} which opens the popup - * player at the time indicated in the timestamps. + * using a regular expression, adds for each a {@link LongPressClickableSpan} which opens the + * popup player at the time indicated in the timestamps and copy the timestamp in clipboard + * when long-pressed. + *

* - * @param context the context to use - * @param spannableDescription the SpannableStringBuilder with the text of the + * @param context the {@link Context} to use + * @param spannableDescription the {@link SpannableStringBuilder} with the text of the * content description - * @param relatedInfo what to open in the popup player when timestamps are clicked + * @param streamInfo what to open in the popup player when timestamps are clicked * @param disposables disposables created by the method are added here and their * lifecycle should be handled by the calling class */ - private static void addClickListenersOnTimestamps(final Context context, - @NonNull final SpannableStringBuilder - spannableDescription, - final Info relatedInfo, - final CompositeDisposable disposables) { + private static void addClickListenersOnTimestamps( + @NonNull final Context context, + @NonNull final SpannableStringBuilder spannableDescription, + @NonNull final StreamInfo streamInfo, + @NonNull final CompositeDisposable disposables) { final String descriptionText = spannableDescription.toString(); - final Matcher timestampsMatches = - TimestampExtractor.TIMESTAMPS_PATTERN.matcher(descriptionText); + final Matcher timestampsMatches = TimestampExtractor.TIMESTAMPS_PATTERN.matcher( + descriptionText); while (timestampsMatches.find()) { final TimestampExtractor.TimestampMatchDTO timestampMatchDTO = - TimestampExtractor.getTimestampFromMatcher( - timestampsMatches, - descriptionText); + TimestampExtractor.getTimestampFromMatcher(timestampsMatches, descriptionText); if (timestampMatchDTO == null) { continue; } - spannableDescription.setSpan( - new ClickableSpan() { - @Override - public void onClick(@NonNull final View view) { - playOnPopup( - context, - relatedInfo.getUrl(), - relatedInfo.getService(), - timestampMatchDTO.seconds(), - disposables); - } - }, + spannableDescription.setSpan(new TimestampLongPressClickableSpan( + context, descriptionText, disposables, streamInfo, timestampMatchDTO), timestampMatchDTO.timestampStart(), timestampMatchDTO.timestampEnd(), 0); } } - /** - * Change links generated by libraries in the description of a content to a custom link action - * and add click listeners on timestamps in this description. - *

- * Instead of using an {@link android.content.Intent#ACTION_VIEW} intent in the description of - * a content, this method will parse the {@link CharSequence} and replace all current web links - * with {@link ShareUtils#openUrlInBrowser(Context, String, boolean)}. - * This method will also add click listeners on timestamps in this description, which will play - * the content in the popup player at the time indicated in the timestamp, by using - * {@link TextLinkifier#addClickListenersOnTimestamps(Context, SpannableStringBuilder, Info, - * CompositeDisposable)} method and click listeners on hashtags, by using - * {@link TextLinkifier#addClickListenersOnHashtags(Context, SpannableStringBuilder, Info)}, - * which will open a search on the current service with the hashtag. - *

- * This method is required in order to intercept links and e.g. show a confirmation dialog - * before opening a web link. - * - * @param textView the TextView in which the converted CharSequence will be applied - * @param chars the CharSequence to be parsed - * @param relatedInfo if given, handle timestamps to open the stream in the popup player at - * the specific time, and hashtags to search for the term in the correct - * service - * @param disposables disposables created by the method are added here and their lifecycle - * should be handled by the calling class - */ - private static void changeIntentsOfDescriptionLinks(final TextView textView, - final CharSequence chars, - @Nullable final Info relatedInfo, - final CompositeDisposable disposables) { - disposables.add(Single.fromCallable(() -> { - final Context context = textView.getContext(); - - // add custom click actions on web links - final SpannableStringBuilder textBlockLinked = new SpannableStringBuilder(chars); - final URLSpan[] urls = textBlockLinked.getSpans(0, chars.length(), URLSpan.class); - - for (final URLSpan span : urls) { - final String url = span.getURL(); - final ClickableSpan clickableSpan = new ClickableSpan() { - public void onClick(@NonNull final View view) { - if (!InternalUrlsHandler.handleUrlDescriptionTimestamp( - new CompositeDisposable(), context, url)) { - ShareUtils.openUrlInBrowser(context, url, false); - } - } - }; - - textBlockLinked.setSpan(clickableSpan, textBlockLinked.getSpanStart(span), - textBlockLinked.getSpanEnd(span), textBlockLinked.getSpanFlags(span)); - textBlockLinked.removeSpan(span); - } - - // add click actions on plain text timestamps only for description of contents, - // unneeded for meta-info or other TextViews - if (relatedInfo != null) { - if (relatedInfo instanceof StreamInfo) { - addClickListenersOnTimestamps(context, textBlockLinked, relatedInfo, - disposables); - } - addClickListenersOnHashtags(context, textBlockLinked, relatedInfo); - } - - return textBlockLinked; - }).subscribeOn(Schedulers.computation()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - textBlockLinked -> setTextViewCharSequence(textView, textBlockLinked), - throwable -> { - Log.e(TAG, "Unable to linkify text", throwable); - // this should never happen, but if it does, just fallback to it - setTextViewCharSequence(textView, chars); - })); - } - private static void setTextViewCharSequence(@NonNull final TextView textView, - final CharSequence charSequence) { + @Nullable final CharSequence charSequence) { textView.setText(charSequence); - textView.setMovementMethod(LinkMovementMethod.getInstance()); textView.setVisibility(View.VISIBLE); } } diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampExtractor.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampExtractor.java index a13c66402d5..d0862b750b7 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampExtractor.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampExtractor.java @@ -1,5 +1,8 @@ package org.schabi.newpipe.util.external_communication; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -15,17 +18,18 @@ private TimestampExtractor() { } /** - * Get's a single timestamp from a matcher. + * Gets a single timestamp from a matcher. * - * @param timestampMatches The matcher which was created using {@link #TIMESTAMPS_PATTERN} - * @param baseText The text where the pattern was applied to / - * where the matcher is based upon - * @return If a match occurred: a {@link TimestampMatchDTO} filled with information.
- * If not null. + * @param timestampMatches the matcher which was created using {@link #TIMESTAMPS_PATTERN} + * @param baseText the text where the pattern was applied to / where the matcher is + * based upon + * @return if a match occurred, a {@link TimestampMatchDTO} filled with information, otherwise + * {@code null}. */ + @Nullable public static TimestampMatchDTO getTimestampFromMatcher( - final Matcher timestampMatches, - final String baseText) { + @NonNull final Matcher timestampMatches, + @NonNull final String baseText) { int timestampStart = timestampMatches.start(1); if (timestampStart == -1) { timestampStart = timestampMatches.start(2); diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampLongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampLongPressClickableSpan.java new file mode 100644 index 00000000000..0ecbc836762 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampLongPressClickableSpan.java @@ -0,0 +1,75 @@ +package org.schabi.newpipe.util.external_communication; + +import static org.schabi.newpipe.util.external_communication.InternalUrlsHandler.playOnPopup; + +import android.content.Context; +import android.view.View; + +import androidx.annotation.NonNull; + +import org.schabi.newpipe.extractor.ServiceList; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.stream.StreamInfo; +import org.schabi.newpipe.views.LongPressClickableSpan; + +import io.reactivex.rxjava3.disposables.CompositeDisposable; + +final class TimestampLongPressClickableSpan extends LongPressClickableSpan { + + @NonNull + private final Context context; + @NonNull + private final String descriptionText; + @NonNull + private final CompositeDisposable disposables; + @NonNull + private final StreamInfo streamInfo; + @NonNull + private final TimestampExtractor.TimestampMatchDTO timestampMatchDTO; + + TimestampLongPressClickableSpan( + @NonNull final Context context, + @NonNull final String descriptionText, + @NonNull final CompositeDisposable disposables, + @NonNull final StreamInfo streamInfo, + @NonNull final TimestampExtractor.TimestampMatchDTO timestampMatchDTO) { + this.context = context; + this.descriptionText = descriptionText; + this.disposables = disposables; + this.streamInfo = streamInfo; + this.timestampMatchDTO = timestampMatchDTO; + } + + @Override + public void onClick(@NonNull final View view) { + playOnPopup(context, streamInfo.getUrl(), streamInfo.getService(), + timestampMatchDTO.seconds(), disposables); + } + + @Override + public void onLongClick(@NonNull final View view) { + ShareUtils.copyToClipboard(context, + getTimestampTextToCopy(streamInfo, descriptionText, timestampMatchDTO)); + } + + @NonNull + private static String getTimestampTextToCopy( + @NonNull final StreamInfo relatedInfo, + @NonNull final String descriptionText, + @NonNull final TimestampExtractor.TimestampMatchDTO timestampMatchDTO) { + // TODO: use extractor methods to get timestamps when this feature will be implemented in it + final StreamingService streamingService = relatedInfo.getService(); + if (streamingService == ServiceList.YouTube) { + return relatedInfo.getUrl() + "&t=" + timestampMatchDTO.seconds(); + } else if (streamingService == ServiceList.SoundCloud + || streamingService == ServiceList.MediaCCC) { + return relatedInfo.getUrl() + "#t=" + timestampMatchDTO.seconds(); + } else if (streamingService == ServiceList.PeerTube) { + return relatedInfo.getUrl() + "?start=" + timestampMatchDTO.seconds(); + } + + // Return timestamp text for other services + return descriptionText.subSequence(timestampMatchDTO.timestampStart(), + timestampMatchDTO.timestampEnd()).toString(); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/UrlLongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/UrlLongPressClickableSpan.java new file mode 100644 index 00000000000..f6cee708f44 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/UrlLongPressClickableSpan.java @@ -0,0 +1,41 @@ +package org.schabi.newpipe.util.external_communication; + +import android.content.Context; +import android.view.View; + +import androidx.annotation.NonNull; + +import org.schabi.newpipe.views.LongPressClickableSpan; + +import io.reactivex.rxjava3.disposables.CompositeDisposable; + +final class UrlLongPressClickableSpan extends LongPressClickableSpan { + + @NonNull + private final Context context; + @NonNull + private final CompositeDisposable disposables; + @NonNull + private final String url; + + UrlLongPressClickableSpan(@NonNull final Context context, + @NonNull final CompositeDisposable disposables, + @NonNull final String url) { + this.context = context; + this.disposables = disposables; + this.url = url; + } + + @Override + public void onClick(@NonNull final View view) { + if (!InternalUrlsHandler.handleUrlDescriptionTimestamp( + disposables, context, url)) { + ShareUtils.openUrlInBrowser(context, url, false); + } + } + + @Override + public void onLongClick(@NonNull final View view) { + ShareUtils.copyToClipboard(context, url); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/views/LongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/views/LongPressClickableSpan.java new file mode 100644 index 00000000000..d6b927a3090 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/views/LongPressClickableSpan.java @@ -0,0 +1,12 @@ +package org.schabi.newpipe.views; + +import android.text.style.ClickableSpan; +import android.view.View; + +import androidx.annotation.NonNull; + +public abstract class LongPressClickableSpan extends ClickableSpan { + + public abstract void onLongClick(@NonNull View view); + +} diff --git a/app/src/main/java/org/schabi/newpipe/views/LongPressLinkMovementMethod.java b/app/src/main/java/org/schabi/newpipe/views/LongPressLinkMovementMethod.java new file mode 100644 index 00000000000..5f90284fc24 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/views/LongPressLinkMovementMethod.java @@ -0,0 +1,77 @@ +package org.schabi.newpipe.views; + +import static org.schabi.newpipe.util.TouchUtils.getOffsetForHorizontalLine; + +import android.os.Handler; +import android.os.Looper; +import android.text.Selection; +import android.text.Spannable; +import android.text.method.LinkMovementMethod; +import android.text.method.MovementMethod; +import android.view.MotionEvent; +import android.view.ViewConfiguration; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +// Class adapted from https://stackoverflow.com/a/31786969 + +public class LongPressLinkMovementMethod extends LinkMovementMethod { + + private static final int LONG_PRESS_TIME = ViewConfiguration.getLongPressTimeout(); + + private static LongPressLinkMovementMethod instance; + + private Handler longClickHandler; + private boolean isLongPressed = false; + + @Override + public boolean onTouchEvent(@NonNull final TextView widget, + @NonNull final Spannable buffer, + @NonNull final MotionEvent event) { + final int action = event.getAction(); + + if (action == MotionEvent.ACTION_CANCEL && longClickHandler != null) { + longClickHandler.removeCallbacksAndMessages(null); + } + + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { + final int offset = getOffsetForHorizontalLine(widget, event); + final LongPressClickableSpan[] link = buffer.getSpans(offset, offset, + LongPressClickableSpan.class); + + if (link.length != 0) { + if (action == MotionEvent.ACTION_UP) { + if (longClickHandler != null) { + longClickHandler.removeCallbacksAndMessages(null); + } + if (!isLongPressed) { + link[0].onClick(widget); + } + isLongPressed = false; + } else { + Selection.setSelection(buffer, buffer.getSpanStart(link[0]), + buffer.getSpanEnd(link[0])); + if (longClickHandler != null) { + longClickHandler.postDelayed(() -> { + link[0].onLongClick(widget); + isLongPressed = true; + }, LONG_PRESS_TIME); + } + } + return true; + } + } + + return super.onTouchEvent(widget, buffer, event); + } + + public static MovementMethod getInstance() { + if (instance == null) { + instance = new LongPressLinkMovementMethod(); + instance.longClickHandler = new Handler(Looper.myLooper()); + } + + return instance; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/views/NewPipeEditText.java b/app/src/main/java/org/schabi/newpipe/views/NewPipeEditText.java index 2adc28d0e5e..f0993055e70 100644 --- a/app/src/main/java/org/schabi/newpipe/views/NewPipeEditText.java +++ b/app/src/main/java/org/schabi/newpipe/views/NewPipeEditText.java @@ -13,9 +13,10 @@ /** * An {@link AppCompatEditText} which uses {@link ShareUtils#shareText(Context, String, String)} * when sharing selected text by using the {@code Share} command of the floating actions. + * *

- * This allows NewPipe to show Android share sheet instead of EMUI share sheet when sharing text - * from {@link AppCompatEditText} on EMUI devices. + * This class allows NewPipe to show Android share sheet instead of EMUI share sheet when sharing + * text from {@link AppCompatEditText} on EMUI devices. *

*/ public class NewPipeEditText extends AppCompatEditText { diff --git a/app/src/main/java/org/schabi/newpipe/views/NewPipeTextView.java b/app/src/main/java/org/schabi/newpipe/views/NewPipeTextView.java index 8fdac32db7e..dd3f20f404d 100644 --- a/app/src/main/java/org/schabi/newpipe/views/NewPipeTextView.java +++ b/app/src/main/java/org/schabi/newpipe/views/NewPipeTextView.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.views; import android.content.Context; +import android.text.method.MovementMethod; import android.util.AttributeSet; import androidx.annotation.NonNull; @@ -13,9 +14,11 @@ /** * An {@link AppCompatTextView} which uses {@link ShareUtils#shareText(Context, String, String)} * when sharing selected text by using the {@code Share} command of the floating actions. + * *

- * This allows NewPipe to show Android share sheet instead of EMUI share sheet when sharing text - * from {@link AppCompatTextView} on EMUI devices. + * This class allows NewPipe to show Android share sheet instead of EMUI share sheet when sharing + * text from {@link AppCompatTextView} on EMUI devices and also to keep movement method set when a + * text change occurs, if the text cannot be selected and text links are clickable. *

*/ public class NewPipeTextView extends AppCompatTextView { @@ -34,6 +37,16 @@ public NewPipeTextView(@NonNull final Context context, super(context, attrs, defStyleAttr); } + @Override + public void setText(final CharSequence text, final BufferType type) { + // We need to set again the movement method after a text change because Android resets the + // movement method to the default one in the case where the text cannot be selected and + // text links are clickable (which is the default case in NewPipe). + final MovementMethod movementMethod = this.getMovementMethod(); + super.setText(text, type); + setMovementMethod(movementMethod); + } + @Override public boolean onTextContextMenuItem(final int id) { if (id == android.R.id.shareText) { diff --git a/app/src/main/res/layout/item_metadata.xml b/app/src/main/res/layout/item_metadata.xml index 31dedd88059..251b9e83236 100644 --- a/app/src/main/res/layout/item_metadata.xml +++ b/app/src/main/res/layout/item_metadata.xml @@ -6,7 +6,7 @@ android:layout_height="wrap_content" android:paddingVertical="6dp"> - - Importer ou exporter des abonnements à partir du menu Vous utilisez la dernière version de NewPipe Appuyez pour télécharger %s + Échec de la copie dans le presse-papiers \ 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 c9e0bb49290..2deb14d8d8c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -327,6 +327,7 @@ Calculating hash Please wait… Copied to clipboard + Failed to copy to clipboard Please define a download folder later in settings No download folder set yet, choose the default download folder now This permission is needed to\nopen in popup mode From 22c201be3967cf98e9c9a0a0f9463d5ec3737e0f Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 15 Jan 2023 11:51:07 +0100 Subject: [PATCH 037/645] Create text subpackage in util --- .../newpipe/fragments/detail/DescriptionFragment.java | 2 +- .../info_list/holder/CommentsMiniInfoItemHolder.java | 4 ++-- .../java/org/schabi/newpipe/util/ExtractorHelper.java | 2 +- .../util/{ => text}/CommentTextOnTouchListener.java | 5 ++--- .../HashtagLongPressClickableSpan.java | 4 ++-- .../InternalUrlsHandler.java | 2 +- .../{views => util/text}/LongPressClickableSpan.java | 2 +- .../{views => util/text}/LongPressLinkMovementMethod.java | 4 ++-- .../{external_communication => text}/TextLinkifier.java | 8 +++----- .../TimestampExtractor.java | 2 +- .../TimestampLongPressClickableSpan.java | 6 +++--- .../org/schabi/newpipe/util/{ => text}/TouchUtils.java | 2 +- .../UrlLongPressClickableSpan.java | 4 ++-- .../external_communication/TimestampExtractorTest.java | 1 + 14 files changed, 23 insertions(+), 25 deletions(-) rename app/src/main/java/org/schabi/newpipe/util/{ => text}/CommentTextOnTouchListener.java (91%) rename app/src/main/java/org/schabi/newpipe/util/{external_communication => text}/HashtagLongPressClickableSpan.java (90%) rename app/src/main/java/org/schabi/newpipe/util/{external_communication => text}/InternalUrlsHandler.java (99%) rename app/src/main/java/org/schabi/newpipe/{views => util/text}/LongPressClickableSpan.java (86%) rename app/src/main/java/org/schabi/newpipe/{views => util/text}/LongPressLinkMovementMethod.java (95%) rename app/src/main/java/org/schabi/newpipe/util/{external_communication => text}/TextLinkifier.java (98%) rename app/src/main/java/org/schabi/newpipe/util/{external_communication => text}/TimestampExtractor.java (98%) rename app/src/main/java/org/schabi/newpipe/util/{external_communication => text}/TimestampLongPressClickableSpan.java (93%) rename app/src/main/java/org/schabi/newpipe/util/{ => text}/TouchUtils.java (96%) rename app/src/main/java/org/schabi/newpipe/util/{external_communication => text}/UrlLongPressClickableSpan.java (90%) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java index 96e01c622cf..ea89424ece2 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java @@ -29,7 +29,7 @@ import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.external_communication.ShareUtils; -import org.schabi.newpipe.util.external_communication.TextLinkifier; +import org.schabi.newpipe.util.text.TextLinkifier; import icepick.State; import io.reactivex.rxjava3.disposables.CompositeDisposable; 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 92e37afd8d4..69aba8c4f18 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 @@ -20,13 +20,13 @@ import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.CommentTextOnTouchListener; +import org.schabi.newpipe.util.text.CommentTextOnTouchListener; import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PicassoHelper; import org.schabi.newpipe.util.external_communication.ShareUtils; -import org.schabi.newpipe.util.external_communication.TimestampExtractor; +import org.schabi.newpipe.util.text.TimestampExtractor; import java.util.Objects; 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 27009efd192..2123010aaff 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -51,7 +51,7 @@ import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.extractor.suggestion.SuggestionExtractor; -import org.schabi.newpipe.util.external_communication.TextLinkifier; +import org.schabi.newpipe.util.text.TextLinkifier; import java.util.Collections; import java.util.List; diff --git a/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java b/app/src/main/java/org/schabi/newpipe/util/text/CommentTextOnTouchListener.java similarity index 91% rename from app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java rename to app/src/main/java/org/schabi/newpipe/util/text/CommentTextOnTouchListener.java index ff8875e5aab..4ced4be77ac 100644 --- a/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/CommentTextOnTouchListener.java @@ -1,6 +1,6 @@ -package org.schabi.newpipe.util; +package org.schabi.newpipe.util.text; -import static org.schabi.newpipe.util.TouchUtils.getOffsetForHorizontalLine; +import static org.schabi.newpipe.util.text.TouchUtils.getOffsetForHorizontalLine; import android.text.Selection; import android.text.Spannable; @@ -12,7 +12,6 @@ import android.widget.TextView; import org.schabi.newpipe.util.external_communication.ShareUtils; -import org.schabi.newpipe.util.external_communication.InternalUrlsHandler; import io.reactivex.rxjava3.disposables.CompositeDisposable; diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/HashtagLongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/text/HashtagLongPressClickableSpan.java similarity index 90% rename from app/src/main/java/org/schabi/newpipe/util/external_communication/HashtagLongPressClickableSpan.java rename to app/src/main/java/org/schabi/newpipe/util/text/HashtagLongPressClickableSpan.java index 9acedc12be1..4ca6c326efb 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/HashtagLongPressClickableSpan.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/HashtagLongPressClickableSpan.java @@ -1,4 +1,4 @@ -package org.schabi.newpipe.util.external_communication; +package org.schabi.newpipe.util.text; import android.content.Context; import android.view.View; @@ -7,7 +7,7 @@ import org.schabi.newpipe.extractor.Info; import org.schabi.newpipe.util.NavigationHelper; -import org.schabi.newpipe.views.LongPressClickableSpan; +import org.schabi.newpipe.util.external_communication.ShareUtils; final class HashtagLongPressClickableSpan extends LongPressClickableSpan { diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/InternalUrlsHandler.java b/app/src/main/java/org/schabi/newpipe/util/text/InternalUrlsHandler.java similarity index 99% rename from app/src/main/java/org/schabi/newpipe/util/external_communication/InternalUrlsHandler.java rename to app/src/main/java/org/schabi/newpipe/util/text/InternalUrlsHandler.java index c46e6636d1f..b87618922a3 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/InternalUrlsHandler.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/InternalUrlsHandler.java @@ -1,4 +1,4 @@ -package org.schabi.newpipe.util.external_communication; +package org.schabi.newpipe.util.text; import android.content.Context; import android.util.Log; diff --git a/app/src/main/java/org/schabi/newpipe/views/LongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/text/LongPressClickableSpan.java similarity index 86% rename from app/src/main/java/org/schabi/newpipe/views/LongPressClickableSpan.java rename to app/src/main/java/org/schabi/newpipe/util/text/LongPressClickableSpan.java index d6b927a3090..5c94a58508e 100644 --- a/app/src/main/java/org/schabi/newpipe/views/LongPressClickableSpan.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/LongPressClickableSpan.java @@ -1,4 +1,4 @@ -package org.schabi.newpipe.views; +package org.schabi.newpipe.util.text; import android.text.style.ClickableSpan; import android.view.View; diff --git a/app/src/main/java/org/schabi/newpipe/views/LongPressLinkMovementMethod.java b/app/src/main/java/org/schabi/newpipe/util/text/LongPressLinkMovementMethod.java similarity index 95% rename from app/src/main/java/org/schabi/newpipe/views/LongPressLinkMovementMethod.java rename to app/src/main/java/org/schabi/newpipe/util/text/LongPressLinkMovementMethod.java index 5f90284fc24..bd57621cb73 100644 --- a/app/src/main/java/org/schabi/newpipe/views/LongPressLinkMovementMethod.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/LongPressLinkMovementMethod.java @@ -1,6 +1,6 @@ -package org.schabi.newpipe.views; +package org.schabi.newpipe.util.text; -import static org.schabi.newpipe.util.TouchUtils.getOffsetForHorizontalLine; +import static org.schabi.newpipe.util.text.TouchUtils.getOffsetForHorizontalLine; import android.os.Handler; import android.os.Looper; diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/TextLinkifier.java b/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java similarity index 98% rename from app/src/main/java/org/schabi/newpipe/util/external_communication/TextLinkifier.java rename to app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java index 1bbd37cf53a..b7220d22f96 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/TextLinkifier.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java @@ -1,4 +1,4 @@ -package org.schabi.newpipe.util.external_communication; +package org.schabi.newpipe.util.text; import android.content.Context; import android.text.SpannableStringBuilder; @@ -15,8 +15,7 @@ import org.schabi.newpipe.extractor.Info; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.util.NavigationHelper; -import org.schabi.newpipe.views.LongPressClickableSpan; -import org.schabi.newpipe.views.LongPressLinkMovementMethod; +import org.schabi.newpipe.util.external_communication.ShareUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -88,8 +87,7 @@ public static void createLinksFromPlainText(@NonNull final TextView textView, @NonNull final CompositeDisposable disposables) { textView.setAutoLinkMask(Linkify.WEB_URLS); textView.setText(plainTextBlock, TextView.BufferType.SPANNABLE); - changeIntentsOfDescriptionLinks(textView, textView.getText(), relatedInfo, disposables - ); + changeIntentsOfDescriptionLinks(textView, textView.getText(), relatedInfo, disposables); } /** diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampExtractor.java b/app/src/main/java/org/schabi/newpipe/util/text/TimestampExtractor.java similarity index 98% rename from app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampExtractor.java rename to app/src/main/java/org/schabi/newpipe/util/text/TimestampExtractor.java index d0862b750b7..be603f41aa5 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampExtractor.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/TimestampExtractor.java @@ -1,4 +1,4 @@ -package org.schabi.newpipe.util.external_communication; +package org.schabi.newpipe.util.text; import androidx.annotation.NonNull; import androidx.annotation.Nullable; diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampLongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.java similarity index 93% rename from app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampLongPressClickableSpan.java rename to app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.java index 0ecbc836762..48110312d37 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/TimestampLongPressClickableSpan.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.java @@ -1,6 +1,6 @@ -package org.schabi.newpipe.util.external_communication; +package org.schabi.newpipe.util.text; -import static org.schabi.newpipe.util.external_communication.InternalUrlsHandler.playOnPopup; +import static org.schabi.newpipe.util.text.InternalUrlsHandler.playOnPopup; import android.content.Context; import android.view.View; @@ -10,7 +10,7 @@ import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.stream.StreamInfo; -import org.schabi.newpipe.views.LongPressClickableSpan; +import org.schabi.newpipe.util.external_communication.ShareUtils; import io.reactivex.rxjava3.disposables.CompositeDisposable; diff --git a/app/src/main/java/org/schabi/newpipe/util/TouchUtils.java b/app/src/main/java/org/schabi/newpipe/util/text/TouchUtils.java similarity index 96% rename from app/src/main/java/org/schabi/newpipe/util/TouchUtils.java rename to app/src/main/java/org/schabi/newpipe/util/text/TouchUtils.java index 23bc5a4011f..5c0db20a30b 100644 --- a/app/src/main/java/org/schabi/newpipe/util/TouchUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/TouchUtils.java @@ -1,4 +1,4 @@ -package org.schabi.newpipe.util; +package org.schabi.newpipe.util.text; import android.text.Layout; import android.view.MotionEvent; diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/UrlLongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/text/UrlLongPressClickableSpan.java similarity index 90% rename from app/src/main/java/org/schabi/newpipe/util/external_communication/UrlLongPressClickableSpan.java rename to app/src/main/java/org/schabi/newpipe/util/text/UrlLongPressClickableSpan.java index f6cee708f44..eb0d7425eeb 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/UrlLongPressClickableSpan.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/UrlLongPressClickableSpan.java @@ -1,11 +1,11 @@ -package org.schabi.newpipe.util.external_communication; +package org.schabi.newpipe.util.text; import android.content.Context; import android.view.View; import androidx.annotation.NonNull; -import org.schabi.newpipe.views.LongPressClickableSpan; +import org.schabi.newpipe.util.external_communication.ShareUtils; import io.reactivex.rxjava3.disposables.CompositeDisposable; diff --git a/app/src/test/java/org/schabi/newpipe/util/external_communication/TimestampExtractorTest.java b/app/src/test/java/org/schabi/newpipe/util/external_communication/TimestampExtractorTest.java index 10e23883f9e..47853bd7fe4 100644 --- a/app/src/test/java/org/schabi/newpipe/util/external_communication/TimestampExtractorTest.java +++ b/app/src/test/java/org/schabi/newpipe/util/external_communication/TimestampExtractorTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.schabi.newpipe.util.text.TimestampExtractor; import java.time.Duration; import java.util.Arrays; From 7924bb5b6b039509931d5035c172645495f5391d Mon Sep 17 00:00:00 2001 From: Mahendran Date: Thu, 3 Nov 2022 00:26:10 +0530 Subject: [PATCH 038/645] Thumbnails used in NewPipe are small (list/grid) mode. This PR facilitates full width thumbnails and dubbed as card mode. --- .../fragments/list/BaseListFragment.java | 31 +++--- .../list/comments/CommentsFragment.java | 5 +- .../list/playlist/PlaylistFragment.java | 2 + .../list/videos/RelatedItemsFragment.java | 10 +- .../newpipe/info_list/InfoListAdapter.java | 46 +++++++-- .../newpipe/info_list/ItemViewMode.java | 23 +++++ .../holder/PlaylistCardInfoItemHolder.java | 17 ++++ .../holder/StreamCardInfoItemHolder.java | 16 +++ .../newpipe/local/BaseLocalListFragment.java | 24 +++-- .../newpipe/local/LocalItemListAdapter.java | 69 ++++++++++--- .../schabi/newpipe/local/feed/FeedFragment.kt | 11 ++- .../newpipe/local/feed/item/StreamItem.kt | 3 +- .../holder/LocalPlaylistCardItemHolder.java | 17 ++++ .../LocalPlaylistStreamCardItemHolder.java | 17 ++++ .../LocalStatisticStreamCardItemHolder.java | 13 +++ .../holder/RemotePlaylistCardItemHolder.java | 17 ++++ .../org/schabi/newpipe/util/ThemeHelper.java | 47 ++++++--- .../res/layout/list_playlist_card_item.xml | 92 +++++++++++++++++ .../main/res/layout/list_stream_card_item.xml | 99 +++++++++++++++++++ .../layout/list_stream_playlist_card_item.xml | 96 ++++++++++++++++++ app/src/main/res/values-w820dp/dimens.xml | 3 + app/src/main/res/values/dimens.xml | 8 ++ app/src/main/res/values/settings_keys.xml | 3 + app/src/main/res/values/strings.xml | 1 + 24 files changed, 601 insertions(+), 69 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.java create mode 100644 app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistCardInfoItemHolder.java create mode 100644 app/src/main/java/org/schabi/newpipe/info_list/holder/StreamCardInfoItemHolder.java create mode 100644 app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistCardItemHolder.java create mode 100644 app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamCardItemHolder.java create mode 100644 app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamCardItemHolder.java create mode 100644 app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistCardItemHolder.java create mode 100644 app/src/main/res/layout/list_playlist_card_item.xml create mode 100644 app/src/main/res/layout/list_stream_card_item.xml create mode 100644 app/src/main/res/layout/list_stream_playlist_card_item.xml 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 1212cf4ad5c..0b0acff8600 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 @@ -26,6 +26,7 @@ import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.info_list.InfoListAdapter; +import org.schabi.newpipe.info_list.ItemViewMode; import org.schabi.newpipe.info_list.dialog.InfoItemDialog; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; @@ -91,11 +92,7 @@ public void onResume() { if (updateFlags != 0) { if ((updateFlags & LIST_MODE_UPDATE_FLAG) != 0) { - final boolean useGrid = isGridLayout(); - itemsList.setLayoutManager(useGrid - ? getGridLayoutManager() : getListLayoutManager()); - infoListAdapter.setUseGridVariant(useGrid); - infoListAdapter.notifyDataSetChanged(); + refreshItemViewMode(); } updateFlags = 0; } @@ -221,15 +218,23 @@ protected RecyclerView.LayoutManager getGridLayoutManager() { return lm; } + /** + * Updates the item view mode based on user preference. + */ + private void refreshItemViewMode() { + final ItemViewMode itemViewMode = getItemViewMode(); + itemsList.setLayoutManager((itemViewMode == ItemViewMode.GRID) + ? getGridLayoutManager() : getListLayoutManager()); + infoListAdapter.setItemViewMode(itemViewMode); + infoListAdapter.notifyDataSetChanged(); + } + @Override protected void initViews(final View rootView, final Bundle savedInstanceState) { super.initViews(rootView, savedInstanceState); - final boolean useGrid = isGridLayout(); itemsList = rootView.findViewById(R.id.items_list); - itemsList.setLayoutManager(useGrid ? getGridLayoutManager() : getListLayoutManager()); - - infoListAdapter.setUseGridVariant(useGrid); + refreshItemViewMode(); final Supplier listHeaderSupplier = getListHeaderSupplier(); if (listHeaderSupplier != null) { @@ -474,7 +479,11 @@ public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, } } - protected boolean isGridLayout() { - return ThemeHelper.shouldUseGridLayout(activity); + /** + * Returns preferred item view mode. + * @return ItemViewMode + */ + protected ItemViewMode getItemViewMode() { + return ThemeHelper.getItemViewMode(requireContext()); } } 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 3b092cc2885..5a5f8496870 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 @@ -17,6 +17,7 @@ import org.schabi.newpipe.extractor.comments.CommentsInfo; import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; +import org.schabi.newpipe.info_list.ItemViewMode; import org.schabi.newpipe.ktx.ViewUtils; import org.schabi.newpipe.util.ExtractorHelper; @@ -106,7 +107,7 @@ public void onCreateOptionsMenu(@NonNull final Menu menu, @NonNull final MenuInflater inflater) { } @Override - protected boolean isGridLayout() { - return false; + protected ItemViewMode getItemViewMode() { + return ItemViewMode.LIST; } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index a3150a77307..8dd77bed65a 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -132,6 +132,8 @@ protected Supplier getListHeaderSupplier() { protected void initViews(final View rootView, final Bundle savedInstanceState) { super.initViews(rootView, savedInstanceState); + // Is mini variant still relevant? + // Only the remote playlist screen uses it now infoListAdapter.setUseMiniVariant(true); } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java index f0ece69f37c..dc5dbd74f14 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java @@ -19,6 +19,7 @@ import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; +import org.schabi.newpipe.info_list.ItemViewMode; import org.schabi.newpipe.ktx.ViewUtils; import org.schabi.newpipe.util.RelatedItemInfo; @@ -167,7 +168,12 @@ public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, } @Override - protected boolean isGridLayout() { - return false; + protected ItemViewMode getItemViewMode() { + ItemViewMode mode = super.getItemViewMode(); + // Only list mode is supported. Either List or card will be used. + if (mode != ItemViewMode.LIST && mode != ItemViewMode.CARD) { + mode = ItemViewMode.LIST; + } + return mode; } } 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 fb27593e7e0..d69db945dc6 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 @@ -23,9 +23,11 @@ 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.PlaylistCardInfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistGridInfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistInfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistMiniInfoItemHolder; +import org.schabi.newpipe.info_list.holder.StreamCardInfoItemHolder; import org.schabi.newpipe.info_list.holder.StreamGridInfoItemHolder; import org.schabi.newpipe.info_list.holder.StreamInfoItemHolder; import org.schabi.newpipe.info_list.holder.StreamMiniInfoItemHolder; @@ -67,12 +69,14 @@ public class InfoListAdapter extends RecyclerView.Adapter headerSupplier = null; public InfoListAdapter(final Context context) { @@ -114,8 +119,8 @@ public void setUseMiniVariant(final boolean useMiniVariant) { this.useMiniVariant = useMiniVariant; } - public void setUseGridVariant(final boolean useGridVariant) { - this.useGridVariant = useGridVariant; + public void setItemViewMode(final ItemViewMode itemViewMode) { + this.itemMode = itemViewMode; } public void addInfoItemList(@Nullable final List data) { @@ -234,14 +239,33 @@ public int getItemViewType(int position) { final InfoItem item = infoItemList.get(position); switch (item.getInfoType()) { case STREAM: - return useGridVariant ? GRID_STREAM_HOLDER_TYPE : useMiniVariant - ? MINI_STREAM_HOLDER_TYPE : STREAM_HOLDER_TYPE; + if (itemMode == ItemViewMode.CARD) { + return CARD_STREAM_HOLDER_TYPE; + } else if (itemMode == ItemViewMode.GRID) { + return GRID_STREAM_HOLDER_TYPE; + } else if (useMiniVariant) { + return MINI_STREAM_HOLDER_TYPE; + } else { + return STREAM_HOLDER_TYPE; + } case CHANNEL: - return useGridVariant ? GRID_CHANNEL_HOLDER_TYPE : useMiniVariant - ? MINI_CHANNEL_HOLDER_TYPE : CHANNEL_HOLDER_TYPE; + if (itemMode == ItemViewMode.GRID) { + return GRID_CHANNEL_HOLDER_TYPE; + } else if (useMiniVariant) { + return MINI_CHANNEL_HOLDER_TYPE; + } else { + return CHANNEL_HOLDER_TYPE; + } case PLAYLIST: - return useGridVariant ? GRID_PLAYLIST_HOLDER_TYPE : useMiniVariant - ? MINI_PLAYLIST_HOLDER_TYPE : PLAYLIST_HOLDER_TYPE; + if (itemMode == ItemViewMode.CARD) { + return CARD_PLAYLIST_HOLDER_TYPE; + } else if (itemMode == ItemViewMode.GRID) { + return GRID_PLAYLIST_HOLDER_TYPE; + } else if (useMiniVariant) { + return MINI_PLAYLIST_HOLDER_TYPE; + } else { + return PLAYLIST_HOLDER_TYPE; + } case COMMENT: return useMiniVariant ? MINI_COMMENT_HOLDER_TYPE : COMMENT_HOLDER_TYPE; default: @@ -274,6 +298,8 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup paren return new StreamInfoItemHolder(infoItemBuilder, parent); case GRID_STREAM_HOLDER_TYPE: return new StreamGridInfoItemHolder(infoItemBuilder, parent); + case CARD_STREAM_HOLDER_TYPE: + return new StreamCardInfoItemHolder(infoItemBuilder, parent); case MINI_CHANNEL_HOLDER_TYPE: return new ChannelMiniInfoItemHolder(infoItemBuilder, parent); case CHANNEL_HOLDER_TYPE: @@ -286,6 +312,8 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup paren return new PlaylistInfoItemHolder(infoItemBuilder, parent); case GRID_PLAYLIST_HOLDER_TYPE: return new PlaylistGridInfoItemHolder(infoItemBuilder, parent); + case CARD_PLAYLIST_HOLDER_TYPE: + return new PlaylistCardInfoItemHolder(infoItemBuilder, parent); case MINI_COMMENT_HOLDER_TYPE: return new CommentsMiniInfoItemHolder(infoItemBuilder, parent); case COMMENT_HOLDER_TYPE: diff --git a/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.java b/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.java new file mode 100644 index 00000000000..447c540a0cd --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.java @@ -0,0 +1,23 @@ +package org.schabi.newpipe.info_list; + +/** + * Item view mode for streams & playlist listing screens. + */ +public enum ItemViewMode { + /** + * Default mode. + */ + AUTO, + /** + * Full width list item with thumb on the left and two line title & uploader in right. + */ + LIST, + /** + * Grid mode places two cards per row. + */ + GRID, + /** + * A full width card in phone - portrait. + */ + CARD +} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistCardInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistCardInfoItemHolder.java new file mode 100644 index 00000000000..f1682b4e4d8 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistCardInfoItemHolder.java @@ -0,0 +1,17 @@ +package org.schabi.newpipe.info_list.holder; + +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.info_list.InfoItemBuilder; + +/** + * Playlist card layout. + */ +public class PlaylistCardInfoItemHolder extends PlaylistMiniInfoItemHolder { + + public PlaylistCardInfoItemHolder(final InfoItemBuilder infoItemBuilder, + final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_playlist_card_item, parent); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamCardInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamCardInfoItemHolder.java new file mode 100644 index 00000000000..807bad6e06e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamCardInfoItemHolder.java @@ -0,0 +1,16 @@ +package org.schabi.newpipe.info_list.holder; + +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.info_list.InfoItemBuilder; + +/** + * Card layout for stream. + */ +public class StreamCardInfoItemHolder extends StreamInfoItemHolder { + + public StreamCardInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_stream_card_item, parent); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java b/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java index 7474537fafb..9fbdddc5932 100644 --- a/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java @@ -22,10 +22,11 @@ import org.schabi.newpipe.databinding.PignateFooterBinding; import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.fragments.list.ListViewContract; +import org.schabi.newpipe.info_list.ItemViewMode; import static org.schabi.newpipe.ktx.ViewUtils.animate; import static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling; -import static org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout; +import static org.schabi.newpipe.util.ThemeHelper.getItemViewMode; /** * This fragment is design to be used with persistent data such as @@ -77,16 +78,23 @@ public void onResume() { super.onResume(); if (updateFlags != 0) { if ((updateFlags & LIST_MODE_UPDATE_FLAG) != 0) { - final boolean useGrid = shouldUseGridLayout(requireContext()); - itemsList.setLayoutManager( - useGrid ? getGridLayoutManager() : getListLayoutManager()); - itemListAdapter.setUseGridVariant(useGrid); - itemListAdapter.notifyDataSetChanged(); + refreshItemViewMode(); } updateFlags = 0; } } + /** + * Updates the item view mode based on user preference. + */ + private void refreshItemViewMode() { + final ItemViewMode itemViewMode = getItemViewMode(requireContext()); + itemsList.setLayoutManager((itemViewMode == ItemViewMode.GRID) + ? getGridLayoutManager() : getListLayoutManager()); + itemListAdapter.setItemViewMode(itemViewMode); + itemListAdapter.notifyDataSetChanged(); + } + /*////////////////////////////////////////////////////////////////////////// // Lifecycle - View //////////////////////////////////////////////////////////////////////////*/ @@ -120,11 +128,9 @@ protected void initViews(final View rootView, final Bundle savedInstanceState) { itemListAdapter = new LocalItemListAdapter(activity); - final boolean useGrid = shouldUseGridLayout(requireContext()); itemsList = rootView.findViewById(R.id.items_list); - itemsList.setLayoutManager(useGrid ? getGridLayoutManager() : getListLayoutManager()); + refreshItemViewMode(); - itemListAdapter.setUseGridVariant(useGrid); headerRootBinding = getListHeader(); if (headerRootBinding != null) { itemListAdapter.setHeader(headerRootBinding.getRoot()); diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index 05e2fdac083..b9409cb9d7e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -12,14 +12,19 @@ import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.stream.model.StreamStateEntity; +import org.schabi.newpipe.info_list.ItemViewMode; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.local.holder.LocalItemHolder; +import org.schabi.newpipe.local.holder.LocalPlaylistCardItemHolder; import org.schabi.newpipe.local.holder.LocalPlaylistGridItemHolder; import org.schabi.newpipe.local.holder.LocalPlaylistItemHolder; +import org.schabi.newpipe.local.holder.LocalPlaylistStreamCardItemHolder; import org.schabi.newpipe.local.holder.LocalPlaylistStreamGridItemHolder; import org.schabi.newpipe.local.holder.LocalPlaylistStreamItemHolder; +import org.schabi.newpipe.local.holder.LocalStatisticStreamCardItemHolder; import org.schabi.newpipe.local.holder.LocalStatisticStreamGridItemHolder; import org.schabi.newpipe.local.holder.LocalStatisticStreamItemHolder; +import org.schabi.newpipe.local.holder.RemotePlaylistCardItemHolder; import org.schabi.newpipe.local.holder.RemotePlaylistGridItemHolder; import org.schabi.newpipe.local.holder.RemotePlaylistItemHolder; import org.schabi.newpipe.util.FallbackViewHolder; @@ -61,11 +66,17 @@ public class LocalItemListAdapter extends RecyclerView.Adapter localItems; @@ -73,9 +84,9 @@ public class LocalItemListAdapter extends RecyclerView.Adapter() { @SuppressLint("StringFormatMatches") private fun handleLoadedState(loadedState: FeedState.LoadedState) { - - val itemVersion = if (shouldUseGridLayout(context)) { - StreamItem.ItemVersion.GRID - } else { - StreamItem.ItemVersion.NORMAL + val itemVersion = when (getItemViewMode(requireContext())) { + ItemViewMode.GRID -> StreamItem.ItemVersion.GRID + ItemViewMode.CARD -> StreamItem.ItemVersion.CARD + else -> StreamItem.ItemVersion.NORMAL } loadedState.items.forEach { it.itemVersion = itemVersion } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt b/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt index 96d395aa505..d795dcb08df 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt @@ -42,12 +42,13 @@ data class StreamItem( override fun getId(): Long = stream.uid - enum class ItemVersion { NORMAL, MINI, GRID } + enum class ItemVersion { NORMAL, MINI, GRID, CARD } override fun getLayout(): Int = when (itemVersion) { ItemVersion.NORMAL -> R.layout.list_stream_item ItemVersion.MINI -> R.layout.list_stream_mini_item ItemVersion.GRID -> R.layout.list_stream_grid_item + ItemVersion.CARD -> R.layout.list_stream_card_item } override fun initializeViewBinding(view: View) = ListStreamItemBinding.bind(view) diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistCardItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistCardItemHolder.java new file mode 100644 index 00000000000..33418ec987b --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistCardItemHolder.java @@ -0,0 +1,17 @@ +package org.schabi.newpipe.local.holder; + +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.local.LocalItemBuilder; + +/** + * Playlist card layout. + */ +public class LocalPlaylistCardItemHolder extends LocalPlaylistItemHolder { + + public LocalPlaylistCardItemHolder(final LocalItemBuilder infoItemBuilder, + final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_playlist_card_item, parent); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamCardItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamCardItemHolder.java new file mode 100644 index 00000000000..7f81a527fda --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamCardItemHolder.java @@ -0,0 +1,17 @@ +package org.schabi.newpipe.local.holder; + +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.local.LocalItemBuilder; + +/** + * Local playlist stream UI. This also includes a handle to rearrange the videos. + */ +public class LocalPlaylistStreamCardItemHolder extends LocalPlaylistStreamItemHolder { + + public LocalPlaylistStreamCardItemHolder(final LocalItemBuilder infoItemBuilder, + final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_stream_playlist_card_item, parent); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamCardItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamCardItemHolder.java new file mode 100644 index 00000000000..4e03d5fb105 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamCardItemHolder.java @@ -0,0 +1,13 @@ +package org.schabi.newpipe.local.holder; + +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.local.LocalItemBuilder; + +public class LocalStatisticStreamCardItemHolder extends LocalStatisticStreamItemHolder { + public LocalStatisticStreamCardItemHolder(final LocalItemBuilder infoItemBuilder, + final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_stream_card_item, parent); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistCardItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistCardItemHolder.java new file mode 100644 index 00000000000..74a67c3db1e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistCardItemHolder.java @@ -0,0 +1,17 @@ +package org.schabi.newpipe.local.holder; + +import android.view.ViewGroup; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.local.LocalItemBuilder; + +/** + * Playlist card UI for list item. + */ +public class RemotePlaylistCardItemHolder extends RemotePlaylistItemHolder { + + public RemotePlaylistCardItemHolder(final LocalItemBuilder infoItemBuilder, + final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_playlist_card_item, parent); + } +} 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 ea22e9368f5..ab74e0305cd 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java @@ -41,6 +41,7 @@ import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.info_list.ItemViewMode; public final class ThemeHelper { private ThemeHelper() { @@ -332,7 +333,6 @@ public static void setDayNightMode(final Context context, final String selectedT } } - /** * Returns whether the grid layout or the list layout should be used. If the user set "auto" * mode in settings, decides based on screen orientation (landscape) and size. @@ -341,19 +341,8 @@ public static void setDayNightMode(final Context context, final String selectedT * @return true:use grid layout, false:use list layout */ public static boolean shouldUseGridLayout(final Context context) { - final String listMode = PreferenceManager.getDefaultSharedPreferences(context) - .getString(context.getString(R.string.list_view_mode_key), - context.getString(R.string.list_view_mode_value)); - - if (listMode.equals(context.getString(R.string.list_view_mode_list_key))) { - return false; - } else if (listMode.equals(context.getString(R.string.list_view_mode_grid_key))) { - return true; - } else /* listMode.equals("auto") */ { - final Configuration configuration = context.getResources().getConfiguration(); - return configuration.orientation == Configuration.ORIENTATION_LANDSCAPE - && configuration.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE); - } + final ItemViewMode mode = getItemViewMode(context); + return mode == ItemViewMode.GRID; } /** @@ -367,6 +356,36 @@ public static int getGridSpanCountChannels(final Context context) { context.getResources().getDimensionPixelSize(R.dimen.channel_item_grid_min_width)); } + /** + * Returns item view mode. + * @param context to read preference and parse string + * @return Returns one of ItemViewMode + */ + public static ItemViewMode getItemViewMode(final Context context) { + final String listMode = PreferenceManager.getDefaultSharedPreferences(context) + .getString(context.getString(R.string.list_view_mode_key), + context.getString(R.string.list_view_mode_value)); + final ItemViewMode result; + if (listMode.equals(context.getString(R.string.list_view_mode_list_key))) { + result = ItemViewMode.LIST; + } else if (listMode.equals(context.getString(R.string.list_view_mode_grid_key))) { + result = ItemViewMode.GRID; + } else if (listMode.equals(context.getString(R.string.list_view_mode_card_key))) { + result = ItemViewMode.CARD; + } else { + // Auto mode - evaluate whether to use Grid based on screen real estate. + final Configuration configuration = context.getResources().getConfiguration(); + final boolean useGrid = configuration.orientation == Configuration.ORIENTATION_LANDSCAPE + && configuration.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE); + if (useGrid) { + result = ItemViewMode.GRID; + } else { + result = ItemViewMode.LIST; + } + } + return result; + } + /** * Calculates the number of grid stream info items that can fit horizontally on the screen. The * width of a grid stream info item is obtained from the thumbnail width plus the right and left diff --git a/app/src/main/res/layout/list_playlist_card_item.xml b/app/src/main/res/layout/list_playlist_card_item.xml new file mode 100644 index 00000000000..c7dd4f17c5a --- /dev/null +++ b/app/src/main/res/layout/list_playlist_card_item.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_stream_card_item.xml b/app/src/main/res/layout/list_stream_card_item.xml new file mode 100644 index 00000000000..968dca08267 --- /dev/null +++ b/app/src/main/res/layout/list_stream_card_item.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_stream_playlist_card_item.xml b/app/src/main/res/layout/list_stream_playlist_card_item.xml new file mode 100644 index 00000000000..9cc6b326c31 --- /dev/null +++ b/app/src/main/res/layout/list_stream_playlist_card_item.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml index 63fc8164446..817cd8f8563 100644 --- a/app/src/main/res/values-w820dp/dimens.xml +++ b/app/src/main/res/values-w820dp/dimens.xml @@ -3,4 +3,7 @@ (such as screen margins) for screens with more than 820dp of available width. This would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> 64dp + + 280dp + 160dp diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 5693ec7c49b..679dc05ebee 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,5 +1,13 @@ + + 16dp + 8dp + 32dp + 8dp + 4dp + 2dp + 120dp 16dp diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 17ed547a095..1a711ad17a8 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -1263,16 +1263,19 @@ auto list grid + card @string/list_view_mode_auto_key @string/list_view_mode_list_key @string/list_view_mode_grid_key + @string/list_view_mode_card_key @string/auto @string/list @string/grid + @string/card tablet_mode diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2deb14d8d8c..5a4ce92f216 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -550,6 +550,7 @@ List view mode List Grid + Card Auto Seekbar thumbnail preview From 489df0ed7deb3f3f008e9d74e194d381f3b5880b Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 5 Jan 2023 19:01:38 +0100 Subject: [PATCH 039/645] Update NewPipeExtractor and properly linkify comments --- app/build.gradle | 2 +- .../fragments/detail/DescriptionFragment.java | 31 +-- .../holder/CommentsMiniInfoItemHolder.java | 132 +++++----- .../schabi/newpipe/util/ExtractorHelper.java | 6 +- .../util/text/CommentTextOnTouchListener.java | 30 +-- .../text/HashtagLongPressClickableSpan.java | 10 +- .../newpipe/util/text/TextLinkifier.java | 247 ++++++++++++------ .../text/TimestampLongPressClickableSpan.java | 35 +-- 8 files changed, 277 insertions(+), 216 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6066bce4316..a76d986fb80 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -187,7 +187,7 @@ dependencies { // name and the commit hash with the commit hash of the (pushed) commit you want to test // This works thanks to JitPack: https://jitpack.io/ implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'com.github.TeamNewPipe:NewPipeExtractor:2211a24b6934a8a8cdf5547ea1b52daa4cb5de6c' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:ff94e9f30bc5d7831734cc85ecebe7d30ac9c040' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java index ea89424ece2..d364c0c0fd4 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java @@ -4,6 +4,7 @@ import static org.schabi.newpipe.extractor.stream.StreamExtractor.NO_AGE_LIMIT; import static org.schabi.newpipe.extractor.utils.Utils.isBlank; import static org.schabi.newpipe.util.Localization.getAppLocale; +import static org.schabi.newpipe.util.text.TextLinkifier.SET_LINK_MOVEMENT_METHOD; import android.os.Bundle; import android.view.LayoutInflater; @@ -112,7 +113,10 @@ private void enableDescriptionSelection() { private void disableDescriptionSelection() { // show description content again, otherwise some links are not clickable - loadDescriptionContent(); + TextLinkifier.fromDescription(binding.detailDescriptionView, + streamInfo.getDescription(), HtmlCompat.FROM_HTML_MODE_LEGACY, + streamInfo.getService(), streamInfo.getUrl(), + descriptionDisposables, SET_LINK_MOVEMENT_METHOD); binding.detailDescriptionNoteView.setVisibility(View.GONE); binding.detailDescriptionView.setTextIsSelectable(false); @@ -123,27 +127,6 @@ private void disableDescriptionSelection() { binding.detailSelectDescriptionButton.setImageResource(R.drawable.ic_select_all); } - private void loadDescriptionContent() { - final Description description = streamInfo.getDescription(); - switch (description.getType()) { - case Description.HTML: - TextLinkifier.createLinksFromHtmlBlock(binding.detailDescriptionView, - description.getContent(), HtmlCompat.FROM_HTML_MODE_LEGACY, streamInfo, - descriptionDisposables); - break; - case Description.MARKDOWN: - TextLinkifier.createLinksFromMarkdownText(binding.detailDescriptionView, - description.getContent(), streamInfo, descriptionDisposables); - break; - case Description.PLAIN_TEXT: - default: - TextLinkifier.createLinksFromPlainText(binding.detailDescriptionView, - description.getContent(), streamInfo, descriptionDisposables); - break; - } - } - - private void setupMetadata(final LayoutInflater inflater, final LinearLayout layout) { addMetadataItem(inflater, layout, false, R.string.metadata_category, @@ -193,8 +176,8 @@ private void addMetadataItem(final LayoutInflater inflater, }); if (linkifyContent) { - TextLinkifier.createLinksFromPlainText(itemBinding.metadataContentView, content, - null, descriptionDisposables); + TextLinkifier.fromPlainText(itemBinding.metadataContentView, content, null, null, + descriptionDisposables, SET_LINK_MOVEMENT_METHOD); } else { itemBinding.metadataContentView.setText(content); } 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 69aba8c4f18..fe04ac7eecf 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,9 +1,10 @@ package org.schabi.newpipe.info_list.holder; +import android.graphics.Paint; +import android.text.Layout; import android.text.TextUtils; import android.text.method.LinkMovementMethod; import android.text.style.URLSpan; -import android.text.util.Linkify; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -11,33 +12,43 @@ import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; -import androidx.core.text.util.LinkifyCompat; +import androidx.core.text.HtmlCompat; import org.schabi.newpipe.R; import org.schabi.newpipe.error.ErrorUtil; 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.CommentsInfoItem; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.stream.Description; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.text.CommentTextOnTouchListener; import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PicassoHelper; import org.schabi.newpipe.util.external_communication.ShareUtils; -import org.schabi.newpipe.util.text.TimestampExtractor; +import org.schabi.newpipe.util.text.CommentTextOnTouchListener; +import org.schabi.newpipe.util.text.TextLinkifier; -import java.util.Objects; +import java.util.function.Consumer; + +import io.reactivex.rxjava3.disposables.CompositeDisposable; public class CommentsMiniInfoItemHolder extends InfoItemHolder { private static final String TAG = "CommentsMiniIIHolder"; + private static final String ELLIPSIS = "…"; private static final int COMMENT_DEFAULT_LINES = 2; private static final int COMMENT_EXPANDED_LINES = 1000; private final int commentHorizontalPadding; private final int commentVerticalPadding; + private final float ellipsisWidthPx; private final RelativeLayout itemRoot; private final ImageView itemThumbnailView; @@ -45,7 +56,9 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { private final TextView itemLikesCountView; private final TextView itemPublishedTime; - private String commentText; + private final CompositeDisposable disposables = new CompositeDisposable(); + private Description commentText; + private StreamingService streamService; private String streamUrl; CommentsMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final int layoutId, @@ -62,6 +75,10 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { .getResources().getDimension(R.dimen.comments_horizontal_padding); commentVerticalPadding = (int) infoItemBuilder.getContext() .getResources().getDimension(R.dimen.comments_vertical_padding); + + final Paint paint = new Paint(); + paint.setTextSize(itemContentView.getTextSize()); + ellipsisWidthPx = paint.measureText(ELLIPSIS); } public CommentsMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, @@ -91,18 +108,20 @@ public void updateFromItem(final InfoItem infoItem, itemThumbnailView.setOnClickListener(view -> openCommentAuthor(item)); + try { + streamService = NewPipe.getService(item.getServiceId()); + } catch (final ExtractionException e) { + // should never happen + ErrorUtil.showUiErrorSnackbar(itemBuilder.getContext(), "Getting StreamingService", e); + Log.w(TAG, "Cannot obtain service from comment service id, defaulting to YouTube", e); + streamService = ServiceList.YouTube; + } streamUrl = item.getUrl(); - - itemContentView.setLines(COMMENT_DEFAULT_LINES); commentText = item.getCommentText(); - itemContentView.setText(commentText, TextView.BufferType.SPANNABLE); - itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE); + ellipsize(); - if (itemContentView.getLineCount() == 0) { - itemContentView.post(this::ellipsize); - } else { - ellipsize(); - } + //noinspection ClickableViewAccessibility + itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE); if (item.getLikeCount() >= 0) { itemLikesCountView.setText( @@ -132,7 +151,8 @@ public void updateFromItem(final InfoItem infoItem, if (DeviceUtils.isTv(itemBuilder.getContext())) { openCommentAuthor(item); } else { - ShareUtils.copyToClipboard(itemBuilder.getContext(), commentText); + ShareUtils.copyToClipboard(itemBuilder.getContext(), + itemContentView.getText().toString()); } return true; }); @@ -172,7 +192,7 @@ private boolean shouldFocusLinks() { return urls != null && urls.length != 0; } - private void determineLinkFocus() { + private void determineMovementMethod() { if (shouldFocusLinks()) { allowLinkFocus(); } else { @@ -181,63 +201,51 @@ private void determineLinkFocus() { } private void ellipsize() { - boolean hasEllipsis = false; - - if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) { - final int endOfLastLine = itemContentView - .getLayout() - .getLineEnd(COMMENT_DEFAULT_LINES - 1); - int end = itemContentView.getText().toString().lastIndexOf(' ', endOfLastLine - 2); - if (end == -1) { - end = Math.max(endOfLastLine - 2, 0); - } - final String newVal = itemContentView.getText().subSequence(0, end) + " …"; - itemContentView.setText(newVal); - hasEllipsis = true; - } + linkifyCommentContentView(v -> { + boolean hasEllipsis = false; - linkify(); + if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) { + final int endOfLastLine = itemContentView + .getLayout() + .getLineEnd(COMMENT_DEFAULT_LINES - 1); + int end = itemContentView.getText().toString().lastIndexOf(' ', endOfLastLine - 2); + if (end == -1) { + end = Math.max(endOfLastLine - 2, 0); + } + final String newVal = itemContentView.getText().subSequence(0, end) + " …"; + itemContentView.setText(newVal); + hasEllipsis = true; + } - if (hasEllipsis) { - denyLinkFocus(); - } else { - determineLinkFocus(); - } + itemContentView.setMaxLines(COMMENT_DEFAULT_LINES); + if (hasEllipsis) { + denyLinkFocus(); + } else { + determineMovementMethod(); + } + }); } private void toggleEllipsize() { - if (itemContentView.getText().toString().equals(commentText)) { - if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) { - ellipsize(); - } - } else { + final CharSequence text = itemContentView.getText(); + if (text.charAt(text.length() - 1) == ELLIPSIS.charAt(0)) { expand(); + } else if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) { + ellipsize(); } } private void expand() { itemContentView.setMaxLines(COMMENT_EXPANDED_LINES); - itemContentView.setText(commentText); - linkify(); - determineLinkFocus(); + linkifyCommentContentView(v -> determineMovementMethod()); } - private void linkify() { - LinkifyCompat.addLinks(itemContentView, Linkify.WEB_URLS); - LinkifyCompat.addLinks(itemContentView, TimestampExtractor.TIMESTAMPS_PATTERN, null, null, - (match, url) -> { - try { - final var timestampMatch = TimestampExtractor - .getTimestampFromMatcher(match, commentText); - if (timestampMatch == null) { - return url; - } - return streamUrl + url.replace(Objects.requireNonNull(match.group(0)), - "#timestamp=" + timestampMatch.seconds()); - } catch (final Exception ex) { - Log.e(TAG, "Unable to process url='" + url + "' as timestampLink", ex); - return url; - } - }); + private void linkifyCommentContentView(@Nullable final Consumer onCompletion) { + disposables.clear(); + if (commentText != null) { + TextLinkifier.fromDescription(itemContentView, commentText, + HtmlCompat.FROM_HTML_MODE_LEGACY, streamService, streamUrl, disposables, + onCompletion); + } } } 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 2123010aaff..d5d472d6f28 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -20,6 +20,7 @@ package org.schabi.newpipe.util; import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; +import static org.schabi.newpipe.util.text.TextLinkifier.SET_LINK_MOVEMENT_METHOD; import android.content.Context; import android.util.Log; @@ -319,8 +320,9 @@ public static void showMetaInfoInTextView(@Nullable final List metaInf } metaInfoSeparator.setVisibility(View.VISIBLE); - TextLinkifier.createLinksFromHtmlBlock(metaInfoTextView, stringBuilder.toString(), - HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING, null, disposables); + TextLinkifier.fromHtml(metaInfoTextView, stringBuilder.toString(), + HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING, null, null, disposables, + SET_LINK_MOVEMENT_METHOD); } } diff --git a/app/src/main/java/org/schabi/newpipe/util/text/CommentTextOnTouchListener.java b/app/src/main/java/org/schabi/newpipe/util/text/CommentTextOnTouchListener.java index 4ced4be77ac..5018a6120a1 100644 --- a/app/src/main/java/org/schabi/newpipe/util/text/CommentTextOnTouchListener.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/CommentTextOnTouchListener.java @@ -2,51 +2,37 @@ import static org.schabi.newpipe.util.text.TouchUtils.getOffsetForHorizontalLine; -import android.text.Selection; -import android.text.Spannable; +import android.annotation.SuppressLint; import android.text.Spanned; import android.text.style.ClickableSpan; -import android.text.style.URLSpan; import android.view.MotionEvent; import android.view.View; import android.widget.TextView; -import org.schabi.newpipe.util.external_communication.ShareUtils; - -import io.reactivex.rxjava3.disposables.CompositeDisposable; - public class CommentTextOnTouchListener implements View.OnTouchListener { public static final CommentTextOnTouchListener INSTANCE = new CommentTextOnTouchListener(); + @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(final View v, final MotionEvent event) { if (!(v instanceof TextView)) { return false; } final TextView widget = (TextView) v; - final Object text = widget.getText(); + final CharSequence text = widget.getText(); if (text instanceof Spanned) { - final Spannable buffer = (Spannable) text; - + final Spanned buffer = (Spanned) text; final int action = event.getAction(); if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { final int offset = getOffsetForHorizontalLine(widget, event); - final ClickableSpan[] link = buffer.getSpans(offset, offset, ClickableSpan.class); + final ClickableSpan[] links = buffer.getSpans(offset, offset, ClickableSpan.class); - if (link.length != 0) { + if (links.length != 0) { if (action == MotionEvent.ACTION_UP) { - if (link[0] instanceof URLSpan) { - final String url = ((URLSpan) link[0]).getURL(); - if (!InternalUrlsHandler.handleUrlCommentsTimestamp( - new CompositeDisposable(), v.getContext(), url)) { - ShareUtils.openUrlInBrowser(v.getContext(), url, false); - } - } - } else if (action == MotionEvent.ACTION_DOWN) { - Selection.setSelection(buffer, buffer.getSpanStart(link[0]), - buffer.getSpanEnd(link[0])); + links[0].onClick(widget); } + // we handle events that intersect links, so return true return true; } } diff --git a/app/src/main/java/org/schabi/newpipe/util/text/HashtagLongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/text/HashtagLongPressClickableSpan.java index 4ca6c326efb..8a0363ecbce 100644 --- a/app/src/main/java/org/schabi/newpipe/util/text/HashtagLongPressClickableSpan.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/HashtagLongPressClickableSpan.java @@ -5,7 +5,6 @@ import androidx.annotation.NonNull; -import org.schabi.newpipe.extractor.Info; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.external_communication.ShareUtils; @@ -15,20 +14,19 @@ final class HashtagLongPressClickableSpan extends LongPressClickableSpan { private final Context context; @NonNull private final String parsedHashtag; - @NonNull - private final Info relatedInfo; + private final int relatedInfoServiceId; HashtagLongPressClickableSpan(@NonNull final Context context, @NonNull final String parsedHashtag, - @NonNull final Info relatedInfo) { + final int relatedInfoServiceId) { this.context = context; this.parsedHashtag = parsedHashtag; - this.relatedInfo = relatedInfo; + this.relatedInfoServiceId = relatedInfoServiceId; } @Override public void onClick(@NonNull final View view) { - NavigationHelper.openSearch(context, relatedInfo.getServiceId(), parsedHashtag); + NavigationHelper.openSearch(context, relatedInfoServiceId, parsedHashtag); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java b/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java index b7220d22f96..e59a3dc0577 100644 --- a/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java @@ -12,11 +12,12 @@ import androidx.annotation.Nullable; import androidx.core.text.HtmlCompat; -import org.schabi.newpipe.extractor.Info; -import org.schabi.newpipe.extractor.stream.StreamInfo; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.stream.Description; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.external_communication.ShareUtils; +import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -33,88 +34,155 @@ public final class TextLinkifier { // Looks for hashtags with characters from any language (\p{L}), numbers, or underscores private static final Pattern HASHTAGS_PATTERN = Pattern.compile("(#[\\p{L}0-9_]+)"); + public static final Consumer SET_LINK_MOVEMENT_METHOD = + v -> v.setMovementMethod(LongPressLinkMovementMethod.getInstance()); + private TextLinkifier() { } + /** + * Create links for contents with an {@link Description} in the various possible formats. + *

+ * This will call one of these three functions based on the format: {@link #fromHtml}, + * {@link #fromMarkdown} or {@link #fromPlainText}. + * + * @param textView the TextView to set the htmlBlock linked + * @param description the htmlBlock to be linked + * @param htmlCompatFlag the int flag to be set if {@link HtmlCompat#fromHtml(String, int)} + * will be called (not used for formats different than HTML) + * @param relatedInfoService if given, handle hashtags to search for the term in the correct + * service + * @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle + * timestamps to open the stream in the popup player at the specific + * time + * @param disposables disposables created by the method are added here and their + * lifecycle should be handled by the calling class + * @param onCompletion will be run when setting text to the textView completes; use {@link + * #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable + */ + public static void fromDescription(@NonNull final TextView textView, + @NonNull final Description description, + final int htmlCompatFlag, + @Nullable final StreamingService relatedInfoService, + @Nullable final String relatedStreamUrl, + @NonNull final CompositeDisposable disposables, + @Nullable final Consumer onCompletion) { + switch (description.getType()) { + case Description.HTML: + TextLinkifier.fromHtml(textView, description.getContent(), htmlCompatFlag, + relatedInfoService, relatedStreamUrl, disposables, onCompletion); + break; + case Description.MARKDOWN: + TextLinkifier.fromMarkdown(textView, description.getContent(), + relatedInfoService, relatedStreamUrl, disposables, onCompletion); + break; + case Description.PLAIN_TEXT: default: + TextLinkifier.fromPlainText(textView, description.getContent(), + relatedInfoService, relatedStreamUrl, disposables, onCompletion); + break; + } + } + /** * Create links for contents with an HTML description. * *

- * This method will call {@link #changeIntentsOfDescriptionLinks(TextView, CharSequence, Info, - * CompositeDisposable)} after having linked the URLs with + * This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService, + * String, CompositeDisposable, Consumer)} after having linked the URLs with * {@link HtmlCompat#fromHtml(String, int)}. *

* - * @param textView the {@link TextView} to set the the HTML string block linked - * @param htmlBlock the HTML string block to be linked - * @param htmlCompatFlag the int flag to be set when {@link HtmlCompat#fromHtml(String, int)} - * will be called - * @param relatedInfo if given, handle timestamps to open the stream in the popup player at - * the specific time, and hashtags to search for the term in the correct - * service - * @param disposables disposables created by the method are added here and their lifecycle - * should be handled by the calling class + * @param textView the {@link TextView} to set the the HTML string block linked + * @param htmlBlock the HTML string block to be linked + * @param htmlCompatFlag the int flag to be set when {@link HtmlCompat#fromHtml(String, + * int)} will be called + * @param relatedInfoService if given, handle hashtags to search for the term in the correct + * service + * @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle + * timestamps to open the stream in the popup player at the specific + * time + * @param disposables disposables created by the method are added here and their + * lifecycle should be handled by the calling class + * @param onCompletion will be run when setting text to the textView completes; use {@link + * #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable */ - public static void createLinksFromHtmlBlock(@NonNull final TextView textView, - @NonNull final String htmlBlock, - final int htmlCompatFlag, - @Nullable final Info relatedInfo, - @NonNull final CompositeDisposable disposables) { - changeIntentsOfDescriptionLinks(textView, HtmlCompat.fromHtml(htmlBlock, htmlCompatFlag), - relatedInfo, disposables); + public static void fromHtml(@NonNull final TextView textView, + @NonNull final String htmlBlock, + final int htmlCompatFlag, + @Nullable final StreamingService relatedInfoService, + @Nullable final String relatedStreamUrl, + @NonNull final CompositeDisposable disposables, + @Nullable final Consumer onCompletion) { + changeLinkIntents( + textView, HtmlCompat.fromHtml(htmlBlock, htmlCompatFlag), relatedInfoService, + relatedStreamUrl, disposables, onCompletion); } /** * Create links for contents with a plain text description. * *

- * This method will call {@link #changeIntentsOfDescriptionLinks(TextView, CharSequence, Info, - * CompositeDisposable)} after having linked the URLs with {@link TextView#setAutoLinkMask(int)} - * and {@link TextView#setText(CharSequence, TextView.BufferType)}. + * This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService, + * String, CompositeDisposable, Consumer)} after having linked the URLs with + * {@link TextView#setAutoLinkMask(int)} and + * {@link TextView#setText(CharSequence, TextView.BufferType)}. *

* - * @param textView the {@link TextView} to set the plain text block linked - * @param plainTextBlock the block of plain text to be linked - * @param relatedInfo if given, handle timestamps to open the stream in the popup player, at - * the specified time, and hashtags to search for the term in the correct - * service - * @param disposables disposables created by the method are added here and their lifecycle - * should be handled by the calling class + * @param textView the {@link TextView} to set the plain text block linked + * @param plainTextBlock the block of plain text to be linked + * @param relatedInfoService if given, handle hashtags to search for the term in the correct + * service + * @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle + * timestamps to open the stream in the popup player at the specific + * time + * @param disposables disposables created by the method are added here and their + * lifecycle should be handled by the calling class + * @param onCompletion will be run when setting text to the textView completes; use {@link + * #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable */ - public static void createLinksFromPlainText(@NonNull final TextView textView, - @NonNull final String plainTextBlock, - @Nullable final Info relatedInfo, - @NonNull final CompositeDisposable disposables) { + public static void fromPlainText(@NonNull final TextView textView, + @NonNull final String plainTextBlock, + @Nullable final StreamingService relatedInfoService, + @Nullable final String relatedStreamUrl, + @NonNull final CompositeDisposable disposables, + @Nullable final Consumer onCompletion) { textView.setAutoLinkMask(Linkify.WEB_URLS); textView.setText(plainTextBlock, TextView.BufferType.SPANNABLE); - changeIntentsOfDescriptionLinks(textView, textView.getText(), relatedInfo, disposables); + changeLinkIntents(textView, textView.getText(), relatedInfoService, + relatedStreamUrl, disposables, onCompletion); } /** * Create links for contents with a markdown description. * *

- * This method will call {@link #changeIntentsOfDescriptionLinks(TextView, CharSequence, Info, - * CompositeDisposable)} after creating a {@link Markwon} object and using + * This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService, + * String, CompositeDisposable, Consumer)} after creating a {@link Markwon} object and using * {@link Markwon#setMarkdown(TextView, String)}. *

* - * @param textView the {@link TextView} to set the plain text block linked - * @param markdownBlock the block of markdown text to be linked - * @param relatedInfo if given, handle timestamps to open the stream in the popup player at - * the specific time, and hashtags to search for the term in the correct - * service - * @param disposables disposables created by the method are added here and their lifecycle - * should be handled by the calling class + * @param textView the {@link TextView} to set the plain text block linked + * @param markdownBlock the block of markdown text to be linked + * @param relatedInfoService if given, handle hashtags to search for the term in the correct + * service + * @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle + * timestamps to open the stream in the popup player at the specific + * time + * @param disposables disposables created by the method are added here and their + * lifecycle should be handled by the calling class + * @param onCompletion will be run when setting text to the textView completes; use {@link + * #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable */ - public static void createLinksFromMarkdownText(@NonNull final TextView textView, - final String markdownBlock, - @Nullable final Info relatedInfo, - final CompositeDisposable disposables) { + public static void fromMarkdown(@NonNull final TextView textView, + @NonNull final String markdownBlock, + @Nullable final StreamingService relatedInfoService, + @Nullable final String relatedStreamUrl, + @NonNull final CompositeDisposable disposables, + @Nullable final Consumer onCompletion) { final Markwon markwon = Markwon.builder(textView.getContext()) .usePlugin(LinkifyPlugin.create()).build(); - changeIntentsOfDescriptionLinks(textView, markwon.toMarkdown(markdownBlock), relatedInfo, - disposables); + changeLinkIntents(textView, markwon.toMarkdown(markdownBlock), + relatedInfoService, relatedStreamUrl, disposables, onCompletion); } /** @@ -131,9 +199,9 @@ public static void createLinksFromMarkdownText(@NonNull final TextView textView, * This method will also add click listeners on timestamps in this description, which will play * the content in the popup player at the time indicated in the timestamp, by using * {@link TextLinkifier#addClickListenersOnTimestamps(Context, SpannableStringBuilder, - * StreamInfo, CompositeDisposable)} method and click listeners on hashtags, by using - * {@link TextLinkifier#addClickListenersOnHashtags(Context, SpannableStringBuilder, Info)})}, - * which will open a search on the current service with the hashtag. + * StreamingService, String, CompositeDisposable)} method and click listeners on hashtags, by + * using {@link TextLinkifier#addClickListenersOnHashtags(Context, SpannableStringBuilder, + * StreamingService)}, which will open a search on the current service with the hashtag. *

* *

@@ -141,20 +209,25 @@ public static void createLinksFromMarkdownText(@NonNull final TextView textView, * before opening a web link. *

* - * @param textView the {@link TextView} in which the converted {@link CharSequence} will be - * applied - * @param chars the {@link CharSequence} to be parsed - * @param relatedInfo if given, handle timestamps to open the stream in the popup player at the - * specific time, and hashtags to search for the term in the correct service - * @param disposables disposables created by the method are added here and their lifecycle - * should be handled by the calling class + * @param textView the {@link TextView} to which the converted {@link CharSequence} + * will be applied + * @param chars the {@link CharSequence} to be parsed + * @param relatedInfoService if given, handle hashtags to search for the term in the correct + * service + * @param relatedStreamUrl if given, used alongside {@code relatedInfoService} to handle + * timestamps to open the stream in the popup player at the specific + * time + * @param disposables disposables created by the method are added here and their + * lifecycle should be handled by the calling class + * @param onCompletion will be run when setting text to the textView completes; use {@link + * #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable */ - private static void changeIntentsOfDescriptionLinks( - @NonNull final TextView textView, - @NonNull final CharSequence chars, - @Nullable final Info relatedInfo, - @NonNull final CompositeDisposable disposables) { - textView.setMovementMethod(LongPressLinkMovementMethod.getInstance()); + private static void changeLinkIntents(@NonNull final TextView textView, + @NonNull final CharSequence chars, + @Nullable final StreamingService relatedInfoService, + @Nullable final String relatedStreamUrl, + @NonNull final CompositeDisposable disposables, + @Nullable final Consumer onCompletion) { disposables.add(Single.fromCallable(() -> { final Context context = textView.getContext(); @@ -176,26 +249,26 @@ private static void changeIntentsOfDescriptionLinks( textBlockLinked.removeSpan(span); } - if (relatedInfo != null) { - // add click actions on plain text timestamps only for description of - // contents, unneeded for meta-info or other TextViews - if (relatedInfo instanceof StreamInfo) { + // add click actions on plain text timestamps only for description of contents, + // unneeded for meta-info or other TextViews + if (relatedInfoService != null) { + if (relatedStreamUrl != null) { addClickListenersOnTimestamps(context, textBlockLinked, - (StreamInfo) relatedInfo, disposables); + relatedInfoService, relatedStreamUrl, disposables); } - - addClickListenersOnHashtags(context, textBlockLinked, relatedInfo); + addClickListenersOnHashtags(context, textBlockLinked, relatedInfoService); } return textBlockLinked; }).subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( - textBlockLinked -> setTextViewCharSequence(textView, textBlockLinked), + textBlockLinked -> + setTextViewCharSequence(textView, textBlockLinked, onCompletion), throwable -> { Log.e(TAG, "Unable to linkify text", throwable); // this should never happen, but if it does, just fallback to it - setTextViewCharSequence(textView, chars); + setTextViewCharSequence(textView, chars, onCompletion); })); } @@ -213,12 +286,12 @@ private static void changeIntentsOfDescriptionLinks( * @param context the {@link Context} to use * @param spannableDescription the {@link SpannableStringBuilder} with the text of the * content description - * @param relatedInfo used to search for the term in the correct service + * @param relatedInfoService used to search for the term in the correct service */ private static void addClickListenersOnHashtags( @NonNull final Context context, @NonNull final SpannableStringBuilder spannableDescription, - @NonNull final Info relatedInfo) { + @NonNull final StreamingService relatedInfoService) { final String descriptionText = spannableDescription.toString(); final Matcher hashtagsMatches = HASHTAGS_PATTERN.matcher(descriptionText); @@ -231,8 +304,9 @@ private static void addClickListenersOnHashtags( // of an URL, already parsed before if (spannableDescription.getSpans(hashtagStart, hashtagEnd, LongPressClickableSpan.class).length == 0) { + final int serviceId = relatedInfoService.getServiceId(); spannableDescription.setSpan( - new HashtagLongPressClickableSpan(context, parsedHashtag, relatedInfo), + new HashtagLongPressClickableSpan(context, parsedHashtag, serviceId), hashtagStart, hashtagEnd, 0); } } @@ -251,14 +325,16 @@ private static void addClickListenersOnHashtags( * @param context the {@link Context} to use * @param spannableDescription the {@link SpannableStringBuilder} with the text of the * content description - * @param streamInfo what to open in the popup player when timestamps are clicked + * @param relatedInfoService the service of the {@code relatedStreamUrl} + * @param relatedStreamUrl what to open in the popup player when timestamps are clicked * @param disposables disposables created by the method are added here and their * lifecycle should be handled by the calling class */ private static void addClickListenersOnTimestamps( @NonNull final Context context, @NonNull final SpannableStringBuilder spannableDescription, - @NonNull final StreamInfo streamInfo, + @NonNull final StreamingService relatedInfoService, + @NonNull final String relatedStreamUrl, @NonNull final CompositeDisposable disposables) { final String descriptionText = spannableDescription.toString(); final Matcher timestampsMatches = TimestampExtractor.TIMESTAMPS_PATTERN.matcher( @@ -272,8 +348,9 @@ private static void addClickListenersOnTimestamps( continue; } - spannableDescription.setSpan(new TimestampLongPressClickableSpan( - context, descriptionText, disposables, streamInfo, timestampMatchDTO), + spannableDescription.setSpan( + new TimestampLongPressClickableSpan(context, descriptionText, disposables, + relatedInfoService, relatedStreamUrl, timestampMatchDTO), timestampMatchDTO.timestampStart(), timestampMatchDTO.timestampEnd(), 0); @@ -281,8 +358,12 @@ private static void addClickListenersOnTimestamps( } private static void setTextViewCharSequence(@NonNull final TextView textView, - @Nullable final CharSequence charSequence) { + @Nullable final CharSequence charSequence, + @Nullable final Consumer onCompletion) { textView.setText(charSequence); textView.setVisibility(View.VISIBLE); + if (onCompletion != null) { + onCompletion.accept(textView); + } } } diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.java index 48110312d37..f5864794a72 100644 --- a/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.java @@ -9,7 +9,6 @@ import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.StreamingService; -import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.util.external_communication.ShareUtils; import io.reactivex.rxjava3.disposables.CompositeDisposable; @@ -23,7 +22,9 @@ final class TimestampLongPressClickableSpan extends LongPressClickableSpan { @NonNull private final CompositeDisposable disposables; @NonNull - private final StreamInfo streamInfo; + private final StreamingService relatedInfoService; + @NonNull + private final String relatedStreamUrl; @NonNull private final TimestampExtractor.TimestampMatchDTO timestampMatchDTO; @@ -31,41 +32,43 @@ final class TimestampLongPressClickableSpan extends LongPressClickableSpan { @NonNull final Context context, @NonNull final String descriptionText, @NonNull final CompositeDisposable disposables, - @NonNull final StreamInfo streamInfo, + @NonNull final StreamingService relatedInfoService, + @NonNull final String relatedStreamUrl, @NonNull final TimestampExtractor.TimestampMatchDTO timestampMatchDTO) { this.context = context; this.descriptionText = descriptionText; this.disposables = disposables; - this.streamInfo = streamInfo; + this.relatedInfoService = relatedInfoService; + this.relatedStreamUrl = relatedStreamUrl; this.timestampMatchDTO = timestampMatchDTO; } @Override public void onClick(@NonNull final View view) { - playOnPopup(context, streamInfo.getUrl(), streamInfo.getService(), + playOnPopup(context, relatedStreamUrl, relatedInfoService, timestampMatchDTO.seconds(), disposables); } @Override public void onLongClick(@NonNull final View view) { - ShareUtils.copyToClipboard(context, - getTimestampTextToCopy(streamInfo, descriptionText, timestampMatchDTO)); + ShareUtils.copyToClipboard(context, getTimestampTextToCopy( + relatedInfoService, relatedStreamUrl, descriptionText, timestampMatchDTO)); } @NonNull private static String getTimestampTextToCopy( - @NonNull final StreamInfo relatedInfo, + @NonNull final StreamingService relatedInfoService, + @NonNull final String relatedStreamUrl, @NonNull final String descriptionText, @NonNull final TimestampExtractor.TimestampMatchDTO timestampMatchDTO) { // TODO: use extractor methods to get timestamps when this feature will be implemented in it - final StreamingService streamingService = relatedInfo.getService(); - if (streamingService == ServiceList.YouTube) { - return relatedInfo.getUrl() + "&t=" + timestampMatchDTO.seconds(); - } else if (streamingService == ServiceList.SoundCloud - || streamingService == ServiceList.MediaCCC) { - return relatedInfo.getUrl() + "#t=" + timestampMatchDTO.seconds(); - } else if (streamingService == ServiceList.PeerTube) { - return relatedInfo.getUrl() + "?start=" + timestampMatchDTO.seconds(); + if (relatedInfoService == ServiceList.YouTube) { + return relatedStreamUrl + "&t=" + timestampMatchDTO.seconds(); + } else if (relatedInfoService == ServiceList.SoundCloud + || relatedInfoService == ServiceList.MediaCCC) { + return relatedStreamUrl + "#t=" + timestampMatchDTO.seconds(); + } else if (relatedInfoService == ServiceList.PeerTube) { + return relatedStreamUrl + "?start=" + timestampMatchDTO.seconds(); } // Return timestamp text for other services From 6e73c489dee61f4364f0fa4faf0702f0d3374b34 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 15 Jan 2023 14:57:34 +0100 Subject: [PATCH 040/645] Improve ellipsizing comments --- .../holder/CommentsMiniInfoItemHolder.java | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 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 fe04ac7eecf..799aee8ba59 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 @@ -48,6 +48,8 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { private final int commentHorizontalPadding; private final int commentVerticalPadding; + + private final Paint paintAtContentSize; private final float ellipsisWidthPx; private final RelativeLayout itemRoot; @@ -76,9 +78,9 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { commentVerticalPadding = (int) infoItemBuilder.getContext() .getResources().getDimension(R.dimen.comments_vertical_padding); - final Paint paint = new Paint(); - paint.setTextSize(itemContentView.getTextSize()); - ellipsisWidthPx = paint.measureText(ELLIPSIS); + paintAtContentSize = new Paint(); + paintAtContentSize.setTextSize(itemContentView.getTextSize()); + ellipsisWidthPx = paintAtContentSize.measureText(ELLIPSIS); } public CommentsMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, @@ -201,18 +203,40 @@ private void determineMovementMethod() { } private void ellipsize() { + itemContentView.setMaxLines(COMMENT_EXPANDED_LINES); linkifyCommentContentView(v -> { boolean hasEllipsis = false; if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) { - final int endOfLastLine = itemContentView - .getLayout() - .getLineEnd(COMMENT_DEFAULT_LINES - 1); - int end = itemContentView.getText().toString().lastIndexOf(' ', endOfLastLine - 2); - if (end == -1) { - end = Math.max(endOfLastLine - 2, 0); + // Note that converting to String removes spans (i.e. links), but that's something + // we actually want since when the text is ellipsized we want all clicks on the + // comment to expand the comment, not to open links. + final String text = itemContentView.getText().toString(); + + final Layout layout = itemContentView.getLayout(); + final float lineWidth = layout.getLineWidth(COMMENT_DEFAULT_LINES - 1); + final float layoutWidth = layout.getWidth(); + final int lineStart = layout.getLineStart(COMMENT_DEFAULT_LINES - 1); + final int lineEnd = layout.getLineEnd(COMMENT_DEFAULT_LINES - 1); + + // remove characters up until there is enough space for the ellipsis + // (also summing 2 more pixels, just to be sure to avoid float rounding errors) + int end = lineEnd; + float removedCharactersWidth = 0.0f; + while (lineWidth - removedCharactersWidth + ellipsisWidthPx + 2.0f > layoutWidth + && end >= lineStart) { + end -= 1; + // recalculate each time to account for ligatures or other similar things + removedCharactersWidth = paintAtContentSize.measureText( + text.substring(end, lineEnd)); } - final String newVal = itemContentView.getText().subSequence(0, end) + " …"; + + // remove trailing spaces and newlines + while (end > 0 && Character.isWhitespace(text.charAt(end - 1))) { + end -= 1; + } + + final String newVal = text.substring(0, end) + ELLIPSIS; itemContentView.setText(newVal); hasEllipsis = true; } From dba24ec1f95b2e1fc6aafae84aee14a9f4ef1fdb Mon Sep 17 00:00:00 2001 From: GET100PERCENT <116144024+GET100PERCENT@users.noreply.github.com> Date: Mon, 16 Jan 2023 01:54:01 +0530 Subject: [PATCH 041/645] Added Odia language to language selector (#9651) --- app/src/main/res/values/settings_keys.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 1a711ad17a8..c2819feea70 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -443,6 +443,7 @@ no nn uz + or pl pt-PT pt @@ -522,6 +523,7 @@ Norsk Nynorsk O‘zbek + ଓଡ଼ିଆ Polski Português Português (Brasil) @@ -1129,6 +1131,7 @@ nl nl-be oc + or pa pl pt @@ -1211,6 +1214,7 @@ Nederlands (NL) Nederlands (BE) Occitan + ଓଡ଼ିଆ ਪੰਜਾਬੀ Polski Português From e4641cd427556ead9c866076bfae6e5b65f25f2d Mon Sep 17 00:00:00 2001 From: Tobi Date: Sun, 15 Jan 2023 21:53:52 +0100 Subject: [PATCH 042/645] Update translations (#9688) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Translated using Weblate (Hebrew) Currently translated at 100.0% (650 of 650 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (650 of 650 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (650 of 650 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (650 of 650 strings) Translated using Weblate (German) Currently translated at 100.0% (650 of 650 strings) Added translation using Weblate (Assamese) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (650 of 650 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (650 of 650 strings) Translated using Weblate (Polish) Currently translated at 100.0% (650 of 650 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (650 of 650 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (650 of 650 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (650 of 650 strings) Translated using Weblate (Czech) Currently translated at 100.0% (650 of 650 strings) Translated using Weblate (Greek) Currently translated at 100.0% (650 of 650 strings) Translated using Weblate (Korean) Currently translated at 100.0% (650 of 650 strings) Translated using Weblate (Odia) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (German) Currently translated at 72.2% (52 of 72 strings) Translated using Weblate (Danish) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Catalan) Currently translated at 95.5% (620 of 649 strings) Translated using Weblate (Persian) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Italian) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 10.6% (69 of 649 strings) Translated using Weblate (Polish) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Polish) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Arabic) Currently translated at 51.3% (37 of 72 strings) Translated using Weblate (Bengali) Currently translated at 89.9% (584 of 649 strings) Translated using Weblate (Sardinian) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Thai) Currently translated at 32.2% (209 of 649 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Italian) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Japanese) Currently translated at 99.6% (647 of 649 strings) Translated using Weblate (Odia) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (German) Currently translated at 66.6% (48 of 72 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Galician) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Polish) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Czech) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Greek) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (French) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (German) Currently translated at 100.0% (649 of 649 strings) Translated using Weblate (Hindi) Currently translated at 19.4% (14 of 72 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (72 of 72 strings) Translated using Weblate (Korean) Currently translated at 100.0% (648 of 648 strings) Co-authored-by: Abhilash Co-authored-by: Agnieszka C Co-authored-by: Ahmad0a Co-authored-by: Ajeje Brazorf Co-authored-by: Alex25820 Co-authored-by: Danial Behzadi Co-authored-by: ERYpTION Co-authored-by: Edward Co-authored-by: Eric Co-authored-by: Fjuro Co-authored-by: GET100PERCENT Co-authored-by: GnuPGを使うべきだ Co-authored-by: Hoseok Seo Co-authored-by: Hosted Weblate Co-authored-by: Ihor Hordiichuk Co-authored-by: JY3 Co-authored-by: Jeff Huang Co-authored-by: Linerly Co-authored-by: Nidi Co-authored-by: Nikodem Zawirski Co-authored-by: Oymate Co-authored-by: Oğuz Ersen Co-authored-by: Priit Jõerüüt Co-authored-by: RSoulwin Co-authored-by: Retrial Co-authored-by: Rex_sa Co-authored-by: Ricardo Co-authored-by: SalusVF Co-authored-by: ShareASmile Co-authored-by: Translator Co-authored-by: Vasilis K Co-authored-by: VfBFan Co-authored-by: Yaron Shahrabani Co-authored-by: bowornsin Co-authored-by: gallegonovato Co-authored-by: nautilusx Co-authored-by: pjammo Co-authored-by: random r Co-authored-by: ssantos Co-authored-by: tryvseu Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pa/ Translation: NewPipe/Metadata * Translated using Weblate (Slovenian) Currently translated at 63.6% (414 of 650 strings) * Translated using Weblate (Azerbaijani) Currently translated at 100.0% (650 of 650 strings) * Translated using Weblate (Assamese) Currently translated at 3.6% (24 of 650 strings) Co-authored-by: Hosted Weblate Co-authored-by: Abhilash Co-authored-by: Agnieszka C Co-authored-by: Ahmad0a Co-authored-by: Ajeje Brazorf Co-authored-by: Alex25820 Co-authored-by: Danial Behzadi Co-authored-by: ERYpTION Co-authored-by: Edward Co-authored-by: Eric Co-authored-by: Fjuro Co-authored-by: GET100PERCENT Co-authored-by: GnuPGを使うべきだ Co-authored-by: Hoseok Seo Co-authored-by: Ihor Hordiichuk Co-authored-by: JY3 Co-authored-by: Jeff Huang Co-authored-by: Linerly Co-authored-by: Nidi Co-authored-by: Nikodem Zawirski Co-authored-by: Oymate Co-authored-by: Oğuz Ersen Co-authored-by: Priit Jõerüüt Co-authored-by: RSoulwin Co-authored-by: Retrial Co-authored-by: Rex_sa Co-authored-by: Ricardo Co-authored-by: SalusVF Co-authored-by: ShareASmile Co-authored-by: Translator Co-authored-by: Vasilis K Co-authored-by: VfBFan Co-authored-by: Yaron Shahrabani Co-authored-by: bowornsin Co-authored-by: gallegonovato Co-authored-by: nautilusx Co-authored-by: pjammo Co-authored-by: random r Co-authored-by: ssantos Co-authored-by: tryvseu Co-authored-by: HudobniVolk --- app/src/main/res/values-ar/strings.xml | 2 + app/src/main/res/values-as/strings.xml | 28 ++++ app/src/main/res/values-az/strings.xml | 2 + app/src/main/res/values-bn/strings.xml | 1 + app/src/main/res/values-ca/strings.xml | 2 + app/src/main/res/values-cs/strings.xml | 4 +- app/src/main/res/values-da/strings.xml | 134 ++++++++++++++---- app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values-el/strings.xml | 2 + app/src/main/res/values-es/strings.xml | 2 + app/src/main/res/values-et/strings.xml | 1 + app/src/main/res/values-fa/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-gl/strings.xml | 1 + app/src/main/res/values-he/strings.xml | 2 + app/src/main/res/values-hi/strings.xml | 1 + app/src/main/res/values-in/strings.xml | 2 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 11 +- app/src/main/res/values-ko/strings.xml | 6 + app/src/main/res/values-nn/strings.xml | 9 +- app/src/main/res/values-or/strings.xml | 3 +- app/src/main/res/values-pa/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 4 +- app/src/main/res/values-pt-rBR/strings.xml | 2 + app/src/main/res/values-pt-rPT/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ro/strings.xml | 25 ++-- app/src/main/res/values-sc/strings.xml | 5 + app/src/main/res/values-sl/strings.xml | 10 +- app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-th/strings.xml | 3 + app/src/main/res/values-tr/strings.xml | 2 + app/src/main/res/values-uk/strings.xml | 2 + app/src/main/res/values-zh-rCN/strings.xml | 4 +- app/src/main/res/values-zh-rTW/strings.xml | 1 + .../metadata/android/ar/changelogs/71.txt | 18 +-- .../metadata/android/ar/changelogs/991.txt | 13 ++ .../metadata/android/de/changelogs/975.txt | 16 +++ .../metadata/android/de/changelogs/976.txt | 10 ++ .../metadata/android/de/changelogs/977.txt | 9 ++ .../metadata/android/de/changelogs/988.txt | 2 + .../metadata/android/de/changelogs/989.txt | 3 + .../metadata/android/de/changelogs/990.txt | 15 ++ .../metadata/android/de/changelogs/991.txt | 13 ++ .../metadata/android/hi/changelogs/991.txt | 1 + .../metadata/android/pa/changelogs/65.txt | 1 + .../metadata/android/pa/changelogs/66.txt | 1 + .../metadata/android/pa/changelogs/68.txt | 1 + .../metadata/android/pa/changelogs/69.txt | 1 + .../metadata/android/pa/changelogs/70.txt | 1 + .../metadata/android/pa/changelogs/71.txt | 1 + .../metadata/android/pa/changelogs/730.txt | 2 + .../metadata/android/pa/changelogs/740.txt | 1 + .../metadata/android/pa/changelogs/750.txt | 1 + .../metadata/android/pa/changelogs/760.txt | 1 + .../metadata/android/pa/changelogs/770.txt | 4 + .../metadata/android/pa/changelogs/780.txt | 1 + .../metadata/android/pa/changelogs/790.txt | 1 + .../metadata/android/pa/changelogs/800.txt | 1 + .../metadata/android/pa/changelogs/810.txt | 1 + .../metadata/android/pa/changelogs/820.txt | 1 + .../metadata/android/pa/changelogs/830.txt | 1 + .../metadata/android/pa/changelogs/840.txt | 1 + .../metadata/android/pa/changelogs/850.txt | 1 + .../metadata/android/pa/changelogs/860.txt | 1 + .../metadata/android/pa/changelogs/870.txt | 2 + .../metadata/android/pa/changelogs/900.txt | 1 + .../metadata/android/pa/changelogs/910.txt | 1 + .../metadata/android/pa/changelogs/920.txt | 1 + .../metadata/android/pa/changelogs/930.txt | 1 + .../metadata/android/pa/changelogs/940.txt | 1 + .../metadata/android/pa/changelogs/950.txt | 4 + .../metadata/android/pa/changelogs/951.txt | 13 ++ .../metadata/android/pa/changelogs/952.txt | 7 + .../metadata/android/pa/changelogs/953.txt | 1 + .../metadata/android/pa/changelogs/954.txt | 8 ++ .../metadata/android/pa/changelogs/955.txt | 3 + .../metadata/android/pa/changelogs/956.txt | 1 + .../metadata/android/pa/changelogs/957.txt | 10 ++ .../metadata/android/pa/changelogs/958.txt | 1 + .../metadata/android/pa/changelogs/959.txt | 3 + .../metadata/android/pa/changelogs/960.txt | 4 + .../metadata/android/pa/changelogs/961.txt | 1 + .../metadata/android/pa/changelogs/962.txt | 2 + .../metadata/android/pa/changelogs/963.txt | 1 + .../metadata/android/pa/changelogs/964.txt | 1 + .../metadata/android/pa/changelogs/965.txt | 1 + .../metadata/android/pa/changelogs/966.txt | 1 + .../metadata/android/pa/changelogs/967.txt | 1 + .../metadata/android/pa/changelogs/968.txt | 1 + .../metadata/android/pa/changelogs/969.txt | 1 + .../metadata/android/pa/changelogs/970.txt | 1 + .../metadata/android/pa/changelogs/971.txt | 3 + .../metadata/android/pa/changelogs/972.txt | 13 ++ .../metadata/android/pa/changelogs/973.txt | 4 + .../metadata/android/pa/changelogs/974.txt | 5 + .../metadata/android/pa/changelogs/975.txt | 16 +++ .../metadata/android/pa/changelogs/976.txt | 10 ++ .../metadata/android/pa/changelogs/977.txt | 10 ++ .../metadata/android/pa/changelogs/978.txt | 1 + .../metadata/android/pa/changelogs/979.txt | 2 + .../metadata/android/pa/changelogs/980.txt | 12 ++ .../metadata/android/pa/changelogs/981.txt | 2 + .../metadata/android/pa/changelogs/982.txt | 1 + .../metadata/android/pa/changelogs/983.txt | 9 ++ .../metadata/android/pa/changelogs/984.txt | 7 + .../metadata/android/pa/changelogs/985.txt | 1 + .../metadata/android/pa/changelogs/986.txt | 15 ++ .../metadata/android/pa/changelogs/987.txt | 11 ++ .../metadata/android/pa/changelogs/988.txt | 2 + .../metadata/android/pa/changelogs/989.txt | 3 + .../metadata/android/pa/changelogs/990.txt | 13 ++ 113 files changed, 556 insertions(+), 61 deletions(-) create mode 100644 app/src/main/res/values-as/strings.xml create mode 100644 fastlane/metadata/android/ar/changelogs/991.txt create mode 100644 fastlane/metadata/android/de/changelogs/975.txt create mode 100644 fastlane/metadata/android/de/changelogs/976.txt create mode 100644 fastlane/metadata/android/de/changelogs/977.txt create mode 100644 fastlane/metadata/android/de/changelogs/988.txt create mode 100644 fastlane/metadata/android/de/changelogs/989.txt create mode 100644 fastlane/metadata/android/de/changelogs/990.txt create mode 100644 fastlane/metadata/android/de/changelogs/991.txt create mode 100644 fastlane/metadata/android/hi/changelogs/991.txt create mode 100644 fastlane/metadata/android/pa/changelogs/65.txt create mode 100644 fastlane/metadata/android/pa/changelogs/66.txt create mode 100644 fastlane/metadata/android/pa/changelogs/68.txt create mode 100644 fastlane/metadata/android/pa/changelogs/69.txt create mode 100644 fastlane/metadata/android/pa/changelogs/70.txt create mode 100644 fastlane/metadata/android/pa/changelogs/71.txt create mode 100644 fastlane/metadata/android/pa/changelogs/730.txt create mode 100644 fastlane/metadata/android/pa/changelogs/740.txt create mode 100644 fastlane/metadata/android/pa/changelogs/750.txt create mode 100644 fastlane/metadata/android/pa/changelogs/760.txt create mode 100644 fastlane/metadata/android/pa/changelogs/770.txt create mode 100644 fastlane/metadata/android/pa/changelogs/780.txt create mode 100644 fastlane/metadata/android/pa/changelogs/790.txt create mode 100644 fastlane/metadata/android/pa/changelogs/800.txt create mode 100644 fastlane/metadata/android/pa/changelogs/810.txt create mode 100644 fastlane/metadata/android/pa/changelogs/820.txt create mode 100644 fastlane/metadata/android/pa/changelogs/830.txt create mode 100644 fastlane/metadata/android/pa/changelogs/840.txt create mode 100644 fastlane/metadata/android/pa/changelogs/850.txt create mode 100644 fastlane/metadata/android/pa/changelogs/860.txt create mode 100644 fastlane/metadata/android/pa/changelogs/870.txt create mode 100644 fastlane/metadata/android/pa/changelogs/900.txt create mode 100644 fastlane/metadata/android/pa/changelogs/910.txt create mode 100644 fastlane/metadata/android/pa/changelogs/920.txt create mode 100644 fastlane/metadata/android/pa/changelogs/930.txt create mode 100644 fastlane/metadata/android/pa/changelogs/940.txt create mode 100644 fastlane/metadata/android/pa/changelogs/950.txt create mode 100644 fastlane/metadata/android/pa/changelogs/951.txt create mode 100644 fastlane/metadata/android/pa/changelogs/952.txt create mode 100644 fastlane/metadata/android/pa/changelogs/953.txt create mode 100644 fastlane/metadata/android/pa/changelogs/954.txt create mode 100644 fastlane/metadata/android/pa/changelogs/955.txt create mode 100644 fastlane/metadata/android/pa/changelogs/956.txt create mode 100644 fastlane/metadata/android/pa/changelogs/957.txt create mode 100644 fastlane/metadata/android/pa/changelogs/958.txt create mode 100644 fastlane/metadata/android/pa/changelogs/959.txt create mode 100644 fastlane/metadata/android/pa/changelogs/960.txt create mode 100644 fastlane/metadata/android/pa/changelogs/961.txt create mode 100644 fastlane/metadata/android/pa/changelogs/962.txt create mode 100644 fastlane/metadata/android/pa/changelogs/963.txt create mode 100644 fastlane/metadata/android/pa/changelogs/964.txt create mode 100644 fastlane/metadata/android/pa/changelogs/965.txt create mode 100644 fastlane/metadata/android/pa/changelogs/966.txt create mode 100644 fastlane/metadata/android/pa/changelogs/967.txt create mode 100644 fastlane/metadata/android/pa/changelogs/968.txt create mode 100644 fastlane/metadata/android/pa/changelogs/969.txt create mode 100644 fastlane/metadata/android/pa/changelogs/970.txt create mode 100644 fastlane/metadata/android/pa/changelogs/971.txt create mode 100644 fastlane/metadata/android/pa/changelogs/972.txt create mode 100644 fastlane/metadata/android/pa/changelogs/973.txt create mode 100644 fastlane/metadata/android/pa/changelogs/974.txt create mode 100644 fastlane/metadata/android/pa/changelogs/975.txt create mode 100644 fastlane/metadata/android/pa/changelogs/976.txt create mode 100644 fastlane/metadata/android/pa/changelogs/977.txt create mode 100644 fastlane/metadata/android/pa/changelogs/978.txt create mode 100644 fastlane/metadata/android/pa/changelogs/979.txt create mode 100644 fastlane/metadata/android/pa/changelogs/980.txt create mode 100644 fastlane/metadata/android/pa/changelogs/981.txt create mode 100644 fastlane/metadata/android/pa/changelogs/982.txt create mode 100644 fastlane/metadata/android/pa/changelogs/983.txt create mode 100644 fastlane/metadata/android/pa/changelogs/984.txt create mode 100644 fastlane/metadata/android/pa/changelogs/985.txt create mode 100644 fastlane/metadata/android/pa/changelogs/986.txt create mode 100644 fastlane/metadata/android/pa/changelogs/987.txt create mode 100644 fastlane/metadata/android/pa/changelogs/988.txt create mode 100644 fastlane/metadata/android/pa/changelogs/989.txt create mode 100644 fastlane/metadata/android/pa/changelogs/990.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index d7bbcd9c0fd..2fbe794a3b2 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -778,4 +778,6 @@ انقر للتنزيل %s الوضع السريع استيراد الاشتراكات أو تصديرها من القائمة المكونة من 3 نقاط + هذا الخيار متاح فقط إذا تم تحديد %s للسمة + إلغاء تعيين الصورة المصغرة الدائمة
\ No newline at end of file diff --git a/app/src/main/res/values-as/strings.xml b/app/src/main/res/values-as/strings.xml new file mode 100644 index 00000000000..57821339418 --- /dev/null +++ b/app/src/main/res/values-as/strings.xml @@ -0,0 +1,28 @@ + + + কোনো ষ্ট্ৰিম প্লেয়াৰ পোৱা নগ\'ল (আপুনি ইয়াক বজাবলৈ VLC ইনষ্টল কৰিব পাৰে)। + ইনষ্টল + বাতিল কৰক + ঠিক আছে + ব্ৰাউজাৰত খোলক + POPUP অৱস্থাত খোলক + ...ৰ সৈতে খোলক + চেয়াৰ + %1$s ত প্ৰকাশ কৰা হৈছে + কোনো ষ্ট্ৰিম প্লেয়াৰ পোৱা নগ\'ল। VLC ইনষ্টল কৰক\? + ডাউনল’ড + ষ্ট্ৰিম কৰা ফাইল ডাউনলোড কৰক + সন্ধান কৰক + ছেটিংছ + %s ৰ বাবে ফলাফল দেখুৱা হৈছে + চেয়াৰ কৰক + কিছু ৰিজ’লিউচনত অডিঅ’ আঁতৰাওক + চাবস্ক্ৰাইব কৰা হ\'ল + আনচাবস্ক্ৰাইব + আৰম্ভ কৰিবলৈ মেগনিফাইং গ্লাছৰ চিহ্নত টিপক। + চাবস্ক্ৰাইব + চোৱা হ\'ল (চিহ্নিত কৰক) + আপুনি \"%1$s\" বুজাইছিল নেকি\? + বাহ্যিক ভিডিঅ’ প্লেয়াৰ ব্যৱহাৰ কৰক + বাহ্যিক অডিঅ’ প্লেয়াৰ ব্যৱহাৰ কৰক + \ No newline at end of file diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 22f3ba5e51a..cd18e8d9393 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -726,4 +726,6 @@ Sürətli rejim 3 nöqtə menyudan abunələri idxal və ya ixrac et %s endirmək üçün toxun + Bu seçim yalnız tema üçün %s seçildikdə əlçatandır + Daimi miniatürü ləğv et \ No newline at end of file diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 899103c9d5d..46d12a8b69c 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -644,4 +644,5 @@ ভুক্তি মুছতে ডানে-বামে সরাও সম্প্রচার বিষয়ক তথ্য প্রক্রিয়ারত… ভবিষ্যৎ ভুক্তি দেখাও + প্লেব্যাক লোড বিরতির আকার \ No newline at end of file diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index ae4e4f018b9..fc9abd89162 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -701,4 +701,6 @@ Format desconegut Cualitat desconeguda Ordenar + Configura la notificació de reproducció actual. + Canvia la mida de l\'interval de càrrega (actualment %s). Un valor inferior pot accelerar la càrrega inicial del vídeo. Els canvis requereixen un reinici del jugador. \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index fdbc81d43d7..637678c230a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -598,7 +598,7 @@ Vypnout pro skrytí popisu videa a doplňkové informace Zbořit aplikaci Stahování bylo zahájeno - Můžete si zvolit svůj oblíbený motiv níže + Níže si můžete zvolit svůj oblíbený motiv Zvolte si svůj oblíbený noční motiv - %s Automatický (motiv zařízení) Radio @@ -739,4 +739,6 @@ Rychlý režim Používáte nejnovější verzi NewPipe Import nebo export odběrů z 3-tečkové nabídky + Tato možnost je dostupná pouze při vybraném motivu %s + Zrušení nastavení trvalého náhledu \ No newline at end of file diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 96ae5299d7c..f4601ec2d17 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -32,12 +32,12 @@ Baggrund Pop op Føj til - Placering af videodownloads + Mappe til download af video Downloadede videoer gemmes her - Angiv downloadmappe for videofiler - Downloadmappe for lydfiler + Angiv download-mappe for videofiler + Download-mappe for lydfiler Downloadede lydfiler gemmes her - Angiv downloadmappe for lydfiler + Angiv download-mappe for lydfiler Standardopløsning Standardopløsning for pop op Vis højere opløsninger @@ -45,7 +45,7 @@ Afspil med Kodi Installer manglede Kore-app\? Vis valgmuligheden \"Afspil med Kodi\" - Vis en knap til at afspille en video via Kodi + Vis en knap til at afspille en video via Kodi-mediecenteret Lyd Standardformat for lydfiler Standardformat for videofiler @@ -56,7 +56,7 @@ Husk størrelse og placering af pop op Husk sidste størrelse og placering af pop op-afspiller Brug hurtig og upræcis søgning - Upræcis søgning lader afspilleren finde placeringer hurtigere, men mindre præcist. Søgninger på 5, 15 eller 25 sekunder fungerer ikke med denne indstilling, slået til + Upræcis søgning lader afspilleren finde placeringer hurtigere, men mindre præcist. Søgninger på 5, 15 eller 25 sekunder fungerer ikke med denne indstilling slået til Indlæs miniaturebilleder Slå fra for at undgå indlæsning af billeder, hvorved der spares data og hukommelse. Ændringer sletter billedcachen i både ram og lager Billedcache slettet @@ -64,7 +64,7 @@ Slet alle websidedata fra cachen Metadata-cache slettet Føj automatisk næste stream til køen - Fortsæt nedlukningen af en (ikke-gentagende) playback kø ved at tilføje et relateret stream + Fortsæt en afspilningskø, der afsluttes (ikke-gentagende), ved at tilføje en lignende stream Juster lydstyrke ved hjælp af fingerbevægelser Brug fingerbevægelser til at kontrollere afspillerens lydstyrke Styr lysstyrken med fingerbevægelser @@ -101,7 +101,7 @@ Fejlrapport Alle Kanaler - Playlister + Spillelister Én video %s videoer @@ -130,7 +130,7 @@ Overskriver din nuværende historik, abonnementer, spillelister og (hvis det ønskes) indstillinger Eksporter historik, abonnementer, spillelister og indstillinger Slet visningshistorik - Sletter historikken og positioner af tidligere viste videoer + Sletter historikken over afspillede streams og afspilningspositionerne Slet hele visningshistorikken\? Visningshistorikken blev slettet Slet søgehistorik @@ -217,7 +217,7 @@ Om NewPipe Tredjepartslicenser © %1$s af %2$s under %3$s - Om + Om & Ofte stillede spørgsmål Licenser Åben letvægtsstreaming på Android. Bidrag til projektet @@ -330,7 +330,7 @@ Luk skuffe Hvad:\\nForespørgsel:\\nIndholdssprog:\\nIndholdsland:\\nAppsprog:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersion:\\nOS-version: Standardhandling når indhold åbnes – %s - Anvend som playlistens miniature + Anvend som spillelistens miniaturebillede Bogmærk spilleliste Fjern bogmærke Føjet til spillelisten @@ -386,7 +386,7 @@ Afspil automatisk Ryd data Positioner i lister - Genopret forrige afspilningsposition + Gendan sidste afspilningsposition Fortsæt afspilning Slå fra for at skjule kommentarer Vis kommentarer @@ -398,7 +398,7 @@ Anden handlingstast Tredje handlingstast Viser resultater for: %s - Åben med + Åbn med LeakCanary er ikke tilgængelig Markér som set Beskrivelse @@ -447,7 +447,7 @@ Nye streams Notifikationer om nye streams fra abonnementer reCAPTCHA cookies er ryddet - Slet alle playback positioner\? + Slet alle afspilningspositioner\? Filen er flyttet eller slettet NewPipe stødte ind i en fejl, tryk for at rapportere Rapporter på GitHub @@ -463,9 +463,9 @@ Download fuldført %s downloads fuldført - Lav indlæsningsintervallets størrelse, (som nu ligger på %s) om. En højere værdi kan øge videoindlæsningshastigheden. Ændringer af værdien kræver genstart. + Ændr indlæsningsintervallets størrelse (som nu er på %s). En lavere værdi kan øge videoindlæsningshastigheden. Ændringer kræver en genstart af afspiller Den aktive spilleliste bliver udskiftet - At skifte fra en afspiller til en anden kan udskifte din kø + Hvis du skifter fra en spiller til en anden, kan din kø blive erstattet Vis metainformation Lokale søgeforslag Fjerne søgeforslag @@ -475,8 +475,8 @@ Notifikationer om videohashfunktioners status Fejlrapport-notifikation Notifikationer for at rapportere fejl - Slet playback positioner - Sletter alle playback positioner + Slet afspilningspositioner + Sletter alle afspilningspositioner Spørg hvor filen skal downloades Et download ad gangen Slet downloadede filer @@ -487,23 +487,23 @@ \nNewPipes fortrolighedspolitik forklarer i detaljer, hvilke data der bliver sendt og opbevaret når du sender en nedbrudsrapport. Kopier en formatteret rapport Giv tilladelse til at vise over andre apps - Vis playback positionsvisere i lister - Playback positioner slettet + Vis indikatorer for afspilningsposition i lister + Afspilningspositioner slettet Ryd reCAPTCHA cookies Der er en afventende download med dette navn Start downloads - Skaler miniaturebilledet til 1:1 format - Skaler notifikationsminiaturebillederne fra 16:9 til 1:1 format (dette kan medføre forvrængninger) - Rediger hver eneste varselshandling nedenunder ved at trykke på dem. Vælg op til tre af dem som bliver vist i den lille notifikation, via kasserne til højre + Beskær miniaturebillede til 1:1 format + Beskær video-miniaturebillede i notifikationen fra 16:9 til 1:1 format + Rediger hver eneste varselshandling nedenunder ved at trykke på dem. Vælg op til tre af dem som bliver vist i den lille notifikation, via afkrydsningsfelterne til højre Du kan kun vælge op til tre handlinger som kan vises i den lille notifikation! Buffer Få Android til at vælge notifikationens farve ud fra den primære farve i miniaturebilledet (virker ikke på alle enheder) - Nattetema + Nattema Frem- og tilbagesøgningstid Denne video er aldersbegrænset. \nPga. YouTubes politik om aldersbegrænsede videoer har NewPipe ikke adgang til videoen. Crash afspilleren - Spørg om bekræftelse før du tømmer en kø + Spørg om bekræftelse før du rydder en kø Forhåndsvisning af miniaturebilleder på statuslinjen Sæt i kø som næste Er sat som næste i køen @@ -514,8 +514,8 @@ Kommentarer Relaterede objekter Stryg på elementer for at fjerne dem - Vælg en playliste - Ingen playliste bogmærker endnu + Vælg en spilleliste + Ingen spilleliste-bogmærker endnu Sproget ændres når appen genstarter Spillekø Vis kanalens detaljer @@ -530,7 +530,7 @@ Alle netværk Kontrolfrekvens Notifikationer ved nye streams - Notifikationer om ny streams fra abonnomenter + Giv besked om nye streams fra abonnementer Tjek manuelt efter opdateringer Tjekker efter opdateringer… Gendanner @@ -555,8 +555,8 @@ Vis sete elementer Dette indhold er ikke tilgængeligt i dit land. Af %s - Videoer på playlisten som allerede er blevet set fjernes. -\nDette kan ikke fortrydes! + Videoer, der er blevet set før og efter, at de er blevet tilføjet til spillelisten, vil blive fjernet. +\nEr du sikker\? Dette kan ikke gøres om! Vis miniaturebillede Tags Aldersbegrænsning @@ -653,4 +653,78 @@ Vis et crash alternativ når afspilleren er i brug Vis en fejl snackbar Brug system mappevælger (SAF) + Kanalens avatar-miniaturebillede + Dette er et SoundCloud Go+-nummer, i hvert fald i dit land, så det kan ikke streames eller downloades af NewPipe. + Der blev ikke fundet nogen passende filhåndtering til denne handling. +\nInstaller en Storage Access Framework-kompatibel filhåndtering + Der blev ikke fundet nogen passende filhåndtering til denne handling. +\nInstaller et filhåndteringsprogram eller prøv at deaktivere \'%s\' i download-indstillingerne + Aktivér valg af tekst i beskrivelsen + Automatisk (enhedstema) + Deaktiver valg af tekst i beskrivelsen + Fastgjort kommentar + Du abonnerer nu på denne kanal + , + Få besked + Du vil blive spurgt, hvor du vil gemme hver enkelt download + Den er tilgængelig i nogle tjenester og er normalt meget hurtigere, men kan returnere et begrænset antal elementer og ofte ufuldstændige oplysninger (f.eks. ingen varighed, elementtype, ingen live-status) + Ukendt format + Ukendt kvalitet + Hjertemarkeret af indholdsskaberen + Intervalstørrelse for afspilningsindlæsning + ExoPlayer-standard + Tomt gruppenavn + Du vil blive spurgt, hvor du vil gemme hver enkelt download. +\nAktiver systemet mappevælger (SAF), hvis du vil downloade til et eksternt SD-kort + Originaltekster fra tjenester vil være synlige i stream-emner + Ingen videostreams er tilgængelige for eksterne afspillere + URL til miniaturebillede + Fra + Tablet-tilstand + Skjul fremtidige elementer + Denne video er kun tilgængelig for YouTube Music Premium-medlemmer, så den kan ikke streames eller downloades af NewPipe. + \"Storage Access Framework\" gør det muligt at downloade til et eksternt SD-kort + Fremtving indberetning af ikke-leverbare Rx-undtagelser uden for fragmentets eller aktivitetens livscyklus efter bortskaffelse + Tryk for at downloade %s + Fra og med Android 10 understøttes kun \"Storage Access Framework\" + Synes du, at feed-indlæsning er for langsom\? Hvis det er tilfældet, så prøv at aktivere hurtig indlæsning (du kan ændre det i indstillingerne eller ved at trykke på knappen nedenfor). +\n +\nNewPipe tilbyder to strategier til feed-indlæsning: +\n- Hentning af hele abonnementskanalen, hvilket er langsomt, men komplet. +\n- Brug af et dedikeret service endpoint, hvilket er hurtigt, men normalt ikke komplet. +\n +\nForskellen mellem de to er, at den hurtige metode normalt mangler nogle oplysninger, f.eks. elementets varighed eller type (kan ikke skelne mellem livevideoer og normale videoer), og den returnerer muligvis færre elementer. +\n +\nYouTube er et eksempel på en tjeneste, der tilbyder denne hurtige metode med sit RSS-feed. +\n +\nValget er altså et spørgsmål om, hvad du foretrækker: hastighed eller præcise oplysninger. + Den valgte stream er ikke understøttet af eksterne afspillere + Denne indstilling er kun tilgængelig, hvis %s er valgt som tema + Du kan nu vælge tekst i beskrivelsen. Bemærk, at siden kan flimre, og at links muligvis ikke kan klikkes på, mens du er i valgtilstand. + Streams, som endnu ikke understøttes af downloaderen, vises ikke + Hurtig tilstand + Importér eller eksportér abonnementer fra 3-punktsmenuen + Ofte stillede spørgsmål + Hvis du har problemer med at bruge appen, bør du tjekke disse svar på almindelige spørgsmål! + Se på hjemmeside + Vis Picasso-farvede bånd oven på billeder, der angiver deres kilde: rød for netværk, blå for disk og grøn for hukommelse + Du kører den nyeste version af NewPipe + På grund af ExoPlayer-begrænsninger blev søgetiden sat til %d sekunder + Vis kun ikke-grupperede abonnementer + Skjul sete elementer + Side med spillelister + Du kan vælge dit foretrukne nattema nedenfor + Vælg dit foretrukne nattema - %s + Support + Host + Offentlig + Ikke oplyst + Privat + Intern + Til + Skift alle + Ingen lydstreams er tilgængelige for eksterne afspillere + Vælg kvalitet til eksterne afspillere + Vis fremtidige elementer + Sortér \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7d8e64475d3..d02b276cd0a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -726,4 +726,6 @@ Du verwendest die neueste Version von NewPipe Antippen um %s herunterzuladen Importieren oder Exportieren von Abonnements über das 3-Punkte-Menü + Diese Option ist nur verfügbar, wenn %s als Design ausgewählt wird + Dauerhaftes Vorschaubild aufheben \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index ae9571aa12f..cf3c0576b01 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -726,4 +726,6 @@ Εισάγετε ή εξάγετε συνδρομές από το μενού 3 κουκκίδων Πατήστε για λήψη %s Έχετε την πιο πρόσφατη έκδοση του NewPipe + Αυτή η επιλογή είναι διαθέσιμη μόνο εάν έχει επιλεγεί %s για Θέμα + Κατάργηση μόνιμης μικρογραφίας \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 48e96ebecef..f92ad9128de 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -742,4 +742,6 @@ Importa o exporta las suscripciones desde el menú con los tres puntos Está ejecutando la última versión de NewPipe Pulsa para descargar %s + Esta opción sólo está disponible si %s está seleccionado para el tema + Desactivar las miniaturas permanente \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 7f2691b77e6..87beff94ffe 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -726,4 +726,5 @@ Kiirrežiim Tellimusi saad importida või eksportida 3 punktiga menüüst Sa kasutad NewPipe\'i uusimat versiooni + See valik on kasutusel vaid %s teema puhul \ No newline at end of file diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 123c3b2014b..f22200c06b7 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -726,4 +726,5 @@ حالت سریع ضربه برای بارگیری %s از جدیدترین نگارش نیوپایپ استفاده می‌کنید + این گزینه تنها هنگامی موجود است که %s به عنوان زمینه گزیده باشد \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index fd2f027f86f..a3373ca6e00 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -742,4 +742,5 @@ Vous utilisez la dernière version de NewPipe Appuyez pour télécharger %s Échec de la copie dans le presse-papiers + Cette option est disponible seulement si %s est sélectionné pour le thème \ No newline at end of file diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index fcabbd95bde..65d5ce2048c 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -726,4 +726,5 @@ Estás executandola última versión de NewPipe Toca para descargar %s Importa ou exporta subscricións dende o menú dos 3 puntos + Esta opción só está dispoñible se %s está seleccionado para o tema \ No newline at end of file diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 6d21a5943ed..67e6d45ad40 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -752,4 +752,6 @@ נגיעה כאן תוריד את %s מצב מהיר זאת הגרסה העדכנית ביותר של NewPipe + אפשרות זאת זמינה רק אם נבחרה ערכת נושא %s + ביטול הגדרת תמונה ייצוגית קבועה \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index b4f9fadc044..7c9ebf23174 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -726,4 +726,5 @@ 3-बिंदु वाले मेन्यू से सब्सक्रिप्शनस आयात या निर्यात करें आप न्यूपाइप का नवीनतम संस्करण चला रहे हैं %s डाउनलोड करने के लिए टैप करें + यह विकल्प केवल तभी उपलब्ध होता है जब थीम के लिए %s का चयन किया जाता है \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index a5b9a3ff2db..af8781a2356 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -713,4 +713,6 @@ Impor atau ekspor langganan dari menu 3 titik Anda menjalankan NewPipe versi terkini Ketuk untuk mengunduh %s + Opsi ini hanya tersedia jika %s dipilih untuk Tema + Batalkan penetapan gambar kecil permanen \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index d2b0d10fe93..3304321d81e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -739,4 +739,5 @@ Premi per scaricare %s L\'ultima versione di NewPipe è già in esecuzione Importa o esporta iscrizioni dal menu a 3 punti + Questa opzione è disponibile solo se %s è selezionato come Tema \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index fcf2d3c9457..480d869e5dc 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -108,7 +108,7 @@ NewPipe について サードパーティー ライセンス © %1$s 作者 %2$s ライセンス %3$s - このアプリについて + バージョン情報とよくある質問 ライセンス Android 向けのフリーで軽量なストリーミング。 GitHub で表示 @@ -176,7 +176,7 @@ 一度だけ データベースをインポート データベースをエクスポート - 既存の履歴、登録リスト、プレイリストおよび (任意) 設定は上書きされます + 既存の履歴、登録チャンネル一覧、プレイリストおよび (任意) 設定は上書きされます 再生履歴、登録チャンネル一覧、プレイリストおよび設定をエクスポートします エラーから回復中です 外部プレイヤーは、これらのタイプのリンクをサポートしていません @@ -705,4 +705,11 @@ 次のアイテムを表示する 再生済みを隠す 次のアイテムを隠す + 並び替え + ウェブサイトを表示 + タップして%sをダウンロード + あなたはNewPipeの最新版を起動しています + よくある質問 + アプリの使い方に困ったときは、よくある質問に答えていますので、ぜひご覧ください! + %sがテーマに選択された場合のみ、この選択肢が利用可能です \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index d7503a94122..95df1e9a44c 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -709,4 +709,10 @@ 자주 묻는 질문 웹사이트에서 보기 정렬 + 빠른 모드 + 점 3개 메뉴에서 구독 가져오기 또는 내보내기 + 최신 버전의 NewPipe를 실행 중입니다. + %s를 다운로드하려면 탭하세요. + 영구 썸네일 설정 해제 + 이 옵션은 테마로 %s를 선택한 경우에만 사용할 수 있음 \ No newline at end of file diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index d937b6a6902..f7d4eec86ae 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -14,7 +14,7 @@ Del Søk Innstillingar - Tenkte du på «%1$s»\? + Meinte du «%1$s»\? Del med Nytta ytre videospelar Tek bort ljod ved somme oppløysingar @@ -63,4 +63,11 @@ Straumar som ikkje enno er stødde av hentaren, er ikkje synlege Ukjend kvalitet Ukjend format + Forvald oppløysing + Forvald oppsprettsoppløysing + Vis eit val om å spela av ein video med mediasamlestaden Kodi + Skjer småbiletet til storleikshøvet 1:1 + Skjer videosmåbiletet som vert vist i varselet, ifrå storleikshøvet 16:9 til 1:1 + Fyrste gjerdknapp + Andre gjerdknapp \ No newline at end of file diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 7497e5e4817..0ad616d014a 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -74,7 +74,7 @@ ଭିଡିଓ ବର୍ଣ୍ଣନା ଏବଂ ଅତିରିକ୍ତ ସୂଚନା ଲୁଚାଇବାକୁ ବନ୍ଦ କରନ୍ତୁ ଅଡିଓ ବାହ୍ୟ ଅଡିଓ ପ୍ଲେୟାର ବ୍ୟବହାର କରନ୍ତୁ - ସବସ୍କ୍ରାଇବ କରନ୍ତୁ + ସଦସ୍ୟତା ଯୋଡ଼ନ୍ତୁ ସଦସ୍ୟତା ଅଦ୍ୟତନ କରିପାରିଲା ନାହିଁ ଟ୍ୟାବ୍ ବାଛନ୍ତୁ ଅଡିଓ ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ @@ -726,4 +726,5 @@ 3-ଡଟ୍ ମେନୁରୁ ସଦସ୍ୟତା ଆମଦାନୀ କିମ୍ବା ରପ୍ତାନି କରନ୍ତୁ ଆପଣ NewPipe ର ସର୍ବଶେଷ ସଂସ୍କରଣ ଚଳାଉଛନ୍ତି %s ଡାଉନଲୋଡ୍ କରିବାକୁ ଟ୍ୟାପ୍ କରନ୍ତୁ + ଥିମ୍ ପାଇଁ %s ଚୟନ ହେଲେ ହିଁ ଏହି ବିକଳ୍ପ ଉପଲବ୍ଧ \ No newline at end of file diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 08c7e47c9fe..169d45dada2 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -726,4 +726,5 @@ 3-ਡੌਟ ਮੀਨੂ ਤੋਂ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਨੂੰ ਆਯਾਤ ਜਾਂ ਨਿਰਯਾਤ ਕਰੋ ਤੁਸੀਂ ਨਿਊਪਾਈਪ ਦਾ ਨਵੀਨਤਮ ਸੰਸਕਰਣ ਚਲਾ ਰਹੇ ਹੋ %s ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ + ਇਹ ਵਿਕਲਪ ਤਾਂ ਹੀ ਉਪਲਬਧ ਹੈ ਜੇਕਰ %s ਨੂੰ ਥੀਮ ਲਈ ਚੁਣਿਆ ਗਿਆ ਹੈ \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a24be6b9427..ab1e0aa72d6 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -618,7 +618,7 @@ Automatyczny (motyw urządzenia) Motyw nocny Pokaż szczegóły kanału - Wyłącz tunelowanie multimediów, jeśli zaobserwowałeś czarny ekran bądź brak płynności odtwarzania wideo + Wyłącz tunelowanie multimediów, jeśli zaobserwowałeś(-aś) czarny ekran bądź brak płynności odtwarzania wideo Wyłącz tunelowanie multimediów Ograniczenie wiekowe Wyłącz zaznaczanie tekstu w opisie @@ -747,4 +747,6 @@ Tryb szybki Importuj lub eksportuj subskrypcje z menu z trzema kropkami. Używasz najnowszej wersji NewPipe + Ta opcja jest dostępna tylko wtedy, gdy %s jest wybrany jako motyw + Usuń stałą miniaturę \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index be1f732d1e2..1929df07041 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -739,4 +739,6 @@ Importar ou exportar inscrições do menu de 3 pontos Toque para baixar %s Você está executando a versão mais recente do NewPipe + Esta opção só está disponível se %s for selecionado para Tema + Desativar miniatura permanente \ No newline at end of file diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 0a2205eeedd..5a0d1928549 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -726,4 +726,5 @@ Já está a executar a versão mais recente do NewPipe Toque para descarregar %s Ordenação + Esta opção só está disponível se %s for selecionado como tema \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 862d6e38381..e993da9348c 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -739,4 +739,5 @@ Importar ou exportar subscrições do menu de 3 pontos Já está a executar a versão mais recente do NewPipe Toque para descarregar %s + Esta opção só está disponível se %s for selecionado para o tema \ No newline at end of file diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 636c617b2f8..2dc847dafd0 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -1,11 +1,11 @@ - Încărcat pe %1$s + Publicat pe %1$s Niciun player pentru streaming găsit. Instalați VLC\? Instalare Anulare Deschidere în browser - Distribuiți + Distribuire Descărcare Căutare Setări @@ -78,7 +78,7 @@ Vă rugăm așteptați… Copiat în clipboard Vă rugăm să definiți un folder de descărcare mai târziu în setări - Deschide în modul popup + Deschidere în modul popup Această permisiune este necesară pentru a \ndeschide în mod pop-up Provocare reCAPTCHA @@ -105,7 +105,7 @@ Alegeți sugestiile care vor fi afișate la căutare Ștergeți Rezoluție maximă - Abonează-te + Abonare Abonat(ă) Canal dezabonat Nu s-a putut modifica abonamentul @@ -176,9 +176,9 @@ Noi și populare Niciun player pentru streaming găsit. (Totuși, puteți instala VLC). Descărcați fișierul de flux - Arată informații + Afișare informații Playlist-uri salvate - Salvează în + Salvare în Folosește parcurgerea rapidă inexactă Derularea inexactă permite player-ului să deruleze mai rapid, cu o precizie redusă. Derularea timp de 5, 15 sau 25 de secunde nu funcționează cu aceasta Încarcă miniaturi @@ -276,7 +276,7 @@ Viteză Acceptați Refuzați - Dezabonează-te + Dezabonare Alegeți fila Controlul prin gesturi al volumului Utilizați gesturi pentru a controla volumul @@ -367,9 +367,9 @@ Faceți ca Android să personalizeze culoarea notificării în funcție de culoarea principală din miniatură (rețineți că aceasta nu este disponibilă pe toate dispozitivele) Colorează notificarea Nimic - Tamponare + Se încarcă Redare aleatorie - Repetaţi + Repetare Puteți selecta cel mult trei acțiuni pentru afișare în notificarea compactă! Modificați fiecare acțiune de notificare de mai jos, atingând-o. Selectați până la trei dintre ele pentru a fi afișate în notificarea compactă, utilizând casetele de selectare din dreapta Al cincilea buton de acțiune @@ -379,7 +379,7 @@ Primul buton de acțiune Tăiați miniatura video afișată în notificare de la raportul de aspect 16:9 la 1:1 (poate introduce distorsiuni) Tăiere miniatură la raportul de aspect 1:1 - Se arată rezultate pentru:%s + Se arată rezultate pentru: %s Nicio aplicație de pe dispozitivul dvs. nu poate deschide acesta Capitole Recente @@ -595,7 +595,7 @@ Dezactivați pentru a ascunde casetele de informații meta cu informații suplimentare despre creatorul fluxului, conținutul fluxului sau o cerere de căutare Dezactivați pentru a ascunde descrierea videoclipului și informațiile suplimentare Arată descrierea - Deschideți cu + Deschidere cu Blocați aplicația Rezolvați Evidențiate @@ -733,10 +733,11 @@ Ascunde elementele din viitor Vezi pe website Dacă întâmpinați probleme cu utilizarea aplicației, nu uitați să consultați aceste răspunsuri la întrebări frecvente! - Întrebări puse frecvent + Întrebări frecvente Sortează Modul rapid Importați sau exportați abonamente din meniul cu 3 puncte Rulați cea mai recentă versiune NewPipe Atingeți pentru a descărca %s + Această opțiune este disponibilă numai dacă %s este selectată ca temă \ No newline at end of file diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index c3051300f6e..bdae4fd37c0 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -722,4 +722,9 @@ Si ses tenende problemas impreende s\'aplicatzione assegura·ti de consultare custas rispostas a preguntas fitianas! Pòmpia in su situ web Òrdina + Toca pro iscarrigare %s + Modalidade lestra + Importa o esporta iscritziones dae su menù a 3 puntos + Ses impreende s\'ùrtima versione de NewPipe + Custa optzione est a disponimentu petzi si %s est seletzionadu comente tema \ No newline at end of file diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index ea2a9dbb5a5..222b4b1376b 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -61,7 +61,7 @@ Poskusi znova Opomba (v angleščini): v živo - Začnite z iskanjem + Pritisnite lupo in začnite z iskanjem. Začni Premor Izbriši @@ -320,13 +320,13 @@ Naključno Ponovi Izberete lahko največ 3 dejanja, ki se bodo prikazala v kompaktnem obvestilu! - Uredite vsako obvestilo z klikom na obvestilo. Izberite do 3 obvestila, ki se bodo prikazala v kompaktnem obvestilu z uporabo potrditvenega polja na desni. + Uredite vsako dejanje obvestila z klikom na posamezno dejanje. Z uporabo potrditvenega polja na desni izberite do 3 dejanja obvestil, ki se bodo prikazala v kompaktnem obvestilu Gumb za peto dejanje Gumb za četrto dejanje Gumb za tretje dejanje Gumb za drugo dejanje Gumb za prvo dejanje - Povečaj sličico videa, ki je prikazana v obvestilu iz razmerja 16:9 v razmerje 1:1 (lahko pride do popačenja) + Povečaj sličico videa, ki je prikazana v obvestilu iz razmerja 16:9 v razmerje 1:1 Zruši aplikacijo Spremeni velikost besedila podnapisov in stil ozadja v predvajalniku. Zahteva ponovni zagon aplikacije, da učinkuje. Podnapisi @@ -464,4 +464,8 @@ Prikaži puščanje pomnilnika Prikaži detajle kanala Nočna tema + Povečaj sličico na razmerje 1:1 + Označi kot že ogledano + Uporabite hitro nenatančno iskanje + Sesuj predvajalnik \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 3bdb388c431..fbe793569fb 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -726,4 +726,5 @@ Snabbt läge Du använder den senaste versionen av NewPipe Tryck för att ladda ner %s + Det här alternativet är endast tillgängligt om %s har valts som Tema \ No newline at end of file diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index af5bb73efcb..12effb9e296 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -366,4 +366,7 @@ แสดงตำแหน่งวีดิโอที่เล่นในรายการ ล้างข้อมูล กำลังแสดงผลลัพธ์สำหรับ: %s + เปิดด้วย + ทำเครื่องหมายว่าดูแล้ว + ตกลง \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 5c3d072047e..c9718d0b080 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -726,4 +726,6 @@ NewPipe güncellemesi var! %s indirmek için dokunun 3-nokta menüsünden abonelikleri içe veya dışa aktarın + Bu seçenek yalnızca tema için %s seçildiğinde kullanılabilir + Kalıcı küçük resmin ayarını kaldır \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 9c4ec39572c..e812e8e4fe4 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -743,4 +743,6 @@ Торкніться, щоб завантажити %s Імпорт або експорт підписок з 3-крапкового меню Швидкий режим + Ця опція доступна, лише якщо темою обрано %s + Прибрати постійну мініатюру \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index e4358152311..c3ada7180b2 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -164,7 +164,7 @@ reCAPTCHA 验证 已请求新的 reCAPTCHA 验证 在悬浮窗中播放 - 默认分辨率(悬浮窗模式) + 悬浮窗默认分辨率 使用更高的分辨率 仅部分设备支持播放 2K 或 4K 视频 清除 @@ -713,4 +713,6 @@ 从三点菜单导入或导出订阅 你正在运行最新版的 NewPipe 轻按下载 %s + 只有在主题中选择了 %s 该选项才可用 + 取消设置永久缩略图 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index be81c294f6f..1ed552ab8cc 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -713,4 +713,5 @@ 輕點以下載 %s 快速模式 從三點式選單匯入或匯出訂閱 + 此選項僅在主題選擇為 %s 時可用 \ No newline at end of file diff --git a/fastlane/metadata/android/ar/changelogs/71.txt b/fastlane/metadata/android/ar/changelogs/71.txt index 6c02247bbc6..338ab17c5e5 100644 --- a/fastlane/metadata/android/ar/changelogs/71.txt +++ b/fastlane/metadata/android/ar/changelogs/71.txt @@ -1,10 +1,10 @@ -### تحسينات -* إضافة إشعار تحديث التطبيق لبناء GitHub (#1608 بواسطة krtkush) -* تحسينات مختلفة على برنامج التنزيل (# 1944 بواسطة kapodamy): - * إضافة الرموز البيضاء المفقودة واستخدام طريقة hardcored لتغيير ألوان الرمز - * تحقق مما إذا كان المكرر قد تمت تهيئته (إصلاحات #2031) - * السماح بإعادة المحاولة مع ظهور خطأ "فشلت المعالجة اللاحقة" في muxer الجديد - * MPEG-4 muxer الجديد الذي يعمل على تثبيت تدفقات الفيديو والصوت غير المتزامنة (#2039) +تحسين +*إضافة إشعار تحديث التطبيق لبناء GitHub (#1608 بواسطة krtkush) +*تحسينات مختلفة على برنامج التنزيل(#1944 بواسطة kapodamy): + *إضافة الرموز البيضاء المفقودة واستخدام طريقة hardcored لتغيير ألوان الرمز + *تحقق مما إذا كان المكرر قد تمت تهيئته(إصلاحات #2031) + *السماح بإعادة المحاولة مع ظهور خطأ "فشلت المعالجة اللاحقة" في muxer الجديد + *MPEG-4 muxer جديد يعمل على تثبيت تدفقات الفيديو والصوت غير المتزامنة(#2039) -### ثابت -* توقف البث المباشر على YouTube عن التشغيل بعد وقت قصير (#1996 by @yausername) +تصليح +*توقف البث المباشر على يوتيوب عن التشغيل بعد وقت قصير(#1996 by @yausername) diff --git a/fastlane/metadata/android/ar/changelogs/991.txt b/fastlane/metadata/android/ar/changelogs/991.txt new file mode 100644 index 00000000000..5eaebe7a979 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/991.txt @@ -0,0 +1,13 @@ +جديد +• إضافة زر "فتح في المتصفح" على واجهة الخطأ +• إضافة خيار لعرض مجموعات القنوات على شكل قائمة +• [YouTube] ضغطة مطولة على مقاطع الدفق لمشاركة رابط URL مع الطابع الزمني +• إضافة زر قائمة انتظار التشغيل للمشغل الصغير + +تحسينات +• إضافة الترجمة الأيسلندية وتحديث العديد من الترجمات الأخرى +• العديد من التحسينات الداخلية + +تصليحات +• إصلاح أعطاب متعددة +• [YouTube] إصلاح مشكلات تحميل القنوات، وتحميل التغذية غير المخصصة، والتشغيل البديل في بعض البلدان diff --git a/fastlane/metadata/android/de/changelogs/975.txt b/fastlane/metadata/android/de/changelogs/975.txt new file mode 100644 index 00000000000..de60202d168 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/975.txt @@ -0,0 +1,16 @@ +Neu +- Anzeige eines Vorschaubilds während der Suche +- Deaktivierte Kommentare erkennen +- Erlaubt das Markieren eines Feed-Elements als beobachtet +- Kommentarherzen anzeigen + +Verbessert +- Verbessertes Layout von Metadaten und Tags +- Dienstfarbe auf UI-Komponenten anwenden + +Behoben +- Korrektur des Vorschaubilds im Mini-Player +- Behebung der endlosen Pufferung bei doppelten Warteschlangenelementen +- Einige Player-Fixes wie Rotation und schnelleres Schließen +- Behebung von ReCAPTCHA +... diff --git a/fastlane/metadata/android/de/changelogs/976.txt b/fastlane/metadata/android/de/changelogs/976.txt new file mode 100644 index 00000000000..a70829150f4 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/976.txt @@ -0,0 +1,10 @@ +- Option zum direkten Öffnen des Players im Vollbildmodus hinzugefügt +- Auswahl der anzuzeigenden Suchvorschläge möglich +- Dunkles Theme jetzt dunkler + dunkler Splash-Screen hinzugefügt +- Verbesserte Dateiauswahl, um unerwünschte Dateien auszugrauen +- Import von YouTube-Abonnements behoben +- Das Wiederholen eines Streams erfordert ein erneutes Tippen auf die Wiedergabetaste +- Behoben: Audio-Sitzung schließen +... + +Änderungen finden Sie im Changelog (und im Blogbeitrag) auf dem Links-Tab unten. diff --git a/fastlane/metadata/android/de/changelogs/977.txt b/fastlane/metadata/android/de/changelogs/977.txt new file mode 100644 index 00000000000..54c3d72f6db --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/977.txt @@ -0,0 +1,9 @@ +- Die Schaltfläche "Weiter abspielen" wurde dem Langdruckmenü hinzugefügt +- YouTube Shorts Pfadpräfix zum Absichtsfilter hinzugefügt +- Import von Einstellungen behoben +- Position der Suchleiste mit Player-Schaltflächen im Warteschlangen-Bildschirm vertauscht +- Verschiedene Korrekturen im Zusammenhang mit MediasessionManager +- Die Suchleiste wurde nach dem Ende des Videos nicht abgeschlossen +... + +Weitere Änderungen finden Sie im Changelog (und im Blogbeitrag) auf der Registerkarte Links unten. diff --git a/fastlane/metadata/android/de/changelogs/988.txt b/fastlane/metadata/android/de/changelogs/988.txt new file mode 100644 index 00000000000..bde54eda1f2 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Fehler „Konnte keinen Stream abrufen“ behoben beim Versuch, ein Video abzuspielen +[YouTube] "Der folgende Inhalt ist in dieser App nicht verfügbar." anstelle des angeforderten Videos behoben diff --git a/fastlane/metadata/android/de/changelogs/989.txt b/fastlane/metadata/android/de/changelogs/989.txt new file mode 100644 index 00000000000..40e38f43e61 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] Unendliches Laden behoben beim Versuch, ein Video abzuspielen +• [YouTube] Drosselung bei einigen Videos behoben +• Aktualisierung der jsoup-Bibliothek auf 1.15.3, die einen Sicherheitsfix enthält diff --git a/fastlane/metadata/android/de/changelogs/990.txt b/fastlane/metadata/android/de/changelogs/990.txt new file mode 100644 index 00000000000..f1273a211c4 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/990.txt @@ -0,0 +1,15 @@ +Ab sofort entfällt die Unterstützung für Android 4.4 KitKat, die Mindestversion ist Android 5 Lollipop! + +Neu +- Herunterladen aus dem Langdruck-Menü +- Zukünftige Videos im Feed ausblenden +... + +Verbessert +- Refaktorierung des Player-Codes in kleine Komponenten: weniger RAM-Verbrauch, weniger Bugs +- Verbesserter Skalierungsmodus für Miniaturansichten +... + +Behoben +- Behebung verschiedener Probleme mit der Player-Benachrichtigung: veraltete/fehlende Medieninformationen, verzerrte Miniaturansicht +... diff --git a/fastlane/metadata/android/de/changelogs/991.txt b/fastlane/metadata/android/de/changelogs/991.txt new file mode 100644 index 00000000000..3a8cae2cbcc --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/991.txt @@ -0,0 +1,13 @@ +Neu +- Schaltfläche "Im Browser öffnen" im Fehlerbedienfeld hinzugefügt +- Option zur Anzeige von Kanalgruppen als Liste hinzugefügt +- [YouTube] Langes Klicken auf Streamsegmente zum Teilen der Zeitstempel-URL +- Schaltfläche "Warteschlange abspielen" zum Mini-Player hinzugefügt + +Verbessert +- Isländische Lokalisierung hinzugefügt, viele Übersetzungen aktualisiert +- Viele interne Verbesserungen + +Behoben +- Mehrere Abstürze behoben +- [YouTube] Behebung von Problemen beim Laden von Kanälen... diff --git a/fastlane/metadata/android/hi/changelogs/991.txt b/fastlane/metadata/android/hi/changelogs/991.txt new file mode 100644 index 00000000000..46ca2ebb666 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/991.txt @@ -0,0 +1 @@ +नया • त्रुटि पैनल में "ब्राउज़र में खोलें" बटन जोड़ें • चैनल समूहों को सूची के रूप में प्रदर्शित करने का विकल्प जोड़ें • [यूट्यूब] टाइमस्टैम्प यूआरएल साझा करने के लिए स्ट्रीम सेगमेंट पर लंबे समय तक क्लिक करें • मिनी प्लेयर में क्यू प्ले बटन जोड़ें उन्नत • आइसलैंडिक स्थानीयकरण जोड़ें और कई अन्य अनुवादों को अपडेट करें • कई आंतरिक सुधार हल किया गया • एकाधिक दुर्घटनाओं को ठीक करें • [यूट्यूब] कुछ देशों में लोडिंग चैनल, गैर-समर्पित फ़ीड और प्लेबैक समस्याओं को ठीक करें diff --git a/fastlane/metadata/android/pa/changelogs/65.txt b/fastlane/metadata/android/pa/changelogs/65.txt new file mode 100644 index 00000000000..0fbf1147e25 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/65.txt @@ -0,0 +1 @@ +### ਸੁਧਾਰ - ਬਰਗਰਮੇਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ #1486 ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ - ਡਾਉਨਲੋਡਸ #1472 ਨੂੰ ਮਿਟਾਉਣ ਨੂੰ ਅਨਡੂ ਕਰੋ - ਸ਼ੇਅਰ ਮੀਨੂ #1498 ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ - ਲੰਬੇ ਟੈਪ ਮੀਨੂ #1454 ਵਿੱਚ ਸ਼ੇਅਰ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ - ਨਿਕਾਸ #1354 'ਤੇ ਮੁੱਖ ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰੋ - ਲਾਇਬ੍ਰੇਰੀ ਸੰਸਕਰਣ ਅਪਡੇਟ ਅਤੇ ਡੇਟਾਬੇਸ ਬੈਕਅਪ ਫਿਕਸ #1510 - ExoPlayer 2.8.2 ਅੱਪਡੇਟ #1392 - ਤੇਜ਼ ਗਤੀ ਤਬਦੀਲੀ ਲਈ ਵੱਖ-ਵੱਖ ਸਟੈਪ ਸਾਈਜ਼ ਦਾ ਸਮਰਥਨ ਕਰਨ ਲਈ ਪਲੇਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ ਡਾਇਲਾਗ ਨੂੰ ਦੁਬਾਰਾ ਬਣਾਇਆ ਗਿਆ। - ਪਲੇਬੈਕ ਸਪੀਡ ਨਿਯੰਤਰਣ ਵਿੱਚ ਚੁੱਪ ਦੌਰਾਨ ਫਾਸਟ-ਫਾਰਵਰਡ ਕਰਨ ਲਈ ਇੱਕ ਟੌਗਲ ਜੋੜਿਆ ਗਿਆ। ਇਹ ਆਡੀਓਬੁੱਕਾਂ ਅਤੇ ਕੁਝ ਸੰਗੀਤ ਸ਼ੈਲੀਆਂ ਲਈ ਮਦਦਗਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ ਇੱਕ ਸੱਚਾ ਸਹਿਜ ਅਨੁਭਵ ਲਿਆ ਸਕਦਾ ਹੈ (ਅਤੇ ਬਹੁਤ ਸਾਰੀਆਂ ਚੁੱਪ =\\ ਨਾਲ ਗੀਤ ਤੋੜ ਸਕਦਾ ਹੈ)। - ਹੱਥੀਂ ਅਜਿਹਾ ਕਰਨ ਦੀ ਬਜਾਏ, ਪਲੇਅਰ ਵਿੱਚ ਅੰਦਰੂਨੀ ਤੌਰ 'ਤੇ ਮੀਡੀਆ ਦੇ ਨਾਲ-ਨਾਲ ਮੈਟਾਡੇਟਾ ਪਾਸ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ ਰੀਫੈਕਟਰਡ ਮੀਡੀਆ ਸਰੋਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ। ਹੁਣ ਸਾਡੇ ਕੋਲ ਮੈਟਾਡੇਟਾ ਦਾ ਇੱਕ ਸਿੰਗਲ ਸਰੋਤ ਹੈ ਅਤੇ ਪਲੇਬੈਕ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਸਿੱਧਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਸਥਿਰ ਰਿਮੋਟ ਪਲੇਲਿਸਟ ਮੈਟਾਡੇਟਾ ਅੱਪਡੇਟ ਨਹੀਂ ਹੋ ਰਿਹਾ ਹੈ ਜਦੋਂ ਪਲੇਲਿਸਟ ਫਰੈਗਮੈਂਟ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਤਾਂ ਨਵਾਂ ਮੈਟਾਡੇਟਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਕਈ UI ਫਿਕਸ: #1383, ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕੰਟਰੋਲ ਹੁਣ ਹਮੇਸ਼ਾ ਸਫੈਦ, ਫਲਿੰਗਿੰਗ ਰਾਹੀਂ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨਾ ਆਸਾਨ - ਮਲਟੀਸਰਵਿਸ ਲਈ ਰੀਫੈਕਟਰਡ ਆਰਕੀਟੈਕਚਰ ਦੇ ਨਾਲ ਨਵੇਂ ਐਕਸਟਰੈਕਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ ### ਫਿਕਸ - #1440 ਟੁੱਟੇ ਹੋਏ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਲੇਆਉਟ #1491 ਨੂੰ ਠੀਕ ਕਰੋ - ਇਤਿਹਾਸ ਫਿਕਸ #1497 ਦੇਖੋ - #1495, ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਪਲੇਲਿਸਟ ਤੱਕ ਪਹੁੰਚ ਕਰਦਾ ਹੈ, ਮੈਟਾਡੇਟਾ (ਥੰਬਨੇਲ, ਸਿਰਲੇਖ ਅਤੇ ਵੀਡੀਓ ਗਿਣਤੀ) ਨੂੰ ਅਪਡੇਟ ਕਰਕੇ। - #1475, ਜਦੋਂ ਉਪਭੋਗਤਾ ਵੇਰਵੇ ਦੇ ਟੁਕੜੇ 'ਤੇ ਬਾਹਰੀ ਪਲੇਅਰ 'ਤੇ ਵੀਡੀਓ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ ਤਾਂ ਡੇਟਾਬੇਸ ਵਿੱਚ ਇੱਕ ਦ੍ਰਿਸ਼ ਨੂੰ ਰਜਿਸਟਰ ਕਰਕੇ। - ਪੌਪਅੱਪ ਮੋਡ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਕ੍ਰੀਨ ਟਾਈਮਆਊਟ ਫਿਕਸ ਕਰੋ। #1463 (ਸਥਿਰ #640) - ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਫਿਕਸ #1509 - [#1412] ਫਿਕਸਡ ਰੀਪੀਟ ਮੋਡ ਜਿਸ ਨਾਲ ਪਲੇਅਰ ਐਨਪੀਈ ਦਾ ਕਾਰਨ ਬਣਦਾ ਹੈ ਜਦੋਂ ਪਲੇਅਰ ਦੀ ਗਤੀਵਿਧੀ ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵਾਂ ਇਰਾਦਾ ਪ੍ਰਾਪਤ ਹੁੰਦਾ ਹੈ। - ਪੌਪਅੱਪ ਲਈ ਫਿਕਸਡ ਮਿਨੀਮਾਈਜ਼ਿੰਗ ਪਲੇਅਰ ਪਲੇਅਰ ਨੂੰ ਨਸ਼ਟ ਨਹੀਂ ਕਰਦਾ ਹੈ ਜਦੋਂ ਪੌਪਅੱਪ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ। diff --git a/fastlane/metadata/android/pa/changelogs/66.txt b/fastlane/metadata/android/pa/changelogs/66.txt new file mode 100644 index 00000000000..aecf80cbcfb --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/66.txt @@ -0,0 +1 @@ +# v0.13.7 ਦਾ ਚੇਂਜਲਾਗ ### ਸਥਿਰ - v0.13.6 ਦੇ ਕ੍ਰਮਬੱਧ ਫਿਲਟਰ ਮੁੱਦਿਆਂ ਨੂੰ ਠੀਕ ਕਰੋ # v0.13.6 ਦਾ ਚੇਂਜਲਾਗ ### ਸੁਧਾਰ - ਬਰਗਰਮੇਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ #1486 ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ - ਡਾਉਨਲੋਡਸ #1472 ਨੂੰ ਮਿਟਾਉਣ ਨੂੰ ਅਨਡੂ ਕਰੋ - ਸ਼ੇਅਰ ਮੀਨੂ #1498 ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ - ਲੰਬੇ ਟੈਪ ਮੀਨੂ #1454 ਵਿੱਚ ਸ਼ੇਅਰ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ - ਨਿਕਾਸ #1354 'ਤੇ ਮੁੱਖ ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰੋ - ਲਾਇਬ੍ਰੇਰੀ ਸੰਸਕਰਣ ਅਪਡੇਟ ਅਤੇ ਡੇਟਾਬੇਸ ਬੈਕਅਪ ਫਿਕਸ #1510 - ExoPlayer 2.8.2 ਅੱਪਡੇਟ #1392 - ਤੇਜ਼ ਗਤੀ ਤਬਦੀਲੀ ਲਈ ਵੱਖ-ਵੱਖ ਸਟੈਪ ਸਾਈਜ਼ ਦਾ ਸਮਰਥਨ ਕਰਨ ਲਈ ਪਲੇਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ ਡਾਇਲਾਗ ਨੂੰ ਦੁਬਾਰਾ ਬਣਾਇਆ ਗਿਆ। - ਪਲੇਬੈਕ ਸਪੀਡ ਨਿਯੰਤਰਣ ਵਿੱਚ ਚੁੱਪ ਦੌਰਾਨ ਫਾਸਟ-ਫਾਰਵਰਡ ਕਰਨ ਲਈ ਇੱਕ ਟੌਗਲ ਜੋੜਿਆ ਗਿਆ। ਇਹ ਆਡੀਓਬੁੱਕਾਂ ਅਤੇ ਕੁਝ ਸੰਗੀਤ ਸ਼ੈਲੀਆਂ ਲਈ ਮਦਦਗਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ ਇੱਕ ਸੱਚਾ ਸਹਿਜ ਅਨੁਭਵ ਲਿਆ ਸਕਦਾ ਹੈ (ਅਤੇ ਬਹੁਤ ਸਾਰੀਆਂ ਚੁੱਪ =\\ ਨਾਲ ਗੀਤ ਤੋੜ ਸਕਦਾ ਹੈ)। - ਹੱਥੀਂ ਅਜਿਹਾ ਕਰਨ ਦੀ ਬਜਾਏ, ਪਲੇਅਰ ਵਿੱਚ ਅੰਦਰੂਨੀ ਤੌਰ 'ਤੇ ਮੀਡੀਆ ਦੇ ਨਾਲ-ਨਾਲ ਮੈਟਾਡੇਟਾ ਪਾਸ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ ਰੀਫੈਕਟਰਡ ਮੀਡੀਆ ਸਰੋਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ। ਹੁਣ ਸਾਡੇ ਕੋਲ ਮੈਟਾਡੇਟਾ ਦਾ ਇੱਕ ਸਿੰਗਲ ਸਰੋਤ ਹੈ ਅਤੇ ਪਲੇਬੈਕ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਸਿੱਧਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਸਥਿਰ ਰਿਮੋਟ ਪਲੇਲਿਸਟ ਮੈਟਾਡੇਟਾ ਅੱਪਡੇਟ ਨਹੀਂ ਹੋ ਰਿਹਾ ਹੈ ਜਦੋਂ ਪਲੇਲਿਸਟ ਫਰੈਗਮੈਂਟ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਤਾਂ ਨਵਾਂ ਮੈਟਾਡੇਟਾ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ। - ਕਈ UI ਫਿਕਸ: #1383, ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕੰਟਰੋਲ ਹੁਣ ਹਮੇਸ਼ਾ ਸਫੈਦ, ਫਲਿੰਗਿੰਗ ਰਾਹੀਂ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨਾ ਆਸਾਨ - ਮਲਟੀਸਰਵਿਸ ਲਈ ਰੀਫੈਕਟਰਡ ਆਰਕੀਟੈਕਚਰ ਦੇ ਨਾਲ ਨਵੇਂ ਐਕਸਟਰੈਕਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ ### ਫਿਕਸ - #1440 ਟੁੱਟੇ ਹੋਏ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਲੇਆਉਟ #1491 ਨੂੰ ਠੀਕ ਕਰੋ - ਇਤਿਹਾਸ ਫਿਕਸ #1497 ਦੇਖੋ - #1495, ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਪਲੇਲਿਸਟ ਤੱਕ ਪਹੁੰਚ ਕਰਦਾ ਹੈ, ਮੈਟਾਡੇਟਾ (ਥੰਬਨੇਲ, ਸਿਰਲੇਖ ਅਤੇ ਵੀਡੀਓ ਗਿਣਤੀ) ਨੂੰ ਅਪਡੇਟ ਕਰਕੇ। - #1475, ਜਦੋਂ ਉਪਭੋਗਤਾ ਵੇਰਵੇ ਦੇ ਟੁਕੜੇ 'ਤੇ ਬਾਹਰੀ ਪਲੇਅਰ 'ਤੇ ਵੀਡੀਓ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ ਤਾਂ ਡੇਟਾਬੇਸ ਵਿੱਚ ਇੱਕ ਦ੍ਰਿਸ਼ ਨੂੰ ਰਜਿਸਟਰ ਕਰਕੇ। - ਪੌਪਅੱਪ ਮੋਡ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਕ੍ਰੀਨ ਟਾਈਮਆਊਟ ਫਿਕਸ ਕਰੋ। #1463 (ਸਥਿਰ #640) - ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਫਿਕਸ #1509 - [#1412] ਫਿਕਸਡ ਰੀਪੀਟ ਮੋਡ ਜਿਸ ਨਾਲ ਪਲੇਅਰ ਐਨਪੀਈ ਦਾ ਕਾਰਨ ਬਣਦਾ ਹੈ ਜਦੋਂ ਪਲੇਅਰ ਦੀ ਗਤੀਵਿਧੀ ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵਾਂ ਇਰਾਦਾ ਪ੍ਰਾਪਤ ਹੁੰਦਾ ਹੈ। - ਪੌਪਅੱਪ ਲਈ ਫਿਕਸਡ ਮਿਨੀਮਾਈਜ਼ਿੰਗ ਪਲੇਅਰ ਪਲੇਅਰ ਨੂੰ ਨਸ਼ਟ ਨਹੀਂ ਕਰਦਾ ਹੈ ਜਦੋਂ ਪੌਪਅੱਪ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ। diff --git a/fastlane/metadata/android/pa/changelogs/68.txt b/fastlane/metadata/android/pa/changelogs/68.txt new file mode 100644 index 00000000000..e8e54ea4f5e --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/68.txt @@ -0,0 +1 @@ +v0.14.1 ਦੇ # ਬਦਲਾਅ ### ਸਥਿਰ - ਵੀਡੀਓ url #1659 ਨੂੰ ਡੀਕ੍ਰਿਪਟ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ - ਸਥਿਰ ਵਰਣਨ ਲਿੰਕ #1657 ਨੂੰ ਚੰਗੀ ਤਰ੍ਹਾਂ ਐਕਸਟਰੈਕਟ ਨਹੀਂ ਕਰਦਾ ਹੈ v0.14.0 ਦੀਆਂ # ਤਬਦੀਲੀਆਂ ### ਨਵਾਂ - ਨਵਾਂ ਦਰਾਜ਼ ਡਿਜ਼ਾਈਨ #1461 - ਨਵਾਂ ਅਨੁਕੂਲਿਤ ਫਰੰਟ ਪੇਜ #1461 ### ਸੁਧਾਰ - ਮੁੜ ਕੰਮ ਕੀਤਾ ਸੰਕੇਤ ਨਿਯੰਤਰਣ #1604 - ਪੌਪਅੱਪ ਪਲੇਅਰ #1597 ਨੂੰ ਬੰਦ ਕਰਨ ਦਾ ਨਵਾਂ ਤਰੀਕਾ ### ਸਥਿਰ - ਗਾਹਕੀ ਦੀ ਗਿਣਤੀ ਉਪਲਬਧ ਨਾ ਹੋਣ 'ਤੇ ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ। #1649 ਬੰਦ ਹੁੰਦਾ ਹੈ। - ਉਹਨਾਂ ਮਾਮਲਿਆਂ ਵਿੱਚ "ਗਾਹਕ ਗਿਣਤੀ ਉਪਲਬਧ ਨਹੀਂ" ਦਿਖਾਓ - YouTube ਪਲੇਲਿਸਟ ਖਾਲੀ ਹੋਣ 'ਤੇ NPE ਨੂੰ ਠੀਕ ਕਰੋ - SoundCloud ਵਿੱਚ ਕਿਓਸਕ ਲਈ ਤੁਰੰਤ ਫਿਕਸ - ਰਿਫੈਕਟਰ ਅਤੇ ਬੱਗਫਿਕਸ #1623 - ਚੱਕਰੀ ਖੋਜ ਨਤੀਜੇ #1562 ਨੂੰ ਠੀਕ ਕਰੋ - ਸੀਕ ਬਾਰ ਨੂੰ ਸਥਿਰ ਤੌਰ 'ਤੇ ਬਾਹਰ ਨਾ ਕੱਢੋ - ਫਿਕਸ YT ਪ੍ਰੀਮੀਅਮ ਵੀਡੀਓ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਬਲੌਕ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ - ਕਈ ਵਾਰ ਲੋਡ ਨਾ ਹੋਣ ਵਾਲੇ ਵੀਡੀਓ ਨੂੰ ਠੀਕ ਕਰੋ (DASH ਪਾਰਸਿੰਗ ਦੇ ਕਾਰਨ) - ਵੀਡੀਓ ਵਰਣਨ ਵਿੱਚ ਲਿੰਕ ਫਿਕਸ ਕਰੋ - ਜਦੋਂ ਕੋਈ ਬਾਹਰੀ sdcard 'ਤੇ ਡਾਊਨਲੋਡ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦਾ ਹੈ ਤਾਂ ਚੇਤਾਵਨੀ ਦਿਖਾਓ - ਅਪਵਾਦ ਟਰਿੱਗਰ ਰਿਪੋਰਟ ਦਿਖਾਈ ਗਈ ਕੁਝ ਵੀ ਠੀਕ ਨਾ ਕਰੋ - ਐਂਡਰਾਇਡ 8.1 ਲਈ ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ ਥੰਬਨੇਲ ਨਹੀਂ ਦਿਖਾਇਆ ਗਿਆ [ਇੱਥੇ ਦੇਖੋ](https://github.com/TeamNewPipe/NewPipe/issues/943) - ਪ੍ਰਸਾਰਣ ਪ੍ਰਾਪਤ ਕਰਨ ਵਾਲੇ ਦੀ ਰਜਿਸਟਰੇਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ। #1641 ਬੰਦ ਹੁੰਦਾ ਹੈ। diff --git a/fastlane/metadata/android/pa/changelogs/69.txt b/fastlane/metadata/android/pa/changelogs/69.txt new file mode 100644 index 00000000000..b6358991b36 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/69.txt @@ -0,0 +1 @@ +### ਨਵਾਂ - ਮਿਟਾਓ ਅਤੇ ਸਬਸਕ੍ਰਿਪਸ਼ਨ #1516 ਵਿੱਚ ਸਾਂਝਾ ਕਰੋ - ਟੈਬਲੇਟ UI ਅਤੇ ਗਰਿੱਡ ਸੂਚੀ ਖਾਕਾ #1617 ### ਸੁਧਾਰ - ਆਖਰੀ ਵਰਤੇ ਗਏ ਆਸਪੈਕਟ ਰੇਸ਼ੋ #1748 ਨੂੰ ਸਟੋਰ ਅਤੇ ਰੀਲੋਡ ਕਰੋ - ਪੂਰੇ ਵੀਡੀਓ ਨਾਮ #1771 ਦੇ ਨਾਲ ਡਾਊਨਲੋਡ ਗਤੀਵਿਧੀ ਵਿੱਚ ਲੀਨੀਅਰ ਲੇਆਉਟ ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ - ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਟੈਬ #1516 ਦੇ ਅੰਦਰੋਂ ਸਿੱਧਾ ਗਾਹਕੀਆਂ ਨੂੰ ਮਿਟਾਓ ਅਤੇ ਸਾਂਝਾ ਕਰੋ - ਜੇਕਰ ਪਲੇ ਕਤਾਰ ਪਹਿਲਾਂ ਹੀ #1783 ਖਤਮ ਹੋ ਗਈ ਹੈ ਤਾਂ ਹੁਣ ਏਨਕਿਊ ਕਰਨਾ ਵੀਡੀਓ ਚਲਾਉਣ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ - ਵਾਲੀਅਮ ਅਤੇ ਚਮਕ ਸੰਕੇਤ #1644 ਲਈ ਵੱਖਰੀ ਸੈਟਿੰਗ - ਸਥਾਨਕਕਰਨ #1792 ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ### ਫਿਕਸ - ਲਈ ਪਾਰਸਿੰਗ ਸਮਾਂ ਫਿਕਸ ਕਰੋ। ਫਾਰਮੈਟ, ਇਸ ਲਈ ਨਿਊ ਪਾਈਪ ਨੂੰ ਫਿਨਲੈਂਡ ਵਿੱਚ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ - ਗਾਹਕੀ ਦੀ ਗਿਣਤੀ ਨੂੰ ਠੀਕ ਕਰੋ - API 28+ ਡਿਵਾਈਸਾਂ #1830 ਲਈ ਫੋਰਗਰਾਉਂਡ ਸੇਵਾ ਅਨੁਮਤੀ ਸ਼ਾਮਲ ਕਰੋ ### ਜਾਣੇ-ਪਛਾਣੇ ਬੱਗ - ਐਂਡ੍ਰਾਇਡ ਪੀ 'ਤੇ ਪਲੇਬੈਕ ਸਟੇਟ ਨੂੰ ਸੇਵ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ diff --git a/fastlane/metadata/android/pa/changelogs/70.txt b/fastlane/metadata/android/pa/changelogs/70.txt new file mode 100644 index 00000000000..97d781d4aac --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/70.txt @@ -0,0 +1 @@ +ਧਿਆਨ ਦਿਓ: ਇਹ ਸੰਸਕਰਣ ਸ਼ਾਇਦ ਇੱਕ ਬੱਗਫੈਸਟ ਹੈ, ਬਿਲਕੁਲ ਪਿਛਲੇ ਇੱਕ ਵਾਂਗ। ਹਾਲਾਂਕਿ 17 ਤੋਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਬੰਦ ਹੋਣ ਦੇ ਕਾਰਨ. ਇੱਕ ਟੁੱਟਿਆ ਹੋਇਆ ਸੰਸਕਰਣ ਕੋਈ ਸੰਸਕਰਣ ਨਾਲੋਂ ਬਿਹਤਰ ਹੈ. ਸਹੀ? ¯\_(ツ)_/¯ ### ਸੁਧਾਰ * ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਨੂੰ ਹੁਣ ਇੱਕ ਕਲਿੱਕ ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਸਕਦਾ ਹੈ #1879 * ਐਂਡਰਾਇਡ 4.1 - 4.3 #1884 ਲਈ ਸਹਾਇਤਾ ਛੱਡੋ * ਪੁਰਾਣੇ ਪਲੇਅਰ #1884 ਨੂੰ ਹਟਾਓ * ਮੌਜੂਦਾ ਪਲੇ ਕਤਾਰ ਤੋਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸੱਜੇ #1915 'ਤੇ ਸਵਾਈਪ ਕਰਕੇ ਹਟਾਓ * ਆਟੋ ਕਤਾਰਬੱਧ ਸਟ੍ਰੀਮ ਨੂੰ ਹਟਾਓ ਜਦੋਂ ਇੱਕ ਨਵੀਂ ਸਟ੍ਰੀਮ ਹੱਥੀਂ ਕਤਾਰਬੱਧ ਹੁੰਦੀ ਹੈ #1878 * @kapodamy ਦੁਆਰਾ ਡਾਉਨਲੋਡ ਕਰਨ ਅਤੇ ਗੁੰਮ ਹੋਈਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ #1759 ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਪੋਸਟ ਪ੍ਰੋਸੈਸਿੰਗ * ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ ਬੁਨਿਆਦੀ ਢਾਂਚਾ * "ਬੁਨਿਆਦੀ ਢਾਂਚੇ" ਨੂੰ ਸੰਭਾਲਣ ਲਈ ਸਹੀ ਤਰੁੱਟੀ (ਡਾਊਨਲੋਡਰ ਲਈ) * ਮਲਟੀਪਲ ਡਾਉਨਲੋਡਸ ਦੀ ਬਜਾਏ ਕਤਾਰ * ਲੜੀਬੱਧ ਲੰਬਿਤ ਡਾਉਨਲੋਡਸ (`ਗੀਗਾ` ਫਾਈਲਾਂ) ਨੂੰ ਐਪ ਡੇਟਾ ਵਿੱਚ ਮੂਵ ਕਰੋ * ਅਧਿਕਤਮ ਡਾਊਨਲੋਡ ਦੀ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਨੂੰ ਲਾਗੂ ਕਰੋ * ਉਚਿਤ ਮਲਟੀ-ਥ੍ਰੈਡ ਡਾਊਨਲੋਡ ਵਿਰਾਮ * ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ 'ਤੇ ਜਾਣ ਵੇਲੇ ਡਾਊਨਲੋਡ ਬੰਦ ਕਰੋ (ਕਦੇ ਕੰਮ ਨਹੀਂ ਕਰਦਾ, ਦੂਜਾ ਪੁਆਇੰਟ ਦੇਖੋ) * ਅਗਲੇ ਡਾਉਨਲੋਡਸ ਲਈ ਥਰਿੱਡ ਗਿਣਤੀ ਨੂੰ ਸੁਰੱਖਿਅਤ ਕਰੋ * ਬਹੁਤ ਸਾਰੀਆਂ ਅਸੰਗਤੀਆਂ ਹੱਲ ਕੀਤੀਆਂ ਗਈਆਂ ### ਸਥਿਰ * ਪੂਰਵ-ਨਿਰਧਾਰਤ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਨਾਲ ਕਰੈਸ਼ ਨੂੰ ਬਿਹਤਰ ਅਤੇ ਸੀਮਤ ਮੋਬਾਈਲ ਡਾਟਾ ਰੈਜ਼ੋਲਿਊਸ਼ਨ #1835 'ਤੇ ਸੈੱਟ ਕਰੋ * ਪੌਪ-ਅੱਪ ਪਲੇਅਰ ਕਰੈਸ਼ ਫਿਕਸਡ #1874 * ਬੈਕਗਰਾਊਂਡ ਪਲੇਅਰ #1901 ਨੂੰ ਖੋਲ੍ਹਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਸਮੇਂ NPE * ਜਦੋਂ ਆਟੋ ਕਤਾਰ ਯੋਗ ਹੁੰਦੀ ਹੈ ਤਾਂ ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸੰਮਿਲਿਤ ਕਰਨ ਲਈ ਠੀਕ ਕਰੋ #1878 * ਡੀਸਾਈਪਰਿੰਗ ਸ਼ੱਟਟਾਊਨ ਮੁੱਦੇ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/71.txt b/fastlane/metadata/android/pa/changelogs/71.txt new file mode 100644 index 00000000000..bafa26f8c3c --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/71.txt @@ -0,0 +1 @@ +### ਸੁਧਾਰ * GitHub ਬਿਲਡ ਲਈ ਐਪ ਅਪਡੇਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਸ਼ਾਮਲ ਕਰੋ (@krtkush ਦੁਆਰਾ #1608) * ਡਾਊਨਲੋਡਰ ਵਿੱਚ ਕਈ ਸੁਧਾਰ (@kapodamy ਦੁਆਰਾ #1944): * ਗੁੰਮ ਹੋਏ ਚਿੱਟੇ ਆਈਕਨ ਸ਼ਾਮਲ ਕਰੋ ਅਤੇ ਆਈਕਨ ਦੇ ਰੰਗਾਂ ਨੂੰ ਬਦਲਣ ਲਈ ਹਾਰਡਕੋਰਡ ਤਰੀਕੇ ਦੀ ਵਰਤੋਂ ਕਰੋ * ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਇਟਰੇਟਰ ਸ਼ੁਰੂ ਕੀਤਾ ਗਿਆ ਹੈ (ਫਿਕਸ #2031) * ਨਵੇਂ ਮੁਕਸਰ ਵਿੱਚ "ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ ਫੇਲ੍ਹ" ਗਲਤੀ ਦੇ ਨਾਲ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ * ਨਵਾਂ MPEG-4 ਮੁਕਸਰ ਫਿਕਸਿੰਗ ਗੈਰ-ਸਿੰਕਰੋਨਸ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਸਟ੍ਰੀਮਜ਼ (#2039) ### ਸਥਿਰ * YouTube ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਥੋੜ੍ਹੇ ਸਮੇਂ ਬਾਅਦ ਚੱਲਣੀਆਂ ਬੰਦ ਹੋ ਜਾਂਦੀਆਂ ਹਨ (@yausername ਦੁਆਰਾ #1996) diff --git a/fastlane/metadata/android/pa/changelogs/730.txt b/fastlane/metadata/android/pa/changelogs/730.txt new file mode 100644 index 00000000000..56f5a7d32f1 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/730.txt @@ -0,0 +1,2 @@ +# ਠੀਕ ਕੀਤਾ +- ਹੌਟ ਫਿਕਸ ਦੁਬਾਰਾ ਗਲਤ ਹੋਇਆ ਡੀਕ੍ਰਿਪਟ ਫੰਕਸ਼ਨ ਠੀਕ । diff --git a/fastlane/metadata/android/pa/changelogs/740.txt b/fastlane/metadata/android/pa/changelogs/740.txt new file mode 100644 index 00000000000..6a2dbdc8601 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/740.txt @@ -0,0 +1 @@ +ਬਦਲਾਅ ਸੂਚੀ ਅਨੁਵਾਦ ਕਰਣਯੋਗ ਨਹੀਂ। ਬਿਲਕੁਲ ਬਕਵਾਸ diff --git a/fastlane/metadata/android/pa/changelogs/750.txt b/fastlane/metadata/android/pa/changelogs/750.txt new file mode 100644 index 00000000000..0b875b705e5 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/750.txt @@ -0,0 +1 @@ +ਨਵਾਂ ਪਲੇਬੈਕ ਰੈਜ਼ਿਊਮੇ #2288 • ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ ਜਿੱਥੇ ਤੁਸੀਂ ਪਿਛਲੀ ਵਾਰ ਰੁਕੇ ਸੀ ਡਾਊਨਲੋਡਰ ਸੁਧਾਰ #2149 • ਬਾਹਰੀ SD-ਕਾਰਡਾਂ 'ਤੇ ਡਾਊਨਲੋਡ ਸਟੋਰ ਕਰਨ ਲਈ ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ • ਨਵਾਂ mp4 muxer • ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਡਾਉਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਬਦਲੋ • ਮੀਟਰਡ ਨੈੱਟਵਰਕਾਂ ਦਾ ਆਦਰ ਕਰੋ ਸੁਧਾਰ • gema ਸਤਰ #2295 ਨੂੰ ਹਟਾਇਆ • ਗਤੀਵਿਧੀ ਜੀਵਨ ਚੱਕਰ #2444 ਦੌਰਾਨ ਹੈਂਡਲ (ਆਟੋ) ਰੋਟੇਸ਼ਨ ਤਬਦੀਲੀਆਂ • ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਨੂੰ ਇਕਸਾਰ #2368 ਬਣਾਓ ਸਥਿਰ • ਫਿਕਸਡ ਚੁਣਿਆ ਹੋਇਆ ਉਪਸਿਰਲੇਖ ਟਰੈਕ ਨਾਮ #2394 ਨਹੀਂ ਦਿਖਾਇਆ ਜਾ ਰਿਹਾ ਹੈ • ਐਪ ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਅਸਫਲ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨਾ ਹੋਵੋ (GitHub ਸੰਸਕਰਣ) #2423 • ਸਥਿਰ ਡਾਊਨਲੋਡ 99.9% #2440 'ਤੇ ਅਟਕ ਗਏ • ਪਲੇ ਕਤਾਰ ਮੈਟਾਡੇਟਾ #2453 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ • [SoundCloud] ਪਲੇਲਿਸਟਸ ਲੋਡ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ TeamNewPipe/NewPipeExtractor#170 • [YouTube] ਸਥਿਰ ਅਵਧੀ ਨੂੰ ਪਾਰਸਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pa/changelogs/760.txt b/fastlane/metadata/android/pa/changelogs/760.txt new file mode 100644 index 00000000000..fd4b8f2a458 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/760.txt @@ -0,0 +1 @@ +0.17.1 ਵਿੱਚ ਬਦਲਾਅ ਨਵਾਂ • ਥਾਈ ਸਥਾਨਕਕਰਨ ਸੁਧਾਰ • ਦੁਬਾਰਾ #2518 ਪਲੇਲਿਸਟਾਂ ਲਈ ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਵਿੱਚ ਇੱਥੇ ਪਲੇ ਸ਼ੁਰੂ ਕਰੋ ਐਕਸ਼ਨ ਸ਼ਾਮਲ ਕਰੋ • SAF / ਪੁਰਾਤਨ ਫਾਈਲ ਪਿਕਰ #2521 ਲਈ ਸਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • ਐਪਸ #2487 ਨੂੰ ਬਦਲਦੇ ਸਮੇਂ ਡਾਊਨਲੋਡ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਗਾਇਬ ਹੋਣ ਵਾਲੇ ਬਟਨਾਂ ਨੂੰ ਠੀਕ ਕਰੋ • ਫਿਕਸ ਪਲੇਬੈਕ ਸਥਿਤੀ ਸਟੋਰ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਹਾਲਾਂਕਿ ਦੇਖਣ ਦਾ ਇਤਿਹਾਸ ਅਯੋਗ ਹੈ • ਸੂਚੀ ਦ੍ਰਿਸ਼ #2517 ਵਿੱਚ ਪਲੇਬੈਕ ਸਥਿਤੀ ਦੇ ਕਾਰਨ ਘਟੇ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ • [ਐਕਸਟ੍ਰੈਕਟਰ] ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 ਫਿਕਸ • [ਐਕਸਟ੍ਰੈਕਟਰ] [YouTube] ਜਦੋਂ ਪਲੇਲਿਸਟਾਂ ਨਤੀਜੇ ਵਿੱਚ ਹੋਣ ਤਾਂ ਆਮ ਖੋਜ ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ TeamNewPipe/NewPipeExtractor#185 0.17.0 ਵਿੱਚ ਬਦਲਾਅ ਨਵਾਂ ਪਲੇਬੈਕ ਰੈਜ਼ਿਊਮੇ #2288 • ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ ਜਿੱਥੇ ਤੁਸੀਂ ਪਿਛਲੀ ਵਾਰ ਰੁਕੇ ਸੀ ਡਾਊਨਲੋਡਰ ਸੁਧਾਰ #2149 • ਬਾਹਰੀ SD-ਕਾਰਡਾਂ 'ਤੇ ਡਾਊਨਲੋਡ ਸਟੋਰ ਕਰਨ ਲਈ ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ • ਨਵਾਂ mp4 muxer • ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਡਾਉਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਬਦਲੋ • ਮੀਟਰਡ ਨੈੱਟਵਰਕਾਂ ਦਾ ਆਦਰ ਕਰੋ ਸੁਧਾਰ • gema ਸਤਰ #2295 ਨੂੰ ਹਟਾਇਆ • ਗਤੀਵਿਧੀ ਜੀਵਨ ਚੱਕਰ #2444 ਦੌਰਾਨ ਹੈਂਡਲ (ਆਟੋ) ਰੋਟੇਸ਼ਨ ਤਬਦੀਲੀਆਂ • ਲੰਬੇ-ਦਬਾਓ ਮੀਨੂ ਨੂੰ ਇਕਸਾਰ #2368 ਬਣਾਓ ਸਥਿਰ • ਫਿਕਸਡ ਚੁਣਿਆ ਹੋਇਆ ਉਪਸਿਰਲੇਖ ਟਰੈਕ ਨਾਮ #2394 ਨਹੀਂ ਦਿਖਾਇਆ ਜਾ ਰਿਹਾ ਹੈ • ਐਪ ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਅਸਫਲ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨਾ ਹੋਵੋ (GitHub ਸੰਸਕਰਣ) #2423 • ਸਥਿਰ ਡਾਊਨਲੋਡ 99.9% #2440 'ਤੇ ਅਟਕ ਗਏ • ਪਲੇ ਕਤਾਰ ਮੈਟਾਡੇਟਾ #2453 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ • [SoundCloud] ਪਲੇਲਿਸਟਸ ਲੋਡ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ TeamNewPipe/NewPipeExtractor#170 • [YouTube] ਸਥਿਰ ਅਵਧੀ ਨੂੰ ਪਾਰਸਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pa/changelogs/770.txt b/fastlane/metadata/android/pa/changelogs/770.txt new file mode 100644 index 00000000000..03903c01168 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/770.txt @@ -0,0 +1,4 @@ +0.17.2 ਵਿੱਚ ਬਦਲਾਅ + +ਠੀਕ ਕਰੋ +• ਫਿਕਸ ਕੋਈ ਵੀ ਵੀਡੀਓ ਉਪਲਬਧ ਨਹੀਂ ਸੀ diff --git a/fastlane/metadata/android/pa/changelogs/780.txt b/fastlane/metadata/android/pa/changelogs/780.txt new file mode 100644 index 00000000000..999a244682b --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/780.txt @@ -0,0 +1 @@ +0.17.3 ਵਿੱਚ ਬਦਲਾਅ ਸੁਧਾਰ • ਪਲੇਬੈਕ ਸਥਿਤੀਆਂ #2550 ਨੂੰ ਸਾਫ਼ ਕਰਨ ਲਈ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਫਾਈਲ ਪਿਕਰ #2591 ਵਿੱਚ ਲੁਕੀਆਂ ਹੋਈਆਂ ਡਾਇਰੈਕਟਰੀਆਂ ਦਿਖਾਓ • NewPipe #2488 ਨਾਲ ਖੋਲ੍ਹੇ ਜਾਣ ਵਾਲੇ `invidio.us` ਉਦਾਹਰਨਾਂ ਤੋਂ ਸਮਰਥਨ URL • `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • [YouTube] ਸਥਿਰ 'java.lang.IllegalArgumentException #192 • [YouTube] ਸਥਿਰ ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀਆਂ TeamNewPipe/NewPipeExtractor#195 • ਇੱਕ ਸਟ੍ਰੀਮ #2592 ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਵੇਲੇ ਐਂਡਰੌਇਡ ਪਾਈ ਵਿੱਚ ਸਥਿਰ ਪ੍ਰਦਰਸ਼ਨ ਸਮੱਸਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/790.txt b/fastlane/metadata/android/pa/changelogs/790.txt new file mode 100644 index 00000000000..f841801eb52 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/790.txt @@ -0,0 +1 @@ +ਸੁਧਾਰ • ਅੰਨ੍ਹੇ ਲੋਕਾਂ #2655 ਲਈ ਪਹੁੰਚਯੋਗਤਾ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਹੋਰ ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕਰੋ • ਡਾਉਨਲੋਡ ਫੋਲਡਰ ਸੈਟਿੰਗ ਦੀ ਭਾਸ਼ਾ ਨੂੰ ਵਧੇਰੇ ਇਕਸਾਰ ਅਤੇ ਘੱਟ ਅਸਪਸ਼ਟ #2637 ਬਣਾਓ ਸਥਿਰ • ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਬਲਾਕ ਵਿੱਚ ਆਖਰੀ ਬਾਈਟ #2646 ਡਾਊਨਲੋਡ ਕੀਤੀ ਗਈ ਹੈ • ਵੀਡੀਓ ਡਿਟੇਲ ਫਰੈਗਮੈਂਟ #2672 ਵਿੱਚ ਸਥਿਰ ਸਕ੍ਰੋਲਿੰਗ • ਡਬਲ ਸਰਚ ਕਲੀਅਰ ਬਾਕਸ ਐਨੀਮੇਸ਼ਨ ਨੂੰ ਇੱਕ #2695 ਵਿੱਚ ਹਟਾਓ • [SoundCloud] ਕਲਾਇਟ_ਆਈਡੀ ਐਕਸਟਰੈਕਸ਼ਨ #2745 ਨੂੰ ਠੀਕ ਕਰੋ ਵਿਕਾਸ • NewPipeExtractor ਤੋਂ ਵਿਰਾਸਤ ਵਿੱਚ ਮਿਲੀ ਗੁੰਮ ਨਿਰਭਰਤਾ ਨੂੰ NewPipe #2535 ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ • AndroidX #2685 'ਤੇ ਮਾਈਗ੍ਰੇਟ ਕਰੋ • ExoPlayer 2.10.6 #2697, #2736 ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/800.txt b/fastlane/metadata/android/pa/changelogs/800.txt new file mode 100644 index 00000000000..53868c894bd --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/800.txt @@ -0,0 +1 @@ +ਨਵਾਂ • P2P (#2201) [ਬੀਟਾ] ਤੋਂ ਬਿਨਾਂ PeerTube ਸਮਰਥਨ: ◦ PeerTube ਉਦਾਹਰਨਾਂ ਤੋਂ ਵੀਡੀਓ ਦੇਖੋ ਅਤੇ ਡਾਊਨਲੋਡ ਕਰੋ ◦ ਪੂਰੀ PeerTube ਸੰਸਾਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਉਦਾਹਰਨਾਂ ਸ਼ਾਮਲ ਕਰੋ ◦ Android 4.4 ਅਤੇ 7.1 'ਤੇ SSL ਹੈਂਡਸ਼ੇਕ ਨਾਲ ਸਮੱਸਿਆਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ ਜਦੋਂ ਕੁਝ ਖਾਸ ਮੌਕਿਆਂ 'ਤੇ ਪਹੁੰਚ ਕਰਦੇ ਸਮੇਂ ਨੈੱਟਵਰਕ ਗੜਬੜ ਹੋ ਜਾਂਦੀ ਹੈ। • ਡਾਊਨਲੋਡਰ (#2679): ◦ ਡਾਊਨਲੋਡ ETA ਦੀ ਗਣਨਾ ਕਰੋ ◦ ਓਪਸ (ਵੈਬ ਫਾਈਲਾਂ) ਨੂੰ ogg ਵਜੋਂ ਡਾਊਨਲੋਡ ਕਰੋ ◦ ਲੰਬੇ ਵਿਰਾਮ ਤੋਂ ਬਾਅਦ ਡਾਊਨਲੋਡ ਮੁੜ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਮਿਆਦ ਪੁੱਗ ਚੁੱਕੇ ਡਾਊਨਲੋਡ ਲਿੰਕਾਂ ਨੂੰ ਮੁੜ-ਹਾਸਲ ਕਰੋ ਸੁਧਾਰ • ਕਿਓਸਕਫ੍ਰੈਗਮੈਂਟ ਨੂੰ ਤਰਜੀਹੀ ਸਮਗਰੀ ਵਾਲੇ ਦੇਸ਼ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਤੋਂ ਜਾਣੂ ਕਰਵਾਓ ਅਤੇ ਸਾਰੀਆਂ ਮੁੱਖ ਟੈਬਾਂ #2742 ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ। • ਐਕਸਟਰੈਕਟਰ #2713 ਤੋਂ ਨਵੇਂ ਸਥਾਨਕਕਰਨ ਅਤੇ ਡਾਉਨਲੋਡਰ ਲਾਗੂਕਰਨ ਦੀ ਵਰਤੋਂ ਕਰੋ • "ਡਿਫੌਲਟ ਕਿਓਸਕ" ਸਤਰ ਨੂੰ ਅਨੁਵਾਦਯੋਗ ਬਣਾਓ • ਬਲੈਕ ਥੀਮ #2569 ਲਈ ਬਲੈਕ ਨੈਵੀਗੇਸ਼ਨ ਪੱਟੀ ਸਥਿਰ • ਇੱਕ ਬੱਗ ਫਿਕਸ ਕੀਤਾ ਗਿਆ ਹੈ ਜੋ ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਹਿਲਾ ਨਹੀਂ ਸਕਦਾ ਸੀ ਜੇਕਰ ਪੌਪਅੱਪ ਪਲੇਅਰ #2772 ਨੂੰ ਹਿਲਾਉਂਦੇ ਸਮੇਂ ਕੋਈ ਹੋਰ ਉਂਗਲ ਰੱਖੀ ਜਾਂਦੀ ਹੈ • ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਅਪਲੋਡਰ ਦੀ ਗੁੰਮਸ਼ੁਦਗੀ ਦੀ ਆਗਿਆ ਦਿਓ ਅਤੇ ਇਸ ਸਮੱਸਿਆ ਨਾਲ ਸਬੰਧਤ ਕ੍ਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ #2724, TeamNewPipe/NewPipeExtractor#219 • MediaCCC ਅਤੇ ਕੁਝ PeerTube ਉਦਾਹਰਨਾਂ #2792 ਨਾਲ TLS ਹੈਂਡਸ਼ੇਕ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ Android 4.4 ਡਿਵਾਈਸਾਂ (API 19/KitKat) 'ਤੇ TLS1.1/1.2 ਨੂੰ ਸਮਰੱਥ ਕਰਨਾ • [SoundCloud] ਫਿਕਸਡ ਕਲਾਈਂਟ_ਆਈਡੀ ਐਕਸਟ੍ਰੈਕਸ਼ਨ TeamNewPipe/NewPipeExtractor#217 • [SoundCloud] ਆਡੀਓ ਸਟ੍ਰੀਮ ਕੱਢਣ ਨੂੰ ਠੀਕ ਕਰੋ ਵਿਕਾਸ • ExoPlayer ਨੂੰ 2.10.8 #2791, #2816 'ਤੇ ਅੱਪਡੇਟ ਕਰੋ • Gradle ਨੂੰ 3.5.1 ਵਿੱਚ ਅੱਪਡੇਟ ਕਰੋ ਅਤੇ Kotlin ਸਹਿਯੋਗ #2714 ਸ਼ਾਮਲ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/810.txt b/fastlane/metadata/android/pa/changelogs/810.txt new file mode 100644 index 00000000000..96a2b9da5be --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/810.txt @@ -0,0 +1 @@ +ਨਵਾਂ • ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਦੇ ਸਮੇਂ ਲੌਕ ਸਕ੍ਰੀਨ 'ਤੇ ਵੀਡੀਓ ਥੰਬਨੇਲ ਦਿਖਾਓ ਸੁਧਾਰ • ਬੈਕਗ੍ਰਾਉਂਡ / ਪੌਪਅੱਪ ਬਟਨ 'ਤੇ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ 'ਤੇ ਕਤਾਰ ਵਿੱਚ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਸ਼ਾਮਲ ਕਰੋ • ਮੁੱਖ ਪੰਨਾ ਟੈਬਾਂ ਨੂੰ ਸਕ੍ਰੋਲ ਕਰਨ ਯੋਗ ਬਣਾਓ ਅਤੇ ਸਿਰਫ਼ ਇੱਕ ਟੈਬ ਹੋਣ 'ਤੇ ਲੁਕਾਓ • ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ ਸੂਚਨਾ ਥੰਬਨੇਲ ਅੱਪਡੇਟ ਦੀ ਸੀਮਾ ਮਾਤਰਾ • ਖਾਲੀ ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਲਈ ਡਮੀ ਥੰਬਨੇਲ ਸ਼ਾਮਲ ਕਰੋ • *.webm ਦੀ ਬਜਾਏ *.opus ਫਾਈਲ ਐਕਸਟੈਂਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰੋ ਅਤੇ ਡਾਊਨਲੋਡ ਡ੍ਰੌਪਡਾਉਨ ਵਿੱਚ "WebM Opus" ਦੀ ਬਜਾਏ ਫਾਰਮੈਟ ਲੇਬਲ ਵਿੱਚ "opus" ਦਿਖਾਓ • "ਡਾਊਨਲੋਡ" ਵਿੱਚ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਜਾਂ ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਨੂੰ ਮਿਟਾਉਣ ਲਈ ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ • [YouTube] /c/shortened_url ਚੈਨਲ ਲਿੰਕਾਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ ਸਥਿਰ • NewPipe ਨਾਲ ਵੀਡੀਓ ਸਾਂਝਾ ਕਰਨ ਅਤੇ ਇਸ ਦੀਆਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸਿੱਧੇ ਡਾਊਨਲੋਡ ਕਰਨ ਵੇਲੇ ਕਈ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ • ਇਸ ਦੇ ਸਿਰਜਣ ਥ੍ਰੈਡ ਤੋਂ ਬਾਹਰ ਸਥਿਰ ਪਲੇਅਰ ਪਹੁੰਚ • ਸਥਿਰ ਖੋਜ ਨਤੀਜੇ ਪੇਜਿੰਗ • [YouTube] ਨਿਸ਼ਚਤ ਸਵਿਚਿੰਗ ਚਾਲੂ ਕਰਨ ਨਾਲ NPE ਹੁੰਦਾ ਹੈ • [YouTube] ਇੱਕ invidio.us url ਖੋਲ੍ਹਣ ਵੇਲੇ ਟਿੱਪਣੀਆਂ ਦੇਖਣ ਲਈ ਸਥਿਰ • [SoundCloud] ਅੱਪਡੇਟ ਕੀਤਾ client_id diff --git a/fastlane/metadata/android/pa/changelogs/820.txt b/fastlane/metadata/android/pa/changelogs/820.txt new file mode 100644 index 00000000000..aa355469888 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/820.txt @@ -0,0 +1 @@ +ਸਥਿਰ ਡੀਕ੍ਰਿਪਟ ਫੰਕਸ਼ਨ ਨਾਮ regex YouTube ਨੂੰ ਵਰਤੋਂਯੋਗ ਨਹੀਂ ਬਣਾਉਂਦਾ। diff --git a/fastlane/metadata/android/pa/changelogs/830.txt b/fastlane/metadata/android/pa/changelogs/830.txt new file mode 100644 index 00000000000..6bd990808f5 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/830.txt @@ -0,0 +1 @@ +SoundCloud ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ SoundCloud client_id ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ। diff --git a/fastlane/metadata/android/pa/changelogs/840.txt b/fastlane/metadata/android/pa/changelogs/840.txt new file mode 100644 index 00000000000..74509849684 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/840.txt @@ -0,0 +1 @@ +ਨਵਾਂ • ਐਪ ਦੀ ਭਾਸ਼ਾ ਬਦਲਣ ਲਈ ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਪਲੇਅਰ ਸਮੇਟਣਯੋਗ ਮੀਨੂ ਵਿੱਚ ਕੋਡੀ ਬਟਨ 'ਤੇ ਭੇਜੋ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਲੰਬੀ ਪ੍ਰੈਸ 'ਤੇ ਟਿੱਪਣੀਆਂ ਨੂੰ ਕਾਪੀ ਕਰਨ ਦੀ ਸਮਰੱਥਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ ਹੈ ਸੁਧਾਰ • ਰੀਕੈਪਚਾ ਗਤੀਵਿਧੀ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ ਪ੍ਰਾਪਤ ਕੀਤੀਆਂ ਕੂਕੀਜ਼ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕਰੋ • ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਦੇਖਣ ਦਾ ਇਤਿਹਾਸ ਚਾਲੂ ਨਾ ਹੋਣ 'ਤੇ ਦਰਾਜ਼ ਦੇ ਹੱਕ ਵਿੱਚ ਡਾਟ-ਮੀਨੂ ਨੂੰ ਹਟਾਇਆ ਗਿਆ ਅਤੇ ਇਤਿਹਾਸ ਨੂੰ ਲੁਕਾਓ ਬਟਨ • Android 6 ਅਤੇ ਬਾਅਦ ਵਾਲੇ 'ਤੇ ਸਹੀ ਢੰਗ ਨਾਲ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਹੋਰ ਐਪਾਂ ਦੀ ਇਜਾਜ਼ਤ ਦੇ ਉੱਪਰ ਡਿਸਪਲੇ ਲਈ ਪੁੱਛੋ • BookmarkFragment ਵਿੱਚ ਲੰਮਾ-ਕਲਿੱਕ ਕਰਕੇ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਦਾ ਨਾਮ ਬਦਲੋ • ਕਈ PeerTube ਸੁਧਾਰ • ਕਈ ਅੰਗਰੇਜ਼ੀ ਸਰੋਤ ਸਤਰਾਂ ਨੂੰ ਸੁਧਾਰਿਆ ਗਿਆ ਹੈ ਸਥਿਰ • ਫਿਕਸਡ ਪਲੇਅਰ ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਹੋ ਰਿਹਾ ਹੈ ਹਾਲਾਂਕਿ ਇਹ ਉਦੋਂ ਰੋਕਿਆ ਜਾਂਦਾ ਹੈ ਜਦੋਂ ਵਿਕਲਪ "ਐਪ ਸਵਿੱਚ 'ਤੇ ਛੋਟਾ ਕਰੋ" ਯੋਗ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਅਤੇ ਨਿਊ ਪਾਈਪ ਨੂੰ ਛੋਟਾ ਕੀਤਾ ਜਾਂਦਾ ਹੈ • ਸੰਕੇਤ ਲਈ ਸ਼ੁਰੂਆਤੀ ਚਮਕ ਮੁੱਲ ਨੂੰ ਠੀਕ ਕਰੋ • ਸਥਿਰ .srt ਉਪਸਿਰਲੇਖ ਡਾਉਨਲੋਡ ਜਿਸ ਵਿੱਚ ਸਾਰੇ ਲਾਈਨ ਬ੍ਰੇਕ ਨਹੀਂ ਹਨ • SD ਕਾਰਡ 'ਤੇ ਸਥਿਰ ਡਾਊਨਲੋਡ ਅਸਫਲ ਹੋ ਰਿਹਾ ਹੈ ਕਿਉਂਕਿ ਕੁਝ Android 5 ਡਿਵਾਈਸਾਂ CTF ਅਨੁਕੂਲ ਨਹੀਂ ਹਨ • Android KitKat 'ਤੇ ਸਥਿਰ ਡਾਊਨਲੋਡਿੰਗ • ਸਥਿਰ ਭ੍ਰਿਸ਼ਟ ਵੀਡੀਓ .mp4 ਫਾਈਲ ਨੂੰ ਆਡੀਓ ਫਾਈਲ ਵਜੋਂ ਮਾਨਤਾ ਦਿੱਤੀ ਜਾ ਰਹੀ ਹੈ • ਗਲਤ ਚੀਨੀ ਭਾਸ਼ਾ ਕੋਡ ਸਮੇਤ, ਮਲਟੀਪਲ ਸਥਾਨੀਕਰਨ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ ਹੈ • [YouTube] ਵਰਣਨ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪ ਦੁਬਾਰਾ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਹਨ diff --git a/fastlane/metadata/android/pa/changelogs/850.txt b/fastlane/metadata/android/pa/changelogs/850.txt new file mode 100644 index 00000000000..561cdec62e8 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/850.txt @@ -0,0 +1 @@ +ਇਸ ਰੀਲੀਜ਼ ਵਿੱਚ YouTube ਵੈੱਬਸਾਈਟ ਸੰਸਕਰਣ ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ ਸੀ। ਪੁਰਾਣਾ ਵੈੱਬਸਾਈਟ ਸੰਸਕਰਣ ਮਾਰਚ ਵਿੱਚ ਬੰਦ ਹੋਣ ਜਾ ਰਿਹਾ ਹੈ ਅਤੇ ਇਸ ਲਈ ਤੁਹਾਨੂੰ ਨਿਊ ਪਾਈਪ ਨੂੰ ਅਪਗ੍ਰੇਡ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। diff --git a/fastlane/metadata/android/pa/changelogs/860.txt b/fastlane/metadata/android/pa/changelogs/860.txt new file mode 100644 index 00000000000..900671ab847 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/860.txt @@ -0,0 +1 @@ +ਸੁਧਾਰ • ਸੇਵ ਕਰੋ ਅਤੇ ਰੀਸਟੋਰ ਕਰੋ ਕਿ ਕੀ ਪਿੱਚ ਅਤੇ ਟੈਂਪੋ ਅਣਹੁੱਕ ਹਨ ਜਾਂ ਨਹੀਂ • ਪਲੇਅਰ ਵਿੱਚ ਡਿਸਪਲੇ ਕੱਟਆਊਟ ਦਾ ਸਮਰਥਨ ਕਰੋ • ਗੋਲ ਦ੍ਰਿਸ਼ ਅਤੇ ਗਾਹਕਾਂ ਦੀ ਗਿਣਤੀ • ਘੱਟ ਡਾਟਾ ਵਰਤਣ ਲਈ YouTube ਨੂੰ ਅਨੁਕੂਲ ਬਣਾਇਆ ਗਿਆ ਇਸ ਰੀਲੀਜ਼ ਵਿੱਚ 15 ਤੋਂ ਵੱਧ YouTube-ਸਬੰਧਤ ਬੱਗ ਫਿਕਸ ਕੀਤੇ ਗਏ ਸਨ। diff --git a/fastlane/metadata/android/pa/changelogs/870.txt b/fastlane/metadata/android/pa/changelogs/870.txt new file mode 100644 index 00000000000..3656c86fcc0 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/870.txt @@ -0,0 +1,2 @@ +ਇਹ ਇੱਕ ਹੌਟਫਿਕਸ ਰੀਲੀਜ਼ ਹੈ ਜੋ ਨਿਊਪਾਈਪ ਨੂੰ ਅੱਪਡੇਟ ਕਰ ਰਿਹਾ ਹੈ ਤਾਂ ਜੋ ਦੁਬਾਰਾ ਵੱਡੀਆਂ ਮੁਸ਼ਕਲਾਂ ਤੋਂ ਬਿਨਾਂ ਸਾਉਂਡ ਕਲਾਉਡ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੱਤੀ ਜਾ ਸਕੇ। +SoundCloud ਦਾ v2 API ਹੁਣ ਐਕਸਟਰੈਕਟਰ ਵਿੱਚ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ ਅਤੇ ਅਵੈਧ ਕਲਾਇੰਟ ਆਈਡੀ ਦੀ ਖੋਜ ਵਿੱਚ ਸੁਧਾਰ ਕੀਤਾ ਗਿਆ ਹੈ। diff --git a/fastlane/metadata/android/pa/changelogs/900.txt b/fastlane/metadata/android/pa/changelogs/900.txt new file mode 100644 index 00000000000..f9a004a0dbd --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/900.txt @@ -0,0 +1 @@ +ਨਵਾਂ • ਗਾਹਕੀ ਸਮੂਹ ਅਤੇ ਕ੍ਰਮਬੱਧ ਫੀਡ • ਖਿਡਾਰੀਆਂ ਵਿੱਚ ਮਿਊਟ ਬਟਨ ਸੁਧਾਰ • NewPipe ਵਿੱਚ music.youtube.com ਅਤੇ media.ccc.de ਲਿੰਕ ਖੋਲ੍ਹਣ ਦਿਓ • ਦਿੱਖ ਤੋਂ ਸਮੱਗਰੀ ਤੱਕ ਦੋ ਸੈਟਿੰਗਾਂ ਨੂੰ ਮੁੜ-ਸਥਾਪਿਤ ਕਰੋ • 5, 15, 25 ਸਕਿੰਟ ਦੇ ਸੀਕ ਵਿਕਲਪਾਂ ਨੂੰ ਲੁਕਾਓ ਜੇਕਰ ਅਢੁੱਕਵੀਂ ਖੋਜ ਸਮਰਥਿਤ ਹੈ ਸਥਿਰ • ਕੁਝ WebM ਵੀਡੀਓ ਖੋਜਣ ਯੋਗ ਨਹੀਂ ਹਨ • Android P 'ਤੇ ਡਾਟਾਬੇਸ ਬੈਕਅੱਪ • ਡਾਉਨਲੋਡ ਕੀਤੀ ਫਾਈਲ ਨੂੰ ਸਾਂਝਾ ਕਰਦੇ ਸਮੇਂ ਕਰੈਸ਼ • ਬਹੁਤ ਸਾਰੇ YouTube ਐਕਸਟਰੈਕਸ਼ਨ ਮੁੱਦੇ ਅਤੇ ਹੋਰ... diff --git a/fastlane/metadata/android/pa/changelogs/910.txt b/fastlane/metadata/android/pa/changelogs/910.txt new file mode 100644 index 00000000000..1cc2a1432af --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/910.txt @@ -0,0 +1 @@ +ਸਥਿਰ ਡੇਟਾਬੇਸ ਮਾਈਗ੍ਰੇਸ਼ਨ ਜਿਸ ਨੇ ਕੁਝ ਦੁਰਲੱਭ ਮਾਮਲਿਆਂ ਵਿੱਚ ਨਿਊਪਾਈਪ ਨੂੰ ਸ਼ੁਰੂ ਹੋਣ ਤੋਂ ਰੋਕਿਆ। diff --git a/fastlane/metadata/android/pa/changelogs/920.txt b/fastlane/metadata/android/pa/changelogs/920.txt new file mode 100644 index 00000000000..04fc07937e8 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/920.txt @@ -0,0 +1 @@ +ਸੁਧਾਰ • ਸਟ੍ਰੀਮ ਗਰਿੱਡ ਆਈਟਮਾਂ 'ਤੇ ਅੱਪਲੋਡ ਦੀ ਮਿਤੀ ਅਤੇ ਦੇਖਣ ਦੀ ਗਿਣਤੀ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਦਰਾਜ਼ ਹੈਡਰ ਲੇਆਉਟ ਲਈ ਸੁਧਾਰ ਸਥਿਰ • ਏਪੀਆਈ 19 'ਤੇ ਕ੍ਰੈਸ਼ ਹੋਣ ਕਾਰਨ ਫਿਕਸਡ ਮਿਊਟ ਬਟਨ • ਲੰਬੇ 1080p 60fps ਵੀਡੀਓ ਦੀ ਸਥਿਰ ਡਾਊਨਲੋਡਿੰਗ diff --git a/fastlane/metadata/android/pa/changelogs/930.txt b/fastlane/metadata/android/pa/changelogs/930.txt new file mode 100644 index 00000000000..a067bfb5868 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/930.txt @@ -0,0 +1 @@ +ਨਵਾਂ • YouTube ਸੰਗੀਤ 'ਤੇ ਖੋਜੋ • ਬੁਨਿਆਦੀ Android TV ਸਮਰਥਨ ਸੁਧਾਰ • ਇੱਕ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਤੋਂ ਸਾਰੇ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਨੂੰ ਹਟਾਉਣ ਦੀ ਯੋਗਤਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ ਹੈ • ਕ੍ਰੈਸ਼ ਹੋਣ ਦੀ ਬਜਾਏ ਜਦੋਂ ਸਮੱਗਰੀ ਅਜੇ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ ਤਾਂ ਸੁਨੇਹਾ ਦਿਖਾਓ • ਚੁਟਕੀ ਇਸ਼ਾਰਿਆਂ ਨਾਲ ਪੌਪਅੱਪ ਪਲੇਅਰ ਦਾ ਆਕਾਰ ਬਦਲਿਆ ਗਿਆ ਹੈ • ਬੈਕਗ੍ਰਾਊਂਡ 'ਤੇ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਅਤੇ ਚੈਨਲ ਵਿੱਚ ਪੌਪਅੱਪ ਬਟਨਾਂ 'ਤੇ ਸਟ੍ਰੀਮ ਨੂੰ ਐਨਕਿਊ ਕਰੋ • ਦਰਾਜ਼ ਸਿਰਲੇਖ ਦੇ ਸਿਰਲੇਖ ਦੇ ਆਕਾਰ ਨੂੰ ਸੰਭਾਲਣ ਵਿੱਚ ਸੁਧਾਰ ਕੀਤਾ ਗਿਆ ਹੈ ਸਥਿਰ • ਨਿਸ਼ਚਿਤ ਉਮਰ ਪ੍ਰਤਿਬੰਧਿਤ ਸਮੱਗਰੀ ਸੈਟਿੰਗ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀ • ਕੁਝ ਖਾਸ ਕਿਸਮ ਦੇ reCAPTCHA ਫਿਕਸ ਕੀਤੇ ਗਏ ਹਨ • ਪਲੇਲਿਸਟ `ਨੱਲ` ਹੋਣ 'ਤੇ ਬੁੱਕਮਾਰਕ ਖੋਲ੍ਹਣ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ • ਨੈੱਟਵਰਕ ਸੰਬੰਧੀ ਅਪਵਾਦਾਂ ਦੀ ਸਥਿਰ ਖੋਜ • ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫਰੈਗਮੈਂਟ ਵਿੱਚ ਗਰੁੱਪ ਸੌਰਟ ਬਟਨ ਦੀ ਸਥਿਰ ਦਿੱਖ ਅਤੇ ਹੋਰ diff --git a/fastlane/metadata/android/pa/changelogs/940.txt b/fastlane/metadata/android/pa/changelogs/940.txt new file mode 100644 index 00000000000..b9d9b3fdf98 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/940.txt @@ -0,0 +1 @@ +ਨਵਾਂ • SoundCloud ਟਿੱਪਣੀਆਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ • YouTube ਪ੍ਰਤਿਬੰਧਿਤ ਮੋਡ ਸੈਟਿੰਗ ਸ਼ਾਮਲ ਕਰੋ • PeerTube ਮੂਲ ਚੈਨਲ ਦੇ ਵੇਰਵੇ ਦਿਖਾਓ ਸੁਧਾਰ • ਸਿਰਫ਼ ਸਮਰਥਿਤ ਸੇਵਾਵਾਂ ਲਈ ਕੋਰ ਬਟਨ ਦਿਖਾਓ • ਨੈਵੀਗੇਸ਼ਨਬਾਰ ਜਾਂ ਸਟੇਟਸਬਾਰ ਤੋਂ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਪਲੇਅਰ ਸੰਕੇਤਾਂ ਨੂੰ ਬਲਾਕ ਕਰੋ • ਸੇਵਾ ਦੇ ਰੰਗ ਦੇ ਆਧਾਰ 'ਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਅਤੇ ਗਾਹਕ ਬਣੋ ਬਟਨਾਂ ਦਾ ਪਿਛੋਕੜ ਰੰਗ ਬਦਲੋ ਸਥਿਰ • ਡਾਉਨਲੋਡ ਡਾਇਲਾਗ ਫ੍ਰੀਜ਼ ਨੂੰ ਠੀਕ ਕਰੋ • ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ ਬਟਨ ਹੁਣ ਅਸਲ ਵਿੱਚ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੁੱਲ੍ਹਦਾ ਹੈ • ਵੀਡੀਓ ਖੋਲ੍ਹਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ "ਇਸ ਸਟ੍ਰੀਮ ਨੂੰ ਚਲਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ" ਅਤੇ ਹੋਰ diff --git a/fastlane/metadata/android/pa/changelogs/950.txt b/fastlane/metadata/android/pa/changelogs/950.txt new file mode 100644 index 00000000000..454a34bd479 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/950.txt @@ -0,0 +1,4 @@ +ਇਹ ਰੀਲੀਜ਼ ਤਿੰਨ ਛੋਟੇ ਫਿਕਸ ਲਿਆਉਂਦਾ ਹੈ: +• Adroid 10+ 'ਤੇ ਸਥਿਰ ਸਟੋਰੇਜ ਪਹੁੰਚ +• ਫਿਕਸਡ ਓਪਨਿੰਗ ਕਿਓਸਕ +• ਲੰਬੇ ਵੀਡੀਓਜ਼ ਦੀ ਸਥਿਰ ਮਿਆਦ ਪਾਰਸਿੰਗ diff --git a/fastlane/metadata/android/pa/changelogs/951.txt b/fastlane/metadata/android/pa/changelogs/951.txt new file mode 100644 index 00000000000..2b1cd7933f0 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/951.txt @@ -0,0 +1,13 @@ +ਨਵਾਂ +• ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਗਾਹਕੀ ਚੋਣਕਾਰ ਲਈ ਖੋਜ ਸ਼ਾਮਲ ਕਰੋ +• ਸਿਰਫ਼ ਗੈਰ-ਗਰੁੱਪ ਕੀਤੀਆਂ ਗਾਹਕੀਆਂ ਨੂੰ ਦਿਖਾਉਣ ਲਈ ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਫਿਲਟਰ ਸ਼ਾਮਲ ਕਰੋ +• ਪਲੇਲਿਸਟ ਟੈਬ ਨੂੰ ਮੁੱਖ ਪੰਨੇ 'ਤੇ ਸ਼ਾਮਲ ਕਰੋ +• ਬੈਕਗ੍ਰਾਊਂਡ/ਪੌਪ-ਅੱਪ ਪਲੇਅਰ ਕਤਾਰ ਵਿੱਚ ਤੇਜ਼ੀ ਨਾਲ ਅੱਗੇ/ਰਿਵਾਈਂਡ ਕਰੋ +• ਖੋਜ ਸੁਝਾਅ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ: ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਹੈ ਅਤੇ ਇਸ ਲਈ ਨਤੀਜਾ ਦਿਖਾ ਰਿਹਾ ਹੈ +ਸੁਧਾਰ +• ਮਿਕਸਡ ਫਾਈਲਾਂ ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨ ਮੈਟਾਡੇਟਾ ਲਿਖਣਾ ਛੱਡੋ • ਕਤਾਰ ਤੋਂ ਅਸਫਲ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਨਾ ਹਟਾਓ +• ਟੂਲਬਾਰ ਦੇ ਰੰਗ ਨਾਲ ਮੇਲ ਕਰਨ ਲਈ ਸਥਿਤੀ ਪੱਟੀ ਦਾ ਰੰਗ ਅੱਪਡੇਟ ਕਰੋ + +ਠੀਕ ਕੀਤਾ +• ਫਲੋਟਿੰਗ ਪੁਆਇੰਟ ਸੰਚਤ ਤਰੁੱਟੀਆਂ ਦੇ ਕਾਰਨ ਫਿਕਸਡ ਆਡੀਓ/ਵੀਡੀਓ ਡੀਸਿੰਕ +• [PeerTube] ਮਿਟਾਈਆਂ ਗਈਆਂ ਟਿੱਪਣੀਆਂ ਨੂੰ ਸੰਭਾਲੋ ਅਤੇ ਹੋਰ diff --git a/fastlane/metadata/android/pa/changelogs/952.txt b/fastlane/metadata/android/pa/changelogs/952.txt new file mode 100644 index 00000000000..dda91ee5514 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/952.txt @@ -0,0 +1,7 @@ +ਸੁਧਾਰ +• ਆਟੋ-ਪਲੇ ਸਾਰੀਆਂ ਸੇਵਾਵਾਂ ਲਈ ਉਪਲਬਧ ਹੈ (ਸਿਰਫ਼ YouTube ਦੀ ਬਜਾਏ) + +ਠੀਕ ਕੀਤਾ +• YouTube ਦੀਆਂ ਨਵੀਆਂ ਨਿਰੰਤਰਤਾਵਾਂ ਦਾ ਸਮਰਥਨ ਕਰਕੇ ਸੰਬੰਧਿਤ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸਥਿਰ ਕੀਤਾ ਗਿਆ +• ਨਿਸ਼ਚਿਤ ਉਮਰ ਪ੍ਰਤਿਬੰਧਿਤ YouTube ਵੀਡੀਓ +• [Android TV] ਸਥਿਰ ਲੰਮੀ ਫੋਕਸ ਹਾਈਲਾਈਟ ਓਵਰਲੇ diff --git a/fastlane/metadata/android/pa/changelogs/953.txt b/fastlane/metadata/android/pa/changelogs/953.txt new file mode 100644 index 00000000000..5d5672ad250 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/953.txt @@ -0,0 +1 @@ +YouTube ਦੇ ਡੀਕ੍ਰਿਪਸ਼ਨ ਫੰਕਸ਼ਨ ਦੇ ਐਕਸਟਰੈਕਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ। diff --git a/fastlane/metadata/android/pa/changelogs/954.txt b/fastlane/metadata/android/pa/changelogs/954.txt new file mode 100644 index 00000000000..3eb8dd68bf6 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/954.txt @@ -0,0 +1,8 @@ +• ਨਵਾਂ ਐਪਲੀਕੇਸ਼ਨ ਵਰਕਫਲੋ: ਵੇਰਵੇ ਵਾਲੇ ਪੰਨੇ 'ਤੇ ਵੀਡੀਓ ਚਲਾਓ, ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰਨ ਲਈ ਹੇਠਾਂ ਵੱਲ ਸਵਾਈਪ ਕਰੋ +• ਮੀਡੀਆ ਸਟਾਈਲ ਸੂਚਨਾਵਾਂ: ਸੂਚਨਾਵਾਂ ਵਿੱਚ ਅਨੁਕੂਲਿਤ ਕਾਰਵਾਈਆਂ, ਪ੍ਰਦਰਸ਼ਨ ਸੁਧਾਰ +• ਡੈਸਕਟੌਪ ਐਪ ਦੇ ਤੌਰ 'ਤੇ NewPipe ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਮੂਲ ਰੀਸਾਈਜ਼ ਕਰਨਾ + +• ਇੱਕ ਅਸਮਰਥਿਤ URL ਟੋਸਟ ਦੇ ਮਾਮਲੇ ਵਿੱਚ ਖੁੱਲੇ ਵਿਕਲਪਾਂ ਨਾਲ ਡਾਇਲਾਗ ਦਿਖਾਓ +• ਜਦੋਂ ਰਿਮੋਟ ਨੂੰ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਤਾਂ ਖੋਜ ਸੁਝਾਅ ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਓ +• ਡਿਫ਼ਾਲਟ ਵੀਡੀਓ ਗੁਣਵੱਤਾ ਨੂੰ 720p60 (ਇਨ-ਐਪ ਪਲੇਅਰ) ਅਤੇ 480p (ਪੌਪ-ਅੱਪ ਪਲੇਅਰ) ਤੱਕ ਵਧਾ ਦਿੱਤਾ ਗਿਆ ਹੈ +• ਬਹੁਤ ਸਾਰੇ ਬੱਗ ਫਿਕਸ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ diff --git a/fastlane/metadata/android/pa/changelogs/955.txt b/fastlane/metadata/android/pa/changelogs/955.txt new file mode 100644 index 00000000000..ea480cb5a53 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/955.txt @@ -0,0 +1,3 @@ +[YouTube] ਕੁਝ ਉਪਭੋਗਤਾਵਾਂ ਲਈ ਖੋਜ ਨੂੰ ਠੀਕ ਕਰੋ +[YouTube] ਬੇਤਰਤੀਬੇ ਡੀਕ੍ਰਿਪਸ਼ਨ ਅਪਵਾਦਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +[SoundCloud] ਸਲੈਸ਼ ਨਾਲ ਖਤਮ ਹੋਣ ਵਾਲੇ URL ਹੁਣ ਸਹੀ ਤਰ੍ਹਾਂ ਪਾਰਸ ਕੀਤੇ ਗਏ ਹਨ diff --git a/fastlane/metadata/android/pa/changelogs/956.txt b/fastlane/metadata/android/pa/changelogs/956.txt new file mode 100644 index 00000000000..897a5bf2af6 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/956.txt @@ -0,0 +1 @@ +[YouTube] ਕਿਸੇ ਵੀ ਵੀਡੀਓ ਨੂੰ ਲੋਡ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ diff --git a/fastlane/metadata/android/pa/changelogs/957.txt b/fastlane/metadata/android/pa/changelogs/957.txt new file mode 100644 index 00000000000..eb66dacbc97 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/957.txt @@ -0,0 +1,10 @@ +• ਖਾਸ ਐਨਕਿਊ ਕਿਰਿਆਵਾਂ ਨੂੰ ਇੱਕ ਵਿੱਚ ਜੋੜੋ +• ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ ਦੋ ਉਂਗਲਾਂ ਦੇ ਸੰਕੇਤ +• reCAPTCHA ਕੂਕੀਜ਼ ਨੂੰ ਕਲੀਅਰ ਕਰਨ ਦਿਓ +• ਨੋਟੀਫਿਕੇਸ਼ਨ ਨੂੰ ਰੰਗ ਨਾ ਕਰਨ ਦਾ ਵਿਕਲਪ +• ਅਨੰਤ ਬਫਰਿੰਗ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਵਿਡੀਓ ਵੇਰਵਿਆਂ ਨੂੰ ਕਿਵੇਂ ਖੋਲ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਇਸ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ, ਨਿਊਪਾਈਪ ਨਾਲ ਸਾਂਝਾ ਕਰਨ ਵੇਲੇ ਬੱਗੀ ਵਿਵਹਾਰ ਅਤੇ ਹੋਰ ਅਸੰਗਤਤਾਵਾਂ +• YouTube ਵੀਡੀਓਜ਼ ਦੀ ਗਤੀ ਵਧਾਓ ਅਤੇ ਉਮਰ ਪ੍ਰਤੀਬੰਧਿਤ ਵੀਡੀਓ ਨੂੰ ਠੀਕ ਕਰੋ +• ਫਾਸਟ ਫਾਰਵਰਡ/ਰਿਵਾਇੰਡ 'ਤੇ ਕਰੈਸ਼ ਨੂੰ ਠੀਕ ਕਰੋ +• ਥੰਬਨੇਲ ਖਿੱਚ ਕੇ ਸੂਚੀਆਂ ਨੂੰ ਮੁੜ ਵਿਵਸਥਿਤ ਨਾ ਕਰੋ +• ਪੌਪਅੱਪ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਹਮੇਸ਼ਾ ਯਾਦ ਰੱਖੋ +• ਸੰਤਾਲੀ ਭਾਸ਼ਾ ਸ਼ਾਮਲ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/958.txt b/fastlane/metadata/android/pa/changelogs/958.txt new file mode 100644 index 00000000000..66c2ae76377 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/958.txt @@ -0,0 +1 @@ +ਨਵਾਂ ਅਤੇ ਸੁਧਾਰਿਆ ਗਿਆ: • ਲੌਕ ਸਕ੍ਰੀਨ 'ਤੇ ਥੰਬਨੇਲ ਨੂੰ ਲੁਕਾਉਣ ਲਈ ਮੁੜ-ਜੋੜਿਆ ਗਿਆ ਵਿਕਲਪ • ਫੀਡ ਨੂੰ ਤਾਜ਼ਾ ਕਰਨ ਲਈ ਖਿੱਚੋ • ਸਥਾਨਕ ਸੂਚੀਆਂ ਪ੍ਰਾਪਤ ਕਰਨ ਵੇਲੇ ਬਿਹਤਰ ਕਾਰਗੁਜ਼ਾਰੀ ਸਥਿਰ: • ਰੈਮ ਤੋਂ ਹਟਾਏ ਜਾਣ ਤੋਂ ਬਾਅਦ ਨਿਊਪਾਈਪ ਨੂੰ ਚਾਲੂ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ • ਕੋਈ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਨਾ ਹੋਣ 'ਤੇ ਸਟਾਰਟਅਪ 'ਤੇ ਸਥਿਰ ਕਰੈਸ਼ • ਚਮਕ- ਅਤੇ ਵੌਲਯੂਮ-ਇਸ਼ਾਰਾ ਸੈਟਿੰਗਾਂ ਦਾ ਆਦਰ ਕਰਦੇ ਹੋਏ ਸਥਿਰ • [YouTube] ਸਥਿਰ ਲੰਬੀਆਂ ਪਲੇਲਿਸਟਾਂ ਹੋਰ: • ਕੋਡ ਕਲੀਨਅੱਪ ਅਤੇ ਕਈ ਅੰਦਰੂਨੀ ਸੁਧਾਰ • ਨਿਰਭਰਤਾ ਅੱਪਡੇਟ • ਅਨੁਵਾਦ ਅੱਪਡੇਟ diff --git a/fastlane/metadata/android/pa/changelogs/959.txt b/fastlane/metadata/android/pa/changelogs/959.txt new file mode 100644 index 00000000000..5ababff32fc --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/959.txt @@ -0,0 +1,3 @@ +ਗਲਤੀ ਰਿਪੋਰਟਰ ਨੂੰ ਖੋਲ੍ਹਣ ਤੋਂ ਬਾਅਦ ਕਰੈਸ਼ਾਂ ਦਾ ਬੇਅੰਤ ਲੂਪ ਸਥਿਰ ਕੀਤਾ ਗਿਆ। +PeerTube ਉਦਾਹਰਨਾਂ ਦੀ ਅੱਪਡੇਟ ਕੀਤੀ ਸੂਚੀ ਜੋ +NewPipe ਦੁਆਰਾ ਆਪਣੇ ਆਪ ਖੋਲ੍ਹੀ ਜਾ ਸਕਦੀ ਹੈ। ਅੱਪਡੇਟ ਕੀਤੇ ਅਨੁਵਾਦ। diff --git a/fastlane/metadata/android/pa/changelogs/960.txt b/fastlane/metadata/android/pa/changelogs/960.txt new file mode 100644 index 00000000000..8527ebd2d4b --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/960.txt @@ -0,0 +1,4 @@ +• ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਨਿਰਯਾਤ ਡੇਟਾਬੇਸ ਵਿਕਲਪ ਦਾ ਸੁਧਾਰਿਆ ਗਿਆ ਵਰਣਨ। +• ਸਥਿਰ YouTube ਟਿੱਪਣੀਆਂ ਪਾਰਸਿੰਗ। +• media.ccc.de ਸੇਵਾ ਦਾ ਸਥਿਰ ਡਿਸਪਲੇ ਨਾਮ। +• ਅੱਪਡੇਟ ਕੀਤੇ ਅਨੁਵਾਦ। diff --git a/fastlane/metadata/android/pa/changelogs/961.txt b/fastlane/metadata/android/pa/changelogs/961.txt new file mode 100644 index 00000000000..069b0823901 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/961.txt @@ -0,0 +1 @@ +• [YouTube] ਮਿਕਸ ਸਮਰਥਨ • [YouTube] ਜਨਤਕ ਪ੍ਰਸਾਰਕਾਂ ਅਤੇ ਕੋਵਿਡ-19 ਬਾਰੇ ਜਾਣਕਾਰੀ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ • [media.ccc.de] ਜੋੜੇ ਗਏ ਹਾਲੀਆ ਵੀਡੀਓ • ਸੋਮਾਲੀ ਅਨੁਵਾਦ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਬਹੁਤ ਸਾਰੇ ਅੰਦਰੂਨੀ ਸੁਧਾਰ • ਪਲੇਅਰ ਦੇ ਅੰਦਰੋਂ ਸਥਿਰ ਸ਼ੇਅਰਿੰਗ ਵੀਡੀਓ • ਸਥਿਰ ਖਾਲੀ ReCaptcha ਵੈਬਵਿਊ • ਇੱਕ ਸੂਚੀ ਵਿੱਚੋਂ ਇੱਕ ਸਟ੍ਰੀਮ ਨੂੰ ਹਟਾਉਣ ਵੇਲੇ ਆਈ ਕ੍ਰੈਸ਼ ਦਾ ਹੱਲ • [PeerTube] ਸਥਿਰ ਸੰਬੰਧਿਤ ਸਟ੍ਰੀਮਾਂ • [YouTube] ਸਥਿਰ YouTube ਸੰਗੀਤ ਖੋਜ diff --git a/fastlane/metadata/android/pa/changelogs/962.txt b/fastlane/metadata/android/pa/changelogs/962.txt new file mode 100644 index 00000000000..3676cf31b0a --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/962.txt @@ -0,0 +1,2 @@ +media.ccc.de ਸੇਵਾ ਵਿੱਚ "ਹਾਲੀਆ" ਵਿਡੀਓਜ਼ ਸ਼ਾਮਲ ਕੀਤੇ ਗਏ। +media.ccc.de ਸੇਵਾ ਵਿੱਚ ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਸ਼ਾਮਲ ਕੀਤੀਆਂ ਗਈਆਂ ਅਤੇ ਲਾਈਵ ਸਟ੍ਰੀਮ ਸਮਰਥਨ ਵੀ। diff --git a/fastlane/metadata/android/pa/changelogs/963.txt b/fastlane/metadata/android/pa/changelogs/963.txt new file mode 100644 index 00000000000..f0bc9b09cf1 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/963.txt @@ -0,0 +1 @@ +• [YouTube] ਸਥਿਰ ਚੈਨਲ ਨਿਰੰਤਰਤਾ diff --git a/fastlane/metadata/android/pa/changelogs/964.txt b/fastlane/metadata/android/pa/changelogs/964.txt new file mode 100644 index 00000000000..85dc2c15149 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/964.txt @@ -0,0 +1 @@ +• ਪਲੇਅਰ ਨਿਯੰਤਰਣ ਵਿੱਚ ਅਧਿਆਵਾਂ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ • [PeerTube] ਸੇਪੀਆ ਖੋਜ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਵੀਡੀਓ ਵੇਰਵੇ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਸ਼ੇਅਰ ਬਟਨ ਨੂੰ ਮੁੜ-ਜੋੜਿਆ ਗਿਆ ਅਤੇ ਟੈਬ ਲੇਆਉਟ ਵਿੱਚ ਸਟ੍ਰੀਮ ਵਰਣਨ ਨੂੰ ਤਬਦੀਲ ਕੀਤਾ ਗਿਆ • ਜੇਕਰ ਚਮਕ ਦਾ ਸੰਕੇਤ ਅਸਮਰੱਥ ਹੈ ਤਾਂ ਚਮਕ ਨੂੰ ਬਹਾਲ ਕਰਨਾ ਬੰਦ ਕਰੋ • ਕੋਡੀ 'ਤੇ ਵੀਡੀਓ ਚਲਾਉਣ ਲਈ ਸੂਚੀ ਆਈਟਮ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ • ਕੁਝ ਡਿਵਾਈਸਾਂ 'ਤੇ ਕੋਈ ਡਿਫੌਲਟ ਬ੍ਰਾਊਜ਼ਰ ਸੈੱਟ ਨਾ ਹੋਣ 'ਤੇ ਕ੍ਰੈਸ਼ ਦਾ ਹੱਲ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਸ਼ੇਅਰ ਡਾਇਲਾਗਸ ਨੂੰ ਬਿਹਤਰ ਬਣਾਓ • ਫੁੱਲਸਕ੍ਰੀਨ ਪਲੇਅਰ ਵਿੱਚ ਹਾਰਡਵੇਅਰ ਸਪੇਸ ਬਟਨ ਨਾਲ ਪਲੇ/ਪੌਜ਼ ਨੂੰ ਟੌਗਲ ਕਰੋ • [media.ccc.de] ਕਈ ਫਿਕਸ ਅਤੇ ਸੁਧਾਰ diff --git a/fastlane/metadata/android/pa/changelogs/965.txt b/fastlane/metadata/android/pa/changelogs/965.txt new file mode 100644 index 00000000000..83e28b70750 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/965.txt @@ -0,0 +1 @@ +ਸਥਿਰ ਕਰੈਸ਼ ਜੋ ਚੈਨਲ ਸਮੂਹਾਂ ਨੂੰ ਮੁੜ ਕ੍ਰਮਬੱਧ ਕਰਨ ਵੇਲੇ ਵਾਪਰਿਆ ਸੀ। ਚੈਨਲਾਂ ਅਤੇ ਪਲੇਲਿਸਟਾਂ ਤੋਂ ਹੋਰ YouTube ਵੀਡੀਓ ਪ੍ਰਾਪਤ ਕਰਨਾ ਸਥਿਰ ਕੀਤਾ ਗਿਆ ਹੈ। YouTube ਟਿੱਪਣੀਆਂ ਪ੍ਰਾਪਤ ਕਰਨਾ ਸਥਿਰ ਹੈ। YouTube URL ਵਿੱਚ /watch/, /v/ ਅਤੇ /w/ ਸਬਪਾਥ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ। SoundCloud ਕਲਾਇੰਟ ਆਈਡੀ ਅਤੇ ਭੂ-ਪ੍ਰਤੀਬੰਧਿਤ ਸਮਗਰੀ ਦਾ ਸਥਿਰ ਐਕਸਟਰੈਕਸ਼ਨ। ਉੱਤਰੀ ਕੁਰਦਿਸ਼ ਸਥਾਨਕਕਰਨ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ। diff --git a/fastlane/metadata/android/pa/changelogs/966.txt b/fastlane/metadata/android/pa/changelogs/966.txt new file mode 100644 index 00000000000..61afac50376 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/966.txt @@ -0,0 +1 @@ +ਨਵਾਂ: • ਇੱਕ ਨਵੀਂ ਸੇਵਾ ਸ਼ਾਮਲ ਕਰੋ: Bandcamp ਸੁਧਾਰ: • ਐਪ ਨੂੰ ਡਿਵਾਈਸ ਥੀਮ ਦਾ ਅਨੁਸਰਣ ਕਰਨ ਲਈ ਇੱਕ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕਰੋ • ਇੱਕ ਸੁਧਾਰਿਆ ਹੋਇਆ ਗਲਤੀ ਪੈਨਲ ਦਿਖਾ ਕੇ ਕੁਝ ਕਰੈਸ਼ਾਂ ਨੂੰ ਰੋਕੋ • ਇਸ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਦਿਖਾਓ ਕਿ ਸਮੱਗਰੀ ਕਿਉਂ ਉਪਲਬਧ ਨਹੀਂ ਹੈ • ਹਾਰਡਵੇਅਰ ਸਪੇਸ ਬਟਨ ਪਲੇ/ਪੌਜ਼ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ • "ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ" ਟੋਸਟ ਦਿਖਾਓ ਸਥਿਰ: • ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਦੇ ਸਮੇਂ ਵੀਡੀਓ ਵੇਰਵਿਆਂ ਵਿੱਚ ਬਹੁਤ ਛੋਟੇ ਥੰਬਨੇਲ ਨੂੰ ਠੀਕ ਕਰੋ • ਨਿਊਨਤਮ ਪਲੇਅਰ ਵਿੱਚ ਖਾਲੀ ਸਿਰਲੇਖ ਨੂੰ ਠੀਕ ਕਰੋ • ਪਿਛਲੇ ਰੀਸਾਈਜ਼ ਮੋਡ ਨੂੰ ਠੀਕ ਤਰ੍ਹਾਂ ਰੀਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ diff --git a/fastlane/metadata/android/pa/changelogs/967.txt b/fastlane/metadata/android/pa/changelogs/967.txt new file mode 100644 index 00000000000..8b63f43e75b --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/967.txt @@ -0,0 +1 @@ +ਸਥਿਰ YouTube EU ਵਿੱਚ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ। ਇਹ ਇੱਕ ਨਵੀਂ ਕੂਕੀ ਅਤੇ ਗੋਪਨੀਯਤਾ ਸਹਿਮਤੀ ਪ੍ਰਣਾਲੀ ਦੇ ਕਾਰਨ ਹੋਇਆ ਸੀ ਜਿਸ ਲਈ ਇੱਕ CONSENT ਕੂਕੀ ਸੈੱਟ ਕਰਨ ਲਈ NewPipe ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ। diff --git a/fastlane/metadata/android/pa/changelogs/968.txt b/fastlane/metadata/android/pa/changelogs/968.txt new file mode 100644 index 00000000000..3e3909022ad --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/968.txt @@ -0,0 +1 @@ +ਲੰਬੇ ਸਮੇਂ ਲਈ ਦਬਾਓ ਮੀਨੂ ਵਿੱਚ ਚੈਨਲ ਵੇਰਵੇ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ। ਪਲੇਲਿਸਟ ਇੰਟਰਫੇਸ ਤੋਂ ਪਲੇਲਿਸਟ ਨਾਮ ਦਾ ਨਾਮ ਬਦਲਣ ਲਈ ਕਾਰਜਸ਼ੀਲਤਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ। ਵੀਡੀਓ ਬਫਰਿੰਗ ਹੋਣ 'ਤੇ ਵਰਤੋਂਕਾਰ ਨੂੰ ਰੁਕਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ। ਚਿੱਟੇ ਥੀਮ ਨੂੰ ਪਾਲਿਸ਼ ਕੀਤਾ। ਇੱਕ ਵੱਡੇ ਫੌਂਟ ਆਕਾਰ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਓਵਰਲੈਪਿੰਗ ਫੌਂਟਾਂ ਨੂੰ ਸਥਿਰ ਕੀਤਾ ਗਿਆ ਹੈ। ਫਾਰਮੂਲਰ ਅਤੇ ਜ਼ੇਫੀਅਰ ਡਿਵਾਈਸਾਂ 'ਤੇ ਕੋਈ ਵੀਡੀਓ ਫਿਕਸ ਨਹੀਂ ਕੀਤਾ ਗਿਆ। ਵੱਖ-ਵੱਖ ਕਰੈਸ਼ਾਂ ਨੂੰ ਸਥਿਰ ਕੀਤਾ। diff --git a/fastlane/metadata/android/pa/changelogs/969.txt b/fastlane/metadata/android/pa/changelogs/969.txt new file mode 100644 index 00000000000..4708c4a1380 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/969.txt @@ -0,0 +1 @@ +• ਬਾਹਰੀ ਸਟੋਰੇਜ 'ਤੇ ਇੰਸਟਾਲੇਸ਼ਨ ਦੀ ਆਗਿਆ ਦਿਓ • [ਬੈਂਡਕੈਂਪ] ਇੱਕ ਸਟ੍ਰੀਮ 'ਤੇ ਪਹਿਲੀਆਂ ਤਿੰਨ ਟਿੱਪਣੀਆਂ ਨੂੰ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰਨ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ • ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਸਿਰਫ਼ 'ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਹੋ ਗਿਆ ਹੈ' ਟੋਸਟ ਦਿਖਾਓ • ਜਦੋਂ ਕੋਈ ਕੂਕੀ ਸਟੋਰ ਨਾ ਹੋਵੇ ਤਾਂ ਰੀਕੈਪਚਾ ਕੂਕੀ ਸੈਟ ਨਾ ਕਰੋ • [ਖਿਡਾਰੀ] ਕੈਸ਼ ਪ੍ਰਦਰਸ਼ਨ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ • [ਖਿਡਾਰੀ] ਫਿਕਸਡ ਪਲੇਅਰ ਆਟੋਮੈਟਿਕ ਨਹੀਂ ਚੱਲ ਰਿਹਾ • ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਮਿਟਾਉਣ ਵੇਲੇ ਪਿਛਲੀਆਂ ਸਨੈਕਬਾਰਾਂ ਨੂੰ ਖਾਰਜ ਕਰੋ • ਸੂਚੀ ਵਿੱਚ ਨਾ ਹੋਣ ਵਾਲੀ ਵਸਤੂ ਨੂੰ ਮਿਟਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਗਈ diff --git a/fastlane/metadata/android/pa/changelogs/970.txt b/fastlane/metadata/android/pa/changelogs/970.txt new file mode 100644 index 00000000000..679c9dae39f --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/970.txt @@ -0,0 +1 @@ +ਨਵਾਂ • ਵਰਣਨ ਦੇ ਹੇਠਾਂ ਸਮੱਗਰੀ ਮੈਟਾਡੇਟਾ (ਟੈਗ, ਸ਼੍ਰੇਣੀਆਂ, ਲਾਇਸੰਸ, ...) ਦਿਖਾਓ • ਰਿਮੋਟ (ਗੈਰ-ਸਥਾਨਕ) ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ "ਚੈਨਲ ਵੇਰਵੇ ਦਿਖਾਓ" ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਵਾਲੇ ਮੀਨੂ ਵਿੱਚ "ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ" ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ ਸਥਿਰ • ਵੀਡੀਓ ਵੇਰਵੇ ਪੰਨੇ 'ਤੇ ਸਥਿਰ ਰੋਟੇਸ਼ਨ ਕਰੈਸ਼ • ਪਲੇਅਰ ਵਿੱਚ ਸਥਿਰ "ਕੋਡੀ ਨਾਲ ਖੇਡੋ" ਬਟਨ ਹਮੇਸ਼ਾ ਕੋਰ ਨੂੰ ਸਥਾਪਤ ਕਰਨ ਲਈ ਪ੍ਰੇਰਦਾ ਹੈ • ਸਥਿਰ ਅਤੇ ਸੁਧਾਰੀ ਸੈਟਿੰਗ ਆਯਾਤ ਅਤੇ ਨਿਰਯਾਤ ਮਾਰਗ • [YouTube] ਸਥਿਰ ਟਿੱਪਣੀ ਪਸੰਦ ਗਿਣਤੀ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ diff --git a/fastlane/metadata/android/pa/changelogs/971.txt b/fastlane/metadata/android/pa/changelogs/971.txt new file mode 100644 index 00000000000..d3dbe862f76 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/971.txt @@ -0,0 +1,3 @@ +ਹੌਟਫਿਕਸ +• ਰੀਬਫਰ ਤੋਂ ਬਾਅਦ ਪਲੇਬੈਕ ਲਈ ਬਫਰ ਵਧਾਓ +• ਪਲੇਅਰ ਵਿੱਚ ਪਲੇ-ਕਿਊ ਆਈਕਨ 'ਤੇ ਕਲਿੱਕ ਕਰਨ ਵੇਲੇ ਟੈਬਲੈੱਟਾਂ ਅਤੇ ਟੀਵੀ 'ਤੇ ਸਥਿਰ ਕਰੈਸ਼ diff --git a/fastlane/metadata/android/pa/changelogs/972.txt b/fastlane/metadata/android/pa/changelogs/972.txt new file mode 100644 index 00000000000..9cf29019820 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/972.txt @@ -0,0 +1,13 @@ +ਨਵਾਂ +ਵਰਣਨ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪਾਂ ਅਤੇ ਹੈਸ਼ਟੈਗਾਂ ਨੂੰ ਪਛਾਣੋ +ਮੈਨੂਅਲ ਟੈਬਲੇਟ ਮੋਡ ਸੈਟਿੰਗ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ +ਇੱਕ ਫੀਡ ਵਿੱਚ ਖੇਡੀਆਂ ਗਈਆਂ ਆਈਟਮਾਂ ਨੂੰ ਲੁਕਾਉਣ ਦੀ ਸਮਰੱਥਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ + +ਸੁਧਾਰ +ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦਾ ਸਹੀ ਢੰਗ ਨਾਲ ਸਮਰਥਨ ਕਰੋ +ਅਣਉਪਲਬਧ ਅਤੇ ਬੰਦ ਕੀਤੇ ਚੈਨਲਾਂ ਦੀ ਬਿਹਤਰ ਗਲਤੀ ਹੈਂਡਲਿੰਗ +Android 10+ ਉਪਭੋਗਤਾਵਾਂ ਲਈ Android ਸ਼ੇਅਰ ਸ਼ੀਟ ਹੁਣ ਸਮੱਗਰੀ ਦਾ ਸਿਰਲੇਖ ਦਿਖਾਉਂਦੀ ਹੈ। +ਅੱਪਡੇਟ ਕੀਤਾ Invidious ਮੌਕੇ ਅਤੇ ਸਹਿਯੋਗ ਪਾਈਪ ਲਿੰਕ. + +ਠੀਕ ਕੀਤਾ +[YouTube] ਉਮਰ ਪ੍ਰਤਿਬੰਧਿਤ ਸਮੱਗਰੀ ਚੋਣ ਡਾਇਲਾਗ ਖੋਲ੍ਹਣ ਵੇਲੇ ਲੀਕ ਵਿੰਡੋ ਅਪਵਾਦ ਨੂੰ ਰੋਕੋ diff --git a/fastlane/metadata/android/pa/changelogs/973.txt b/fastlane/metadata/android/pa/changelogs/973.txt new file mode 100644 index 00000000000..3afd456da56 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/973.txt @@ -0,0 +1,4 @@ +ਹੌਟਫਿਕਸ +• ਇੱਕ ਕਤਾਰ ਵਿੱਚ ਕਿੰਨੇ ਵਿਡੀਓ ਫਿੱਟ ਹੋ ਸਕਦੇ ਹਨ ਦੀ ਗਲਤ ਗਣਨਾ ਕਰਕੇ, ਗਰਿੱਡ ਲੇਆਉਟ ਵਿੱਚ ਕੱਟੇ ਜਾ ਰਹੇ ਥੰਬਨੇਲ ਅਤੇ ਸਿਰਲੇਖਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +• ਸ਼ੇਅਰ ਮੀਨੂ ਤੋਂ ਖੋਲ੍ਹੇ ਜਾਣ 'ਤੇ ਬਿਨਾਂ ਕੁਝ ਕੀਤੇ ਗਾਇਬ ਹੋ ਰਹੇ ਡਾਉਨਲੋਡ ਡਾਇਲੌਗ ਨੂੰ ਠੀਕ ਕਰੋ +• ਬਾਹਰੀ ਗਤੀਵਿਧੀਆਂ ਜਿਵੇਂ ਕਿ ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਫਾਈਲ ਪਿਕਰ ਖੋਲ੍ਹਣ ਨਾਲ ਸਬੰਧਤ ਇੱਕ ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/974.txt b/fastlane/metadata/android/pa/changelogs/974.txt new file mode 100644 index 00000000000..563a9768af3 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/974.txt @@ -0,0 +1,5 @@ +ਹੌਟਫਿਕਸ +• YouTube ਥ੍ਰੋਟਲਿੰਗ ਦੇ ਕਾਰਨ ਬਫਰਿੰਗ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +• ਬੰਦ ਕੀਤੀਆਂ ਟਿੱਪਣੀਆਂ ਨਾਲ ਕ੍ਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ YouTube ਟਿੱਪਣੀਆਂ ਕੱਢਣ +• YouTube ਸੰਗੀਤ ਖੋਜ ਨੂੰ ਠੀਕ ਕਰੋ +• PeerTube ਲਾਈਵਸਟ੍ਰੀਮਾਂ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/975.txt b/fastlane/metadata/android/pa/changelogs/975.txt new file mode 100644 index 00000000000..c866df1e21e --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/975.txt @@ -0,0 +1,16 @@ +ਨਵਾਂ +• ਸੀਕ ਕਰਨ ਵੇਲੇ ਇੱਕ ਥੰਮਨੇਲ ਪੂਰਵਦਰਸ਼ਨ ਦਿਖਾਓ +• ਅਯੋਗ ਟਿੱਪਣੀਆਂ ਦਾ ਪਤਾ ਲਗਾਓ +• ਫੀਡ ਆਈਟਮ ਨੂੰ ਦੇਖੇ ਗਏ ਵਜੋਂ ਨਿਸ਼ਾਨਬੱਧ ਕਰਨ ਦਿਓ +• ਟਿੱਪਣੀ ਦਿਲ ਦਿਖਾਓ + +ਸੁਧਾਰ +• ਮੈਟਾਡੇਟਾ ਅਤੇ ਟੈਗਸ ਲੇਆਉਟ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ +• UI ਭਾਗਾਂ 'ਤੇ ਸੇਵਾ ਰੰਗ ਲਾਗੂ ਕਰੋ +ਠੀਕ ਕੀਤਾ +• ਮਿੰਨੀ ਪਲੇਅਰ ਵਿੱਚ ਥੰਬਨੇਲ ਠੀਕ ਕਰੋ +• ਡੁਪਲੀਕੇਟ ਕਤਾਰ ਆਈਟਮਾਂ 'ਤੇ ਬੇਅੰਤ ਬਫਰਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ +• ਕੁਝ ਪਲੇਅਰ ਫਿਕਸ ਜਿਵੇਂ ਰੋਟੇਸ਼ਨ ਅਤੇ ਤੇਜ਼ੀ ਨਾਲ ਬੰਦ ਹੋਣਾ +• ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਲੋਡ ਕੀਤੇ ਬਾਕੀ ਬਚੇ ReCAPTCHA ਨੂੰ ਠੀਕ ਕਰੋ +• ਫੀਡ ਨੂੰ ਤਾਜ਼ਾ ਕਰਨ ਵੇਲੇ ਕਲਿੱਕਾਂ ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ +• ਕੁਝ ਡਾਊਨਲੋਡਰ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/976.txt b/fastlane/metadata/android/pa/changelogs/976.txt new file mode 100644 index 00000000000..a1a1354ca2a --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/976.txt @@ -0,0 +1,10 @@ +• ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਿੱਚ ਪਲੇਅਰ ਨੂੰ ਸਿੱਧਾ ਖੋਲ੍ਹਣ ਲਈ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ +• ਇਹ ਚੁਣਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ ਕਿ ਕਿਸ ਕਿਸਮ ਦੇ ਖੋਜ ਸੁਝਾਅ ਦਿਖਾਉਣੇ ਹਨ +• ਗੂੜ੍ਹਾ ਥੀਮ ਹੁਣ ਗਹਿਰਾ ਗੂੜ੍ਹਾ + ਗੂੜ੍ਹਾ ਸਪਲੈਸ਼ ਸਕ੍ਰੀਨ ਜੋੜਿਆ ਗਿਆ ਹੈ +• ਅਣਚਾਹੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਸਲੇਟੀ ਕਰਨ ਲਈ ਬਿਹਤਰ ਫ਼ਾਈਲ ਚੋਣਕਾਰ +• ਸਥਿਰ YouTube ਗਾਹਕੀ ਆਯਾਤ + +• ਇੱਕ ਸਟ੍ਰੀਮ ਨੂੰ ਮੁੜ ਚਲਾਉਣ ਲਈ ਮੁੜ-ਪਲੇਅ ਬਟਨ 'ਤੇ ਟੈਪ ਕਰਨ ਦੀ ਲੋੜ ਹੈ +• ਸਥਿਰ ਸਮਾਪਤੀ ਆਡੀਓ ਸੈਸ਼ਨ +• [Android TV] DPad ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਸਥਿਰ ਲੰਬੀ ਸੀਕਬਾਰ ਜੰਪ +ਹੋਰ ਤਬਦੀਲੀਆਂ ਦੇਖਣ ਲਈ, ਹੇਠਾਂ ਦਿੱਤੇ ਲਿੰਕ ਟੈਬ ਤੋਂ ਚੇਂਜਲੌਗ (ਅਤੇ ਬਲੌਗ ਪੋਸਟ) ਦੇਖੋ। diff --git a/fastlane/metadata/android/pa/changelogs/977.txt b/fastlane/metadata/android/pa/changelogs/977.txt new file mode 100644 index 00000000000..95d779a80a3 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/977.txt @@ -0,0 +1,10 @@ +• ਲੰਬੇ ਪ੍ਰੈਸ ਮੀਨੂ ਵਿੱਚ "ਅਗਲਾ ਚਲਾਓ" ਬਟਨ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ +• ਇੰਟੈਂਟ ਫਿਲਟਰ ਵਿੱਚ YouTube ਸ਼ਾਰਟਸ ਪਾਥ ਪ੍ਰੀਫਿਕਸ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ +• ਸਥਿਰ ਸੈਟਿੰਗਾਂ ਆਯਾਤ +• ਕਤਾਰ ਸਕ੍ਰੀਨ ਵਿੱਚ ਪਲੇਅਰ ਬਟਨਾਂ ਨਾਲ ਸੀਕਬਾਰ ਸਥਿਤੀ ਨੂੰ ਸਵੈਪ ਕਰੋ +• MediasessionManager ਨਾਲ ਸੰਬੰਧਿਤ ਕਈ ਫਿਕਸ +• ਵੀਡੀਓ ਖਤਮ ਹੋਣ ਤੋਂ ਬਾਅਦ ਸਥਿਰ ਸੀਕਬਾਰ ਪੂਰਾ ਨਹੀਂ ਹੋਇਆ +• RealtekATV 'ਤੇ ਅਯੋਗ ਮੀਡੀਆ ਟਨਲਿੰਗ +• ਵਿਸਤ੍ਰਿਤ ਨਿਊਨਤਮ ਪਲੇਅਰ ਬਟਨ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਖੇਤਰ + +ਹੋਰ ਤਬਦੀਲੀਆਂ ਦੇਖਣ ਲਈ, ਹੇਠਾਂ ਦਿੱਤੇ ਲਿੰਕ ਟੈਬ ਤੋਂ ਚੇਂਜਲੌਗ (ਅਤੇ ਬਲੌਗ ਪੋਸਟ) ਦੇਖੋ। diff --git a/fastlane/metadata/android/pa/changelogs/978.txt b/fastlane/metadata/android/pa/changelogs/978.txt new file mode 100644 index 00000000000..683f43eccc5 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/978.txt @@ -0,0 +1 @@ +ਇੱਕ ਨਵੇਂ ਨਿਊਪਾਈਪ ਸੰਸਕਰਣ ਲਈ ਜਾਂਚ ਨੂੰ ਲਾਗੂ ਕਰਨਾ ਸਥਿਰ ਹੈ। ਇਹ ਜਾਂਚ ਕਈ ਵਾਰ ਬਹੁਤ ਜਲਦੀ ਕੀਤੀ ਗਈ ਸੀ ਅਤੇ ਇਸਲਈ ਐਪ ਕਰੈਸ਼ ਹੋ ਜਾਂਦੀ ਹੈ। ਇਸ ਨੂੰ ਹੁਣ ਠੀਕ ਕੀਤਾ ਜਾਣਾ ਗਿਆ ਹੈ। diff --git a/fastlane/metadata/android/pa/changelogs/979.txt b/fastlane/metadata/android/pa/changelogs/979.txt new file mode 100644 index 00000000000..61a432f20df --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/979.txt @@ -0,0 +1,2 @@ +- ਠੀਕ ਕੀਤਾ ਪਲੇਬੈਕ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰਨਾ +- ਇਹ ਯਕੀਨੀ ਬਣਾਉਣ ਲਈ ਸੁਧਾਰ ਕੀਤੇ ਗਏ ਹਨ ਕਿ ਸੇਵਾ ਜੋ ਇਹ ਨਿਰਧਾਰਤ ਕਰਦੀ ਹੈ ਕਿ ਕੀ NewPipe ਨੂੰ ਨਵੇਂ ਸੰਸਕਰਣ ਦੀ ਜਾਂਚ ਲਈ ਜਾਂਚ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ, ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋਈ ਹੈ diff --git a/fastlane/metadata/android/pa/changelogs/980.txt b/fastlane/metadata/android/pa/changelogs/980.txt new file mode 100644 index 00000000000..cc1b47f2601 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/980.txt @@ -0,0 +1,12 @@ +ਨਵਾਂ +• ਸ਼ੇਅਰ ਮੀਨੂ ਲਈ "ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ +• y2u.be ਅਤੇ PeerTube ਛੋਟੇ ਲਿੰਕਾਂ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ + +ਸੁਧਾਰ +• ਪਲੇਬੈਕ-ਸਪੀਡ-ਕੰਟਰੋਲਾਂ ਨੂੰ ਵਧੇਰੇ ਸੰਖੇਪ ਬਣਾਇਆ ਗਿਆ ਹੈ +• ਫੀਡ ਹੁਣ ਨਵੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਉਜਾਗਰ ਕਰਦੀ ਹੈ +• ਫੀਡ ਵਿੱਚ "ਦੇਖੀਆਂ ਆਈਟਮਾਂ ਦਿਖਾਓ" ਵਿਕਲਪ ਹੁਣ ਸੁਰੱਖਿਅਤ ਹੈ + +ਠੀਕ ਕੀਤਾ +• ਸਥਿਰ YouTube ਪਸੰਦਾਂ ਅਤੇ ਨਾਪਸੰਦਾਂ ਨੂੰ ਕੱਢਣਾ +• ਬੈਕਗ੍ਰਾਊਂਡ ਤੋਂ ਵਾਪਸ ਆਉਣ ਤੋਂ ਬਾਅਦ ਸਥਿਰ ਆਟੋਮੈਟਿਕ ਰੀਪਲੇਅ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ diff --git a/fastlane/metadata/android/pa/changelogs/981.txt b/fastlane/metadata/android/pa/changelogs/981.txt new file mode 100644 index 00000000000..36f1415869b --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/981.txt @@ -0,0 +1,2 @@ +ਐਂਡਰਾਇਡ 11+ 'ਤੇ ਬਫਰਿੰਗ ਤੋਂ ਬਾਅਦ ਅਸਫਲ ਪਲੇਬੈਕ ਰੀਜ਼ਿਊਮ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਮੀਡੀਆ ਪਾਰਸਰ ਸਮਰਥਨ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ। +ਪਲੇਬੈਕ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਫਿਲਿਪਸ QM16XE 'ਤੇ ਮੀਡੀਆ ਟਨਲਿੰਗ ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ। diff --git a/fastlane/metadata/android/pa/changelogs/982.txt b/fastlane/metadata/android/pa/changelogs/982.txt new file mode 100644 index 00000000000..829c8585127 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/982.txt @@ -0,0 +1 @@ +ਸਥਿਰ YouTube ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ ਚਲਾ ਰਿਹਾ। diff --git a/fastlane/metadata/android/pa/changelogs/983.txt b/fastlane/metadata/android/pa/changelogs/983.txt new file mode 100644 index 00000000000..c3797c649ae --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/983.txt @@ -0,0 +1,9 @@ +ਨਵਾਂ ਡਬਲ-ਟੈਪ-ਟੂ-ਸੀਕ UI ਅਤੇ ਵਿਵਹਾਰ ਸ਼ਾਮਲ ਕਰੋ +ਸੈਟਿੰਗਾਂ ਨੂੰ ਖੋਜਣਯੋਗ ਬਣਾਓ +ਪਿੰਨ ਕੀਤੀਆਂ ਟਿੱਪਣੀਆਂ ਨੂੰ ਇਸ ਤਰ੍ਹਾਂ ਹਾਈਲਾਈਟ ਕਰੋ +FSFE ਦੇ PeerTube ਉਦਾਹਰਨ ਲਈ ਓਪਨ-ਵਿਦ-ਐਪ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ +ਗਲਤੀ ਸੂਚਨਾਵਾਂ ਸ਼ਾਮਲ ਕਰੋ +ਪਲੇਅਰ ਬਦਲਣ 'ਤੇ ਪਹਿਲੀ ਕਤਾਰ ਆਈਟਮ ਦੇ ਰੀਪਲੇਅ ਨੂੰ ਠੀਕ ਕਰੋ +ਫੇਲ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ ਲਾਈਵਸਟ੍ਰੀਮ ਦੇ ਦੌਰਾਨ ਬਫਰਿੰਗ ਕਰਦੇ ਸਮੇਂ ਜ਼ਿਆਦਾ ਉਡੀਕ ਕਰੋ +ਸਥਾਨਕ ਖੋਜ ਨਤੀਜਿਆਂ ਦਾ ਕ੍ਰਮ ਠੀਕ ਕਰੋ +ਪਲੇ ਕਤਾਰ ਵਿੱਚ ਖਾਲੀ ਆਈਟਮ ਖੇਤਰਾਂ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/984.txt b/fastlane/metadata/android/pa/changelogs/984.txt new file mode 100644 index 00000000000..068d56d5952 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/984.txt @@ -0,0 +1,7 @@ +ਪੂਰੀ ਸਕ੍ਰੀਨ ਨੂੰ ਭਰਨ ਅਤੇ ਟੈਬਲੇਟਾਂ ਅਤੇ ਟੀਵੀ 'ਤੇ ਸਕ੍ਰੋਲਿੰਗ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਸੂਚੀਆਂ ਵਿੱਚ ਲੋੜੀਂਦੀਆਂ ਸ਼ੁਰੂਆਤੀ ਆਈਟਮਾਂ ਲੋਡ ਕਰੋ +ਸੂਚੀਆਂ ਰਾਹੀਂ ਸਕ੍ਰੋਲ ਕਰਦੇ ਸਮੇਂ ਬੇਤਰਤੀਬੇ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +ਪਲੇਅਰ ਨੂੰ ਸਿਸਟਮ UI ਦੇ ਅਧੀਨ ਤੇਜ਼ੀ ਨਾਲ ਸੀਕ ਓਵਰਲੇ ਆਰਕ ਜਾਣ ਦਿਓ +ਮਲਟੀ ਵਿੰਡੋ ਵਿੱਚ ਖੇਡਦੇ ਸਮੇਂ ਕਟਆਊਟਾਂ ਵਿੱਚ ਬਦਲਾਵ ਵਾਪਸ ਲਿਆਓ, ਜਿਸ ਨਾਲ ਕੁਝ ਫ਼ੋਨਾਂ 'ਤੇ ਪਲੇਅਰ ਰੀਗਰੈਸ਼ਨ ਦਾ ਕਾਰਨ ਬਣਦੇ ਹਨ। +compileSdk ਨੂੰ 30 ਤੋਂ 31 ਤੱਕ ਵਧਾਓ +ਅਸ਼ੁੱਧੀ ਰਿਪੋਰਟਿੰਗ ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ +ਪਲੇਅਰ ਵਿੱਚ ਕੁਝ ਕੋਡ ਰੀਫੈਕਟਰ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/985.txt b/fastlane/metadata/android/pa/changelogs/985.txt new file mode 100644 index 00000000000..fe62a1330fe --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/985.txt @@ -0,0 +1 @@ +ਸਥਿਰ YouTube ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ ਚਲਾ ਰਿਹਾ diff --git a/fastlane/metadata/android/pa/changelogs/986.txt b/fastlane/metadata/android/pa/changelogs/986.txt new file mode 100644 index 00000000000..c9ab694a465 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/986.txt @@ -0,0 +1,15 @@ +ਨਵਾਂ +• ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਲਈ ਸੂਚਨਾਵਾਂ +• ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਵੀਡੀਓ ਪਲੇਅਰਾਂ ਵਿਚਕਾਰ ਅਰਾਮ ਨਾਲ ਤਬਦੀਲੀ +• ਸੈਮੀਟੋਨਸ ਦੁਆਰਾ ਪਿੱਚ ਬਦਲੋ +• ਇੱਕ ਪਲੇਲਿਸਟ ਵਿੱਚ ਮੁੱਖ ਪਲੇਅਰ ਕਤਾਰ ਜੋੜੋ + +ਸੁਧਾਰ +• ਸਪੀਡ/ਪਿਚ ਸਟੈਪ ਦਾ ਆਕਾਰ ਯਾਦ ਰੱਖੋ +• ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ ਸ਼ੁਰੂਆਤੀ ਲੰਬੇ ਬਫਰਿੰਗ ਨੂੰ ਘੱਟ ਕਰੋ • Android TV ਲਈ ਪਲੇਅਰ UI ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ +• ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁਸ਼ਟੀ ਕਰੋ + +ਠੀਕ ਕੀਤਾ +• ਮੀਡੀਆ ਬਟਨ ਨੂੰ ਫਿਕਸ ਕਰੋ ਜੋ ਪਲੇਅਰ ਨਿਯੰਤਰਣਾਂ ਨੂੰ ਨਹੀਂ ਲੁਕਾਉਂਦਾ ਹੈ +• ਪਲੇਅਰ ਦੀ ਕਿਸਮ ਬਦਲਣ 'ਤੇ ਪਲੇਬੈਕ ਰੀਸੈਟ ਨੂੰ ਠੀਕ ਕਰੋ +• ਪਲੇਲਿਸਟ ਡਾਇਲਾਗ ਨੂੰ ਘੁੰਮਾਉਣ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/987.txt b/fastlane/metadata/android/pa/changelogs/987.txt new file mode 100644 index 00000000000..93fc77a7753 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/987.txt @@ -0,0 +1,11 @@ +ਨਵਾਂ +• ਪ੍ਰਗਤੀਸ਼ੀਲ HTTP ਤੋਂ ਇਲਾਵਾ ਸਪੋਰਟ ਡਿਲੀਵਰੀ ਵਿਧੀਆਂ: ਤੇਜ਼ ਪਲੇਬੈਕ ਲੋਡ ਹੋਣ ਦਾ ਸਮਾਂ, PeerTube ਅਤੇ SoundCloud ਲਈ ਫਿਕਸ, ਹਾਲ ਹੀ ਵਿੱਚ ਖਤਮ ਹੋਈਆਂ YouTube ਲਾਈਵਸਟ੍ਰੀਮਾਂ ਦਾ ਪਲੇਬੈਕ +• ਇੱਕ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਵਿੱਚ ਰਿਮੋਟ ਪਲੇਲਿਸਟ ਜੋੜਨ ਲਈ ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ +• Android 10+ ਸ਼ੇਅਰ ਸ਼ੀਟ ਵਿੱਚ ਚਿੱਤਰ ਦੀ ਪੂਰਵ-ਝਲਕ + + ਸੁਧਾਰ +• ਪਲੇਬੈਕ ਪੈਰਾਮੀਟਰ ਡਾਇਲਾਗ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ +• ਗਾਹਕੀ ਆਯਾਤ/ਨਿਰਯਾਤ ਬਟਨਾਂ ਨੂੰ ਤਿੰਨ-ਬਿੰਦੀਆਂ ਵਾਲੇ ਮੀਨੂ ਵਿੱਚ ਲੈ ਜਾਓ + +ਠੀਕ ਕੀਤਾ +• ਪਲੇਲਿਸਟ ਤੋਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਨੂੰ ਹਟਾਉਣਾ ਠੀਕ ਕਰੋ • ਸ਼ੇਅਰ ਮੀਨੂ ਥੀਮ ਅਤੇ "ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" ਐਂਟਰੀ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/988.txt b/fastlane/metadata/android/pa/changelogs/988.txt new file mode 100644 index 00000000000..a50bcc1446d --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] ਕਿਸੇ ਵੀ ਵੀਡੀਓ ਨੂੰ ਚਲਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਸਮੇਂ "ਕੋਈ ਸਟ੍ਰੀਮ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕਰ ਸਕਿਆ" ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ +[YouTube] ਫਿਕਸ "ਹੇਠ ਦਿੱਤੀ ਸਮੱਗਰੀ ਇਸ ਐਪ 'ਤੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।" ਬੇਨਤੀ ਕੀਤੀ ਵੀਡੀਓ ਦੀ ਬਜਾਏ ਸੁਨੇਹਾ ਵਿਖਾਇਆ ਗਿਆ diff --git a/fastlane/metadata/android/pa/changelogs/989.txt b/fastlane/metadata/android/pa/changelogs/989.txt new file mode 100644 index 00000000000..9c00f845d0a --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] ਕਿਸੇ ਵੀ ਵੀਡੀਓ ਨੂੰ ਚਲਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਸਮੇਂ ਅਨੰਤ ਲੋਡਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ +• [YouTube] ਕੁਝ ਵੀਡੀਓਜ਼ 'ਤੇ ਥ੍ਰੋਟਲਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ +• jsoup ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ 1.15.3 ਵਿੱਚ ਅੱਪਗ੍ਰੇਡ ਕਰੋ, ਜਿਸ ਵਿੱਚ ਸੁਰੱਖਿਆ ਫਿਕਸ ਸ਼ਾਮਲ ਹੈ diff --git a/fastlane/metadata/android/pa/changelogs/990.txt b/fastlane/metadata/android/pa/changelogs/990.txt new file mode 100644 index 00000000000..ce82cbdd66a --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/990.txt @@ -0,0 +1,13 @@ +ਇਹ ਰੀਲੀਜ਼ Android 4.4 ਕਿਟਕੈਟ ਲਈ ਸਮਰਥਨ ਛੱਡਦੀ ਹੈ, ਹੁਣ ਘੱਟੋ-ਘੱਟ ਸੰਸਕਰਣ Android 5 Lollipop ਹੈ! +ਨਵਾਂ +• ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਵਾਲੇ ਮੀਨੂ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ +• ਫੀਡ ਵਿੱਚ ਭਵਿੱਖ ਦੇ ਵੀਡੀਓ ਲੁਕਾਓ +• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ +ਸੁਧਾਰ +• ਪਲੇਅਰ ਕੋਡ ਨੂੰ ਛੋਟੇ ਹਿੱਸਿਆਂ ਵਿੱਚ ਰੀਫੈਕਟਰ ਕਰੋ: ਘੱਟ RAM ਵਰਤੀ ਗਈ, ਘੱਟ ਬੱਗ +• ਥੰਮਨੇਲ ਦੇ ਸਕੇਲ ਮੋਡ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ +• ਚਿੱਤਰ ਪਲੇਸਹੋਲਡਰ ਨੂੰ ਵੈਕਟਰਾਈਜ਼ ਕਰੋ + +ਠੀਕ ਕੀਤਾ +• ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਾਲ ਵੱਖ-ਵੱਖ ਮੁੱਦਿਆਂ ਨੂੰ ਹੱਲ ਕਰੋ: ਪੁਰਾਣੀ/ਗੁੰਮ ਮੀਡੀਆ ਜਾਣਕਾਰੀ, ਵਿਗੜਿਆ ਥੰਮਨੇਲ +• ਪੂਰੀ ਸਕ੍ਰੀਨ ਦੀ ਥਾਂ ਉਸਦੇ 1/4 ਹਿੱਸੇ ਦੀ ਵਰਤੋਂ ਨੂੰ ਠੀਕ ਕਰੋ From 9ecd5dff09d98aaa70ef71dc9bdb8c24ccf8313c Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 16 Jan 2023 13:56:45 +0100 Subject: [PATCH 043/645] Orientation is locked if there is no sensor for it --- .../java/org/schabi/newpipe/player/helper/PlayerHelper.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index abde7c3d12c..8d8e0414e94 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -14,6 +14,7 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; +import android.content.pm.PackageManager; import android.provider.Settings; import android.view.accessibility.CaptioningManager; @@ -382,8 +383,11 @@ public static void setScreenBrightness(@NonNull final Context context, public static boolean globalScreenOrientationLocked(final Context context) { // 1: Screen orientation changes using accelerometer // 0: Screen orientation is locked + // if the accelerometer sensor is missing completely, assume locked orientation return android.provider.Settings.System.getInt( - context.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0) == 0; + context.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0) == 0 + || !context.getPackageManager() + .hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER); } public static int getProgressiveLoadIntervalBytes(@NonNull final Context context) { From abb6b4282d3ac97c90fb822d1666d43922ffd2b2 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Mon, 16 Jan 2023 15:13:34 +0100 Subject: [PATCH 044/645] Chenged the chapter icon --- app/src/main/res/drawable/ic_menu_book.xml | 12 ++++++++++++ app/src/main/res/layout/player.xml | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/ic_menu_book.xml diff --git a/app/src/main/res/drawable/ic_menu_book.xml b/app/src/main/res/drawable/ic_menu_book.xml new file mode 100644 index 00000000000..4cd4fb3a4fe --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_book.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 60cbcf7c46e..a3f03941239 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -216,7 +216,7 @@ android:paddingEnd="6dp" android:paddingBottom="3dp" android:scaleType="fitCenter" - android:src="@drawable/ic_format_list_numbered" + android:src="@drawable/ic_menu_book" android:visibility="gone" app:tint="@color/white" tools:ignore="ContentDescription,RtlHardcoded" /> From b9378a7c1fedee40ec0ba16a42aba113f0659cc7 Mon Sep 17 00:00:00 2001 From: Stypox Date: Mon, 16 Jan 2023 22:30:28 +0100 Subject: [PATCH 045/645] Fix NPEs after OnSharedPreferenceChangeListener changes Apps targeting {@link android.os.Build.VERSION_CODES#R} on devices running OS versions {@link android.os.Build.VERSION_CODES#R Android R} or later, will receive a {@code null} value when preferences are cleared. --- .../newpipe/fragments/detail/VideoDetailFragment.java | 6 +++--- .../newpipe/fragments/list/BaseListFragment.java | 2 +- .../fragments/list/videos/RelatedItemsFragment.java | 8 +++----- .../schabi/newpipe/local/BaseLocalListFragment.java | 2 +- .../org/schabi/newpipe/settings/tabs/TabsManager.java | 2 +- .../shandian/giga/service/DownloadManagerService.java | 10 +++++----- 6 files changed, 14 insertions(+), 16 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 e46c054e59e..917d89e09de 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 @@ -172,13 +172,13 @@ public final class VideoDetailFragment private final SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener = (sharedPreferences, key) -> { - if (key.equals(getString(R.string.show_comments_key))) { + if (getString(R.string.show_comments_key).equals(key)) { showComments = sharedPreferences.getBoolean(key, true); tabSettingsChanged = true; - } else if (key.equals(getString(R.string.show_next_video_key))) { + } else if (getString(R.string.show_next_video_key).equals(key)) { showRelatedItems = sharedPreferences.getBoolean(key, true); tabSettingsChanged = true; - } else if (key.equals(getString(R.string.show_description_key))) { + } else if (getString(R.string.show_description_key).equals(key)) { showDescription = sharedPreferences.getBoolean(key, true); tabSettingsChanged = true; } 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 0b0acff8600..8a117a47a9a 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 @@ -474,7 +474,7 @@ public void handleError() { @Override public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) { - if (key.equals(getString(R.string.list_view_mode_key))) { + if (getString(R.string.list_view_mode_key).equals(key)) { updateFlags |= LIST_MODE_UPDATE_FLAG; } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java index dc5dbd74f14..65664e0e3a9 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java @@ -159,11 +159,9 @@ protected void onRestoreInstanceState(@NonNull final Bundle savedState) { @Override public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, - final String s) { - if (headerBinding != null) { - headerBinding.autoplaySwitch.setChecked( - sharedPreferences.getBoolean( - getString(R.string.auto_queue_key), false)); + final String key) { + if (headerBinding != null && getString(R.string.auto_queue_key).equals(key)) { + headerBinding.autoplaySwitch.setChecked(sharedPreferences.getBoolean(key, false)); } } diff --git a/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java b/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java index 9fbdddc5932..53fe1677bf8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java @@ -261,7 +261,7 @@ public void handleError() { @Override public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) { - if (key.equals(getString(R.string.list_view_mode_key))) { + if (getString(R.string.list_view_mode_key).equals(key)) { updateFlags |= LIST_MODE_UPDATE_FLAG; } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsManager.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsManager.java index 2836fe52b5b..c885b803cff 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsManager.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/TabsManager.java @@ -73,7 +73,7 @@ public void unsetSavedTabsListener() { private SharedPreferences.OnSharedPreferenceChangeListener getPreferenceChangeListener() { return (sp, key) -> { - if (key.equals(savedTabsKey)) { + if (savedTabsKey.equals(key)) { if (savedTabsChangeListener != null) { savedTabsChangeListener.onTabsChanged(); } diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java index dc56ee20505..edc6bb6fd2e 100755 --- a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java @@ -310,7 +310,7 @@ private void handleConnectivityState(boolean updateOnly) { } private void handlePreferenceChange(SharedPreferences prefs, @NonNull String key) { - if (key.equals(getString(R.string.downloads_maximum_retry))) { + if (getString(R.string.downloads_maximum_retry).equals(key)) { try { String value = prefs.getString(key, getString(R.string.downloads_maximum_retry_default)); mManager.mPrefMaxRetry = value == null ? 0 : Integer.parseInt(value); @@ -318,13 +318,13 @@ private void handlePreferenceChange(SharedPreferences prefs, @NonNull String key mManager.mPrefMaxRetry = 0; } mManager.updateMaximumAttempts(); - } else if (key.equals(getString(R.string.downloads_cross_network))) { + } else if (getString(R.string.downloads_cross_network).equals(key)) { mManager.mPrefMeteredDownloads = prefs.getBoolean(key, false); - } else if (key.equals(getString(R.string.downloads_queue_limit))) { + } else if (getString(R.string.downloads_queue_limit).equals(key)) { mManager.mPrefQueueLimit = prefs.getBoolean(key, true); - } else if (key.equals(getString(R.string.download_path_video_key))) { + } else if (getString(R.string.download_path_video_key).equals(key)) { mManager.mMainStorageVideo = loadMainVideoStorage(); - } else if (key.equals(getString(R.string.download_path_audio_key))) { + } else if (getString(R.string.download_path_audio_key).equals(key)) { mManager.mMainStorageAudio = loadMainAudioStorage(); } } From 640d4b0280d06f3b3a107a56d3357def3af2b5ed Mon Sep 17 00:00:00 2001 From: TobiGr Date: Mon, 16 Jan 2023 23:05:29 +0100 Subject: [PATCH 046/645] Fix more NPEs after OnSharedPreferenceChangeListener changes --- .../java/org/schabi/newpipe/local/feed/FeedFragment.kt | 2 +- .../newpipe/settings/VideoAudioSettingsFragment.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index c1ee4e55825..26ad1cc386a 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -122,7 +122,7 @@ class FeedFragment : BaseStateFragment() { groupName = arguments?.getString(KEY_GROUP_NAME) ?: "" onSettingsChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key -> - if (key.equals(getString(R.string.list_view_mode_key))) { + if (getString(R.string.list_view_mode_key).equals(key)) { updateListViewModeOnResume = true } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java index 039f00c1df8..aae9cfca556 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -27,14 +27,14 @@ public void onCreatePreferences(final Bundle savedInstanceState, final String ro updateSeekOptions(); - listener = (sharedPreferences, s) -> { + listener = (sharedPreferences, key) -> { // on M and above, if user chooses to minimise to popup player on exit // and the app doesn't have display over other apps permission, // show a snackbar to let the user give permission if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - && s.equals(getString(R.string.minimize_on_exit_key))) { - final String newSetting = sharedPreferences.getString(s, null); + && getString(R.string.minimize_on_exit_key).equals(key)) { + final String newSetting = sharedPreferences.getString(key, null); if (newSetting != null && newSetting.equals(getString(R.string.minimize_on_exit_popup_key)) && !Settings.canDrawOverlays(getContext())) { @@ -46,7 +46,7 @@ public void onCreatePreferences(final Bundle savedInstanceState, final String ro .show(); } - } else if (s.equals(getString(R.string.use_inexact_seek_key))) { + } else if (getString(R.string.use_inexact_seek_key).equals(key)) { updateSeekOptions(); } }; From e9fcad4787c0c0efdf502c910ca8d3c8a4480b04 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Mon, 16 Jan 2023 23:20:50 +0100 Subject: [PATCH 047/645] Fix SonarLint --- .../main/java/org/schabi/newpipe/local/feed/FeedFragment.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index 26ad1cc386a..2bb2f9986db 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -36,7 +36,6 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.Button -import androidx.annotation.Nullable import androidx.appcompat.app.AlertDialog import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.edit @@ -500,7 +499,7 @@ class FeedFragment : BaseStateFragment() { private fun handleFeedNotAvailable( subscriptionEntity: SubscriptionEntity, - @Nullable cause: Throwable?, + cause: Throwable?, nextItemsErrors: List ) { val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) From a6021730cd7f0a5b7786130dfe2268f1f287d723 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Tue, 17 Jan 2023 10:50:13 +0100 Subject: [PATCH 048/645] Removed format_list_numbered --- app/src/main/res/drawable/ic_format_list_numbered.xml | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_format_list_numbered.xml diff --git a/app/src/main/res/drawable/ic_format_list_numbered.xml b/app/src/main/res/drawable/ic_format_list_numbered.xml deleted file mode 100644 index b11666c562c..00000000000 --- a/app/src/main/res/drawable/ic_format_list_numbered.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - From ddda80a5779d705fb6e8d29505b4b267cd372d79 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Tue, 17 Jan 2023 22:31:22 +0100 Subject: [PATCH 049/645] Fixed the bug --- .../java/org/schabi/newpipe/player/playqueue/PlayQueue.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java index edf5a771c02..f809e0db9a3 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java @@ -527,6 +527,9 @@ public boolean equals(@Nullable final Object obj) { if (size() != other.size()) { return false; } + if (other.getIndex() != getIndex()) { + return false; + } for (int i = 0; i < size(); i++) { final PlayQueueItem stream = streams.get(i); final PlayQueueItem otherStream = other.streams.get(i); From f88c1e1e8bd41f555e7636256ae05bf3dc6e5355 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Thu, 19 Jan 2023 21:15:09 +0100 Subject: [PATCH 050/645] Changed the position --- app/src/main/res/layout/player.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index a3f03941239..011c5414709 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -212,7 +212,6 @@ android:clickable="true" android:focusable="true" android:paddingStart="6dp" - android:paddingTop="5dp" android:paddingEnd="6dp" android:paddingBottom="3dp" android:scaleType="fitCenter" From 6e1ffb4e52b06067c562446500f34f76369f32f1 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Thu, 19 Jan 2023 23:24:25 +0100 Subject: [PATCH 051/645] Centered the icon --- app/src/main/res/layout/player.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 011c5414709..b528e4e9bc0 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -214,6 +214,7 @@ android:paddingStart="6dp" android:paddingEnd="6dp" android:paddingBottom="3dp" + android:paddingTop="3dp" android:scaleType="fitCenter" android:src="@drawable/ic_menu_book" android:visibility="gone" From 52e39c340238f47d0a11da39a6975892b1a20564 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Fri, 20 Jan 2023 11:12:32 +0100 Subject: [PATCH 052/645] Fixed tests --- .../java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java b/app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java index a130359a338..b8989b8fcaf 100644 --- a/app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java +++ b/app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java @@ -177,7 +177,7 @@ public void sameStreamsDifferentIndex() { final List streams = Collections.nCopies(5, item1); final PlayQueue queue1 = makePlayQueue(1, streams); final PlayQueue queue2 = makePlayQueue(4, streams); - assertEquals(queue1, queue2); + assertNotEquals(queue1, queue2); } @Test From e26c03856589c1552ee5ec98a31b6b8ef5c1274a Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Fri, 20 Jan 2023 11:55:50 +0100 Subject: [PATCH 053/645] Made some small adjustments --- .../newpipe/local/playlist/LocalPlaylistFragment.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 9881a0a20c6..36544a6a9d5 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -643,15 +643,9 @@ private void removeDuplicatesInPlaylist() { itemListAdapter.clearStreamItemList(); itemListAdapter.addItems(itemsToKeep); - saveChanges(); + setVideoCount(itemListAdapter.getItemsList().size()); - final long videoCount = itemListAdapter.getItemsList().size(); - setVideoCount(videoCount); - if (videoCount == 0) { - showEmptyState(); - } - //TODO: Do we have to show loading? - //hideLoading(); + saveChanges(); } private void deleteItem(final PlaylistStreamEntry item) { From a69f74f51bf49d0bdbfd83502d0a01ebc1d1752e Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 20 Jan 2023 18:39:16 +0100 Subject: [PATCH 054/645] Add snippet to ensure baseline.profm file is sorted Thanks to obfusk, see https://issuetracker.google.com/issues/231837768 and #6486 --- app/build.gradle | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 79e07a190b1..2c0f03e38ec 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,7 @@ +import com.android.tools.profgen.ArtProfileKt +import com.android.tools.profgen.ArtProfileSerializer +import com.android.tools.profgen.DexFile + plugins { id "com.android.application" id "kotlin-android" @@ -308,3 +312,24 @@ static String getGitWorkingBranch() { return "" } } + +project.afterEvaluate { + tasks.compileReleaseArtProfile.doLast { + outputs.files.each { file -> + if (file.toString().endsWith(".profm")) { + println("Sorting ${file} ...") + def version = ArtProfileSerializer.valueOf("METADATA_0_0_2") + def profile = ArtProfileKt.ArtProfile(file) + def keys = new ArrayList(profile.profileData.keySet()) + def sortedData = new LinkedHashMap() + Collections.sort keys, new DexFile.Companion() + keys.each { key -> sortedData[key] = profile.profileData[key] } + new FileOutputStream(file).with { + write(version.magicBytes$profgen) + write(version.versionBytes$profgen) + version.write$profgen(it, sortedData, "") + } + } + } + } +} From fceec71ad3d6541d1dc0f8e7e44a5797ccc8a662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C4=B1la?= <121803062+Ilhamiii@users.noreply.github.com> Date: Sat, 21 Jan 2023 16:13:15 +0400 Subject: [PATCH 055/645] Corrected language names --- app/src/main/res/values/settings_keys.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index c2819feea70..12681896951 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -495,7 +495,7 @@ @string/systems_language Afrikaans - Azərbaycan + Azərbaycanca Bahasa Indonesia Bahasa Malaysia Català @@ -1165,7 +1165,7 @@ Basa Acèh العربية العربية (ليبيا) - Azərbaycan dili + Azərbaycanca Asturianu Беларуская ⵜⴰⵎⴰⵣⵉⵖⵜ @@ -1221,7 +1221,7 @@ Português (BR) Português (PT) Română - русский язык + Pусский ᱥᱟᱱᱛᱟᱲᱤ sardu Slovenčina From 5b3f8a3d307145124273f1493e035e2dac17e072 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Sat, 21 Jan 2023 14:56:55 +0100 Subject: [PATCH 056/645] Replaced the equals method --- .../fragments/detail/VideoDetailFragment.java | 11 ++++++----- .../java/org/schabi/newpipe/player/Player.java | 2 +- .../newpipe/player/playqueue/PlayQueue.java | 17 +++++++---------- .../newpipe/player/playqueue/PlayQueueTest.java | 11 ++++++----- 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 679084bdfc9..95853e55084 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 @@ -864,7 +864,8 @@ private void runWorker(final boolean forceLoad, final boolean addToBackStack) { if (playQueue == null) { playQueue = new SinglePlayQueue(result); } - if (stack.isEmpty() || !stack.peek().getPlayQueue().equals(playQueue)) { + if (stack.isEmpty() || !stack.peek().getPlayQueue() + .equalStreams(playQueue)) { stack.push(new StackItem(serviceId, url, title, playQueue)); } } @@ -1780,7 +1781,7 @@ public void onQueueUpdate(final PlayQueue queue) { // deleted/added items inside Channel/Playlist queue and makes possible to have // a history of played items @Nullable final StackItem stackPeek = stack.peek(); - if (stackPeek != null && !stackPeek.getPlayQueue().equals(queue)) { + if (stackPeek != null && !stackPeek.getPlayQueue().equalStreams(queue)) { @Nullable final PlayQueueItem playQueueItem = queue.getItem(); if (playQueueItem != null) { stack.push(new StackItem(playQueueItem.getServiceId(), playQueueItem.getUrl(), @@ -1846,7 +1847,7 @@ public void onMetadataUpdate(final StreamInfo info, final PlayQueue queue) { // They are not equal when user watches something in popup while browsing in fragment and // then changes screen orientation. In that case the fragment will set itself as // a service listener and will receive initial call to onMetadataUpdate() - if (!queue.equals(playQueue)) { + if (!queue.equalStreams(playQueue)) { return; } @@ -2113,7 +2114,7 @@ private StackItem findQueueInStack(final PlayQueue queue) { final Iterator iterator = stack.descendingIterator(); while (iterator.hasNext()) { final StackItem next = iterator.next(); - if (next.getPlayQueue().equals(queue)) { + if (next.getPlayQueue().equalStreams(queue)) { item = next; break; } @@ -2128,7 +2129,7 @@ private void replaceQueueIfUserConfirms(final Runnable onAllow) { if (isClearingQueueConfirmationRequired(activity) && playerIsNotStopped() && activeQueue != null - && !activeQueue.equals(playQueue)) { + && !activeQueue.equalStreams(playQueue)) { showClearingQueueConfirmation(onAllow); } else { onAllow.run(); diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 95520ba1ec1..caaa01440ff 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -348,7 +348,7 @@ public void handleIntent(@NonNull final Intent intent) { final boolean playbackSkipSilence = getPrefs().getBoolean(getContext().getString( R.string.playback_skip_silence_key), getPlaybackSkipSilence()); - final boolean samePlayQueue = playQueue != null && playQueue.equals(newQueue); + final boolean samePlayQueue = playQueue != null && playQueue.equalStreamsAndIndex(newQueue); final int repeatMode = intent.getIntExtra(REPEAT_MODE, getRepeatMode()); final boolean playWhenReady = intent.getBooleanExtra(PLAY_WHEN_READY, true); final boolean isMuted = intent.getBooleanExtra(IS_MUTED, isMuted()); diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java index f809e0db9a3..4c62309641c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java @@ -518,18 +518,13 @@ public synchronized boolean previous() { * This method also gives a chance to track history of items in a queue in * VideoDetailFragment without duplicating items from two identical queues */ - @Override - public boolean equals(@Nullable final Object obj) { - if (!(obj instanceof PlayQueue)) { + public boolean equalStreams(@Nullable final PlayQueue other) { + if (other == null) { return false; } - final PlayQueue other = (PlayQueue) obj; if (size() != other.size()) { return false; } - if (other.getIndex() != getIndex()) { - return false; - } for (int i = 0; i < size(); i++) { final PlayQueueItem stream = streams.get(i); final PlayQueueItem otherStream = other.streams.get(i); @@ -542,9 +537,11 @@ public boolean equals(@Nullable final Object obj) { return true; } - @Override - public int hashCode() { - return streams.hashCode(); + public boolean equalStreamsAndIndex(@Nullable final PlayQueue other) { + if (equalStreams(other)) { + return other.getIndex() == getIndex(); + } + return false; } public boolean isDisposed() { diff --git a/app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java b/app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java index b8989b8fcaf..022089f37ed 100644 --- a/app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java +++ b/app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java @@ -13,7 +13,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; @@ -169,7 +168,8 @@ public void sameStreams() { final List streams = Collections.nCopies(5, item1); final PlayQueue queue1 = makePlayQueue(0, streams); final PlayQueue queue2 = makePlayQueue(0, streams); - assertEquals(queue1, queue2); + assertTrue(queue1.equalStreams(queue2)); + assertTrue(queue1.equalStreamsAndIndex(queue2)); } @Test @@ -177,7 +177,8 @@ public void sameStreamsDifferentIndex() { final List streams = Collections.nCopies(5, item1); final PlayQueue queue1 = makePlayQueue(1, streams); final PlayQueue queue2 = makePlayQueue(4, streams); - assertNotEquals(queue1, queue2); + assertTrue(queue1.equalStreams(queue2)); + assertFalse(queue1.equalStreamsAndIndex(queue2)); } @Test @@ -186,7 +187,7 @@ public void sameSizeDifferentItems() { final List streams2 = Collections.nCopies(5, item2); final PlayQueue queue1 = makePlayQueue(0, streams1); final PlayQueue queue2 = makePlayQueue(0, streams2); - assertNotEquals(queue1, queue2); + assertFalse(queue1.equalStreams(queue2)); } @Test @@ -195,7 +196,7 @@ public void differentSizeStreams() { final List streams2 = Collections.nCopies(6, item2); final PlayQueue queue1 = makePlayQueue(0, streams1); final PlayQueue queue2 = makePlayQueue(0, streams2); - assertNotEquals(queue1, queue2); + assertFalse(queue1.equalStreams(queue2)); } } } From 34e6e70be960f18653c15d37c676af7c335c02d5 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 22 Jan 2023 05:12:39 +0100 Subject: [PATCH 057/645] Translated using Weblate (Azerbaijani) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Lithuanian) Currently translated at 99.3% (648 of 652 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Assamese) Currently translated at 15.0% (98 of 652 strings) Translated using Weblate (Odia) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Slovenian) Currently translated at 2.7% (2 of 72 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Sardinian) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Galician) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Lithuanian) Currently translated at 99.3% (648 of 652 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Persian) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Polish) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Czech) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Greek) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Italian) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Italian) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Japanese) Currently translated at 99.8% (651 of 652 strings) Translated using Weblate (Russian) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (German) Currently translated at 100.0% (652 of 652 strings) Co-authored-by: Abhilash Co-authored-by: Agnieszka C Co-authored-by: Ahmad0a Co-authored-by: AioiLight Co-authored-by: Ajeje Brazorf Co-authored-by: Danial Behzadi Co-authored-by: Eric Co-authored-by: ErnestasKaralius Co-authored-by: Fjuro Co-authored-by: Francesco Saltori Co-authored-by: GET100PERCENT Co-authored-by: Hosted Weblate Co-authored-by: HudobniVolk Co-authored-by: Igor Nedoboy Co-authored-by: Igor Rückert Co-authored-by: Ihor Hordiichuk Co-authored-by: Jeff Huang Co-authored-by: Linerly Co-authored-by: Nidi Co-authored-by: Oğuz Ersen Co-authored-by: Pieter van der Razemond Co-authored-by: Priit Jõerüüt Co-authored-by: RSoulwin Co-authored-by: Ray Co-authored-by: Retrial Co-authored-by: Yaron Shahrabani Co-authored-by: gallegonovato Co-authored-by: nautilusx Co-authored-by: random r Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sl/ Translation: NewPipe/Metadata --- app/src/main/res/values-ar/strings.xml | 2 + app/src/main/res/values-as/strings.xml | 73 +++++++++++++++++++ app/src/main/res/values-az/strings.xml | 10 ++- app/src/main/res/values-cs/strings.xml | 2 + app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values-el/strings.xml | 2 + app/src/main/res/values-es/strings.xml | 2 + app/src/main/res/values-et/strings.xml | 3 + app/src/main/res/values-fa/strings.xml | 3 + app/src/main/res/values-gl/strings.xml | 3 + app/src/main/res/values-he/strings.xml | 2 + app/src/main/res/values-hi/strings.xml | 3 + app/src/main/res/values-in/strings.xml | 2 + app/src/main/res/values-it/strings.xml | 5 +- app/src/main/res/values-ja/strings.xml | 4 + app/src/main/res/values-lt/strings.xml | 16 ++-- app/src/main/res/values-nl/strings.xml | 4 + app/src/main/res/values-or/strings.xml | 3 + app/src/main/res/values-pa/strings.xml | 3 + app/src/main/res/values-pl/strings.xml | 2 + app/src/main/res/values-pt-rBR/strings.xml | 2 + app/src/main/res/values-pt-rPT/strings.xml | 3 + app/src/main/res/values-pt/strings.xml | 3 + app/src/main/res/values-ru/strings.xml | 12 ++- app/src/main/res/values-sc/strings.xml | 3 + app/src/main/res/values-tr/strings.xml | 2 + app/src/main/res/values-uk/strings.xml | 2 + app/src/main/res/values-zh-rCN/strings.xml | 2 + app/src/main/res/values-zh-rHK/strings.xml | 6 +- app/src/main/res/values-zh-rTW/strings.xml | 3 + .../metadata/android/sl/changelogs/991.txt | 13 ++++ .../metadata/android/sl/short_description.txt | 1 + 32 files changed, 180 insertions(+), 18 deletions(-) create mode 100644 fastlane/metadata/android/sl/changelogs/991.txt create mode 100644 fastlane/metadata/android/sl/short_description.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 2fbe794a3b2..cbd3ade358c 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -780,4 +780,6 @@ استيراد الاشتراكات أو تصديرها من القائمة المكونة من 3 نقاط هذا الخيار متاح فقط إذا تم تحديد %s للسمة إلغاء تعيين الصورة المصغرة الدائمة + فشل النسخ إلى الحافظة + البطاقة \ No newline at end of file diff --git a/app/src/main/res/values-as/strings.xml b/app/src/main/res/values-as/strings.xml index 57821339418..be845845a3d 100644 --- a/app/src/main/res/values-as/strings.xml +++ b/app/src/main/res/values-as/strings.xml @@ -25,4 +25,77 @@ আপুনি \"%1$s\" বুজাইছিল নেকি\? বাহ্যিক ভিডিঅ’ প্লেয়াৰ ব্যৱহাৰ কৰক বাহ্যিক অডিঅ’ প্লেয়াৰ ব্যৱহাৰ কৰক + Channel আনচাবস্ক্ৰাইব কৰা হ\'ল + subscription সলনি কৰিব পৰা নগ\'ল + subscription আপডেট কৰিব পৰা নগ\'ল + তথ্য দেখুৱাওক + চাবস্ক্ৰিপচন + বুকমাৰ্ক কৰা প্লেলিষ্ট + টেব নিৰ্বাচন কৰক + বেকগ্ৰাউণ্ড + পপ-আপ + স্থায়ী ৰিজ\'লিউচন + স্থায়ী পপআপ ৰিজোলিউচন + উচ্চ ৰিজ\'লিউচন দেখুৱাওক + কেৱল কিছুমান ডিভাইচেহে 2K/4K ভিডিঅ’ বজাব পাৰে + Kodi ৰ সৈতে বজাওক + Kore এপ ইনষ্টল\? + \"Kodi ৰ সৈতে খোলক\" বিকল্প দেখুৱাওক + Kodi মিডিয়া চেণ্টাৰৰ জৰিয়তে এটা ভিডিঅ\' চলাবলৈ এটা বিকল্প প্ৰদৰ্শন কৰক + প্লেয়াৰটো ক্ৰেচ কৰক + বাফাৰিং + নথিং + জাননী ৰ‌ঙিণ কৰক + অডিঅ\' + অডিঅ\' ৰ প্ৰকাৰ + ভিডিঅ\'ৰ প্ৰকাৰ + থিম + নিশাৰ থিম + পোহৰ + অন্ধকাৰ + ক\'লা + পপ-আপ বৈশিষ্ট্যসমূহ মনত ৰাখিব + পপ-আপৰ অন্তিম আকাৰ আৰু অৱস্থান মনত ৰাখিব + Inexact seek য়ে প্লেয়াৰটোক দ্ৰুত গতিত স্থান সলনি কৰিবলৈ অনুমতি দিয়ে। ৫, ১৫ বা ২৫ ছেকেণ্ড সলনি কৰিবলৈ বিচাৰিলে ইয়াৰ প্ৰয়োজন নহয় + ফাষ্ট-ফৰৱাৰ্ড/-ৰিৱাইণ্ড কৰিবলৈ বিচৰা সময়সীমা + প্লেবেক লোড কৰাৰ ব্যৱধানৰ আকাৰ + লোড ব্যৱধানৰ আকাৰ সলনি কৰক (বৰ্তমানে %s) । এটা কম মানে প্ৰাৰম্ভিক ভিডিঅ\' লোডিং দ্ৰুত কৰিব পাৰে। পৰিৱৰ্তনৰ বাবে এটা খেলুৱৈ পুনৰাৰম্ভৰ প্ৰয়োজন + থাম্বনেইলত থকা মূল ৰং অনুসৰি এণ্ড্ৰইডক জাননীৰ ৰং কাষ্টমাইজ কৰিবলৈ কওক (মন কৰিব যে এইটো সকলো ডিভাইচতে উপলব্ধ নহয়) + সক্ৰিয় প্লেয়াৰৰ queue সলনি কৰা হ’ব + থাম্বনেইল লোড কৰক + মন্তব্য দেখুৱাওক + বিৱৰণ দেখুৱাওক + মেটা তথ্য দেখুৱাওক + সংৰক্ষিত ছবি মচি পেলোৱা হ\'ল + সংৰক্ষিত কৰি থোৱা মেটাডাটা মচি পেলাওক + সকলো সংৰক্ষণ কৰি ৰখা ৱেবপেজৰ তথ্য আঁতৰাওক + সংৰক্ষণ কৰি থোৱা মেটাডাটা মচি পেলোৱা হ\'ল + পৰৱৰ্তী ষ্ট্ৰিম স্বয়ংক্ৰিয়ভাৱে enque কৰক + সজোৱা + ভিডিঅ\' ডাউনলোড folder + যোগ কৰক + ডাউনলোড কৰা অডিঅ\' ফাইলসমূহ ইয়াত সংৰক্ষণ কৰা হয় + থাম্বনেইলক ১:১ অনুপাত লৈ ক্ৰপ কৰক + ডাউনলোড কৰা ভিডিঅ’ ফাইলসমূহ ইয়াত সংৰক্ষণ কৰা হয় + ভিডিঅ\' ফাইলসমূহৰ বাবে ডাউনলোড folder বাছক + অডিঅ\' ডাউনলোড folder + অডিঅ\' ফাইলসমূহৰ বাবে ডাউনলোড folder নিৰ্বাচন কৰক + জাননীত দেখুওৱা ভিডিঅ’ থাম্বনেইলটো ১৬:৯ৰ পৰা ১:১ অনুপাতলৈ ক্ৰপ কৰক + First action button + Fifth action button + Edit each notification action below by tapping on it. Select up to three of them to be shown in the compact notification by using the checkboxes on the right + Second action button + You can select at most three actions to show in the compact notification! + পুনৰাবৃত্তি + শ্বাফেল + দ্ৰুত inexact seek ব্যৱহাৰ কৰক + এটা queue বিলুপ্তি কৰাৰ আগতে নিশ্চিতকৰণৰ বাবে সুধিব + এটা প্লেয়াৰ পৰা আন এটালৈ সলনি কৰিলে আপোনাৰ queue সলনি হ\'ব পাৰে + Fourth action button + Third action button + ভিডিঅ\'ৰ বিৱৰণ আৰু অতিৰিক্ত তথ্য লুকুৱাবলৈ বন্ধ কৰক + মন্তব্য লুকুৱাবলৈ বন্ধ কৰক + \'পৰৱৰ্তী\' আৰু \'সাদৃশ্য থকা\' ভিডিঅ\' দেখুৱাওক + থাম্বনেইলসমূহ লোড কৰা, তথ্য আৰু মেমৰি ব্যৱহাৰ সংৰক্ষণ কৰা ৰোধ কৰিবলে বন্ধ কৰক। পৰিবৰ্তনসমূহে ইন-মেমৰি আৰু অন-ডিস্ক কেশ্ব দুয়োটা পৰিষ্কাৰ কৰে + ষ্ট্ৰিমৰ সৃষ্টিকৰ্তা, ষ্ট্ৰিমৰ বিষয়বস্তু বা এটা সন্ধান অনুৰোধৰ বিষয়ে অতিৰিক্ত তথ্যৰ সৈতে মেটা তথ্যৰ বাকচসমূহ লুকুৱাবলৈ বন্ধ কৰক \ No newline at end of file diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index cd18e8d9393..d8d88bd6da1 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -1,8 +1,8 @@ - Başlamaq üçün böyüdücüyə toxun. + Başlamaq üçün böyüdücü güzgüyə toxun. %1$s tarixində yayımlanıb - Yayım oynadıcı tapılmadı. \"VLC\" yüklənilsin\? + Yayım oynadıcı tapılmadı. \"VLC\" quraşdırılsın\? Yayım oynadıcı tapılmadı (Oynatmaq üçün VLC\'ni quraşdıra bilərsiniz). Yüklə Ləğv et @@ -45,7 +45,7 @@ Qaranlıq Qara Abunəlikdən çıxın - Ani pəncərə rejimində aç + Ani görüntü rejimində aç Avtomatik oynat Endir Fasilələrdən sonra (məsələn, telefon zəngləri) oynatmağa davam etdir @@ -613,7 +613,7 @@ Xəta baş verdi: %1$s Fayl mövcud deyil, yaxud oxumaq və ya yazmaq icazəsi yoxdur Veb saytı təhlil etmək alınmadı - Səs ucalığı + Ucalıq Radio \"Oynadıcını çökdür\" Göstər Oynadıcıdan istifadə edərkən çökdürmə seçimini göstər @@ -728,4 +728,6 @@ %s endirmək üçün toxun Bu seçim yalnız tema üçün %s seçildikdə əlçatandır Daimi miniatürü ləğv et + Kart + Buferə kopyalamaq alınmadı \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 637678c230a..adf6601a8dc 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -741,4 +741,6 @@ Import nebo export odběrů z 3-tečkové nabídky Tato možnost je dostupná pouze při vybraném motivu %s Zrušení nastavení trvalého náhledu + Karta + Kopírování do schránky se nezdařilo \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d02b276cd0a..3b1959a6916 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -728,4 +728,6 @@ Importieren oder Exportieren von Abonnements über das 3-Punkte-Menü Diese Option ist nur verfügbar, wenn %s als Design ausgewählt wird Dauerhaftes Vorschaubild aufheben + Kopieren in die Zwischenablage fehlgeschlagen + Karte \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index cf3c0576b01..78d89cc5993 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -728,4 +728,6 @@ Έχετε την πιο πρόσφατη έκδοση του NewPipe Αυτή η επιλογή είναι διαθέσιμη μόνο εάν έχει επιλεγεί %s για Θέμα Κατάργηση μόνιμης μικρογραφίας + Αποτυχία αντιγραφής στο πρόχειρο + Κάρτα \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f92ad9128de..9d68c28a967 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -744,4 +744,6 @@ Pulsa para descargar %s Esta opción sólo está disponible si %s está seleccionado para el tema Desactivar las miniaturas permanente + Error al copiar al portapapeles + Tarjeta \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 87beff94ffe..986de133bcc 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -727,4 +727,7 @@ Tellimusi saad importida või eksportida 3 punktiga menüüst Sa kasutad NewPipe\'i uusimat versiooni See valik on kasutusel vaid %s teema puhul + Lõikelauale kopeerimine ei õnnestunud + Eemalda püsiv pisipilt + Kaart \ No newline at end of file diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index f22200c06b7..72dc7766048 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -727,4 +727,7 @@ ضربه برای بارگیری %s از جدیدترین نگارش نیوپایپ استفاده می‌کنید این گزینه تنها هنگامی موجود است که %s به عنوان زمینه گزیده باشد + کارت + شکست در رونوشت به تخته‌گیره + ناتنظیم بندانگشتی ثابت \ No newline at end of file diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 65d5ce2048c..a8cf01ef0a5 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -727,4 +727,7 @@ Toca para descargar %s Importa ou exporta subscricións dende o menú dos 3 puntos Esta opción só está dispoñible se %s está seleccionado para o tema + Produciuse un erro ao copiar no portapapeis + Desactivala miniatura permanente + Tarxeta \ No newline at end of file diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 67e6d45ad40..35dc19c8cf2 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -754,4 +754,6 @@ זאת הגרסה העדכנית ביותר של NewPipe אפשרות זאת זמינה רק אם נבחרה ערכת נושא %s ביטול הגדרת תמונה ייצוגית קבועה + כרטיס + ההעתקה ללוח הגזירים נכשלה \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 7c9ebf23174..dc08899ed1c 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -727,4 +727,7 @@ आप न्यूपाइप का नवीनतम संस्करण चला रहे हैं %s डाउनलोड करने के लिए टैप करें यह विकल्प केवल तभी उपलब्ध होता है जब थीम के लिए %s का चयन किया जाता है + स्थायी थंमनेल अनसेट करें + कार्ड + क्लिपबोर्ड पर कॉपी करने में विफल \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index af8781a2356..c195d62e1fe 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -715,4 +715,6 @@ Ketuk untuk mengunduh %s Opsi ini hanya tersedia jika %s dipilih untuk Tema Batalkan penetapan gambar kecil permanen + Gagal menyalin ke papan klip + Kartu \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 3304321d81e..bf20d2be413 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -737,7 +737,10 @@ Visualizza sul sito Recupero veloce Premi per scaricare %s - L\'ultima versione di NewPipe è già in esecuzione + Stai già usando l\'ultima versione di NewPipe Importa o esporta iscrizioni dal menu a 3 punti Questa opzione è disponibile solo se %s è selezionato come Tema + Copia negli appunti non riuscita + Schede + Disattiva la miniatura permanente \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 480d869e5dc..d02b56e759a 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -712,4 +712,8 @@ よくある質問 アプリの使い方に困ったときは、よくある質問に答えていますので、ぜひご覧ください! %sがテーマに選択された場合のみ、この選択肢が利用可能です + 高速モード + 3 点メニューから登録チャンネルをインポートまたはエクスポートします + カード + クリップボードへのコピーに失敗しました \ No newline at end of file diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 0da729ba823..bb45a0970fb 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -97,14 +97,14 @@ Pradėti Pauzė - Ištrinti + Naikinti Kontrolinė suma Gerai Failo pavadinimas Gijos Klaida - NewPipe Atsiunčiama - Palieskite, kad peržiūrėtumėte išsamią informaciją + NewPipe atsisiunčiama + Bakstelėkite, kad peržiūrėtumėte išsamią informaciją Prašome palaukti… Nukopijuota į iškarpinę Prašome pasirinkti galimą atsisiuntimų aplankalą @@ -212,9 +212,9 @@ Nerasta video srautų Nerasta audio srautų Tempti kad perrūšiuoti - Sukurti + Kurti Nutraukti - Pervadinti + Pervardyti Vėliausiai žiūrėta Dažniausiai žiūrėta Eksportavimas baigtas @@ -230,7 +230,7 @@ Visada klausti Gauname informaciją… Įkeliamas pasirinktas turinys - Naujas grojaraštį + Naujas grojaraštis Pervadinti Pavadinimas Pridėti į grojaraštį @@ -311,7 +311,7 @@ Pranešimas apie naują NewPipe versiją Programos atnaujinimo pranešimas Failą - Failas pašalintas + Failas panaikintas Atlikėjai Albumai Dainos @@ -686,7 +686,7 @@ \nĮdiekite „Storage Access Framework“ suderinamą su šia failų tvarkykle Pranešimai pranešimui apie klaidas Rodyti „Grotuvas užlūžo“ - Sukurti klaidos pranešimą + Kurti klaidos pranešimą NewPipe susidūrė su klaida, paspauskite norėdami pranešti Šiam veiksmui nebuvo rasta tinkama failų tvarkyklė. \nĮdiekite failų tvarkyklę arba pabandykite išjungti \"%s\" atsisiuntimo nustatymuose diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 2390f8e69d7..c5e77b29fd1 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -726,4 +726,8 @@ Importeer of exporteer abonnementen vanuit het 3-punten menu U heeft de laatste versie van NewPipe Klik om %s te downloaden + Kon niet naar klembord kopiëren + Deze instelling is alleen beschikbaar als %s als thema ingesteld is + Kaart + Miniatuur niet ingesteld \ No newline at end of file diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 0ad616d014a..bc8d9fcee5c 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -727,4 +727,7 @@ ଆପଣ NewPipe ର ସର୍ବଶେଷ ସଂସ୍କରଣ ଚଳାଉଛନ୍ତି %s ଡାଉନଲୋଡ୍ କରିବାକୁ ଟ୍ୟାପ୍ କରନ୍ତୁ ଥିମ୍ ପାଇଁ %s ଚୟନ ହେଲେ ହିଁ ଏହି ବିକଳ୍ପ ଉପଲବ୍ଧ + କାର୍ଡ + କ୍ଲିପବୋର୍ଡରେ କପି କରିବାରେ ବିଫଳ + ସ୍ଥାୟୀ ଥମ୍ୱନେଲ୍ ସେଟ୍ କରନ୍ତୁ \ No newline at end of file diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 169d45dada2..2dcac20ab1e 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -727,4 +727,7 @@ ਤੁਸੀਂ ਨਿਊਪਾਈਪ ਦਾ ਨਵੀਨਤਮ ਸੰਸਕਰਣ ਚਲਾ ਰਹੇ ਹੋ %s ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ ਇਹ ਵਿਕਲਪ ਤਾਂ ਹੀ ਉਪਲਬਧ ਹੈ ਜੇਕਰ %s ਨੂੰ ਥੀਮ ਲਈ ਚੁਣਿਆ ਗਿਆ ਹੈ + ਸਥਾਈ ਥੰਮਨੇਲ ਨੂੰ ਅਨਸੈੱਟ ਕਰੋ + ਕਲਿੱਪਬੋਰਡ \'ਤੇ ਕਾਪੀ ਕਰਨ ਵਿੱਚ ਅਸਫਲ + ਕਾਰਡ \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index ab1e0aa72d6..e7ae07c85ee 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -749,4 +749,6 @@ Używasz najnowszej wersji NewPipe Ta opcja jest dostępna tylko wtedy, gdy %s jest wybrany jako motyw Usuń stałą miniaturę + Nie udało się skopiować do schowka + Karta \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 1929df07041..fc02f29d7f2 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -741,4 +741,6 @@ Você está executando a versão mais recente do NewPipe Esta opção só está disponível se %s for selecionado para Tema Desativar miniatura permanente + Cartão + Falha ao copiar para a área de transferência \ No newline at end of file diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 5a0d1928549..4c2593330dd 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -727,4 +727,7 @@ Toque para descarregar %s Ordenação Esta opção só está disponível se %s for selecionado como tema + Desativar miniatura permanente + Não foi possível copiar para a área de transferência + Cartão \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index e993da9348c..c47241dcc93 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -740,4 +740,7 @@ Já está a executar a versão mais recente do NewPipe Toque para descarregar %s Esta opção só está disponível se %s for selecionado para o tema + Desativar miniatura permanente + Não foi possível copiar para a área de transferência + Cartão \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 159b27a2a41..50376dc032a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -692,8 +692,8 @@ Новые видео Уведомления о новых видео в подписках Частота проверки - Уведомлять о новых видео - Получать уведомления о новых видео из каналов, на которые Вы подписаны + Новые видео + Уведомлять о новых видео в подписках Тип подключения Любая сеть Уведомления отключены @@ -720,7 +720,7 @@ Загрузка сведений о трансляции… Проверить наличие новых трансляций Удалить все загруженные файлы\? - Уведомления плеера + Уведомление плеера , Полутон Проценты @@ -736,11 +736,15 @@ Скрыть проигранные Скрывать будущие видео Ответы на частые вопросы - Если у вас возникли проблемы с использованием приложения, обязательно ознакомьтесь с ответами на распространенные вопросы! + Если у вас возникли проблемы с использованием приложения, обязательно ознакомьтесь с ответами на распространённые вопросы! Посмотреть на веб-сайте Сортировка У вас последняя версия Быстрый режим Импорт и экспорт подписок в меню с 3-мя точками Нажмите для загрузки %s + Карта + Не удалось скопировать в буфер обмена + Доступно, когда Тема установлена в %s + Убрать постоянную миниатюру \ No newline at end of file diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index bdae4fd37c0..e649cfac2a0 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -727,4 +727,7 @@ Importa o esporta iscritziones dae su menù a 3 puntos Ses impreende s\'ùrtima versione de NewPipe Custa optzione est a disponimentu petzi si %s est seletzionadu comente tema + Carta + Còpia in punta de billete fallida + Disativa sa miniadura permanente \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c9718d0b080..aeeb9bdc3de 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -728,4 +728,6 @@ 3-nokta menüsünden abonelikleri içe veya dışa aktarın Bu seçenek yalnızca tema için %s seçildiğinde kullanılabilir Kalıcı küçük resmin ayarını kaldır + Kart + Panoya kopyalanamadı \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index e812e8e4fe4..16b48fc571e 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -745,4 +745,6 @@ Швидкий режим Ця опція доступна, лише якщо темою обрано %s Прибрати постійну мініатюру + Картки + Не вдалося скопіювати до буфера обміну \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c3ada7180b2..029aa8343bc 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -715,4 +715,6 @@ 轻按下载 %s 只有在主题中选择了 %s 该选项才可用 取消设置永久缩略图 + 卡片 + 未能复制到剪贴板 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index ab902d37329..dc7d589b816 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -510,7 +510,7 @@ 自動 (跟返部機嘅主題色系) 精選 廣播 - 您而家可以揀選喺描述入面嘅文字喇。不過要單聲,喺揀選模式嘅時候,個頁面可能眨眨下,同埋啲連結會撳唔到。 + 您而家可以揀選喺描述入面嘅文字喇。不過要單聲,喺揀選模式嘅時候,版面可能會有啲眨,同埋啲連結會撳唔到。 啟用揀選描述入面嘅文字 版權協議 分類 @@ -713,4 +713,8 @@ 右上角嘅選單有得匯入或匯出訂閱 您已經用緊最新版本嘅 NewPipe 撳一下去下載 %s + 唔再揀定封面縮圖 + 色系揀做%s嘅時候至有得揀 + 複製唔到去剪貼簿 + 一張張 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 1ed552ab8cc..ab975bff196 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -714,4 +714,7 @@ 快速模式 從三點式選單匯入或匯出訂閱 此選項僅在主題選擇為 %s 時可用 + 卡片 + 取消設定永久縮圖 + 無法複製到剪貼簿 \ No newline at end of file diff --git a/fastlane/metadata/android/sl/changelogs/991.txt b/fastlane/metadata/android/sl/changelogs/991.txt new file mode 100644 index 00000000000..14f174a5a08 --- /dev/null +++ b/fastlane/metadata/android/sl/changelogs/991.txt @@ -0,0 +1,13 @@ +Novo +- Dodajanje gumba "Odpri v brskalniku" v podoknu z napakami +- Dodana možnost za prikaz skupin kanalov kot seznam +- [YouTube] Dolgi pritisk na segmente video pretoka za deljenje časovnega žiga URL-ja +- Dodajte gumb za predvajanje v vrsti v mini predvajalnik + +Izboljšave +- Dodana islandska lokalizacija ter posodobitev številnih drugih prevodov +- Številne notranje izboljšave + +Popravki +- Odprava večih sesutij +- [YouTube] Odprava težave z nalaganjem kanalov, nenamenskimi viri ter predvajanjem v nekaterih državah diff --git a/fastlane/metadata/android/sl/short_description.txt b/fastlane/metadata/android/sl/short_description.txt new file mode 100644 index 00000000000..8826524fcd1 --- /dev/null +++ b/fastlane/metadata/android/sl/short_description.txt @@ -0,0 +1 @@ +Brezplačen in enostaven YouTube "frontend" za Android. From b6bf0ffc40bade004b1cef8cec1eeb487d39618b Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 22 Jan 2023 08:56:29 +0100 Subject: [PATCH 058/645] Add changelog for v0.25.0 (992) --- .../metadata/android/en-US/changelogs/992.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/992.txt diff --git a/fastlane/metadata/android/en-US/changelogs/992.txt b/fastlane/metadata/android/en-US/changelogs/992.txt new file mode 100644 index 00000000000..807411d50a8 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/992.txt @@ -0,0 +1,17 @@ +New +• Subscriber count in video details +• Download from the queue +• Permanently set a playlist thumbnail +• Long-press hashtags and links +• Card view mode + +Improved +• Larger mini-player close button +• Smoother thumbnail downscaling +• Target Android 13 (API 33) +• Seeking no longer pauses the player + +Fixed +• Fix overlay on DeX/mouse +• Allow background player with no separate audio streams +• Various YouTube fixes and more… \ No newline at end of file From b9228df32c9e23f21e4d69abe5f7f61d03796803 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 22 Jan 2023 08:59:21 +0100 Subject: [PATCH 059/645] Release v0.25.0 (992) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 79e07a190b1..97d8e8553bf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { resValue "string", "app_name", "NewPipe" minSdk 21 targetSdk 33 - versionCode 991 - versionName "0.24.1" + versionCode 992 + versionName "0.25.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From 0821f6463ac5411cb72afaeb30aff1338d2ac66a Mon Sep 17 00:00:00 2001 From: ge78fug Date: Wed, 25 Jan 2023 19:25:57 +0100 Subject: [PATCH 060/645] Added bottom main-tabs feature --- .../newpipe/fragments/MainFragment.java | 37 +++++++++++++++++++ app/src/main/res/values/settings_keys.xml | 3 ++ app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/appearance_settings.xml | 8 ++++ 4 files changed, 50 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index de68269e954..66b2f57b381 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -3,12 +3,14 @@ import android.content.Context; import android.os.Bundle; import android.util.Log; +import android.util.TypedValue; 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.RelativeLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -17,6 +19,7 @@ import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapterMenuWorkaround; import androidx.preference.PreferenceManager; +import androidx.viewpager.widget.ViewPager; import com.google.android.material.tabs.TabLayout; @@ -29,6 +32,7 @@ import org.schabi.newpipe.settings.tabs.TabsManager; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ServiceHelper; +import org.schabi.newpipe.views.ScrollableTabLayout; import java.util.ArrayList; import java.util.List; @@ -106,6 +110,7 @@ public void onResume() { } else if (hasTabsChanged) { setupTabs(); } + updateTabsPosition(); } @Override @@ -189,6 +194,38 @@ private void updateTabsIconAndDescription() { private void updateTitleForTab(final int tabPosition) { setTitle(tabsList.get(tabPosition).getTabName(requireContext())); } + private void updateTabsPosition() { + final ScrollableTabLayout tabLayout = binding.mainTabLayout; + final ViewPager viewPager = binding.pager; + final RelativeLayout.LayoutParams tabParams = (RelativeLayout.LayoutParams) + tabLayout.getLayoutParams(); + final RelativeLayout.LayoutParams pagerParams = (RelativeLayout.LayoutParams) + viewPager.getLayoutParams(); + if (PreferenceManager.getDefaultSharedPreferences(requireContext()) + .getBoolean(getString(R.string.main_tabs_position_key), false)) { + tabParams.removeRule(RelativeLayout.ALIGN_PARENT_TOP); + tabParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + pagerParams.removeRule(RelativeLayout.BELOW); + pagerParams.addRule(RelativeLayout.ABOVE, R.id.main_tab_layout); + tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_TOP); + final TypedValue typedValue = new TypedValue(); + getContext().getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, + true); + getActivity().getWindow().setNavigationBarColor(typedValue.data); + } else { + tabParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + tabParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); + pagerParams.removeRule(RelativeLayout.ABOVE); + pagerParams.addRule(RelativeLayout.BELOW, R.id.main_tab_layout); + tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_BOTTOM); + final TypedValue typedValue = new TypedValue(); + getContext().getTheme().resolveAttribute(R.attr.colorSecondary, typedValue, + true); + getActivity().getWindow().setNavigationBarColor(typedValue.data); + } + tabLayout.setLayoutParams(tabParams); + viewPager.setLayoutParams(pagerParams); + } @Override public void onTabSelected(final TabLayout.Tab selectedTab) { diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 12681896951..bbd46f7e10b 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -241,6 +241,9 @@ caption_settings_key caption_user_set_key + + main_tabs_position + show_search_suggestions show_local_search_suggestions diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5a4ce92f216..654f01e1eb5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -213,6 +213,8 @@ Delete entire search history? Search history deleted Fast mode + Change the position of the main tabs + Main Tabs Position Error External storage unavailable diff --git a/app/src/main/res/xml/appearance_settings.xml b/app/src/main/res/xml/appearance_settings.xml index d726e26b735..beb46cdf5e7 100644 --- a/app/src/main/res/xml/appearance_settings.xml +++ b/app/src/main/res/xml/appearance_settings.xml @@ -66,4 +66,12 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> + + From c70ce791dbfb659cd45d4a91a5de5a23e9eaa9ac Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Fri, 27 Jan 2023 15:37:33 +0100 Subject: [PATCH 061/645] Added the duplicate indicator explanation & removed some unnecessary functions --- .../schabi/newpipe/local/LocalItemListAdapter.java | 11 ----------- .../newpipe/local/dialog/PlaylistAppendDialog.java | 13 ++++++++++++- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index ea7bc290d58..05e2fdac083 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -11,7 +11,6 @@ import androidx.recyclerview.widget.RecyclerView; import org.schabi.newpipe.database.LocalItem; -import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.local.holder.LocalItemHolder; @@ -345,16 +344,6 @@ public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, fina } } - @Override - public long getItemId(final int position) { - final LocalItem item = localItems.get(position); - if (item != null && item.getLocalItemType() == LocalItem.LocalItemType. - PLAYLIST_LOCAL_ITEM) { - return ((PlaylistMetadataEntry) item).uid; - } - return super.getItemId(position); - } - public GridLayoutManager.SpanSizeLookup getSpanSizeLookup(final int spanCount) { return new GridLayoutManager.SpanSizeLookup() { @Override diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index 79a355f5295..b45f6bd9c03 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -61,7 +61,6 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle saved new LocalPlaylistManager(NewPipeDatabase.getInstance(requireContext())); playlistAdapter = new LocalItemListAdapter(getActivity()); - playlistAdapter.setHasStableIds(true); playlistAdapter.setSelectedListener(selectedItem -> { final List entities = getStreamEntities(); if (selectedItem instanceof PlaylistDuplicatesEntry && entities != null) { @@ -125,8 +124,20 @@ private void onPlaylistsReceived(@NonNull final List pl playlistAdapter.clearStreamItemList(); playlistAdapter.addItems(playlists); playlistRecyclerView.setVisibility(View.VISIBLE); + setDuplicateIndicatorExplanation(playlists); } } + private void setDuplicateIndicatorExplanation(final List playlists) { + for (final PlaylistDuplicatesEntry entry : playlists) { + if (entry.timesStreamIsContained > 0) { + final View indicatorExplanation = getView() + .findViewById(R.id.playlist_duplicate); + indicatorExplanation.setVisibility(View.VISIBLE); + return; + } + } + + } private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager, @NonNull final PlaylistDuplicatesEntry playlist, From 102975aeb3fabb18f2a87811d51aef463b30c5a0 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 29 Jan 2023 10:32:32 +0100 Subject: [PATCH 062/645] Improve handling playlist duplicate indicator --- .../local/dialog/PlaylistAppendDialog.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index b45f6bd9c03..5aeca06edb0 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -4,6 +4,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; @@ -28,6 +29,7 @@ public final class PlaylistAppendDialog extends PlaylistDialog { private RecyclerView playlistRecyclerView; private LocalItemListAdapter playlistAdapter; + private TextView playlistDuplicateIndicator; private final CompositeDisposable playlistDisposables = new CompositeDisposable(); @@ -73,6 +75,8 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle saved playlistRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); playlistRecyclerView.setAdapter(playlistAdapter); + playlistDuplicateIndicator = view.findViewById(R.id.playlist_duplicate); + final View newPlaylistButton = view.findViewById(R.id.newPlaylist); newPlaylistButton.setOnClickListener(ignored -> openCreatePlaylistDialog()); @@ -120,23 +124,20 @@ public void openCreatePlaylistDialog() { } private void onPlaylistsReceived(@NonNull final List playlists) { - if (playlistAdapter != null && playlistRecyclerView != null) { + if (playlistAdapter != null + && playlistRecyclerView != null + && playlistDuplicateIndicator != null) { playlistAdapter.clearStreamItemList(); playlistAdapter.addItems(playlists); playlistRecyclerView.setVisibility(View.VISIBLE); - setDuplicateIndicatorExplanation(playlists); + playlistDuplicateIndicator.setVisibility( + anyPlaylistContainsDuplicates(playlists) ? View.VISIBLE : View.GONE); } } - private void setDuplicateIndicatorExplanation(final List playlists) { - for (final PlaylistDuplicatesEntry entry : playlists) { - if (entry.timesStreamIsContained > 0) { - final View indicatorExplanation = getView() - .findViewById(R.id.playlist_duplicate); - indicatorExplanation.setVisibility(View.VISIBLE); - return; - } - } + private boolean anyPlaylistContainsDuplicates(final List playlists) { + return playlists.stream() + .anyMatch(playlist -> playlist.timesStreamIsContained > 0); } private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager, From 711345eff7c46269797de66e61f030cfbc72fa1c Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 29 Jan 2023 10:32:44 +0100 Subject: [PATCH 063/645] Improve playlist duplicate indicator layout --- app/src/main/res/layout/dialog_playlists.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/layout/dialog_playlists.xml b/app/src/main/res/layout/dialog_playlists.xml index 5771b400fd2..ab4691fa944 100644 --- a/app/src/main/res/layout/dialog_playlists.xml +++ b/app/src/main/res/layout/dialog_playlists.xml @@ -37,17 +37,17 @@ + android:gravity="center" + android:text="@string/duplicate_in_playlist" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textSize="13sp" + android:visibility="gone" + tools:text="@tools:sample/lorem[20]" + tools:visibility="visible" /> Date: Sun, 29 Jan 2023 00:45:57 +0100 Subject: [PATCH 064/645] [YouTube] Add support for live links The addition of this support requires an extractor update. --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index dcfbd2ed67d..53b1ef04e3f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -187,7 +187,7 @@ dependencies { // name and the commit hash with the commit hash of the (pushed) commit you want to test // This works thanks to JitPack: https://jitpack.io/ implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'com.github.TeamNewPipe:NewPipeExtractor:ff94e9f30bc5d7831734cc85ecebe7d30ac9c040' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:999fb7f812f8f39712dda88cf5ff4db3ee877fdc' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e987abdbb0..d839efbe0a0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -165,6 +165,7 @@ + From d1aed94d2713583e9c54697b07aeac6533e50df3 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 29 Jan 2023 11:28:00 +0100 Subject: [PATCH 065/645] Fix opening urls in browser on API 30+ See https://medium.com/androiddevelopers/package-visibility-in-android-11-cc857f221cd9 and https://github.com/TeamNewPipe/NewPipe/issues/9615 --- app/src/main/AndroidManifest.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d839efbe0a0..1fb20ef0e08 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,6 +11,14 @@ + + + + + + + + From 2b37721a6eeb587446063e162e1a0b9cec2e2f87 Mon Sep 17 00:00:00 2001 From: Marius Wagner Date: Sun, 29 Jan 2023 19:37:46 +0100 Subject: [PATCH 066/645] Update app/src/main/res/values/strings.xml Co-authored-by: Stypox --- app/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 654f01e1eb5..2cc1f1caf5b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -213,8 +213,8 @@ Delete entire search history? Search history deleted Fast mode - Change the position of the main tabs - Main Tabs Position + Move main tab selector to the bottom + Main tabs position Error External storage unavailable From d2d324f2dd006feeac213c67fcb5ab3c56821e44 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Mon, 30 Jan 2023 22:37:24 +0100 Subject: [PATCH 067/645] First draft of the new feature --- .../newpipe/database/feed/dao/FeedDAO.kt | 9 ++++ .../stream/model/StreamStateEntity.java | 2 +- .../newpipe/local/feed/FeedDatabaseManager.kt | 2 + .../schabi/newpipe/local/feed/FeedFragment.kt | 34 ++++++------ .../newpipe/local/feed/FeedViewModel.kt | 54 +++++++++++++------ app/src/main/res/menu/menu_feed_fragment.xml | 21 ++++++-- app/src/main/res/values/settings_keys.xml | 2 +- app/src/main/res/values/strings.xml | 6 ++- gradle/wrapper/gradle-wrapper.properties | 1 - 9 files changed, 87 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt index 968d0c88ff2..4faafb2ea46 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt @@ -32,6 +32,7 @@ abstract class FeedDAO { * @return the feed streams filtered according to the conditions provided in the parameters * @see StreamStateEntity.isFinished() * @see StreamStateEntity.PLAYBACK_FINISHED_END_MILLISECONDS + * @see StreamStateEntity.PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS */ @Query( """ @@ -66,6 +67,13 @@ abstract class FeedDAO { OR s.stream_type = 'LIVE_STREAM' OR s.stream_type = 'AUDIO_LIVE_STREAM' ) + AND ( + :includePartiallyPlayed + OR sh.stream_id IS NULL + OR sst.stream_id IS NULL + OR (sst.progress_time < ${StreamStateEntity.PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS} + AND sst.progress_time < s.duration * 1000 / 4) + ) AND ( :uploadDateBefore IS NULL OR s.upload_date IS NULL @@ -79,6 +87,7 @@ abstract class FeedDAO { abstract fun getStreams( groupId: Long, includePlayed: Boolean, + includePartiallyPlayed: Boolean, uploadDateBefore: OffsetDateTime? ): Maybe> diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.java b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.java index 75766850ff5..627acea45a4 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.java @@ -30,7 +30,7 @@ public class StreamStateEntity { /** * Playback state will not be saved, if playback time is less than this threshold (5000ms = 5s). */ - private static final long PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS = 5000; + public static final long PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS = 5000; /** * Stream will be considered finished if the playback time left exceeds this threshold diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt index 07edb04997d..ed65d4048e8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt @@ -43,11 +43,13 @@ class FeedDatabaseManager(context: Context) { fun getStreams( groupId: Long, includePlayedStreams: Boolean, + includePartiallyPlayedStreams: Boolean, includeFutureStreams: Boolean ): Maybe> { return feedTable.getStreams( groupId, includePlayedStreams, + includePartiallyPlayedStreams, if (includeFutureStreams) null else OffsetDateTime.now() ) } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index 2bb2f9986db..07421a8ea6e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -100,7 +100,7 @@ class FeedFragment : BaseStateFragment() { private var oldestSubscriptionUpdate: OffsetDateTime? = null private lateinit var groupAdapter: GroupieAdapter - @State @JvmField var showPlayedItems: Boolean = true + @State @JvmField var showPlayedItems: ShowItems = ShowItems.DEFAULT @State @JvmField var showFutureItems: Boolean = true private var onSettingsChangeListener: SharedPreferences.OnSharedPreferenceChangeListener? = null @@ -140,7 +140,7 @@ class FeedFragment : BaseStateFragment() { val factory = FeedViewModel.getFactory(requireContext(), groupId) viewModel = ViewModelProvider(this, factory)[FeedViewModel::class.java] - showPlayedItems = viewModel.getShowPlayedItemsFromPreferences() + showPlayedItems = viewModel.getItemsVisibilityFromPreferences() showFutureItems = viewModel.getShowFutureItemsFromPreferences() viewModel.stateLiveData.observe(viewLifecycleOwner) { it?.let(::handleResult) } @@ -242,11 +242,12 @@ class FeedFragment : BaseStateFragment() { .create() .show() return true - } else if (item.itemId == R.id.menu_item_feed_toggle_played_items) { - showPlayedItems = !item.isChecked - updateTogglePlayedItemsButton(item) - viewModel.togglePlayedItems(showPlayedItems) - viewModel.saveShowPlayedItemsToPreferences(showPlayedItems) + } else if (item.itemId == R.id.menu_item_feed_toggle_show_all_items) { + setShowPlayedItemsMethod(item, ShowItems.DEFAULT) + } else if (item.itemId == R.id.menu_item_feed_toggle_show_played_items) { + setShowPlayedItemsMethod(item, ShowItems.WATCHED) + } else if (item.itemId == R.id.menu_item_feed_toggle_partially_played_items) { + setShowPlayedItemsMethod(item, ShowItems.PARTIALLY_WATCHED) } else if (item.itemId == R.id.menu_item_feed_toggle_future_items) { showFutureItems = !item.isChecked updateToggleFutureItemsButton(item) @@ -257,6 +258,13 @@ class FeedFragment : BaseStateFragment() { return super.onOptionsItemSelected(item) } + private fun setShowPlayedItemsMethod(item: MenuItem, showItems: ShowItems) { + showPlayedItems = showItems + viewModel.togglePlayedItems(showPlayedItems) + updateTogglePlayedItemsButton(item) + viewModel.saveShowPlayedItemsToPreferences(showPlayedItems) + } + override fun onDestroyOptionsMenu() { super.onDestroyOptionsMenu() activity?.supportActionBar?.subtitle = null @@ -284,19 +292,9 @@ class FeedFragment : BaseStateFragment() { } private fun updateTogglePlayedItemsButton(menuItem: MenuItem) { - menuItem.isChecked = showPlayedItems - menuItem.icon = AppCompatResources.getDrawable( - requireContext(), - if (showPlayedItems) R.drawable.ic_visibility_on else R.drawable.ic_visibility_off - ) MenuItemCompat.setTooltipText( menuItem, - getString( - if (showPlayedItems) - R.string.feed_toggle_hide_played_items - else - R.string.feed_toggle_show_played_items - ) + getString(R.string.feed_toggle_show_hide_played_items) ) } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt index 76d5e9d632b..5785c8e3f75 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt @@ -28,15 +28,18 @@ import org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT import java.time.OffsetDateTime import java.util.concurrent.TimeUnit +enum class ShowItems { + WATCHED, PARTIALLY_WATCHED, DEFAULT +} class FeedViewModel( private val application: Application, groupId: Long = FeedGroupEntity.GROUP_ALL_ID, - initialShowPlayedItems: Boolean = true, + initialShowPlayedItems: ShowItems = ShowItems.DEFAULT, initialShowFutureItems: Boolean = true ) : ViewModel() { private val feedDatabaseManager = FeedDatabaseManager(application) - private val toggleShowPlayedItems = BehaviorProcessor.create() + private val toggleShowPlayedItems = BehaviorProcessor.create() private val toggleShowPlayedItemsFlowable = toggleShowPlayedItems .startWithItem(initialShowPlayedItems) .distinctUntilChanged() @@ -57,7 +60,7 @@ class FeedViewModel( feedDatabaseManager.notLoadedCount(groupId), feedDatabaseManager.oldestSubscriptionUpdate(groupId), - Function5 { t1: FeedEventManager.Event, t2: Boolean, t3: Boolean, + Function5 { t1: FeedEventManager.Event, t2: ShowItems, t3: Boolean, t4: Long, t5: List -> return@Function5 CombineResultEventHolder(t1, t2, t3, t4, t5.firstOrNull()) } @@ -66,12 +69,21 @@ class FeedViewModel( .subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) .map { (event, showPlayedItems, showFutureItems, notLoadedCount, oldestUpdate) -> - val streamItems = if (event is SuccessResultEvent || event is IdleEvent) + val streamItems = if (event is SuccessResultEvent || event is IdleEvent) { feedDatabaseManager - .getStreams(groupId, showPlayedItems, showFutureItems) + .getStreams( + groupId, + !( + showPlayedItems == ShowItems.WATCHED || + showPlayedItems == ShowItems.PARTIALLY_WATCHED + ), + showPlayedItems != ShowItems.PARTIALLY_WATCHED, + showFutureItems + ) .blockingGet(arrayListOf()) - else + } else { arrayListOf() + } CombineResultDataHolder(event, streamItems, notLoadedCount, oldestUpdate) } @@ -98,7 +110,7 @@ class FeedViewModel( private data class CombineResultEventHolder( val t1: FeedEventManager.Event, - val t2: Boolean, + val t2: ShowItems, val t3: Boolean, val t4: Long, val t5: OffsetDateTime? @@ -111,17 +123,20 @@ class FeedViewModel( val t4: OffsetDateTime? ) - fun togglePlayedItems(showPlayedItems: Boolean) { - toggleShowPlayedItems.onNext(showPlayedItems) + fun togglePlayedItems(showItems: ShowItems) { + toggleShowPlayedItems.onNext(showItems) } - fun saveShowPlayedItemsToPreferences(showPlayedItems: Boolean) = + fun saveShowPlayedItemsToPreferences(showItems: ShowItems) = PreferenceManager.getDefaultSharedPreferences(application).edit { - this.putBoolean(application.getString(R.string.feed_show_played_items_key), showPlayedItems) + this.putString( + application.getString(R.string.feed_show_played_items_key), + showItems.toString() + ) this.apply() } - fun getShowPlayedItemsFromPreferences() = getShowPlayedItemsFromPreferences(application) + fun getItemsVisibilityFromPreferences() = getItemsVisibilityFromPreferences(application) fun toggleFutureItems(showFutureItems: Boolean) { toggleShowFutureItems.onNext(showFutureItems) @@ -136,9 +151,16 @@ class FeedViewModel( fun getShowFutureItemsFromPreferences() = getShowFutureItemsFromPreferences(application) companion object { - private fun getShowPlayedItemsFromPreferences(context: Context) = - PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(context.getString(R.string.feed_show_played_items_key), true) + + private fun getItemsVisibilityFromPreferences(context: Context): ShowItems { + val s = PreferenceManager.getDefaultSharedPreferences(context) + .getString( + context.getString(R.string.feed_show_played_items_key), + ShowItems.DEFAULT.toString() + ) ?: ShowItems.DEFAULT.toString() + return ShowItems.valueOf(s) + } + private fun getShowFutureItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(context.getString(R.string.feed_show_future_items_key), true) @@ -148,7 +170,7 @@ class FeedViewModel( App.getApp(), groupId, // Read initial value from preferences - getShowPlayedItemsFromPreferences(context.applicationContext), + getItemsVisibilityFromPreferences(context.applicationContext), getShowFutureItemsFromPreferences(context.applicationContext) ) } diff --git a/app/src/main/res/menu/menu_feed_fragment.xml b/app/src/main/res/menu/menu_feed_fragment.xml index 9e5cc862e57..fc371b2fe1e 100644 --- a/app/src/main/res/menu/menu_feed_fragment.xml +++ b/app/src/main/res/menu/menu_feed_fragment.xml @@ -4,12 +4,23 @@ + android:title="@string/feed_toggle_show_hide_played_items" + app:showAsAction="ifRoom"> + + + + + + feed_update_threshold_key 300 - feed_show_played_items + feed_show_items feed_show_future_items show_thumbnail_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5a4ce92f216..46a3cad74a0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -691,8 +691,7 @@ \nYouTube is an example of a service that offers this fast method with its RSS feed. \n \nSo the choice boils down to what you prefer: speed or precise information. - Show watched items - Hide watched items + Show/hide watched items This content is not yet supported by NewPipe.\n\nIt will hopefully be supported in a future version. Channel\'s avatar thumbnail Created by %s @@ -760,5 +759,8 @@ Unknown quality Show future items Hide future items + Hide Watched and Partially Watched + Hide Watched + Show All Sort \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5116c5b1869..ae04661ee73 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip -distributionSha256Sum=f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 3d36eb5bafb5945f3a649746d437358f22701f81 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Mon, 30 Jan 2023 22:39:16 +0100 Subject: [PATCH 068/645] Fixed a small commit mistake --- gradle/wrapper/gradle-wrapper.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661ee73..5116c5b1869 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionSha256Sum=f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 38db0cc713e2d22770556fc5ac31cdf736053fce Mon Sep 17 00:00:00 2001 From: ge78fug Date: Tue, 31 Jan 2023 16:07:57 +0100 Subject: [PATCH 069/645] Changed the color --- .../newpipe/fragments/MainFragment.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 66b2f57b381..4a702e0dce5 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.fragments; import android.content.Context; +import android.content.res.ColorStateList; import android.os.Bundle; import android.util.Log; import android.util.TypedValue; @@ -15,6 +16,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapterMenuWorkaround; @@ -208,10 +210,14 @@ private void updateTabsPosition() { pagerParams.removeRule(RelativeLayout.BELOW); pagerParams.addRule(RelativeLayout.ABOVE, R.id.main_tab_layout); tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_TOP); - final TypedValue typedValue = new TypedValue(); - getContext().getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, + final TypedValue typedValueBackground = new TypedValue(); + getContext().getTheme().resolveAttribute(R.attr.colorSecondary, typedValueBackground, true); - getActivity().getWindow().setNavigationBarColor(typedValue.data); + tabLayout.setBackgroundColor(typedValueBackground.data); + tabLayout.setTabRippleColor(ColorStateList.valueOf( + getResources().getColor(R.color.gray))); + tabLayout.setTabIconTint(ColorStateList.valueOf(getResources().getColor(R.color.gray))); + tabLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.gray)); } else { tabParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM); tabParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); @@ -219,9 +225,13 @@ private void updateTabsPosition() { pagerParams.addRule(RelativeLayout.BELOW, R.id.main_tab_layout); tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_BOTTOM); final TypedValue typedValue = new TypedValue(); - getContext().getTheme().resolveAttribute(R.attr.colorSecondary, typedValue, + getContext().getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, true); - getActivity().getWindow().setNavigationBarColor(typedValue.data); + tabLayout.setBackgroundColor(typedValue.data); + tabLayout.setTabRippleColor(binding.mainTabLayout.getTabRippleColor().withAlpha(32)); + tabLayout.setTabIconTint(binding.mainTabLayout.getTabIconTint()); + tabLayout.setSelectedTabIndicatorColor(ContextCompat + .getColor(requireContext(), R.color.white)); } tabLayout.setLayoutParams(tabParams); viewPager.setLayoutParams(pagerParams); From 9c82441c1911a3c0e45020464bbaca8005599764 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Wed, 1 Feb 2023 23:10:31 +0100 Subject: [PATCH 070/645] Implemented the feature and fixed some small issues --- .../newpipe/database/feed/dao/FeedDAO.kt | 4 +- .../schabi/newpipe/local/feed/FeedFragment.kt | 56 ++++++++++++++----- .../newpipe/local/feed/FeedViewModel.kt | 47 ++++++++-------- .../local/feed/StreamVisibilityStatus.kt | 5 ++ .../local/history/HistoryRecordManager.java | 2 +- app/src/main/res/menu/menu_feed_fragment.xml | 8 +-- app/src/main/res/values/settings_keys.xml | 2 +- app/src/main/res/values/strings.xml | 8 +-- 8 files changed, 82 insertions(+), 50 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/local/feed/StreamVisibilityStatus.kt diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt index 4faafb2ea46..a53e5cac139 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt @@ -71,8 +71,8 @@ abstract class FeedDAO { :includePartiallyPlayed OR sh.stream_id IS NULL OR sst.stream_id IS NULL - OR (sst.progress_time < ${StreamStateEntity.PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS} - AND sst.progress_time < s.duration * 1000 / 4) + OR (sst.progress_time <= ${StreamStateEntity.PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS} + AND sst.progress_time <= s.duration * 1000 / 4) ) AND ( :uploadDateBefore IS NULL diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index 07421a8ea6e..9358c1654c0 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -100,9 +100,13 @@ class FeedFragment : BaseStateFragment() { private var oldestSubscriptionUpdate: OffsetDateTime? = null private lateinit var groupAdapter: GroupieAdapter - @State @JvmField var showPlayedItems: ShowItems = ShowItems.DEFAULT + @State @JvmField var feedVisibilityStatus: StreamVisibilityStatus = StreamVisibilityStatus.DEFAULT @State @JvmField var showFutureItems: Boolean = true + private lateinit var showAllMenuItem: MenuItem + private lateinit var hideWatchedMenuItem: MenuItem + private lateinit var hidePartiallyWatchedMenuItem: MenuItem + private var onSettingsChangeListener: SharedPreferences.OnSharedPreferenceChangeListener? = null private var updateListViewModeOnResume = false private var isRefreshing = false @@ -140,7 +144,7 @@ class FeedFragment : BaseStateFragment() { val factory = FeedViewModel.getFactory(requireContext(), groupId) viewModel = ViewModelProvider(this, factory)[FeedViewModel::class.java] - showPlayedItems = viewModel.getItemsVisibilityFromPreferences() + feedVisibilityStatus = viewModel.getItemsVisibilityFromPreferences() showFutureItems = viewModel.getShowFutureItemsFromPreferences() viewModel.stateLiveData.observe(viewLifecycleOwner) { it?.let(::handleResult) } @@ -216,7 +220,15 @@ class FeedFragment : BaseStateFragment() { activity.supportActionBar?.subtitle = groupName inflater.inflate(R.menu.menu_feed_fragment, menu) - updateTogglePlayedItemsButton(menu.findItem(R.id.menu_item_feed_toggle_played_items)) + + val itemVisibilityMenu = menu.findItem(R.id.menu_item_feed_toggle_played_items).subMenu + if (itemVisibilityMenu != null) { + showAllMenuItem = itemVisibilityMenu.findItem(R.id.menu_item_feed_toggle_show_all_items) + hideWatchedMenuItem = itemVisibilityMenu.findItem(R.id.menu_item_feed_toggle_show_played_items) + hidePartiallyWatchedMenuItem = itemVisibilityMenu.findItem(R.id.menu_item_feed_toggle_partially_played_items) + } + + updateItemVisibilityMenu(menu.findItem(R.id.menu_item_feed_toggle_played_items)) updateToggleFutureItemsButton(menu.findItem(R.id.menu_item_feed_toggle_future_items)) } @@ -243,11 +255,11 @@ class FeedFragment : BaseStateFragment() { .show() return true } else if (item.itemId == R.id.menu_item_feed_toggle_show_all_items) { - setShowPlayedItemsMethod(item, ShowItems.DEFAULT) + changeItemsVisibilityStatus(item, StreamVisibilityStatus.DEFAULT) } else if (item.itemId == R.id.menu_item_feed_toggle_show_played_items) { - setShowPlayedItemsMethod(item, ShowItems.WATCHED) + changeItemsVisibilityStatus(item, StreamVisibilityStatus.HIDE_WATCHED) } else if (item.itemId == R.id.menu_item_feed_toggle_partially_played_items) { - setShowPlayedItemsMethod(item, ShowItems.PARTIALLY_WATCHED) + changeItemsVisibilityStatus(item, StreamVisibilityStatus.HIDE_PARTIALLY_WATCHED) } else if (item.itemId == R.id.menu_item_feed_toggle_future_items) { showFutureItems = !item.isChecked updateToggleFutureItemsButton(item) @@ -258,11 +270,11 @@ class FeedFragment : BaseStateFragment() { return super.onOptionsItemSelected(item) } - private fun setShowPlayedItemsMethod(item: MenuItem, showItems: ShowItems) { - showPlayedItems = showItems - viewModel.togglePlayedItems(showPlayedItems) - updateTogglePlayedItemsButton(item) - viewModel.saveShowPlayedItemsToPreferences(showPlayedItems) + private fun changeItemsVisibilityStatus(item: MenuItem, streamVisibilityStatus: StreamVisibilityStatus) { + feedVisibilityStatus = streamVisibilityStatus + viewModel.changeVisibilityState(feedVisibilityStatus) + updateItemVisibilityMenu(item) + viewModel.saveStreamVisibilityStateToPreferences(feedVisibilityStatus) } override fun onDestroyOptionsMenu() { @@ -291,10 +303,28 @@ class FeedFragment : BaseStateFragment() { super.onDestroyView() } - private fun updateTogglePlayedItemsButton(menuItem: MenuItem) { + private fun updateItemVisibilityMenu(menuItem: MenuItem) { + when (feedVisibilityStatus) { + StreamVisibilityStatus.DEFAULT -> { + showAllMenuItem.isVisible = false + hideWatchedMenuItem.isVisible = true + hidePartiallyWatchedMenuItem.isVisible = true + } + StreamVisibilityStatus.HIDE_WATCHED -> { + showAllMenuItem.isVisible = true + hideWatchedMenuItem.isVisible = false + hidePartiallyWatchedMenuItem.isVisible = true + } + else -> { + showAllMenuItem.isVisible = true + hideWatchedMenuItem.isVisible = true + hidePartiallyWatchedMenuItem.isVisible = false + } + } + MenuItemCompat.setTooltipText( menuItem, - getString(R.string.feed_toggle_show_hide_played_items) + getString(R.string.feed_change_stream_visibility_state) ) } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt index 5785c8e3f75..46c3443a889 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt @@ -28,20 +28,17 @@ import org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT import java.time.OffsetDateTime import java.util.concurrent.TimeUnit -enum class ShowItems { - WATCHED, PARTIALLY_WATCHED, DEFAULT -} class FeedViewModel( private val application: Application, groupId: Long = FeedGroupEntity.GROUP_ALL_ID, - initialShowPlayedItems: ShowItems = ShowItems.DEFAULT, + initialStreamVisibility: StreamVisibilityStatus = StreamVisibilityStatus.DEFAULT, initialShowFutureItems: Boolean = true ) : ViewModel() { private val feedDatabaseManager = FeedDatabaseManager(application) - private val toggleShowPlayedItems = BehaviorProcessor.create() - private val toggleShowPlayedItemsFlowable = toggleShowPlayedItems - .startWithItem(initialShowPlayedItems) + private val streamVisibilityState = BehaviorProcessor.create() + private val streamVisibilityStateFlowable = streamVisibilityState + .startWithItem(initialStreamVisibility) .distinctUntilChanged() private val toggleShowFutureItems = BehaviorProcessor.create() @@ -55,12 +52,12 @@ class FeedViewModel( private var combineDisposable = Flowable .combineLatest( FeedEventManager.events(), - toggleShowPlayedItemsFlowable, + streamVisibilityStateFlowable, toggleShowFutureItemsFlowable, feedDatabaseManager.notLoadedCount(groupId), feedDatabaseManager.oldestSubscriptionUpdate(groupId), - Function5 { t1: FeedEventManager.Event, t2: ShowItems, t3: Boolean, + Function5 { t1: FeedEventManager.Event, t2: StreamVisibilityStatus, t3: Boolean, t4: Long, t5: List -> return@Function5 CombineResultEventHolder(t1, t2, t3, t4, t5.firstOrNull()) } @@ -74,10 +71,10 @@ class FeedViewModel( .getStreams( groupId, !( - showPlayedItems == ShowItems.WATCHED || - showPlayedItems == ShowItems.PARTIALLY_WATCHED + showPlayedItems == StreamVisibilityStatus.HIDE_WATCHED || + showPlayedItems == StreamVisibilityStatus.HIDE_PARTIALLY_WATCHED ), - showPlayedItems != ShowItems.PARTIALLY_WATCHED, + showPlayedItems != StreamVisibilityStatus.HIDE_PARTIALLY_WATCHED, showFutureItems ) .blockingGet(arrayListOf()) @@ -110,7 +107,7 @@ class FeedViewModel( private data class CombineResultEventHolder( val t1: FeedEventManager.Event, - val t2: ShowItems, + val t2: StreamVisibilityStatus, val t3: Boolean, val t4: Long, val t5: OffsetDateTime? @@ -123,20 +120,20 @@ class FeedViewModel( val t4: OffsetDateTime? ) - fun togglePlayedItems(showItems: ShowItems) { - toggleShowPlayedItems.onNext(showItems) + fun changeVisibilityState(streamVisibilityStatus: StreamVisibilityStatus) { + streamVisibilityState.onNext(streamVisibilityStatus) } - fun saveShowPlayedItemsToPreferences(showItems: ShowItems) = + fun saveStreamVisibilityStateToPreferences(streamVisibilityStatus: StreamVisibilityStatus) = PreferenceManager.getDefaultSharedPreferences(application).edit { this.putString( - application.getString(R.string.feed_show_played_items_key), - showItems.toString() + application.getString(R.string.feed_stream_visibility_state_key), + streamVisibilityStatus.toString() ) this.apply() } - fun getItemsVisibilityFromPreferences() = getItemsVisibilityFromPreferences(application) + fun getItemsVisibilityFromPreferences() = getStreamVisibilityStateFromPreferences(application) fun toggleFutureItems(showFutureItems: Boolean) { toggleShowFutureItems.onNext(showFutureItems) @@ -152,13 +149,13 @@ class FeedViewModel( companion object { - private fun getItemsVisibilityFromPreferences(context: Context): ShowItems { + private fun getStreamVisibilityStateFromPreferences(context: Context): StreamVisibilityStatus { val s = PreferenceManager.getDefaultSharedPreferences(context) .getString( - context.getString(R.string.feed_show_played_items_key), - ShowItems.DEFAULT.toString() - ) ?: ShowItems.DEFAULT.toString() - return ShowItems.valueOf(s) + context.getString(R.string.feed_stream_visibility_state_key), + StreamVisibilityStatus.DEFAULT.toString() + ) ?: StreamVisibilityStatus.DEFAULT.toString() + return StreamVisibilityStatus.valueOf(s) } private fun getShowFutureItemsFromPreferences(context: Context) = @@ -170,7 +167,7 @@ class FeedViewModel( App.getApp(), groupId, // Read initial value from preferences - getItemsVisibilityFromPreferences(context.applicationContext), + getStreamVisibilityStateFromPreferences(context.applicationContext), getShowFutureItemsFromPreferences(context.applicationContext) ) } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/StreamVisibilityStatus.kt b/app/src/main/java/org/schabi/newpipe/local/feed/StreamVisibilityStatus.kt new file mode 100644 index 00000000000..956594ef30f --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/feed/StreamVisibilityStatus.kt @@ -0,0 +1,5 @@ +package org.schabi.newpipe.local.feed + +enum class StreamVisibilityStatus { + DEFAULT, HIDE_WATCHED, HIDE_PARTIALLY_WATCHED +} diff --git a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java index b8d2eae2d97..be3ab367436 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java @@ -87,7 +87,7 @@ public HistoryRecordManager(final Context context) { * Marks a stream item as watched such that it is hidden from the feed if watched videos are * hidden. Adds a history entry and updates the stream progress to 100%. * - * @see FeedViewModel#togglePlayedItems + * @see FeedViewModel#changeVisibilityState * @param info the item to mark as watched * @return a Maybe containing the ID of the item if successful */ diff --git a/app/src/main/res/menu/menu_feed_fragment.xml b/app/src/main/res/menu/menu_feed_fragment.xml index fc371b2fe1e..303d27b6b72 100644 --- a/app/src/main/res/menu/menu_feed_fragment.xml +++ b/app/src/main/res/menu/menu_feed_fragment.xml @@ -7,18 +7,18 @@ android:checkable="false" android:checked="false" android:icon="@drawable/ic_visibility_on" - android:title="@string/feed_toggle_show_hide_played_items" + android:title="@string/feed_change_stream_visibility_state" app:showAsAction="ifRoom"> + android:title="@string/feed_stream_visibility_show_all"/> + android:title="@string/feed_stream_visibility_hide_watched"/> + android:title="@string/feed_stream_visibility_hide_partially_watched"/> diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 83f85b93475..0bb9b21c28e 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -283,7 +283,7 @@ feed_update_threshold_key 300 - feed_show_items + feed_stream_visibility_state feed_show_future_items show_thumbnail_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 46a3cad74a0..854e0db5421 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -691,7 +691,7 @@ \nYouTube is an example of a service that offers this fast method with its RSS feed. \n \nSo the choice boils down to what you prefer: speed or precise information. - Show/hide watched items + Show/hide watched streams This content is not yet supported by NewPipe.\n\nIt will hopefully be supported in a future version. Channel\'s avatar thumbnail Created by %s @@ -759,8 +759,8 @@ Unknown quality Show future items Hide future items - Hide Watched and Partially Watched - Hide Watched - Show All + Hide Watched + Hide Fully Watched + Show All Sort \ No newline at end of file From e0ba872b66701abfdeaef02773f026ab7fe62658 Mon Sep 17 00:00:00 2001 From: Tobi Date: Fri, 3 Feb 2023 18:31:07 +0100 Subject: [PATCH 071/645] Revert "Update ExoPlayer to 2.18.2" This commit reverts 1bb166a --- app/build.gradle | 2 +- .../player/mediasource/LoadedMediaSource.java | 63 +++++++++++++++++-- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 53b1ef04e3f..cb619763b62 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,7 +102,7 @@ ext { androidxWorkVersion = '2.7.1' icepickVersion = '3.2.0' - exoPlayerVersion = '2.18.2' + exoPlayerVersion = '2.18.1' googleAutoServiceVersion = '1.0.1' groupieVersion = '2.10.1' markwonVersion = '4.6.2' diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java b/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java index 817b048f259..95524cf692a 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java @@ -1,21 +1,27 @@ package org.schabi.newpipe.player.mediasource; -import androidx.annotation.NonNull; - import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.source.CompositeMediaSource; +import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaSource; -import com.google.android.exoplayer2.source.WrappingMediaSource; +import com.google.android.exoplayer2.upstream.Allocator; +import com.google.android.exoplayer2.upstream.TransferListener; import org.schabi.newpipe.player.mediaitem.MediaItemTag; import org.schabi.newpipe.player.playqueue.PlayQueueItem; -public class LoadedMediaSource extends WrappingMediaSource implements ManagedMediaSource { +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class LoadedMediaSource extends CompositeMediaSource implements ManagedMediaSource { + private final MediaSource source; private final PlayQueueItem stream; private final MediaItem mediaItem; private final long expireTimestamp; /** - * Uses a {@link WrappingMediaSource} to wrap one child {@link MediaSource} + * Uses a {@link CompositeMediaSource} to wrap one or more child {@link MediaSource}s * containing actual media. This wrapper {@link LoadedMediaSource} holds the expiration * timestamp as a {@link ManagedMediaSource} to allow explicit playlist management under * {@link ManagedMediaSourcePlaylist}. @@ -30,7 +36,7 @@ public LoadedMediaSource(@NonNull final MediaSource source, @NonNull final MediaItemTag tag, @NonNull final PlayQueueItem stream, final long expireTimestamp) { - super(source); + this.source = source; this.stream = stream; this.expireTimestamp = expireTimestamp; @@ -45,6 +51,51 @@ private boolean isExpired() { return System.currentTimeMillis() >= expireTimestamp; } + /** + * Delegates the preparation of child {@link MediaSource}s to the + * {@link CompositeMediaSource} wrapper. Since all {@link LoadedMediaSource}s use only + * a single child media, the child id of 0 is always used (sonar doesn't like null as id here). + * + * @param mediaTransferListener A data transfer listener that will be registered by the + * {@link CompositeMediaSource} for child source preparation. + */ + @Override + protected void prepareSourceInternal(@Nullable final TransferListener mediaTransferListener) { + super.prepareSourceInternal(mediaTransferListener); + prepareChildSource(0, source); + } + + /** + * When any child {@link MediaSource} is prepared, the refreshed {@link Timeline} can + * be listened to here. But since {@link LoadedMediaSource} has only a single child source, + * this method is called only once until {@link #releaseSourceInternal()} is called. + *

+ * On refresh, the {@link CompositeMediaSource} delegate will be notified with the + * new {@link Timeline}, otherwise {@link #createPeriod(MediaPeriodId, Allocator, long)} + * will not be called and playback may be stalled. + * + * @param id The unique id used to prepare the child source. + * @param mediaSource The child source whose source info has been refreshed. + * @param timeline The new timeline of the child source. + */ + @Override + protected void onChildSourceInfoRefreshed(final Integer id, + final MediaSource mediaSource, + final Timeline timeline) { + refreshSourceInfo(timeline); + } + + @Override + public MediaPeriod createPeriod(final MediaPeriodId id, final Allocator allocator, + final long startPositionUs) { + return source.createPeriod(id, allocator, startPositionUs); + } + + @Override + public void releasePeriod(final MediaPeriod mediaPeriod) { + source.releasePeriod(mediaPeriod); + } + @NonNull @Override public MediaItem getMediaItem() { From 1db1a0058106af6b4b2c7e850a370c32f899e019 Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 20 Jan 2023 18:39:16 +0100 Subject: [PATCH 072/645] Add snippet to ensure baseline.profm file is sorted Thanks to obfusk, see https://issuetracker.google.com/issues/231837768 and #6486 --- app/build.gradle | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 53b1ef04e3f..69484304cd8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,3 +1,7 @@ +import com.android.tools.profgen.ArtProfileKt +import com.android.tools.profgen.ArtProfileSerializer +import com.android.tools.profgen.DexFile + plugins { id "com.android.application" id "kotlin-android" @@ -308,3 +312,24 @@ static String getGitWorkingBranch() { return "" } } + +project.afterEvaluate { + tasks.compileReleaseArtProfile.doLast { + outputs.files.each { file -> + if (file.toString().endsWith(".profm")) { + println("Sorting ${file} ...") + def version = ArtProfileSerializer.valueOf("METADATA_0_0_2") + def profile = ArtProfileKt.ArtProfile(file) + def keys = new ArrayList(profile.profileData.keySet()) + def sortedData = new LinkedHashMap() + Collections.sort keys, new DexFile.Companion() + keys.each { key -> sortedData[key] = profile.profileData[key] } + new FileOutputStream(file).with { + write(version.magicBytes$profgen) + write(version.versionBytes$profgen) + version.write$profgen(it, sortedData, "") + } + } + } + } +} From 812efca08e9887f763ae1ce957343cad9f2ce6df Mon Sep 17 00:00:00 2001 From: TobiGr Date: Fri, 3 Feb 2023 18:42:12 +0100 Subject: [PATCH 073/645] Update core libraray desugaring libs from 2.0.0 to 2.0.2 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 69484304cd8..7f51f858240 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -183,7 +183,7 @@ sonar { dependencies { /** Desugaring **/ - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.0' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.2' /** NewPipe libraries **/ // You can use a local version by uncommenting a few lines in settings.gradle From cd8d57040cfaeea1cc97ad4dba9023ff599e16bb Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Sat, 4 Feb 2023 18:48:27 +0100 Subject: [PATCH 074/645] Implemented the feature using multiple checkboxes --- .../newpipe/database/feed/dao/FeedDAO.kt | 2 + .../schabi/newpipe/local/feed/FeedFragment.kt | 116 +++++++----------- .../newpipe/local/feed/FeedViewModel.kt | 102 +++++++-------- .../local/feed/StreamVisibilityStatus.kt | 5 - .../local/history/HistoryRecordManager.java | 2 +- app/src/main/res/menu/menu_feed_fragment.xml | 26 +--- app/src/main/res/values/settings_keys.xml | 3 +- app/src/main/res/values/strings.xml | 9 +- 8 files changed, 107 insertions(+), 158 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/local/feed/StreamVisibilityStatus.kt diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt index a53e5cac139..42a248ca5a3 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt @@ -73,6 +73,8 @@ abstract class FeedDAO { OR sst.stream_id IS NULL OR (sst.progress_time <= ${StreamStateEntity.PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS} AND sst.progress_time <= s.duration * 1000 / 4) + OR (sst.progress_time >= s.duration * 1000 - ${StreamStateEntity.PLAYBACK_FINISHED_END_MILLISECONDS} + OR sst.progress_time >= s.duration * 1000 * 3 / 4) ) AND ( :uploadDateBefore IS NULL diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index 9358c1654c0..d2c3616629c 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -37,7 +37,6 @@ import android.view.View import android.view.ViewGroup import android.widget.Button import androidx.appcompat.app.AlertDialog -import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.edit import androidx.core.math.MathUtils import androidx.core.os.bundleOf @@ -100,13 +99,10 @@ class FeedFragment : BaseStateFragment() { private var oldestSubscriptionUpdate: OffsetDateTime? = null private lateinit var groupAdapter: GroupieAdapter - @State @JvmField var feedVisibilityStatus: StreamVisibilityStatus = StreamVisibilityStatus.DEFAULT + @State @JvmField var showPlayedItems: Boolean = true + @State @JvmField var showPartiallyPlayedItems: Boolean = true @State @JvmField var showFutureItems: Boolean = true - private lateinit var showAllMenuItem: MenuItem - private lateinit var hideWatchedMenuItem: MenuItem - private lateinit var hidePartiallyWatchedMenuItem: MenuItem - private var onSettingsChangeListener: SharedPreferences.OnSharedPreferenceChangeListener? = null private var updateListViewModeOnResume = false private var isRefreshing = false @@ -144,7 +140,8 @@ class FeedFragment : BaseStateFragment() { val factory = FeedViewModel.getFactory(requireContext(), groupId) viewModel = ViewModelProvider(this, factory)[FeedViewModel::class.java] - feedVisibilityStatus = viewModel.getItemsVisibilityFromPreferences() + showPlayedItems = viewModel.getShowPlayedItemsFromPreferences() + showPartiallyPlayedItems = viewModel.getShowPartiallyPlayedItemsFromPreferences() showFutureItems = viewModel.getShowFutureItemsFromPreferences() viewModel.stateLiveData.observe(viewLifecycleOwner) { it?.let(::handleResult) } @@ -220,16 +217,10 @@ class FeedFragment : BaseStateFragment() { activity.supportActionBar?.subtitle = groupName inflater.inflate(R.menu.menu_feed_fragment, menu) - - val itemVisibilityMenu = menu.findItem(R.id.menu_item_feed_toggle_played_items).subMenu - if (itemVisibilityMenu != null) { - showAllMenuItem = itemVisibilityMenu.findItem(R.id.menu_item_feed_toggle_show_all_items) - hideWatchedMenuItem = itemVisibilityMenu.findItem(R.id.menu_item_feed_toggle_show_played_items) - hidePartiallyWatchedMenuItem = itemVisibilityMenu.findItem(R.id.menu_item_feed_toggle_partially_played_items) - } - - updateItemVisibilityMenu(menu.findItem(R.id.menu_item_feed_toggle_played_items)) - updateToggleFutureItemsButton(menu.findItem(R.id.menu_item_feed_toggle_future_items)) + MenuItemCompat.setTooltipText( + menu.findItem(R.id.menu_item_feed_toggle_played_items), + getString(R.string.feed_show_hide_streams) + ) } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -254,27 +245,44 @@ class FeedFragment : BaseStateFragment() { .create() .show() return true - } else if (item.itemId == R.id.menu_item_feed_toggle_show_all_items) { - changeItemsVisibilityStatus(item, StreamVisibilityStatus.DEFAULT) - } else if (item.itemId == R.id.menu_item_feed_toggle_show_played_items) { - changeItemsVisibilityStatus(item, StreamVisibilityStatus.HIDE_WATCHED) - } else if (item.itemId == R.id.menu_item_feed_toggle_partially_played_items) { - changeItemsVisibilityStatus(item, StreamVisibilityStatus.HIDE_PARTIALLY_WATCHED) - } else if (item.itemId == R.id.menu_item_feed_toggle_future_items) { - showFutureItems = !item.isChecked - updateToggleFutureItemsButton(item) - viewModel.toggleFutureItems(showFutureItems) - viewModel.saveShowFutureItemsToPreferences(showFutureItems) + } else if (item.itemId == R.id.menu_item_feed_toggle_played_items) { + showStreamVisibilityDialog() } return super.onOptionsItemSelected(item) } - private fun changeItemsVisibilityStatus(item: MenuItem, streamVisibilityStatus: StreamVisibilityStatus) { - feedVisibilityStatus = streamVisibilityStatus - viewModel.changeVisibilityState(feedVisibilityStatus) - updateItemVisibilityMenu(item) - viewModel.saveStreamVisibilityStateToPreferences(feedVisibilityStatus) + private fun showStreamVisibilityDialog() { + val dialogItems = arrayOf( + getString(R.string.feed_show_watched), + getString(R.string.feed_show_partially_watched), + getString(R.string.feed_show_upcoming) + ) + + val checkedDialogItems = booleanArrayOf(!showPlayedItems, !showPartiallyPlayedItems, !showFutureItems) + + val builder = AlertDialog.Builder(context!!) + builder.setTitle(R.string.feed_hide_streams_title) + builder.setMultiChoiceItems(dialogItems, checkedDialogItems) { _, which, isChecked -> + checkedDialogItems[which] = isChecked + } + + builder.setPositiveButton(R.string.ok) { _, _ -> + showPlayedItems = !checkedDialogItems[0] + viewModel.setShowPlayedItems(showPlayedItems) + viewModel.saveShowPlayedItemsToPreferences(showPlayedItems) + + showPartiallyPlayedItems = !checkedDialogItems[1] + viewModel.setShowPartiallyPlayedItems(showPartiallyPlayedItems) + viewModel.saveShowPartiallyPlayedItemsToPreferences(showPartiallyPlayedItems) + + showFutureItems = !checkedDialogItems[2] + viewModel.setShowFutureItems(showFutureItems) + viewModel.saveShowFutureItemsToPreferences(showFutureItems) + } + builder.setNegativeButton(R.string.cancel, null) + + builder.create().show() } override fun onDestroyOptionsMenu() { @@ -303,48 +311,6 @@ class FeedFragment : BaseStateFragment() { super.onDestroyView() } - private fun updateItemVisibilityMenu(menuItem: MenuItem) { - when (feedVisibilityStatus) { - StreamVisibilityStatus.DEFAULT -> { - showAllMenuItem.isVisible = false - hideWatchedMenuItem.isVisible = true - hidePartiallyWatchedMenuItem.isVisible = true - } - StreamVisibilityStatus.HIDE_WATCHED -> { - showAllMenuItem.isVisible = true - hideWatchedMenuItem.isVisible = false - hidePartiallyWatchedMenuItem.isVisible = true - } - else -> { - showAllMenuItem.isVisible = true - hideWatchedMenuItem.isVisible = true - hidePartiallyWatchedMenuItem.isVisible = false - } - } - - MenuItemCompat.setTooltipText( - menuItem, - getString(R.string.feed_change_stream_visibility_state) - ) - } - - private fun updateToggleFutureItemsButton(menuItem: MenuItem) { - menuItem.isChecked = showFutureItems - menuItem.icon = AppCompatResources.getDrawable( - requireContext(), - if (showFutureItems) R.drawable.ic_history_future else R.drawable.ic_history - ) - MenuItemCompat.setTooltipText( - menuItem, - getString( - if (showFutureItems) - R.string.feed_toggle_hide_future_items - else - R.string.feed_toggle_show_future_items - ) - ) - } - // ////////////////////////////////////////////////////////////////////////// // Handling // ////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt index 46c3443a889..2e85a65cbe0 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt @@ -11,7 +11,7 @@ import androidx.lifecycle.viewmodel.viewModelFactory import androidx.preference.PreferenceManager import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable -import io.reactivex.rxjava3.functions.Function5 +import io.reactivex.rxjava3.functions.Function6 import io.reactivex.rxjava3.processors.BehaviorProcessor import io.reactivex.rxjava3.schedulers.Schedulers import org.schabi.newpipe.App @@ -31,18 +31,24 @@ import java.util.concurrent.TimeUnit class FeedViewModel( private val application: Application, groupId: Long = FeedGroupEntity.GROUP_ALL_ID, - initialStreamVisibility: StreamVisibilityStatus = StreamVisibilityStatus.DEFAULT, + initialShowPlayedItems: Boolean = true, + initialShowPartiallyPlayedItems: Boolean = true, initialShowFutureItems: Boolean = true ) : ViewModel() { private val feedDatabaseManager = FeedDatabaseManager(application) - private val streamVisibilityState = BehaviorProcessor.create() - private val streamVisibilityStateFlowable = streamVisibilityState - .startWithItem(initialStreamVisibility) + private val showPlayedItems = BehaviorProcessor.create() + private val showPlayedItemsFlowable = showPlayedItems + .startWithItem(initialShowPlayedItems) .distinctUntilChanged() - private val toggleShowFutureItems = BehaviorProcessor.create() - private val toggleShowFutureItemsFlowable = toggleShowFutureItems + private val showPartiallyPlayedItems = BehaviorProcessor.create() + private val showPartiallyPlayedItemsFlowable = showPartiallyPlayedItems + .startWithItem(initialShowPartiallyPlayedItems) + .distinctUntilChanged() + + private val showFutureItems = BehaviorProcessor.create() + private val showFutureItemsFlowable = showFutureItems .startWithItem(initialShowFutureItems) .distinctUntilChanged() @@ -52,35 +58,27 @@ class FeedViewModel( private var combineDisposable = Flowable .combineLatest( FeedEventManager.events(), - streamVisibilityStateFlowable, - toggleShowFutureItemsFlowable, + showPlayedItemsFlowable, + showPartiallyPlayedItemsFlowable, + showFutureItemsFlowable, feedDatabaseManager.notLoadedCount(groupId), feedDatabaseManager.oldestSubscriptionUpdate(groupId), - Function5 { t1: FeedEventManager.Event, t2: StreamVisibilityStatus, t3: Boolean, - t4: Long, t5: List -> - return@Function5 CombineResultEventHolder(t1, t2, t3, t4, t5.firstOrNull()) + Function6 { t1: FeedEventManager.Event, t2: Boolean, t3: Boolean, t4: Boolean, + t5: Long, t6: List -> + return@Function6 CombineResultEventHolder(t1, t2, t3, t4, t5, t6.firstOrNull()) } ) .throttleLatest(DEFAULT_THROTTLE_TIMEOUT, TimeUnit.MILLISECONDS) .subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) - .map { (event, showPlayedItems, showFutureItems, notLoadedCount, oldestUpdate) -> - val streamItems = if (event is SuccessResultEvent || event is IdleEvent) { + .map { (event, showPlayedItems, showPartiallyPlayedItems, showFutureItems, notLoadedCount, oldestUpdate) -> + val streamItems = if (event is SuccessResultEvent || event is IdleEvent) feedDatabaseManager - .getStreams( - groupId, - !( - showPlayedItems == StreamVisibilityStatus.HIDE_WATCHED || - showPlayedItems == StreamVisibilityStatus.HIDE_PARTIALLY_WATCHED - ), - showPlayedItems != StreamVisibilityStatus.HIDE_PARTIALLY_WATCHED, - showFutureItems - ) + .getStreams(groupId, showPlayedItems, showPartiallyPlayedItems, showFutureItems) .blockingGet(arrayListOf()) - } else { + else arrayListOf() - } CombineResultDataHolder(event, streamItems, notLoadedCount, oldestUpdate) } @@ -107,10 +105,11 @@ class FeedViewModel( private data class CombineResultEventHolder( val t1: FeedEventManager.Event, - val t2: StreamVisibilityStatus, + val t2: Boolean, val t3: Boolean, - val t4: Long, - val t5: OffsetDateTime? + val t4: Boolean, + val t5: Long, + val t6: OffsetDateTime? ) private data class CombineResultDataHolder( @@ -120,23 +119,32 @@ class FeedViewModel( val t4: OffsetDateTime? ) - fun changeVisibilityState(streamVisibilityStatus: StreamVisibilityStatus) { - streamVisibilityState.onNext(streamVisibilityStatus) + fun setShowPlayedItems(showPlayedItems: Boolean) { + this.showPlayedItems.onNext(showPlayedItems) } - fun saveStreamVisibilityStateToPreferences(streamVisibilityStatus: StreamVisibilityStatus) = + fun saveShowPlayedItemsToPreferences(showPlayedItems: Boolean) = PreferenceManager.getDefaultSharedPreferences(application).edit { - this.putString( - application.getString(R.string.feed_stream_visibility_state_key), - streamVisibilityStatus.toString() - ) + this.putBoolean(application.getString(R.string.feed_show_watched_items_key), showPlayedItems) this.apply() } - fun getItemsVisibilityFromPreferences() = getStreamVisibilityStateFromPreferences(application) + fun getShowPlayedItemsFromPreferences() = getShowPlayedItemsFromPreferences(application) - fun toggleFutureItems(showFutureItems: Boolean) { - toggleShowFutureItems.onNext(showFutureItems) + fun setShowPartiallyPlayedItems(showPartiallyPlayedItems: Boolean) { + this.showPartiallyPlayedItems.onNext(showPartiallyPlayedItems) + } + + fun saveShowPartiallyPlayedItemsToPreferences(showPartiallyPlayedItems: Boolean) = + PreferenceManager.getDefaultSharedPreferences(application).edit { + this.putBoolean(application.getString(R.string.feed_show_partially_watched_items_key), showPartiallyPlayedItems) + this.apply() + } + + fun getShowPartiallyPlayedItemsFromPreferences() = getShowPartiallyPlayedItemsFromPreferences(application) + + fun setShowFutureItems(showFutureItems: Boolean) { + this.showFutureItems.onNext(showFutureItems) } fun saveShowFutureItemsToPreferences(showFutureItems: Boolean) = @@ -148,16 +156,13 @@ class FeedViewModel( fun getShowFutureItemsFromPreferences() = getShowFutureItemsFromPreferences(application) companion object { + private fun getShowPlayedItemsFromPreferences(context: Context) = + PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.feed_show_watched_items_key), true) - private fun getStreamVisibilityStateFromPreferences(context: Context): StreamVisibilityStatus { - val s = PreferenceManager.getDefaultSharedPreferences(context) - .getString( - context.getString(R.string.feed_stream_visibility_state_key), - StreamVisibilityStatus.DEFAULT.toString() - ) ?: StreamVisibilityStatus.DEFAULT.toString() - return StreamVisibilityStatus.valueOf(s) - } - + private fun getShowPartiallyPlayedItemsFromPreferences(context: Context) = + PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.feed_show_partially_watched_items_key), true) private fun getShowFutureItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(context.getString(R.string.feed_show_future_items_key), true) @@ -167,7 +172,8 @@ class FeedViewModel( App.getApp(), groupId, // Read initial value from preferences - getStreamVisibilityStateFromPreferences(context.applicationContext), + getShowPlayedItemsFromPreferences(context.applicationContext), + getShowPartiallyPlayedItemsFromPreferences(context.applicationContext), getShowFutureItemsFromPreferences(context.applicationContext) ) } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/StreamVisibilityStatus.kt b/app/src/main/java/org/schabi/newpipe/local/feed/StreamVisibilityStatus.kt deleted file mode 100644 index 956594ef30f..00000000000 --- a/app/src/main/java/org/schabi/newpipe/local/feed/StreamVisibilityStatus.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.schabi.newpipe.local.feed - -enum class StreamVisibilityStatus { - DEFAULT, HIDE_WATCHED, HIDE_PARTIALLY_WATCHED -} diff --git a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java index be3ab367436..340b2227863 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java @@ -87,7 +87,7 @@ public HistoryRecordManager(final Context context) { * Marks a stream item as watched such that it is hidden from the feed if watched videos are * hidden. Adds a history entry and updates the stream progress to 100%. * - * @see FeedViewModel#changeVisibilityState + * @see FeedViewModel#setShowPlayedItems * @param info the item to mark as watched * @return a Maybe containing the ID of the item if successful */ diff --git a/app/src/main/res/menu/menu_feed_fragment.xml b/app/src/main/res/menu/menu_feed_fragment.xml index 303d27b6b72..2365c30e46a 100644 --- a/app/src/main/res/menu/menu_feed_fragment.xml +++ b/app/src/main/res/menu/menu_feed_fragment.xml @@ -4,31 +4,9 @@ - - - - - - - - feed_update_threshold_key 300 - feed_stream_visibility_state + feed_show_watched_items + feed_show_partially_watched_items feed_show_future_items show_thumbnail_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 854e0db5421..e01d3ed72ce 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -691,7 +691,8 @@ \nYouTube is an example of a service that offers this fast method with its RSS feed. \n \nSo the choice boils down to what you prefer: speed or precise information. - Show/hide watched streams + Hide the following streams + Show/Hide streams This content is not yet supported by NewPipe.\n\nIt will hopefully be supported in a future version. Channel\'s avatar thumbnail Created by %s @@ -759,8 +760,8 @@ Unknown quality Show future items Hide future items - Hide Watched - Hide Fully Watched - Show All + Fully Watched + Partially Watched + Upcoming Sort \ No newline at end of file From 68097568d505ec3fc3a2208780d596f1aa318d65 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Sun, 5 Feb 2023 20:32:34 +0100 Subject: [PATCH 075/645] Fixed the bug by replacing the thumbnail_url with the thumbnail_stream_id --- .../7.json | 737 ++++++++++++++++++ .../newpipe/database/DatabaseMigrationTest.kt | 7 + .../org/schabi/newpipe/NewPipeDatabase.java | 3 +- .../schabi/newpipe/database/AppDatabase.java | 4 +- .../schabi/newpipe/database/Migrations.java | 42 + .../playlist/dao/PlaylistStreamDAO.java | 20 +- .../playlist/model/PlaylistEntity.java | 26 +- .../local/bookmark/BookmarkFragment.java | 6 +- .../local/dialog/PlaylistAppendDialog.java | 21 +- .../local/playlist/LocalPlaylistFragment.java | 31 +- .../local/playlist/LocalPlaylistManager.java | 57 +- 11 files changed, 885 insertions(+), 69 deletions(-) create mode 100644 app/schemas/org.schabi.newpipe.database.AppDatabase/7.json diff --git a/app/schemas/org.schabi.newpipe.database.AppDatabase/7.json b/app/schemas/org.schabi.newpipe.database.AppDatabase/7.json new file mode 100644 index 00000000000..a14f8b9a8fd --- /dev/null +++ b/app/schemas/org.schabi.newpipe.database.AppDatabase/7.json @@ -0,0 +1,737 @@ +{ + "formatVersion": 1, + "database": { + "version": 7, + "identityHash": "012fc8e7ad3333f1597347f34e76a513", + "entities": [ + { + "tableName": "subscriptions", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT, `name` TEXT, `avatar_url` TEXT, `subscriber_count` INTEGER, `description` TEXT, `notification_mode` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "avatarUrl", + "columnName": "avatar_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "subscriberCount", + "columnName": "subscriber_count", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "notificationMode", + "columnName": "notification_mode", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_subscriptions_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "search_history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "creationDate", + "columnName": "creation_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "search", + "columnName": "search", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_search_history_search", + "unique": false, + "columnNames": [ + "search" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "streams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `stream_type` TEXT NOT NULL, `duration` INTEGER NOT NULL, `uploader` TEXT NOT NULL, `uploader_url` TEXT, `thumbnail_url` TEXT, `view_count` INTEGER, `textual_upload_date` TEXT, `upload_date` INTEGER, `is_upload_date_approximation` INTEGER)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "streamType", + "columnName": "stream_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "duration", + "columnName": "duration", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "uploader", + "columnName": "uploader", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "uploaderUrl", + "columnName": "uploader_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "viewCount", + "columnName": "view_count", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "textualUploadDate", + "columnName": "textual_upload_date", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uploadDate", + "columnName": "upload_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "isUploadDateApproximation", + "columnName": "is_upload_date_approximation", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_streams_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "stream_history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, `repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "accessDate", + "columnName": "access_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatCount", + "columnName": "repeat_count", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "stream_id", + "access_date" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_stream_history_stream_id", + "unique": false, + "columnNames": [ + "stream_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)" + } + ], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "stream_state", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "progressMillis", + "columnName": "progress_time", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "stream_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "playlists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL, `thumbnail_stream_id` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isThumbnailPermanent", + "columnName": "is_thumbnail_permanent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "thumbnailStreamId", + "columnName": "thumbnail_stream_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_playlists_name", + "unique": false, + "columnNames": [ + "name" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_playlists_name` ON `${TABLE_NAME}` (`name`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "playlist_stream_join", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, `join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "playlistUid", + "columnName": "playlist_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "index", + "columnName": "join_index", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "playlist_id", + "join_index" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_playlist_stream_join_playlist_id_join_index", + "unique": true, + "columnNames": [ + "playlist_id", + "join_index" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)" + }, + { + "name": "index_playlist_stream_join_stream_id", + "unique": false, + "columnNames": [ + "stream_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)" + } + ], + "foreignKeys": [ + { + "table": "playlists", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "playlist_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "remote_playlists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, `thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uploader", + "columnName": "uploader", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "streamCount", + "columnName": "stream_count", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_remote_playlists_name", + "unique": false, + "columnNames": [ + "name" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)" + }, + { + "name": "index_remote_playlists_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "feed", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `subscription_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "streamId", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "stream_id", + "subscription_id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_feed_subscription_id", + "unique": false, + "columnNames": [ + "subscription_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)" + } + ], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "feed_group", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `icon_id` INTEGER NOT NULL, `sort_order` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "icon", + "columnName": "icon_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sortOrder", + "columnName": "sort_order", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_feed_group_sort_order", + "unique": false, + "columnNames": [ + "sort_order" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "feed_group_subscription_join", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`group_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`group_id`, `subscription_id`), FOREIGN KEY(`group_id`) REFERENCES `feed_group`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "feedGroupId", + "columnName": "group_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "group_id", + "subscription_id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_feed_group_subscription_join_subscription_id", + "unique": false, + "columnNames": [ + "subscription_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)" + } + ], + "foreignKeys": [ + { + "table": "feed_group", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "group_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "feed_last_updated", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`subscription_id` INTEGER NOT NULL, `last_updated` INTEGER, PRIMARY KEY(`subscription_id`), FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastUpdated", + "columnName": "last_updated", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "subscription_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [ + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '012fc8e7ad3333f1597347f34e76a513')" + ] + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt index be95c8e277c..5e9fc6d9e31 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt @@ -101,6 +101,13 @@ class DatabaseMigrationTest { Migrations.MIGRATION_5_6 ) + testHelper.runMigrationsAndValidate( + AppDatabase.DATABASE_NAME, + Migrations.DB_VER_7, + true, + Migrations.MIGRATION_6_7 + ) + val migratedDatabaseV3 = getMigratedDatabase() val listFromDB = migratedDatabaseV3.streamDAO().all.blockingFirst() diff --git a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java index fc3423994e8..856fbff8b6d 100644 --- a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java +++ b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java @@ -6,6 +6,7 @@ import static org.schabi.newpipe.database.Migrations.MIGRATION_3_4; import static org.schabi.newpipe.database.Migrations.MIGRATION_4_5; import static org.schabi.newpipe.database.Migrations.MIGRATION_5_6; +import static org.schabi.newpipe.database.Migrations.MIGRATION_6_7; import android.content.Context; import android.database.Cursor; @@ -26,7 +27,7 @@ private static AppDatabase getDatabase(final Context context) { return Room .databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME) .addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5, - MIGRATION_5_6) + MIGRATION_5_6, MIGRATION_6_7) .build(); } diff --git a/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java b/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java index 563e80b1780..03e39cd4395 100644 --- a/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java +++ b/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java @@ -1,6 +1,6 @@ package org.schabi.newpipe.database; -import static org.schabi.newpipe.database.Migrations.DB_VER_6; +import static org.schabi.newpipe.database.Migrations.DB_VER_7; import androidx.room.Database; import androidx.room.RoomDatabase; @@ -38,7 +38,7 @@ FeedEntity.class, FeedGroupEntity.class, FeedGroupSubscriptionEntity.class, FeedLastUpdatedEntity.class }, - version = DB_VER_6 + version = DB_VER_7 ) public abstract class AppDatabase extends RoomDatabase { public static final String DATABASE_NAME = "newpipe.db"; diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.java b/app/src/main/java/org/schabi/newpipe/database/Migrations.java index e301e3f1f80..e995fdd6cdf 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Migrations.java +++ b/app/src/main/java/org/schabi/newpipe/database/Migrations.java @@ -24,6 +24,7 @@ public final class Migrations { public static final int DB_VER_4 = 4; public static final int DB_VER_5 = 5; public static final int DB_VER_6 = 6; + public static final int DB_VER_7 = 7; private static final String TAG = Migrations.class.getName(); public static final boolean DEBUG = MainActivity.DEBUG; @@ -197,6 +198,47 @@ public void migrate(@NonNull final SupportSQLiteDatabase database) { } }; + public static final Migration MIGRATION_6_7 = new Migration(DB_VER_6, DB_VER_7) { + @Override + public void migrate(@NonNull final SupportSQLiteDatabase database) { + // Create a new column thumbnail_stream_id + database.execSQL("ALTER TABLE `playlists` ADD COLUMN `thumbnail_stream_id` " + + "INTEGER NOT NULL DEFAULT -1"); + + // Migrate the thumbnail_url to the thumbnail_stream_id + database.execSQL("CREATE TEMPORARY TABLE temporary_table AS" + + " SELECT p.uid AS playlist_uid, s.uid AS stream_uid" + + " FROM playlists p" + + " LEFT JOIN playlist_stream_join ps ON p.uid = ps.playlist_id" + + " LEFT JOIN streams s ON s.uid = ps.stream_id" + + " WHERE s.thumbnail_url = p.thumbnail_url"); + + database.execSQL("UPDATE playlists SET thumbnail_stream_id = (" + + "SELECT CASE WHEN COUNT(*) != 0 then stream_uid ELSE -1 END " + + "FROM temporary_table " + + "WHERE playlist_uid = playlists.uid)"); + + database.execSQL("DROP TABLE temporary_table"); + + // Remove the thumbnail_url field in the playlist table + database.execSQL("CREATE TABLE IF NOT EXISTS `playlists_new`" + + "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "name TEXT, " + + "is_thumbnail_permanent INTEGER NOT NULL, " + + "thumbnail_stream_id INTEGER NOT NULL)"); + + database.execSQL("INSERT INTO playlists_new" + + " SELECT uid, name, is_thumbnail_permanent, thumbnail_stream_id " + + " FROM playlists"); + + + database.execSQL("DROP TABLE playlists"); + database.execSQL("ALTER TABLE playlists_new RENAME TO playlists"); + database.execSQL("CREATE INDEX IF NOT EXISTS " + + "`index_playlists_name` ON `playlists` (`name`)"); + } + }; + private Migrations() { } } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java index 2036dc2057c..3412e1303ba 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java @@ -15,9 +15,11 @@ import io.reactivex.rxjava3.core.Flowable; import static org.schabi.newpipe.database.playlist.PlaylistMetadataEntry.PLAYLIST_STREAM_COUNT; +import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.DEFAULT_THUMBNAIL; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_ID; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_NAME; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_TABLE; +import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_STREAM_ID; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_THUMBNAIL_URL; import static org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.JOIN_INDEX; import static org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.JOIN_PLAYLIST_ID; @@ -54,14 +56,14 @@ default Flowable> listByService(final int serviceId) + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId") Flowable getMaximumIndexOf(long playlistId); - @Query("SELECT CASE WHEN COUNT(*) != 0 then " + STREAM_THUMBNAIL_URL + " ELSE :defaultUrl END" + @Query("SELECT CASE WHEN COUNT(*) != 0 then " + STREAM_ID + " ELSE -1 END" + " FROM " + STREAM_TABLE + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId " + " LIMIT 1" ) - Flowable getAutomaticThumbnailUrl(long playlistId, String defaultUrl); + Flowable getAutomaticThumbnailUrl(long playlistId); @RewriteQueriesToDropUnusedColumns @Transaction @@ -84,12 +86,20 @@ default Flowable> listByService(final int serviceId) Flowable> getOrderedStreamsOf(long playlistId); @Transaction - @Query("SELECT " + PLAYLIST_ID + ", " + PLAYLIST_NAME + ", " + PLAYLIST_THUMBNAIL_URL + ", " - + "COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT + @Query("SELECT " + PLAYLIST_ID + ", " + PLAYLIST_NAME + "," + + + " CASE WHEN " + PLAYLIST_THUMBNAIL_STREAM_ID + " = -1" + + " THEN " + "'" + DEFAULT_THUMBNAIL + "'" + + " ELSE (SELECT " + STREAM_THUMBNAIL_URL + + " FROM " + STREAM_TABLE + + " WHERE " + STREAM_TABLE + "." + STREAM_ID + " = " + PLAYLIST_THUMBNAIL_STREAM_ID + + " ) END AS " + PLAYLIST_THUMBNAIL_URL + ", " + + PLAYLIST_NAME + ", " + + "COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT + " FROM " + PLAYLIST_TABLE + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE - + " ON " + PLAYLIST_ID + " = " + JOIN_PLAYLIST_ID + + " ON " + PLAYLIST_TABLE + "." + PLAYLIST_ID + " = " + JOIN_PLAYLIST_ID + " GROUP BY " + PLAYLIST_ID + " ORDER BY " + PLAYLIST_NAME + " COLLATE NOCASE ASC") Flowable> getPlaylistMetadata(); diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java index 086362da22d..6c1d96d4165 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java @@ -8,14 +8,20 @@ import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_NAME; import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_TABLE; +import org.schabi.newpipe.R; + @Entity(tableName = PLAYLIST_TABLE, indices = {@Index(value = {PLAYLIST_NAME})}) public class PlaylistEntity { + + public static final String DEFAULT_THUMBNAIL = "drawable://" + + R.drawable.placeholder_thumbnail_playlist; public static final String PLAYLIST_TABLE = "playlists"; public static final String PLAYLIST_ID = "uid"; public static final String PLAYLIST_NAME = "name"; public static final String PLAYLIST_THUMBNAIL_URL = "thumbnail_url"; public static final String PLAYLIST_THUMBNAIL_PERMANENT = "is_thumbnail_permanent"; + public static final String PLAYLIST_THUMBNAIL_STREAM_ID = "thumbnail_stream_id"; @PrimaryKey(autoGenerate = true) @ColumnInfo(name = PLAYLIST_ID) @@ -24,17 +30,17 @@ public class PlaylistEntity { @ColumnInfo(name = PLAYLIST_NAME) private String name; - @ColumnInfo(name = PLAYLIST_THUMBNAIL_URL) - private String thumbnailUrl; - @ColumnInfo(name = PLAYLIST_THUMBNAIL_PERMANENT) private boolean isThumbnailPermanent; - public PlaylistEntity(final String name, final String thumbnailUrl, - final boolean isThumbnailPermanent) { + @ColumnInfo(name = PLAYLIST_THUMBNAIL_STREAM_ID) + private long thumbnailStreamId; + + public PlaylistEntity(final String name, final boolean isThumbnailPermanent, + final long thumbnailStreamId) { this.name = name; - this.thumbnailUrl = thumbnailUrl; this.isThumbnailPermanent = isThumbnailPermanent; + this.thumbnailStreamId = thumbnailStreamId; } public long getUid() { @@ -53,12 +59,12 @@ public void setName(final String name) { this.name = name; } - public String getThumbnailUrl() { - return thumbnailUrl; + public long getThumbnailStreamId() { + return thumbnailStreamId; } - public void setThumbnailUrl(final String thumbnailUrl) { - this.thumbnailUrl = thumbnailUrl; + public void setThumbnailStreamId(final long thumbnailStreamId) { + this.thumbnailStreamId = thumbnailStreamId; } public boolean getIsThumbnailPermanent() { diff --git a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java index e2f493a8a25..0969dbfcc18 100644 --- a/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java @@ -280,10 +280,10 @@ private void showLocalDialog(final PlaylistMetadataEntry selectedItem) { showDeleteDialog(selectedItem.name, localPlaylistManager.deletePlaylist(selectedItem.uid)); } else if (isThumbnailPermanent && items.get(index).equals(unsetThumbnail)) { - final String thumbnailUrl = localPlaylistManager - .getAutomaticPlaylistThumbnail(selectedItem.uid); + final long thumbnailStreamId = localPlaylistManager + .getAutomaticPlaylistThumbnailStreamId(selectedItem.uid); localPlaylistManager - .changePlaylistThumbnail(selectedItem.uid, thumbnailUrl, false) + .changePlaylistThumbnail(selectedItem.uid, thumbnailStreamId, false) .observeOn(AndroidSchedulers.mainThread()) .subscribe(); } diff --git a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java index 88dec3911a5..2fdaa4ed03e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java +++ b/app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java @@ -14,6 +14,7 @@ import org.schabi.newpipe.NewPipeDatabase; import org.schabi.newpipe.R; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; +import org.schabi.newpipe.database.playlist.model.PlaylistEntity; import org.schabi.newpipe.database.stream.model.StreamEntity; import org.schabi.newpipe.local.LocalItemListAdapter; import org.schabi.newpipe.local.playlist.LocalPlaylistManager; @@ -131,17 +132,19 @@ private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager, final Toast successToast = Toast.makeText(getContext(), R.string.playlist_add_stream_success, Toast.LENGTH_SHORT); - if (playlist.thumbnailUrl - .equals("drawable://" + R.drawable.placeholder_thumbnail_playlist)) { - playlistDisposables.add(manager - .changePlaylistThumbnail(playlist.uid, streams.get(0).getThumbnailUrl(), false) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(ignored -> successToast.show())); - } - playlistDisposables.add(manager.appendToPlaylist(playlist.uid, streams) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(ignored -> successToast.show())); + .subscribe(ignored -> { + successToast.show(); + + if (playlist.thumbnailUrl.equals(PlaylistEntity.DEFAULT_THUMBNAIL)) { + playlistDisposables.add(manager + .changePlaylistThumbnail(playlist.uid, streams.get(0).getUid(), + false) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(ignore -> successToast.show())); + } + })); requireDialog().dismiss(); } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 68a35e72b2e..a3648c3c2fc 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -70,6 +70,8 @@ import io.reactivex.rxjava3.subjects.PublishSubject; public class LocalPlaylistFragment extends BaseLocalListFragment, Void> { + public static final long DEFAULT_THUMBNAIL_ID = -1; + public static final long NO_THUMBNAIL_ID = -2; // Save the list 10 seconds after the last change occurred private static final long SAVE_DEBOUNCE_MILLIS = 10000; private static final int MINIMUM_INITIAL_DRAG_VELOCITY = 12; @@ -417,8 +419,8 @@ public void removeWatchedStreams(final boolean removePartiallyWatched) { if (indexInHistory < 0) { itemsToKeep.add(playlistItem); } else if (!isThumbnailPermanent && !thumbnailVideoRemoved - && playlistManager.getPlaylistThumbnail(playlistId) - .equals(playlistItem.getStreamEntity().getThumbnailUrl())) { + && playlistManager.getPlaylistThumbnailStreamId(playlistId) + == playlistItem.getStreamEntity().getUid()) { thumbnailVideoRemoved = true; } } @@ -438,8 +440,8 @@ public void removeWatchedStreams(final boolean removePartiallyWatched) { && !streamStateEntity.isFinished(duration))) { itemsToKeep.add(playlistItem); } else if (!isThumbnailPermanent && !thumbnailVideoRemoved - && playlistManager.getPlaylistThumbnail(playlistId) - .equals(playlistItem.getStreamEntity().getThumbnailUrl())) { + && playlistManager.getPlaylistThumbnailStreamId(playlistId) + == playlistItem.getStreamEntity().getUid()) { thumbnailVideoRemoved = true; } } @@ -587,7 +589,7 @@ private void changePlaylistName(final String title) { disposables.add(disposable); } - private void changeThumbnailUrl(final String thumbnailUrl, final boolean isPermanent) { + private void changeThumbnailStreamId(final long thumbnailStreamId, final boolean isPermanent) { if (playlistManager == null || (!isPermanent && playlistManager .getIsPlaylistThumbnailPermanent(playlistId))) { return; @@ -599,11 +601,11 @@ private void changeThumbnailUrl(final String thumbnailUrl, final boolean isPerma if (DEBUG) { Log.d(TAG, "Updating playlist id=[" + playlistId + "] " - + "with new thumbnail url=[" + thumbnailUrl + "]"); + + "with new thumbnail stream id=[" + thumbnailStreamId + "]"); } final Disposable disposable = playlistManager - .changePlaylistThumbnail(playlistId, thumbnailUrl, isPermanent) + .changePlaylistThumbnail(playlistId, thumbnailStreamId, isPermanent) .observeOn(AndroidSchedulers.mainThread()) .subscribe(ignore -> successToast.show(), throwable -> showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK, @@ -616,16 +618,16 @@ private void updateThumbnailUrl() { return; } - final String newThumbnailUrl; + final long thumbnailStreamId; if (!itemListAdapter.getItemsList().isEmpty()) { - newThumbnailUrl = ((PlaylistStreamEntry) itemListAdapter.getItemsList().get(0)) - .getStreamEntity().getThumbnailUrl(); + thumbnailStreamId = ((PlaylistStreamEntry) itemListAdapter.getItemsList().get(0)) + .getStreamEntity().getUid(); } else { - newThumbnailUrl = "drawable://" + R.drawable.placeholder_thumbnail_playlist; + thumbnailStreamId = DEFAULT_THUMBNAIL_ID; } - changeThumbnailUrl(newThumbnailUrl, false); + changeThumbnailStreamId(thumbnailStreamId, false); } private void deleteItem(final PlaylistStreamEntry item) { @@ -634,8 +636,7 @@ private void deleteItem(final PlaylistStreamEntry item) { } itemListAdapter.removeItem(item); - if (playlistManager.getPlaylistThumbnail(playlistId) - .equals(item.getStreamEntity().getThumbnailUrl())) { + if (playlistManager.getPlaylistThumbnailStreamId(playlistId) == item.getStreamId()) { updateThumbnailUrl(); } @@ -793,7 +794,7 @@ context, getPlayQueueStartingAt(item), true)) .setAction( StreamDialogDefaultEntry.SET_AS_PLAYLIST_THUMBNAIL, (f, i) -> - changeThumbnailUrl(item.getStreamEntity().getThumbnailUrl(), + changeThumbnailStreamId(item.getStreamEntity().getUid(), true)) .setAction( StreamDialogDefaultEntry.DELETE, diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index 4007d0e09bc..abf9c77b257 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -2,7 +2,6 @@ import androidx.annotation.Nullable; -import org.schabi.newpipe.R; import org.schabi.newpipe.database.AppDatabase; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; @@ -42,28 +41,34 @@ public Maybe> createPlaylist(final String name, final List database.runInTransaction(() -> - upsertStreams(playlistTable.insert(newPlaylist), streams, 0)) - ).subscribeOn(Schedulers.io()); + return Maybe.fromCallable(() -> database.runInTransaction(() -> { + final List streamIds = streamTable.upsertAll(streams); + newPlaylist.setThumbnailStreamId(streamIds.get(0)); + + return insertJoinEntities(playlistTable.insert(newPlaylist), + streamIds, 0); + } + )).subscribeOn(Schedulers.io()); } public Maybe> appendToPlaylist(final long playlistId, final List streams) { return playlistStreamTable.getMaximumIndexOf(playlistId) .firstElement() - .map(maxJoinIndex -> database.runInTransaction(() -> - upsertStreams(playlistId, streams, maxJoinIndex + 1)) - ).subscribeOn(Schedulers.io()); + .map(maxJoinIndex -> database.runInTransaction(() -> { + final List streamIds = streamTable.upsertAll(streams); + return insertJoinEntities(playlistId, streamIds, maxJoinIndex + 1); + } + )).subscribeOn(Schedulers.io()); } - private List upsertStreams(final long playlistId, - final List streams, - final int indexOffset) { + private List insertJoinEntities(final long playlistId, final List streamIds, + final int indexOffset) { + + final List joinEntities = new ArrayList<>(streamIds.size()); - final List joinEntities = new ArrayList<>(streams.size()); - final List streamIds = streamTable.upsertAll(streams); for (int index = 0; index < streamIds.size(); index++) { joinEntities.add(new PlaylistStreamEntity(playlistId, streamIds.get(index), index + indexOffset)); @@ -97,17 +102,17 @@ public Single deletePlaylist(final long playlistId) { } public Maybe renamePlaylist(final long playlistId, final String name) { - return modifyPlaylist(playlistId, name, null, false); + return modifyPlaylist(playlistId, name, LocalPlaylistFragment.NO_THUMBNAIL_ID, false); } public Maybe changePlaylistThumbnail(final long playlistId, - final String thumbnailUrl, + final long thumbnailStreamId, final boolean isPermanent) { - return modifyPlaylist(playlistId, null, thumbnailUrl, isPermanent); + return modifyPlaylist(playlistId, null, thumbnailStreamId, isPermanent); } - public String getPlaylistThumbnail(final long playlistId) { - return playlistTable.getPlaylist(playlistId).blockingFirst().get(0).getThumbnailUrl(); + public long getPlaylistThumbnailStreamId(final long playlistId) { + return playlistTable.getPlaylist(playlistId).blockingFirst().get(0).getThumbnailStreamId(); } public boolean getIsPlaylistThumbnailPermanent(final long playlistId) { @@ -115,14 +120,18 @@ public boolean getIsPlaylistThumbnailPermanent(final long playlistId) { .getIsThumbnailPermanent(); } - public String getAutomaticPlaylistThumbnail(final long playlistId) { - final String def = "drawable://" + R.drawable.placeholder_thumbnail_playlist; - return playlistStreamTable.getAutomaticThumbnailUrl(playlistId, def).blockingFirst(); + public long getAutomaticPlaylistThumbnailStreamId(final long playlistId) { + final long streamId = playlistStreamTable.getAutomaticThumbnailUrl(playlistId) + .blockingFirst(); + if (streamId < 0) { + return LocalPlaylistFragment.DEFAULT_THUMBNAIL_ID; + } + return streamId; } private Maybe modifyPlaylist(final long playlistId, @Nullable final String name, - @Nullable final String thumbnailUrl, + final long thumbnailStreamId, final boolean isPermanent) { return playlistTable.getPlaylist(playlistId) .firstElement() @@ -132,8 +141,8 @@ private Maybe modifyPlaylist(final long playlistId, if (name != null) { playlist.setName(name); } - if (thumbnailUrl != null) { - playlist.setThumbnailUrl(thumbnailUrl); + if (thumbnailStreamId != LocalPlaylistFragment.NO_THUMBNAIL_ID) { + playlist.setThumbnailStreamId(thumbnailStreamId); playlist.setIsThumbnailPermanent(isPermanent); } return playlistTable.update(playlist); From 5d3955854ef5e09f83b1103d7dd07670933ad498 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Sun, 5 Feb 2023 21:21:02 +0100 Subject: [PATCH 076/645] Fixed the merge conflict --- .../database/playlist/dao/PlaylistStreamDAO.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java index 459959d9997..2915e7bd312 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java @@ -110,8 +110,15 @@ default Flowable> listByService(final int serviceId) @Transaction @Query("SELECT " + PLAYLIST_TABLE + "." + PLAYLIST_ID + ", " + PLAYLIST_NAME + ", " - + PLAYLIST_TABLE + "." + PLAYLIST_THUMBNAIL_URL + ", " - + "COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT + ", " + + + " CASE WHEN " + PLAYLIST_THUMBNAIL_STREAM_ID + " = -1" + + " THEN " + "'" + DEFAULT_THUMBNAIL + "'" + + " ELSE (SELECT " + STREAM_THUMBNAIL_URL + + " FROM " + STREAM_TABLE + + " WHERE " + STREAM_TABLE + "." + STREAM_ID + " = " + PLAYLIST_THUMBNAIL_STREAM_ID + + " ) END AS " + PLAYLIST_THUMBNAIL_URL + + + ", COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT + ", " + "COALESCE(SUM(" + STREAM_URL + " = :streamUrl), 0) AS " + PLAYLIST_TIMES_STREAM_IS_CONTAINED From e947e86eae1af11027d8f57e64fa3b9433dcc8e5 Mon Sep 17 00:00:00 2001 From: Trust_04zh Date: Tue, 12 Apr 2022 15:45:35 +0800 Subject: [PATCH 077/645] Make positions in list depend on watch history, remove confusing animations The following is the list of all commits squashed together: Regain function for option `Positions in lists` use option `Resume playback` to control display of progress info in VideoDetailFragment, remove this (extra) function from option `Positions in lists`. remove extra check for live streams, live streams updates just as non-live streams. fix #8176 by eliminating exit delay Regain function for option `Positions in lists` update code with developer's comments apply static import to methods in util class DependentPreferenceHelper Regain function for option `Positions in lists` use option `Resume playback` to control display of progress info in VideoDetailFragment, remove this (extra) function from option `Positions in lists`. remove extra check for live streams, live streams updates just as non-live streams. fix behavior for displaying progress bar when autoplay off but video resume on not to retrieve unnecessary states when position in lists disabled fix mistake in code simplify conditional logic update doc comment and remove unused method Fix not showing duration if position indicators disabled Positions in lists only depends on watch history --- .../fragments/detail/VideoDetailFragment.java | 66 ++++++------------- .../holder/StreamMiniInfoItemHolder.java | 18 +++-- .../holder/LocalPlaylistStreamItemHolder.java | 7 +- .../LocalStatisticStreamItemHolder.java | 7 +- .../org/schabi/newpipe/player/Player.java | 4 +- .../newpipe/player/helper/PlayerHelper.java | 7 -- .../util/DependentPreferenceHelper.java | 51 ++++++++++++++ app/src/main/res/xml/history_settings.xml | 1 + 8 files changed, 98 insertions(+), 63 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/util/DependentPreferenceHelper.java 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 917d89e09de..d6de6dfca99 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 @@ -7,7 +7,7 @@ import static org.schabi.newpipe.ktx.ViewUtils.animateRotation; import static org.schabi.newpipe.player.helper.PlayerHelper.globalScreenOrientationLocked; import static org.schabi.newpipe.player.helper.PlayerHelper.isClearingQueueConfirmationRequired; -import static org.schabi.newpipe.player.playqueue.PlayQueueItem.RECOVERY_UNSET; +import static org.schabi.newpipe.util.DependentPreferenceHelper.getResumePlaybackEnabled; import static org.schabi.newpipe.util.ExtractorHelper.showMetaInfoInTextView; import static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams; import static org.schabi.newpipe.util.NavigationHelper.openPlayQueue; @@ -1456,8 +1456,8 @@ public void showLoading() { animate(binding.detailThumbnailPlayButton, false, 50); animate(binding.detailDurationView, false, 100); - animate(binding.detailPositionView, false, 100); - animate(binding.positionView, false, 50); + binding.detailPositionView.setVisibility(View.GONE); + binding.positionView.setVisibility(View.GONE); binding.detailVideoTitleView.setText(title); binding.detailVideoTitleView.setMaxLines(1); @@ -1574,7 +1574,7 @@ public void handleResult(@NonNull final StreamInfo info) { binding.detailToggleSecondaryControlsView.setVisibility(View.VISIBLE); binding.detailSecondaryControlPanel.setVisibility(View.GONE); - updateProgressInfo(info); + checkUpdateProgressInfo(info); initThumbnailViews(info); showMetaInfoInTextView(info.getMetaInfo(), binding.detailMetaInfoTextView, binding.detailMetaInfoSeparator, disposables); @@ -1673,67 +1673,43 @@ public void openDownloadDialog() { // Stream Results //////////////////////////////////////////////////////////////////////////*/ - private void updateProgressInfo(@NonNull final StreamInfo info) { + private void checkUpdateProgressInfo(@NonNull final StreamInfo info) { if (positionSubscriber != null) { positionSubscriber.dispose(); } - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); - final boolean playbackResumeEnabled = prefs - .getBoolean(activity.getString(R.string.enable_watch_history_key), true) - && prefs.getBoolean(activity.getString(R.string.enable_playback_resume_key), true); - final boolean showPlaybackPosition = prefs.getBoolean( - activity.getString(R.string.enable_playback_state_lists_key), true); - if (!playbackResumeEnabled) { - if (playQueue == null || playQueue.getStreams().isEmpty() - || playQueue.getItem().getRecoveryPosition() == RECOVERY_UNSET - || !showPlaybackPosition) { - binding.positionView.setVisibility(View.INVISIBLE); - binding.detailPositionView.setVisibility(View.GONE); - // TODO: Remove this check when separation of concerns is done. - // (live streams weren't getting updated because they are mixed) - if (!StreamTypeUtil.isLiveStream(info.getStreamType())) { - return; - } - } else { - // Show saved position from backStack if user allows it - showPlaybackProgress(playQueue.getItem().getRecoveryPosition(), - playQueue.getItem().getDuration() * 1000); - animate(binding.positionView, true, 500); - animate(binding.detailPositionView, true, 500); - } + if (!getResumePlaybackEnabled(activity)) { + binding.positionView.setVisibility(View.GONE); + binding.detailPositionView.setVisibility(View.GONE); return; } final HistoryRecordManager recordManager = new HistoryRecordManager(requireContext()); - - // TODO: Separate concerns when updating database data. - // (move the updating part to when the loading happens) positionSubscriber = recordManager.loadStreamState(info) .subscribeOn(Schedulers.io()) .onErrorComplete() .observeOn(AndroidSchedulers.mainThread()) .subscribe(state -> { - showPlaybackProgress(state.getProgressMillis(), info.getDuration() * 1000); - animate(binding.positionView, true, 500); - animate(binding.detailPositionView, true, 500); + updatePlaybackProgress( + state.getProgressMillis(), info.getDuration() * 1000); }, e -> { - if (DEBUG) { - e.printStackTrace(); - } + // impossible since the onErrorComplete() }, () -> { binding.positionView.setVisibility(View.GONE); binding.detailPositionView.setVisibility(View.GONE); }); } - private void showPlaybackProgress(final long progress, final long duration) { + private void updatePlaybackProgress(final long progress, final long duration) { + if (!getResumePlaybackEnabled(activity)) { + return; + } final int progressSeconds = (int) TimeUnit.MILLISECONDS.toSeconds(progress); final int durationSeconds = (int) TimeUnit.MILLISECONDS.toSeconds(duration); - // If the old and the new progress values have a big difference then use - // animation. Otherwise don't because it affects CPU - final boolean shouldAnimate = Math.abs(binding.positionView.getProgress() - - progressSeconds) > 2; + // If the old and the new progress values have a big difference then use animation. + // Otherwise don't because it affects CPU + final int progressDifference = Math.abs(binding.positionView.getProgress() + - progressSeconds); binding.positionView.setMax(durationSeconds); - if (shouldAnimate) { + if (progressDifference > 2) { binding.positionView.setProgressAnimated(progressSeconds); } else { binding.positionView.setProgress(progressSeconds); @@ -1828,7 +1804,7 @@ public void onProgressUpdate(final int currentProgress, } if (player.getPlayQueue().getItem().getUrl().equals(url)) { - showPlaybackProgress(currentProgress, duration); + updatePlaybackProgress(currentProgress, duration); } } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java index 8d17017d217..6dd06e47f67 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java @@ -14,6 +14,7 @@ import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.ktx.ViewUtils; import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.PicassoHelper; import org.schabi.newpipe.util.StreamTypeUtil; @@ -60,8 +61,12 @@ public void updateFromItem(final InfoItem infoItem, R.color.duration_background_color)); itemDurationView.setVisibility(View.VISIBLE); - final StreamStateEntity state2 = historyRecordManager.loadStreamState(infoItem) - .blockingGet()[0]; + StreamStateEntity state2 = null; + if (DependentPreferenceHelper + .getPositionsInListsEnabled(itemProgressView.getContext())) { + state2 = historyRecordManager.loadStreamState(infoItem) + .blockingGet()[0]; + } if (state2 != null) { itemProgressView.setVisibility(View.VISIBLE); itemProgressView.setMax((int) item.getDuration()); @@ -111,9 +116,12 @@ public void updateState(final InfoItem infoItem, final HistoryRecordManager historyRecordManager) { final StreamInfoItem item = (StreamInfoItem) infoItem; - final StreamStateEntity state = historyRecordManager - .loadStreamState(infoItem) - .blockingGet()[0]; + StreamStateEntity state = null; + if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext())) { + state = historyRecordManager + .loadStreamState(infoItem) + .blockingGet()[0]; + } if (state != null && item.getDuration() > 0 && !StreamTypeUtil.isLiveStream(item.getStreamType())) { itemProgressView.setMax((int) item.getDuration()); diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java index d3975832670..c98a8b60be4 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java @@ -14,6 +14,7 @@ import org.schabi.newpipe.ktx.ViewUtils; import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; @@ -68,7 +69,8 @@ public void updateFromItem(final LocalItem localItem, R.color.duration_background_color)); itemDurationView.setVisibility(View.VISIBLE); - if (item.getProgressMillis() > 0) { + if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext()) + && item.getProgressMillis() > 0) { itemProgressView.setVisibility(View.VISIBLE); itemProgressView.setMax((int) item.getStreamEntity().getDuration()); itemProgressView.setProgress((int) TimeUnit.MILLISECONDS @@ -109,7 +111,8 @@ public void updateState(final LocalItem localItem, } final PlaylistStreamEntry item = (PlaylistStreamEntry) localItem; - if (item.getProgressMillis() > 0 && item.getStreamEntity().getDuration() > 0) { + if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext()) + && item.getProgressMillis() > 0 && item.getStreamEntity().getDuration() > 0) { itemProgressView.setMax((int) item.getStreamEntity().getDuration()); if (itemProgressView.getVisibility() == View.VISIBLE) { itemProgressView.setProgressAnimated((int) TimeUnit.MILLISECONDS diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java index 0d88eecba70..41f2df1d0e5 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java @@ -14,6 +14,7 @@ import org.schabi.newpipe.ktx.ViewUtils; import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; @@ -97,7 +98,8 @@ public void updateFromItem(final LocalItem localItem, R.color.duration_background_color)); itemDurationView.setVisibility(View.VISIBLE); - if (item.getProgressMillis() > 0) { + if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext()) + && item.getProgressMillis() > 0) { itemProgressView.setVisibility(View.VISIBLE); itemProgressView.setMax((int) item.getStreamEntity().getDuration()); itemProgressView.setProgress((int) TimeUnit.MILLISECONDS @@ -141,7 +143,8 @@ public void updateState(final LocalItem localItem, } final StreamStatisticsEntry item = (StreamStatisticsEntry) localItem; - if (item.getProgressMillis() > 0 && item.getStreamEntity().getDuration() > 0) { + if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext()) + && item.getProgressMillis() > 0 && item.getStreamEntity().getDuration() > 0) { itemProgressView.setMax((int) item.getStreamEntity().getDuration()); if (itemProgressView.getVisibility() == View.VISIBLE) { itemProgressView.setProgressAnimated((int) TimeUnit.MILLISECONDS diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index b6098a1ef7d..dcbebaedfb0 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -29,7 +29,6 @@ import static com.google.android.exoplayer2.Player.RepeatMode; import static org.schabi.newpipe.extractor.ServiceList.YouTube; import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; -import static org.schabi.newpipe.player.helper.PlayerHelper.isPlaybackResumeEnabled; import static org.schabi.newpipe.player.helper.PlayerHelper.nextRepeatMode; import static org.schabi.newpipe.player.helper.PlayerHelper.retrievePlaybackParametersFromPrefs; import static org.schabi.newpipe.player.helper.PlayerHelper.retrieveSeekDurationFromPreferences; @@ -115,6 +114,7 @@ import org.schabi.newpipe.player.ui.PlayerUiList; import org.schabi.newpipe.player.ui.PopupPlayerUi; import org.schabi.newpipe.player.ui.VideoPlayerUi; +import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.NavigationHelper; @@ -391,7 +391,7 @@ public void handleIntent(@NonNull final Intent intent) { simpleExoPlayer.setPlayWhenReady(playWhenReady); } else if (intent.getBooleanExtra(RESUME_PLAYBACK, false) - && isPlaybackResumeEnabled(this) + && DependentPreferenceHelper.getResumePlaybackEnabled(context) && !samePlayQueue && !newQueue.isEmpty() && newQueue.getItem() != null diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index abde7c3d12c..67089e425d5 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -425,13 +425,6 @@ private static SinglePlayQueue getAutoQueuedSinglePlayQueue( // Utils used by player //////////////////////////////////////////////////////////////////////////// - public static boolean isPlaybackResumeEnabled(final Player player) { - return player.getPrefs().getBoolean( - player.getContext().getString(R.string.enable_watch_history_key), true) - && player.getPrefs().getBoolean( - player.getContext().getString(R.string.enable_playback_resume_key), true); - } - @RepeatMode public static int nextRepeatMode(@RepeatMode final int repeatMode) { switch (repeatMode) { diff --git a/app/src/main/java/org/schabi/newpipe/util/DependentPreferenceHelper.java b/app/src/main/java/org/schabi/newpipe/util/DependentPreferenceHelper.java new file mode 100644 index 00000000000..9591beddb3c --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/DependentPreferenceHelper.java @@ -0,0 +1,51 @@ +package org.schabi.newpipe.util; + +import android.content.Context; +import android.content.SharedPreferences; + +import androidx.preference.PreferenceManager; + +import org.schabi.newpipe.R; + +/** + * For preferences with dependencies and multiple use case, + * this class can be used to reduce the lines of code. + */ +public final class DependentPreferenceHelper { + + private DependentPreferenceHelper() { + // no instance + } + + /** + * Option `Resume playback` depends on `Watch history`, this method can be used to retrieve if + * `Resume playback` and its dependencies are all enabled. + * + * @param context the Android context + * @return returns true if `Resume playback` and `Watch history` are both enabled + */ + public static boolean getResumePlaybackEnabled(final Context context) { + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + return prefs.getBoolean(context.getString( + R.string.enable_watch_history_key), true) + && prefs.getBoolean(context.getString( + R.string.enable_playback_resume_key), true); + } + + /** + * Option `Position in lists` depends on `Watch history`, this method can be used to retrieve if + * `Position in lists` and its dependencies are all enabled. + * + * @param context the Android context + * @return returns true if `Positions in lists` and `Watch history` are both enabled + */ + public static boolean getPositionsInListsEnabled(final Context context) { + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + return prefs.getBoolean(context.getString( + R.string.enable_watch_history_key), true) + && prefs.getBoolean(context.getString( + R.string.enable_playback_state_lists_key), true); + } +} diff --git a/app/src/main/res/xml/history_settings.xml b/app/src/main/res/xml/history_settings.xml index b6126b10a73..46111635c20 100644 --- a/app/src/main/res/xml/history_settings.xml +++ b/app/src/main/res/xml/history_settings.xml @@ -23,6 +23,7 @@ Date: Tue, 7 Feb 2023 18:46:40 +0100 Subject: [PATCH 078/645] Made the requested color changes --- .../newpipe/fragments/MainFragment.java | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 4a702e0dce5..44d99cff73c 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -4,7 +4,6 @@ import android.content.res.ColorStateList; import android.os.Bundle; import android.util.Log; -import android.util.TypedValue; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -34,6 +33,7 @@ import org.schabi.newpipe.settings.tabs.TabsManager; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ServiceHelper; +import org.schabi.newpipe.util.ThemeHelper; import org.schabi.newpipe.views.ScrollableTabLayout; import java.util.ArrayList; @@ -210,26 +210,25 @@ private void updateTabsPosition() { pagerParams.removeRule(RelativeLayout.BELOW); pagerParams.addRule(RelativeLayout.ABOVE, R.id.main_tab_layout); tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_TOP); - final TypedValue typedValueBackground = new TypedValue(); - getContext().getTheme().resolveAttribute(R.attr.colorSecondary, typedValueBackground, - true); - tabLayout.setBackgroundColor(typedValueBackground.data); - tabLayout.setTabRippleColor(ColorStateList.valueOf( - getResources().getColor(R.color.gray))); - tabLayout.setTabIconTint(ColorStateList.valueOf(getResources().getColor(R.color.gray))); - tabLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.gray)); + tabLayout.setBackgroundColor(ThemeHelper + .resolveColorFromAttr(requireContext(), R.attr.colorSecondary)); + final int colorAccent = ThemeHelper.resolveColorFromAttr( + requireContext(), R.attr.colorAccent); + tabLayout.setTabRippleColor(ColorStateList.valueOf(colorAccent).withAlpha(32)); + tabLayout.setTabIconTint(ColorStateList.valueOf(colorAccent)); + tabLayout.setSelectedTabIndicatorColor(colorAccent); } else { tabParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM); tabParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); pagerParams.removeRule(RelativeLayout.ABOVE); pagerParams.addRule(RelativeLayout.BELOW, R.id.main_tab_layout); tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_BOTTOM); - final TypedValue typedValue = new TypedValue(); - getContext().getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, - true); - tabLayout.setBackgroundColor(typedValue.data); - tabLayout.setTabRippleColor(binding.mainTabLayout.getTabRippleColor().withAlpha(32)); - tabLayout.setTabIconTint(binding.mainTabLayout.getTabIconTint()); + tabLayout.setBackgroundColor(ThemeHelper + .resolveColorFromAttr(requireContext(), R.attr.colorPrimary)); + tabLayout.setTabRippleColor(ColorStateList.valueOf( + getResources().getColor(R.color.white)).withAlpha(32)); + tabLayout.setTabIconTint(ColorStateList.valueOf( + getResources().getColor(R.color.white))); tabLayout.setSelectedTabIndicatorColor(ContextCompat .getColor(requireContext(), R.color.white)); } From 4cc653fdf1313a3998bf816059cdeb9abab187ea Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 7 Feb 2023 22:39:12 +0100 Subject: [PATCH 079/645] Fix opening links on Android 12+ --- .../external_communication/ShareUtils.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java index 332298b2292..06dd3f9454d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java @@ -90,19 +90,16 @@ public static boolean openUrlInBrowser(@NonNull final Context context, // No browser set as default (doesn't work on some devices) openAppChooser(context, intent, true); } else { - if (defaultPackageName.isEmpty()) { - // No app installed to open a web url - Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG).show(); - return false; - } else { - try { + try { + // will be empty on Android 12+ + if (!defaultPackageName.isEmpty()) { intent.setPackage(defaultPackageName); - context.startActivity(intent); - } catch (final ActivityNotFoundException e) { - // Not a browser but an app chooser because of OEMs changes - intent.setPackage(null); - openAppChooser(context, intent, true); } + context.startActivity(intent); + } catch (final ActivityNotFoundException e) { + // Not a browser but an app chooser because of OEMs changes + intent.setPackage(null); + openAppChooser(context, intent, true); } } From 63375627e956c039739302ab2d83a0ced8af6202 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Wed, 8 Feb 2023 22:22:48 +0100 Subject: [PATCH 080/645] Translated using Weblate (Bengali) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 21.9% (16 of 73 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 69.8% (51 of 73 strings) Translated using Weblate (Portuguese) Currently translated at 69.8% (51 of 73 strings) Translated using Weblate (Italian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Odia) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Dutch) Currently translated at 65.7% (48 of 73 strings) Translated using Weblate (Italian) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 28.7% (21 of 73 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Galician) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Italian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Korean) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Japanese) Currently translated at 99.8% (653 of 654 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Basque) Currently translated at 45.2% (33 of 73 strings) Translated using Weblate (German) Currently translated at 73.9% (54 of 73 strings) Translated using Weblate (Sardinian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Polish) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Czech) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Greek) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Basque) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Portuguese) Currently translated at 99.8% (653 of 654 strings) Translated using Weblate (Russian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (French) Currently translated at 99.6% (652 of 654 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (German) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 15.0% (11 of 73 strings) Translated using Weblate (German) Currently translated at 73.9% (54 of 73 strings) Translated using Weblate (Thai) Currently translated at 32.0% (209 of 652 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Italian) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 15.0% (11 of 73 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Russian) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Polish) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 64.3% (47 of 73 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Indonesian) Currently translated at 76.7% (56 of 73 strings) Translated using Weblate (Polish) Currently translated at 60.2% (44 of 73 strings) Translated using Weblate (Hindi) Currently translated at 21.9% (16 of 73 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Czech) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 17.8% (13 of 73 strings) Translated using Weblate (Polish) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (652 of 652 strings) Co-authored-by: Agnieszka C Co-authored-by: Aitor Salaberria Co-authored-by: Ajeje Brazorf Co-authored-by: Allan Nordhøy Co-authored-by: Emin Tufan Çetin Co-authored-by: Eric Co-authored-by: Fjuro Co-authored-by: Florian Co-authored-by: GET100PERCENT Co-authored-by: GnuPGを使うべきだ Co-authored-by: Hoseok Seo Co-authored-by: Hosted Weblate Co-authored-by: Igor Nedoboy Co-authored-by: Igor Rückert Co-authored-by: Igor Sorocean Co-authored-by: Ihor Hordiichuk Co-authored-by: Issa1553 Co-authored-by: JY3 Co-authored-by: Jeff Huang Co-authored-by: Jonatan Nyberg Co-authored-by: Linerly Co-authored-by: Marian Hanzel Co-authored-by: Massimo Pissarello Co-authored-by: Mateus Co-authored-by: Nidi Co-authored-by: Phahim Hasan Co-authored-by: Priit Jõerüüt Co-authored-by: Ray Co-authored-by: Retrial Co-authored-by: Rex_sa Co-authored-by: S3aBreeze Co-authored-by: SC Co-authored-by: ShareASmile Co-authored-by: VfBFan Co-authored-by: Yaron Shahrabani Co-authored-by: bowornsin Co-authored-by: gallegonovato Co-authored-by: petlyh <88139840+petlyh@users.noreply.github.com> Co-authored-by: pjammo Co-authored-by: random r Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/bn/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/es/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/eu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/id/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pa/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_PT/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/uk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant_HK/ Translation: NewPipe/Metadata --- app/src/main/res/values-ar/strings.xml | 2 + app/src/main/res/values-az/strings.xml | 188 +++++++++--------- app/src/main/res/values-cs/strings.xml | 18 +- app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values-el/strings.xml | 2 + app/src/main/res/values-es/strings.xml | 2 + app/src/main/res/values-et/strings.xml | 2 + app/src/main/res/values-eu/strings.xml | 16 +- app/src/main/res/values-fr/strings.xml | 2 + app/src/main/res/values-gl/strings.xml | 2 + app/src/main/res/values-he/strings.xml | 2 + app/src/main/res/values-in/strings.xml | 2 + app/src/main/res/values-it/strings.xml | 4 +- app/src/main/res/values-ja/strings.xml | 2 + app/src/main/res/values-ko/strings.xml | 4 + app/src/main/res/values-nb-rNO/strings.xml | 76 +++---- app/src/main/res/values-nl/strings.xml | 4 +- app/src/main/res/values-or/strings.xml | 2 + app/src/main/res/values-pl/strings.xml | 8 +- app/src/main/res/values-pt-rBR/strings.xml | 2 + app/src/main/res/values-pt-rPT/strings.xml | 2 + app/src/main/res/values-pt/strings.xml | 4 +- app/src/main/res/values-ro/strings.xml | 3 + app/src/main/res/values-ru/strings.xml | 4 +- app/src/main/res/values-sc/strings.xml | 2 + app/src/main/res/values-sk/strings.xml | 10 + app/src/main/res/values-sv/strings.xml | 3 + app/src/main/res/values-th/strings.xml | 13 +- app/src/main/res/values-tr/strings.xml | 2 + app/src/main/res/values-uk/strings.xml | 4 +- app/src/main/res/values-zh-rCN/strings.xml | 6 +- app/src/main/res/values-zh-rHK/strings.xml | 2 + app/src/main/res/values-zh-rTW/strings.xml | 2 + .../metadata/android/bn/changelogs/68.txt | 1 + .../metadata/android/cs/changelogs/992.txt | 17 ++ .../metadata/android/de/changelogs/900.txt | 24 +-- .../metadata/android/de/changelogs/958.txt | 26 +-- .../metadata/android/de/changelogs/970.txt | 12 +- .../metadata/android/de/changelogs/975.txt | 29 +-- .../metadata/android/de/changelogs/976.txt | 16 +- .../metadata/android/de/changelogs/977.txt | 16 +- .../metadata/android/de/changelogs/980.txt | 20 +- .../metadata/android/de/changelogs/986.txt | 16 ++ .../metadata/android/de/changelogs/987.txt | 20 +- .../metadata/android/de/changelogs/990.txt | 24 +-- .../metadata/android/de/changelogs/991.txt | 22 +- .../metadata/android/de/changelogs/992.txt | 17 ++ .../metadata/android/es/changelogs/992.txt | 17 ++ .../metadata/android/eu/changelogs/992.txt | 17 ++ .../metadata/android/hi/changelogs/64.txt | 8 + .../metadata/android/hi/changelogs/65.txt | 26 +++ .../metadata/android/hi/changelogs/66.txt | 33 +++ .../metadata/android/hi/changelogs/68.txt | 31 +++ .../metadata/android/hi/changelogs/69.txt | 19 ++ .../metadata/android/hi/changelogs/70.txt | 25 +++ .../metadata/android/hi/changelogs/71.txt | 10 + .../metadata/android/hi/changelogs/730.txt | 2 + .../metadata/android/hi/changelogs/740.txt | 23 +++ .../metadata/android/hi/changelogs/750.txt | 22 ++ .../metadata/android/hi/changelogs/760.txt | 43 ++++ .../metadata/android/hi/changelogs/770.txt | 4 + .../metadata/android/hi/changelogs/780.txt | 12 ++ .../metadata/android/hi/changelogs/790.txt | 14 ++ .../metadata/android/hi/changelogs/800.txt | 27 +++ .../metadata/android/hi/changelogs/810.txt | 19 ++ .../metadata/android/hi/changelogs/820.txt | 1 + .../metadata/android/hi/changelogs/830.txt | 1 + .../metadata/android/hi/changelogs/840.txt | 22 ++ .../metadata/android/hi/changelogs/850.txt | 1 + .../metadata/android/hi/changelogs/860.txt | 7 + .../metadata/android/hi/changelogs/870.txt | 2 + .../metadata/android/hi/changelogs/900.txt | 14 ++ .../metadata/android/hi/changelogs/910.txt | 1 + .../metadata/android/hi/changelogs/920.txt | 9 + .../metadata/android/hi/changelogs/930.txt | 19 ++ .../metadata/android/hi/changelogs/940.txt | 16 ++ .../metadata/android/hi/changelogs/950.txt | 4 + .../metadata/android/hi/changelogs/951.txt | 17 ++ .../metadata/android/hi/changelogs/952.txt | 7 + .../metadata/android/hi/changelogs/954.txt | 7 +- .../metadata/android/hi/changelogs/959.txt | 4 +- .../metadata/android/hi/changelogs/963.txt | 1 + .../metadata/android/hi/changelogs/964.txt | 8 + .../metadata/android/hi/changelogs/965.txt | 6 + .../metadata/android/hi/changelogs/966.txt | 14 ++ .../metadata/android/hi/changelogs/967.txt | 1 + .../metadata/android/hi/changelogs/968.txt | 7 + .../metadata/android/hi/changelogs/969.txt | 8 + .../metadata/android/hi/changelogs/970.txt | 11 + .../metadata/android/hi/changelogs/971.txt | 3 + .../metadata/android/hi/changelogs/972.txt | 14 ++ .../metadata/android/hi/changelogs/973.txt | 4 + .../metadata/android/hi/changelogs/974.txt | 5 + .../metadata/android/hi/changelogs/975.txt | 17 ++ .../metadata/android/hi/changelogs/976.txt | 10 + .../metadata/android/hi/changelogs/977.txt | 10 + .../metadata/android/hi/changelogs/978.txt | 1 + .../metadata/android/hi/changelogs/979.txt | 2 + .../metadata/android/hi/changelogs/980.txt | 13 ++ .../metadata/android/hi/changelogs/981.txt | 2 + .../metadata/android/hi/changelogs/982.txt | 1 + .../metadata/android/hi/changelogs/983.txt | 9 + .../metadata/android/hi/changelogs/984.txt | 7 + .../metadata/android/hi/changelogs/985.txt | 1 + .../metadata/android/hi/changelogs/986.txt | 16 ++ .../metadata/android/hi/changelogs/987.txt | 12 ++ .../metadata/android/hi/changelogs/988.txt | 2 + .../metadata/android/hi/changelogs/989.txt | 3 + .../metadata/android/hi/changelogs/990.txt | 15 ++ .../metadata/android/hi/changelogs/991.txt | 14 +- .../metadata/android/hi/changelogs/992.txt | 17 ++ .../metadata/android/id/changelogs/972.txt | 14 ++ .../metadata/android/id/changelogs/973.txt | 4 + .../metadata/android/id/changelogs/992.txt | 17 ++ .../metadata/android/it/changelogs/992.txt | 17 ++ .../metadata/android/nb-NO/changelogs/992.txt | 17 ++ .../android/nb-NO/full_description.txt | 6 +- .../android/nb-NO/short_description.txt | 2 +- .../metadata/android/nl/changelogs/65.txt | 26 +++ .../metadata/android/pa/changelogs/992.txt | 15 ++ .../metadata/android/pl/changelogs/992.txt | 17 ++ .../metadata/android/pt-BR/changelogs/770.txt | 4 + .../metadata/android/pt-PT/changelogs/992.txt | 17 ++ .../metadata/android/pt/changelogs/992.txt | 17 ++ .../metadata/android/uk/changelogs/992.txt | 17 ++ .../android/zh-Hant/changelogs/992.txt | 17 ++ .../android/zh_Hant_HK/changelogs/992.txt | 17 ++ 127 files changed, 1336 insertions(+), 265 deletions(-) create mode 100644 fastlane/metadata/android/bn/changelogs/68.txt create mode 100644 fastlane/metadata/android/cs/changelogs/992.txt create mode 100644 fastlane/metadata/android/de/changelogs/986.txt create mode 100644 fastlane/metadata/android/de/changelogs/992.txt create mode 100644 fastlane/metadata/android/es/changelogs/992.txt create mode 100644 fastlane/metadata/android/eu/changelogs/992.txt create mode 100644 fastlane/metadata/android/hi/changelogs/64.txt create mode 100644 fastlane/metadata/android/hi/changelogs/65.txt create mode 100644 fastlane/metadata/android/hi/changelogs/66.txt create mode 100644 fastlane/metadata/android/hi/changelogs/68.txt create mode 100644 fastlane/metadata/android/hi/changelogs/69.txt create mode 100644 fastlane/metadata/android/hi/changelogs/70.txt create mode 100644 fastlane/metadata/android/hi/changelogs/71.txt create mode 100644 fastlane/metadata/android/hi/changelogs/730.txt create mode 100644 fastlane/metadata/android/hi/changelogs/740.txt create mode 100644 fastlane/metadata/android/hi/changelogs/750.txt create mode 100644 fastlane/metadata/android/hi/changelogs/760.txt create mode 100644 fastlane/metadata/android/hi/changelogs/770.txt create mode 100644 fastlane/metadata/android/hi/changelogs/780.txt create mode 100644 fastlane/metadata/android/hi/changelogs/790.txt create mode 100644 fastlane/metadata/android/hi/changelogs/800.txt create mode 100644 fastlane/metadata/android/hi/changelogs/810.txt create mode 100644 fastlane/metadata/android/hi/changelogs/820.txt create mode 100644 fastlane/metadata/android/hi/changelogs/830.txt create mode 100644 fastlane/metadata/android/hi/changelogs/840.txt create mode 100644 fastlane/metadata/android/hi/changelogs/850.txt create mode 100644 fastlane/metadata/android/hi/changelogs/860.txt create mode 100644 fastlane/metadata/android/hi/changelogs/870.txt create mode 100644 fastlane/metadata/android/hi/changelogs/900.txt create mode 100644 fastlane/metadata/android/hi/changelogs/910.txt create mode 100644 fastlane/metadata/android/hi/changelogs/920.txt create mode 100644 fastlane/metadata/android/hi/changelogs/930.txt create mode 100644 fastlane/metadata/android/hi/changelogs/940.txt create mode 100644 fastlane/metadata/android/hi/changelogs/950.txt create mode 100644 fastlane/metadata/android/hi/changelogs/951.txt create mode 100644 fastlane/metadata/android/hi/changelogs/952.txt create mode 100644 fastlane/metadata/android/hi/changelogs/963.txt create mode 100644 fastlane/metadata/android/hi/changelogs/964.txt create mode 100644 fastlane/metadata/android/hi/changelogs/965.txt create mode 100644 fastlane/metadata/android/hi/changelogs/966.txt create mode 100644 fastlane/metadata/android/hi/changelogs/967.txt create mode 100644 fastlane/metadata/android/hi/changelogs/968.txt create mode 100644 fastlane/metadata/android/hi/changelogs/969.txt create mode 100644 fastlane/metadata/android/hi/changelogs/970.txt create mode 100644 fastlane/metadata/android/hi/changelogs/971.txt create mode 100644 fastlane/metadata/android/hi/changelogs/972.txt create mode 100644 fastlane/metadata/android/hi/changelogs/973.txt create mode 100644 fastlane/metadata/android/hi/changelogs/974.txt create mode 100644 fastlane/metadata/android/hi/changelogs/975.txt create mode 100644 fastlane/metadata/android/hi/changelogs/976.txt create mode 100644 fastlane/metadata/android/hi/changelogs/977.txt create mode 100644 fastlane/metadata/android/hi/changelogs/978.txt create mode 100644 fastlane/metadata/android/hi/changelogs/979.txt create mode 100644 fastlane/metadata/android/hi/changelogs/980.txt create mode 100644 fastlane/metadata/android/hi/changelogs/981.txt create mode 100644 fastlane/metadata/android/hi/changelogs/982.txt create mode 100644 fastlane/metadata/android/hi/changelogs/983.txt create mode 100644 fastlane/metadata/android/hi/changelogs/984.txt create mode 100644 fastlane/metadata/android/hi/changelogs/985.txt create mode 100644 fastlane/metadata/android/hi/changelogs/986.txt create mode 100644 fastlane/metadata/android/hi/changelogs/987.txt create mode 100644 fastlane/metadata/android/hi/changelogs/988.txt create mode 100644 fastlane/metadata/android/hi/changelogs/989.txt create mode 100644 fastlane/metadata/android/hi/changelogs/990.txt create mode 100644 fastlane/metadata/android/hi/changelogs/992.txt create mode 100644 fastlane/metadata/android/id/changelogs/972.txt create mode 100644 fastlane/metadata/android/id/changelogs/973.txt create mode 100644 fastlane/metadata/android/id/changelogs/992.txt create mode 100644 fastlane/metadata/android/it/changelogs/992.txt create mode 100644 fastlane/metadata/android/nb-NO/changelogs/992.txt create mode 100644 fastlane/metadata/android/nl/changelogs/65.txt create mode 100644 fastlane/metadata/android/pa/changelogs/992.txt create mode 100644 fastlane/metadata/android/pl/changelogs/992.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/770.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/992.txt create mode 100644 fastlane/metadata/android/pt/changelogs/992.txt create mode 100644 fastlane/metadata/android/uk/changelogs/992.txt create mode 100644 fastlane/metadata/android/zh-Hant/changelogs/992.txt create mode 100644 fastlane/metadata/android/zh_Hant_HK/changelogs/992.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index cbd3ade358c..02c471d635b 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -782,4 +782,6 @@ إلغاء تعيين الصورة المصغرة الدائمة فشل النسخ إلى الحافظة البطاقة + تمت إضافة وقت (أوقات) مكررة %d + تحتوي قوائم التشغيل رمادية اللون بالفعل على هذا العنصر. \ No newline at end of file diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index d8d88bd6da1..0cce71fb0d8 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -3,7 +3,7 @@ Başlamaq üçün böyüdücü güzgüyə toxun. %1$s tarixində yayımlanıb Yayım oynadıcı tapılmadı. \"VLC\" quraşdırılsın\? - Yayım oynadıcı tapılmadı (Oynatmaq üçün VLC\'ni quraşdıra bilərsiniz). + Yayım oynadıcı tapılmadı (Oynatmaq üçün VLC quraşdıra bilərsiniz). Yüklə Ləğv et Brauzerdə aç @@ -12,59 +12,59 @@ Yayım faylını endir Axtarış Tənzimləmələr - Bunu nəzərdə tuturdunuz: \"%1$s\"\? + Bunu demək istəyirdiniz: \"%1$s\"\? ilə paylaş Xarici video oynadıcı istifadə et - Bəzi qətnamələrdə səsi silir + Bəzi ayırdetmələrdə səsi silir Xarici səs oynadıcı istifadə et Abunə Ol Abunə olundu Kanal abunəliyi ləğv edildi Məlumat göstər - Abunəliklər + Abunələr Əlfəcinlənmiş Pleylistlər Yeniliklər Fon Video endirmə qovluğu Endirilmiş video fayllar burada saxlanılır - Video faylları üçün endirmə qovluğunu seç + Video fayllar üçün endirmə qovluğu seç Səs endirmə qovluğu Endirilmiş səs faylları burada saxlanılır Səs faylları üçün endirmə qovluğu seç - Defolt keyfiyyət - Daha böyük keyfiyyət seçimləri göstər + Standart ayırdetmə + Daha böyük ayırdetmələr göstər \"Kodi\" ilə Oynat Çatışmayan \"Kore\" tətbiqi yüklənilsin\? \"Kodi ilə Oynat\" seçimini göstər - Videonu Kodi media mərkəzi ilə oynatmaq üçün seçim göstər + Kodi media mərkəzindən video oynatmaq üçün seçim göstər Səs - Defolt səs formatı - Defolt video formatı + Standart səs formatı + Standart video formatı Tema İşıqlı Qaranlıq Qara - Abunəlikdən çıxın + Abunə olma Ani görüntü rejimində aç Avtomatik oynat - Endir - Fasilələrdən sonra (məsələn, telefon zəngləri) oynatmağa davam etdir + Yüklə + Fasilələr ardınca (məsələn, telefon zəngləri) oynatmağa davam etdir Oynatmanı davam etdir Baxılmış videoların saxlanılması Məlumat təmizlə - Siyahılarda oynatma mövqelərini göstər + Siyahılarda oynatma mövqe göstəricilərini göstər Siyahılardakı mövqelər Son oynatma mövqeyini qaytar Oynatmanı davam etdir Baxış tarixçəsi Axtarış sorğularını yerli olaraq saxla Axtarış tarixçəsi - Axtarış edərkən göstəriləcək təklifləri seç + Axtarış zamanı göstərmək üçün təklifləri seç Axtarış təklifləri - Oynadıcının parlaqlığını nizamlamaq üçün jestləri istifadə et - Parlaqlığı jestlə nizamlamaq - Oynadıcı səsini nizamlamaq üçün jestləri istifadə et - Səsi jestlə idarə etmək + Oynadıcı parlaqlığını nizamlamaq üçün jestlər istifadə et + Parlaqlıq jesti idarəetməsi + Oynadıcı səsini nizamlamaq üçün jestlər istifadə et + Səs səviyyəsi jesti idarəetməsi Avto-növbələ Növbəti Yayımı Avto-növbələ Üst məlumat keşi silindi @@ -73,10 +73,10 @@ Şəkil keşi silindi Şərhləri gizlətmək üçün bağla Şərhləri göstər - Aktiv oynadıcının növbəsi dəyişdiriləcək + Aktiv oynadıcı növbəsi dəyişdiriləcək Bir oynadıcıdan digərinə keçid növbənizi dəyişdirə bilər Növbəni təmizləməzdən əvvəl təsdiq üçün soruş - Sürətli qeyri-dəqiq axtarışdan istifadə et + Sürətli qeyri-dəqiq axtarış istifadə et Qeyri-dəqiq axtarış oynadıcıya azaldılmış dəqiqliklə mövqeləri daha sürətli axtarmağa imkan verir. 5, 15 və ya 25 saniyəlik axtarış bununla işləmir Sürətli irəli/geri çəkmə axtarış müddəti Heç nə @@ -89,9 +89,9 @@ İkinci fəaliyyət düyməsi Birinci fəaliyyət düyməsi Yalnız bəzi cihazlar 2K/4K videoları oynada bilir - Defolt ani pəncərə keyfiyyəti + Standart ani görüntü ayırdetməsi Əlavə Et - Ani Pəncərə + Ani Görüntü Paneli Seç Abunəliyi yeniləmək alınmadı Abunəliyi dəyişmək alınmadı @@ -102,7 +102,7 @@ Yaş həddi səbəbiylə (məsələn, 18+) uşaqlar üçün uyğun olmayan məzmunu göstər Yaş məhdudiyyətli məzmunu göstər Məzmun - Ani pəncərə rejimində oynadılır + Ani görüntü rejimində oynadılır Fonda oynadılır Yeniləmələr Sazlama @@ -111,23 +111,23 @@ Video və səs Davranış Oynadıcı - Defolt məzmun dili - Defolt məzmun ölkəsi + Cari məzmun dili + Cari məzmun ölkəsi URL\'i tanımaq olmadı. Başqa tətbiqlə açılsın\? Dəstəklənməyən URL\'i \"Növbələmək üçün basılı saxla\" tövsiyəsin göstər \"Növbəti\" və \"Bənzər\" videoları göstər - Tarixçəni, abunəlikləri, pleylistləri və tənzimləmələri ixrac edin + Tarixçəni, abunəlikləri, pleylistləri və tənzimləmələri ixrac et Cari tarixçənizi, abunəliklərinizi, pleylistlərinizi və (könüllü) tənzimləmələrinizi etibarsız edir - reCAPTCHA kukiləri təmizləndi - reCAPTCHA kukilərini təmizlə + reCAPTCHA bazaları təmizləndi + reCAPTCHA bazalarını təmizlə Məlumat bazasını ixrac et Məlumat bazasını idxal et Əsas Görünüşə Keçid - Ani Pəncərəyə Keçid + Ani Görüntüyə Keçid Fona Keçid [Naməlum] - Yeni \"NewPipe\" versiyası üçün bildirişlər + Yeni \"NewPipe\" versiyaları üçün bildirişlər Tətbiq yeniləmə bildirişi NewPipe oynadıcısı üçün bildirişlər Hamısı @@ -141,7 +141,7 @@ YouTube potensial yetkin məzmunu gizlədən \"Məhdud Rejim\" təmin edir \"PeerTube\" nümunələri Miniatürləri yüklə - Siz yığcam bildirişdə göstərilməsi üçün ən çoxu üç fəaliyyət seçə bilərsiniz! + Yığcam bildirişdə göstərmək üçün ən çoxu üç fəaliyyət seçə bilərsiniz! Həmişə yenilə Axın Yalnız qruplaşdırılmamış abunəlikləri göstər @@ -153,7 +153,7 @@ %d seçildi Abunəlik seçilməyib - Abunəlikləri seçin + Abunəlikləri seç Axın emal edilir… Axın yüklənir… Yüklənmədi: %d @@ -179,8 +179,8 @@ Xəta Axtarış tarixçəsi silindi Bütün axtarış tarixçəsi silinsin\? - Açar sözləri axtarışının tarixçəsini silir - Axtarış tarixçəsini silin + Açar sözləri axtarışı tarixçəsini silir + Axtarış tarixçəsini sil Oynatma mövqeləri silindi Bütün oynatma mövqeləri silinsin\? Bütün oynatma mövqelərini silir @@ -188,7 +188,7 @@ Baxış tarixçəsi silindi Bütün baxış tarixçəsi silinsin\? Baxış tarixçəsini təmizlə - reCAPTCHA həll edərkən NewPipe\'ın saxladığı kukiləri silin + reCAPTCHA həll edərkən NewPipe saxladığı bazaları sil %s tərəfindən yaradıldı Yaxınlaşdır Doldur @@ -198,22 +198,22 @@ Hələ ki, kanal abunəliyi yoxdur Kanal seç Kanal Səhifəsi - Defolt Köşk - Köşk Səhifəsi + Standart Köşk + Köşk Səhifə Boş Səhifə Əsas səhifədə hansı tablar göstərilir - Əsas səhifənin məzmunu + Əsas səhifə məzmunu Yeni versiya mövcud olduqda tətbiq yeniləməsini xatırlatmaq üçün bildiriş göstər Yeniləmələr - Mobil internet istifadə edərkən görüntü keyfiyyətini məhdudlaşdır + Mobil internet istifadə edərkən ayırdetməni məhdudlaşdır Limitsiz 1 element silindi. Nümunə əlavə et Sevimli \"PeerTube\" nümunələrinizi seçin - Endirilmiş faylları silin - Endirmə tarixçənizi təmizləmək və ya endirilmiş bütün faylları silmək istəyirsiniz\? + Endirilmiş faylları sil + Endirmə tarixçənizi təmizləmək və ya bütün endirilmiş faylları silmək istəyirsiniz\? Endirmə tarixçəsini təmizlə - Endirmələrə başla + Endirmələri başlat Endirmələri dayandır Haraya endiriləcəyini soruş Sizdən hər endirmənin harada saxlanılacağı soruşulacaq. @@ -241,13 +241,13 @@ Axın yeniləmə astanası Sürətli rejimi aktivləşdir Sürətli rejimi deaktiv et - Axının çox yavaş yükləndiyini düşünürsünüz\? Əgər elədirsə, sürətli yükləməni işə salmağı sınayın (tənzimləmələrdən dəyişə və ya aşağıdakı düyməni basa bilərsiniz). + Axının çox yavaş yükləndiyini düşünürsünüz\? Əgər elədirsə, sürətli yükləməni işə salmağı sınayın (tənzimləmələrdə dəyişə və ya aşağıdakı düyməni basa bilərsiniz). \n \nNewPipe axını yükləmək üçün 2 metod təklif edir: \n• Bütün abunəlik kanallarını gətirtmək, bu yavaş olsa da tamdır; \n• Ayrılmış xidmət uc nöqtəsi istifadə etmək, bu sürətlidir, amma tam deyil. \n -\nBu ikisi arasında fərq odur ki, sürətlisində, adətən elementin müddəti və növü kimi bəzi məlumatlar çatışmır (canlı video ilə adisini ayırd edə bilmir) və daha az element gətirir. +\nBu ikisi arasında fərq odur ki, sürətlisində, adətən elementin müddəti və növü kimi bəzi məlumatlar çatışmır (canlı video ilə adisini ayırd edə bilmir) və daha az elementlər gətirir. \n \nYouTube öz RSS axını ilə bu sürətli metodu təklif edən xidmətlərdən biridir. \n @@ -262,9 +262,9 @@ Xarici yaddaş əlçatan deyil Oynadılmış yayımlar tarixçəsini və oynatma mövqelərini silir Üst məlumatı göstər - Video açıqlamasını və əlavə məlumatı gizlətmək üçün bağla + Video açıqlamanı və əlavə məlumatı gizlətmək üçün bağla Açıqlamanı göstər - Bildirişi rəngləndir + Bildirişi rənglə Belə qovluq yoxdur Əsas oynadıcını tam ekranda başlat Xarici oynadıcılar bu cür linkləri dəstəkləmir @@ -281,7 +281,7 @@ Açıqlama Burada kriketlərdən başqa heç nə yoxdur Nəticə yoxdur - İlkin tənzimləmələri qaytar + Standartları qaytar Fayl köçürüldü və ya silindi Oynadıcı xətası bərpa edilir Bərpa olunmayan oynatma xətası baş verdi @@ -291,28 +291,28 @@ Səs yayımı tapılmadı Digər tətbiqlərin üzərində göstərməyə icazə ver İlkin tənzimləmələri qaytarmaq istəyirsiniz\? - Miniatürlərin yüklənməsini, dataya qənaət etmək və yaddaşdan istifadəni azaltmaq üçün söndürün. Dəyişikliklər həm yaddaşdaxili, həm də diskdə olan təsvir keşini təmizləyir + Miniatürləri yükləməyi, məlumata qənaət və yaddaş istifadəsin azaltmaq üçün söndür. Dəyişikliklər həm yaddaşdaxilində, həm də diskdə təsvir keşini təmizləyir Növbətini növbələ - Yenidən Cəhd Et + Təkrar Cəhd Et Cari oynatma yayımı bildirişini konfiqurasiya et Bildirişlər Video fayl xülasəsi bildirişi Abunəliklər üçün yeni yayımlar haqqında bildirişlər Xəta hesabatları üçün bildirişlər Fayl adı boş ola bilməz - Yadda saxlanmış tabları oxumaq mümkün olmadı, buna görə defolt tablardan istifadə edin + Saxlanmış tabları oxumaq mümkün olmadı, buna görə standart tabları istifadə et NewPipe xəta ilə qarşılaşdı, bildirmək üçün toxun - Bağışlayın, o baş verməməli idi. - Bu xətanı e-poçt vasitəsilə bildirin - GitHub\'da Hesabat Ver + Bağışla, o baş verməməli idi. + Bu xətanı e-poçt-dan bildir + GitHub\'da Məlumat Ver Zəhmət olmasa, xətanızı müzakirə edən məsələnin mövcud olub-olmadığını yoxlayın. Dublikat biletləri yaradarkən, bizdən faktiki səhvi düzəltməyə sərf edəcəyimiz vaxt alırsınız. - Hesabat Bildir + Məlumat Ver Məlumat: Nə baş verdi: Yükləyənin avatar miniatürü Bəyən Bəyənmə - Yenidən sıralamaq üçün sürüşdür + Yenidən sıralamaq üçün sürüklə min Mln Mlrd @@ -324,13 +324,13 @@ Video yoxdur Şərhlər qeyri-aktivdir Başlat - Fasilə + Dayandır Təsdiqləmə İmtina Xəta Detallar üçün toxun Zəhmət olmasa, gözləyin… - Hələ endirmə qovluğu təyin edilməyib, indi defolt endirmə qovluğunu seç + Hələ endirmə qovluğu təyin edilməyib, indi standart endirmə qovluğu seç reCAPTCHA çağırışı reCAPTCHA sorğusu göndərildi Bitdi @@ -340,15 +340,15 @@ Üçüncü Tərəf Lisenziyaları Haqqında & T-TSS Töhfə Ver - Fikirlərinizin olub-olmaması, tərcümə, dizayn dəyişiklikləri, kodun təmizlənməsi və ya real ağırlıqlı kod dəyişiklikləri və.s kömək həmişə xoşdur. Nə qədər çox edilsə, bir o qədər yaxşı olar! + Fikirlərinizin olub-olmaması, tərcümə, dizayn dəyişiklikləri, kod təmizlənməsi və ya real ağır kod dəyişiklikləri və.s kömək həmişə xoşdur. Nə qədər çox edilsə, bir o qədər yaxşı olar! İanə Et Veb sayt - Əlavə məlumat və xəbərlər üçün NewPipe Veb saytına daxil olun. - NewPipe\'ın Məxfilik Siyasəti - NewPipe layihəsi məxfiliyinizə çox ciddi yanaşır. Buna görə də, tətbiq sizin razılığınız olmadan heç bir məlumat toplamır. -\nNewPipe\'ın məxfilik siyasəti qəza hesabatı göndərdiyiniz zaman hansı məlumatların göndərildiyini və saxlanıldığını ətraflı izah edir. - Məxfilik siyasətini oxu - NewPipe\'ın Lisenziyası + Əlavə məlumat və xəbərlər üçün NewPipe Veb saytını ziyarət et. + NewPipe Məxfilik Siyasəti + NewPipe layihəsi məxfiliyinizə çox ciddi yanaşır. Nəticə etibarı ilə, tətbiq sizin razılığınız olmadan heç bir məlumat toplamır. +\nNewPipe məxfilik siyasəti xəta məlumatı göndərdiyiniz zaman hansı məlumatların göndərildiyini və saxlanıldığını ətraflı izah edir. + Məxfilik Siyasətini Oxu + NewPipe Lisenziyası Tarixçə Bu elementi axtarış tarixçəsindən silmək istəyirsiniz\? Son Oynadılan @@ -367,7 +367,7 @@ Oynatma növbəsi Detallar Kanal təfərrüatlarını göstər - Ani pəncərədə oynatmağa başla + Ani görüntüdə oynatmağa başla \"Açıq\" fəaliyyətə üstünlük verilir Fon oynadıcı Həmişə soruş @@ -403,7 +403,7 @@ \nDavam etmək istəyirsiniz\? Səssizlik zamanı sürətlə irəli Yeni yayım bildirişləri - Abunəliklərdən yeni yayımlar haqqında bildiriş göndər + Abunəliklərdən yeni yayımlar haqqında bildir Yoxlama tezliyi Tələb olunan şəbəkə bağlantısı İstənilən şəbəkə @@ -426,7 +426,7 @@ Bu məzmun hələ NewPipe tərəfindən dəstəklənmir. \n \nÜmid edirik ki, gələcək versiyada dəstəklənəcək. - Həm kilid ekranı fonu, həm də bildirişlər üçün miniatürdən istifadə et + Həm kilid ekranı fonu, həm də bildirişlər üçün miniatür istifadə et Ən Yeni Bu məzmun ölkənizdə mövcud deyil. Bu məzmun yalnız ödəniş etmiş istifadəçilər üçün əlçatandır, ona görə də NewPipe tərəfindən yayımlana və ya endirilə bilməz. @@ -468,10 +468,10 @@ Android\'in bildiriş rəngini miniatürdəki əsas rəngə uyğun fərdiləşdirməsini təmin et (qeyd edək ki, bu, bütün cihazlarda mövcud deyil) GitHub\'da Bax İanə Et - NewPipe, sizə ən yaxşı istifadəçi təcrübəsini göstərmək üçün boş vaxtlarını sərf edən könüllülər tərəfindən hazırlanmışdır. Tərtibatçılara bir fincan qəhvə içərkən NewPipe-ı daha da yaxşılaşdırmağa ianə etməklə kömək edin. + NewPipe, sizə ən yaxşı istifadəçi təcrübəsi göstərmək üçün boş vaxtlarını sərf edən könüllülər tərəfindən hazırlanmışdır. Tərtibatçılara bir fincan qəhvə içərkən NewPipe-ı daha da yaxşılaşdırmağa ianə etməklə kömək edin. Ən çox bəyənildi Növbəyə salındı - Məzmunu açarkən defolt hərəkət — %s + Məzmunu açarkən standart hərəkət — %s Ad Pleylist miniatürü kimi təyin et Yalnız Wi-Fi\'da @@ -488,7 +488,7 @@ Lisenziya Müəllifin hesabı bağlanıb. \nNewPipe gələcəkdə bu axını yükləyə bilməyəcək. -\nBu kanala abunəlikdən çıxmaq istəyirsiniz\? +\nBu kanaldan abunəliyi çıxarmaq istəyirsiniz\? Baxılan elementləri göstər Seçilmiş Çəkməcəni Bağla @@ -496,12 +496,12 @@ Video fayl xülasəsi prosesi üçün bildirişlər Miniatürü 1:1 görünüş nisbətinə kəs - Yükləmə intervalının həcmini dəyişdir (hazırda %s). Daha aşağı dəyər ilkin video yükləməni sürətləndirə bilər. Dəyişikliklər oynadıcının yenidən başladılmasını tələb edir - Yayım yaradıcısı, məzmunu və ya axtarış sorğusu haqqında əlavə məlumat olan üst məlumat qutularını gizlətmək üçün söndürün + Yükləmə intervalı həcmini dəyişdir (hazırda %s). Daha aşağı dəyər ilkin video yükləməni sürətləndirə bilər. Dəyişikliklər oynadıcını yenidən başlatmağı tələb edir + Yayım yaradıcısı, məzmunu və ya axtarış sorğusu haqqında əlavə məlumat olan üst məlumat qutularını gizlətmək üçün söndür Əlaqəli yayımı əlavə etməklə (təkrarlanmayan) sonlanacaq oynatma növbəsini davam etdir Kənar axtarış təklifləri Nümunə artıq mövcuddur - Videoları mini oynadıcıda başlatma, avtomatik fırlatma kilidlidirsə, birbaşa tam ekran rejiminə keçid. Siz hələ də tam ekrandan çıxmaqla mini oynadıcıya daxil ola bilərsiniz + Videoları kiçik oynadıcıda başlatma, avtomatik fırlatma kilidlidirsə, birbaşa tam ekran rejiminə keçid. Siz hələ də tam ekrandan çıxmaqla mini oynadıcıya daxil ola bilərsiniz 100+ video ∞ video Şərhlər yoxdur @@ -532,7 +532,7 @@ Etiketlər Planşet rejimi Bağla - Müəllifə ürəkləndi + Müəllifdən ürəkləndi Veb saytı aç %s baxış @@ -550,11 +550,11 @@ Endirmə tamamlandı %s endirmə tamamlandı - Defolt ExoPlayer + Standart ExoPlayer Mövcud olduqda xüsusi axından al Baxılmış videolar silinsin\? İzləniləni sil - Sistem qovluğu seçicisini (SAF) istifadə edin + Sistem qovluğu seçicisini (SAF) istifadə et Bağlantı fasiləsi Cihazda yer qalmayıb Fayl üzərində işləyərkən NewPipe bağlandı @@ -582,7 +582,7 @@ İdxal edilir… Pleylistə salındı Səsi bağla - Ani pəncərə oynadıcı + Ani görüntü oynadıcı Çəkməcəni Aç Növbələşdirmək üçün basılı tut Sil @@ -590,7 +590,7 @@ © %1$s, %2$s tərəfindən %3$s altında Bu faylı oynatmaq üçün heç bir tətbiq quraşdırılmayıb Endirmə - Bu icazə, ani pəncərə rejimində + Bu icazə, ani görüntü rejimində \naçmaq üçün lazımdır Buferə kopyalandı Parçalar @@ -608,22 +608,22 @@ Nümunə URL\'sini daxil et Nümunəni doğrulamaq mümkün olmadı %s-də bəyəndiyiniz nümunələri tapın - Video \"Təfsilatlar:\"səhifəsində fon və ya ani pəncərə düyməsini basarkən ipucu göstər - Oynadıcı altyazı mətn miqyasını və arxa fon üslublarını dəyişdirin. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur + Video \"Təfsilatlar:\"səhifəsində fon və ya ani görüntü düyməsin basarkən ipucu göstər + Oynadıcı altyazı mətn miqyasını və arxa fon üslublarını dəyişdir. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur Xəta baş verdi: %1$s Fayl mövcud deyil, yaxud oxumaq və ya yazmaq icazəsi yoxdur Veb saytı təhlil etmək alınmadı Ucalıq Radio \"Oynadıcını çökdür\" Göstər - Oynadıcıdan istifadə edərkən çökdürmə seçimini göstər + Oynadıcını istifadə edərkən çökdürmə seçimini göstər Xəta balonu göstər Xəta bildirişi yarat - Burdan idxal edin - Bura ixrac edin + Burdan idxal et + Bura ixrac et Faylı idxal et Abunəlikləri idxal etmək mümkün olmadı - Avropa Ümumi Məlumat Mühafizəsi Qaydasına (GDPR) riayət etmək üçün diqqətinizi NewPipe\'ın məxfilik siyasətinə cəlb edirik. Zəhmət olmasa, diqqətlə oxuyun. Xəta hesabatını bizə göndərmək üçün onu qəbul etməlisiniz. + Avropa Ümumi Məlumat Mühafizəsi Qaydasına (GDPR) riayət etmək üçün diqqətinizi NewPipe məxfilik siyasətinə cəlb edirik. Zəhmət olmasa, diqqətlə oxuyun. Xəta hesabatın bizə göndərmək üçün qəbul etməlisiniz. Bu adda fayl artıq mövcuddur Bu adla gözlənilən bir endirmə var Təyinat qovluğu yaradıla bilməz @@ -643,7 +643,7 @@ Dil İctimai Abunəçi sayı əlçatan deyil - Lisenziyanı oxuyun + Lisenziyanı Oxu Tarixçə Hərflər və rəqəmlər Oynadıcını çökdür @@ -651,18 +651,18 @@ Oynadıcı bildirişi Yeni yayımlar Xəta hesabatı bildirişi - Video URL\'i imzasının şifrəsi qırılmadı - Endirmək üçün heç bir yayım yoxdur - Xəta baş verdi, bildirişə baxın + Video URL\'i imzası şifrəsi qırılmadı + Endirmək üçün yayım mövcud deyil + Xəta baş verdi, bildirişi gör Şərhiniz (İngiliscə): Video oynat, müddət: - Zəhmət olmasa, daha sonra tənzimləmələrdə endirmə qovluğunu təyin et + Zəhmət olmasa, endirmə qovluğunu daha sonra tənzimləmələrdə təyin et NewPipe Endirilir Hash hesablanır Fayl adlarında icazə verilən simvollar NewPipe Haqqında Lisenziyalar - NewPipe müəllif hüquqlu sərbəst tətbiqdir: Siz onu istədiyiniz zaman istifadə edə, öyrənə, paylaşa və təkmilləşdirə bilərsiniz. Xüsusilə, siz Lisenziyanın 3-cü versiyası və ya (seçiminizə görə) hər hansı sonrakı versiyada Azad Proqram Təminatı Fondu tərəfindən dərc edilən GNU Ümumi İctimai Lisenziyanın şərtlərinə uyğun olaraq onu yenidən paylaya və/yaxud dəyişdirə bilərsiniz. + NewPipe müəllif hüquqlu sərbəst tətbiqdir: Siz onu istədiyiniz zaman istifadə edə, öyrənə, paylaşa və təkmilləşdirə bilərsiniz. Xüsusilə, siz Lisenziyanın 3-cü versiyası və ya (seçiminizə görə) hər hansı sonrakı versiyada Azad Proqram Təminatı Fondu tərəfindən dərc edilən GNU Ümumi İctimai Lisenziya şərtlərinə uyğun olaraq onu yenidən paylaya və/yaxud dəyişdirə bilərsiniz. İxrac edildi Elementləri silmək üçün sürüşdür Hələ,əlfəcinlənmiş pleylistlər yoxdur @@ -705,7 +705,7 @@ Bu video yalnız YouTube Music Premium üzvləri üçün əlçatandır, ona görə də NewPipe tərəfindən yayımlamaq və ya endirmək mümkün deyil. İndi açıqlamadakı mətni seçə bilərsiniz. Nəzərə alın ki, seçim rejimində səhifə titrəyə və keçidlər kliklənməyə bilər. Bildirişdə göstərilən video miniatürünü 16:9-dan 1:1 görünüş nisbətinə qədər kəs - Aşağıdakı bildiriş fəaliyyətini hər birinin üzərinə toxunaraq redaktə edin. Sağdakı təsdiq qutularından istifadə edərək yığcam bildirişdə göstərilməsi üçün onların üçə qədərini seç + Aşağıdakı hər bir bildiriş fəaliyyətini üzərinə toxunaraq redaktə et. Sağdakı təsdiq qutularından istifadə edərək yığcam bildirişdə göstərmək üçün onların üçünü seç Belə fayl/məzmun mənbəyi yoxdur Seçilmiş yayım xarici oynadıcılar tərəfindən dəstəklənmir Yükləyici tərəfindən hələ dəstəklənməyən yayımlar göstərilmir @@ -718,7 +718,7 @@ Gələcək elementləri göstər Baxılan elementləri gizlət Gələcək elementləri gizlət - Tətbiqdən istifadə etməkdə çətinlik çəkirsinizsə, ümumi suallara bu cavabların yoxlanıldığına əmin olun! + Tətbiqi istifadə etməkdə çətinlik çəkirsinizsə, ümumi suallara bu cavabları yoxladığınıza əmin olun! Tez-tez soruşulan suallar Veb Saytında bax Çeşidlə @@ -730,4 +730,6 @@ Daimi miniatürü ləğv et Kart Buferə kopyalamaq alınmadı + Boz rəngdə olan pleylistlərdə artıq bu element var. + Dublikat %d dəfə əlavə edildi \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index adf6601a8dc..abc77e66cca 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -11,16 +11,16 @@ Nastavení Mysleli jste „%1$s“\? Sdílet s - Použít externí video přehrávač + Použít externí přehrávač videí Použít externí audio přehrávač - Stažené audio je uloženo zde + Sem bude ukládáno stažené audio Zvolte adresář pro stažené audio soubory Adresář pro stažené audio Výchozí rozlišení Přehrát pomocí Kodi Nainstalovat chybějící aplikaci Kore\? Adresář pro stažená videa - Stažená videa jsou uložena tady + Sem budou ukládána stažená videa Zvolte adresář pro stažená videa Zobrazit možnost „Přehrát pomocí Kodi“ Zobrazit možnost přehrání videa pomocí multimediálního centra Kodi @@ -213,7 +213,7 @@ Žádný platný soubor ZIP Upozornění: Nelze importovat všechny soubory. Tímto se anuluje vaše aktuální nastavení. - Video přehrávač + Přehrávač videa Přehrávač na pozadí Přehrávač v okně Získávám informace… @@ -298,7 +298,7 @@ Výška tónu Odpojit (může způsobit zkreslení) Ke stažení nejsou dostupné žádné streamy - Preferovaná \'otevřít\' akce + Preferovaná akce „otevření“ 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 @@ -550,7 +550,7 @@ Ukazuji výsledky pro: %s Nikdy Pouze na Wi-Fi - Zahájit playback automaticky — %s + Automaticky zahájit přehrávání — %s Přehrát frontu Nelze rozpoznat zadané URL. Otevřít pomocí jiné aplikace\? Auto-fronta @@ -668,7 +668,7 @@ Ukázat indikátory obrázků Vzdálené návrhy vyhledávání Lokální návrhy vyhledávání - Pokud je vypnuté automatické otáčení, nespouštějte video v mini přehrávači, ale přepněte se přímo do režimu celé obrazovky. Do mini přehrávače se lze i nadále dostat ukončením režimu celé obrazovky + Pokud je vypnuté automatické otáčení, nespouštět video v mini přehrávači, ale přepnout se přímo do režimu celé obrazovky. Do mini přehrávače se lze i nadále dostat ukončením režimu celé obrazovky Další ve frontě Přidat do fronty (další) Tažením položky odstraníte @@ -728,7 +728,7 @@ Zobrazit nadcházející položky Streamy, které zatím nejsou podporovány systémem stahování, nebudou zobrazeny Vyberte kvalitu pro externí přehrávače - U externích přehrávačů nejsou dostupné žádné video streamy + U externích přehrávačů nejsou k dispozici žádné videostreamy Skrýt zhlédnuté položky Skrýt nadcházející položky Často kladené dotazy @@ -743,4 +743,6 @@ Zrušení nastavení trvalého náhledu Karta Kopírování do schránky se nezdařilo + Zašedlé playlisty již obsahují tuto položku. + Duplikát přidán %dkrát \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3b1959a6916..2aff1504601 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -730,4 +730,6 @@ Dauerhaftes Vorschaubild aufheben Kopieren in die Zwischenablage fehlgeschlagen Karte + Duplikat %d mal hinzugefügt + Die ausgegrauten Wiedergabelisten enthalten dieses Element bereits. \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 78d89cc5993..d19b5731ffd 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -730,4 +730,6 @@ Κατάργηση μόνιμης μικρογραφίας Αποτυχία αντιγραφής στο πρόχειρο Κάρτα + Οι λίστες αναπαραγωγής που είναι γκριζαρισμένες περιέχουν ήδη αυτό το στοιχείο. + Προστέθηκε διπλότυπο %d φορά(ες) \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 9d68c28a967..1ea51486868 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -746,4 +746,6 @@ Desactivar las miniaturas permanente Error al copiar al portapapeles Tarjeta + Duplicado añadido %d vez/veces + Las listas de reproducción que están en gris ya contienen este elemento. \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 986de133bcc..b9114c4d312 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -730,4 +730,6 @@ Lõikelauale kopeerimine ei õnnestunud Eemalda püsiv pisipilt Kaart + Hallina kuvatud esitusloendid juba sisaldavad seda kirjet. + Topeltkirje lisatud %d kord(a) \ No newline at end of file diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 4bbacf7b5d2..6b35b7316af 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -108,7 +108,7 @@ NewPipe aplikazioari buruz Hirugarrengoen lizentziak © %1$s %2$s. %3$s - Honi buruz + Honi buruz eta ohiko galderak Lizentziak Androiderako streaming libre eta arina. Ikusi GitHub zerbitzarian @@ -718,4 +718,18 @@ Hautatu kanpoko erreproduzigailuen kalitatea Ezkutatu etorkizuneko elementuak Ezkutatu ikusitako elementuak + Grisez idatzitako erreprodukzio-zerrendek jada badute elementu hau. + Webgunean ikusi + Akatsa arbelera kopiatzean + Arazoren bat baduzu aplikazioa erabiltzerakoan, irakur itzazu ohiko galdera hauen erantzunak! + Betiko miniatura kendu + NewPipe-en azken bertsioa erabiltzen ari zara + Sakatu %s deskargatzeko + Kopia %d behin/aldiz gehitua + Txartela + Aukera hau Gaiarako %s aukeratua badago soilik dago erabilgarri + Ordenatu + Modu azkarra + Hiru-puntutako menutik harpidetzak inportatu edo esportatu + Maiz galdetutako galderak \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index a3373ca6e00..77b4f09bb71 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -743,4 +743,6 @@ Appuyez pour télécharger %s Échec de la copie dans le presse-papiers Cette option est disponible seulement si %s est sélectionné pour le thème + Les listes de lecture grisées contiennent déjà cet élément. + Carte \ No newline at end of file diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index a8cf01ef0a5..b70f6266f16 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -730,4 +730,6 @@ Produciuse un erro ao copiar no portapapeis Desactivala miniatura permanente Tarxeta + As listas de reprodución que se atopan atenuadas xa conteñen este elemento. + Duplicado engadido %d vez/veces \ No newline at end of file diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 35dc19c8cf2..6be8c107355 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -756,4 +756,6 @@ ביטול הגדרת תמונה ייצוגית קבועה כרטיס ההעתקה ללוח הגזירים נכשלה + רשימות הנגינה שבוטלו וסומנו באפור כבר מכילות את הפריט הזה. + הכפיל נוסף %d פעמים \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index c195d62e1fe..cc5f6dd3b02 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -717,4 +717,6 @@ Batalkan penetapan gambar kecil permanen Gagal menyalin ke papan klip Kartu + Daftar putar yang bewarna abu-abu sudah berisi item ini. + Duplikat ditambahkan %d kali \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index bf20d2be413..ccaf935109e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -742,5 +742,7 @@ Questa opzione è disponibile solo se %s è selezionato come Tema Copia negli appunti non riuscita Schede - Disattiva la miniatura permanente + Disattiva copertina permanente + Le playlist in grigio contengono già questo elemento. + Doppione aggiunto %d volta/e \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index d02b56e759a..e320649a361 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -716,4 +716,6 @@ 3 点メニューから登録チャンネルをインポートまたはエクスポートします カード クリップボードへのコピーに失敗しました + 灰色で表示されているプレイリストには、すでにこのアイテムが含まれています。 + %d 回重複追加されました \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 95df1e9a44c..6011432b19a 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -715,4 +715,8 @@ %s를 다운로드하려면 탭하세요. 영구 썸네일 설정 해제 이 옵션은 테마로 %s를 선택한 경우에만 사용할 수 있음 + 중복 추가 %d 번 + 회색으로 표시된 재생 목록에 이미 이 항목이 포함되어 있습니다. + 카드 + 클립보드 복사 실패 \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 15bb21633f9..79bfa710a77 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -21,18 +21,18 @@ Velg nedlastingsmappe for lydfiler Forvalgt oppløsning Spill av med Kodi - Installer manglende Kore-program\? + Installer manglende Kore-app\? Vis \"Spill av med Kodi\"-valg Vis valg for avspilling via Kodi mediasenter Lyd Forvalgt lydformat - Drakt + Tema Mørk Lys Last ned Vis \"Neste\" og \"Lignende\" -videoer Nettadressen støttes ikke - Foretrukket innholdsspråk + Forvalgt innholdsspråk Video og lyd Utseende Spiller i bakgrunnen @@ -65,7 +65,7 @@ Nedlastinger Nedlastinger Feilrapport - Program/brukergrensesnitt krasjet + App/brukergrensesnitt krasjet Pause Slett Sjekksum @@ -77,7 +77,7 @@ Trykk for detaljer Vent… Kopiert til utklippstavle - Hva:\\nForespørsel:\\nInnholdsspråk:\\nInnholdsland:\\nProgramspråk:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersjon:\\nOS-versjon: + Hva:\\nForespørsel:\\nInnholdsspråk:\\nInnholdsland:\\nAppspråk:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersjon:\\nOS-versjon: Start Definer en nedlastingsmappe senere i innstillingene reCAPTCHA-oppgave @@ -241,15 +241,15 @@ Tilpass Fyll Forstørr - Bruk rask unøyaktig blafring - Feilretting + Bruk rask unøyaktig spoling + Feilsøking Fil Ingen slik mappe Ingen slik fil/innholdskilde Filen finnes ikke eller så har du ikke tilgang til å lese eller skrive til den Filnavn kan ikke være tomt En feil inntraff: %1$s - Auto-generert + Autogenerert Importer Importer fra Eksporter til @@ -282,10 +282,10 @@ Slett hele søkehistorikken\? Søkehistorikken er slettet Ett element slettet. - Inget program installert for avspilling av denne filen + Ingen app installert for å spille av denne filen Undertekster Endre spillerens undertekststørrelse og bakgrunnsstiler. Krever omstart av appen for å tre i kraft - NewPipe er copyleft-fri programvare: Du kan bruke, studere og forbedre den etter egen vilje. Spesifikt kan du redistribuere og/eller modifisere den i henhold til vilkårene gitt i GNU General Public-lisensen, som er publisert av Free Software Foundation, enten versjon 3 av lisensen, eller (etter eget ønske) enhver senere versjon. + NewPipe er copyleft fri programvare: Du kan bruke, studere og forbedre den etter egen vilje. Spesifikt kan du redistribuere og/eller modifisere den i henhold til vilkårene gitt i GNU General Public-lisensen, som er publisert av Free Software Foundation, enten versjon 3 av lisensen, eller (etter eget ønske) enhver senere versjon. Ønsker du også å importere innstillinger? Kunne ikke importere abonnementer Kunne ikke eksportere abonnementer @@ -295,7 +295,7 @@ \n2. Logg inn når forespurt \n3. Klikk på \"All data inkludert\", så på \"Fjern merket for alle\", så på kun \"Abonnementer\", og klikk så \"OK\" \n4. Klikk på \"Neste steg\" og så på \"Opprett eksport\" -\n5. Klikk på \"Last ned\"-knappen etter den vises%1$s +\n5. Klikk på \"Last ned\"-knappen etter den vises \n6. Klikk på IMPORTER FIL under og velg den nedlastede .zip filen \n7. [Dersom .zip importen feiler] Pakk ut .csv filen (vanligvis under \"YouTube og YouTube Music/subscriptions/subscriptions.csv\"), klikk på IMPORTER FIL under og velg den utpakkede csv filen Importer en SoundCloud-profil ved å skrive enten nettadressen eller din ID: @@ -304,15 +304,15 @@ \n2. Gå til denne nettadressen: %1$s \n3. Logg inn når forespurt \n4. Kopier profil-nettadressen du ble videresendt til. - Unøyaktig blafring lar spilleren søke posisjoner raskere med redusert presisjon. Å søke i 5, 15 eller 25 sekunder fungerer ikke med dette + Unøyaktig spoling lar spilleren søke posisjoner raskere med redusert presisjon. Å søke i 5, 15 eller 25 sekunder fungerer ikke med dette Skru av for å stoppe innlasting av miniatyrbilder, noe som sparer data- og minnebruk. Endring av dette vil tømme både disk- og minne-hurtiglager Fortsett fullendt (ikke-repeterende) avspillingskø ved å legge til en relatert strøm - Minnelekkasjeoppsyn kan forårsake programmet å opptre uresponsivt under haugdumping + Overvåkning av minnelekkasjer kan forårsake at appen ikke svarer under heap dumping Rapporter feil utenfor livssyklusen Tving rapportering av uleverbare Rx-unntak utenom fragment eller aktivitetslevetid etter forkastelse Avhekt (kan forårsake forvrenging) NewPipes personvernspraksis - NewPipe-prosjektet tar ditt personvern veldig alvorlig. Derfor samler ikke programmet inn data uten ditt samtykke. + NewPipe-prosjektet tar ditt personvern veldig alvorlig. Derfor samler ikke appen inn data uten ditt samtykke. \nNewPipes personvernspraksis forklarer i detalj hvilken data som sendes og lagres når du sender en krasjrapport. Les personvernspraksis For å overholde EUs personvernforordning (GDPR), vil vi rette oppmerksomheten din mot NewPipe sin personvernerklæring. Vennligst les den nøye. @@ -321,8 +321,8 @@ Avslå Ubegrenset Begrens oppløsning når mobildata brukes - Minimer ved programbytte - Handling ved bytting til annet program fra hovedspiller — %s + Minimer ved appbytte + Handling ved bytting til annen app fra hovedspiller — %s Ingen Minimer til bakgrunnsspiller Minimer til oppsprettsspiller @@ -342,7 +342,7 @@ Oppdateringer Hendelser Fil slettet - Programoppgraderingsmerknad + Varsel om appoppdatering Merknader for nye NewPipe-versjoner Ekstern lagring utilgjengelig Nedlasting til eksternt SD-kort er ikke mulig. Tilbakestill plassering av nedlastingsmappe\? @@ -353,11 +353,11 @@ Hvilke faner vises på hovedsiden Konferanser Oppdatering - Varsle om programoppdatering når en ny versjon er tilgjengelig - Listevisningmodus + Vis varsel om appoppdatering når en ny versjon er tilgjengelig + Listevisningsmodus Liste Rutenett - Auto + Automatisk Ny NewPipe-versjon er tilgjengelig! Fullført pauset @@ -430,7 +430,7 @@ %s lytter %s lyttere - Språket vil først bli endret etter at programmet har blitt omstartet + Språket vil endres etter at appen har startet på nytt Standard kiosk PeerTube-instanser Lokal @@ -449,7 +449,7 @@ Autogenerert (fant ingen opplaster) gjenoppretter Kan ikke gjenopprette denne nedlastingen - Hurtigframoverspoling/-tilbakeblafringsvarighet + Hurtigframoverspoling/-tilbakespolingsvarighet Gi tillatelse til å vise over andre apper Programspråk Systemforvalg @@ -486,7 +486,7 @@ Ingen abonnement valgt Velg abonnementer Kanalgrupper - Skru av raskt modus + Skru av hurtigmodus Strømoppdateringsterskel Strøm Behandler strøm… @@ -505,7 +505,7 @@ Fjern sette Opprettet av %s Av %s - Slå på YouTubes \"begrensede modus\" + Slå på YouTubes \"Begrenset modus\" Aldri Kun på Wi-Fi Velg en spilleliste @@ -524,7 +524,7 @@ \n• Hent hele abonnementskanalen, noe som er tregt, men fullstendig. \n• Bruk av et dedikert tjenesteendepunkt, noe som er raskt men vanligvis ikke fullstendig. \n -\nForskjellen mellom dem er at den raske vanligvis mangler info, som elementers varighet eller type (kan ikke skjelne mellom sanntidsvideoer og normale) og det kan gi færre elementer. +\nForskjellen mellom dem er at den raske vanligvis mangler info, som elementers varighet eller type (kan ikke skille mellom direktesendinger og normale videoer) og det kan gi færre elementer. \n \nYouTube er et eksempel på en tjeneste som tilbyr denne raske metoden med sin RSS-informasjonskanal. \n @@ -537,17 +537,17 @@ Tilgjengelig i noen tjenester, det er vanligvis mye raskere, men kan gi et begrenset antall elementer, og ofte ufullstendig informasjon (f.eks. ingen varighet, elementtype, eller sanntidsstatus) Hent fra dedikert strøm når tilgjengelig Tid siden siste oppdatering før et abonnement vurderes utdatert — %s - Som følge av begrensninger i ExoPlayer er blafringsdistansen begrenset til %d sekunder + Som følge av begrensninger i ExoPlayer er blafringsdistansen kun %d sekunder Videoer som har blitt sett før og etter at de er lagt til spillelisten, vil bli fjernet. \nEr du sikker\? Dette kan ikke angres! Start avspilling automatisk — %s - Kunne ikke gjenkjenne angitt nettadresse. Åpne den med annet program\? + Kunne ikke gjenkjenne angitt nettadresse. Åpne den med et annet program\? Innholdet støttes ikke enda av NewPipe. \n \nStøtte vil forhåpentligvis komme til i en senere versjon. Spillelisteside Kanalens avatar-miniatyrbilde - Skru på raskt modus + Skru på hurtigmodus Vis kun ugrupperte abonnementer Spill kø Ingen spillelistebokmerker enda @@ -595,18 +595,18 @@ Dette er et spor fra SoundCloud Go+, ihvertfall i ditt land, så det kan ikke strømmes eller lastes ned av NewPipe. Innholdet er ikke tilgjengelig i din region. Nedlastingen har startet - Du kan velge din favorittnattdrakt nedenfor - Velg din favorittnattdrakt — %s - Automatisk (enhetsdrakt) + Du kan velge ditt favorittnattema nedenfor + Velg ditt favorittnattema — %s + Automatisk (enhetstema) Radio Framhevet Løs - Nattdrakt + Nattema Vis kanaldetaljer Skru av media-tunnelering hvis du opplever svart skjerm eller videohakking Skru av media-tunnelering Du kan nå velge tekst inne i beskrivelsen. Merk at siden kan flimre og lenker er kanskje ikke klikkbare i utvalgsmodus. - Raskt modus for informasjonskanal tilbyr ikke mer info om dette. + Hurtigmodus for informasjonskanal tilbyr ikke mer info om dette. Skaperens konto har blitt terminert. \nNewPipe vil ikke kunne laste inn denne informasjonskanalen i fremtiden. \nØnsker du å oppheve ditt abonnement på denne kanalen\? @@ -619,7 +619,7 @@ Kunne ikke laste inn informasjonskanal Fra Android 10 er kun «lagringstilgangsrammeverk» støttet Du vil bli spurt om hvor du vil lagre hver nedlastning - Forhåndsvisning av miniatyrbilde i søkefelt + Forhåndsvisning av miniatyrbilde på spolelinjen Ingen nedlastingsmappe er satt ennå, velg en standard nedlastingsmappe nå Av @@ -722,4 +722,12 @@ Sorter Velg alle Hvis du har problemer med å bruke appen, så bør du sjekke ut disse svarene fra generelle spørsmål! + Skru av vedvarende miniatyrbilde + Dette valget er kun tilgjengelig dersom %s er valgt som tema + Klarte ikke å kopiere til utklippstavlen + Trykk for å laste ned %s + Du bruker den nyeste versjonen av NewPipe + Kort + Importer eller eksporter fra trepunktsmenyen + Hurtigmodus \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index c5e77b29fd1..ab73b602feb 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -727,7 +727,9 @@ U heeft de laatste versie van NewPipe Klik om %s te downloaden Kon niet naar klembord kopiëren - Deze instelling is alleen beschikbaar als %s als thema ingesteld is + Deze instelling is alleen beschikbaar als %s als Thema ingesteld is Kaart Miniatuur niet ingesteld + De afspeellijsten die grijs zijn, bevatten dit item al. + Duplicaat is %d tijd(en) toegevoegd \ No newline at end of file diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index bc8d9fcee5c..31a53a6b33b 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -730,4 +730,6 @@ କାର୍ଡ କ୍ଲିପବୋର୍ଡରେ କପି କରିବାରେ ବିଫଳ ସ୍ଥାୟୀ ଥମ୍ୱନେଲ୍ ସେଟ୍ କରନ୍ତୁ + ଧୂସର ହୋଇଯାଇଥିବା ପ୍ଲେଲିଷ୍ଟଗୁଡିକ ପୂର୍ବରୁ ଏହି ଆଇଟମ୍ ଧାରଣ କରିଥାଏ । + ନକଲ %d ସମୟ (ମୋଟ) ଯୋଡି ହୋଇଛି \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index e7ae07c85ee..4f5ae1448b9 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -422,7 +422,7 @@ Minął czas połączenia Używaj systemowego selektora folderów (SAF) Systemowy selektor folderów (SAF) umożliwia pobieranie na kartę pamięci - Usuń pozycje odtwarzania + Wyczyść pozycje odtwarzania Usuwa wszystkie pozycje odtwarzania Usunąć wszystkie pozycje odtwarzania\? Przełącz usługę, aktualnie wybrana: @@ -531,7 +531,7 @@ Artyści Albumy Piosenki - To wideo ma ograniczenia wiekowe. + To wideo jest objęte ograniczeniem wiekowym. \n \nWłącz „%1$s” w ustawieniach, jeśli chcesz je zobaczyć. Tak, i częściowo obejrzane wideo @@ -578,7 +578,7 @@ Dodano do kolejki Dodaj do kolejki Pokaż wycieki pamięci - Wyczyść ciasteczka, które NewPipe przechowuje po rozwiązaniu reCAPTCHA + Usuwa ciasteczka, które NewPipe przechowuje po rozwiązaniu reCAPTCHA Ciasteczka reCAPTCHA zostały wyczyszczone Wyczyść ciasteczka reCAPTCHA YouTube udostępnia „Tryb ograniczonego dostępu”, który ukrywa potencjalne treści dla dorosłych @@ -751,4 +751,6 @@ Usuń stałą miniaturę Nie udało się skopiować do schowka Karta + Wyszarzone playlisty zawierają już tę pozycję + Dodano duplikat %d raz(y) \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index fc02f29d7f2..f9b3ac196b6 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -743,4 +743,6 @@ Desativar miniatura permanente Cartão Falha ao copiar para a área de transferência + Duplicata adicionada %d vez(es) + As playlists em cinza já contêm este item. \ No newline at end of file diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 4c2593330dd..80f6331e301 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -730,4 +730,6 @@ Desativar miniatura permanente Não foi possível copiar para a área de transferência Cartão + As listas de reprodução acinzentadas já contêm este item. + Duplicar adicionado %d vez(es) \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index c47241dcc93..36528078c0e 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -739,8 +739,10 @@ Importar ou exportar subscrições do menu de 3 pontos Já está a executar a versão mais recente do NewPipe Toque para descarregar %s - Esta opção só está disponível se %s for selecionado para o tema + Esta opção só está disponível se estiver selecionado %s para o tema Desativar miniatura permanente Não foi possível copiar para a área de transferência Cartão + As listas de reprodução acinzentadas já contêm este item. + Duplicar adicionado %d vez(es) \ No newline at end of file diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 2dc847dafd0..5eae3876ffb 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -740,4 +740,7 @@ Rulați cea mai recentă versiune NewPipe Atingeți pentru a descărca %s Această opțiune este disponibilă numai dacă %s este selectată ca temă + Cartelă + Nu s-a reușit copierea în clipboard + Dezactivare miniatură permanentă \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 50376dc032a..999e9b2fee1 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -661,7 +661,7 @@ Высокое качество (крупнее) Миниатюра над полосой прокрутки Автору видео понравилось это - Пометить просмотренными + Пометить проигранным Picasso: указать цветом источник изображений (красный — сеть, синий — диск, зелёный — память) Цветные метки на изображениях Серверные предложения поиска @@ -747,4 +747,6 @@ Не удалось скопировать в буфер обмена Доступно, когда Тема установлена в %s Убрать постоянную миниатюру + Дубликат добавлен %d раз(а) + Плейлисты, выделенные серым уже содержат этот объект. \ No newline at end of file diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index e649cfac2a0..68c6fd5c1a8 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -730,4 +730,6 @@ Carta Còpia in punta de billete fallida Disativa sa miniadura permanente + Sas iscalitas in colore murru tenent giai custu elementu. + Duplicadu annantu %d borta(s) \ No newline at end of file diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index c45086ee017..f8340b47bc4 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -735,4 +735,14 @@ Pozrieť na webovej stránke Usporiadať Ak máte problémy s používaním aplikácie, určite si prečítajte tieto odpovede na časté otázky! + Vypnutie trvalého náhľadu + Kopírovanie do schránky zlyhalo + Zoznamy zobrazené šedou farbou už obsahujú danú položku. + Karta + Dotykom stiahnite %s + Duplikát bol pridaný %d-krát + Používate najnovšiu verziu NewPipe + Táto možnosť je dostupná len pre motív %s + Rýchly režim + Import alebo export odberov z 3-bodkovej ponuky \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index fbe793569fb..a64bbf55566 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -727,4 +727,7 @@ Du använder den senaste versionen av NewPipe Tryck för att ladda ner %s Det här alternativet är endast tillgängligt om %s har valts som Tema + Inaktivera permanent miniatyrbild + Det gick inte att kopiera till urklipp + Kort \ No newline at end of file diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 12effb9e296..fd7e457bf7d 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -15,7 +15,7 @@ ตั้งค่า หรือคุณหมายถึง \"%1$s\"\? แชร์ด้วย - Use external video player + ใช้เครื่องเล่นวีดิโอภายนอก ใช้แอปเล่นเสียงภายนอก ติดตาม ติดตามแล้ว @@ -357,7 +357,7 @@ หยุดชั่วคราวเมื่อเปลี่ยนเป็นข้อมูลมือถือ การดาวน์โหลดที่ไม่สามารถหยุดพักได้จะเริ่มต้นใหม่ ปิด - Removes audio at some resolutions + บางความละเอียดอาจไม่มีเสียง แคช metadate ถูกลบแล้ว เล่นต่อหลังจากการขัดจังหวะ เล่นต่อ @@ -369,4 +369,13 @@ เปิดด้วย ทำเครื่องหมายว่าดูแล้ว ตกลง + ปุ่มการกระทำที่สี่ + ปุ่มการกระทำแรก + ปุ่มการกระทำที่สาม + ปุ่มการกระทำที่ห้า + แก้ไขการกระทำของการแต่การแจ้งเตือนด้วยการแตะไปที่มัน เลือกสามรายการที่จะแสดงในการแจ้งเตือนในการแจ้งเตือนแบบกระทัดรัดโดยใช้ปุ่มกาเครื่องหมายทางขวา + ครอบตัดตัวอย่างภาพเป็นอัตราส่วน 1:1 + ครอบตัดตัวอย่างภาพที่แสดงในการแจ้งเตือนจากอัตราส่วน 16:9 เป็น 1:1 + ทำเครื่องเล่นพัง + ปุ่มการกระทำรอง \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index aeeb9bdc3de..89825603151 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -730,4 +730,6 @@ Kalıcı küçük resmin ayarını kaldır Kart Panoya kopyalanamadı + %d kez kopyası eklendi + Gri oynatma listeleri halihazırda bu ögeyi içeriyor. \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 16b48fc571e..a8904c05e1a 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -52,7 +52,7 @@ Звіт Інформація: Що сталося: - Натисніть на «лупу», щоб почати. + Торкніться лупи, щоб розпочати. Чорна Завантаження Завантаження @@ -747,4 +747,6 @@ Прибрати постійну мініатюру Картки Не вдалося скопіювати до буфера обміну + Дублікат додано %d раз(ів) + У виділених сірим кольором добірках цей елемент уже є. \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 029aa8343bc..06ae30657c0 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -605,7 +605,7 @@ 支持 语言 年龄限制 - 私有性 + 私密性 许可 标签 类别 @@ -716,5 +716,7 @@ 只有在主题中选择了 %s 该选项才可用 取消设置永久缩略图 卡片 - 未能复制到剪贴板 + 无法复制到剪贴板 + 变灰的播放列表已经包含此项目。 + 重复添加了 %d 次 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index dc7d589b816..42661322f5a 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -717,4 +717,6 @@ 色系揀做%s嘅時候至有得揀 複製唔到去剪貼簿 一張張 + 灰咗嘅播放清單,即係已經有呢個項目。 + 重複加入咗 %d 次 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ab975bff196..0b5112e1815 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -717,4 +717,6 @@ 卡片 取消設定永久縮圖 無法複製到剪貼簿 + 重複新增 %d 次 + 變灰的播放清單已經包含此項目。 \ No newline at end of file diff --git a/fastlane/metadata/android/bn/changelogs/68.txt b/fastlane/metadata/android/bn/changelogs/68.txt new file mode 100644 index 00000000000..8f6742e848c --- /dev/null +++ b/fastlane/metadata/android/bn/changelogs/68.txt @@ -0,0 +1 @@ +https://hosted.weblate.org/translate/newpipe/metadata/bn/?checksum=2a64aca6716bd69b diff --git a/fastlane/metadata/android/cs/changelogs/992.txt b/fastlane/metadata/android/cs/changelogs/992.txt new file mode 100644 index 00000000000..b45f8f73a31 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/992.txt @@ -0,0 +1,17 @@ +Novinky +• Počet odběratelů v podrobnostech videa +• Stahování z fronty +• Permanentní nastavení náhledu playlistu +• Dlouhé podržení hashtagů a odkazů +• Režim zobrazení v kartách + +Vylepšení +• Větší tlačítko k zavření minipřehrávače +• Jemnější zmenšování náhledů +• Cíl Android 13 (API 33) +• Posouvání v přehrávači jej již nezastaví + +Opravy +• Oprava překrytí s DeX/myší +• Povolení přehrávače na pozadí bez oddělených streamů zvuku +• Různé opravy YouTube a další… diff --git a/fastlane/metadata/android/de/changelogs/900.txt b/fastlane/metadata/android/de/changelogs/900.txt index a4a8a1253df..58fc1e05d1b 100644 --- a/fastlane/metadata/android/de/changelogs/900.txt +++ b/fastlane/metadata/android/de/changelogs/900.txt @@ -1,14 +1,14 @@ -Neu -- Abonnementgruppen und sortierte Feeds -- Stummschalttaste in Playern +Neu: +• Abonnementgruppen und sortierte Feeds +• Stummschalttaste in Playern -Verbessert -- Das Öffnen von music.youtube.com und media.ccc.de Links in NewPipe erlaubt -- Zwei Einstellungen wurden von "Erscheinungsbild" zu "Inhalt" verschoben -- Ausblenden der Suchoptionen 5, 15 und 25 Sekunden, wenn die ungenaue Suche aktiviert ist +Verbessert: +• Öffnen von music.youtube.com und media.ccc.de Links in NewPipe erlaubt +• Zwei Einstellungen von „Erscheinungsbild“ zu „Inhalt“ verschoben +• Ausblenden der Suchoptionen 5, 15 und 25 Sekunden, wenn die ungenaue Suche aktiviert ist -Behoben -- einige WebM-Videos sind nicht suchbar -- Datenbank-Backup auf Android P -- Absturz beim Teilen einer heruntergeladenen Datei -- YouTube-Extraktionsprobleme, ... +Behoben: +• Einige WebM-Videos sind nicht suchbar +• Datenbank-Backup auf Android P +• Absturz beim Teilen einer heruntergeladenen Datei +• YouTube-Extraktionsprobleme und mehr … diff --git a/fastlane/metadata/android/de/changelogs/958.txt b/fastlane/metadata/android/de/changelogs/958.txt index 4b41f7d70a5..96b0629d2a9 100644 --- a/fastlane/metadata/android/de/changelogs/958.txt +++ b/fastlane/metadata/android/de/changelogs/958.txt @@ -1,15 +1,15 @@ -Neu+verbessert -•Option Miniansicht Ausblenden auf Sperrbildschirm wieder hinzugefügt -•Ziehen zum Feed aktualisieren -•Verbesserte Leistung beim Abruf lokaler Listen +Neu und verbessert: +• Option Vorschaubild auf Sperrbildschirm ausblenden wieder hinzugefügt +• Ziehen zum Feed aktualisieren +• Verbesserte Leistung beim Abruf lokaler Listen -Behoben -•Absturz, Start von NewPipe, nachdem es aus dem RAM entfernt wurde -•Absturz, Starten von NewPipe ohne Internetverbindung -•Einstellungen Helligkeits- und Lautstärkegesten -•[YT] Lange Wiedergabelisten +Behoben: +• Absturz, NewPipe-Start nachdem es aus dem RAM entfernt wurde +• Absturz, NewPipe-Start ohne Internetverbindung +• Einstellungen Helligkeits- und Lautstärkegesten +• [YT] Lange Wiedergabelisten -Sonstiges -•Codebereinigung, verschiedene interne Verbesserungen -•Aktualisierung Abhängigkeiten -•Aktualisierte Übersetzungen +Sonstiges: +• Codebereinigung, etliche interne Verbesserungen +• Abhängigkeiten aktualisiert +• Übersetzungen aktualisiert diff --git a/fastlane/metadata/android/de/changelogs/970.txt b/fastlane/metadata/android/de/changelogs/970.txt index 301ea1e3f0e..53f80fed1ab 100644 --- a/fastlane/metadata/android/de/changelogs/970.txt +++ b/fastlane/metadata/android/de/changelogs/970.txt @@ -1,11 +1,11 @@ -Neu -• Inhaltsmetadaten (Tags, Kategorien, Lizenz, ...) unter der Beschreibung anzeigen -• Option "Kanaldetails anzeigen" in remote (nicht lokalen) Wiedergabelisten hinzugefügt -• Option "Im Browser öffnen" zum Langdruck-Menü hinzugefügt +Neu: +• Inhaltsmetadaten (Tags, Kategorien, Lizenz, …) unter der Beschreibung anzeigen +• Option „Kanaldetails anzeigen“ in remote (nicht lokalen) Wiedergabelisten hinzugefügt +• Option „Im Browser öffnen“ zum Langdruck-Menü hinzugefügt -Behoben +Behoben: • Rotationsabsturz auf der Videodetailseite -• "Mit Kodi spielen"-Button im Player fordert immer auf, Kore zu installieren +• „Mit Kodi spielen“-Button im Player fordert immer auf, Kore zu installieren • Setzen von Import- und Exportpfaden wurde behoben und verbessert • [YouTube] Anzahl Kommentar-Likes korrigiert Und vieles mehr diff --git a/fastlane/metadata/android/de/changelogs/975.txt b/fastlane/metadata/android/de/changelogs/975.txt index de60202d168..7b56b45c2e2 100644 --- a/fastlane/metadata/android/de/changelogs/975.txt +++ b/fastlane/metadata/android/de/changelogs/975.txt @@ -1,16 +1,17 @@ -Neu -- Anzeige eines Vorschaubilds während der Suche -- Deaktivierte Kommentare erkennen -- Erlaubt das Markieren eines Feed-Elements als beobachtet -- Kommentarherzen anzeigen +Neu: +• Vorschaubild-Anzeige während der Suche +• Deaktivierte Kommentare erkennen +• Feed-Element als beobachtet markieren +• Kommentarherzen anzeigen -Verbessert -- Verbessertes Layout von Metadaten und Tags -- Dienstfarbe auf UI-Komponenten anwenden +Verbessert: +• Layout von Metadaten und Tags +• Dienstfarbe für UI-Komponenten -Behoben -- Korrektur des Vorschaubilds im Mini-Player -- Behebung der endlosen Pufferung bei doppelten Warteschlangenelementen -- Einige Player-Fixes wie Rotation und schnelleres Schließen -- Behebung von ReCAPTCHA -... +Behoben: +• Vorschaubild im Mini-Player +• Endlose Pufferung bei doppelten Warteschlangenelementen +• Einige Player-Fixes wie Rotation und schnelleres Schließen +• ReCAPTCHA lädt im Hintergrund +• Klicks bei Feed-Aktualisierung deaktivieren +• Einige Downloader-Abstürze diff --git a/fastlane/metadata/android/de/changelogs/976.txt b/fastlane/metadata/android/de/changelogs/976.txt index a70829150f4..296d9ab4b95 100644 --- a/fastlane/metadata/android/de/changelogs/976.txt +++ b/fastlane/metadata/android/de/changelogs/976.txt @@ -1,10 +1,10 @@ -- Option zum direkten Öffnen des Players im Vollbildmodus hinzugefügt -- Auswahl der anzuzeigenden Suchvorschläge möglich -- Dunkles Theme jetzt dunkler + dunkler Splash-Screen hinzugefügt -- Verbesserte Dateiauswahl, um unerwünschte Dateien auszugrauen -- Import von YouTube-Abonnements behoben -- Das Wiederholen eines Streams erfordert ein erneutes Tippen auf die Wiedergabetaste -- Behoben: Audio-Sitzung schließen -... +• Option zum direkten Öffnen des Players im Vollbildmodus hinzugefügt +• Auswahl der anzuzeigenden Suchvorschläge möglich +• Dunkles Design nun dunkler + dunkler Splash-Screen hinzugefügt +• Verbesserte Dateiauswahl, um unerwünschte Dateien auszugrauen +• Import von YouTube-Abonnements behoben +• Das Wiederholen eines Streams erfordert ein erneutes Tippen auf die Wiedergabetaste +• Behoben: Audio-Sitzung schließen +… Änderungen finden Sie im Changelog (und im Blogbeitrag) auf dem Links-Tab unten. diff --git a/fastlane/metadata/android/de/changelogs/977.txt b/fastlane/metadata/android/de/changelogs/977.txt index 54c3d72f6db..fffd6c9ad78 100644 --- a/fastlane/metadata/android/de/changelogs/977.txt +++ b/fastlane/metadata/android/de/changelogs/977.txt @@ -1,9 +1,9 @@ -- Die Schaltfläche "Weiter abspielen" wurde dem Langdruckmenü hinzugefügt -- YouTube Shorts Pfadpräfix zum Absichtsfilter hinzugefügt -- Import von Einstellungen behoben -- Position der Suchleiste mit Player-Schaltflächen im Warteschlangen-Bildschirm vertauscht -- Verschiedene Korrekturen im Zusammenhang mit MediasessionManager -- Die Suchleiste wurde nach dem Ende des Videos nicht abgeschlossen -... +• Die Schaltfläche „Weiter abspielen“ wurde dem Langdruckmenü hinzugefügt +• YouTube Shorts Pfadpräfix zum Absichtsfilter hinzugefügt +• Import von Einstellungen behoben +• Position der Suchleiste mit Player-Schaltflächen im Warteschlangen-Bildschirm vertauscht +• Verschiedene Korrekturen im Zusammenhang mit MediasessionManager +• Die Suchleiste wurde nach dem Ende des Videos nicht abgeschlossen +… -Weitere Änderungen finden Sie im Changelog (und im Blogbeitrag) auf der Registerkarte Links unten. +Weitere Änderungen finden Sie im Changelog (und im Blogbeitrag) auf dem Links-Tab unten. diff --git a/fastlane/metadata/android/de/changelogs/980.txt b/fastlane/metadata/android/de/changelogs/980.txt index 3e32d136bc1..dc69300f349 100644 --- a/fastlane/metadata/android/de/changelogs/980.txt +++ b/fastlane/metadata/android/de/changelogs/980.txt @@ -1,13 +1,13 @@ -Neu -- Option "Zur Wiedergabeliste hinzufügen" zum Freigabemenü hinzugefügt -- Unterstützung für y2u.be und PeerTube Kurzlinks hinzugefügt +Neu: +• Option „Zur Wiedergabeliste hinzufügen“ zum Freigabemenü hinzugefügt +• Unterstützung für y2u.be- und PeerTube-Kurzlinks hinzugefügt -Verbessert -- Playback-Speed-Controls kompakter gemacht -- Feed hebt jetzt neue Elemente hervor -- "Beobachtete Artikel anzeigen" Option im Feed wird nun gespeichert +Verbessert: +• Playback-Speed-Controls kompakter gemacht +• Feed hebt jetzt neue Elemente hervor +• „Beobachtete Artikel anzeigen“-Option im Feed wird nun gespeichert -Behoben -- Extraktion von YouTube Likes und Dislikes behoben -- Automatische Wiederholung nach Rückkehr aus dem Hintergrund behoben +Behoben: +• Extraktion von YouTube Likes und Dislikes behoben +• Automatische Wiederholung nach Rückkehr aus dem Hintergrund behoben Und vieles mehr diff --git a/fastlane/metadata/android/de/changelogs/986.txt b/fastlane/metadata/android/de/changelogs/986.txt new file mode 100644 index 00000000000..044365eb8bd --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/986.txt @@ -0,0 +1,16 @@ +Neu: +• Benachrichtigungen für neue Streams +• Nahtloser Übergang zwischen Hintergrund- und Videoplayer +• Änderung der Tonhöhe um Halbtöne +• Warteschlange des Hauptplayers an Wiedergabeliste anfügen + +Verbessert: +• Geschwindigkeit/Tonhöhenschrittgröße speichern +• Anfängliche lange Videoplayer-Pufferung verringert +• Player-UI für Android TV +• Löschbestätigung für alle heruntergeladenen Dateien + +Behoben: +• Medienschaltfläche blendet die Steuerelemente des Players nicht aus +• Rücksetzung der Wiedergabe bei Änderung des Playertyps +• Drehung des Wiedergabelisten-Dialogs diff --git a/fastlane/metadata/android/de/changelogs/987.txt b/fastlane/metadata/android/de/changelogs/987.txt index a857b1caac3..f7bc9bd8040 100644 --- a/fastlane/metadata/android/de/changelogs/987.txt +++ b/fastlane/metadata/android/de/changelogs/987.txt @@ -1,12 +1,12 @@ -Neu -- Unterstützung anderer Übertragungsmethoden als progressives HTTP: schnellere Ladezeit der Wiedergabe, Korrekturen für PeerTube und SoundCloud, Wiedergabe von kürzlich beendeten YouTube-Livestreams -- Schaltfläche "Hinzufügen" zum Hinzufügen einer entfernten Wiedergabeliste zu einer lokalen Wiedergabeliste -- Bildvorschau im Android 10+ Teilen-Dialog +Neu: +• Unterstützung anderer Übertragungsmethoden als progressives HTTP: schnellere Ladezeit der Wiedergabe, Korrekturen für PeerTube und SoundCloud, Wiedergabe von kürzlich beendeten YouTube-Livestreams +• Schaltfläche um entfernte Wiedergabeliste einer lokalen Wiedergabeliste hinzuzufügen +• Bildvorschau im Android 10+ Teilen-Dialog -Verbesserte -- Verbesserung des Dialogs für Wiedergabewerte -- Import/Export-Schaltflächen für Abonnements in das Drei-Punkte-Menü verschieben +Verbessert: +• Wiedergabewerte-Dialog +• Import/Export-Schaltflächen für Abonnements in das Drei-Punkte-Menü verschoben -Behoben -- Fix: Entfernen vollständig angesehener Videos aus der Wiedergabeliste -- Repariert das Thema des Freigabemenüs und den Eintrag "Zur Wiedergabeliste hinzufügen" +Behoben: +• Entfernung von vollständig angesehenen Videos aus der Wiedergabeliste +• Freigabemenü-Design und „Zur Wiedergabeliste hinzufügen“-Eintrag diff --git a/fastlane/metadata/android/de/changelogs/990.txt b/fastlane/metadata/android/de/changelogs/990.txt index f1273a211c4..a629c8654a2 100644 --- a/fastlane/metadata/android/de/changelogs/990.txt +++ b/fastlane/metadata/android/de/changelogs/990.txt @@ -1,15 +1,15 @@ -Ab sofort entfällt die Unterstützung für Android 4.4 KitKat, die Mindestversion ist Android 5 Lollipop! +Mit dieser Version entfällt die Unterstützung für Android 4.4 KitKat, die Mindestversion ist nun Android 5 Lollipop! -Neu -- Herunterladen aus dem Langdruck-Menü -- Zukünftige Videos im Feed ausblenden -... +Neu: +• Herunterladen aus dem Langdruckmenü +• Zukünftige Videos im Feed ausblenden +• Lokale Wiedergabelisten teilen -Verbessert -- Refaktorierung des Player-Codes in kleine Komponenten: weniger RAM-Verbrauch, weniger Bugs -- Verbesserter Skalierungsmodus für Miniaturansichten -... +Verbessert: +• Player-Code in kleine Komponenten refaktorisiert: weniger RAM-Verbrauch, weniger Bugs +• Skalierungsmodus für Miniaturansicht +… -Behoben -- Behebung verschiedener Probleme mit der Player-Benachrichtigung: veraltete/fehlende Medieninformationen, verzerrte Miniaturansicht -... +Behoben: +• Verschiedene Probleme mit Player-Benachrichtigung: veraltete/fehlende Medieninfos, verzerrte Miniaturansicht +… diff --git a/fastlane/metadata/android/de/changelogs/991.txt b/fastlane/metadata/android/de/changelogs/991.txt index 3a8cae2cbcc..d2faadae77c 100644 --- a/fastlane/metadata/android/de/changelogs/991.txt +++ b/fastlane/metadata/android/de/changelogs/991.txt @@ -1,13 +1,13 @@ -Neu -- Schaltfläche "Im Browser öffnen" im Fehlerbedienfeld hinzugefügt -- Option zur Anzeige von Kanalgruppen als Liste hinzugefügt -- [YouTube] Langes Klicken auf Streamsegmente zum Teilen der Zeitstempel-URL -- Schaltfläche "Warteschlange abspielen" zum Mini-Player hinzugefügt +Neu: +• Neue Schaltfläche "Im Browser öffnen" im Fehler-Fenster +• Anzeigeoption von Kanalgruppen als Liste +• [YouTube] Langer Klick auf Streamsegmente um Zeitstempel-URL zu teilen +• Schaltfläche „Warteschlange abspielen“ im Mini-Player -Verbessert -- Isländische Lokalisierung hinzugefügt, viele Übersetzungen aktualisiert -- Viele interne Verbesserungen +Verbessert: +• Isländische Lokalisierung hinzugefügt, viele Übersetzungen aktualisiert +• Viele interne Verbesserungen -Behoben -- Mehrere Abstürze behoben -- [YouTube] Behebung von Problemen beim Laden von Kanälen... +Behoben: +• Mehrere Abstürze behoben +• [YouTube] Fehlerbehebung für Laden von Kanälen, nicht zugeordnete Feeds und Wiedergabe in einigen Ländern diff --git a/fastlane/metadata/android/de/changelogs/992.txt b/fastlane/metadata/android/de/changelogs/992.txt new file mode 100644 index 00000000000..f0993d9936b --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/992.txt @@ -0,0 +1,17 @@ +Neu: +• Anzahl der Abonnenten in den Videodetails +• Herunterladen aus der Warteschlange +• Dauerhaftes Einstellen einer Wiedergabelisten-Miniaturansicht +• Hashtags und Links lang drücken +• Kartenansicht-Modus + +Verbessert: +• Größere Schaltfläche um Mini-Player zu schließen +• Glattere Miniaturansicht-Skalierung +• Android 13 (API 33) +• Suchen hält den Player nicht mehr an + +Behoben: +• Overlay auf DeX/Maus +• Hintergrundplayer ohne separate Audiostreams +• YouTube-Korrekturen und mehr… diff --git a/fastlane/metadata/android/es/changelogs/992.txt b/fastlane/metadata/android/es/changelogs/992.txt new file mode 100644 index 00000000000..bdbd0ccba26 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/992.txt @@ -0,0 +1,17 @@ +Nuevo +• Número de suscriptores en los detalles del video +• Descarga desde la cola +• Establecer permanentemente una miniatura de lista de reproducción +• Hashtags y enlaces con pulsación de larga duración +• Modo de vista de tarjeta + +Mejorado +• Botón de cierre del minirreproductor más grande +• Reducción de escala de miniaturas más suave +• Objetivo Android 13 (API 33) +• Buscar ya no detiene el reproductor + +Arreglos +• Solucionar superposición en DeX/ratón +• Permitir reproductor de fondo sin transmisiones de audio separadas +• Varias correcciones de YouTube y más… diff --git a/fastlane/metadata/android/eu/changelogs/992.txt b/fastlane/metadata/android/eu/changelogs/992.txt new file mode 100644 index 00000000000..5b0dd96ba70 --- /dev/null +++ b/fastlane/metadata/android/eu/changelogs/992.txt @@ -0,0 +1,17 @@ +Zer berri +• Harpidetza kopurua bideoen xehetasunetan +• Ilaratik deskargatu +• Erreprodukzio-zerrendei betirako izango den miniatura ezarri +• Luze sakatu traola eta estekentzako +• Txartel-bista modua + +Hobekuntzak +• Mini-erreproduzitzailearen ixteko botoi handiago bat +• Miniaturen eskala murrizketa arinagoa +• Android 13 (API 33) +• Bilaketak ez du erreprodukzioa geldiaraziko + +Konponketak +• DeX/saguaren gainezarpena konpondua +• Bigarren planoko erreprodukzioa baimendu bereizitako bi audio-jariorik gabe +• YouTube-kin zeuden arazoak konpondu eta are gehiago… diff --git a/fastlane/metadata/android/hi/changelogs/64.txt b/fastlane/metadata/android/hi/changelogs/64.txt new file mode 100644 index 00000000000..65e1f16a7d0 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/64.txt @@ -0,0 +1,8 @@ +### सुधार +- मोबाइल डेटा का उपयोग करते समय वीडियो की गुणवत्ता को सीमित करने की क्षमता को जोड़ा गया। #1339 +- सत्र # 1442 के लिए चमक याद रखें +- कमजोर सीपीयू # 1431 के लिए डाउनलोड प्रदर्शन में सुधार +- मीडिया सत्र # 1433 के लिए समर्थन जोड़ें (काम कर रहा है) + +### फिक्स +- डाउनलोड खोलने पर क्रैश ठीक करें (रिलीज बिल्ड के लिए अब उपलब्ध है) # 1441 diff --git a/fastlane/metadata/android/hi/changelogs/65.txt b/fastlane/metadata/android/hi/changelogs/65.txt new file mode 100644 index 00000000000..8570a056a10 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/65.txt @@ -0,0 +1,26 @@ +### Improvements + +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). + - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. + - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. + - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging +- Use new extractor with refactored architecture for multiservice + +### Fixes + +- Fix #1440 Broken Video Info Layout #1491 +- View history fix #1497 + - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. + - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. +- Fix creen timeout in case of popup mode. #1463 (Fixed #640) +- Main video player fix #1509 + - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. + - Fixed minimizing player to popup does not destroy player when popup permission is not granted. diff --git a/fastlane/metadata/android/hi/changelogs/66.txt b/fastlane/metadata/android/hi/changelogs/66.txt new file mode 100644 index 00000000000..30c20b0e8cb --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/66.txt @@ -0,0 +1,33 @@ +# Changelog of v0.13.7 + +### Fixed +- Fix sort filter issues of v0.13.6 + +# Changelog of v0.13.6 + +### Improvements + +- Disable burgermenu icon animation #1486 +- undo delete of downloads #1472 +- Download option in share menu #1498 +- Added share option to long tap menu #1454 +- Minimize main player on exit #1354 +- Library version update and database backup fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). + - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. + - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. + - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging +- Use new extractor with refactored architecture for multiservice + +### Fixes + +- Fix #1440 Broken Video Info Layout #1491 +- View history fix #1497 + - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. + - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. +- Fix creen timeout in case of popup mode. #1463 (Fixed #640) +- Main video player fix #1509 + - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. + - Fixed minimizing player to popup does not destroy player when popup permission is not granted. diff --git a/fastlane/metadata/android/hi/changelogs/68.txt b/fastlane/metadata/android/hi/changelogs/68.txt new file mode 100644 index 00000000000..238b1e0b18c --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/68.txt @@ -0,0 +1,31 @@ +# changes of v0.14.1 + +### Fixed +- Fixed failed to decrypt video url #1659 +- Fixed description link not extract well #1657 + +# changes of v0.14.0 + +### New +- New Drawer design #1461 +- New customizable front page #1461 + +### Improvements +- Reworked Gesture controls #1604 +- New way to close the popup player #1597 + +### Fixed +- Fix error when subscription count is not available. Closes #1649. + - Show "Subscriber count not available" in those cases +- Fix NPE when a YouTube playlist is empty +- Quick fix for the kiosks in SoundCloud +- Refactor and bugfix #1623 + - Fix Cyclic search result #1562 + - Fix Seek bar not statically lay outed + - Fix YT Premium video are not blocked correctly + - Fix Videos sometimes not loading (due to DASH parsing) + - Fix links in video description + - Show warning when someone tries to download to external sdcard + - fix nothing shown exception triggers report + - thumbnail not shown in background player for android 8.1 [see here](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Fix registering of broadcast receiver. Closes #1641. diff --git a/fastlane/metadata/android/hi/changelogs/69.txt b/fastlane/metadata/android/hi/changelogs/69.txt new file mode 100644 index 00000000000..c8262d1b0d7 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/69.txt @@ -0,0 +1,19 @@ +### New +- Long-tap delete and share in subscriptions #1516 +- Tablet UI and grid list layout #1617 + +### Improvements +- store and reload the last used aspect ratio #1748 +- Enable linear layout in Downloads activity with full video names #1771 +- Delete and share subscriptions directly from within the subscriptions tab #1516 +- Enqueuing now triggers video playing if the play queue has already ended #1783 +- Separate settings for volume and brightness gestures #1644 +- Add support for Localization #1792 + +### Fixes +- Fix time parsing for . format, so NewPipe can be used in Finland +- Fix subscription count +- Add foreground service permission for API 28+ devices #1830 + +### Known Bugs +- Playback state can not be saved on Android P diff --git a/fastlane/metadata/android/hi/changelogs/70.txt b/fastlane/metadata/android/hi/changelogs/70.txt new file mode 100644 index 00000000000..ad87a4409c5 --- /dev/null +++ b/fastlane/metadata/android/hi/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 diff --git a/fastlane/metadata/android/hi/changelogs/71.txt b/fastlane/metadata/android/hi/changelogs/71.txt new file mode 100644 index 00000000000..5facfc05f3a --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/71.txt @@ -0,0 +1,10 @@ +### 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) diff --git a/fastlane/metadata/android/hi/changelogs/730.txt b/fastlane/metadata/android/hi/changelogs/730.txt new file mode 100644 index 00000000000..e4f260cd2b4 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/730.txt @@ -0,0 +1,2 @@ +# हल किया गया +- हॉट फिक्स डिक्रिप्ट फ़ंक्शन त्रुटि फिर से। diff --git a/fastlane/metadata/android/hi/changelogs/740.txt b/fastlane/metadata/android/hi/changelogs/740.txt new file mode 100644 index 00000000000..c795978a894 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/740.txt @@ -0,0 +1,23 @@ +

Improvements

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

Fixed

+
    +
  • fixed scroll w/ comments and related streams disabled
  • +
  • fixed CheckForNewAppVersionTask being executed when it shouldn't
  • +
  • fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title
  • +
  • fix invalid YouTube url: signature tag name is not always "signature" preventing streams from loading
  • +
diff --git a/fastlane/metadata/android/hi/changelogs/750.txt b/fastlane/metadata/android/hi/changelogs/750.txt new file mode 100644 index 00000000000..39b77f7c346 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/750.txt @@ -0,0 +1,22 @@ +New +Playback resume #2288 +• Resume streams where you stopped last time +Downloader Enhancements #2149 +• Use Storage Access Framework to store downloads on external SD-cards +• New mp4 muxer +• Optionally change the download directory before starting a download +• Respect metered networks + + +Improved +• Removed gema strings #2295 +• Handle (auto)rotation changes during activity lifecycle #2444 +• Make long-press menus consistent #2368 + +Fixed +• Fixed selected subtitle track name not being shown #2394 +• Do not crash when check for app update fails (GitHub version) #2423 +• Fixed downloads stuck at 99.9% #2440 +• Update play queue metadata #2453 +• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/hi/changelogs/760.txt b/fastlane/metadata/android/hi/changelogs/760.txt new file mode 100644 index 00000000000..6e000f6d9f0 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/760.txt @@ -0,0 +1,43 @@ +Changes in 0.17.1 + +New +• Thai localization + + +Improved +• Add start playing here action in long-press menus for playlists again #2518 +• Add switch for SAF / legacy file picker #2521 + +Fixed +• Fix disappearing buttons in downloads view when switching apps #2487 +• Fix playback position is stored although watch history is disabled +• Fix reduced performance caused by playback position in list views #2517 +• [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 +• [Extractor] [YouTube] Fix casual search error when playlists are in results TeamNewPipe/NewPipeExtractor#185 + + + +Changes in 0.17.0 + +New +Playback resume #2288 +• Resume streams where you stopped last time +Downloader Enhancements #2149 +• Use Storage Access Framework to store downloads on external SD-cards +• New mp4 muxer +• Optionally change the download directory before starting a download +• Respect metered networks + + +Improved +• Removed gema strings #2295 +• Handle (auto)rotation changes during activity lifecycle #2444 +• Make long-press menus consistent #2368 + +Fixed +• Fixed selected subtitle track name not being shown #2394 +• Do not crash when check for app update fails (GitHub version) #2423 +• Fixed downloads stuck at 99.9% #2440 +• Update play queue metadata #2453 +• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/hi/changelogs/770.txt b/fastlane/metadata/android/hi/changelogs/770.txt new file mode 100644 index 00000000000..c775d63fc39 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/770.txt @@ -0,0 +1,4 @@ +0.17.2 में परिवर्तन + +फिक्स +• फिक्स कोई वीडियो उपलब्ध नहीं था diff --git a/fastlane/metadata/android/hi/changelogs/780.txt b/fastlane/metadata/android/hi/changelogs/780.txt new file mode 100644 index 00000000000..9100d7335f0 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/780.txt @@ -0,0 +1,12 @@ +Changes in 0.17.3 + +Improved +• Added option to clear playback states #2550 +• Show hidden directories in the file picker #2591 +• Support URLs from `invidio.us` instances to be opened with NewPipe #2488 +• Add support for `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 + +Fixed +• [YouTube] Fixed 'java.lang.IllegalArgumentException #192 +• [YouTube] Fixed live streams not working TeamNewPipe/NewPipeExtractor#195 +• Fixed performance problem in android pie when downloading a stream #2592 diff --git a/fastlane/metadata/android/hi/changelogs/790.txt b/fastlane/metadata/android/hi/changelogs/790.txt new file mode 100644 index 00000000000..ec77b2acb0d --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/790.txt @@ -0,0 +1,14 @@ +Improved +• Add more titles to improve accessibility for blind people #2655 +• Make language of download folder setting more consistent and less ambiguous #2637 + +Fixed +• Check if last byte in the block is downloaded #2646 +• Fixed scrolling in video detail fragment #2672 +• Remove double search clear box animations to one #2695 +• [SoundCloud] Fix client_id extraction #2745 + +Development +• Add missing dependencies inherited from NewPipeExtractor into NewPipe #2535 +• Migrate to AndroidX #2685 +• Update to ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/hi/changelogs/800.txt b/fastlane/metadata/android/hi/changelogs/800.txt new file mode 100644 index 00000000000..332b5c9946d --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/800.txt @@ -0,0 +1,27 @@ +New +• PeerTube support without P2P (#2201) [Beta]: + ◦ Watch and download videos from PeerTube instances + ◦ Add instances in the settings to access the complete PeerTube world + ◦ There might be problems with SSL handshakes on Android 4.4 and 7.1 when accessing certain instances resulting in a network error. + +• Downloader (#2679): + ◦ Calculate download ETA + ◦ Download opus (webm files) as ogg + ◦ Recover expired download links to resume downloads after a long pause + +Improved +• Make the KioskFragment aware of changes in the preferred content country and improve performance of all main tabs #2742 +• Use new Localization and Downloader implementations from extractor #2713 +• Make "Default kiosk" string translatable +• Black navigation bar for black theme #2569 + +Fixed +• Fixed a bug that could not move the popup player if another finger was placed while moving the popup player #2772 +• Allow playlists missing an uploader and fix crashes related to this problem #2724, TeamNewPipe/NewPipeExtractor#219 +• Enabling TLS1.1/1.2 on Android 4.4 devices (API 19/KitKat) to fix TLS handshake with MediaCCC and some PeerTube instances #2792 +• [SoundCloud] Fixed client_id extraction TeamNewPipe/NewPipeExtractor#217 +• [SoundCloud] Fix audio stream extraction + +Development +• Update ExoPlayer to 2.10.8 #2791, #2816 +• Update Gradle to 3.5.1 and add Kotlin support #2714 diff --git a/fastlane/metadata/android/hi/changelogs/810.txt b/fastlane/metadata/android/hi/changelogs/810.txt new file mode 100644 index 00000000000..c75855fd18a --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/810.txt @@ -0,0 +1,19 @@ +New +• Show video thumbnail on the lock screen when playing in the background + +Improved +• Add local playlist to queue when long pressing on background / popup button +• Make main page tabs scrollable and hide when there is only a single tab +• Limit amount of notification thumbnail updates in background player +• Add dummy thumbnail for empty local playlists +• Use *.opus file extension instead of *.webm and show "opus" in format label instead of "WebM Opus" in the download dropdown +• Add button to delete downloaded files or download history in "Downloads" +• [YouTube] Add support to /c/shortened_url channel links + +Fixed +• Fixed multiple issues when sharing a video to NewPipe and downloading its streams directly +• Fixed player access out of its creation thread +• Fixed search result paging +• [YouTube] Fixed switching on null causing NPE +• [YouTube] Fixed viewing comments when opening an invidio.us url +• [SoundCloud] Updated client_id diff --git a/fastlane/metadata/android/hi/changelogs/820.txt b/fastlane/metadata/android/hi/changelogs/820.txt new file mode 100644 index 00000000000..d99e5f00420 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/820.txt @@ -0,0 +1 @@ +फिक्स्ड डिक्रिप्ट फ़ंक्शन नाम रेगेक्स YouTube को अनुपयोगी बना रहा। diff --git a/fastlane/metadata/android/hi/changelogs/830.txt b/fastlane/metadata/android/hi/changelogs/830.txt new file mode 100644 index 00000000000..b8c338f9aaf --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/830.txt @@ -0,0 +1 @@ +साउंडक्लाउड समस्याओं को ठीक करने के लिए साउंडक्लाउड क्लाइंट_आईडी अपडेट किया गया। diff --git a/fastlane/metadata/android/hi/changelogs/840.txt b/fastlane/metadata/android/hi/changelogs/840.txt new file mode 100644 index 00000000000..95dc80844c8 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/840.txt @@ -0,0 +1,22 @@ +New +• Added language selector to change the app language +• Added send to Kodi button to player collapsible menu +• Added ability to copy comments on long press + +Improved +• Fix ReCaptcha activity and correctly save obtained cookies +• Removed dot-menu in favour of drawer and hide history button when watch history is not enabled in settings +• Ask for display over other apps permission in settings correctly on Android 6 and later +• Rename local playlist by long-clicking in BookmarkFragment +• Various PeerTube improvements +• Improved several English source strings + +Fixed +• Fixed player starting again although it is paused when option "minimize on app switch" enabled and NewPipe is minimized +• Fix initial brightness value for gesture +• Fixed .srt subtitle downloads containing not all line breaks +• Fixed download to SD card failing because some Android 5 devices are not CTF compliant +• Fixed downloading on Android KitKat +• Fixed corrupt video .mp4 file being recognized as audio file +• Fixed multiple localization problems, including wrong Chinese language codes +• [YouTube] Timestamps in description are clickable again diff --git a/fastlane/metadata/android/hi/changelogs/850.txt b/fastlane/metadata/android/hi/changelogs/850.txt new file mode 100644 index 00000000000..09f564614bf --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/850.txt @@ -0,0 +1 @@ +इस रिलीज़ में YouTube वेबसाइट संस्करण अपडेट किया गया था। पुराना वेबसाइट संस्करण मार्च में बंद होने जा रहा है और इसलिए आपको न्यूपाइप को अपग्रेड करना होगा। diff --git a/fastlane/metadata/android/hi/changelogs/860.txt b/fastlane/metadata/android/hi/changelogs/860.txt new file mode 100644 index 00000000000..24a2297a7e8 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/860.txt @@ -0,0 +1,7 @@ +उन्नत +• सेव करें और रिस्टोर करें कि क्या पिच और टेंपो अनहुक हैं या नहीं +• प्लेयर में सपोर्ट डिस्प्ले कटआउट +• गोल दृश्य और ग्राहकों की संख्या +• कम डेटा का उपयोग करने के लिए YouTube को अनुकूलित किया गया + +इस रिलीज़ में YouTube से संबंधित 15 से अधिक बग ठीक किए गए थे। diff --git a/fastlane/metadata/android/hi/changelogs/870.txt b/fastlane/metadata/android/hi/changelogs/870.txt new file mode 100644 index 00000000000..849cc317d53 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/870.txt @@ -0,0 +1,2 @@ +यह एक हॉटफिक्स रिलीज़ है जो न्यूपाइप को बिना किसी बड़ी परेशानी के फिर से साउंडक्लाउड का उपयोग करने की अनुमति देता है। +साउंडक्लाउड के v2 एपीआई का उपयोग अब एक्सट्रैक्टर में किया जाता है और अमान्य क्लाइंट आईडी का पता लगाने में सुधार किया गया है। diff --git a/fastlane/metadata/android/hi/changelogs/900.txt b/fastlane/metadata/android/hi/changelogs/900.txt new file mode 100644 index 00000000000..78a617e47f4 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/900.txt @@ -0,0 +1,14 @@ +New +• Subscription groups and sorted feeds +• Mute button in players + +Improved +• Allow opening music.youtube.com and media.ccc.de links in NewPipe +• Relocate two settings from Appearance to Content +• Hide 5, 15, 25 second seek options if inexact seek is enabled + +Fixed +• some WebM videos are not seekable +• database backup on Android P +• crash when sharing a downloaded file +• tons of YouTube extraction issue and more ... diff --git a/fastlane/metadata/android/hi/changelogs/910.txt b/fastlane/metadata/android/hi/changelogs/910.txt new file mode 100644 index 00000000000..18cf511312e --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/910.txt @@ -0,0 +1 @@ +फिक्स्ड डेटाबेस माइग्रेशन जो न्यूपाइप को कुछ दुर्लभ मामलों में शुरू होने से रोकता है। diff --git a/fastlane/metadata/android/hi/changelogs/920.txt b/fastlane/metadata/android/hi/changelogs/920.txt new file mode 100644 index 00000000000..1484a6bd0ff --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/920.txt @@ -0,0 +1,9 @@ +Improved + +• Added upload date and view count on stream grid items +• Improvements for the drawer header layout + +Fixed + +• Fixed mute button causing crashes on API 19 +• Fixed downloading of long 1080p 60fps videos diff --git a/fastlane/metadata/android/hi/changelogs/930.txt b/fastlane/metadata/android/hi/changelogs/930.txt new file mode 100644 index 00000000000..b23b01ea8ce --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/930.txt @@ -0,0 +1,19 @@ +New +• Search on YouTube Music +• Basic Android TV support + +Improved +• Added the ability to remove all watched videos from a local playlist +• Show message when content isn't supported yet instead of crashing +• Improved popup player resize with pinch gestures +• Enqueue streams on long press on background and popup buttons in channel +• Improved size handling of the drawer header title + +Fixed +• Fixed age restricted content setting not working +• Fixed certain kinds of reCAPTCHAs +• Fixed crash when opening bookmarks while playlist is `null` +• Fixed detection of network related exceptions +• Fixed visibility of group sort button in the subscriptions fragment + +and more diff --git a/fastlane/metadata/android/hi/changelogs/940.txt b/fastlane/metadata/android/hi/changelogs/940.txt new file mode 100644 index 00000000000..f9530bc68c4 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/940.txt @@ -0,0 +1,16 @@ +New +• Add support for SoundCloud comments +• Add YouTube restricted mode setting +• Show PeerTube parent channel details + +Improved +• Show Kore button only for supported services +• Block player gestures that begin at the NavigationBar or StatusBar +• Change retry & subscribe buttons background color based on service color + +Fixed +• Fix download dialog freeze +• Open in browser button now really opens in browser +• Fix crash on opening videos and "Could not play this stream" + +and more diff --git a/fastlane/metadata/android/hi/changelogs/950.txt b/fastlane/metadata/android/hi/changelogs/950.txt new file mode 100644 index 00000000000..4f47a9959f7 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/950.txt @@ -0,0 +1,4 @@ +यह रिलीज़ तीन छोटे सुधार लाता है: +• Android 10+ पर फिक्स्ड स्टोरेज एक्सेस +• फिक्स्ड ओपनिंग कियोस्क +• लंबे वीडियो की निश्चित अवधि पार्सिंग diff --git a/fastlane/metadata/android/hi/changelogs/951.txt b/fastlane/metadata/android/hi/changelogs/951.txt new file mode 100644 index 00000000000..e933e5cbd48 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/951.txt @@ -0,0 +1,17 @@ +New +• Add search for subscription picker in the feed group dialog +• Add filter to the feed group dialog to show only ungrouped subscriptions +• Add playlist tab to main page +• Fast forward/rewind in background/pop-up player queue +• Display search suggestion: did you mean & showing result for + +Improved +• Drop writing application metadata in muxed files +• Do not remove failed streams from the queue +• Update status bar color to match toolbar color + +Fixed +• Fixed audio/video desync caused by floating point cumulative errors +• [PeerTube] Handle deleted comments + +and more diff --git a/fastlane/metadata/android/hi/changelogs/952.txt b/fastlane/metadata/android/hi/changelogs/952.txt new file mode 100644 index 00000000000..d228e3a2ddb --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/952.txt @@ -0,0 +1,7 @@ +Improved +• Auto-play is available for all services (instead of only for YouTube) + +Fixed +• Fixed related streams by supporting YouTube's new continuations +• Fixed age restricted YouTube videos +• [Android TV] Fixed lingering focus highlight overlay diff --git a/fastlane/metadata/android/hi/changelogs/954.txt b/fastlane/metadata/android/hi/changelogs/954.txt index 36536b8c7c3..87df3fb9c0a 100644 --- a/fastlane/metadata/android/hi/changelogs/954.txt +++ b/fastlane/metadata/android/hi/changelogs/954.txt @@ -1,8 +1,9 @@ • नए एप्लिकेशन वर्कफ़्लो: विस्तार पृष्ठ पर वीडियो चलाएं, प्लेयर को छोटा करने के लिए नीचे स्वाइप करें -• मीडियास्टाइल सूचनाएँ: सूचनाएँ, प्रदर्शन सुधार में अनुकूलन योग्य क्रियाएँ +• मीडियास्टाइल सूचनाएँ: सूचनाओं में अनुकूलन योग्य क्रियाएं, प्रदर्शन सुधार • डेस्कटॉप ऐप के रूप में न्यूपाइप का उपयोग करते समय मूल आकार परिवर्तन + • असमर्थित यूआरएल टोस्ट के मामले में खुले विकल्पों के साथ संवाद दिखाएं • रिमोट सुझावों के अनुपलब्धता पर अनुभव में सुधार • 720p60 (इन-ऐप प्लेयर) और 480p (पॉप-अप प्लेयर) के लिए डिफ़ॉल्ट वीडियो की गुणवत्ता वृद्धि - -• त्रुटियों में सुधार और बोहोत कुछ + +• त्रुटियों में सुधार और बहुत कुछ diff --git a/fastlane/metadata/android/hi/changelogs/959.txt b/fastlane/metadata/android/hi/changelogs/959.txt index 601c655acfd..a8879fec200 100644 --- a/fastlane/metadata/android/hi/changelogs/959.txt +++ b/fastlane/metadata/android/hi/changelogs/959.txt @@ -1,5 +1,3 @@ त्रुटि रिपोर्टर खोलने के बाद क्रैश का निश्चित अंतहीन लूप। -पीयरट्यूब उदाहरणों की अद्यतन सूची जो न्यूपाइप द्वारा स्वचालित रूप से खोली जा सकती है। -अपडेट किए गए अनुवाद।त्रुटि रिपोर्टर खोलने के बाद क्रैश का निश्चित अंतहीन लूप। -पीयरट्यूब उदाहरणों की अद्यतन सूची जो न्यूपाइप द्वारा स्वचालित रूप से खोली जा सकती है। +पीरट्यूब इंस्टेंस सूची जो निऊपाईप द्वारा स्वचालित रूप से खोली जा सकती है। अपडेट किए गए अनुवाद। diff --git a/fastlane/metadata/android/hi/changelogs/963.txt b/fastlane/metadata/android/hi/changelogs/963.txt new file mode 100644 index 00000000000..06ca8b0e2d9 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/963.txt @@ -0,0 +1 @@ +• [यूट्यूब] फिक्स्ड निश्चित चैनल निरंतरता diff --git a/fastlane/metadata/android/hi/changelogs/964.txt b/fastlane/metadata/android/hi/changelogs/964.txt new file mode 100644 index 00000000000..1238eb87691 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/964.txt @@ -0,0 +1,8 @@ +• Added support for chapters in player controls +• [PeerTube] Added Sepia search +• Re-added share button in video detail view and moved stream description into the tab layout +• Disable restoring brightness if brightness gesture is disabled +• Added list item to play video on kodi +• Fixed crash when no default browser is set on some devices and improve share dialogs +• Toggle play/pause with hardware space button in fullscreen player +• [media.ccc.de] Various fixes and improvements diff --git a/fastlane/metadata/android/hi/changelogs/965.txt b/fastlane/metadata/android/hi/changelogs/965.txt new file mode 100644 index 00000000000..eaed8c84778 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/965.txt @@ -0,0 +1,6 @@ +Fixed crash which occurred when reordering channel groups. +Fixed getting more YouTube videos from channels and playlists. +Fixed getting YouTube comments. +Added support for /watch/, /v/ and /w/ subpaths in YouTube URLs. +Fixed extraction of SoundCloud client id and geo-restricted content. +Added Northern Kurdish localization. diff --git a/fastlane/metadata/android/hi/changelogs/966.txt b/fastlane/metadata/android/hi/changelogs/966.txt new file mode 100644 index 00000000000..b7fdc182fa4 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/966.txt @@ -0,0 +1,14 @@ +New: +• Add a new service: Bandcamp + +Improved: +• Add an option to have the app follow the device theme +• Prevent some crashes by showing an improved error panel +• Show more information on why content in unavailable +• Hardware space button triggers play/pause +• Show "Download started" toast + +Fixed: +• Fix very small thumbnail in video details while playing in the background +• Fix empty title in minimized player +• Fix last resize mode not being restored correctly diff --git a/fastlane/metadata/android/hi/changelogs/967.txt b/fastlane/metadata/android/hi/changelogs/967.txt new file mode 100644 index 00000000000..ba416b621a5 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/967.txt @@ -0,0 +1 @@ +यूरोपीय संघ में YouTube ठीक से काम नहीं कर रहा है। यह एक नई कुकी और गोपनीयता सहमति प्रणाली के कारण हुआ था जिसके लिए न्यूपाइप को एक सहमति कुकी सेट करने की आवश्यकता होती है। diff --git a/fastlane/metadata/android/hi/changelogs/968.txt b/fastlane/metadata/android/hi/changelogs/968.txt new file mode 100644 index 00000000000..3972a96c159 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/968.txt @@ -0,0 +1,7 @@ +Added channel details option to long-press menu. +Added functionality to rename Playlist Name from playlist interface. +Allow the user to pause while a video is buffering. +Polished the white theme. +Fixed overlapping fonts when using a larger font size. +Fixed no video on Formuler and Zephier devices. +Fixed various crashes. diff --git a/fastlane/metadata/android/hi/changelogs/969.txt b/fastlane/metadata/android/hi/changelogs/969.txt new file mode 100644 index 00000000000..59b2488e974 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/969.txt @@ -0,0 +1,8 @@ +• Allow installation on external storage +• [Bandcamp] Added support for displaying the first three comments on a stream +• Only show 'download has started' toast when download is started +• Do not set reCaptcha cookie when there is no cookie stored +• [Player] Improve cache performance +• [Player] Fixed player not automatically playing +• Dismiss previous Snackbars when deleting downloads +• Fixed trying to delete object not in list diff --git a/fastlane/metadata/android/hi/changelogs/970.txt b/fastlane/metadata/android/hi/changelogs/970.txt new file mode 100644 index 00000000000..f4ff5fe3483 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/970.txt @@ -0,0 +1,11 @@ +New +• Show content metadata (tags, categories, license, ...) below the description +• Added "Show channel details" option in remote (non-local) playlists +• Added "Open in browser" option to long-press menu + +Fixed +• Fixed rotation crash on video detail page +• Fixed "Play with Kodi" button in player always prompts to install Kore +• Fixed and improved setting import and export paths +• [YouTube] Fixed comment like count +And much more diff --git a/fastlane/metadata/android/hi/changelogs/971.txt b/fastlane/metadata/android/hi/changelogs/971.txt new file mode 100644 index 00000000000..48e9ddaa010 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/971.txt @@ -0,0 +1,3 @@ +हॉटफिक्स +• रिबफर के बाद प्लेबैक के लिए बफर बढ़ाएं +• प्लेयर में प्ले-क्यू आइकन पर क्लिक करने पर टैबलेट और टीवी पर क्रैश ठीक किया गया diff --git a/fastlane/metadata/android/hi/changelogs/972.txt b/fastlane/metadata/android/hi/changelogs/972.txt new file mode 100644 index 00000000000..318890d608c --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/972.txt @@ -0,0 +1,14 @@ +New +Recognize timestamps and hashtags in description +Added manual tablet mode setting +Added ability to hide played items in a feed + +Improved +Support Storage Access Framework properly +Better error handling of unavailable and terminated channels +The Android share sheet for Android 10+ users now shows the content title. +Updated Invidious instances and support Piped links. + +Fixed +[YouTube] Age restricted content +Prevent leaked window Exception when opening choice dialog diff --git a/fastlane/metadata/android/hi/changelogs/973.txt b/fastlane/metadata/android/hi/changelogs/973.txt new file mode 100644 index 00000000000..120359a24cd --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/973.txt @@ -0,0 +1,4 @@ +Hotfix +• Fix thumbnails and titles being trimmed in grid layout, due to a wrong calculation of how many videos can fit in one row +• Fix download dialog disappearing without doing anything if opened from the share menu +• Update a library related to opening external activities such as the Storage Access Framework file picker diff --git a/fastlane/metadata/android/hi/changelogs/974.txt b/fastlane/metadata/android/hi/changelogs/974.txt new file mode 100644 index 00000000000..e028a5e0b3a --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/974.txt @@ -0,0 +1,5 @@ +Hotfix +• Fix buffering issues caused by YouTube throttling +• Fix YouTube comments extraction and crashes with disabled comments +• Fix YouTube music search +• Fix PeerTube livestreams diff --git a/fastlane/metadata/android/hi/changelogs/975.txt b/fastlane/metadata/android/hi/changelogs/975.txt new file mode 100644 index 00000000000..8a35a7e2810 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/975.txt @@ -0,0 +1,17 @@ +New +• Show a thumbnail preview while seeking +• Detect disabled comments +• Allow marking a feed item as watched +• Show comment hearts + +Improved +• Improve metadata and tags layout +• Apply service color to UI components + +Fixed +• Fix thumbnail in mini player +• Fix endless buffering on duplicate queue items +• Some player fixes like rotation and faster closing +• Fix ReCAPTCHA remaining loaded in background +• Disable clicks while refreshing feed +• Fix some downloader crashes diff --git a/fastlane/metadata/android/hi/changelogs/976.txt b/fastlane/metadata/android/hi/changelogs/976.txt new file mode 100644 index 00000000000..4f868872bbe --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/976.txt @@ -0,0 +1,10 @@ +• Added option to directly open player in fullscreen +• Allow choosing which types of search suggestions to show +• Dark theme now darker + dark splash screen added +• Improved file picker to gray out unwanted files +• Fixed importing YouTube subscriptions +• Replaying a stream requires on tap on the replay button again +• Fixed closing audio session +• [Android TV] Fixed long seekbar jumps when using a DPad + +To see further changes, view the changelog (and blog post) from the Links tab below. diff --git a/fastlane/metadata/android/hi/changelogs/977.txt b/fastlane/metadata/android/hi/changelogs/977.txt new file mode 100644 index 00000000000..df2eb6c9ea7 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/977.txt @@ -0,0 +1,10 @@ +• Added a "play next" button to the long press menu +• Added YouTube shorts path prefix to intent filter +• Fixed Settings import +• Swap seekbar position with player buttons in Queue screen +• Various fixes related to MediasessionManager +• Fixed seekbar not completed after video end +• Disabled media tunneling on RealtekATV +• Expanded minimized player buttons clickable area + +To see further changes, view the changelog (and blog post) from the Links tab below. diff --git a/fastlane/metadata/android/hi/changelogs/978.txt b/fastlane/metadata/android/hi/changelogs/978.txt new file mode 100644 index 00000000000..bb032f753df --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/978.txt @@ -0,0 +1 @@ +एक नए न्यूपाइप संस्करण के लिए चेक को ठीक किया गया। यह चेक कभी-कभी बहुत जल्दी निष्पादित किया गया था और इसलिए ऐप क्रैश हो गया। इसे अभी ठीक किया जाना चाहिए। diff --git a/fastlane/metadata/android/hi/changelogs/979.txt b/fastlane/metadata/android/hi/changelogs/979.txt new file mode 100644 index 00000000000..f6cec22ceb8 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/979.txt @@ -0,0 +1,2 @@ +- प्लेबैक फिर से शुरू करना +- यह सुनिश्चित करने के लिए सुधार कि सेवा जो यह निर्धारित करती है कि न्यूपाइप को नए संस्करण की जांच करनी चाहिए या नहीं, पृष्ठभूमि में शुरू नहीं हुई है diff --git a/fastlane/metadata/android/hi/changelogs/980.txt b/fastlane/metadata/android/hi/changelogs/980.txt new file mode 100644 index 00000000000..bd3086c6817 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/980.txt @@ -0,0 +1,13 @@ +New +• Added "Add to playlist" option to share menu +• Added support for y2u.be and PeerTube short links + +Improved +• Made Playback-Speed-Controls more compact +• Feed highlights new items now +• "Show watched items" option in the feed is now saved + +Fixed +• Fixed YouTube likes and dislikes extraction +• Fixed automatic replay after returning from the background +And much more diff --git a/fastlane/metadata/android/hi/changelogs/981.txt b/fastlane/metadata/android/hi/changelogs/981.txt new file mode 100644 index 00000000000..a2c1b19b2b3 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/981.txt @@ -0,0 +1,2 @@ +Android 11+ पर बफ़रिंग के बाद विफल प्लेबैक रिज्यूमे को ठीक करने के लिए MediaParser समर्थन को हटा दिया गया। +प्लेबैक समस्याओं को ठीक करने के लिए Philips QM16XE पर मीडिया टनलिंग अक्षम की गई। diff --git a/fastlane/metadata/android/hi/changelogs/982.txt b/fastlane/metadata/android/hi/changelogs/982.txt new file mode 100644 index 00000000000..953fcd801df --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/982.txt @@ -0,0 +1 @@ +फिक्स्ड YouTube कोई स्ट्रीम नहीं चला रहा है। diff --git a/fastlane/metadata/android/hi/changelogs/983.txt b/fastlane/metadata/android/hi/changelogs/983.txt new file mode 100644 index 00000000000..efbd0557c49 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/983.txt @@ -0,0 +1,9 @@ +Add new double-tap-to-seek UI and behaviour +Make settings searchable +Highlight pinned comments as such +Add open-with-app support for FSFE's PeerTube instance +Add error notifications +Fix replay of first queue item on player change +Wait longer when buffering during livestreams before failing +Fix order of local search results +Fix empty item fields in play queue diff --git a/fastlane/metadata/android/hi/changelogs/984.txt b/fastlane/metadata/android/hi/changelogs/984.txt new file mode 100644 index 00000000000..3b18b46652a --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/984.txt @@ -0,0 +1,7 @@ +Load enough initial items in lists to fill the whole screen and to fix scrolling on tablets and TVs +Fix random crashes while scrolling through lists +Have the player fast seek overlay arc go under the system UI +Revert changes to cutouts when playing in multi window, causing the misplaced player regression on some phones +Increase compileSdk from 30 to 31 +Update error reporting library +Refactor some code in the player diff --git a/fastlane/metadata/android/hi/changelogs/985.txt b/fastlane/metadata/android/hi/changelogs/985.txt new file mode 100644 index 00000000000..071ab64e338 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/985.txt @@ -0,0 +1 @@ +फिक्स्ड YouTube कोई स्ट्रीम नहीं चला रहा है diff --git a/fastlane/metadata/android/hi/changelogs/986.txt b/fastlane/metadata/android/hi/changelogs/986.txt new file mode 100644 index 00000000000..49f7478e6db --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/986.txt @@ -0,0 +1,16 @@ +New +• Notifications for new streams +• Seamless transition between background and video players +• Change pitch by semitones +• Append the main player queue to a playlist + +Improved +• Remember speed/pitch step size +• Mitigate initial long buffering in the video player +• Improve player UI for Android TV +• Confirm before deleting all downloaded files + +Fixed +• Fix media button not hiding player controls +• Fix playback reset on player type change +• Fix rotating the playlist dialog diff --git a/fastlane/metadata/android/hi/changelogs/987.txt b/fastlane/metadata/android/hi/changelogs/987.txt new file mode 100644 index 00000000000..c3404e2a22f --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/987.txt @@ -0,0 +1,12 @@ +New +• Support delivery methods other than progressive HTTP: faster playback loading time, fixes for PeerTube and SoundCloud, playback of recently-ended YouTube livestreams +• Add button to add a remote playlist to a local one +• Image preview in Android 10+ share sheet + +Improved +• Improve playback parameters dialog +• Move subscription import/export buttons to three-dot menu + +Fixed +• Fix removing fully watched videos from playlist +• Fix share menu theme and "add to playlist" entry diff --git a/fastlane/metadata/android/hi/changelogs/988.txt b/fastlane/metadata/android/hi/changelogs/988.txt new file mode 100644 index 00000000000..5689958ad93 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/988.txt @@ -0,0 +1,2 @@ +[यूट्यूब] किसी भी वीडियो को चलाने का प्रयास करते समय "कोई स्ट्रीम नहीं मिल सका" त्रुटि को ठीक करें +[यूट्यूब] ठीक करें "निम्न सामग्री इस ऐप पर उपलब्ध नहीं है।" अनुरोधित वीडियो के बजाय दिखाया गया संदेश diff --git a/fastlane/metadata/android/hi/changelogs/989.txt b/fastlane/metadata/android/hi/changelogs/989.txt new file mode 100644 index 00000000000..d868b7fa54e --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/989.txt @@ -0,0 +1,3 @@ +• [यूट्यूब] किसी भी वीडियो को चलाने का प्रयास करते समय असीमित लोडिंग को ठीक करें +• [यूट्यूब] कुछ वीडियो पर थ्रॉटलिंग ठीक करें +• jsoup लाइब्रेरी को 1.15.3 में अपग्रेड करें, जिसमें सुरक्षा समाधान शामिल है diff --git a/fastlane/metadata/android/hi/changelogs/990.txt b/fastlane/metadata/android/hi/changelogs/990.txt new file mode 100644 index 00000000000..e12c20ba589 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/990.txt @@ -0,0 +1,15 @@ +This release drops support for Android 4.4 KitKat, now the minimum version is Android 5 Lollipop! + +New +• Download from long-press menu +• Hide future videos in feed +• Share local playlists + +Improved +• Refactor the player code into small components: less RAM used, less bugs +• Improve thumbnails' scale mode +• Vector-ize image placeholders + +Fixed +• Fix various issues with the player notification: outdated/missing media info, distorted thumbnail +• Fix fullscreen using 1/4 of screen diff --git a/fastlane/metadata/android/hi/changelogs/991.txt b/fastlane/metadata/android/hi/changelogs/991.txt index 46ca2ebb666..a365d5c4456 100644 --- a/fastlane/metadata/android/hi/changelogs/991.txt +++ b/fastlane/metadata/android/hi/changelogs/991.txt @@ -1 +1,13 @@ -नया • त्रुटि पैनल में "ब्राउज़र में खोलें" बटन जोड़ें • चैनल समूहों को सूची के रूप में प्रदर्शित करने का विकल्प जोड़ें • [यूट्यूब] टाइमस्टैम्प यूआरएल साझा करने के लिए स्ट्रीम सेगमेंट पर लंबे समय तक क्लिक करें • मिनी प्लेयर में क्यू प्ले बटन जोड़ें उन्नत • आइसलैंडिक स्थानीयकरण जोड़ें और कई अन्य अनुवादों को अपडेट करें • कई आंतरिक सुधार हल किया गया • एकाधिक दुर्घटनाओं को ठीक करें • [यूट्यूब] कुछ देशों में लोडिंग चैनल, गैर-समर्पित फ़ीड और प्लेबैक समस्याओं को ठीक करें +नया +• त्रुटि पैनल में "ब्राउज़र में खोलें" बटन जोड़ें +• चैनल समूहों को सूची के रूप में प्रदर्शित करने का विकल्प जोड़ें +• [यूट्यूब] टाइमस्टैम्प यूआरएल साझा करने के लिए स्ट्रीम सेगमेंट पर लंबे समय तक क्लिक करें +• मिनी प्लेयर में क्यू प्ले बटन जोड़ें + +उन्नत +• आइसलैंडिक स्थानीयकरण जोड़ें और कई अन्य अनुवादों को अपडेट करें +• कई आंतरिक सुधार + +हल किया गया +• कई सारे क्रैश को ठीक करें +• [यूट्यूब] कुछ देशों में लोडिंग चैनल, गैर-समर्पित फ़ीड और प्लेबैक समस्याओं को ठीक करें diff --git a/fastlane/metadata/android/hi/changelogs/992.txt b/fastlane/metadata/android/hi/changelogs/992.txt new file mode 100644 index 00000000000..d4024fd0201 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/992.txt @@ -0,0 +1,17 @@ +नया +• वीडियो विवरण में सब्सक्राइबर गिनती +• कतार से डाउनलोड करें +• स्थायी रूप से एक प्लेलिस्ट थंबनेल सेट करें +• लंबे समय तक प्रेस हैशटैग और लिंक +• कार्ड दृश्य मोड + +बेहतर +• बड़ा मिनी-प्लेयर बंद बटन +• चिकना थंबनेल डाउनस्केलिंग +• लक्ष्य Android 13 (API 33) +• अब मांगने से खिलाड़ी रुक जाता है + +सही किए +• DeX/माउस पर ओवरले ठीक करें +• बिना किसी अलग ऑडियो स्ट्रीम के पृष्ठभूमि प्लेयर की अनुमति दें +• विभिन्न यूट्यूब फिक्स और अधिक… diff --git a/fastlane/metadata/android/id/changelogs/972.txt b/fastlane/metadata/android/id/changelogs/972.txt new file mode 100644 index 00000000000..e6b705eeb74 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/972.txt @@ -0,0 +1,14 @@ +Baru +Mengenali stempel waktu dan hashtag dalam deskripsi +Menambahkan pengaturan mode tablet manual +Menambahkan kemampuan untuk menyembunyikan item yang diputar di feed + +Ditingkatkan +Mendukung Kerangka Akses Penyimpanan dengan benar +Penanganan kesalahan yang lebih baik untuk saluran yang tidak tersedia dan dihentikan +Lembar berbagi Android untuk pengguna Android 10+ sekarang menampilkan judul konten. +Memperbarui instance Invidious dan mendukung tautan Piped. + +Diperbaiki +[YouTube] Konten yang dibatasi usia +Cegah jendela bocor Pengecualian saat membuka dialog pilihan diff --git a/fastlane/metadata/android/id/changelogs/973.txt b/fastlane/metadata/android/id/changelogs/973.txt new file mode 100644 index 00000000000..3ba7d9f054e --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/973.txt @@ -0,0 +1,4 @@ +Perbaikan terbaru +- Memperbaiki thumbnail dan judul yang terpotong dalam tata letak grid, karena perhitungan yang salah tentang berapa banyak video yang dapat ditampung dalam satu baris +- Memperbaiki dialog unduhan yang menghilang tanpa melakukan apa pun jika dibuka dari menu berbagi +- Memperbarui pustaka yang terkait dengan membuka aktivitas eksternal seperti pemilih file Storage Access Framework diff --git a/fastlane/metadata/android/id/changelogs/992.txt b/fastlane/metadata/android/id/changelogs/992.txt new file mode 100644 index 00000000000..50733474354 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/992.txt @@ -0,0 +1,17 @@ +Baru +- Jumlah pelanggan dalam detail video +- Unduh dari antrean +- Mengatur gambar mini daftar putar secara permanen +- Tekan lama tagar dan tautan +- Mode tampilan kartu + +Lebih baik +- Tombol tutup pemutar mini yang lebih besar +- Pengecilan ukuran gambar mini yang lebih halus +- Target Android 13 (API 33) +- Mencari tidak lagi menjeda pemain + +Diperbaiki +- Perbaiki overlay pada DeX/mouse +- Izinkan pemutar latar belakang tanpa aliran audio terpisah +- Berbagai perbaikan YouTube dan banyak lagi… diff --git a/fastlane/metadata/android/it/changelogs/992.txt b/fastlane/metadata/android/it/changelogs/992.txt new file mode 100644 index 00000000000..b11e7249e6b --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/992.txt @@ -0,0 +1,17 @@ +Nuovo +• Numero di iscritti nei dettagli del video +• Scarica dalla coda +• Impostare in modo permanente una miniatura della playlist +• Premi a lungo hashtag e link +• Modalità di visualizzazione scheda + +Migliorato +• Pulsante di chiusura mini-player più grande +• Downscaling delle miniature più agevole +• Target Android 13 (API 33) +• La ricerca non mette più in pausa il lettore + +Corretto +• Corretto l'overlay su DeX/mouse +• Consenti lettore in background senza flussi audio separati +• Varie correzioni di YouTube e altro… diff --git a/fastlane/metadata/android/nb-NO/changelogs/992.txt b/fastlane/metadata/android/nb-NO/changelogs/992.txt new file mode 100644 index 00000000000..02605fc2ce5 --- /dev/null +++ b/fastlane/metadata/android/nb-NO/changelogs/992.txt @@ -0,0 +1,17 @@ +Nytt +• Antall abonnenter i videodetaljene +• Last ned fra køen +• Sett miniatyrbilde for spilleliste +• Langtrykk på emneknagger og linker +• Kortvisningsmodus + +Forbedret +• Større lukkenapp på minispilleren +• Bedre nedskalering av miniatyrbilder +• Målversjon er nå Android 13 (API 33) +• Blafring pauser ikke lenger spilleren + +Fikset +• Fiks overlay for DeX/mus +• Tillat bakgrunnsspiller med ingen separate lydstrømmer +• Diverse YouTube-fikser, med mer … diff --git a/fastlane/metadata/android/nb-NO/full_description.txt b/fastlane/metadata/android/nb-NO/full_description.txt index 6fc7e0fbdff..0ffda33f810 100644 --- a/fastlane/metadata/android/nb-NO/full_description.txt +++ b/fastlane/metadata/android/nb-NO/full_description.txt @@ -1,5 +1 @@ -Gemenhetslig fri programvare. -Bruker ingen av Google-rammeverksbibliotekene, eller YouTube-API-et. -Det tolker kun nettsiden for å hente infoen som trengs. -Derfor kan dette programmet brukes på enheter der Google-tjenestene ikke er installert. -Du trenger heller ikke en YouTube-konto for å bruke installere det. +NewPipe bruker ikke noen av Googles rammeverksbiblioteker, eller YouTube-API-et. Den bare tolker nettsiden for å hente informasjonen den trenger. Programmet kan derfor brukes på enheter uten Google-tjenester, og du trenger ikke en YouTube-konto for å bruke det. I tillegg er det er gemenfrihetslig fritt. diff --git a/fastlane/metadata/android/nb-NO/short_description.txt b/fastlane/metadata/android/nb-NO/short_description.txt index feaf8f8ba6c..c19a75993bd 100644 --- a/fastlane/metadata/android/nb-NO/short_description.txt +++ b/fastlane/metadata/android/nb-NO/short_description.txt @@ -1 +1 @@ -En fri og lett mediaplattformsavspiller. +En fri og lett YouTube-skjermflate for Android. diff --git a/fastlane/metadata/android/nl/changelogs/65.txt b/fastlane/metadata/android/nl/changelogs/65.txt new file mode 100644 index 00000000000..79a6c49283e --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/65.txt @@ -0,0 +1,26 @@ +### Verbeteringen + +- Burgermenu icoon animatie uitschakelen #1486 +- Verwijderen van downloads ongedaan maken #1472 +- Downloadoptie in aandelenmenu #1498 +- Deeloptie toegevoegd aan menu met lange tikken #1454 +- Hoofdspeler minimaliseren bij afsluiten #1354 +- Bibliotheek versie update en database back-up fix #1510 +- ExoPlayer 2.8.2 Update #1392 + - De afspeelsnelheidsdialoog herwerkt om verschillende stapgrootten te ondersteunen voor snellere snelheidsverandering. + - Een schakelaar toegevoegd om snel vooruit te spoelen tijdens stiltes in de afspeelsnelheidcontrole. Dit zou handig moeten zijn voor luisterboeken en bepaalde muziekgenres, en kan een echte naadloze ervaring opleveren (en kan een nummer met veel stiltes = breken). + - Verfijnde mediabronresolutie zodat metadata naast media intern in de speler kunnen worden doorgegeven, in plaats van dit handmatig te doen. Nu hebben we een enkele bron van metadata en deze is direct beschikbaar wanneer het afspelen begint. + - Metagegevens van afspeellijst op afstand niet bijgewerkt wanneer nieuwe metagegevens beschikbaar zijn wanneer afspeellijstfragment wordt geopend. + - Diverse UI fixes: #1383, achtergrondspeler meldingselementen nu altijd wit, makkelijker uitschakelen van popup speler door gooien +- Gebruik nieuwe extractor met refactored architectuur voor multiservice + +### Fixes + +- Fix #1440 Gebroken video-info-indeling #1491 +- Geschiedenis bekijken fix #1497 + - #1495, door de metadata (thumbnail, titel en videotelling) bij te werken zodra de gebruiker de afspeellijst opent. + - #1475, door een weergave in de database te registreren wanneer de gebruiker een video start op externe speler op detailfragment. +- Fix creen timeout bij popup modus. #1463 (Fixed #640) +- Hoofd video speler fix #1509 + - #1412] Fixed repeat mode veroorzaakt speler NPE wanneer nieuwe intentie wordt ontvangen terwijl speler activiteit op de achtergrond is. + - Fixed minimaliseren van speler naar popup vernietigt speler niet wanneer popup toestemming niet is verleend. diff --git a/fastlane/metadata/android/pa/changelogs/992.txt b/fastlane/metadata/android/pa/changelogs/992.txt new file mode 100644 index 00000000000..de71db15433 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/992.txt @@ -0,0 +1,15 @@ +ਨਵਾਂ +• ਵੀਡੀਓ ਵੇਰਵਿਆਂ ਵਿੱਚ ਗਾਹਕਾਂ ਦੀ ਗਿਣਤੀ +• ਕਤਾਰ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ +• ਇੱਕ ਪਲੇਅਲਿਸਟ ਥੰਮਨੇਲ ਪੱਕੇ ਤੌਰ 'ਤੇ ਸੈੱਟ ਕਰੋ +• ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਪ੍ਰੈੱਸ ਕਰਨ ਵਾਲੇ ਹੈਸ਼ਟੈਗ ਅਤੇ ਲਿੰਕ +• ਕਾਰਡ ਦ੍ਰਿਸ਼ ਮੋਡ + +ਸੁਧਾਰ +• ਵੱਡਾ ਮਿੰਨੀ-ਪਲੇਅਰ ਬੰਦ ਬਟਨ +• ਮੁਲਾਇਮ ਥੰਮਨੇਲ ਡਾਊਨਸਕੇਲਿੰਗ +• ਟਾਰਗੇਟ ਐਂਡਰਾਇਡ 13 (ਏਪੀਆਈ 33) +• ਹੁਣ ਪਲੇਅਰ ਸੀਕ ਕਰਨ ਤੇ ਰੁਕਦਾ ਨਹੀਂ +• DeX/ਮਾਊਸ 'ਤੇ ਓਵਰਲੇਅ ਨੂੰ ਫਿਕਸ ਕਰੋ +• ਬਿਨਾਂ ਕਿਸੇ ਵੱਖਰੇ ਆਡੀਓ ਸਟ੍ਰੀਮ ਦੇ ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਨੂੰ ਚਲਾਉਣ ਦਿਓ +• ਵੱਖ-ਵੱਖ ਯੂਟਿਊਬ ਫਿਕਸ ਅਤੇ ਹੋਰ… diff --git a/fastlane/metadata/android/pl/changelogs/992.txt b/fastlane/metadata/android/pl/changelogs/992.txt new file mode 100644 index 00000000000..98d0d177375 --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/992.txt @@ -0,0 +1,17 @@ +Nowe +• Liczba subskrybentów w szczegółach wideo +• Pobieranie z kolejki +• Ustawianie stałej miniatury playlisty +• Długie naciśnięcie hashtagów i linków +• Tryb widoku karty + +Ulepszone +• Większy przycisk zamykania miniodtwarzacza +• Płynniejsze zmniejszanie miniatur +• Docelowy system Android 13 (API 33) +• Przewijanie nie wstrzymuje już odtwarzacza + +Naprawione +• Nakładka dla DeX/myszy +• Zezwalanie na odtwarzanie w tle bez oddzielnych strumieni audio +• Różne poprawki YouTube i więcej… diff --git a/fastlane/metadata/android/pt-BR/changelogs/770.txt b/fastlane/metadata/android/pt-BR/changelogs/770.txt new file mode 100644 index 00000000000..d53963daa82 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/770.txt @@ -0,0 +1,4 @@ +Mudanças no 0.47.2 + +Consertado +• Consertado, nenhum vídeo estava disponível diff --git a/fastlane/metadata/android/pt-PT/changelogs/992.txt b/fastlane/metadata/android/pt-PT/changelogs/992.txt new file mode 100644 index 00000000000..2da819beb5e --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/992.txt @@ -0,0 +1,17 @@ +Novo +- Contagem de subscritores em detalhes de vídeo +- Descarregar da fila +- Uma miniatura permanente de listas de reprodução +- Hashtags e ligações de imprensa longa +- Modo de visualização de cartões + +Melhorado +- Botão de fecho de mini-reprodutor maior +- Redução mais suave das miniaturas +- Alvo Android 13 (API 33) +- Procurar não pausa o reprodutor + +Fixa +- Corrigido sobreposições no DeX/rato +- Permitir um leitor de fundo sem fluxo de áudio separados +- Várias correções do YouTube… diff --git a/fastlane/metadata/android/pt/changelogs/992.txt b/fastlane/metadata/android/pt/changelogs/992.txt new file mode 100644 index 00000000000..2da819beb5e --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/992.txt @@ -0,0 +1,17 @@ +Novo +- Contagem de subscritores em detalhes de vídeo +- Descarregar da fila +- Uma miniatura permanente de listas de reprodução +- Hashtags e ligações de imprensa longa +- Modo de visualização de cartões + +Melhorado +- Botão de fecho de mini-reprodutor maior +- Redução mais suave das miniaturas +- Alvo Android 13 (API 33) +- Procurar não pausa o reprodutor + +Fixa +- Corrigido sobreposições no DeX/rato +- Permitir um leitor de fundo sem fluxo de áudio separados +- Várias correções do YouTube… diff --git a/fastlane/metadata/android/uk/changelogs/992.txt b/fastlane/metadata/android/uk/changelogs/992.txt new file mode 100644 index 00000000000..4efccccb4d8 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/992.txt @@ -0,0 +1,17 @@ +Нове +• Кількість підписників у поробицях відео +• Завантаження з черги +• Постійна мініатюра добірки +• Затискання хештегів і посилань +• Картковий режим перегляду + +Удосконалено +• Більша кнопка закриття мініпрогравача +• Плавніше зменшення масштабу мініатюр +• Цільова версія Android 13 (API 33) +• Пошук більше не призупиняє програвач + +Виправлено +• Виправлено накладання на DeX/миша +• Дозволено фоновий програвач без окремих аудіопотоків +• Різні виправлення YouTube тощо… diff --git a/fastlane/metadata/android/zh-Hant/changelogs/992.txt b/fastlane/metadata/android/zh-Hant/changelogs/992.txt new file mode 100644 index 00000000000..97bc793b27b --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/992.txt @@ -0,0 +1,17 @@ +新增 +• 影片詳細資訊的訂閱者人數 +• 佇列功能表的下載按鈕 +• 永久設定播放清單的縮圖 +• 主題標籤和連結的長按動作 +• 卡片檢視模式 + +改進 +• 迷你播放器的關閉按鈕略為放大 +• 縮圖縮小時較順滑 +• 目標版本現為 Android 13 (API 33) +• 快轉時不再暫停播放器 + +修正 +• 修正 DeX/滑鼠的覆蓋 +• 背景播放器允許無獨立音訊串流 +• 若干 YouTube 修正及其他… diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/992.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/992.txt new file mode 100644 index 00000000000..bfe34c02159 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/992.txt @@ -0,0 +1,17 @@ +新嘢 +• 影片詳情騷埋訂閱人數 +• 排隊播整埋個下載掣 +• 自選播放清單封面縮圖 +• 撳實主題標籤同連結有得複製 +• 有得以一張張白紙舉起一條條片 + +進步 +• 袖珍播放器個閂埋掣大粒啲 +• 縮圖縮細時幼細啲 +• 編譯目標版本訂為 Android 13 (API 33) +• 條片快轉時唔再暫停播放器 + +執漏 +• 修正三星 DeX/滑鼠覆蓋 +• 無獨立聲音串流都有得幕後播 +• 若干 YouTube 修正、等等… From 8d43499e5bea402ea85aa5c7ab7477765deaac01 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 8 Feb 2023 22:27:49 +0100 Subject: [PATCH 081/645] Update NewPipeExtractor again --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 917bf5356a9..1655118169f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,7 @@ dependencies { // name and the commit hash with the commit hash of the (pushed) commit you want to test // This works thanks to JitPack: https://jitpack.io/ implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'com.github.TeamNewPipe:NewPipeExtractor:999fb7f812f8f39712dda88cf5ff4db3ee877fdc' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:e920ab3f5f40fe1f669735d717135c83141be2dd' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ From d2f8f31d1f21bcb97b7a9417a210b5da5311e4d9 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 8 Feb 2023 22:37:17 +0100 Subject: [PATCH 082/645] Update NewPipeExtractor again, because of JitPack problems --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 1655118169f..0afdc3ce824 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,7 @@ dependencies { // name and the commit hash with the commit hash of the (pushed) commit you want to test // This works thanks to JitPack: https://jitpack.io/ implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'com.github.TeamNewPipe:NewPipeExtractor:e920ab3f5f40fe1f669735d717135c83141be2dd' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:7e793c11aec46358ccbfd8bcfcf521105f4f093a' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ From 75292e099cbb3d63ad038fa4e4da9c74b07bc770 Mon Sep 17 00:00:00 2001 From: Mahendran Date: Sun, 29 Jan 2023 17:44:46 +0530 Subject: [PATCH 083/645] Larger channel cards in search results - Thumbnail larger (100dp) than the usual (92dp) throughout the app - Description lint count is 8 (normally 3) --- app/sampledata/channels.json | 19 +++++ .../newpipe/info_list/InfoListAdapter.java | 8 +- .../holder/ChannelCardInfoItemHolder.java | 22 ++++++ .../holder/ChannelMiniInfoItemHolder.java | 16 +++- .../subscription/SubscriptionFragment.kt | 11 ++- .../subscription/SubscriptionViewModel.kt | 28 ++++++- .../res/layout/list_channel_card_item.xml | 74 +++++++++++++++++++ app/src/main/res/values/dimens.xml | 2 + 8 files changed, 170 insertions(+), 10 deletions(-) create mode 100644 app/sampledata/channels.json create mode 100644 app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelCardInfoItemHolder.java create mode 100644 app/src/main/res/layout/list_channel_card_item.xml diff --git a/app/sampledata/channels.json b/app/sampledata/channels.json new file mode 100644 index 00000000000..207d785972c --- /dev/null +++ b/app/sampledata/channels.json @@ -0,0 +1,19 @@ +{ + "data": [ + { + "name": "BBC", + "additional": "12K subscribers•233 videos", + "description": "The BBC is the world’s leading public service broadcaster. We’re impartial and independent, and every day we create distinctive, world-class programmes and content which inform, educate and entertain millions of people in the UK and around the world. SUBSCRIBE to our YouTube channel to get the best of BBC entertainment and comedy programmes, stories from science and nature documentaries, and much more! https://bit.ly/2IXqEIn Get ALL your fresh TV, and sofa-hugging box sets on iPlayer https://bbc.in/2J18jYJ" + }, + { + "name": "Linus Tech Tips", + "additional": "1M subscribers•233 videos", + "description": "Looking for a Tech YouTuber?\n\nLinus Tech Tips is a passionate team of \"professionally curious\" experts in consumer technology and video production which aims to inform and educate people of all ages through our entertaining videos. We create product reviews, step-by-step computer build guides, and a variety of other tech-focused content.\n\nSchedule:\nNew videos every Saturday to Thursday @ 10:00am Pacific\nLive WAN Show podcasts every Friday @ ~5:00pm Pacific" + }, + { + "name": "Marques Brownlee", + "additional": "13 subscribers•12K videos", + "description": "MKBHD: Quality Tech Videos | YouTuber | Geek | Consumer Electronics | Tech Head | Internet Personality!\n\nbusiness@MKBHD.com\n\nNYC" + } + ] +} \ No newline at end of file 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 d69db945dc6..a13f0e5aaba 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 @@ -17,6 +17,7 @@ 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.ChannelCardInfoItemHolder; import org.schabi.newpipe.info_list.holder.ChannelGridInfoItemHolder; import org.schabi.newpipe.info_list.holder.ChannelInfoItemHolder; import org.schabi.newpipe.info_list.holder.ChannelMiniInfoItemHolder; @@ -73,6 +74,7 @@ public class InfoListAdapter extends RecyclerView.Adapter= 0 && item.getSubscriberCount() >= 0) { diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt index 7146a18d603..bc2f96f7375 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt @@ -60,7 +60,6 @@ import org.schabi.newpipe.util.NavigationHelper import org.schabi.newpipe.util.OnClickGesture import org.schabi.newpipe.util.ServiceHelper import org.schabi.newpipe.util.ThemeHelper.getGridSpanCountChannels -import org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout import org.schabi.newpipe.util.external_communication.ShareUtils import java.text.SimpleDateFormat import java.util.Date @@ -245,7 +244,7 @@ class SubscriptionFragment : BaseStateFragment() { super.initViews(rootView, savedInstanceState) _binding = FragmentSubscriptionBinding.bind(rootView) - groupAdapter.spanCount = if (shouldUseGridLayout(context)) getGridSpanCountChannels(context) else 1 + groupAdapter.spanCount = if (SubscriptionViewModel.shouldUseGridForSubscription(requireContext())) getGridSpanCountChannels(context) else 1 binding.itemsList.layoutManager = GridLayoutManager(requireContext(), groupAdapter.spanCount).apply { spanSizeLookup = groupAdapter.spanSizeLookup } @@ -380,15 +379,15 @@ class SubscriptionFragment : BaseStateFragment() { override fun handleResult(result: SubscriptionState) { super.handleResult(result) - val shouldUseGridLayout = shouldUseGridLayout(context) when (result) { is SubscriptionState.LoadedState -> { result.subscriptions.forEach { if (it is ChannelItem) { it.gesturesListener = listenerChannelItem - it.itemVersion = when { - shouldUseGridLayout -> ChannelItem.ItemVersion.GRID - else -> ChannelItem.ItemVersion.MINI + it.itemVersion = if (SubscriptionViewModel.shouldUseGridForSubscription(requireContext())) { + ChannelItem.ItemVersion.GRID + } else { + ChannelItem.ItemVersion.MINI } } } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt index 914299c78f1..dfad60c3f48 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt @@ -1,6 +1,7 @@ package org.schabi.newpipe.local.subscription import android.app.Application +import android.content.Context import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData @@ -8,12 +9,13 @@ import com.xwray.groupie.Group import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.processors.BehaviorProcessor import io.reactivex.rxjava3.schedulers.Schedulers +import org.schabi.newpipe.info_list.ItemViewMode import org.schabi.newpipe.local.feed.FeedDatabaseManager import org.schabi.newpipe.local.subscription.item.ChannelItem import org.schabi.newpipe.local.subscription.item.FeedGroupCardGridItem import org.schabi.newpipe.local.subscription.item.FeedGroupCardItem import org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT -import org.schabi.newpipe.util.ThemeHelper +import org.schabi.newpipe.util.ThemeHelper.getItemViewMode import java.util.concurrent.TimeUnit class SubscriptionViewModel(application: Application) : AndroidViewModel(application) { @@ -22,7 +24,7 @@ class SubscriptionViewModel(application: Application) : AndroidViewModel(applica // true -> list view, false -> grid view private val listViewMode = BehaviorProcessor.createDefault( - !ThemeHelper.shouldUseGridLayout(application) + !shouldUseGridForSubscription(application) ) private val listViewModeFlowable = listViewMode.distinctUntilChanged() @@ -77,4 +79,26 @@ class SubscriptionViewModel(application: Application) : AndroidViewModel(applica data class LoadedState(val subscriptions: List) : SubscriptionState() data class ErrorState(val error: Throwable? = null) : SubscriptionState() } + + companion object { + + /** + * Returns whether to use GridLayout mode for Subscription Fragment. + * + * ### Current mapping: + * + * | ItemViewMode | ItemVersion | Span count | + * |---|---|---| + * | AUTO | MINI | 1 | + * | LIST | MINI | 1 | + * | CARD | GRID | > 1 (ThemeHelper defined) | + * | GRID | GRID | > 1 (ThemeHelper defined) | + * + * @see [SubscriptionViewModel.shouldUseGridForSubscription] to modify Layout Manager + */ + fun shouldUseGridForSubscription(context: Context): Boolean { + val itemViewMode = getItemViewMode(context) + return itemViewMode == ItemViewMode.GRID || itemViewMode == ItemViewMode.CARD + } + } } diff --git a/app/src/main/res/layout/list_channel_card_item.xml b/app/src/main/res/layout/list_channel_card_item.xml new file mode 100644 index 00000000000..09696ff3818 --- /dev/null +++ b/app/src/main/res/layout/list_channel_card_item.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 679dc05ebee..e35b3c2e531 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -4,6 +4,7 @@ 16dp 8dp 32dp + 12dp 8dp 4dp 2dp @@ -38,6 +39,7 @@ 164dp 92dp + 100dp 92dp 128dp From f0307b1b48de548baefa8b2befc021fbd6f34050 Mon Sep 17 00:00:00 2001 From: pratyaksh1610 Date: Thu, 9 Feb 2023 21:38:02 +0530 Subject: [PATCH 084/645] fix progress bar scaling in card view --- app/src/main/res/layout/list_stream_playlist_card_item.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/list_stream_playlist_card_item.xml b/app/src/main/res/layout/list_stream_playlist_card_item.xml index 9cc6b326c31..581a9d72e5a 100644 --- a/app/src/main/res/layout/list_stream_playlist_card_item.xml +++ b/app/src/main/res/layout/list_stream_playlist_card_item.xml @@ -86,7 +86,7 @@ Date: Thu, 9 Feb 2023 20:41:22 +0100 Subject: [PATCH 085/645] Made some small adjustments to the database query --- .../newpipe/database/playlist/dao/PlaylistStreamDAO.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java index 015a770029a..54fa2d53b8d 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java @@ -86,8 +86,9 @@ default Flowable> listByService(final int serviceId) @RewriteQueriesToDropUnusedColumns @Transaction - @Query("SELECT *, MIN(" + JOIN_INDEX + ") FROM " + STREAM_TABLE + " INNER JOIN " - + "(SELECT " + JOIN_STREAM_ID + "," + JOIN_INDEX + @Query("SELECT *, MIN(" + JOIN_INDEX + ")" + + " FROM " + STREAM_TABLE + " INNER JOIN" + + " (SELECT " + JOIN_STREAM_ID + "," + JOIN_INDEX + " FROM " + PLAYLIST_STREAM_JOIN_TABLE + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId)" + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID @@ -97,7 +98,7 @@ default Flowable> listByService(final int serviceId) + " FROM " + STREAM_STATE_TABLE + " )" + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID_ALIAS + " GROUP BY " + STREAM_ID - + " ORDER BY " + JOIN_INDEX + " ASC") + + " ORDER BY MIN(" + JOIN_INDEX + ") ASC") Flowable> getStreamsWithoutDuplicates(long playlistId); From bc29f40d6940f0bea180d7cb948350202193d48d Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Thu, 9 Feb 2023 21:18:21 +0100 Subject: [PATCH 086/645] Implemented the suggested changes --- .../newpipe/database/feed/dao/FeedDAO.kt | 2 +- .../schabi/newpipe/local/feed/FeedFragment.kt | 17 ++++++------- .../newpipe/local/feed/FeedViewModel.kt | 24 +++++++------------ .../local/history/HistoryRecordManager.java | 2 +- app/src/main/res/values/strings.xml | 6 ++--- 5 files changed, 21 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt index 42a248ca5a3..6947f66af5d 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt @@ -74,7 +74,7 @@ abstract class FeedDAO { OR (sst.progress_time <= ${StreamStateEntity.PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS} AND sst.progress_time <= s.duration * 1000 / 4) OR (sst.progress_time >= s.duration * 1000 - ${StreamStateEntity.PLAYBACK_FINISHED_END_MILLISECONDS} - OR sst.progress_time >= s.duration * 1000 * 3 / 4) + AND sst.progress_time >= s.duration * 1000 * 3 / 4) ) AND ( :uploadDateBefore IS NULL diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index d2c3616629c..3ca3bd32095 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -259,7 +259,7 @@ class FeedFragment : BaseStateFragment() { getString(R.string.feed_show_upcoming) ) - val checkedDialogItems = booleanArrayOf(!showPlayedItems, !showPartiallyPlayedItems, !showFutureItems) + val checkedDialogItems = booleanArrayOf(showPlayedItems, showPartiallyPlayedItems, showFutureItems) val builder = AlertDialog.Builder(context!!) builder.setTitle(R.string.feed_hide_streams_title) @@ -268,17 +268,14 @@ class FeedFragment : BaseStateFragment() { } builder.setPositiveButton(R.string.ok) { _, _ -> - showPlayedItems = !checkedDialogItems[0] - viewModel.setShowPlayedItems(showPlayedItems) - viewModel.saveShowPlayedItemsToPreferences(showPlayedItems) + showPlayedItems = checkedDialogItems[0] + viewModel.setSaveShowPlayedItems(showPlayedItems) - showPartiallyPlayedItems = !checkedDialogItems[1] - viewModel.setShowPartiallyPlayedItems(showPartiallyPlayedItems) - viewModel.saveShowPartiallyPlayedItemsToPreferences(showPartiallyPlayedItems) + showPartiallyPlayedItems = checkedDialogItems[1] + viewModel.setSaveShowPartiallyPlayedItems(showPartiallyPlayedItems) - showFutureItems = !checkedDialogItems[2] - viewModel.setShowFutureItems(showFutureItems) - viewModel.saveShowFutureItemsToPreferences(showFutureItems) + showFutureItems = checkedDialogItems[2] + viewModel.setSaveShowFutureItems(showFutureItems) } builder.setNegativeButton(R.string.cancel, null) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt index 2e85a65cbe0..015b72160f7 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt @@ -31,9 +31,9 @@ import java.util.concurrent.TimeUnit class FeedViewModel( private val application: Application, groupId: Long = FeedGroupEntity.GROUP_ALL_ID, - initialShowPlayedItems: Boolean = true, - initialShowPartiallyPlayedItems: Boolean = true, - initialShowFutureItems: Boolean = true + initialShowPlayedItems: Boolean, + initialShowPartiallyPlayedItems: Boolean, + initialShowFutureItems: Boolean ) : ViewModel() { private val feedDatabaseManager = FeedDatabaseManager(application) @@ -119,39 +119,33 @@ class FeedViewModel( val t4: OffsetDateTime? ) - fun setShowPlayedItems(showPlayedItems: Boolean) { + fun setSaveShowPlayedItems(showPlayedItems: Boolean) { this.showPlayedItems.onNext(showPlayedItems) - } - - fun saveShowPlayedItemsToPreferences(showPlayedItems: Boolean) = PreferenceManager.getDefaultSharedPreferences(application).edit { this.putBoolean(application.getString(R.string.feed_show_watched_items_key), showPlayedItems) this.apply() } + } fun getShowPlayedItemsFromPreferences() = getShowPlayedItemsFromPreferences(application) - fun setShowPartiallyPlayedItems(showPartiallyPlayedItems: Boolean) { + fun setSaveShowPartiallyPlayedItems(showPartiallyPlayedItems: Boolean) { this.showPartiallyPlayedItems.onNext(showPartiallyPlayedItems) - } - - fun saveShowPartiallyPlayedItemsToPreferences(showPartiallyPlayedItems: Boolean) = PreferenceManager.getDefaultSharedPreferences(application).edit { this.putBoolean(application.getString(R.string.feed_show_partially_watched_items_key), showPartiallyPlayedItems) this.apply() } + } fun getShowPartiallyPlayedItemsFromPreferences() = getShowPartiallyPlayedItemsFromPreferences(application) - fun setShowFutureItems(showFutureItems: Boolean) { + fun setSaveShowFutureItems(showFutureItems: Boolean) { this.showFutureItems.onNext(showFutureItems) - } - - fun saveShowFutureItemsToPreferences(showFutureItems: Boolean) = PreferenceManager.getDefaultSharedPreferences(application).edit { this.putBoolean(application.getString(R.string.feed_show_future_items_key), showFutureItems) this.apply() } + } fun getShowFutureItemsFromPreferences() = getShowFutureItemsFromPreferences(application) diff --git a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java index 340b2227863..ed3cf548f96 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java @@ -87,7 +87,7 @@ public HistoryRecordManager(final Context context) { * Marks a stream item as watched such that it is hidden from the feed if watched videos are * hidden. Adds a history entry and updates the stream progress to 100%. * - * @see FeedViewModel#setShowPlayedItems + * @see FeedViewModel#setSaveShowPlayedItems * @param info the item to mark as watched * @return a Maybe containing the ID of the item if successful */ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e01d3ed72ce..ee388ce135a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -691,7 +691,7 @@ \nYouTube is an example of a service that offers this fast method with its RSS feed. \n \nSo the choice boils down to what you prefer: speed or precise information.
- Hide the following streams + Show the following streams Show/Hide streams This content is not yet supported by NewPipe.\n\nIt will hopefully be supported in a future version. Channel\'s avatar thumbnail @@ -760,8 +760,8 @@ Unknown quality Show future items Hide future items - Fully Watched - Partially Watched + Fully watched + Partially watched Upcoming Sort \ No newline at end of file From 68ea99d6e6cd932095ed61e2cadc0d6e661409a0 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Thu, 9 Feb 2023 23:17:36 +0100 Subject: [PATCH 087/645] Made some small code improvements --- .../schabi/newpipe/database/Migrations.java | 14 +++++--------- .../playlist/dao/PlaylistStreamDAO.java | 19 ++++++++++--------- .../playlist/model/PlaylistEntity.java | 2 ++ .../local/playlist/LocalPlaylistFragment.java | 5 ++--- .../local/playlist/LocalPlaylistManager.java | 10 ++++++---- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.java b/app/src/main/java/org/schabi/newpipe/database/Migrations.java index e995fdd6cdf..1886b87c2d8 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Migrations.java +++ b/app/src/main/java/org/schabi/newpipe/database/Migrations.java @@ -206,19 +206,15 @@ public void migrate(@NonNull final SupportSQLiteDatabase database) { + "INTEGER NOT NULL DEFAULT -1"); // Migrate the thumbnail_url to the thumbnail_stream_id - database.execSQL("CREATE TEMPORARY TABLE temporary_table AS" + database.execSQL("UPDATE playlists SET thumbnail_stream_id = (" + + " SELECT CASE WHEN COUNT(*) != 0 then stream_uid ELSE -1 END" + + " FROM (" + " SELECT p.uid AS playlist_uid, s.uid AS stream_uid" + " FROM playlists p" + " LEFT JOIN playlist_stream_join ps ON p.uid = ps.playlist_id" + " LEFT JOIN streams s ON s.uid = ps.stream_id" - + " WHERE s.thumbnail_url = p.thumbnail_url"); - - database.execSQL("UPDATE playlists SET thumbnail_stream_id = (" - + "SELECT CASE WHEN COUNT(*) != 0 then stream_uid ELSE -1 END " - + "FROM temporary_table " - + "WHERE playlist_uid = playlists.uid)"); - - database.execSQL("DROP TABLE temporary_table"); + + " WHERE s.thumbnail_url = p.thumbnail_url) AS temporary_table" + + " WHERE playlist_uid = playlists.uid)"); // Remove the thumbnail_url field in the playlist table database.execSQL("CREATE TABLE IF NOT EXISTS `playlists_new`" diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java index 2915e7bd312..89b89b2fe60 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.java @@ -9,6 +9,7 @@ import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; +import org.schabi.newpipe.database.playlist.model.PlaylistEntity; import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity; import java.util.List; @@ -59,14 +60,15 @@ default Flowable> listByService(final int serviceId) + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId") Flowable getMaximumIndexOf(long playlistId); - @Query("SELECT CASE WHEN COUNT(*) != 0 then " + STREAM_ID + " ELSE -1 END" + @Query("SELECT CASE WHEN COUNT(*) != 0 then " + STREAM_ID + + " ELSE " + PlaylistEntity.DEFAULT_THUMBNAIL_ID + " END" + " FROM " + STREAM_TABLE + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE + " ON " + STREAM_ID + " = " + JOIN_STREAM_ID + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId " + " LIMIT 1" ) - Flowable getAutomaticThumbnailUrl(long playlistId); + Flowable getAutomaticThumbnailStreamId(long playlistId); @RewriteQueriesToDropUnusedColumns @Transaction @@ -91,14 +93,13 @@ default Flowable> listByService(final int serviceId) @Transaction @Query("SELECT " + PLAYLIST_ID + ", " + PLAYLIST_NAME + "," - + " CASE WHEN " + PLAYLIST_THUMBNAIL_STREAM_ID + " = -1" - + " THEN " + "'" + DEFAULT_THUMBNAIL + "'" + + " CASE WHEN " + PLAYLIST_THUMBNAIL_STREAM_ID + " = " + + PlaylistEntity.DEFAULT_THUMBNAIL_ID + " THEN " + "'" + DEFAULT_THUMBNAIL + "'" + " ELSE (SELECT " + STREAM_THUMBNAIL_URL + " FROM " + STREAM_TABLE + " WHERE " + STREAM_TABLE + "." + STREAM_ID + " = " + PLAYLIST_THUMBNAIL_STREAM_ID + " ) END AS " + PLAYLIST_THUMBNAIL_URL + ", " - + PLAYLIST_NAME + ", " + "COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT + " FROM " + PLAYLIST_TABLE + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE @@ -111,14 +112,14 @@ default Flowable> listByService(final int serviceId) @Query("SELECT " + PLAYLIST_TABLE + "." + PLAYLIST_ID + ", " + PLAYLIST_NAME + ", " - + " CASE WHEN " + PLAYLIST_THUMBNAIL_STREAM_ID + " = -1" - + " THEN " + "'" + DEFAULT_THUMBNAIL + "'" + + " CASE WHEN " + PLAYLIST_THUMBNAIL_STREAM_ID + " = " + + PlaylistEntity.DEFAULT_THUMBNAIL_ID + " THEN " + "'" + DEFAULT_THUMBNAIL + "'" + " ELSE (SELECT " + STREAM_THUMBNAIL_URL + " FROM " + STREAM_TABLE + " WHERE " + STREAM_TABLE + "." + STREAM_ID + " = " + PLAYLIST_THUMBNAIL_STREAM_ID - + " ) END AS " + PLAYLIST_THUMBNAIL_URL + + " ) END AS " + PLAYLIST_THUMBNAIL_URL + ", " - + ", COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT + ", " + + "COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT + ", " + "COALESCE(SUM(" + STREAM_URL + " = :streamUrl), 0) AS " + PLAYLIST_TIMES_STREAM_IS_CONTAINED diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java index 6c1d96d4165..efb7278fd76 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.java @@ -16,6 +16,8 @@ public class PlaylistEntity { public static final String DEFAULT_THUMBNAIL = "drawable://" + R.drawable.placeholder_thumbnail_playlist; + public static final long DEFAULT_THUMBNAIL_ID = -1; + public static final String PLAYLIST_TABLE = "playlists"; public static final String PLAYLIST_ID = "uid"; public static final String PLAYLIST_NAME = "name"; diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index a3648c3c2fc..3de630b967b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -35,6 +35,7 @@ import org.schabi.newpipe.database.LocalItem; import org.schabi.newpipe.database.history.model.StreamHistoryEntry; import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; +import org.schabi.newpipe.database.playlist.model.PlaylistEntity; import org.schabi.newpipe.database.stream.model.StreamEntity; import org.schabi.newpipe.databinding.DialogEditTextBinding; import org.schabi.newpipe.databinding.LocalPlaylistHeaderBinding; @@ -70,8 +71,6 @@ import io.reactivex.rxjava3.subjects.PublishSubject; public class LocalPlaylistFragment extends BaseLocalListFragment, Void> { - public static final long DEFAULT_THUMBNAIL_ID = -1; - public static final long NO_THUMBNAIL_ID = -2; // Save the list 10 seconds after the last change occurred private static final long SAVE_DEBOUNCE_MILLIS = 10000; private static final int MINIMUM_INITIAL_DRAG_VELOCITY = 12; @@ -624,7 +623,7 @@ private void updateThumbnailUrl() { thumbnailStreamId = ((PlaylistStreamEntry) itemListAdapter.getItemsList().get(0)) .getStreamEntity().getUid(); } else { - thumbnailStreamId = DEFAULT_THUMBNAIL_ID; + thumbnailStreamId = PlaylistEntity.DEFAULT_THUMBNAIL_ID; } changeThumbnailStreamId(thumbnailStreamId, false); diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index a92d330d803..0a9120da2cc 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -23,6 +23,8 @@ import io.reactivex.rxjava3.schedulers.Schedulers; public class LocalPlaylistManager { + private static final long THUMBNAIL_ID_LEAVE_UNCHANGED = -2; + private final AppDatabase database; private final StreamDAO streamTable; private final PlaylistDAO playlistTable; @@ -115,7 +117,7 @@ public Single deletePlaylist(final long playlistId) { } public Maybe renamePlaylist(final long playlistId, final String name) { - return modifyPlaylist(playlistId, name, LocalPlaylistFragment.NO_THUMBNAIL_ID, false); + return modifyPlaylist(playlistId, name, THUMBNAIL_ID_LEAVE_UNCHANGED, false); } public Maybe changePlaylistThumbnail(final long playlistId, @@ -134,10 +136,10 @@ public boolean getIsPlaylistThumbnailPermanent(final long playlistId) { } public long getAutomaticPlaylistThumbnailStreamId(final long playlistId) { - final long streamId = playlistStreamTable.getAutomaticThumbnailUrl(playlistId) + final long streamId = playlistStreamTable.getAutomaticThumbnailStreamId(playlistId) .blockingFirst(); if (streamId < 0) { - return LocalPlaylistFragment.DEFAULT_THUMBNAIL_ID; + return PlaylistEntity.DEFAULT_THUMBNAIL_ID; } return streamId; } @@ -154,7 +156,7 @@ private Maybe modifyPlaylist(final long playlistId, if (name != null) { playlist.setName(name); } - if (thumbnailStreamId != LocalPlaylistFragment.NO_THUMBNAIL_ID) { + if (thumbnailStreamId != THUMBNAIL_ID_LEAVE_UNCHANGED) { playlist.setThumbnailStreamId(thumbnailStreamId); playlist.setIsThumbnailPermanent(isPermanent); } From 624ad6a47cf425feec84065cdfa138a96a40eee6 Mon Sep 17 00:00:00 2001 From: pratyaksh1610 Date: Fri, 10 Feb 2023 11:10:43 +0530 Subject: [PATCH 088/645] Prevent NPEs when comment text is null --- .../holder/CommentsMiniInfoItemHolder.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 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 799aee8ba59..1c8db26d6bc 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,8 +1,9 @@ package org.schabi.newpipe.info_list.holder; +import static android.text.TextUtils.isEmpty; + import android.graphics.Paint; import android.text.Layout; -import android.text.TextUtils; import android.text.method.LinkMovementMethod; import android.text.style.URLSpan; import android.util.Log; @@ -59,9 +60,9 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder { private final TextView itemPublishedTime; private final CompositeDisposable disposables = new CompositeDisposable(); - private Description commentText; - private StreamingService streamService; - private String streamUrl; + @Nullable private Description commentText; + @Nullable private StreamingService streamService; + @Nullable private String streamUrl; CommentsMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final int layoutId, final ViewGroup parent) { @@ -153,15 +154,17 @@ public void updateFromItem(final InfoItem infoItem, if (DeviceUtils.isTv(itemBuilder.getContext())) { openCommentAuthor(item); } else { - ShareUtils.copyToClipboard(itemBuilder.getContext(), - itemContentView.getText().toString()); + final CharSequence text = itemContentView.getText(); + if (text != null) { + ShareUtils.copyToClipboard(itemBuilder.getContext(), text.toString()); + } } return true; }); } private void openCommentAuthor(final CommentsInfoItem item) { - if (TextUtils.isEmpty(item.getUploaderUrl())) { + if (isEmpty(item.getUploaderUrl())) { return; } final AppCompatActivity activity = (AppCompatActivity) itemBuilder.getContext(); @@ -207,11 +210,12 @@ private void ellipsize() { linkifyCommentContentView(v -> { boolean hasEllipsis = false; - if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) { + final CharSequence charSeqText = itemContentView.getText(); + if (charSeqText != null && itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) { // Note that converting to String removes spans (i.e. links), but that's something // we actually want since when the text is ellipsized we want all clicks on the // comment to expand the comment, not to open links. - final String text = itemContentView.getText().toString(); + final String text = charSeqText.toString(); final Layout layout = itemContentView.getLayout(); final float lineWidth = layout.getLineWidth(COMMENT_DEFAULT_LINES - 1); @@ -252,7 +256,7 @@ private void ellipsize() { private void toggleEllipsize() { final CharSequence text = itemContentView.getText(); - if (text.charAt(text.length() - 1) == ELLIPSIS.charAt(0)) { + if (!isEmpty(text) && text.charAt(text.length() - 1) == ELLIPSIS.charAt(0)) { expand(); } else if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) { ellipsize(); From 39c500f33ca6d8c0ea0a58733e2d685fca284b2b Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 14 Feb 2023 08:27:04 +0100 Subject: [PATCH 089/645] Revert "Use WindowCompat." --- .../fragments/detail/VideoDetailFragment.java | 55 +++++++++++-------- .../newpipe/player/ui/MainPlayerUi.java | 11 ++-- 2 files changed, 37 insertions(+), 29 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 0fb1375284d..baf42040951 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 @@ -27,6 +27,7 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -54,9 +55,6 @@ import androidx.appcompat.widget.Toolbar; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.content.ContextCompat; -import androidx.core.view.WindowCompat; -import androidx.core.view.WindowInsetsCompat; -import androidx.core.view.WindowInsetsControllerCompat; import androidx.preference.PreferenceManager; import com.google.android.exoplayer2.PlaybackException; @@ -1961,17 +1959,15 @@ private void showSystemUi() { return; } - final var window = activity.getWindow(); - final var windowInsetsController = WindowCompat.getInsetsController(window, - window.getDecorView()); - - WindowCompat.setDecorFitsSystemWindows(window, true); - windowInsetsController.setSystemBarsBehavior(WindowInsetsControllerCompat - .BEHAVIOR_SHOW_BARS_BY_TOUCH); - windowInsetsController.show(WindowInsetsCompat.Type.systemBars()); - - window.setStatusBarColor(ThemeHelper.resolveColorFromAttr(requireContext(), - android.R.attr.colorPrimary)); + // Prevent jumping of the player on devices with cutout + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + activity.getWindow().getAttributes().layoutInDisplayCutoutMode = + WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT; + } + activity.getWindow().getDecorView().setSystemUiVisibility(0); + activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + activity.getWindow().setStatusBarColor(ThemeHelper.resolveColorFromAttr( + requireContext(), android.R.attr.colorPrimary)); } private void hideSystemUi() { @@ -1983,19 +1979,30 @@ private void hideSystemUi() { return; } - final var window = activity.getWindow(); - final var windowInsetsController = WindowCompat.getInsetsController(window, - window.getDecorView()); + // Prevent jumping of the player on devices with cutout + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + activity.getWindow().getAttributes().layoutInDisplayCutoutMode = + WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; + } + int visibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; - WindowCompat.setDecorFitsSystemWindows(window, false); - windowInsetsController.setSystemBarsBehavior(WindowInsetsControllerCompat - .BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE); - windowInsetsController.hide(WindowInsetsCompat.Type.systemBars()); + // In multiWindow mode status bar is not transparent for devices with cutout + // if I include this flag. So without it is better in this case + final boolean isInMultiWindow = DeviceUtils.isInMultiWindow(activity); + if (!isInMultiWindow) { + visibility |= View.SYSTEM_UI_FLAG_FULLSCREEN; + } + activity.getWindow().getDecorView().setSystemUiVisibility(visibility); - if (DeviceUtils.isInMultiWindow(activity) || isFullscreen()) { - window.setStatusBarColor(Color.TRANSPARENT); - window.setNavigationBarColor(Color.TRANSPARENT); + if (isInMultiWindow || isFullscreen()) { + activity.getWindow().setStatusBarColor(Color.TRANSPARENT); + activity.getWindow().setNavigationBarColor(Color.TRANSPARENT); } + activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); } // Listener implementation diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java index a5c745ae64a..683629c251f 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java @@ -32,6 +32,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; +import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.LinearLayout; @@ -39,8 +40,6 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.content.res.AppCompatResources; -import androidx.core.view.WindowCompat; -import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.FragmentActivity; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; @@ -453,9 +452,11 @@ public void showSystemUIPartially() { getParentActivity().map(Activity::getWindow).ifPresent(window -> { window.setStatusBarColor(Color.TRANSPARENT); window.setNavigationBarColor(Color.TRANSPARENT); - WindowCompat.setDecorFitsSystemWindows(window, false); - WindowCompat.getInsetsController(window, window.getDecorView()) - .show(WindowInsetsCompat.Type.systemBars()); + final int visibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; + window.getDecorView().setSystemUiVisibility(visibility); + window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); }); } } From 5560cea470ad505f747128dc4cfef8744cc8fb6d Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 23 Feb 2023 12:46:05 +0100 Subject: [PATCH 090/645] Update to ExoPlayer 2.18.3 --- app/build.gradle | 2 +- .../player/mediasource/LoadedMediaSource.java | 63 ++----------------- 2 files changed, 7 insertions(+), 58 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0afdc3ce824..a5d63f429d6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -106,7 +106,7 @@ ext { androidxWorkVersion = '2.7.1' icepickVersion = '3.2.0' - exoPlayerVersion = '2.18.1' + exoPlayerVersion = '2.18.3' googleAutoServiceVersion = '1.0.1' groupieVersion = '2.10.1' markwonVersion = '4.6.2' diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java b/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java index 95524cf692a..3bf7c09d934 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java @@ -1,27 +1,21 @@ package org.schabi.newpipe.player.mediasource; +import androidx.annotation.NonNull; + import com.google.android.exoplayer2.MediaItem; -import com.google.android.exoplayer2.Timeline; -import com.google.android.exoplayer2.source.CompositeMediaSource; -import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaSource; -import com.google.android.exoplayer2.upstream.Allocator; -import com.google.android.exoplayer2.upstream.TransferListener; +import com.google.android.exoplayer2.source.WrappingMediaSource; import org.schabi.newpipe.player.mediaitem.MediaItemTag; import org.schabi.newpipe.player.playqueue.PlayQueueItem; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -public class LoadedMediaSource extends CompositeMediaSource implements ManagedMediaSource { - private final MediaSource source; +public class LoadedMediaSource extends WrappingMediaSource implements ManagedMediaSource { private final PlayQueueItem stream; private final MediaItem mediaItem; private final long expireTimestamp; /** - * Uses a {@link CompositeMediaSource} to wrap one or more child {@link MediaSource}s + * Uses a {@link WrappingMediaSource} to wrap one child {@link MediaSource}s * containing actual media. This wrapper {@link LoadedMediaSource} holds the expiration * timestamp as a {@link ManagedMediaSource} to allow explicit playlist management under * {@link ManagedMediaSourcePlaylist}. @@ -36,7 +30,7 @@ public LoadedMediaSource(@NonNull final MediaSource source, @NonNull final MediaItemTag tag, @NonNull final PlayQueueItem stream, final long expireTimestamp) { - this.source = source; + super(source); this.stream = stream; this.expireTimestamp = expireTimestamp; @@ -51,51 +45,6 @@ private boolean isExpired() { return System.currentTimeMillis() >= expireTimestamp; } - /** - * Delegates the preparation of child {@link MediaSource}s to the - * {@link CompositeMediaSource} wrapper. Since all {@link LoadedMediaSource}s use only - * a single child media, the child id of 0 is always used (sonar doesn't like null as id here). - * - * @param mediaTransferListener A data transfer listener that will be registered by the - * {@link CompositeMediaSource} for child source preparation. - */ - @Override - protected void prepareSourceInternal(@Nullable final TransferListener mediaTransferListener) { - super.prepareSourceInternal(mediaTransferListener); - prepareChildSource(0, source); - } - - /** - * When any child {@link MediaSource} is prepared, the refreshed {@link Timeline} can - * be listened to here. But since {@link LoadedMediaSource} has only a single child source, - * this method is called only once until {@link #releaseSourceInternal()} is called. - *

- * On refresh, the {@link CompositeMediaSource} delegate will be notified with the - * new {@link Timeline}, otherwise {@link #createPeriod(MediaPeriodId, Allocator, long)} - * will not be called and playback may be stalled. - * - * @param id The unique id used to prepare the child source. - * @param mediaSource The child source whose source info has been refreshed. - * @param timeline The new timeline of the child source. - */ - @Override - protected void onChildSourceInfoRefreshed(final Integer id, - final MediaSource mediaSource, - final Timeline timeline) { - refreshSourceInfo(timeline); - } - - @Override - public MediaPeriod createPeriod(final MediaPeriodId id, final Allocator allocator, - final long startPositionUs) { - return source.createPeriod(id, allocator, startPositionUs); - } - - @Override - public void releasePeriod(final MediaPeriod mediaPeriod) { - source.releasePeriod(mediaPeriod); - } - @NonNull @Override public MediaItem getMediaItem() { From 600ebdae18711710983312fba5090297234e13e8 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 23 Feb 2023 23:38:20 +0100 Subject: [PATCH 091/645] Correctly open urls in browser on Android 11+ - Fix misconfiguration in manifest ('http|https|market' is not valid) - Split ShareUtils functions taking a boolean parameter into pairs of functions with better names and less runtime checks - Move all Kore-related functions to KoreUtils - Remove the toast_no_player string --- app/src/main/AndroidManifest.xml | 2 +- .../org/schabi/newpipe/about/AboutActivity.kt | 9 +- .../newpipe/about/LicenseFragmentHelper.kt | 2 +- .../schabi/newpipe/error/ErrorActivity.java | 6 +- .../schabi/newpipe/error/ErrorPanelHelper.kt | 2 +- .../fragments/detail/VideoDetailFragment.java | 13 +- .../list/channel/ChannelFragment.java | 3 +- .../dialog/StreamDialogDefaultEntry.java | 10 +- .../newpipe/player/ui/VideoPlayerUi.java | 9 +- .../schabi/newpipe/util/NavigationHelper.java | 42 +---- .../external_communication/KoreUtils.java | 48 +++++- .../external_communication/ShareUtils.java | 162 +++++++----------- .../util/text/UrlLongPressClickableSpan.java | 2 +- .../giga/ui/adapter/MissionAdapter.java | 12 +- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-b+ast/strings.xml | 1 - app/src/main/res/values-b+uz+Latn/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-bn-rBD/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-ckb/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-eo/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-ka/strings.xml | 1 - app/src/main/res/values-kmr/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-ku/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-mk/strings.xml | 1 - app/src/main/res/values-ml/strings.xml | 1 - app/src/main/res/values-ms/strings.xml | 1 - app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-ne/strings.xml | 1 - app/src/main/res/values-nl-rBE/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sl/strings.xml | 1 - app/src/main/res/values-so/strings.xml | 1 - app/src/main/res/values-sq/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-te/strings.xml | 1 - app/src/main/res/values-th/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-ur/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/donottranslate.xml | 2 +- app/src/main/res/values/strings.xml | 1 - 83 files changed, 125 insertions(+), 267 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1fb20ef0e08..9d86dde6df6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,7 +15,7 @@ - + diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt index c1eec152657..f1d4c26df8c 100644 --- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt +++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt @@ -6,6 +6,7 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.Button +import androidx.annotation.StringRes import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity @@ -57,13 +58,9 @@ class AboutActivity : AppCompatActivity() { * A placeholder fragment containing a simple view. */ class AboutFragment : Fragment() { - private fun Button.openLink(url: Int) { + private fun Button.openLink(@StringRes url: Int) { setOnClickListener { - ShareUtils.openUrlInBrowser( - context, - requireContext().getString(url), - false - ) + ShareUtils.openUrlInApp(context, requireContext().getString(url)) } } diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt index 6e3aa4be878..5af7eefecfb 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt @@ -66,7 +66,7 @@ fun showLicense(context: Context?, component: SoftwareComponent): Disposable { dialog.dismiss() } setNeutralButton(R.string.open_website_license) { _, _ -> - ShareUtils.openUrlInBrowser(context!!, component.link) + ShareUtils.openUrlInApp(context!!, component.link) } } } diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java b/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java index e1dd929d4d4..dd065c3bb40 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java @@ -160,7 +160,7 @@ private void openPrivacyPolicyDialog(final Context context, final String action) .setMessage(R.string.start_accept_privacy_policy) .setCancelable(false) .setNeutralButton(R.string.read_privacy_policy, (dialog, which) -> - ShareUtils.openUrlInBrowser(context, + ShareUtils.openUrlInApp(context, context.getString(R.string.privacy_policy_url))) .setPositiveButton(R.string.accept, (dialog, which) -> { if (action.equals("EMAIL")) { // send on email @@ -171,9 +171,9 @@ private void openPrivacyPolicyDialog(final Context context, final String action) + getString(R.string.app_name) + " " + BuildConfig.VERSION_NAME) .putExtra(Intent.EXTRA_TEXT, buildJson()); - ShareUtils.openIntentInApp(context, i, true); + ShareUtils.openIntentInApp(context, i); } else if (action.equals("GITHUB")) { // open the NewPipe issue page on GitHub - ShareUtils.openUrlInBrowser(this, ERROR_GITHUB_ISSUE_URL, false); + ShareUtils.openUrlInApp(this, ERROR_GITHUB_ISSUE_URL); } }) .setNegativeButton(R.string.decline, (dialog, which) -> { diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt index b41d3997ee0..17071dfcbbb 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt @@ -156,7 +156,7 @@ class ErrorPanelHelper( ) { errorOpenInBrowserButton.isVisible = true errorOpenInBrowserButton.setOnClickListener { - ShareUtils.openUrlInBrowser(context, errorInfo.request, true) + ShareUtils.openUrlInBrowser(context, errorInfo.request) } } 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 0fb1375284d..673f5928128 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 @@ -11,7 +11,6 @@ import static org.schabi.newpipe.util.ExtractorHelper.showMetaInfoInTextView; import static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams; import static org.schabi.newpipe.util.NavigationHelper.openPlayQueue; -import static org.schabi.newpipe.util.NavigationHelper.playWithKore; import android.animation.ValueAnimator; import android.annotation.SuppressLint; @@ -485,16 +484,8 @@ private void setOnClickListeners() { info.getThumbnailUrl()))); binding.detailControlsOpenInBrowser.setOnClickListener(makeOnClickListener(info -> ShareUtils.openUrlInBrowser(requireContext(), info.getUrl()))); - binding.detailControlsPlayWithKodi.setOnClickListener(makeOnClickListener(info -> { - try { - playWithKore(requireContext(), Uri.parse(info.getUrl())); - } catch (final Exception e) { - if (DEBUG) { - Log.i(TAG, "Failed to start kore", e); - } - KoreUtils.showInstallKoreDialog(requireContext()); - } - })); + binding.detailControlsPlayWithKodi.setOnClickListener(makeOnClickListener(info -> + KoreUtils.playWithKore(requireContext(), Uri.parse(info.getUrl())))); if (DEBUG) { binding.detailControlsCrashThePlayer.setOnClickListener(v -> VideoDetailPlayerCrasher.onCrashThePlayer(requireContext(), player)); 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 8ed9389c39d..a39de376b32 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 @@ -204,8 +204,7 @@ public boolean onOptionsItemSelected(final MenuItem item) { break; case R.id.menu_item_rss: if (currentInfo != null) { - ShareUtils.openUrlInBrowser( - requireContext(), currentInfo.getFeedUrl(), false); + ShareUtils.openUrlInApp(requireContext(), currentInfo.getFeedUrl()); } break; case R.id.menu_item_openInBrowser: diff --git a/app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java b/app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java index c67880d0eb8..41399cb04f6 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java @@ -99,14 +99,8 @@ public enum StreamDialogDefaultEntry { ) ), - PLAY_WITH_KODI(R.string.play_with_kodi_title, (fragment, item) -> { - final Uri videoUrl = Uri.parse(item.getUrl()); - try { - NavigationHelper.playWithKore(fragment.requireContext(), videoUrl); - } catch (final Exception e) { - KoreUtils.showInstallKoreDialog(fragment.requireActivity()); - } - }), + PLAY_WITH_KODI(R.string.play_with_kodi_title, (fragment, item) -> + KoreUtils.playWithKore(fragment.requireContext(), Uri.parse(item.getUrl()))), SHARE(R.string.share, (fragment, item) -> ShareUtils.shareText(fragment.requireContext(), item.getName(), item.getUrl(), diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index e4f5b05e187..9afd1bf240b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -1420,14 +1420,7 @@ private void onMoreOptionsClicked() { private void onPlayWithKodiClicked() { if (player.getCurrentMetadata() != null) { player.pause(); - try { - NavigationHelper.playWithKore(context, Uri.parse(player.getVideoUrl())); - } catch (final Exception e) { - if (DEBUG) { - Log.i(TAG, "Failed to start kore", e); - } - KoreUtils.showInstallKoreDialog(player.getContext()); - } + KoreUtils.playWithKore(context, Uri.parse(player.getVideoUrl())); } } 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 b4556507cc5..2c8db77e0a2 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -1,6 +1,6 @@ package org.schabi.newpipe.util; -import static org.schabi.newpipe.util.external_communication.ShareUtils.installApp; +import static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams; import android.annotation.SuppressLint; import android.app.Activity; @@ -50,9 +50,9 @@ import org.schabi.newpipe.local.playlist.LocalPlaylistFragment; import org.schabi.newpipe.local.subscription.SubscriptionFragment; import org.schabi.newpipe.local.subscription.SubscriptionsImportFragment; -import org.schabi.newpipe.player.PlayerService; import org.schabi.newpipe.player.PlayQueueActivity; import org.schabi.newpipe.player.Player; +import org.schabi.newpipe.player.PlayerService; import org.schabi.newpipe.player.PlayerType; import org.schabi.newpipe.player.helper.PlayerHelper; import org.schabi.newpipe.player.helper.PlayerHolder; @@ -63,8 +63,6 @@ import java.util.List; -import static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams; - public final class NavigationHelper { public static final String MAIN_FRAGMENT_TAG = "main_fragment_tag"; public static final String SEARCH_FRAGMENT_TAG = "search_fragment_tag"; @@ -323,15 +321,13 @@ public static void playOnExternalPlayer(@NonNull final Context context, public static void resolveActivityOrAskToInstall(@NonNull final Context context, @NonNull final Intent intent) { - if (intent.resolveActivity(context.getPackageManager()) != null) { - ShareUtils.openIntentInApp(context, intent, false); - } else { + if (!ShareUtils.tryOpenIntentInApp(context, intent)) { if (context instanceof Activity) { new AlertDialog.Builder(context) .setMessage(R.string.no_player_found) .setPositiveButton(R.string.install, - (dialog, which) -> ShareUtils.openUrlInBrowser(context, - context.getString(R.string.fdroid_vlc_url), false)) + (dialog, which) -> ShareUtils.installApp(context, + context.getString(R.string.vlc_package))) .setNegativeButton(R.string.cancel, (dialog, which) -> Log.i("NavigationHelper", "You unlocked a secret unicorn.")) .show(); @@ -684,34 +680,6 @@ public static Intent getChannelIntent(final Context context, return getOpenIntent(context, url, serviceId, StreamingService.LinkType.CHANNEL); } - /** - * Start an activity to install Kore. - * - * @param context the context - */ - public static void installKore(final Context context) { - installApp(context, context.getString(R.string.kore_package)); - } - - /** - * Start Kore app to show a video on Kodi. - *

- * For a list of supported urls see the - * - * Kore source code - * . - * - * @param context the context to use - * @param videoURL the url to the video - */ - public static void playWithKore(final Context context, final Uri videoURL) { - final Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setPackage(context.getString(R.string.kore_package)); - intent.setData(videoURL); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); - } - /** * Finish this Activity as well as all Activities running below it * and then start MainActivity. diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/KoreUtils.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/KoreUtils.java index 0df579d8814..7fe518113d1 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/KoreUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/KoreUtils.java @@ -1,6 +1,11 @@ package org.schabi.newpipe.util.external_communication; +import static org.schabi.newpipe.util.external_communication.ShareUtils.installApp; +import static org.schabi.newpipe.util.external_communication.ShareUtils.tryOpenIntentInApp; + import android.content.Context; +import android.content.Intent; +import android.net.Uri; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; @@ -8,7 +13,6 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.ServiceList; -import org.schabi.newpipe.util.NavigationHelper; /** * Util class that provides methods which are related to the Kodi Media Center and its Kore app. @@ -29,13 +33,39 @@ public static boolean shouldShowPlayWithKodi(@NonNull final Context context, .getBoolean(context.getString(R.string.show_play_with_kodi_key), false); } - public static void showInstallKoreDialog(@NonNull final Context context) { - final AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setMessage(R.string.kore_not_found) - .setPositiveButton(R.string.install, (dialog, which) -> - NavigationHelper.installKore(context)) - .setNegativeButton(R.string.cancel, (dialog, which) -> { - }); - builder.create().show(); + /** + * Start an activity to install Kore. + * + * @param context the context + */ + public static void installKore(final Context context) { + installApp(context, context.getString(R.string.kore_package)); + } + + /** + * Start Kore app to show a video on Kodi, and if the app is not installed ask the user to + * install it. + *

+ * For a list of supported urls see the + * + * Kore source code + * . + * + * @param context the context to use + * @param videoURL the url to the video + */ + public static void playWithKore(final Context context, final Uri videoURL) { + final Intent intent = new Intent(Intent.ACTION_VIEW) + .setPackage(context.getString(R.string.kore_package)) + .setData(videoURL) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + if (!tryOpenIntentInApp(context, intent)) { + final AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setMessage(R.string.kore_not_found) + .setPositiveButton(R.string.install, (dialog, which) -> installKore(context)) + .setNegativeButton(R.string.cancel, (dialog, which) -> { }); + builder.create().show(); + } } } diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java index 06dd3f9454d..88363377247 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java @@ -41,60 +41,56 @@ private ShareUtils() { * second param (a system chooser will be opened if there are multiple markets and no default) * and falls back to Google Play Store web URL if no app to handle the market scheme was found. *

- * It uses {@link #openIntentInApp(Context, Intent, boolean)} to open market scheme - * and {@link #openUrlInBrowser(Context, String, boolean)} to open Google Play Store - * web URL with false for the boolean param. + * It uses {@link #openIntentInApp(Context, Intent)} to open market scheme and {@link + * #openUrlInBrowser(Context, String)} to open Google Play Store web URL. * * @param context the context to use * @param packageId the package id of the app to be installed */ public static void installApp(@NonNull final Context context, final String packageId) { // Try market scheme - final boolean marketSchemeResult = openIntentInApp(context, new Intent(Intent.ACTION_VIEW, + final Intent marketSchemeIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageId)) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), false); - if (!marketSchemeResult) { + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (!tryOpenIntentInApp(context, marketSchemeIntent)) { // Fall back to Google Play Store Web URL (F-Droid can handle it) - openUrlInBrowser(context, - "https://play.google.com/store/apps/details?id=" + packageId, false); + openUrlInApp(context, "https://play.google.com/store/apps/details?id=" + packageId); } } /** - * Open the url with the system default browser. - *

- * If no browser is set as default, fallbacks to - * {@link #openAppChooser(Context, Intent, boolean)} + * Open the url with the system default browser. If no browser is set as default, falls back to + * {@link #openAppChooser(Context, Intent, boolean)}. This function selects the package to open + * based on which apps respond to the {@code http://} schema alone, which should exclude special + * non-browser apps that are can handle the url (e.g. the official YouTube app). Therefore + * please prefer {@link #openUrlInApp(Context, String)}, that handles package resolution + * in a standard way, unless this is the action of an explicit "Open in browser" button. * - * @param context the context to use - * @param url the url to browse - * @param httpDefaultBrowserTest the boolean to set if the test for the default browser will be - * for HTTP protocol or for the created intent - * @return true if the URL can be opened or false if it cannot - */ - public static boolean openUrlInBrowser(@NonNull final Context context, - final String url, - final boolean httpDefaultBrowserTest) { - final String defaultPackageName; + * @param context the context to use + * @param url the url to browse + **/ + public static void openUrlInBrowser(@NonNull final Context context, final String url) { + // Resolve using a generic http://, so we are sure to get a browser and not e.g. the yt app. + // Note that this requires the `http` schema to be added to `` in the manifest. + final ResolveInfo defaultBrowserInfo = context.getPackageManager().resolveActivity( + new Intent(Intent.ACTION_VIEW, Uri.parse("http://")), + PackageManager.MATCH_DEFAULT_ONLY); + if (defaultBrowserInfo == null) { + // No app installed to open a web url + Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG).show(); + return; + } + + final String defaultBrowserPackage = defaultBrowserInfo.activityInfo.packageName; final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - if (httpDefaultBrowserTest) { - defaultPackageName = getDefaultAppPackageName(context, new Intent(Intent.ACTION_VIEW, - Uri.parse("http://")).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); - } else { - defaultPackageName = getDefaultAppPackageName(context, intent); - } - - if (defaultPackageName.equals("android")) { + if (defaultBrowserPackage.equals("android")) { // No browser set as default (doesn't work on some devices) openAppChooser(context, intent, true); } else { try { - // will be empty on Android 12+ - if (!defaultPackageName.isEmpty()) { - intent.setPackage(defaultPackageName); - } + intent.setPackage(defaultBrowserPackage); context.startActivity(intent); } catch (final ActivityNotFoundException e) { // Not a browser but an app chooser because of OEMs changes @@ -102,61 +98,54 @@ public static boolean openUrlInBrowser(@NonNull final Context context, openAppChooser(context, intent, true); } } - - return true; } /** - * Open the url with the system default browser. - *

- * If no browser is set as default, fallbacks to - * {@link #openAppChooser(Context, Intent, boolean)} - *

- * This calls {@link #openUrlInBrowser(Context, String, boolean)} with true - * for the boolean parameter + * Open a url with the system default app using {@link Intent#ACTION_VIEW}, showing a toast in + * case of failure. * * @param context the context to use - * @param url the url to browse - * @return true if the URL can be opened or false if it cannot be - **/ - public static boolean openUrlInBrowser(@NonNull final Context context, final String url) { - return openUrlInBrowser(context, url, true); + * @param url the url to open + */ + public static void openUrlInApp(@NonNull final Context context, final String url) { + openIntentInApp(context, new Intent(Intent.ACTION_VIEW, Uri.parse(url)) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } /** - * Open an intent with the system default app. - *

- * The intent can be of every type, excepted a web intent for which - * {@link #openUrlInBrowser(Context, String, boolean)} should be used. - *

- * If no app can open the intent, a toast with the message {@code No app on your device can - * open this} is shown. + * Open an intent with the system default app. Use {@link #openIntentInApp(Context, Intent)} to + * show a toast in case of failure. * - * @param context the context to use - * @param intent the intent to open - * @param showToast a boolean to set if a toast is displayed to user when no app is installed - * to open the intent (true) or not (false) - * @return true if the intent can be opened or false if it cannot be + * @param context the context to use + * @param intent the intent to open + * @return true if the intent could be opened successfully, false otherwise */ - public static boolean openIntentInApp(@NonNull final Context context, - @NonNull final Intent intent, - final boolean showToast) { - final String defaultPackageName = getDefaultAppPackageName(context, intent); - - if (defaultPackageName.isEmpty()) { - // No app installed to open the intent - if (showToast) { - Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG) - .show(); - } - return false; - } else { + public static boolean tryOpenIntentInApp(@NonNull final Context context, + @NonNull final Intent intent) { + try { context.startActivity(intent); + } catch (final ActivityNotFoundException e) { + return false; } - return true; } + /** + * Open an intent with the system default app, showing a toast in case of failure. Use {@link + * #tryOpenIntentInApp(Context, Intent)} if you don't want the toast. Use {@link + * #openUrlInApp(Context, String)} as a shorthand for {@link Intent#ACTION_VIEW} with urls. + * + * @param context the context to use + * @param intent the intent to + */ + public static void openIntentInApp(@NonNull final Context context, + @NonNull final Intent intent) { + if (!tryOpenIntentInApp(context, intent)) { + Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG) + .show(); + } + } + /** * Open the system chooser to launch an intent. *

@@ -206,31 +195,6 @@ private static void openAppChooser(@NonNull final Context context, context.startActivity(chooserIntent); } - /** - * Get the default app package name. - *

- * If no app is set as default, it will return "android" (not on some devices because some - * OEMs changed the app chooser). - *

- * If no app is installed on user's device to handle the intent, it will return an empty string. - * - * @param context the context to use - * @param intent the intent to get default app - * @return the package name of the default app, an empty string if there's no app installed to - * handle the intent or the app chooser if there's no default - */ - private static String getDefaultAppPackageName(@NonNull final Context context, - @NonNull final Intent intent) { - final ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(intent, - PackageManager.MATCH_DEFAULT_ONLY); - - if (resolveInfo == null) { - return ""; - } else { - return resolveInfo.activityInfo.packageName; - } - } - /** * Open the android share sheet to share a content. * diff --git a/app/src/main/java/org/schabi/newpipe/util/text/UrlLongPressClickableSpan.java b/app/src/main/java/org/schabi/newpipe/util/text/UrlLongPressClickableSpan.java index eb0d7425eeb..61c1a546d80 100644 --- a/app/src/main/java/org/schabi/newpipe/util/text/UrlLongPressClickableSpan.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/UrlLongPressClickableSpan.java @@ -30,7 +30,7 @@ final class UrlLongPressClickableSpan extends LongPressClickableSpan { public void onClick(@NonNull final View view) { if (!InternalUrlsHandler.handleUrlDescriptionTimestamp( disposables, context, url)) { - ShareUtils.openUrlInBrowser(context, url, false); + ShareUtils.openUrlInApp(context, url); } } 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 bfb6a15e2cd..695e7aead89 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 @@ -1,6 +1,5 @@ package us.shandian.giga.ui.adapter; -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; @@ -345,16 +344,7 @@ private void viewWithFileProvider(Mission mission) { intent.setDataAndType(resolveShareableUri(mission), mimeType); intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(FLAG_GRANT_PREFIX_URI_PERMISSION); - - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { - intent.addFlags(FLAG_ACTIVITY_NEW_TASK); - } - - if (intent.resolveActivity(mContext.getPackageManager()) != null) { - ShareUtils.openIntentInApp(mContext, intent, false); - } else { - Toast.makeText(mContext, R.string.toast_no_player, Toast.LENGTH_LONG).show(); - } + ShareUtils.openIntentInApp(mContext, intent); } private void shareFile(Mission mission) { diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 02c471d635b..c7fa792e23a 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -288,7 +288,6 @@ الملف غير موجود أو الإذن بالقراءة أو الكتابة إليه غير موجود لا يوجد بث متاح للتنزيل تم حذف عنصر واحد. - لم يتم تثبيت أي تطبيق لتشغيل هذا الملف NewPipe هو برنامج مفتوح المصدر وبحقوق متروكة: يمكنك استخدام الكود ودراسته وتحسينه كما شئت. وعلى وجه التحديد يمكنك إعادة توزيعه / أو تعديله تحت شروط رخصة GNU العمومية والتي نشرتها مؤسسة البرمجيات الحرة، سواء الإصدار 3 من الرخصة، أو (باختيارك) أي إصدار أحدث. آخر ما تم تشغيله الأكثر تشغيلا diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 0cce71fb0d8..bb00af528f9 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -588,7 +588,6 @@ Sil Android\'də pulsuz yüngül yayımlayıcı. © %1$s, %2$s tərəfindən %3$s altında - Bu faylı oynatmaq üçün heç bir tətbiq quraşdırılmayıb Endirmə Bu icazə, ani görüntü rejimində \naçmaq üçün lazımdır diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index 12739ba411d..0b857e59b75 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -425,7 +425,6 @@ El proyeutu de NewPipe toma mui en serio la privacidá. Poro, l\'aplicación nun recueye nengún datu ensin el to consentimientu. \nLa política de privacidá de NewPipe desplica en detalle los datos que s\'unvien y atroxen cuando unvies un informe de casque. Un aplicación llibre pa ver/sentir plataformes de tresmisión n\'Android. - Nun hai nenguna aplicación pa reproducir esti ficheru Caráuteres de troquéu Los caráuteres que nun son válidos van trocase por esti valor Fecho diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index 323dda73dce..a4101a9be38 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -214,7 +214,6 @@ © %1$s tomonidan %2$s gacha %3$s Uchinchi tomon litsenziyalari NewPipe haqida - Ushbu faylni ijro etish uchun dastur o\'rnatilmagan Ko\'pchilik maxsus belgilar Yozuvlar va raqamlar O\'zgartirish belgisi diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 8ed10b12682..8031cfe9c84 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -210,7 +210,6 @@ Сімвал для замены Літары і лічбы Большасць спецзнакаў - Прыкладанне для прайгравання гэтага файла не ўстаноўлена Аб NewPipe Іншыя ліцэнзіі © %1$s %2$s пад ліцэнзіяй %3$s diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 0c1ce484f42..27a70053e27 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -191,7 +191,6 @@ Няма абонати Създай Откажи - Няма инсталирано приложение, което да изпълни този файл © %1$s от %2$s под лиценза %3$s Съдействайте За всичко, което се сетите: превод, промени по дизайна, изчистване на кода или много сериозни промени по кода – помощта е винаги добре дошла. Колкото повече развитие, толкова по-добре! diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 34d507ee346..f37711eb0ae 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -303,7 +303,6 @@ প্রথম ক্রিয়া বোতাম থাম্বনেল ১:১ অনুপাতে সেট করো সিস্টেম ডিফল্ট - এ ফাইলটি চালানোর জন্য কোন অ্যাপ ইন্সটলকৃত নেই প্লেলিস্ট বুকমার্ক করুন "যখন পর্যাপ্ত নিবেদিত ফিড থেকে ডাটা সংগ্রহ করুন" সবসময় হালনগাদ করুন diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 46d12a8b69c..75a41c99a45 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -491,7 +491,6 @@ শেষ হালনাগাদের পর একটি সাবস্ক্রিপশনের আগের সময় সেকেলে বিবেচিত — %s তুমি কি এ গ্রুপটি মুছতে চাও\? আরও তথ্য এবং খবরের জন্য নিউপাইপ ওয়েবসাইট দেখো। - এ ফাইলটি চালানোর জন্য কোন অ্যাপ ইন্সটলকৃত নেই এতে তোমার বর্তমান অবস্থা সরানো হবে। সতর্কতা: সব তথ্য আনা যায়নি। © %3$s এর মাধ্যমে %2$s দিয়ে %1$s diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index fc9abd89162..633599827c9 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -299,7 +299,6 @@ No hi ha vídeos que es puguin baixar Subtítols Modifica la mida i el fons dels subtítols. Cal reiniciar l\'aplicació per aplicar els canvis - No s\'ha trobat cap aplicació instal·lada que pugui reproduir aquest fitxer Neteja l\'historial de reproduccions Neteja l\'historial dels vídeos reproduïts i les posicions de reproducció Voleu suprimir tot l\'historial de reproduccions\? diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 00ac35aff08..53d32cd93ce 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -319,7 +319,6 @@ کرداری بنەڕەتی لەکاتی کردنەوەی بابەتدا — %s هکیۆسکێک دیار بکە کۆنفرانسەکان - هیچ به‌رنامه‌یه‌ك دانەمەزراوە بۆ لێدانی ئەم فایله‌ كردنه‌وه‌ له‌ دۆخی په‌نجه‌ره‌ سنووری قەبارە لەکاتی بەکارهێنانی ڕایه‌ڵه‌ی مۆبایل داخستنی پلیکانە diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index abc77e66cca..9696b8d119a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -302,7 +302,6 @@ 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 - K přehrání tohoto souboru chybí vhodná aplikace Vymazat historii sledování Vymaže historii přehraných streamů pozic playbacku Vymazat celkovou historii sledování\? diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index f4601ec2d17..4f219e97be7 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -213,7 +213,6 @@ Erstatningstegn Bogstaver og cifre De fleste specialtegn - Der ingen app installeret der kan afspille denne fil Om NewPipe Tredjepartslicenser © %1$s af %2$s under %3$s diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 2aff1504601..ee1bc989f8d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -301,7 +301,6 @@ Standardaktion beim Öffnen von Inhalten — %s Untertitel Textgröße und Hintergrund der Untertitel im Player anpassen. Erfordert Neustart der App - Keine App zum Abspielen dieser Datei installiert Wiedergabeverlauf löschen Den Verlauf der wiedergegebenen Streams und die Wiedergabepositionen löschen Den ganzen Wiedergabeverlauf löschen\? diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index d19b5731ffd..76ebbc070a4 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -210,7 +210,6 @@ Οι μη έγκυροι χαρακτήρες αντικαθίστανται με αυτήν την τιμή Αντικαταστάτης χαρακτήρας Οι περισσότεροι ειδικοί χαρακτήρες - Δεν υπάρχει εγκατεστημένη εφαρμογή για την αναπαραγωγή αυτού του αρχείου Σχετικά με το NewPipe Άδειες Τρίτων © %1$s από %2$s υπό %3$s diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index f822442468b..b52cfe99f61 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -187,7 +187,6 @@ Vakigi tutajn kaŝmemorigitajn retpaĝajn datumojn Kaŝmemorojn de metadatumojn vakigis Neniuj torentoj haveblaj por elŝuti - Neniu apo instalita por ludi ĉi tiun dosieron Forviŝi vidohistorion Forviŝi la historion de viditaj filmetojn kaj ludajn poziciojn Ĉu vi volas forviŝi la tutan historion \? diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 1ea51486868..21dd5f9bbc6 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -301,7 +301,6 @@ No hay streams disponibles para descargar Acción de apertura preferida Acción predefinida al abrir contenido: %s - No se encontró ninguna aplicación que reproduzca este archivo Subtítulos Modificar la escala de texto de los subtítulos y los estilos de fondo. Requiere reiniciar la aplicación para que surta efecto Vaciar historial de reproducciones diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index b9114c4d312..17d0981de50 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -200,7 +200,6 @@ Asendustähemärk Tähed ja numbrid Erimärgid - Selle faili esitamiseks puudub rakendus NewPipe rakendusest Kolmanda osapoole litsentsid Rakenduse teave ja KKK diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 6b35b7316af..d94924259c8 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -243,7 +243,6 @@ Baztertu Aldatu izena Elementu 1 ezabatuta. - Ez dago fitxategi hau erreproduzitzeko aplikaziorik instalatuta Jotako azkena Ikusiena Esportatuta diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 72dc7766048..6836ccb87dc 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -176,7 +176,6 @@ نویسه جایگزین حروف و اعداد مهم‌ترین نویسه‌های خاص - کاره‌ای برای پخش این پرونده نصب نشده است درباره نیوپایپ درباره و سوالات‌متداول پروانه‌ها diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index b0e6b2abab0..026839c5098 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -240,7 +240,6 @@ Hylkää Nimeä uudelleen 1 poistettu. - Ohjelmaa tämän toistamiseen ei ole asennettu NewPipen tietosuojakäytäntö NewPipe ottaa yksityisyytesi tosissaan. Siksi se ei kerää sinulta mitään tietoja ilman lupaasi. \nNewPipen tietosuojakäytännössä selitetään tarkasti mitä tietoja lähetetään tai tallennetaan virheraportin yhteydessä. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 77b4f09bb71..370f75ccf54 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -302,7 +302,6 @@ Sous-titres Modifier la taille du texte et les styles d’arrière-plan des sous-titres du lecteur. Le redémarrage de l’application est requis pour appliquer les changements Ton - Aucune application installée pour lire ce fichier Effacer l’historique des vues Supprime l’historique des flux lus et des positions de reprise de lecture Voulez-vous supprimer entièrement l’historique des vues \? diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index b70f6266f16..dc7ae60110b 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -206,7 +206,6 @@ Carácter de substitución Letras e díxitos A maioría dos caracteres especiais - Non hai ningún aplicativo instalado para reproducir este ficheiro Sobre o NewPipe Licenzas de terceiros © %1$s de %2$s, so %3$s diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 6be8c107355..270b94e674a 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -225,7 +225,6 @@ התעלמות שינוי שם פריט אחד נמחק. - לא מותקן יישומון שמתאים לנגינת הקובץ הזה הייצוא הסתיים הייבוא הסתיים אין קובץ ZIP תקין diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index dc08899ed1c..056783cd8d6 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -275,7 +275,6 @@ एक भूल हुई: %1$s डाउनलोड करने के लिए कोई स्ट्रीम उपलब्ध नही है एक चीज़ साफ कर दी गई। - इस फ़ाइल को चलाने के लिए कोई ऐप स्थापित नही है न्यूपाइप की गोपनीयता नीति न्यूपाइप परियोजना आपकी गोपनीयता को बहोत गंभीर रूप से लेता है। इसलिए, ऐप आपकी अनुमति के बिना कोई डेटा जमा नही करता। \nन्यूपाइप की गोपनीयता नीति विस्तार से समज़ाती है कि कोनसा डेटा भेजा या संग्रह किया जाता है जब आप क्रेश विवरण भेजते है। diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index bc35866e3e4..cdaae6cf9d5 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -250,7 +250,6 @@ Odbaci Preimenuj 1 stavka izbrisana. - Nijedan program nije instaliran za reprodukciju ove datoteke Vrati Posjeti NewPipe web-stranicu za više informacija i vijesti. NewPipe pravila o privatnosti diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 8a518bda633..5ae2288c084 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -200,7 +200,6 @@ Csere karakter Betűk és számok Legtöbb speciális karakter - Nincs a fájl lejátszásához szükséges alkalmazás telepítve A NewPipe névjegye Névjegy és GYIK Licencek diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index cc5f6dd3b02..f1e426bc7d5 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -255,7 +255,6 @@ Riwayat pencarian dihapus Tidak ada video yang tersedia untuk diunduh 1 item dihapus. - Tidak ada aplikasi terpasang untuk memutar berkas ini Daftar Putar Putar otomatis video berikutnya Berhenti berlanggan channel diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index ffb0b59d1d2..0129ead5bab 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -253,7 +253,6 @@ Leysa Lokið Beðið eftir þraut reCAPTCHA - Ekkert forrit er uppsett til að spila þessa skrá Leyfi þriðja aðila Hugbúnaðarleyfi © %1$s • %2$s • %3$s diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index ccaf935109e..c40a74ef19a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -302,7 +302,6 @@ Azione predefinita all\'apertura del contenuto — %s Sottotitoli Modifica dimensione e stile dei sottotitoli. Riavviare per applicare le modifiche - Nessuna app installata per riprodurre questo file Elimina la cronologia delle visualizzazioni Elimina la cronologia degli elementi riprodotti e le posizioni di riproduzione Eliminare la cronologia delle visualizzazioni\? diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e320649a361..fefd8ef2330 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -245,7 +245,6 @@ 検索履歴を消去 検索キーワードの履歴を削除します 検索履歴を削除しました - このファイルを再生するためのアプリがインストールされていません 設定もインポートしますか? 字幕 チャンネル diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 1d5d42cace7..ecc868f9e84 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -633,7 +633,6 @@ დაშვებული სიმბოლოები ფაილის სახელებში არასწორი სიმბოლოები ჩანაცვლებულია ამ მნიშვნელობით შესახებ & ხშირად დასმული კითხვები - ამ ფაილის დასაკრავად აპი არ არის დაინსტალირებული მესამე მხარის ლიცენზიები © %1$s მიერ %2$s %3$s-ის ქვეშ NewPipe შემუშავებულია მოხალისეების მიერ, რომლებიც ატარებენ თავისუფალ დროს და მოგაქვთ საუკეთესო მომხმარებლის გამოცდილება. დაეხმარეთ დეველოპერებს, გააუმჯობესონ NewPipe, სანამ ფინჯანი ყავით ტკბებიან. diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index f2baecb0a54..c5c4ee46b21 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -538,7 +538,6 @@ Paraxwe dayin Li Android-ê veguhastina ronahiya sivik. Derbarê NewPipe - Ji bo lîstina vê pelê tu bername nehat saz kirin Pir karakterên taybetî Name û reqem Karaktera guheztinê diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 6011432b19a..3e6dc142192 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -289,7 +289,6 @@ 피치 영상과 소리 분리 (왜곡이 발생할 수 있음) 다운로드 가능한 스트림이 없습니다 - 이 파일을 재생할 수 있는 플레이어 앱이 없습니다 선호하는 열기 동작 컨텐츠를 열 때 사용할 기본 동작 — %s 자막 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index c7dfd05d2bb..8867256243b 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -256,7 +256,6 @@ هیچ پەخشێک نییە بۆ دابەزاندن ژێرنووسەکان بەهۆی گۆڕانکاری لە شێوەی ژێرنووسکردنەکە. پێویستە ئەپەکە دابخەیت و دیسانەوە بیکەیتەوە. - هیچ ئەپێک دانەمەزراوە بۆ کارپێکردنی ئەم فایلە سڕینەوەی مێژووی تەماشاکردن مێژوو دەسڕێتەوە لەگەڵ ڤیدیۆ کارپێکراوەکان و شوێنی لیستە ڤیدیۆییەکان تەواوی مێژووی تەماشاکردن بسڕدرێتەوە؟ diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index bb45a0970fb..5792c826c51 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -512,7 +512,6 @@ NewPipe į jūsų privatumą žiūri labai rimtai. Programa be jūsų sutikimo nerenka jokių duomenų. \nNewPipe privatumo politika išsamiai parodo kokie duomenys siunčiami ir saugomi pranešant apie problemą. NewPipe privatumo politika - Šio failo atkūrimui nėra įdiegtos programos Atlikta Išspręsta Paspauskite \"atlikta\" kai išspręsta diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 86c756ecbd8..8667422dd11 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -71,7 +71,6 @@ Par Trešo pušu Licences Par NewPipe - Nav instalētu aplikāciju, lai atskaņotu šo failu Lielākā daļa īpašo rakstzīmju Burti un cipari Aizvietošanas rakstzīme diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 6052b871b80..4039949c702 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -300,7 +300,6 @@ Избришана е историјата на пребарувања. Нема стримови за симнување 1 ставка избришана. - Нема апликација за пуштање на овој фајл NewPipe е „copyleft“ слободен софтвер: Можеш да ја користиш, истражуваш и подобруваш по твоја желба. Можеш да ја редистрибуираш и/или да ја промениш под условите на GNU GPL лиценцата, публикувана од фондацијата FSF - или верзија 3 од лиценцата, или (по можност) понова верзија. Дали сакаш да се внесат и подесувањата? Претпочитана акција за „отворање“ diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 35243ca2600..2a61f4b0a49 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -125,7 +125,6 @@ %3$s ന്റെ കീഴിൽ %2$s ന്റെ ©%1$s തേർഡ്-പാർട്ടി ലൈസൻസുകൾ ന്യൂപൈപ്പിനെക്കുറിച്ച് - ഈ ഫയൽ പ്ലേ ചെയ്യാൻ കഴിയുന്ന ഒരു അപ്പും ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല പ്രത്യേക അടയാളങ്ങൾ അക്ഷരങ്ങളും അക്കങ്ങളും പകരം ഉപയോഗിക്കാവുന്ന അടയാളം diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 1ad8fe0efbe..202597f2bba 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -218,7 +218,6 @@ Karakter pengganti Huruf dan angka Karakter yang paling istimewa - Tiada app dipasang untuk memainkan fail ini Tentang NewPipe Lesen Pihak Ketiga © %1$s oleh %2$s di bawah %3$s diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 79bfa710a77..a79c9ddae1c 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -282,7 +282,6 @@ Slett hele søkehistorikken\? Søkehistorikken er slettet Ett element slettet. - Ingen app installert for å spille av denne filen Undertekster Endre spillerens undertekststørrelse og bakgrunnsstiler. Krever omstart av appen for å tre i kraft NewPipe er copyleft fri programvare: Du kan bruke, studere og forbedre den etter egen vilje. Spesifikt kan du redistribuere og/eller modifisere den i henhold til vilkårene gitt i GNU General Public-lisensen, som er publisert av Free Software Foundation, enten versjon 3 av lisensen, eller (etter eget ønske) enhver senere versjon. diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 6f3d2bb6eeb..28207c58309 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -225,7 +225,6 @@ प्रतिस्थापन वर्ण अक्षर र अंक सबै विशेष वर्णहरु - कुनै अनुप्रयोग यो फाइल खेल्न स्थापित न्यू पाइपको बारेमा तेस्रो-पक्ष इजाजत पत्र ©%1$s को %2$s द्वारा %3$s अन्तर्गत diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 6ab0fbf5c10..507ae7d1436 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -194,7 +194,6 @@ Vervangend teken Letters en cijfers Meeste speciale tekens - Er is geen app geïnstalleerd die dit bestand kan afspelen Over NewPipe Derdepartijlicenties © %1$s door %2$s, uitgebracht onder de %3$s diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ab73b602feb..c01a5a5c439 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -299,7 +299,6 @@ Geen streams beschikbaar voor downloaden Ondertitels Ondertitelgrootte 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 bekeken video\'s en afspeelposities De gehele kijkgeschiedenis wissen\? diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 31a53a6b33b..16406583664 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -542,7 +542,6 @@ କୌଣସି ଗ୍ରାହକ ନାହାଁନ୍ତି ସୃଷ୍ଟି କରନ୍ତୁ ବିବରଣୀ ପାଇଁ ଟ୍ୟାପ୍ କରନ୍ତୁ - ଏହି ଫାଇଲ୍ ଚଲାଇବା ପାଇଁ କୌଣସି ଆପ୍ ସଂସ୍ଥାପିତ ହୋଇନାହିଁ ନାମ ପରିବର୍ତ୍ତନ କରନ୍ତୁ ଦୟାକରି ଅପେକ୍ଷା କର… ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର ସେଟ୍ ହୋଇନାହିଁ, ବର୍ତ୍ତମାନ ଡିଫଲ୍ଟ ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର ବାଛନ୍ତୁ diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 2dcac20ab1e..5c43baee7d8 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -201,7 +201,6 @@ ਵਟਾਂਦਰਾ ਚਿੰਨ ਅੱਖਰ ਅਤੇ ਅੰਕ ਬਹੁਤੇ ਖ਼ਾਸ ਅੱਖਰ - ਇਸ ਫਾਈਲ ਨੂੰ ਚਲਾਉਣ ਲਈ ਕੋਈ ਐਪ ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ ਨਿਊਪਾਈਪ ਬਾਰੇ ਤੀਜੀ ਧਿਰ ਦੇ ਲਾਈਸੈਂਸ © %1$s ਵਲੋਂ %2$s, %3$s ਅਧੀਨ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 4f5ae1448b9..bfdb9cb0143 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -314,7 +314,6 @@ Usunąć całą historię wyszukiwania\? Usunięto historię wyszukiwania Usunięto jedną pozycję - Brak zainstalowanej aplikacji do odtworzenia tego pliku NewPipe jest wolnym i bezpłatnym oprogramowaniem: Możesz używać, udostępniać i ulepszać je do woli. W szczególności możesz je redystrybuować i/lub modyfikować zgodnie z warunkami GNU General Public License, opublikowanej przez Free Software Fundation, w wersji 3 albo (według Twojego wyboru) jakiejkolwiek późniejszej wersji. Czy chcesz zaimportować również ustawienia? Polityka prywatności NewPipe diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index f9b3ac196b6..f97420ff501 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -301,7 +301,6 @@ Fechar gaveta Legendas Mudar tamanho da legenda e estilos de plano de fundo. Requer reiniciar o app para ter efeito - Nenhum app instalado para reproduzir este arquivo Excluir histórico de vídeo Exclui o histórico de vídeos e as posições de reprodução Excluir todo o histórico de vídeo\? diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 80f6331e301..d83c456623a 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -227,7 +227,6 @@ Limite de atualização da fonte OK Não foi possível atualizar a subscrição - Não existe uma aplicação para reproduzir este ficheiro Sim e também os vídeos parcialmente vistos M Ainda não há listas de reprodução favoritas diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 36528078c0e..9cceefc2bfb 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -297,7 +297,6 @@ Remover todo o histórico de pesquisas\? Histórico de pesquisa removido 1 item eliminado. - Não existe uma aplicação para reproduzir este ficheiro NewPipe é desenvolvido por voluntários que utilizam o seu tempo livre para nos proporcionar a melhor experiência. Retribua para ajudar os programadores a tornarem NewPipe ainda melhor. Contribuir Política de privacidade do NewPipe diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 5eae3876ffb..0091e43606c 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -246,7 +246,6 @@ Creați Respingeți Redenumiţi - Nici o aplicație instalată pentru a reda acest fișier Donaţi De asemenea, doriți să importați setări? Nume diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 999e9b2fee1..f593fdc6130 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -311,7 +311,6 @@ При открытии ссылки на контент — %s Нет потоков для загрузки Субтитры - Приложение для воспроизведения этого файла не установлено Изменить размер текста и стиль субтитров. Нужен перезапуск Очистить историю Удалить всю историю просмотров\? diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 68c6fd5c1a8..ce25d6b3fad 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -109,7 +109,6 @@ © %1$s de %2$s cun litzèntzia %3$s Litzèntzias de tertzas partes In subra de NewPipe - Peruna aplicatzione installada pro pòdere riproduire custu documentu Majoria de sos caràteres ispetziales Lìteras e tzifras Caràtere de remplasamentu diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index f8340b47bc4..05f9c70b9e0 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -262,7 +262,6 @@ Názov súboru nesme byť prázdny Nastala chyba: %1$s Žiadne streamy nie sú k dispozícii na prevzatie - Prehrávač pre daný typ súboru nebol nájdený Preferovaná akcia \'otvoriť\' Predvolená akcia pri otváraní obsahu — %s Automaticky vygenerované diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 222b4b1376b..188e6f59b80 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -362,7 +362,6 @@ \nPolitika zasebnosti NewPipe-a podrobno pojasnjuje, kateri podatki so poslani in shranjeni, ko pošljete poročilo o zrušitvi. Pomagaj NewPipe razvijajo prostovoljci, ki preživljajo svoj prosti čas, da vam prinašajo najboljšo uporabniško izkušnjo. Pomagajte razvijalcem pri izdelavi še boljšega NewPipe-a medtem ko uživajo skodelico kave. - Za predvajanje te datoteke ni nameščena nobena aplikacija Pritisni \"končano\" ko je rešena Odstranjen 1 element. Izračun zgoščevalne funkcije je v teku diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index 530cb465d59..6a299d48186 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -183,7 +183,6 @@ © %1$s sameeyay %2$s ayagoo raacaya %3$s Laysimada gacanta sadexaad Kusaabsan NewPipe - Shaygan app fura kuuguma jiro Xarfaha gaarka ah kuwa ugu badan Xarfaha iyo godadka Xarafka lagu baddalayo diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 073800b765c..7c248c53eff 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -250,7 +250,6 @@ © %1$s nga %2$s nën %3$s Licensat e palëve të treta Rreth NewPipe - Nuk ka aplikacion të instaluar që mund ta luajë këtë skedar Shumica e karaktereve speciale Shkronjat dhe numrat Karakteri zëvendësues diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index e87498e537a..142f179c913 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -389,7 +389,6 @@ Пројекат ЊуПајп врло озбиљно схвата вашу приватност. Стога апликација не прикупља никакве податке без вашег пристанка. \nПолитика приватности ЊуПајпа детаљно објашњава који се подаци шаљу и чувају када пошаљете извештај о паду апликације. Политика приватности ЊуПајпа - Нема апликације за пуштање овог фајла Готово Реши Притисните „Готово“ кад решите diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index a64bbf55566..71dadfc6c35 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -242,7 +242,6 @@ Avfärda 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. \nNewPipes sekretesspolicy förklarar i detalj vad för data som skickas och lagras när du skickar en kraschrapport. diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index ac34a316ed1..fd38b35d556 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -325,7 +325,6 @@ లోపనివేదన నోటిఫికేషన్ చెరుపు వాటిని తీసివేయడానికి వాటిని స్వైప్ చేయండి - ఈ ఫైల్‌ని ప్లే చేయడానికి యాప్ ఏదీ ఇన్‌స్టాల్ చేయబడలేదు మరింత సమాచారం మరియు వార్తల కోసం NewPipe వెబ్‌సైట్‌ని సందర్శించండి. NewPipe ప్రాజెక్ట్ మీ గోప్యతను చాలా తీవ్రంగా పరిగణిస్తుంది. కాబట్టి, మీ సమ్మతి లేకుండా యాప్ ఎలాంటి డేటాను సేకరించదు. \nNewPipe యొక్క గోప్యతా విధానం మీరు క్రాష్ నివేదికను పంపినప్పుడు ఏ డేటా పంపబడుతుందో మరియు నిల్వ చేయబడుతుందో వివరంగా వివరిస్తుంది. diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index fd7e457bf7d..19297e8f387 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -207,7 +207,6 @@ อักขระทดแทน ตัวอักษรและตัวเลข อักขระพิเศษส่วนใหญ่ - ไม่มีแอพที่ติดตั้งเพื่อให้เล่นไฟล์นี้ได้ เกี่ยวกับ NewPipe สัญญาอนุญาตของบุคคลที่สาม © %1$s โดย %2$s ภายใต้ %3$s diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 89825603151..301b3db895d 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -295,7 +295,6 @@ Paylaşma ekranında tanımlı eylem — %s Alt yazılar Oynatıcı alt yazı metin ölçeğini ve arka plan biçimini değiştirin. Etkili olması için uygulamayı yeniden başlatma gerektirir - Bu dosyayı oynatmak için herhangi bir uygulama yüklü değil İzleme geçmişini temizle Oynatılan akışların geçmişini ve kalınan oynatım konumlarını siler İzleme geçmişinin tamamı silinsin mi\? diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index a8904c05e1a..270ee0d8ee7 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -307,7 +307,6 @@ Типова дія під час відкриття вмісту — %s Субтитри Зміна висоти тексту субтитрів та стилів тла. Потребує перезапуску застосунку - Не встановлено застосунків для відтворення цього файлу Очистити історію переглядів Видаляє історію відтворень і позицій відтворення Видалити всю історію переглядів\? diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 686644fd989..a49d7b301f9 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -294,7 +294,6 @@ غیر مربوط (مسخ کا سبب بن سکتا ہے) عنوانات پلیئر کیپشن ٹیکسٹ اسکیل اور بیک گراونڈ اسٹائل میں ترمیم کریں۔ اثر لینے کیلئے ایپ کو دوبارہ شروع کرنا ضروری ہے۔ - اس فائل کو چلانے کے لئے کوئی ایپ انسٹال نہیں ہے دیکھنے کی سرگزشت صاف کریں چلائے گئے سلسلوں اور پلے بیک پوزیشنز کی سرگزشت کو حذف کیا گیا دیکھے جانے کی تمام سرگزشت حذف کریں؟ diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 8262abcef37..54cef6aa192 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -215,7 +215,6 @@ Ký tự thay thế Chỉ chữ cái và chữ số Hầu hết các ký tự đặc biệt - Không có ứng dụng nào được cài đặt để phát tệp này Đóng góp NewPipe được phát triển bởi các tình nguyện viên dành thời gian và tâm huyết của mình để mang lại cho bạn trải nghiệm tốt nhất. Đóng góp một chút xiền để giúp chúng tôi làm NewPipe tốt hơn nữa (Nếu bạn muốn). Đôn Nét diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 06ae30657c0..b5499483e52 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -106,7 +106,6 @@ 新建 退出 重命名 - 未安装可播放此文件的应用程序 已删除一个项目。 自定义主页显示的标签页 列表视图模式 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 42661322f5a..701b89c079c 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -324,7 +324,6 @@ 未設定下載資料夾,請立即揀選預設嘅下載資料夾 刪除咗 1 個項目。 執執佢 - 未裝 app 嚟播放呢個檔案 搞掂 NewPipe 專案非常著重您嘅私隱。因此,呢個 app 未得您同意係唔會收集任何資料。 \nNewPipe 嘅私隱政策,詳述當您傳送彈 app 報告時,有咩資料會傳送同保存。 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 0b5112e1815..a311d704abb 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -293,7 +293,6 @@ 沒有可供下載的串流 字幕 調整播放器字幕文字大小與背景樣式。必須重新啟動應用程式才會生效 - 未安裝可播放此檔案的應用程式 清除觀看歷史 刪除播放過的串流與播放位置歷史 刪除所有觀看歷史記錄? diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 09bf9080c7f..b595a8f2cab 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -1,7 +1,7 @@ - https://f-droid.org/packages/org.videolan.vlc/ RSS + org.videolan.vlc org.xbmc.kore https://joinpeertube.org/instances#instances-list newpipe diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 661f05c8c50..a8d527ffb84 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -345,7 +345,6 @@ Replacement character Letters and digits Most special characters - No app installed to play this file About NewPipe Third-party Licenses From c2968a3ff254a54108b570d2c77924e1180f446e Mon Sep 17 00:00:00 2001 From: Stypox Date: Sat, 25 Feb 2023 09:06:15 +0100 Subject: [PATCH 092/645] Use non-deprecated resolveActivity method on API 33+ But such method is not available before API 33 --- .../util/external_communication/ShareUtils.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java index 88363377247..b30a5ed4f2d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java @@ -72,9 +72,16 @@ public static void installApp(@NonNull final Context context, final String packa public static void openUrlInBrowser(@NonNull final Context context, final String url) { // Resolve using a generic http://, so we are sure to get a browser and not e.g. the yt app. // Note that this requires the `http` schema to be added to `` in the manifest. - final ResolveInfo defaultBrowserInfo = context.getPackageManager().resolveActivity( - new Intent(Intent.ACTION_VIEW, Uri.parse("http://")), - PackageManager.MATCH_DEFAULT_ONLY); + final ResolveInfo defaultBrowserInfo; + final Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://")); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + defaultBrowserInfo = context.getPackageManager().resolveActivity(browserIntent, + PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_DEFAULT_ONLY)); + } else { + defaultBrowserInfo = context.getPackageManager().resolveActivity(browserIntent, + PackageManager.MATCH_DEFAULT_ONLY); + } + if (defaultBrowserInfo == null) { // No app installed to open a web url Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG).show(); From 24ff6a4313071ac630a58fba8b9ecfebe2622432 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sat, 25 Feb 2023 09:08:48 +0100 Subject: [PATCH 093/645] Rename videoURL to streamUrl --- .../newpipe/util/external_communication/KoreUtils.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/KoreUtils.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/KoreUtils.java index 7fe518113d1..4dc9c7c078b 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/KoreUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/KoreUtils.java @@ -36,7 +36,7 @@ public static boolean shouldShowPlayWithKodi(@NonNull final Context context, /** * Start an activity to install Kore. * - * @param context the context + * @param context the context to use */ public static void installKore(final Context context) { installApp(context, context.getString(R.string.kore_package)); @@ -51,13 +51,13 @@ public static void installKore(final Context context) { * Kore source code * . * - * @param context the context to use - * @param videoURL the url to the video + * @param context the context to use + * @param streamUrl the url to the stream to play */ - public static void playWithKore(final Context context, final Uri videoURL) { + public static void playWithKore(final Context context, final Uri streamUrl) { final Intent intent = new Intent(Intent.ACTION_VIEW) .setPackage(context.getString(R.string.kore_package)) - .setData(videoURL) + .setData(streamUrl) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (!tryOpenIntentInApp(context, intent)) { From be4f3d9d62d97f864f3ddd2659e1eba39fc93df6 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sat, 25 Feb 2023 09:13:35 +0100 Subject: [PATCH 094/645] Improve javadocs in ShareUtils --- .../external_communication/ShareUtils.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java index b30a5ed4f2d..2f50a94ae3c 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java @@ -60,11 +60,15 @@ public static void installApp(@NonNull final Context context, final String packa /** * Open the url with the system default browser. If no browser is set as default, falls back to - * {@link #openAppChooser(Context, Intent, boolean)}. This function selects the package to open - * based on which apps respond to the {@code http://} schema alone, which should exclude special - * non-browser apps that are can handle the url (e.g. the official YouTube app). Therefore - * please prefer {@link #openUrlInApp(Context, String)}, that handles package resolution - * in a standard way, unless this is the action of an explicit "Open in browser" button. + * {@link #openAppChooser(Context, Intent, boolean)}. + *

+ * This function selects the package to open based on which apps respond to the {@code http://} + * schema alone, which should exclude special non-browser apps that are can handle the url (e.g. + * the official YouTube app). + *

+ * Therefore please prefer {@link #openUrlInApp(Context, String)}, that handles package + * resolution in a standard way, unless this is the action of an explicit "Open in browser" + * button. * * @param context the context to use * @param url the url to browse @@ -120,8 +124,9 @@ public static void openUrlInApp(@NonNull final Context context, final String url } /** - * Open an intent with the system default app. Use {@link #openIntentInApp(Context, Intent)} to - * show a toast in case of failure. + * Open an intent with the system default app. + *

+ * Use {@link #openIntentInApp(Context, Intent)} to show a toast in case of failure. * * @param context the context to use * @param intent the intent to open @@ -138,8 +143,9 @@ public static boolean tryOpenIntentInApp(@NonNull final Context context, } /** - * Open an intent with the system default app, showing a toast in case of failure. Use {@link - * #tryOpenIntentInApp(Context, Intent)} if you don't want the toast. Use {@link + * Open an intent with the system default app, showing a toast in case of failure. + *

+ * Use {@link #tryOpenIntentInApp(Context, Intent)} if you don't want the toast. Use {@link * #openUrlInApp(Context, String)} as a shorthand for {@link Intent#ACTION_VIEW} with urls. * * @param context the context to use From 8e888ebdf7b49b7e2ac107016ba98e308b99bce0 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sat, 25 Feb 2023 15:03:58 +0100 Subject: [PATCH 095/645] Reduce the size of thumbnails on big screens to fit more grid columns Reverts part of #9310, which introduced bigger grid thumbnail sizes on big screens, because some users reported not being happy about having too few grid columns. See https://github.com/TeamNewPipe/NewPipe/pull/9310#discussion_r1070670806 . --- app/src/main/res/values-w820dp/dimens.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml index 817cd8f8563..ce2d482a526 100644 --- a/app/src/main/res/values-w820dp/dimens.xml +++ b/app/src/main/res/values-w820dp/dimens.xml @@ -4,6 +4,6 @@ would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> 64dp - 280dp - 160dp + 208dp + 117dp From 9067c770a75aea9e8f0fd25dcb617536c15e09f1 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Sat, 25 Feb 2023 22:14:49 +0100 Subject: [PATCH 096/645] Made some small code improvements --- .../schabi/newpipe/local/playlist/LocalPlaylistManager.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java index 0a9120da2cc..0cf2d67c5bc 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java @@ -42,13 +42,11 @@ public Maybe> createPlaylist(final String name, final List database.runInTransaction(() -> { final List streamIds = streamTable.upsertAll(streams); - newPlaylist.setThumbnailStreamId(streamIds.get(0)); + final PlaylistEntity newPlaylist = new PlaylistEntity(name, false, + streamIds.get(0)); return insertJoinEntities(playlistTable.insert(newPlaylist), streamIds, 0); From 42d861688eb00fae428476ef990066c8bcfee793 Mon Sep 17 00:00:00 2001 From: Nyan Cat <17372086+e666666@users.noreply.github.com> Date: Sat, 4 Feb 2023 15:31:08 +0800 Subject: [PATCH 097/645] Implement Ignore hardware media button events option --- .../player/mediasession/MediaSessionPlayerUi.java | 10 ++++++++++ app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/video_audio_settings.xml | 7 +++++++ 4 files changed, 20 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java index e9541ab06d8..3d19e078425 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java @@ -44,6 +44,15 @@ public void initPlayer() { sessionConnector = new MediaSessionConnector(mediaSession); sessionConnector.setQueueNavigator(new PlayQueueNavigator(mediaSession, player)); sessionConnector.setPlayer(getForwardingPlayer()); + sessionConnector.setMediaButtonEventHandler((p, i) -> { + // It seems like events from the Media Control UI + // in the notification area don't go through this function, + // so it's safe to just ignore all events in case we want to + // ignore the hardware media buttons. + // Returning true stops all further event processing of the system + return player.getPrefs().getBoolean( + context.getString(R.string.ignore_hardware_media_buttons_key), false); + }); sessionConnector.setMetadataDeduplicationEnabled(true); sessionConnector.setMediaMetadataProvider(exoPlayer -> buildMediaMetadata()); @@ -53,6 +62,7 @@ public void initPlayer() { public void destroyPlayer() { super.destroyPlayer(); if (sessionConnector != null) { + sessionConnector.setMediaButtonEventHandler(null); sessionConnector.setPlayer(null); sessionConnector.setQueueNavigator(null); sessionConnector = null; diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 12681896951..0b2e58d04c3 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -25,6 +25,7 @@ screen_brightness_key screen_brightness_timestamp_key clear_queue_confirmation_key + ignore_hardware_media_buttons_key popup_saved_width popup_saved_x diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a8d527ffb84..06f8cf4f1d5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -83,6 +83,8 @@ Ask for confirmation before clearing a queue Switching from one player to another may replace your queue The active player queue will be replaced + Ignore hardware media button events + Useful, for instance, if you are using a headset with broken physical buttons Load thumbnails Turn off to prevent loading thumbnails, saving data and memory usage. Changes clear both in-memory and on-disk image cache Show comments diff --git a/app/src/main/res/xml/video_audio_settings.xml b/app/src/main/res/xml/video_audio_settings.xml index 8ff91548d1b..117ee870370 100644 --- a/app/src/main/res/xml/video_audio_settings.xml +++ b/app/src/main/res/xml/video_audio_settings.xml @@ -224,5 +224,12 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> + From a4767fc48aa5c33774038e8427effd41ee7f0e72 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 26 Feb 2023 14:27:48 +0100 Subject: [PATCH 098/645] Listen to ignore hardware buttons pref changes --- .../mediasession/MediaSessionPlayerUi.java | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java index 3d19e078425..6f76a91d1c0 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java @@ -3,6 +3,7 @@ import static org.schabi.newpipe.MainActivity.DEBUG; import android.content.Intent; +import android.content.SharedPreferences; import android.graphics.Bitmap; import android.support.v4.media.MediaMetadataCompat; import android.support.v4.media.session.MediaSessionCompat; @@ -23,14 +24,20 @@ import java.util.Optional; -public class MediaSessionPlayerUi extends PlayerUi { +public class MediaSessionPlayerUi extends PlayerUi + implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = "MediaSessUi"; private MediaSessionCompat mediaSession; private MediaSessionConnector sessionConnector; + private final String ignoreHardwareMediaButtonsKey; + private boolean shouldIgnoreHardwareMediaButtons = false; + public MediaSessionPlayerUi(@NonNull final Player player) { super(player); + ignoreHardwareMediaButtonsKey = + context.getString(R.string.ignore_hardware_media_buttons_key); } @Override @@ -44,15 +51,15 @@ public void initPlayer() { sessionConnector = new MediaSessionConnector(mediaSession); sessionConnector.setQueueNavigator(new PlayQueueNavigator(mediaSession, player)); sessionConnector.setPlayer(getForwardingPlayer()); - sessionConnector.setMediaButtonEventHandler((p, i) -> { - // It seems like events from the Media Control UI - // in the notification area don't go through this function, - // so it's safe to just ignore all events in case we want to - // ignore the hardware media buttons. - // Returning true stops all further event processing of the system - return player.getPrefs().getBoolean( - context.getString(R.string.ignore_hardware_media_buttons_key), false); - }); + + // It seems like events from the Media Control UI in the notification area don't go through + // this function, so it's safe to just ignore all events in case we want to ignore the + // hardware media buttons. Returning true stops all further event processing of the system. + sessionConnector.setMediaButtonEventHandler((p, i) -> shouldIgnoreHardwareMediaButtons); + + // listen to changes to ignore_hardware_media_buttons_key + updateShouldIgnoreHardwareMediaButtons(player.getPrefs()); + player.getPrefs().registerOnSharedPreferenceChangeListener(this); sessionConnector.setMetadataDeduplicationEnabled(true); sessionConnector.setMediaMetadataProvider(exoPlayer -> buildMediaMetadata()); @@ -61,6 +68,7 @@ public void initPlayer() { @Override public void destroyPlayer() { super.destroyPlayer(); + player.getPrefs().unregisterOnSharedPreferenceChangeListener(this); if (sessionConnector != null) { sessionConnector.setMediaButtonEventHandler(null); sessionConnector.setPlayer(null); @@ -84,6 +92,20 @@ public void onThumbnailLoaded(@Nullable final Bitmap bitmap) { } + @Override + public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, + final String key) { + if (key == null || key.equals(ignoreHardwareMediaButtonsKey)) { + updateShouldIgnoreHardwareMediaButtons(sharedPreferences); + } + } + + public void updateShouldIgnoreHardwareMediaButtons(final SharedPreferences sharedPreferences) { + shouldIgnoreHardwareMediaButtons = + sharedPreferences.getBoolean(ignoreHardwareMediaButtonsKey, false); + } + + public void handleMediaButtonIntent(final Intent intent) { MediaButtonReceiver.handleIntent(mediaSession, intent); } From c8ffe65acfff3ea12094c1f0b1b8eb12a7126410 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 26 Feb 2023 15:42:49 +0100 Subject: [PATCH 099/645] Simplify code to set tab layout position --- .../newpipe/fragments/MainFragment.java | 77 ++++++++++--------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 44d99cff73c..531d7b1cbd8 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -1,7 +1,15 @@ package org.schabi.newpipe.fragments; +import static android.widget.RelativeLayout.ABOVE; +import static android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM; +import static android.widget.RelativeLayout.ALIGN_PARENT_TOP; +import static android.widget.RelativeLayout.BELOW; +import static com.google.android.material.tabs.TabLayout.INDICATOR_GRAVITY_BOTTOM; +import static com.google.android.material.tabs.TabLayout.INDICATOR_GRAVITY_TOP; + import android.content.Context; import android.content.res.ColorStateList; +import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -12,10 +20,10 @@ import android.view.ViewGroup; import android.widget.RelativeLayout; +import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; -import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapterMenuWorkaround; @@ -93,8 +101,6 @@ protected void initViews(final View rootView, final Bundle savedInstanceState) { binding.mainTabLayout.setupWithViewPager(binding.pager); binding.mainTabLayout.addOnTabSelectedListener(this); - binding.mainTabLayout.setTabRippleColor(binding.mainTabLayout.getTabRippleColor() - .withAlpha(32)); setupTabs(); } @@ -112,7 +118,8 @@ public void onResume() { } else if (hasTabsChanged) { setupTabs(); } - updateTabsPosition(); + + updateTabLayoutPosition(); } @Override @@ -196,44 +203,38 @@ private void updateTabsIconAndDescription() { private void updateTitleForTab(final int tabPosition) { setTitle(tabsList.get(tabPosition).getTabName(requireContext())); } - private void updateTabsPosition() { + + private void updateTabLayoutPosition() { final ScrollableTabLayout tabLayout = binding.mainTabLayout; final ViewPager viewPager = binding.pager; - final RelativeLayout.LayoutParams tabParams = (RelativeLayout.LayoutParams) - tabLayout.getLayoutParams(); - final RelativeLayout.LayoutParams pagerParams = (RelativeLayout.LayoutParams) - viewPager.getLayoutParams(); - if (PreferenceManager.getDefaultSharedPreferences(requireContext()) - .getBoolean(getString(R.string.main_tabs_position_key), false)) { - tabParams.removeRule(RelativeLayout.ALIGN_PARENT_TOP); - tabParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); - pagerParams.removeRule(RelativeLayout.BELOW); - pagerParams.addRule(RelativeLayout.ABOVE, R.id.main_tab_layout); - tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_TOP); - tabLayout.setBackgroundColor(ThemeHelper - .resolveColorFromAttr(requireContext(), R.attr.colorSecondary)); - final int colorAccent = ThemeHelper.resolveColorFromAttr( - requireContext(), R.attr.colorAccent); - tabLayout.setTabRippleColor(ColorStateList.valueOf(colorAccent).withAlpha(32)); - tabLayout.setTabIconTint(ColorStateList.valueOf(colorAccent)); - tabLayout.setSelectedTabIndicatorColor(colorAccent); - } else { - tabParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM); - tabParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); - pagerParams.removeRule(RelativeLayout.ABOVE); - pagerParams.addRule(RelativeLayout.BELOW, R.id.main_tab_layout); - tabLayout.setSelectedTabIndicatorGravity(TabLayout.INDICATOR_GRAVITY_BOTTOM); - tabLayout.setBackgroundColor(ThemeHelper - .resolveColorFromAttr(requireContext(), R.attr.colorPrimary)); - tabLayout.setTabRippleColor(ColorStateList.valueOf( - getResources().getColor(R.color.white)).withAlpha(32)); - tabLayout.setTabIconTint(ColorStateList.valueOf( - getResources().getColor(R.color.white))); - tabLayout.setSelectedTabIndicatorColor(ContextCompat - .getColor(requireContext(), R.color.white)); - } + final boolean bottom = PreferenceManager.getDefaultSharedPreferences(requireContext()) + .getBoolean(getString(R.string.main_tabs_position_key), false); + + // change layout params to make the tab layout appear either at the top or at the bottom + final var tabParams = (RelativeLayout.LayoutParams) tabLayout.getLayoutParams(); + final var pagerParams = (RelativeLayout.LayoutParams) viewPager.getLayoutParams(); + + tabParams.removeRule(bottom ? ALIGN_PARENT_TOP : ALIGN_PARENT_BOTTOM); + tabParams.addRule(bottom ? ALIGN_PARENT_BOTTOM : ALIGN_PARENT_TOP); + pagerParams.removeRule(bottom ? BELOW : ABOVE); + pagerParams.addRule(bottom ? ABOVE : BELOW, R.id.main_tab_layout); + tabLayout.setSelectedTabIndicatorGravity( + bottom ? INDICATOR_GRAVITY_TOP : INDICATOR_GRAVITY_BOTTOM); + tabLayout.setLayoutParams(tabParams); viewPager.setLayoutParams(pagerParams); + + // change the background and icon color of the tab layout: + // service-colored at the top, app-background-colored at the bottom + tabLayout.setBackgroundColor(ThemeHelper.resolveColorFromAttr(requireContext(), + bottom ? R.attr.colorSecondary : R.attr.colorPrimary)); + + @ColorInt final int iconColor = bottom + ? ThemeHelper.resolveColorFromAttr(requireContext(), R.attr.colorAccent) + : Color.WHITE; + tabLayout.setTabRippleColor(ColorStateList.valueOf(iconColor).withAlpha(32)); + tabLayout.setTabIconTint(ColorStateList.valueOf(iconColor)); + tabLayout.setSelectedTabIndicatorColor(iconColor); } @Override From 65680b2ccfe2c5e15447f257f1bb247b4415a441 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 26 Feb 2023 15:58:09 +0100 Subject: [PATCH 100/645] Only update main tabs position when it changes --- .../newpipe/fragments/MainFragment.java | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 531d7b1cbd8..e1b61ea7c14 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -8,6 +8,7 @@ import static com.google.android.material.tabs.TabLayout.INDICATOR_GRAVITY_TOP; import android.content.Context; +import android.content.SharedPreferences; import android.content.res.ColorStateList; import android.graphics.Color; import android.os.Bundle; @@ -56,8 +57,11 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte private boolean hasTabsChanged = false; - private boolean previousYoutubeRestrictedModeEnabled; + private SharedPreferences prefs; + private boolean youtubeRestrictedModeEnabled; private String youtubeRestrictedModeEnabledKey; + private boolean mainTabsPositionBottom; + private String mainTabsPositionKey; /*////////////////////////////////////////////////////////////////////////// // Fragment's LifeCycle @@ -80,10 +84,11 @@ public void onCreate(final Bundle savedInstanceState) { } }); + prefs = PreferenceManager.getDefaultSharedPreferences(requireContext()); youtubeRestrictedModeEnabledKey = getString(R.string.youtube_restricted_mode_enabled); - previousYoutubeRestrictedModeEnabled = - PreferenceManager.getDefaultSharedPreferences(requireContext()) - .getBoolean(youtubeRestrictedModeEnabledKey, false); + youtubeRestrictedModeEnabled = prefs.getBoolean(youtubeRestrictedModeEnabledKey, false); + mainTabsPositionKey = getString(R.string.main_tabs_position_key); + mainTabsPositionBottom = prefs.getBoolean(mainTabsPositionKey, false); } @Override @@ -103,23 +108,25 @@ protected void initViews(final View rootView, final Bundle savedInstanceState) { binding.mainTabLayout.addOnTabSelectedListener(this); setupTabs(); + updateTabLayoutPosition(); } @Override public void onResume() { super.onResume(); - final boolean youtubeRestrictedModeEnabled = - PreferenceManager.getDefaultSharedPreferences(requireContext()) - .getBoolean(youtubeRestrictedModeEnabledKey, false); - if (previousYoutubeRestrictedModeEnabled != youtubeRestrictedModeEnabled) { - previousYoutubeRestrictedModeEnabled = youtubeRestrictedModeEnabled; - setupTabs(); - } else if (hasTabsChanged) { + final boolean newYoutubeRestrictedModeEnabled = + prefs.getBoolean(youtubeRestrictedModeEnabledKey, false); + if (youtubeRestrictedModeEnabled != newYoutubeRestrictedModeEnabled || hasTabsChanged) { + youtubeRestrictedModeEnabled = newYoutubeRestrictedModeEnabled; setupTabs(); } - updateTabLayoutPosition(); + final boolean newMainTabsPosition = prefs.getBoolean(mainTabsPositionKey, false); + if (mainTabsPositionBottom != newMainTabsPosition) { + mainTabsPositionBottom = newMainTabsPosition; + updateTabLayoutPosition(); + } } @Override @@ -207,8 +214,7 @@ private void updateTitleForTab(final int tabPosition) { private void updateTabLayoutPosition() { final ScrollableTabLayout tabLayout = binding.mainTabLayout; final ViewPager viewPager = binding.pager; - final boolean bottom = PreferenceManager.getDefaultSharedPreferences(requireContext()) - .getBoolean(getString(R.string.main_tabs_position_key), false); + final boolean bottom = mainTabsPositionBottom; // change layout params to make the tab layout appear either at the top or at the bottom final var tabParams = (RelativeLayout.LayoutParams) tabLayout.getLayoutParams(); From d8ed2c850356de9c1aa1e4b3596745983b3d5344 Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Tue, 28 Feb 2023 16:43:58 +0100 Subject: [PATCH 101/645] Refactoring removeDuplicates function and preventing concurrent calls. --- .../local/playlist/LocalPlaylistFragment.java | 43 +++++++++++++------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 36544a6a9d5..63cc1b57c03 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -95,8 +95,8 @@ public class LocalPlaylistFragment extends BaseLocalListFragment showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK, "Removing watched videos, partially watched=" + removePartiallyWatched)))); } @@ -623,7 +625,6 @@ private void updateThumbnailUrl() { changeThumbnailUrl(newThumbnailUrl); } - private void openRemoveDuplicatesDialog() { final AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity()); @@ -638,14 +639,28 @@ private void openRemoveDuplicatesDialog() { } private void removeDuplicatesInPlaylist() { - final List itemsToKeep = playlistManager - .getDistinctPlaylistStreams(playlistId).blockingFirst(); + if (isRewritingPlaylist) { + return; + } + isRewritingPlaylist = true; + showLoading(); - itemListAdapter.clearStreamItemList(); - itemListAdapter.addItems(itemsToKeep); - setVideoCount(itemListAdapter.getItemsList().size()); + final var streamsMaybe = playlistManager + .getDistinctPlaylistStreams(playlistId).firstElement(); - saveChanges(); + + disposables.add(streamsMaybe.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(itemsToKeep -> { + itemListAdapter.clearStreamItemList(); + itemListAdapter.addItems(itemsToKeep); + setVideoCount(itemListAdapter.getItemsList().size()); + saveChanges(); + + hideLoading(); + isRewritingPlaylist = false; + }, throwable -> showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK, + "Removing duplicated streams")))); } private void deleteItem(final PlaylistStreamEntry item) { From 1dd0930b835ae4bc7182f4f05ee3a69060f5db4b Mon Sep 17 00:00:00 2001 From: Jared Fantaye Date: Tue, 28 Feb 2023 17:30:17 +0100 Subject: [PATCH 102/645] Fixed some small issues --- .../schabi/newpipe/local/feed/FeedFragment.kt | 26 ++++++------------- .../newpipe/local/feed/FeedViewModel.kt | 2 ++ app/src/main/res/values/settings_keys.xml | 2 +- 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index 3ca3bd32095..9fe90969f1c 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -40,7 +40,6 @@ import androidx.appcompat.app.AlertDialog import androidx.core.content.edit import androidx.core.math.MathUtils import androidx.core.os.bundleOf -import androidx.core.view.MenuItemCompat import androidx.core.view.isVisible import androidx.lifecycle.ViewModelProvider import androidx.preference.PreferenceManager @@ -99,9 +98,6 @@ class FeedFragment : BaseStateFragment() { private var oldestSubscriptionUpdate: OffsetDateTime? = null private lateinit var groupAdapter: GroupieAdapter - @State @JvmField var showPlayedItems: Boolean = true - @State @JvmField var showPartiallyPlayedItems: Boolean = true - @State @JvmField var showFutureItems: Boolean = true private var onSettingsChangeListener: SharedPreferences.OnSharedPreferenceChangeListener? = null private var updateListViewModeOnResume = false @@ -140,9 +136,6 @@ class FeedFragment : BaseStateFragment() { val factory = FeedViewModel.getFactory(requireContext(), groupId) viewModel = ViewModelProvider(this, factory)[FeedViewModel::class.java] - showPlayedItems = viewModel.getShowPlayedItemsFromPreferences() - showPartiallyPlayedItems = viewModel.getShowPartiallyPlayedItemsFromPreferences() - showFutureItems = viewModel.getShowFutureItemsFromPreferences() viewModel.stateLiveData.observe(viewLifecycleOwner) { it?.let(::handleResult) } groupAdapter = GroupieAdapter().apply { @@ -217,10 +210,6 @@ class FeedFragment : BaseStateFragment() { activity.supportActionBar?.subtitle = groupName inflater.inflate(R.menu.menu_feed_fragment, menu) - MenuItemCompat.setTooltipText( - menu.findItem(R.id.menu_item_feed_toggle_played_items), - getString(R.string.feed_show_hide_streams) - ) } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -259,7 +248,11 @@ class FeedFragment : BaseStateFragment() { getString(R.string.feed_show_upcoming) ) - val checkedDialogItems = booleanArrayOf(showPlayedItems, showPartiallyPlayedItems, showFutureItems) + val checkedDialogItems = booleanArrayOf( + viewModel.getShowPlayedItemsFromPreferences(), + viewModel.getShowPartiallyPlayedItemsFromPreferences(), + viewModel.getShowFutureItemsFromPreferences() + ) val builder = AlertDialog.Builder(context!!) builder.setTitle(R.string.feed_hide_streams_title) @@ -268,14 +261,11 @@ class FeedFragment : BaseStateFragment() { } builder.setPositiveButton(R.string.ok) { _, _ -> - showPlayedItems = checkedDialogItems[0] - viewModel.setSaveShowPlayedItems(showPlayedItems) + viewModel.setSaveShowPlayedItems(checkedDialogItems[0]) - showPartiallyPlayedItems = checkedDialogItems[1] - viewModel.setSaveShowPartiallyPlayedItems(showPartiallyPlayedItems) + viewModel.setSaveShowPartiallyPlayedItems(checkedDialogItems[1]) - showFutureItems = checkedDialogItems[2] - viewModel.setSaveShowFutureItems(showFutureItems) + viewModel.setSaveShowFutureItems(checkedDialogItems[2]) } builder.setNegativeButton(R.string.cancel, null) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt index 015b72160f7..58f9e9edc28 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt @@ -157,9 +157,11 @@ class FeedViewModel( private fun getShowPartiallyPlayedItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(context.getString(R.string.feed_show_partially_watched_items_key), true) + private fun getShowFutureItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(context.getString(R.string.feed_show_future_items_key), true) + fun getFactory(context: Context, groupId: Long) = viewModelFactory { initializer { FeedViewModel( diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 281d3bf401a..57d1abc5c34 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -283,7 +283,7 @@ feed_update_threshold_key 300 - feed_show_watched_items + feed_show_played_items feed_show_partially_watched_items feed_show_future_items From 7617f8cdc71d42287b0ee7772234d86c49fe17e3 Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 28 Feb 2023 21:35:57 +0100 Subject: [PATCH 103/645] Update app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java --- .../schabi/newpipe/local/playlist/LocalPlaylistFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index ef76fe8e93d..8a71ce3a8a8 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -637,7 +637,7 @@ private void openRemoveDuplicatesDialog() { builder.setTitle(R.string.remove_duplicates_title) .setMessage(R.string.remove_duplicates_message) - .setPositiveButton(android.R.string.yes, (dialog, i) -> { + .setPositiveButton(R.string.ok, (dialog, i) -> { removeDuplicatesInPlaylist(); }) .setNeutralButton(R.string.cancel, null); From 43f46e29ad24910d5b7700bc2f6be56c326336cc Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 28 Feb 2023 21:40:11 +0100 Subject: [PATCH 104/645] Update app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java --- .../schabi/newpipe/local/playlist/LocalPlaylistFragment.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 8a71ce3a8a8..1da211b8097 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -637,9 +637,8 @@ private void openRemoveDuplicatesDialog() { builder.setTitle(R.string.remove_duplicates_title) .setMessage(R.string.remove_duplicates_message) - .setPositiveButton(R.string.ok, (dialog, i) -> { - removeDuplicatesInPlaylist(); - }) + .setPositiveButton(R.string.ok, + (dialog, i) -> removeDuplicatesInPlaylist()) .setNeutralButton(R.string.cancel, null); builder.create().show(); From bb57f9cc9dda7fe080c653926819e6f2b09279b9 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Wed, 1 Mar 2023 10:17:40 +0100 Subject: [PATCH 105/645] Merge branch 'origin/dev' into Weblate. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Translated using Weblate (Hindi) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.8% (654 of 655 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (Polish) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (Czech) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (Greek) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (Portuguese) Currently translated at 99.8% (654 of 655 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (German) Currently translated at 100.0% (655 of 655 strings) Translated using Weblate (Russian) Currently translated at 75.3% (55 of 73 strings) Translated using Weblate (Belarusian) Currently translated at 74.4% (487 of 654 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 99.8% (653 of 654 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Vietnamese) Currently translated at 99.2% (649 of 654 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Polish) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Czech) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Greek) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Slovenian) Currently translated at 64.2% (420 of 654 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Russian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (German) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (English) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Belarusian) Currently translated at 6.8% (5 of 73 strings) Translated using Weblate (Belarusian) Currently translated at 74.3% (486 of 654 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Czech) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (German) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Vietnamese) Currently translated at 98.4% (644 of 654 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Czech) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Korean) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Korean) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (German) Currently translated at 100.0% (654 of 654 strings) Merge branch 'origin/dev' into Weblate. Translated using Weblate (Bengali) Currently translated at 21.9% (16 of 73 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 69.8% (51 of 73 strings) Translated using Weblate (Portuguese) Currently translated at 69.8% (51 of 73 strings) Translated using Weblate (Italian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Odia) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Dutch) Currently translated at 65.7% (48 of 73 strings) Translated using Weblate (Italian) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 28.7% (21 of 73 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Galician) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Italian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Korean) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Japanese) Currently translated at 99.8% (653 of 654 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Basque) Currently translated at 45.2% (33 of 73 strings) Translated using Weblate (German) Currently translated at 73.9% (54 of 73 strings) Translated using Weblate (Sardinian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Polish) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Czech) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Greek) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Basque) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Portuguese) Currently translated at 99.8% (653 of 654 strings) Translated using Weblate (Russian) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (French) Currently translated at 99.6% (652 of 654 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (German) Currently translated at 100.0% (654 of 654 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 15.0% (11 of 73 strings) Translated using Weblate (German) Currently translated at 73.9% (54 of 73 strings) Translated using Weblate (Thai) Currently translated at 32.0% (209 of 652 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Italian) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 15.0% (11 of 73 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Russian) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Polish) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 64.3% (47 of 73 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Indonesian) Currently translated at 76.7% (56 of 73 strings) Translated using Weblate (Polish) Currently translated at 60.2% (44 of 73 strings) Translated using Weblate (Hindi) Currently translated at 21.9% (16 of 73 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Czech) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (73 of 73 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 17.8% (13 of 73 strings) Translated using Weblate (Polish) Currently translated at 100.0% (652 of 652 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (652 of 652 strings) Co-authored-by: Agnieszka C Co-authored-by: Aitor Salaberria Co-authored-by: Ajeje Brazorf Co-authored-by: Alex25820 Co-authored-by: Allan Nordhøy Co-authored-by: Emin Tufan Çetin Co-authored-by: Eric Co-authored-by: Fjuro Co-authored-by: Florian Co-authored-by: GET100PERCENT Co-authored-by: GnuPGを使うべきだ Co-authored-by: Hoseok Seo Co-authored-by: Hosted Weblate Co-authored-by: Igor Nedoboy Co-authored-by: Igor Rückert Co-authored-by: Igor Sorocean Co-authored-by: Ihor Hordiichuk Co-authored-by: Issa1553 Co-authored-by: JS Ahn Co-authored-by: JY3 Co-authored-by: Jeff Huang Co-authored-by: Jonatan Nyberg Co-authored-by: Linerly Co-authored-by: Marian Hanzel Co-authored-by: Massimo Pissarello Co-authored-by: Mateus Co-authored-by: Nidi Co-authored-by: Oğuz Ersen Co-authored-by: Phahim Hasan Co-authored-by: Priit Jõerüüt Co-authored-by: Ray Co-authored-by: Retrial Co-authored-by: Rex_sa Co-authored-by: S3aBreeze Co-authored-by: SC Co-authored-by: ShareASmile Co-authored-by: Sierzh Co-authored-by: TXRdev Archive Co-authored-by: ThePsychoBuck Co-authored-by: Vasilis K Co-authored-by: VfBFan Co-authored-by: Yaron Shahrabani Co-authored-by: bowornsin Co-authored-by: gallegonovato Co-authored-by: komiratsu19273240ad76c354986 <2011945@naver.com> Co-authored-by: petlyh <88139840+petlyh@users.noreply.github.com> Co-authored-by: phneutral26 Co-authored-by: pjammo Co-authored-by: random r Co-authored-by: ssantos Co-authored-by: Štefan Baebler Co-authored-by: Макар Разин Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/be/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/bn/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/es/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/eu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/id/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pa/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_PT/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ru/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/uk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant_HK/ Translation: NewPipe/Metadata --- app/src/main/res/values-ar/strings.xml | 4 +- app/src/main/res/values-az/strings.xml | 4 +- app/src/main/res/values-be/strings.xml | 163 +++++++++++++++--- app/src/main/res/values-cs/strings.xml | 36 ++-- app/src/main/res/values-de/strings.xml | 12 +- app/src/main/res/values-el/strings.xml | 4 +- app/src/main/res/values-es/strings.xml | 4 +- app/src/main/res/values-et/strings.xml | 4 +- app/src/main/res/values-he/strings.xml | 4 +- app/src/main/res/values-hi/strings.xml | 126 +++++++------- app/src/main/res/values-in/strings.xml | 4 +- app/src/main/res/values-ja/strings.xml | 5 +- app/src/main/res/values-ko/strings.xml | 4 +- app/src/main/res/values-nb-rNO/strings.xml | 2 + app/src/main/res/values-pa/strings.xml | 2 + app/src/main/res/values-pl/strings.xml | 4 +- app/src/main/res/values-pt-rBR/strings.xml | 4 +- app/src/main/res/values-pt-rPT/strings.xml | 4 +- app/src/main/res/values-pt/strings.xml | 4 +- app/src/main/res/values-ro/strings.xml | 2 + app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sl/strings.xml | 28 +-- app/src/main/res/values-sv/strings.xml | 2 + app/src/main/res/values-tr/strings.xml | 4 +- app/src/main/res/values-uk/strings.xml | 4 +- app/src/main/res/values-vi/strings.xml | 32 ++-- app/src/main/res/values-zh-rCN/strings.xml | 4 +- app/src/main/res/values-zh-rTW/strings.xml | 4 +- app/src/main/res/values/strings.xml | 2 +- .../metadata/android/be/changelogs/63.txt | 8 + .../metadata/android/be/changelogs/64.txt | 8 + .../metadata/android/be/changelogs/992.txt | 17 ++ .../metadata/android/be/full_description.txt | 1 + .../metadata/android/be/short_description.txt | 2 +- .../metadata/android/hi/changelogs/860.txt | 4 +- .../metadata/android/ru/changelogs/760.txt | 43 +++++ .../metadata/android/ru/changelogs/770.txt | 4 + .../metadata/android/ru/changelogs/800.txt | 27 +++ .../metadata/android/ru/changelogs/810.txt | 19 ++ .../metadata/android/ru/changelogs/840.txt | 22 +++ .../metadata/android/ru/changelogs/860.txt | 7 + .../metadata/android/ru/changelogs/870.txt | 2 + .../metadata/android/ru/changelogs/900.txt | 14 ++ .../metadata/android/ru/changelogs/920.txt | 9 + .../metadata/android/ru/changelogs/930.txt | 19 ++ .../metadata/android/ru/changelogs/940.txt | 16 ++ .../metadata/android/ru/changelogs/951.txt | 17 ++ .../metadata/android/ru/changelogs/954.txt | 9 + .../metadata/android/ru/changelogs/957.txt | 10 ++ .../metadata/android/ru/changelogs/959.txt | 3 + .../metadata/android/ru/changelogs/960.txt | 4 + .../metadata/android/ru/changelogs/961.txt | 12 ++ .../metadata/android/ru/changelogs/964.txt | 8 + .../metadata/android/ru/changelogs/965.txt | 6 + .../metadata/android/ru/changelogs/966.txt | 14 ++ .../metadata/android/ru/changelogs/967.txt | 1 + .../metadata/android/ru/changelogs/968.txt | 7 + .../metadata/android/ru/changelogs/969.txt | 8 + .../metadata/android/ru/changelogs/970.txt | 11 ++ .../metadata/android/ru/changelogs/971.txt | 3 + 60 files changed, 652 insertions(+), 161 deletions(-) create mode 100644 fastlane/metadata/android/be/changelogs/63.txt create mode 100644 fastlane/metadata/android/be/changelogs/64.txt create mode 100644 fastlane/metadata/android/be/changelogs/992.txt create mode 100644 fastlane/metadata/android/be/full_description.txt create mode 100644 fastlane/metadata/android/ru/changelogs/760.txt create mode 100644 fastlane/metadata/android/ru/changelogs/770.txt create mode 100644 fastlane/metadata/android/ru/changelogs/800.txt create mode 100644 fastlane/metadata/android/ru/changelogs/810.txt create mode 100644 fastlane/metadata/android/ru/changelogs/840.txt create mode 100644 fastlane/metadata/android/ru/changelogs/860.txt create mode 100644 fastlane/metadata/android/ru/changelogs/870.txt create mode 100644 fastlane/metadata/android/ru/changelogs/900.txt create mode 100644 fastlane/metadata/android/ru/changelogs/920.txt create mode 100644 fastlane/metadata/android/ru/changelogs/930.txt create mode 100644 fastlane/metadata/android/ru/changelogs/940.txt create mode 100644 fastlane/metadata/android/ru/changelogs/951.txt create mode 100644 fastlane/metadata/android/ru/changelogs/954.txt create mode 100644 fastlane/metadata/android/ru/changelogs/957.txt create mode 100644 fastlane/metadata/android/ru/changelogs/959.txt create mode 100644 fastlane/metadata/android/ru/changelogs/960.txt create mode 100644 fastlane/metadata/android/ru/changelogs/961.txt create mode 100644 fastlane/metadata/android/ru/changelogs/964.txt create mode 100644 fastlane/metadata/android/ru/changelogs/965.txt create mode 100644 fastlane/metadata/android/ru/changelogs/966.txt create mode 100644 fastlane/metadata/android/ru/changelogs/967.txt create mode 100644 fastlane/metadata/android/ru/changelogs/968.txt create mode 100644 fastlane/metadata/android/ru/changelogs/969.txt create mode 100644 fastlane/metadata/android/ru/changelogs/970.txt create mode 100644 fastlane/metadata/android/ru/changelogs/971.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index c7fa792e23a..861726dd321 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -105,7 +105,7 @@ حدث خطأ للمشغل غير قابل للاسترداد استرداد المشغل من الخطأ عذرًا، لم ينبغِ أن يحدث ذلك. - الإبلاغ عن هذا الخطأ عبر البريد الإلكتروني + الإبلاغ عن طريق البريد الإلكتروني عذرًا، حدث خطأ ما. أبلِغ معلومات: @@ -783,4 +783,6 @@ البطاقة تمت إضافة وقت (أوقات) مكررة %d تحتوي قوائم التشغيل رمادية اللون بالفعل على هذا العنصر. + مفيد ، على سبيل المثال ، إذا كنت تستخدم سماعة رأس بأزرار مادية مكسورة + تجاهل أحداث ازرار الوسائط الأجهزة \ No newline at end of file diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index bb00af528f9..a9eca55c9be 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -303,7 +303,7 @@ Saxlanmış tabları oxumaq mümkün olmadı, buna görə standart tabları istifadə et NewPipe xəta ilə qarşılaşdı, bildirmək üçün toxun Bağışla, o baş verməməli idi. - Bu xətanı e-poçt-dan bildir + E-poçt- dan məlumat ver GitHub\'da Məlumat Ver Zəhmət olmasa, xətanızı müzakirə edən məsələnin mövcud olub-olmadığını yoxlayın. Dublikat biletləri yaradarkən, bizdən faktiki səhvi düzəltməyə sərf edəcəyimiz vaxt alırsınız. Məlumat Ver @@ -731,4 +731,6 @@ Buferə kopyalamaq alınmadı Boz rəngdə olan pleylistlərdə artıq bu element var. Dublikat %d dəfə əlavə edildi + Aparat mühiti media düyməsi hadisələrinə məhəl qoyma + Məsələn, fiziki düymələri qırılan qulaqlıq işlədirsinizsə faydalıdır \ No newline at end of file diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 8031cfe9c84..e77a820978f 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1,6 +1,6 @@ - Націсніце \"Пошук\", каб пачаць + Націсніце лупу, каб пачаць. Апублікавана %1$s Патокавы плэер не знойдзены. Усталяваць VLC? Патокавы плэер не знойдзены (вы можаце ўсталяваць VLC). @@ -42,7 +42,7 @@ Толькі некаторыя прылады могуць прайграваць відэа ў 2K/4K Прайграць у Kodi Дадатак Kore не знойдзены. Усталяваць яго? - \"Прайграць у Kodi\" + Паказаць опцыю \"Прайграць у Kodi\" Паказаць опцыю прайгравання відэа праз медыяцэнтр Kodi Аўдыё Фармат аўдыё па змаўчанні @@ -54,14 +54,14 @@ Аднавіць акно Запамінаць памер і становішча ўсплываючага акна Хуткі пошук пазіцыі - Недакладны пошук дазваляе плэеру шукаць пазіцыю хутчэй, але менш дакладна. Не працуе для перамоткі на 5, 15 ці 25 секунд + Недакладны пошук дазваляе плэеру знаходзіць пазіцыі хутчэй са зніжанай дакладнасцю. Пошук цягам 5, 15 ці 25 секунд пры гэтым немажлівы Загружаць мініяцюры Адключыце, каб не загружаць мініяцюры і зэканоміць трафік і памяць. Змена налады ачысьціць кэш малюнкаў Кэш малюнкаў ачышчаны Ачысціць кэш метададзеных Выдаліць усе загружаныя дадзеныя вэб-старонак Кэш метададзеных ачышчаны - Аўтадапаўненне чаргі + Аўта- чарга наступнага патока Дадаваць падобныя патокі ў чаргу пры прайграванні апошняга, калі не ўключаны паўтор Варыянты пошуку Адлюстроўваць падказкі пры пошуку @@ -69,9 +69,9 @@ Захоўваць пошукавыя запыты лакальна Гісторыя праглядаў Запамінаць прагледжаныя відэа - Аднавіць пры фокусе - Аднаўляць прайграванне пасля перапынкаў (напрыклад, тэлефонных званкоў) - Спампаваць + Аднавіць прайграванне + Аднаўляць прайграванне пасля перарыванняў (напр. тэлефонных званкоў) + Загрузіць \"Наступнае\" и \"Прапанаванае\" відэа \"Зацісніце, каб дадаць\" Паказаць падказку пры націсканні \"У акне\" ці \"У фоне\" на старонцы звестак аб відэа @@ -106,7 +106,7 @@ Толькі цяпер Файл Апавяшчэнне NewPipe - Апавяшчэнні для NewPipe ў фоне і ва ўсплываючым акне + Апавяшчэнні для прайгравальніка NewPipe [Невядома] Перайсці ў фон Перайсці ў акно @@ -118,11 +118,11 @@ Ачысціць гісторыю праглядаў Выдаліць гісторыю прайграных патокаў Выдаліць усю гісторыю праглядаў\? - Гісторыя праглядаў выдалена. + Гісторыя праглядаў выдалена Ачысціць гісторыю пошуку Выдаліць гісторыю пошукавых запытаў Выдаліць усю гісторыю пошуку\? - Гісторыя пошуку выдалена. + Гісторыя пошуку выдалена Памылка Памылка сеткі Не атрымалася загрузіць усе мініяцюры @@ -142,22 +142,22 @@ Файл не існуе або няма дазволу на яго чытанне або запіс Імя файла не можа быць пустым Адбылася памылка: %1$s - Няма патокаў, даступных для загрузкі + Няма трансляцый, даступных для загрузкі Прабачце, гэта не павінна было адбыцца. Адправіць справаздачу па e-mail Прабачце, адбыліся памылкі. СПРАВАЗДАЧА Інфармацыя: Што адбылося: - Што:\\nЗапыт:\\nМова кантэнту:\\nСэрвіс:\\nЧас па Грынвічы:\\nПакет:\\nВерсія:\\nВерсія АС: + Што:\\nЗапыт:\\nМова кантэнту:\\nКраіна кантэнту:\\nМова праграмы:\\nСэрвіс:\\nЧас GMT:\\nПакет:\\nВерсія:\\nВерсія АС: Ваш каментар (English): Падрабязнасці: - Мініяцюра відэа-прэв\'ю + Прайграць відэа, працягласць: Мініяцюра аватара карыстальніка Спадабалася Не спадабалася Няма вынікаў - Нічога няма + Нічога няма, акрамя цвыркуноў Перацягніце, каб змяніць парадак Відэа Аўдыё @@ -278,7 +278,7 @@ Выдаліць плэйліст\? Плэйліст створаны Дададзена ў плэйліст - Мініяцюра плэйліста зменена + Мініяцюра плэйліста зменена. Без тытраў Падагнаць Запоўніць @@ -334,13 +334,13 @@ Адпісацца Абярыце ўкладку Жэст гучнасці - Мяняць гучнасць плэера жэстам + Выкарыстоўвай жэсты для кіравання гучнасцю плэера Жэст яркасці - Мяняць яркасць плэера жэстам + Выкарыстоўвай жэсты для кіравання яркасцю плэера Абнаўленні Файл выдалены - Апавяшчэнне аб абнаўленні - Апавяшчэння аб новай версіі NewPipe + Апавяшчэнне аб абнаўленні праграмы + Апавяшчэнні пра новыя версіі NewPipe Знешняе сховішча недаступна Загрузка на знешнюю SD-карту немагчымая. Скінуць размяшчэнне тэчкі загрузкі\? Памылка чытання захаваных укладак. Выкарыстоўваюцца ўкладкі па змаўчанні @@ -348,7 +348,7 @@ Аднавіць значэнні па змаўчанні\? Колькасць падпісчыкаў недаступная Ўкладкі, бачныя на галоўнай старонцы - Абнаўлення + Абнаўленні Паказаць апавяшчэнне пры наяўнасці новай версіі Выгляд спісу Спіс @@ -410,10 +410,10 @@ Пачаць загрузку Прыпыніць загрузку Запытваць тэчку загрузкі - Для кожнай загрузкі запытваць тэчку для захавання + Вам будзе прапанавана ўказаць месца захавання кожнай загрузкі. +\nУключыце сістэмны выбарнік тэчкі (SAF), калі вы хочаце загружаць файлы на знешнюю SD-картку Выкарыстоўваць SAF - Storage Framework Access дазваляе захоўваць файлы на вонкавым назапашвальніку. -\nПадтрымліваецца не ўсімі прыладамі + \'Storage Access Framework\' дазваляе загружаць на знешнюю SD-картку Пераключыць службу, выбраную ў дадзены момант: Выдаліць ўсе пазіцыі прайгравання Абмежаваны рэжым YouTube @@ -421,8 +421,8 @@ Дадаць экзэмпляр Экзэмпляры PeerTube Вынікі для: %s - Мініяцюра відэа ў 1:1 - Мініяцюра відэа ў апавяшчэнні з 16:9 да 1:1 (магчымі скажэнні) + Абрэжце мініяцюру да прапорцый 1:1 + Абрэжце мініяцюру відэа паказванае ў апавяшчэнні з прапорцый 16:9 да 1:1 Кнопка чацвёртага дзеяння Кнопка трэцяга дзеяння Кнопка другога дзеяння @@ -437,7 +437,7 @@ Экзэмпляр ужо існуе Немагчыма праверыць экзэмпляр Увесці URL экзэмпляра - Абярыце любімыя экзэмпляры PeerTube + Выберыце улюбёныя экзэмпляры PeerTube Актыўны плэер быў зменены Змена плэера можа замяніць вашу чаргу Запытаць, перш чым ачысціць чаргу @@ -453,7 +453,7 @@ Лакальнае Нядаўна дададзенае Няма закладак у плейлісце - Абярыце плэйліст + Выберыце плэйліст Кіёск па змаўчанні Так Націсніце \"Так\" калі вырашана @@ -481,4 +481,113 @@ Афарбоўваць апавяшчэнне асноўным колерам мініяцюры. Падтрымваецца не ўсімі прыладамі У кампактным апавяшчэнні дасяжна не больш за тры дзеянні! Дзеянні можна змяніць, націснуўшы на іх. Адзначце не больш за трох для адлюстравання ў кампактным апавяшчэнні + Не ўдалося распазнаць URL-адрас. Адкрыць у іншай праграме\? + Апавяшченне плэера + Апавяшчэнні + Новыя трансляцыі + Апавяшчэнні пра новыя трансляцыі ў падпісках + Апісанне + Падобныя матэрыялы + Ніхто не праглядае + аднаўленне + + %s глядач + %s глядача + %s глядачоў + %s глядачоў + + Падпіскі не выбраны + Апошняе абнаўленне: %s + Паказаць прагледжаныя матэрыялы + Схаваць прагледжаныя матэрыялы + Аўтаматычна (тэма прылады) + Выберыце ўлюбёную начную тэму - %s + Дазвол вылучэння тэксту ў апісанні + Ніжэй вы можаце абраць улюбёную начную тэму + Гэта опцыя даступна толькі тады, калі %s будзе выбранай тэмаю + Загрузка пачалась + Апавяшчэнні адключаныя + Рэжым планшета + Адключыць + Няма аўдыётрансляцый даступных для знешніх плэераў + Апавяшчаць + Няма даступных відэатрансляцый для знешніх плэераў + Выбраная трансляцыя не падтрымліваецца знешнімі плэерамі + Выберыце якасць для знешніх плэераў + Невядомая якасць + Невядомы фармат + Паказаць наступны матэрыял + Схаваць наступныя матэрыялы + Сартаваць + З-за абмежаванняў ExoPlayer працягласць пошуку была ўсталявана на %d сякундаў + Раздзелы + Пазначыць прагледжаным + Адкрыць з дапамогай + Начная тэма + Адкрыць вэб-сайт + Цяпер Вы можаце вылучаць тэкст у апісанні. Звярніце ўвагу, што ў рэжыме вылучэння старонка можа мігацець, а спасылкі могуць быць недаступныя для націскання. + Запусціць галоўны прайгравальнік у поўнаэкранным рэжыме + Паказаць дэталі канала + Нізкая якасць (менш) + Апавяшчэнне пра відэахэшуванне + Памер інтэрвалу загрузкі прайгравання + Паказаць апісанне + Каментары адключаны + + %s слухач + %s слухача + %s слухачоў + %s слухачоў + + + %d сякунда + %d сякунды + %d сякундаў + %d сякундаў + + + %d гадзіна + %d гадзіны + %d гадзін + %d гадзін + + + %d дзень + %d дня + %d дзён + %d дзён + + Ачысціць гісторыю загрузак + Мова зменіцца пасля перазапуску праграмы + Ніхто не слухае + Уключыць + Апавяшчэнні пра ход відэахэшування + Стварыць паведамленне пра памылку + Выберыце падпіскі + Імпарт ці экспарт падпісак з 3-кропкавага меню + Забарона вылучэння тэксту ў апісанні + Хуткі рэжым + Калі ў Вас узніклі праблемы з выкарыстаннем праграмы, абавязкова азнаёмцеся з адказамі на пашыраныя пытанні! + Адключыць тунэляванне медыя + Прагляд мініяцюры над паўзунком часу + Высокая якасць (больш) + Не паказваць + Вы выкарыстоўваеце апошнюю версію NewPipe + Немажліва аднавіць гэту загрузку + + Выдалена %1$s зазагрузка + Выдалена %1$s зазагрузкі + Выдалена %1$s зазагрузак + Выдалена %1$s зазагрузак + + Выдаліць усе загружаныя файлы з дыска\? + + %d хвіліна + %d хвіліны + %d хвілінаў + %d хвілінаў + + Змяніць памер інтэрвалу загрузкі (зараз %s). Меншае значэнне можа паскорыць пачатковую загрузку відэа. Змены патрабуюць перазапуск плэера + Выключыце, каб схаваць апісанне відэа і дадатковую інфармацыю + \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 9696b8d119a..c13e8ddb399 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -67,7 +67,7 @@ Co se stalo: Nahlásit Omlouváme se, tohle se nemělo stát. - Nahlásit tuto chybu přes e-mail + Nahlásit přes e-mail Omlouváme se, něco se pokazilo. Aplikace/UI spadlo Nepodařilo se nastavit menu stahování @@ -115,7 +115,7 @@ Pokračovat v přehrávání po přerušení (např. hovor) Přehrávač Chování - Historie a mezipamět + Historie a mezipaměť Přehrávání v okně Vypnuto Vyčistit @@ -163,7 +163,7 @@ Podílet se Historie Historie - Zobrazit tip „Podržet pro vložení do fronty“ + Zobrazit tip „Podržte pro zařazení do fronty“ Zobrazit tip po klepnutí na pozadí nebo na vyskakovací tlačítko v „Podrobnostech“ videa Přehrát vše Tento stream nelze přehrát @@ -183,7 +183,7 @@ Odebrat Podrobnosti Nastavení zvuku - Podrž pro zařazení do fronty + Podržte pro zařazení do fronty [Neznámý] Začít přehrávat na pozadí Začít přehrávat v pop-upu @@ -219,7 +219,7 @@ Získávám informace… Načítání požadovaného obsahu Stáhnout soubor streamu - Ukázat informace + Zobrazit informace Uložené playlisty Přidat do Táhnout pro přeskupení @@ -252,10 +252,10 @@ 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í. Posouvání po 5, 15 nebo 25 vteřinách s tímto nefunguje Načítat náhledy - Vypnout, aby se zabránilo načítání náhledů a tím se ušetřily data a používání paměti. Změna tohoto nastavení vyčistí mezipamět obrázků v paměti i na disku + Vypnutím zabráníte načítání miniatur, ukládání dat a spotřebě paměti. Změny vymažou mezipaměť obrázků v paměti i na disku Mezipaměť obrázků vymazána Vymazat metadata v mezipaměti - Odebrat všechna data uložená v mezipaměti + Odstranit všechna data webových stránek v mezipaměti Mezipaměť metadat vymazána Další stream automaticky vložit do fronty Pokračovat konečnou (neopakující se) frontu playbacku připojením souvisejícího streamu @@ -312,7 +312,7 @@ Historie vyhledávání smazána Jedna položka smazána. NewPipe je svobodný software s copyleft licencí: Můžete jej libovolně používat, studovat, sdílet a vylepšovat. Konkrétně jej můžete šířit a/nebo upravovat za podmínek Obecné veřejné licence GNU (GNU GPL) vydané nadací Free Software Foundation, a to buď za podmínek Licence verze 3 nebo (dle vaší volby) jakékoli pozdější verze. - kanály + Kanály Playlisty Stopy Uživatelé @@ -524,7 +524,7 @@ 100+ videí Umělci Alba - Písně + Skladby Toto video má věkové omezení. \n \nPokud jej chcete vidět, povolte „%1$s“ v nastavení. @@ -540,7 +540,7 @@ Vytvořil %s Ikona kanálu Strana playlistů - Ukázat jen neseskupené objednávky + Zobrazit jen neseskupené odběry Zatím žádné záložky playlistů Vybrat playlist Prosím, ověřte, zda chyba již existuje. Pokud založíte duplikovaný tiket, obíráte nás o čas, který bychom mohli věnovat řešení skutečných chyb. @@ -552,7 +552,7 @@ Automaticky zahájit přehrávání — %s Přehrát frontu Nelze rozpoznat zadané URL. Otevřít pomocí jiné aplikace\? - Auto-fronta + Automatické přehravání Fronta aktivního přehrávače bude smazána Při přechodu z jednoho přehrávače do druhého může dojít k smazání fronty Žádat potvrzení před vyklizením fronty @@ -569,7 +569,7 @@ První akční tlačítko Oříznout miniaturu videa zobrazenou v oznámení z poměru stran 16:9 na 1:1 Oříznout poměr stran miniatury na 1:1 - Ukázat memory leaks + Zobrazit úniky paměti Zařazeno do fronty Zařadit do fronty Vymazat cookies, které NewPipe uloží, po vyřešení reCAPTCHA @@ -645,7 +645,7 @@ Vypnuto Zapnuto Režim tabletu - Ukázat přehrané položky + Zobrazit zhlédnuté položky Nezobrazovat Nízká kvalita (menší) Vysoká kvalita (větší) @@ -663,8 +663,8 @@ %s stahování dokončena %s stahováních dokončeno - Ukázat zabarvené stužky Picasso na obrázcích k indikaci zdroje: červená indikuje síť, modrá disk a zelená paměť - Ukázat indikátory obrázků + Zobrazit barevné pásky Picasso na obrázcích označujících jejich zdroj: červená pro síť, modrá pro disk a zelená pro paměť + Zobrazit indikátory obrázků Vzdálené návrhy vyhledávání Lokální návrhy vyhledávání Pokud je vypnuté automatické otáčení, nespouštět video v mini přehrávači, ale přepnout se přímo do režimu celé obrazovky. Do mini přehrávače se lze i nadále dostat ukončením režimu celé obrazovky @@ -688,7 +688,7 @@ Pro tuto akci nebyl nalezen žádný vhodný správce souborů. \nNainstalujte správce souborů nebo zkuste vypnout \'%s\' v nastavení stahování Ukáže volbu pro zřícení během používání přehrávače - Ukázat krátké oznámení o chybě + Zobrazit krátké oznámení o chybě Připnutý komentář Shodit přehrávač Změnit interval načítání (aktuálně %s). Menší hodnota může zrychlit počáteční načítání videa. Změna vyžaduje restart přehrávače @@ -699,7 +699,7 @@ Oznámit o nových streamech od vašich odběrů Frekvence kontroly Jakákoli síť - Nutné síťové připojení + Požadované síťové připojení Smazat všechny stažené soubory z disku\? Objednali jste si nyní tento kanál Všechny přepnout @@ -744,4 +744,6 @@ Kopírování do schránky se nezdařilo Zašedlé playlisty již obsahují tuto položku. Duplikát přidán %dkrát + Ignorovat události hardwarových tlačítek médií + Užitečné například v případě, že používáte sluchátka s rozbitými fyzickými tlačítky \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ee1bc989f8d..6d643f1b9e3 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -49,7 +49,7 @@ Inhalt Altersbeschränkte Inhalte anzeigen Konnte Downloadmenü nicht einrichten - Fehler via E-Mail melden + Per E-Mail melden Formatierten Fehlerbericht kopieren Über GitHub melden Melden @@ -75,7 +75,7 @@ Mrd. Dateiname Fehler - Bitte warten … + Bitte warten … In Zwischenablage kopiert Bitte gib später in den Einstellungen einen Downloadordner an Starten @@ -136,7 +136,7 @@ Verlauf Abonnement konnte nicht geändert werden Abonnement konnte nicht aktualisiert werden - Nach Unterbrechungen (z.B. Telefonaten) Wiedergabe fortsetzen + Nach Unterbrechungen (z. B. Telefonaten) Wiedergabe fortsetzen NewPipe-Benachrichtigung Benachrichtigungen für den NewPipe-Player Verhalten @@ -295,7 +295,7 @@ \n2. Gehe zu dieser URL: %1$s \n3. Melde dich an, falls du dazu aufgefordert wirst \n4. Kopiere die Profil-URL, zu der du weitergeleitet wurdest. - yourID, soundcloud.com/yourid + deineID, soundcloud.com/deineid Keine Streams zum Download verfügbar Bevorzugte „Öffnen“-Aktion Standardaktion beim Öffnen von Inhalten — %s @@ -572,7 +572,7 @@ Lösche Cookies, die NewPipe speichert, wenn du ein reCAPTCHA löst reCAPTCHA-Cookies wurden gelöscht reCAPTCHA-Cookies löschen - Inhalte mit Altersbegrenzung (z. B. ab 18) anzeigen, die für Kinder möglicherweise ungeeignet sind + Für Kinder möglicherweise ungeeignete Inhalte anzeigen (bspw. ab 18) In Wiedergabe einreihen Android kann die Farbe der Benachrichtigung entsprechend der Hauptfarbe in der Miniaturansicht anpassen (beachte, dass dies nicht auf allen Geräten verfügbar ist) Benachrichtigung farblich anpassen @@ -731,4 +731,6 @@ Karte Duplikat %d mal hinzugefügt Die ausgegrauten Wiedergabelisten enthalten dieses Element bereits. + Nützlich, wenn z. B. ein Headset mit defekten physischen Tasten verwendet wird + Ereignisse der Hardware-Medientasten ignorieren \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 76ebbc070a4..1ba8811a666 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -165,7 +165,7 @@ Προέκυψε ένα σφάλμα: %1$s Δεν υπάρχουν διαθέσιμες ροές για λήψη Λυπούμαστε, αυτό δεν έπρεπε να έχει συμβεί. - Αναφορά αυτού του σφάλματος μέσω ηλεκτρονικού ταχυδρομείου + Αναφορά μέσω ηλεκτρονικού ταχυδρομείου Συγγνώμη, κάτι πήγε στραβά. Τι:\\nΑίτημα:\\nΓλώσσα περιεχομένου:\\nΧώρα περιεχομένου:\\nΓλώσσα εφαρμογής:\\nΥπηρεσία:\\nΏρα GMT:\\nΠακέτο:\\nΈκδοση:\\nΈκδοση λειτουργικού συστήματος: Κανένα αποτέλεσμα @@ -731,4 +731,6 @@ Κάρτα Οι λίστες αναπαραγωγής που είναι γκριζαρισμένες περιέχουν ήδη αυτό το στοιχείο. Προστέθηκε διπλότυπο %d φορά(ες) + Αγνοήστε τα συμβάντα κουμπιών πολυμέσων υλικού + Χρήσιμο, για παράδειγμα, εάν χρησιμοποιείτε ακουστικά με χαλασμένα φυσικά κουμπιά \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 21dd5f9bbc6..b99af00e136 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -55,7 +55,7 @@ Informe de error No se pudo configurar el menú de descarga Lo siento, esto no debería haber ocurrido. - Informar de este error vía correo electrónico + Informar por correo electrónico Lo siento, algo salió mal. Informar Información: @@ -747,4 +747,6 @@ Tarjeta Duplicado añadido %d vez/veces Las listas de reproducción que están en gris ya contienen este elemento. + Útil, por ejemplo, si está utilizando un auricular con botones físicos rotos + Ignorar eventos para botones multimedia de hardware \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 17d0981de50..7c439800782 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -139,7 +139,7 @@ Ilmnes viga: %1$s Allalaaditavaid videovooge pole Vabandust, seda poleks pidanud juhtuma. - Teata sellest veast e-posti kaudu + Teata e-posti teel Vabandust, midagi läks valesti. Teata Info: @@ -731,4 +731,6 @@ Kaart Hallina kuvatud esitusloendid juba sisaldavad seda kirjet. Topeltkirje lisatud %d kord(a) + Kasulik näiteks kui olukorras kui kõrvaklappide nupud on katki + Eira nutiseadmes asuvate või seotud seadmete meedianuppude vajutusi \ No newline at end of file diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 270b94e674a..c6358ae264e 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -69,7 +69,7 @@ לא הייתה אפשרות להכין את תפריט ההורדה היישומון או מנשק המשתמש קרסו זה לא אמור היה לקרות, עמך הסליחה. - דיווח על השגיאה דרך דוא״ל + דיווח דרך דוא״ל משהו השתבש, עמך הסליחה. דיווח מידע: @@ -757,4 +757,6 @@ ההעתקה ללוח הגזירים נכשלה רשימות הנגינה שבוטלו וסומנו באפור כבר מכילות את הפריט הזה. הכפיל נוסף %d פעמים + התעלמות מאירועי כפתורי מדיה חומרתיים + שימושי, למשל, אם יש לך אוזניות עם כפתורי חומרה מקולקלים \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 056783cd8d6..f2f084f8680 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -1,7 +1,7 @@ %1$s पे प्रकाशित हुआ - स्ट्रीमिंग के लिए चालक नहीं मिला। क्या आप VLC इंस्टॉल करना चाहेंगे\? + स्ट्रीमिंग के लिए चालक नहीं मिला। क्या आप वीएलसी इंस्टॉल करना चाहेंगे\? स्थापित करें ब्राउज़र में खोलें पॉपअप मोड में खोलें @@ -10,7 +10,7 @@ खोजें सेटिंग्स सब्सक्राइब करें - सब्सक्राइब है + सब्सक्राइड है चैनल अनसब्सक्राईब हुआ सब्सक्रिप्शनस बैकग्राउंड @@ -46,7 +46,7 @@ कोई दूसरा ध्वनि चालक उपयोग करें सब्सक्रिप्शन बदली नहीं जा सकी सब्सक्रिप्शन अपडेट नहीं किया जा सका - देखें कि क्या नया है + क्या नया है वीडियो डाउनलोड का फ़ोल्डर डाउनलोड की गई वीडियो फ़ाइलें यहां संग्रहीत हैं वीडियो फ़ाइलों के लिए डाउनलोड फ़ोल्डर चुनें @@ -56,10 +56,10 @@ प्रथम स्थापित गुणवत्ता स्तर पॉपअप का प्रथम स्थापित गुणवत्ता स्तर उच्च गुणवत्ता स्तर दिखाएं - केवल कुछ ही यंत्र 2K/4K मे वीडियो चला सकते हैं - Kodi मे चलाए - Kore ऐप नहीं मिली, इसे स्थापित करें\? - \"Kodi मे चलाएं\" वाला विकल्प दिखाएँ + केवल कुछ ही डिवाईस 2के/4के मे वीडियो चला सकते हैं + कोडी मे चलाए + कोरे ऐप नहीं मिला, इसे स्थापित करें\? + \"कोडी मे चलाएं\" वाला विकल्प दिखाएँ कोडी मीडिया सेंटर से वीडियो चलने के लिए विकल्प प्रदर्शित करें प्रथम स्थापित ध्वनि फॉर्मेट प्रथम स्थापित वीडियो फॉर्मेट @@ -110,8 +110,8 @@ कभी ठीक न होने वाले वीडियो प्लेयर की त्रुटी आ रही है वीडियो प्लेयर त्रुटी से ठीक हो रहा है खेद है की, ऐसा होना नहीं चाहिए था. - त्रुटी की रिपोर्ट को ईमेल से भेजे - माफ़ करे , कुछ त्रुटियाँ हो रही है + रिपोर्ट को ईमेल से भेजे + माफ़ करे, कुछ त्रुटि हो गई। रिपोर्ट करें जानकारी: क्या हुआ: @@ -133,7 +133,7 @@ कोई सब्सक्राइबर नहीं है %s सब्सक्राइबर - %s सब्सक्राइबर + %s सब्सक्राइबर्स %s दर्शक @@ -141,7 +141,7 @@ %s वीडियो - %s वीडियो + %s वीडियोस् शुरू रोकें @@ -184,7 +184,7 @@ जोड़ने के लिए पकड़ें रहे पृष्टभूमि में चलाना शुरू करे पॉपअप में चलाना शुरू करे - स्ट्रीमिंग करने के लिए कोई चालक उपलब्ध नहीं है (आप इसे चलाने के लिए VLC चालक स्थापित कर सकते हैं)। + स्ट्रीमिंग करने के लिए कोई चालक उपलब्ध नहीं है (आप इसे चलाने के लिए वीएलसी चालक स्थापित कर सकते हैं)। स्ट्रीम फाइल डाउनलोड करें जानकारी दिखाएं बुकमार्क की गई प्लेलिस्टें @@ -247,7 +247,7 @@ Out-of-Lifecycle त्रुटियों की रिपोर्ट करें थंमनेल लोड करें तेज और अनिश्चित तलाश का प्रयोग करें - अनिश्चित खोज से प्लेयर में कम सटीकता से लेकिन तेजी से वीडियो पोजीशन्स की तलाश कर सकता हैं। 5,15 या 25 सेकंड की तलाश में यह काम नहीं करता + अनिश्चित खोज से प्लेयर में कम सटीकता से लेकिन तेजी से वीडियो पोजीशन्स की तलाश कर सकता हैं। 5, 15 या 25 सेकंड की तलाश में यह काम नहीं करता थंमनेल लोड करने, डेटा और मेमोरी उपयोग को रोकने के लिए बंद करें। इन-मेमोरी और ऑन-डिस्क छवि कैश दोनों को बदलता है चित्र कैश मिटाया गया कैश मेटाडेटा मिटाएं @@ -295,14 +295,14 @@ सब्सक्रिप्शन निर्यात नही कर सके गूगल टेकआउट से यूट्यूब सदस्यता आयात करें: \n -\n1. इस URL पर जाएं:%1$s +\n1. इस यूआरएल पर जाएं: %1$s \n2. पूछे जाने पर लॉग इन करें -\n3. \"सभी डेटा शामिल करें\" पर क्लिक करें, फिर \"सभी को अचयनित करें\" पर, फिर केवल \"सदस्यताएँ\" चुनें और \"ओके\" पर क्लिक करें +\n3. \"सभी डाटा शामिल करें\" पर क्लिक करें, फिर \"सभी को अचयनित करें\" पर, फिर केवल \"सदस्यताएँ\" चुनें और \" ठीक है\" पर क्लिक करें \n4. \"अगला चरण\" पर क्लिक करें और फिर \"निर्यात बनाएं\" \n5. प्रकट होने के बाद \"डाउनलोड\" बटन पर क्लिक करें \n6. नीचे आयात फ़ाइल पर क्लिक करें और डाउनलोड की गई .zip फ़ाइल चुनें -\n7. [यदि .zip आयात विफल हो जाता है] .csv फ़ाइल निकालें (आमतौर पर \"YouTube और YouTube Music/subscriptions/subscriptions.csv\" के अंतर्गत), नीचे आयात फ़ाइल पर क्लिक करें और निकाली गई csv फ़ाइल चुनें - आपका आई डी, soundcloud.com/(आपका आई डी) +\n7. [यदि .zip आयात विफल हो जाता है] .csv फ़ाइल निकालें (आमतौर पर \"यूट्यूब और यूट्यूब म्युज़िक/सब्सक्रिपशन/subscriptions.csv\" के अंतर्गत), नीचे आयात फ़ाइल पर क्लिक करें और निकाली गई सीएसवी फ़ाइल चुनें + आपका आईडी, soundcloud.com/(आपका आईडी) ध्यान रखे, यह तरीका नेटवर्क साधनो के लिए मंहगा हो सकता है। \n \nक्या आप आगे बढ़ना चाहते है? @@ -312,16 +312,16 @@ अनहुक (बिगाड़ सकता है) खामोशी के समय तेज़ी से आगे बढ़े कदम - रिसेट + रीसेट स्वीकारे अस्वीकार करे असीमित - मोबाइल डेटा उपयोग करते समय रेसॉल्युसेन को सिमित करे + मोबाइल डेटा उपयोग करते समय रिजॉल्युशन को सिमित करे ऐप बदलते समय उसे मिनिमाइज करे मुख्य वीडियो चालक से दूसरी ऐप पर जाने पर — %s कोई नही बैकग्राउंड प्लेयर में बदले - पॉप अप प्लेयर में बदले + पॉपअप प्लेयर में बदले न्यूपाइप एक काॅपीलेफ़्ट फ़्री साॅफ़्टवेर है: इसे आप अपनी इच्छा के अनुसार इस्तेमाल, जाँच, बाँट तथा और बेहतर बना सकते है। खास तौर पर आप इसे फ़्री साॅफ़्टवेर फ़ाउंडेशन के द्वारा जारी जीएनयू जनरल पब्लिक लाइसेंस के तीसरे या उसके बाद आने वाले कोई भी वर्णन के शर्तों के मुताबिक फिर से बाँट या बदल सकते हैं। अनसब्सक्राईब करें टैब चुने @@ -361,11 +361,11 @@ सर्वर डेटा नहीं भेजता है नहीं मिला प्रक्रिया के बाद का कार्य विफल रहा - रुको + रोके अधिकतम पुनर्प्रयास डाउनलोड रद्द करने से पहले प्रयासों की अधिकतम संख्या मीटर्ड नेटवर्क पर रोके - मोबाइल डाटा का इस्तेमाल करते समय उपयोगी है, परन्तु कुछ डौन्लोडस रोके नहीं जा सकते है + मोबाइल डाटा का इस्तेमाल करते समय उपयोगी है, परंतु कुछ डाउन्लोड रोके नहीं जा सकते है घटनायें सम्मेलनों टिप्पणियां दिखाएं @@ -382,10 +382,10 @@ प्लेबैक स्थान मिटा दिए गए फाइल की जगह बदली गयी या फिर फाइल मिटा दी गयी इस नाम की कोई फ़ाइल पहले से मौजूद है - इस नाम की एक डाउनलोड की गई फ़ाइल पहले से मौजूद है - फाइल के ऊपर नहीं लिख सकते + इस नाम की डाउनलोड फ़ाइल पहले से मौजूद है + फाइल को ओवरराइट नहीं कर सकते इस नाम का एक डाउनलोड बाकी है - फ़ाइल पर कार्य करते समय NewPipe बंद किया गया + फ़ाइल पर कार्य करते समय न्यूपाइप बंद किया गया डिवाइस पर जगह समाप्त प्रगति खो गई, क्योंकि फ़ाइल मिटा दी गई थी कनेक्शन का समय समाप्त @@ -396,28 +396,28 @@ डाउनलोड रोकें डाउनलोड कहाँ करने के लिए पूछे आपको हर डाउनलोड का स्थान पूछा जाएगा -\nयदि आप बाहरी एसडी कार्ड में डाउनलोड करना चाहते हैं तो सिस्टम फोल्डर पिकर (SAF) को सक्षम करें +\nयदि आप बाहरी एसडी कार्ड में डाउनलोड करना चाहते हैं तो सिस्टम फोल्डर पिकर (एसएएफ) को सक्षम करें सिस्टम फोल्डर पिकर (एसएएफ) का प्रयोग करें प्लेबैक स्थानों को मिटाये सारे प्लेबैक स्थानों को मिटाये सारे प्लेबैक स्थानों को मिटाये\? फ्रेगमेंट या एक्टिविटी लाइफसाइकिल के बाद Rx सन्देश ना पहुँचाया जा सके तोह ज़रूर कोशिश करे - SoundCloud प्रोफाइल निर्यात करने के लिए आईडी या युआरएल दीजिये: + साउंडक्लाउड प्रोफाइल निर्यात करने के लिए आईडी या युआरएल दीजिये: \n -\n1. अपने वेब ब्राउज़र मैं \"डेस्कटॉप मोड\" चालू करे (वेबसाइट मोबाइल उपकरणों के लिए उपलब्ध नहीं है) +\n1. अपने वेब ब्राउज़र में \"डेस्कटॉप मोड\" चालू करे (वेबसाइट मोबाइल उपकरणों के लिए उपलब्ध नहीं है) \n2. इस युआरएल को खोले: %1$s -\n3. लोग इन करे +\n3. लॉग इन करे \n4. आप जिस प्रोफाइल युआरएल पे भेजे जाते है उसे कॉपी करे। - यूरोप के जनरल डाटा प्रोटेक्शन रेगुलेशन (जी डी पी आर) का पालन करने के लिए, हम आपका ध्यान न्यूपाइप की नयी प्राइवेसी पालिसी पी डालना चाहते है।इसे बारीकी से पढ़िए। -\nआपको अगर हमें किसी मुसीबत का सन्देश भेजना हो तो इसे स्वीकार करे। + यूरोप के जेनेरल डाटा प्रोटेक्शन रेगुलेशन (जीडीपीआर) का पालन करने के लिए, हम आपका ध्यान न्यूपाइप की नयी प्राइवेसी पालिसी पे डालना चाहते है। इसे बारीकी से पढ़िए। +\nआपको अगर हमें कोई त्रुटि रिपोर्ट भेजना हो तो इसे स्वीकार करे। सामान्य टैब्स का इस्तेमाल, सहेजे टैब्स को पढ़ने में रूकावट - जब इस ऐप के लिए अपडेट उपलब्ध हो, अधिसूचना दिखाई जाये + जब इस ऐप के लिए अपडेट उपलब्ध हो, तब अधिसूचना दिखाई जाये सूचि देखने वाला ढंग ग्रिड ऑटो - मुसीबत दिखाए + त्रुटि दिखाए सर्वर मल्टी थ्रेडेड डाउनलोड स्वीकार नहीं करता, पुनः कोशिश करे @string/msg_threads = 1 के साथ - स्टोरेज एक्सेस फ्रेमवर्क (एस ऐ ऍफ़) आपको एस डी कार्ड पर डाउनलोड करने देता है + \'स्टोरेज एक्सेस फ्रेमवर्क\' आपको बाहरी एसडी कार्ड पर डाउनलोड करने देता है सेवा चुने, वर्तमान चुनाव : सामान्य कीओस्क कोई नहीं देख रहा है @@ -428,23 +428,23 @@ कोई नहीं सुन रहा है %s श्रोता - %s श्रोता + %s श्रोताए ऐप के पुनः आरंभ होने के बाद भाषा बदल जाएगी तेज मोड सक्षम करें तेज मोड अक्षम करें क्या आपको लगता है कि फीड लोडिंग बहुत धीमी है\? यदि ऐसा है, तो तेज़ लोडिंग को सक्षम करने का प्रयास करें (आप इसे सेटिंग्स में या नीचे दिए गए बटन को दबाकर बदल सकते हैं)। \n -\nNewPipe दो फीड लोडिंग रणनीति प्रदान करता है: +\nन्यूपाइप दो फीड लोडिंग रणनीति प्रदान करता है: \n• संपूर्ण सदस्यता चैनल प्राप्त करना, जो धीमा है लेकिन पूरा होता है। \n• एक समर्पित सेवा के समापन बिंदु का उपयोग करना, जो तेज़ है लेकिन आमतौर पर पूरा नहीं होता है। \n \nदोनों के बीच अंतर यह है कि तेज वाली रणनीति में आमतौर पर कुछ जानकारी का अभाव होता है, जैसे कि आइटम की अवधि या प्रकार (लाइव वीडियो और सामान्य वीडियो के बीच अंतर पता नहीं लगा सकते हैं) और ऐसा भी हो सकता है कि ये कम आइटम दिखाए। \n -\nYouTube उस सेवा का एक उदाहरण है जो RSS फ़ीड के साथ तेज़ विधि प्रदान करता है। +\nयूट्यूब ऐसी सेवा का एक उदाहरण है जो आरएसएस फ़ीड के साथ ये तेज़ विधि प्रदान करता है। \n \nतो आखिर में चुनाव आपकी पसंद पर है: गति या फिर सटीक जानकारी। - यह सामग्री फिलहाल NewPipe सपोर्ट नहीं करता है। + यह सामग्री फिलहाल न्यूपाइप सपोर्ट नहीं करता है। \n \nइसे आशा से भविष्य के संस्करणों में सपोर्ट किया जायेगा। चैनल का अवतार थंमनेल @@ -471,27 +471,27 @@ अपने आप कतार में जोड़े कतार को मिटाने से पहले सत्यापन के लिए पूछें तलाश अवधि फास्ट-फ़ॉरवर्ड /- रिवाइंड करे - एंड्रॉइड को थंमनेल में मुख्य रंग के अनुसार अधिसूचना रंग को अनुकूलित करें (ध्यान दें कि यह सभी उपकरणों पर उपलब्ध नहीं है) - सूचनापत्र को रंगीन करें + एंड्रॉइड को थम्बनेल में मुख्य रंग के अनुसार अधिसूचना रंग को अनुकूलित करने की अनुमति दे (ध्यान दें कि यह सभी उपकरणों पर उपलब्ध नहीं है) + अभिसूचना को रंगीन करें कुछ नहीं बफरिंग - Shuffle करे + शफल करे दोहराएं - आप संछिप्त सूचनापत्र में दिखाए जाने वाले विकल्प में से अधिकतम 3 को चुन सकते है ! + आप संछिप्त अभिसूचना में दिखाए जाने वाले विकल्प में से अधिकतम 3 को चुन सकते है ! नीचे दी गई प्रत्येक अधिसूचना क्रिया को उस पर टैप करके संपादित करें। दाईं ओर चेकबॉक्स का उपयोग करके उनमें से अधिकतम तीन का चयन करें जिन्हें कॉम्पैक्ट अधिसूचना में दिखाया जाना है पांचवा एक्शन बटन चतुर्थी एक्शन बटन तृतीय एक्शन बटन द्वितीय एक्शन बटन प्रथम एक्शन बटन - नोटिफिकेशन में दिखाए गए वीडियो थंमनेल को 16: 9 के बजाय 1: 1 के अनुपात में दिखाए - थंमनेल को 1:1 के अनुपात में दिखाएं + नोटिफिकेशन में दिखाए गए वीडियो थम्बनेल को 16:9 के बजाय 1:1 के अनुपात में दिखाए + थम्बनेल को 1:1 के अनुपात में दिखाएं %d घंटा %d घंटे - %d सेकेड + %d सेकेंड %d सेकंड्स देखे गए वीडियो हटायें\? @@ -600,7 +600,7 @@ फ़ीड अपडेट चरणसीमा फ़ीड लोड करने में गड़बड़ी \'%s\' के लिए फ़ीड लोड नहीं कर सका। - रीसैंट + हाल ही के विवरण में पाठ का चयन सक्षम करें गोपनीयता अब आप विवरण के अंदर पाठ का चयन कर सकते हैं। ध्यान दें कि पृष्ठ झिलमिला सकता है और चयन मोड में लिंक क्लिक करने योग्य नहीं हो सकते हैं। @@ -609,13 +609,13 @@ होसट अधिसूचनाएं अक्षम हैं गैर-सूचीबद्ध - संयुक्त टॉगल करें - सूचना पायें + सबको टॉगल करें + अधिसूचना पायें , नए संस्करणों के लिए मैन्युअल रूप से जांचें - एकसोप्लेयर की कमी के कारण खोज की अवधि %d सेकंड पर सेट की गई + एग्ज़ोप्लेयर के कमी के कारण खोज की अवधि %d सेकंड पर सेट की गई खाता समाप्त किया गया - स्ट्रीम जो अभी तक डाउनलोडर द्वारा समर्थित नहीं हैं, नहीं दिखाई जाती हैं + जो स्ट्रीम अभी तक डाउनलोडर द्वारा समर्थित नहीं हैं, वो नहीं दिखाई जाती बाहरी प्लेयरस के लिए क्वालिटी का चयन करें अज्ञात प्रारूप अज्ञात क्वालिटी @@ -641,36 +641,36 @@ %d दिन - %d दिन + %d दिनो %d चयनित - %d चयनित + %d चयनित हुए - एक्सोप्लेयर डिफ़ॉल्ट + एग्ज़ोप्लेयर डिफ़ॉल्ट प्लेबैक लोड अंतराल आकार समूह का नाम नहीं सब्सक्रिप्शनस चुनें क्या आप इस समूह को हटाना चाहते हैं\? नया फ़ीड - भविष्य की आइटम दिखाएं + भविष्य आइटम दिखाएं नई फ़ीड आइटम फ़ीड संसाधित हो रही है … वेबसाइट खोलें उपलब्ध होने पर समर्पित फ़ीड से प्राप्त करें भाषा - आन + ऑन स्वतः बने (कोई अपलोडर नहीं मिला) चैनल समूह देखे गए आइटम छुपाएं - भविष्य की आइटम छुपाएं - बार बार पूछे जाने वाले प्रश्न + भविष्य आइटम छुपाएं + कई बार पूछे प्रश्न वेबसाइट पर देखें आइटम हटाने के लिए स्वाइप करें मीडिया टनलिंग अक्षम करें \"क्रैश द प्लेयर\" दिखाएं - लोड नहीं हुआ: %d + लोड नहीं हुआ: %d %s इसका कारण प्रदान करता है: टैग लाइसेंस @@ -692,9 +692,9 @@ \nक्या यक़ीनन आप ऐसा चाह्ते हैं\? इसे असंपादित नहीं किया जा सकेगा! %d मिनट - %d मिनट + %d मिनट्स - अंतिम अपडेट फ़ीड: %s + फीड अंतिम अपडेट: %s कोई सदस्यता चयनित नहीं है केवल असमूहीकृत सब्सक्रिप्शनस दिखाएं फ़ास्ट फ़ीड मोड इस पर अधिक जानकारी प्रदान नहीं करता है। @@ -710,7 +710,7 @@ पिन की हुई टिप्पणी निर्माता द्वारा दिया दिल टैबलेट मोड - आपने इस चैनल को अब सब्सक्राइब किया है + आपने इस चैनल को अभी सब्सक्राइब किया है बाहरी प्लेयरस के लिए कोई वीडियो स्ट्रीम उपलब्ध नहीं है बाहरी प्लेयरस के लिए कोई ऑडियो स्ट्रीम उपलब्ध नहीं है कुछ सेवाओं में उपलब्ध, यह आमतौर पर बहुत तेज होता है लेकिन सीमित मात्रा में आइटम और अक्सर अधूरी जानकारी (जैसे कोई अवधि नहीं, आइटम प्रकार, कोई लाइव स्थिति नहीं) लौटा सकता है @@ -718,7 +718,7 @@ \nकृपया फ़ाइल प्रबंधक स्थापित करें या डाउनलोड सेटिंग में \'%s\' को अक्षम करने का प्रयास करें %1$s डाउनलोड हटाए गए - %1$s डाउनलोड हटाए गए + %1$s डाउनलोड्स हटाए गए क्रमबद्ध करें तेज मोड @@ -729,4 +729,6 @@ स्थायी थंमनेल अनसेट करें कार्ड क्लिपबोर्ड पर कॉपी करने में विफल + धुंधली की गई प्‍लेलिस्‍ट में पहले से ही यह आइटम है। + डुप्लीकेट जोड़ा गया %d बार \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index f1e426bc7d5..ca225f2f1ff 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -48,7 +48,7 @@ Konten tidak tersedia Tidak bisa menyiapkan menu unduh Maaf, hal tersebut seharusnya tidak terjadi. - Laporkan kesalahan via surel + Laporkan via surel Maaf, telah terjadi kesalahan. Lapor Info: @@ -718,4 +718,6 @@ Kartu Daftar putar yang bewarna abu-abu sudah berisi item ini. Duplikat ditambahkan %d kali + Berguna, misalnya, jika Anda menggunakan sebuah headset dengan tombol fisik yang rusak + Abaikan peristiwa tombol media perangkat keras \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index fefd8ef2330..6a83d9fad6e 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -50,7 +50,7 @@ コンテンツ 年齢制限のあるコンテンツを表示 申し訳ありません。想定外のエラーが発生しました。 - 不具合をメールで報告 + メールで送る 申し訳ありません、不具合が発生しました。 報告 情報: @@ -712,9 +712,10 @@ アプリの使い方に困ったときは、よくある質問に答えていますので、ぜひご覧ください! %sがテーマに選択された場合のみ、この選択肢が利用可能です 高速モード - 3 点メニューから登録チャンネルをインポートまたはエクスポートします + 3点メニューから登録チャンネルの読み込みまたは書き出しが可能 カード クリップボードへのコピーに失敗しました 灰色で表示されているプレイリストには、すでにこのアイテムが含まれています。 %d 回重複追加されました + 固定サムネイルの設定を解除 \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 3e6dc142192..8e4d024aa9f 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -655,7 +655,7 @@ 빠른 모드 활성화 %s에 의해 제작 채널의 아바타 썸네일 - + 챕터 최근 계정이 해지됨 %s은(는) 다음과 같은 이유를 제공: @@ -710,7 +710,7 @@ 정렬 빠른 모드 점 3개 메뉴에서 구독 가져오기 또는 내보내기 - 최신 버전의 NewPipe를 실행 중입니다. + 최신 버전의 NewPipe를 실행 중입니다 %s를 다운로드하려면 탭하세요. 영구 썸네일 설정 해제 이 옵션은 테마로 %s를 선택한 경우에만 사용할 수 있음 diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index a79c9ddae1c..ee2ba11a010 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -729,4 +729,6 @@ Kort Importer eller eksporter fra trepunktsmenyen Hurtigmodus + Spillelistene som er utgrået inneholder allerede dette elementet. + Duplikat lagt til %d gang(er) \ No newline at end of file diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 5c43baee7d8..438fe48084d 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -729,4 +729,6 @@ ਸਥਾਈ ਥੰਮਨੇਲ ਨੂੰ ਅਨਸੈੱਟ ਕਰੋ ਕਲਿੱਪਬੋਰਡ \'ਤੇ ਕਾਪੀ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਕਾਰਡ + ਪਲੇਲਿਸਟਾਂ ਜੋ ਧੁੰਦਲੀਆਂ ਹੋ ਗਈਆਂ ਹਨ ਉਹਨਾਂ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਇਹ ਆਈਟਮ ਹੈ। + ਡੁਪਲੀਕੇਟ ਜੋੜਿਆ ਗਿਆ %d ਵਾਰ \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index bfdb9cb0143..6ca815fb760 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -51,7 +51,7 @@ Treść niedostępna Nie udało się utworzyć menu pobierania Przepraszamy, to nie powinno mieć miejsca. - Zgłoś błąd przez e-mail + Zgłoś przez e-mail Niestety, coś poszło nie tak Zgłoś Informacje: @@ -752,4 +752,6 @@ Karta Wyszarzone playlisty zawierają już tę pozycję Dodano duplikat %d raz(y) + Przydatne, na przykład, jeśli używasz zestawu słuchawkowego z zepsutymi fizycznymi przyciskami + Ignoruj zdarzenia sprzętowego przycisku multimedialnego \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index f97420ff501..388673db630 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -21,7 +21,7 @@ Baixar Baixar Detalhes: - Relatar erro via email + Relatar por e-mail Relatório de erro Relatório Desculpe, algo deu errado. @@ -744,4 +744,6 @@ Falha ao copiar para a área de transferência Duplicata adicionada %d vez(es) As playlists em cinza já contêm este item. + Ignorar eventos de botão de mídia de hardware + Útil, por exemplo, se você estiver usando um fone de ouvido com botões físicos quebrados \ No newline at end of file diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index d83c456623a..749784f2a56 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -235,7 +235,7 @@ %s ouvintes Remover todo o histórico de pesquisas\? - Reportar erro por e-mail + Reportar por e-mail Escolher separador Utilizar gestos para controlar o volume do reprodutor Grelha @@ -731,4 +731,6 @@ Cartão As listas de reprodução acinzentadas já contêm este item. Duplicar adicionado %d vez(es) + Ignorar eventos com botões de hardware + Útil, por exemplo, se estiver a utilizar um auscultador com botões físicos defeitos \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 9cceefc2bfb..7830ad0b408 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -50,7 +50,7 @@ Mostrar conteúdo com restrição de idade Não foi possível configurar o menu de descargas Bolas, isto não deveria ter acontecido. - Reportar erro por e-mail + Reportar por e-mail Desculpe mas algo correu mal. Relatório Informação: @@ -744,4 +744,6 @@ Cartão As listas de reprodução acinzentadas já contêm este item. Duplicar adicionado %d vez(es) + Ignorar eventos com botões de hardware + Útil, por exemplo, se estiver a utilizar um auscultador com botões físicos defeitos \ No newline at end of file diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 0091e43606c..08f8f6a1f9f 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -742,4 +742,6 @@ Cartelă Nu s-a reușit copierea în clipboard Dezactivare miniatură permanentă + Listele de redare care colorate în gri conțin deja acest element. + Duplicat adăugat de %d ori \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f593fdc6130..c9e27f46d5b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -68,7 +68,7 @@ Не удалось создать меню загрузки Приложение/UI завершило работу Никогда такого не было, и вот опять. - Отправить по e-mail + Отправить по электронной почте Извините, что-то пошло не так. Отчёт Информация: diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 188e6f59b80..d46bd667aa9 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -44,9 +44,9 @@ Napaka Vseh sličic videov ni mogoče naložiti Ni mogoče odšifrirati podpisa naslova URL videa - Ni mogoče razčleniti spletišča. + Ni mogoče razčleniti spletišča Vsebina ni na voljo - Ni mogoče nastaviti menija za prejem datotek. + Ni mogoče nastaviti menija za prejem datotek Vsebina Pokaži starostno omejeno vsebino Do te napake naj ne bi prišlo. @@ -72,16 +72,16 @@ Prejemanje Podrobnosti Počakajte … - Kopirano v odložišče. + Kopirano v odložišče Izberite mapo za prejem V redu Prejemi Prejemi Poročilo o napaki - Program se je sesul! + Program se je sesul Izziv reCAPTCHA Zahtevan izziv reCAPTCHA - Predmet:\\nZahteva:\\nJezik vsebine:\\nStoritev:\\nČas v GMT:\\nPaket:\\nRazličica:\\nRazličica OS: + Predmet:\\nZahteva:\\nJezik vsebine:\\nDržava vsebine:\\nJezik aplikacije:\\nStoritev:\\nČas v GMT:\\nPaket:\\nRazličica:\\nRazličica OS: Črna Vse k @@ -144,7 +144,7 @@ Zgodovina in predpomnilnik Razveljavi Ni rezultatov iskanja - Tu ni ničesar! + Tu ni ničesar, razen čričkov Ni naročnikov %s naročnik @@ -255,7 +255,7 @@ Najbolj všečkan Dodano nedolgo nazaj Lokalno - Jezik se bo spremenil po ponovnem zagonu aplikacije. + Jezik bo spremenjen ob ponovnem zagonu aplikacije Ni mogoče naložiti komentarjev Ni veljavne ZIP datoteke Uvoženo @@ -274,7 +274,7 @@ Ni take mape Datoteka premaknjena ali izbrisana Prenašanje na zunanjo SD kartico ni mogoče. Resetiram lokacijo mape z prenosi\? - Vsa zgodovina gledanja izbrisana. + Zgodovina gledanja izbrisana Izbrišem vso zgodovino gledanja\? Izbriši zgodovino gledanja Izvozi zgodovino, naročnine, sezname predvajanj in nastavitve @@ -293,12 +293,12 @@ Izbriši shranjene metapodatke Predshramba za slike je bila izbrisana Prikaži komentarje - Izberi Zavihek + Izberi zavihek Odjava Predvajalnika pretoka ni mogoče najti (namestite lahko VLC program za predvajanje). Predvajalnik v ozadju Želite uvoziti tudi nastavite\? - Zgodovina brskanja izbrisana. + Zgodovina iskanja izbrisana Izbrišem vso zgodovino brskanja\? Izbriši zgodovino brskanja Izbriši piškotke, ki jih NewPipe shrani, ko rešite reCAPTCHA @@ -309,7 +309,7 @@ Predpomnjeni metapodatki so bili odstranjeni Prikaži meta informacije Onemogoči da se ustavi prikazovanje komentarjev - Izklopite, če želite preprečiti nalaganje sličic, s tem bo varčeval na podatkih in uporabi spomina. Spremembe bodo izbrisale predpomnilnik v spominu in na disku. + Izklopite, če želite preprečiti nalaganje sličic, s tem bo varčeval na podatkih in uporabi spomina. Spremembe bodo izbrisale predpomnilnik v spominu in na disku Dejavna vrsta bo zamenjana Preklop na drugi predvajanik lahko zamenja vašo čakalno vrsto Vprašaj za potrditev pred čiščenjem vrste @@ -328,7 +328,7 @@ Gumb za prvo dejanje Povečaj sličico videa, ki je prikazana v obvestilu iz razmerja 16:9 v razmerje 1:1 Zruši aplikacijo - Spremeni velikost besedila podnapisov in stil ozadja v predvajalniku. Zahteva ponovni zagon aplikacije, da učinkuje. + Spremeni velikost besedila podnapisov in slog ozadja v predvajalniku. Zahteva ponovni zagon aplikacije, da učinkuje Podnapisi Samodejno ustvarjeno Prilagodi zaslonu @@ -400,7 +400,7 @@ Prišlo je do neobnovljive napake v predvajalniku Zunanja shramba ni na voljo Izbriše zgodovino ključnih besed za iskanje - Položaji predvajalnika so bili izbrisani. + Položaji predvajalnika so bili izbrisani Ali želite izbrisati vse položaje predvajalnika\? Izbriše vse položaje predvajalnika Izbriši položaje predvajalnika @@ -454,7 +454,7 @@ Brez omejitev Zavrni Korak - yourID, soundcloud.com/yourid + tvojID, soundcloud.com/tvojid Stran kiosk Kateri zavihki so prikazani na domači strani Rešiti diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 71dadfc6c35..dbff70e8f0d 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -729,4 +729,6 @@ Inaktivera permanent miniatyrbild Det gick inte att kopiera till urklipp Kort + Dubblett tillagd %d gång(er) + Spellistor som är gråmarkerade innehåller redan det här objektet. \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 301b3db895d..9449e05a50e 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -51,7 +51,7 @@ İçerik kullanılamıyor Uygulama/kullanıcı arayüzü çöktü Üzgünüz, bu olmamalıydı. - Bu hatayı e-posta aracılığıyla bildir + E-posta ile bildir Üzgünüz, bir şeyler yanlış gitti. Bildir Bilgi: @@ -731,4 +731,6 @@ Panoya kopyalanamadı %d kez kopyası eklendi Gri oynatma listeleri halihazırda bu ögeyi içeriyor. + Donanımsal ortam düğmesi olaylarını yoksay + Örneğin, fiziksel düğmeleri bozuk bir kulaklık kullanıyorsanız kullanışlıdır \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 270ee0d8ee7..4c977dd4e92 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -47,7 +47,7 @@ Вміст недоступний Не вдалося налаштувати меню завантаження Перепрошуємо, цього не мало статися. - Надіслати звіт про помилки е-поштою + Надіслати звіт е-поштою Вибачте, щось пішло не так. Звіт Інформація: @@ -748,4 +748,6 @@ Не вдалося скопіювати до буфера обміну Дублікат додано %d раз(ів) У виділених сірим кольором добірках цей елемент уже є. + Ігнорувати події апаратних медіакнопок + Корисно, наприклад, якщо ви використовуєте гарнітуру зі зламаними фізичними кнопками \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 54cef6aa192..bb6b38d3ec0 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -45,7 +45,7 @@ Chọn các đề xuất để hiển thị khi tìm kiếm Tải về Hiện video \"Tiếp theo\" và \"Tương tự\" - URL không được hỗ trợ + URL không hỗ trợ Hiển thị Phát ở dưới nền Phát ở chế độ popup @@ -69,7 +69,7 @@ Ứng dụng / Giao diện người dùng bị lỗi Hmm, app đã xảy ra lỗi, lướt xuống để xem lỗi. Báo lỗi qua email - Xin lỗi, đã xảy ra sự cố. + Có gì đó không đúng lắm. Kiểm tra xem. Báo cáo Thông tin: Chuyện gì đã xảy ra: @@ -97,8 +97,8 @@ NewPipe đang tải xuống Chạm để biết chi tiết Đợi chút xíu nha… - Đã sao chép vào clipboard - Hãy chọn một thư mục để tải xuống trong phần cài đặt + Đã sao chép vào khay nhớ tạm + Hãy chọn một thư mục tải xuống trong phần cài đặt Chế độ popup cần quyền này \n để hoạt động, hãy bật trong phần cài đặt reCAPTCHA @@ -129,7 +129,7 @@ Hiện thông tin Đăng ký Danh sách phát được đánh dấu - Có gì mới + Video mới Thêm vào Sử dụng tìm kiếm nhanh không chính xác Tua không chính xác cho phép trình phát tua đến các vị trí nhanh hơn với độ chính xác bị giảm. Tua 5, 15 hay 25 giây không dùng được với chế độ này @@ -271,7 +271,7 @@ Xóa playlist này\? Đã tạo playlist Đã thêm vào playlist - Đã thay đổi hình thu nhỏ của playlist. + Đã thay đổi danh sách của playlist. Không có phụ đề Phù hợp Lấp đầy @@ -385,7 +385,7 @@ Hiện bình luận Tắt để ẩn bình luận Tự động phát - Không có bình luận + Không có bình luận nào Không thể tải bình luận Đóng Tiếp tục phát @@ -400,7 +400,7 @@ Có một bản tải xuống đang chờ xử lí với tên này Newpipe đã bị đóng khi đang xử lí tệp Không đủ dung lượng trên máy - Quá trình mất, vì tập tin đã bị xoá + Quá trình tải bị hủy, vì tập tin đã bị xoá Kết nối hết thời gian Bạn muốn xóa lịch sử tải về hay xóa tất cả những file đã tải về\? Giới hạn hàng chờ tải xuống @@ -450,7 +450,7 @@ Thêm vào gần đây Ngôn ngữ sẽ thay đổi khi ứng dụng khởi động lại Bấm \"Xong\" khi hoàn thành - Xong + Đã hoàn thành ∞ video 100+ video @@ -575,7 +575,7 @@ Tắt để ẩn mô tả video và các thông tin bổ sung Hiện mô tả Mở bằng - Tệp tin đã bắt đầu được tải xuống + Tệp đang được tải xuống Bạn có thể chọn giao diện ban đêm cho mình phía bên dưới Chọn giao diện ban đêm của bạn — %s Tự động (giao diện hệ thống) @@ -685,7 +685,7 @@ Thời gian kiểm tra Yêu cầu kết nối mạng Bất kỳ loại mạng nào (có thể tính phí) - Xóa tất cả tệp đã tải xuống khỏi ổ đĩa\? + Xóa tất cả các tệp đã tải xuống khỏi bộ nhớ\? Thông báo bị tắt Được thông báo Bạn hiện đã đăng ký kênh này @@ -706,6 +706,14 @@ Thể loại Câu hỏi thường gặp Xem trên website - Nếu bạn gặp rắc rối khi sử dụng ứng dụng , hãy chắc chắn rằng bạn đã tìm kiếm các câu hỏi thường thấy ! + Nếu bạn gặp vấn đề khi sử dụng ứng dụng , hãy chắc chắn rằng bạn đã tìm kiếm các câu hỏi thường thấy ! Ẩn các video đã xem + Nhập hoặc xuất các kênh bạn đăng ký bằng cách nhấn nút 3 chấm ở góc trên màn hình + Không thể sao chép vào khay nhớ tạm + Đã thêm khoảng thời gian %d trùng lặp (s) + Dạng thẻ + Bạn đang dùng phiên bản mới nhất + Tùy chọn này chỉ được bật khi chủ đề %s được dùng + Nhấn để tải %s + Chế độ tia sét \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index b5499483e52..8393fe0cea6 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -145,7 +145,7 @@ 无法设置下载菜单 App/UI 崩溃 抱歉, 这本不该发生。 - 使用电子邮件反馈错误 + 使用电子邮件反馈 抱歉,发生了一些错误。 反馈 信息: @@ -718,4 +718,6 @@ 无法复制到剪贴板 变灰的播放列表已经包含此项目。 重复添加了 %d 次 + 如果你在使用一副物理按钮坏掉的耳机,该选项应该会有帮助 + 忽略硬件媒体按钮事件 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a311d704abb..2cc840ac865 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -72,7 +72,7 @@ 無法設定下載選單 應用程式或界面已停止運作 抱歉,這是不該發生的。 - 使用電子郵件回報此錯誤 + 透過電子郵件回報 抱歉,發生了一些問題。 回報 資訊: @@ -718,4 +718,6 @@ 無法複製到剪貼簿 重複新增 %d 次 變灰的播放清單已經包含此項目。 + 忽略硬體媒體鍵事件 + 這很有用,舉例來說,若您正在使用物理按鍵壞掉的耳機 \ 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 ba217650f40..e1c75bba412 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -247,7 +247,7 @@ NewPipe encountered an error, tap to report An error occurred, see the notification Sorry, that should not have happened. - Report this error via e-mail + Report via e-mail Copy formatted report Report on GitHub Please check whether an issue discussing your crash already exists. When creating duplicate tickets, you take time from us which we could spend with fixing the actual bug. diff --git a/fastlane/metadata/android/be/changelogs/63.txt b/fastlane/metadata/android/be/changelogs/63.txt new file mode 100644 index 00000000000..8583daa68a0 --- /dev/null +++ b/fastlane/metadata/android/be/changelogs/63.txt @@ -0,0 +1,8 @@ +### Паляпшэнні +- Імпарт/экспарт налад #1333 +- Зменшана перамалёўка (аптымізацыя прадуктыўнасці) #1371 +- Невялікія паляпшэнні кода #1375 +- Дададзена ўсё пра GDPR #1420 + +### Выпраўлена +- Загрузчык: Выпраўленне збою пры загрузцы незавершаных загрузак з .giga файлаў #1407 diff --git a/fastlane/metadata/android/be/changelogs/64.txt b/fastlane/metadata/android/be/changelogs/64.txt new file mode 100644 index 00000000000..ad5606b6fae --- /dev/null +++ b/fastlane/metadata/android/be/changelogs/64.txt @@ -0,0 +1,8 @@ +### Паляпшэнні +- Дададзена магчымасць абмежаваць якасць відэа пры выкарыстанні мабільных дадзеных. #1339 +- Запамінанне яркасці для сесіі #1442 +- Паляпшенне прадуктыўнасці загрузкі для слабых працэсараў #1431 +- Дададзена (працоўная) падтрымка медыя-сесіі #1433 + +### Выпраўленне +- Выпраўленне збою пры адкрыцці загрузак (выпраўленне зараз даступна для рэлізных зборак) #1441 diff --git a/fastlane/metadata/android/be/changelogs/992.txt b/fastlane/metadata/android/be/changelogs/992.txt new file mode 100644 index 00000000000..20c8a7b1a2f --- /dev/null +++ b/fastlane/metadata/android/be/changelogs/992.txt @@ -0,0 +1,17 @@ +Новае +- Колькасць падпісчыкаў у дэталях відэа +- Загрузка з чаргі +- Сталая ўсталёўка мініяцюры плэйліста +- Доўгі націск на хэштэгі і спасылкі +- Карткавы рэжым прагляду + +Паляпшэнні +- Павялічаная кнопка зачынення міні-плэера +- Больш плаўнае змяншэнне памеру мініяцюр +- Мэтавая версія Android 13 (API 33) +- Пошук больш не ставіць плэера на паўзу + +Выпраўленні +- Выпраўленне накладання на DeX/мыш +- Дазволены фонавы плэер без асобных аўдыятрансляцый +- Розныя выпраўленні YouTube і гэтак далей… diff --git a/fastlane/metadata/android/be/full_description.txt b/fastlane/metadata/android/be/full_description.txt new file mode 100644 index 00000000000..6ce0c696340 --- /dev/null +++ b/fastlane/metadata/android/be/full_description.txt @@ -0,0 +1 @@ +NewPipe не выкарыстоўвае бібліятэкі фрэймворку Google ці API YouTube. Ён толькі аналізуе вэб-сайт, каб атрымаць неабходную інфармацыю. Таму гэтую праграму можна выкарыстоўваць на прыладах без усталяваных сэрвісаў Google. Акрамя таго, вам не патрэбен уліковы запіс YouTube, каб выкарыстоўваць NewPipe, гэта вольнае і адкрытае праграмнае забеспячэнне. diff --git a/fastlane/metadata/android/be/short_description.txt b/fastlane/metadata/android/be/short_description.txt index d689c171322..0fb9121492e 100644 --- a/fastlane/metadata/android/be/short_description.txt +++ b/fastlane/metadata/android/be/short_description.txt @@ -1 +1 @@ -Свабодны і лёгкі кліент Youtube для Android. +Вольны і лёгкі кліент YouTube для Android. diff --git a/fastlane/metadata/android/hi/changelogs/860.txt b/fastlane/metadata/android/hi/changelogs/860.txt index 24a2297a7e8..da3aa75f98a 100644 --- a/fastlane/metadata/android/hi/changelogs/860.txt +++ b/fastlane/metadata/android/hi/changelogs/860.txt @@ -2,6 +2,6 @@ • सेव करें और रिस्टोर करें कि क्या पिच और टेंपो अनहुक हैं या नहीं • प्लेयर में सपोर्ट डिस्प्ले कटआउट • गोल दृश्य और ग्राहकों की संख्या -• कम डेटा का उपयोग करने के लिए YouTube को अनुकूलित किया गया +• कम डेटा का उपयोग करने के लिए यूट्यूब को अनुकूलित किया गया -इस रिलीज़ में YouTube से संबंधित 15 से अधिक बग ठीक किए गए थे। +इस रिलीज़ में यूट्यूब से संबंधित 15 से अधिक बग ठीक किए गए थे। diff --git a/fastlane/metadata/android/ru/changelogs/760.txt b/fastlane/metadata/android/ru/changelogs/760.txt new file mode 100644 index 00000000000..5990094b669 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/760.txt @@ -0,0 +1,43 @@ +Изменения в 0.17.1 + + Новый + • Тайская локализация + + + Улучшен + • Добавить действие "Начать воспроизведение здесь" в меню длительного нажатия для плейлистов #2518. + • Добавлен переключатель для SAF/устаревшего средства выбора файлов #2521. + + Зафиксированный + • Исправлено исчезновение кнопок в режиме просмотра загрузок при переключении приложений #2487. + • Фиксированная позиция воспроизведения сохраняется, хотя история просмотра отключена. + • Исправлено снижение производительности, вызванное положением воспроизведения в представлениях списка #2517. + • [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186. + • [Extractor] [YouTube] Исправлена случайная ошибка поиска, когда плейлисты находятся в результатах. TeamNewPipe/NewPipeExtractor#185 + + + + Изменения в 0.17.0 + + Новый + Воспроизведение резюме #2288 + • Возобновить трансляции с того места, где вы остановились в прошлый раз. + Усовершенствования загрузчика #2149 + • Используйте Storage Access Framework для хранения загрузок на внешних SD-картах. + • Новый мультиплексор mp4 + • При желании измените каталог загрузки перед началом загрузки + • Соблюдайте тарифные сети + + + Улучшен + • Удалены гема-строки #2295. + • Обработка (автоматического) поворота во время жизненного цикла активности #2444. + • Сделать меню, вызываемые длительным нажатием, согласованными #2368. + + Зафиксированный + • Исправлена ошибка, из-за которой имя выбранной дорожки субтитров не отображалось #2394 + • Не происходит сбой при сбое проверки обновлений приложения (версия GitHub) #2423. + • Исправлено зависание загрузки на уровне 99,9% #2440 + • Обновлены метаданные очереди воспроизведения – 2453. + • [SoundCloud] Исправлен сбой при загрузке плейлистов TeamNewPipe/NewPipeExtractor#170. + • [YouTube] Фиксированная продолжительность не может быть обработана TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/ru/changelogs/770.txt b/fastlane/metadata/android/ru/changelogs/770.txt new file mode 100644 index 00000000000..d2802f80734 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/770.txt @@ -0,0 +1,4 @@ +Изменения в 0.17.2 + +Исправления +• Исправлено, что видео не было доступно diff --git a/fastlane/metadata/android/ru/changelogs/800.txt b/fastlane/metadata/android/ru/changelogs/800.txt new file mode 100644 index 00000000000..983abbf962a --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/800.txt @@ -0,0 +1,27 @@ +Новое +• Поддержка PeerTube без P2P (#2201) [бета-версия]: +◦ Смотрите и скачивайте видео с сайтов PeerTube. +◦ Добавлены экземпляры в настройках, чтобы получить доступ ко всему миру PeerTube +◦ Могут возникнуть проблемы с SSL-квитированием на Android 4.4 и 7.1 при доступе к определенным экземплярам, что приводит к сетевой ошибке. + +• Загрузчик (#2679): +◦ Рассчитать время загрузки +◦ Загрузить opus (файлы webm) в формате ogg +◦ Восстанавливайте ссылки для скачивания с истекшим сроком действия, чтобы возобновить загрузку после длительной паузы + +Улучшено +• Информируйте KioskFragment об изменениях в предпочитаемой стране контента и улучшайте производительность всех основных вкладок #2742 +• Используйте новые реализации локализации и загрузчика из extractor #2713 +• Сделайте строку "Киоск по умолчанию" переводимой +• Черная панель навигации для черной темы #2569 + +Исправлено +• Исправлена ошибка, из-за которой всплывающий проигрыватель не мог перемещаться, если при перемещении всплывающего проигрывателя был помещен другой палец #2772 +• Разрешить плейлистам отсутствие загрузчика и исправить сбои, связанные с этой проблемой #2724, TeamNewPipe/NewPipeExtractor#219 +• Включение TLS1.1/1.2 на устройствах Android 4.4 (API 19/KitKat) для исправления рукопожатия TLS с MediaCCC и некоторыми экземплярами PeerTube #2792 +• [SoundCloud] Исправлено извлечение идентификатора клиента TeamNewPipe/NewPipeExtractor#217 +• [SoundCloud] Исправлено извлечение аудиопотока + +Развитие +• Обновите ExoPlayer до 2.10.8 #2791, #2816 +• Обновите Gradle до версии 3.5.1 и добавьте поддержку Kotlin #2714 diff --git a/fastlane/metadata/android/ru/changelogs/810.txt b/fastlane/metadata/android/ru/changelogs/810.txt new file mode 100644 index 00000000000..70007f261b2 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/810.txt @@ -0,0 +1,19 @@ +Новое +• Показывать миниатюру видео на экране блокировки при воспроизведении в фоновом режиме + +Улучшено +• Добавление локального списка воспроизведения в очередь при длительном нажатии на фоновую / всплывающую кнопку +• Сделайте вкладки главной страницы прокручиваемыми и скрывайте, когда есть только одна вкладка. +• Ограничить количество обновлений миниатюр уведомлений в фоновом проигрывателе +• Добавить фиктивный эскиз для пустых локальных списков воспроизведения +• * Пользователь *.открывает расширение файла вместо *.webmd и показывает "открывает" в метке формата вместо "WebMOpus" в раскрывающемся списке загрузки +• Добавить кнопку для удаления загруженных файлов или истории загрузок в разделе "Загрузки" +• [YouTube] Добавить поддержку ссылок на каналы /c/shortened_url + +Исправлено +• * Исправлены многочисленные проблемы при совместном использовании видео в New Pipe и прямой загрузке его потоков +• Исправлен доступ игрока из потока его создания +• Исправлена подкачка результатов поиска по страницам +• [YouTube] Исправлено включение null, приводящее к NPE +• [* [YouTube] Исправлен просмотр комментариев при открытии invidia.us url-адрес +• [SoundCloud] Обновлен идентификатор клиента diff --git a/fastlane/metadata/android/ru/changelogs/840.txt b/fastlane/metadata/android/ru/changelogs/840.txt new file mode 100644 index 00000000000..2383c75a03c --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/840.txt @@ -0,0 +1,22 @@ +Новое +• Добавлен выбор языка для изменения языка приложения +• Добавлена кнопка "Отправить Коди" в складное меню плеера +• Добавлена возможность копировать комментарии при длительном нажатии + +Улучшенный +• Исправьте активность reCAPTCHA и правильно сохраните полученные файлы cookie +• Удалено точечное меню в пользу ящика и кнопки скрыть историю, когда просмотр истории не включен в настройках +• Правильно запрашивайте разрешение на отображение поверх других приложений в настройках на Android 6 и более поздних версиях +• Переименуйте локальный список воспроизведения, щелкнув длительным щелчком в BookmarkFragment +• Различные улучшения PeerTube +• Улучшены несколько исходных строк на английском языке + +Исправлено +• Исправлен повторный запуск проигрывателя, хотя он приостановлен, когда включена опция "свернуть при переключении приложений" и NewPipe свернут +• Исправьте начальное значение яркости для жеста +• Исправлена загрузка субтитров .srt, содержащих не все разрывы строк +• Исправлена ошибка загрузки на SD-карту из-за того, что некоторые устройства Android 5 не совместимы с CTF +• Исправлена загрузка на Android KitKat +• Исправлено, что поврежденный файл video .mp4 распознавался как аудиофайл +• Исправлены многочисленные проблемы с локализацией, включая неправильные коды китайского языка +• [YouTube] Временные метки в описании снова доступны для кликабельности diff --git a/fastlane/metadata/android/ru/changelogs/860.txt b/fastlane/metadata/android/ru/changelogs/860.txt new file mode 100644 index 00000000000..3e76217e502 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/860.txt @@ -0,0 +1,7 @@ +Улучшено +• Сохраняйте и восстанавливайте независимо от того, отключены ли высота тона и темп или нет +• Поддержка выреза дисплея в плеере +• Круговой обзор и количество подписчиков +• Оптимизирован YouTube для использования меньшего количества данных + +В этом выпуске было исправлено более 15 ошибок, связанных с YouTube. diff --git a/fastlane/metadata/android/ru/changelogs/870.txt b/fastlane/metadata/android/ru/changelogs/870.txt new file mode 100644 index 00000000000..7d1f72dd56c --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/870.txt @@ -0,0 +1,2 @@ +Это выпуск исправления, обновляющий New Pipe, чтобы снова использовать SoundCloud без серьезных проблем. +Soundcloud v2 API теперь используется в экстракторе, и было улучшено обнаружение недопустимых идентификаторов клиентов. diff --git a/fastlane/metadata/android/ru/changelogs/900.txt b/fastlane/metadata/android/ru/changelogs/900.txt new file mode 100644 index 00000000000..2243215e919 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/900.txt @@ -0,0 +1,14 @@ +Новое +• Группы подписок и отсортированные каналы +• Кнопка отключения звука в проигрывателях + +Улучшено +• * Разрешить открытие music.youtube.com и media.ccc.de соединения в новой трубе +• Переместите две настройки с внешнего вида на содержимое +• Скрыть параметры поиска на 5, 15, 25 секунд, если включен неточный поиск + +Исправлено +• некоторые видеоролики WebM недоступны для поиска +• * резервное копирование базы данных на телефоне Android +• сбой при совместном использовании загруженного файла +• тонны проблем с извлечением с YouTube и многое другое... diff --git a/fastlane/metadata/android/ru/changelogs/920.txt b/fastlane/metadata/android/ru/changelogs/920.txt new file mode 100644 index 00000000000..3cf0c63becc --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/920.txt @@ -0,0 +1,9 @@ +Улучшено + +• Добавлена дата загрузки и количество просмотров для элементов сетки потока +• Улучшения в макете заголовка ящика + +Исправлено + +• Исправлена кнопка отключения звука, вызывающая сбои в API 19 +• Исправлена загрузка длинных видео с разрешением 1080p 60 кадров в секунду diff --git a/fastlane/metadata/android/ru/changelogs/930.txt b/fastlane/metadata/android/ru/changelogs/930.txt new file mode 100644 index 00000000000..40fa443c221 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/930.txt @@ -0,0 +1,19 @@ +Новое +• Поиск музыки на YouTube +• Базовая поддержка Android TV + +Улучшено +• Добавлена возможность удалять все просмотренные видео из локального списка воспроизведения +• Показывать сообщение, когда контент еще не поддерживается, вместо сбоя +• Улучшено изменение размера всплывающего проигрывателя с помощью пинч-жестов +• Постановка потоков в очередь при длительном нажатии на фоновые и всплывающие кнопки в канале +• Улучшена обработка размера заголовка заголовка ящика + +Исправлено +• Исправлена ошибка, из-за которой не работает настройка контента с ограничением по возрасту +• * Исправлены некоторые виды рекапчи +• Исправлен сбой при открытии закладок, когда плейлист имеет значение `null` +• Исправлено обнаружение исключений, связанных с сетью +• Исправлена видимость кнопки сортировки по группам во фрагменте подписок + +и более diff --git a/fastlane/metadata/android/ru/changelogs/940.txt b/fastlane/metadata/android/ru/changelogs/940.txt new file mode 100644 index 00000000000..c37293c4bdb --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/940.txt @@ -0,0 +1,16 @@ +Новое +• Добавлена поддержка комментариев SoundCloud +• Добавить настройку ограниченного режима YouTube +• Показать сведения о родительском канале PeerTube + +Улучшено +• Показывать кнопку Kore только для поддерживаемых сервисов +• * Блокируйте жесты игрока, которые начинаются с панели навигации или строки состояния +• Измените цвет фона кнопок повтора и подписки на основе цвета сервиса + +Исправлено +• Исправлена блокировка диалогового окна загрузки +• Кнопка Открыть в браузере теперь действительно открывается в браузере +• Исправлена ошибка при открытии видео и "Не удалось воспроизвести этот поток" + +и более diff --git a/fastlane/metadata/android/ru/changelogs/951.txt b/fastlane/metadata/android/ru/changelogs/951.txt new file mode 100644 index 00000000000..18f47adc04c --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/951.txt @@ -0,0 +1,17 @@ +Новое +• Добавить поиск для средства выбора подписки в диалоговом окне группы каналов +• Добавьте фильтр в диалоговое окно группы каналов, чтобы показывать только негруппированные подписки +• Добавить вкладку плейлиста на главную страницу +• Быстрая перемотка вперед / назад в фоновом режиме / очередь всплывающих окон проигрывателя +• Отобразить предложение по поиску: вы имели в виду и показываете результат для + +Улучшено +• * Удалите метаданные приложения для записи в смешанные файлы +• Не удаляйте сбойные потоки из очереди +• Обновите цвет строки состояния, чтобы он соответствовал цвету панели инструментов + +Исправлено +• Исправлена рассинхронизация аудио / видео, вызванная накопительными ошибками с плавающей запятой +• [PeerTube] Обрабатывает удаленные комментарии + +и более diff --git a/fastlane/metadata/android/ru/changelogs/954.txt b/fastlane/metadata/android/ru/changelogs/954.txt new file mode 100644 index 00000000000..f0da442028b --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/954.txt @@ -0,0 +1,9 @@ +• новый рабочий процесс приложения: воспроизведение видео на странице сведений, проведите пальцем вниз, чтобы свернуть проигрыватель +• Уведомления в стиле медиастайла: настраиваемые действия в уведомлениях, повышение производительности +• * базовое изменение размера при использовании New Pipe в качестве настольного приложения + +• показывать диалоговое окно с открытыми параметрами в случае появления неподдерживаемого URL-адреса. +• Улучшите работу с поисковыми предложениями, когда удаленные предложения не могут быть извлечены +• Увеличено качество видео по умолчанию до 720p60 (встроенный проигрыватель) и 480p (всплывающий проигрыватель). + +• тонны исправлений ошибок и многое другое diff --git a/fastlane/metadata/android/ru/changelogs/957.txt b/fastlane/metadata/android/ru/changelogs/957.txt new file mode 100644 index 00000000000..55e12b906a6 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/957.txt @@ -0,0 +1,10 @@ +• Объединить конкретные действия по постановке в очередь в одно +• Жест двумя пальцами для закрытия проигрывателя +• Разрешить очистку файлов cookie reCAPTCHA +• Возможность не раскрашивать уведомление +• * Улучшите способ открытия деталей видео, чтобы исправить бесконечную буферизацию, ошибки при совместном использовании с новым каналом и другие несоответствия. +• Ускорьте просмотр видео на YouTube и исправьте возрастные ограничения +• Исправлен сбой при быстрой перемотке вперед / назад +• Не переставляйте списки, перетаскивая миниатюры +• Всегда помните о свойствах всплывающего окна +• Добавить язык сантали diff --git a/fastlane/metadata/android/ru/changelogs/959.txt b/fastlane/metadata/android/ru/changelogs/959.txt new file mode 100644 index 00000000000..6784a604a39 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/959.txt @@ -0,0 +1,3 @@ +Исправлен бесконечный цикл сбоев после открытия отчета об ошибках. +Обновлен список экземпляров PeerTube, которые могут быть автоматически открыты новым каналом. +Обновленные переводы. diff --git a/fastlane/metadata/android/ru/changelogs/960.txt b/fastlane/metadata/android/ru/changelogs/960.txt new file mode 100644 index 00000000000..eeb34abc8ad --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/960.txt @@ -0,0 +1,4 @@ +• Улучшено описание опции экспорта базы данных в настройках. +• Исправлен синтаксический анализ комментариев на YouTube. +• Исправлено отображаемое имя media.ccc.de обслуживание. +• Обновленные переводы. diff --git a/fastlane/metadata/android/ru/changelogs/961.txt b/fastlane/metadata/android/ru/changelogs/961.txt new file mode 100644 index 00000000000..9d91653b396 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/961.txt @@ -0,0 +1,12 @@ +• [YouTube] Поддержка микширования +• [YouTube] Отображает информацию об общественных вещателях и Covid-19 +• [media.ccc.de ] Добавлены последние видео +• Добавлен перевод на сомалийский + +• Множество внутренних улучшений + +• Исправлен обмен видео из плеера +• Исправлено пустое веб-представление reCAPTCHA +• Исправлен сбой, возникавший при удалении потока из списка +• [PeerTube] Исправлены связанные потоки +• [YouTube] Исправлен поиск музыки на YouTube diff --git a/fastlane/metadata/android/ru/changelogs/964.txt b/fastlane/metadata/android/ru/changelogs/964.txt new file mode 100644 index 00000000000..d31f3ef2c2d --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/964.txt @@ -0,0 +1,8 @@ +• Добавлена поддержка глав в элементах управления плеером +• [PeerTube] Добавлен поиск в сепии +• Повторно добавлена кнопка "Поделиться" в подробном просмотре видео и перенесено описание потока в макет вкладки +• Отключите восстановление яркости, если жест яркости отключен +• Добавлен элемент списка для воспроизведения видео на kodi +• Исправлен сбой, когда на некоторых устройствах не был установлен браузер по умолчанию, и улучшены диалоги общего доступа. +• Переключение воспроизведения / паузы с помощью аппаратной кнопки пробела в полноэкранном проигрывателе +• [media.ccc.de ] Различные исправления и улучшения diff --git a/fastlane/metadata/android/ru/changelogs/965.txt b/fastlane/metadata/android/ru/changelogs/965.txt new file mode 100644 index 00000000000..91154a156f2 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/965.txt @@ -0,0 +1,6 @@ +Исправлен сбой, возникавший при переупорядочивании групп каналов. +Исправлено получение большего количества видео с YouTube из каналов и плейлистов. +Исправлено получение комментариев на YouTube. +Добавлена поддержка подпутей /watch/, /v/ и /w/ в URL-адресах YouTube. +Исправлено извлечение идентификатора клиента SoundCloud и контента с географическими ограничениями. +Добавлена локализация на северном курдском языке. diff --git a/fastlane/metadata/android/ru/changelogs/966.txt b/fastlane/metadata/android/ru/changelogs/966.txt new file mode 100644 index 00000000000..651c8683877 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/966.txt @@ -0,0 +1,14 @@ +Новое: +• Добавить новую услугу: Bandcamp + +Улучшенный: +• Добавьте опцию, чтобы приложение соответствовало теме устройства +• Предотвратите некоторые сбои, показав улучшенную панель ошибок +• Показать дополнительную информацию о том, почему контент в недоступном +• Аппаратная кнопка пробела запускает воспроизведение/паузу +• Показать тост "Загрузка начата" + +Исправлено: +• Исправлена очень маленькая миниатюра в деталях видео при воспроизведении в фоновом режиме +• Исправлен пустой заголовок в свернутом проигрывателе +• Исправлено, что последний режим изменения размера восстанавливался неправильно diff --git a/fastlane/metadata/android/ru/changelogs/967.txt b/fastlane/metadata/android/ru/changelogs/967.txt new file mode 100644 index 00000000000..675a4c9089c --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/967.txt @@ -0,0 +1 @@ +Исправлена ошибка, из-за которой YouTube не работал должным образом в ЕС. Это было вызвано новым файлом cookie и системой согласия на конфиденциальность, которая требует нового канала для установки файла cookie СОГЛАСИЯ. diff --git a/fastlane/metadata/android/ru/changelogs/968.txt b/fastlane/metadata/android/ru/changelogs/968.txt new file mode 100644 index 00000000000..b4c718af797 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/968.txt @@ -0,0 +1,7 @@ +Добавлена опция сведений о канале в меню при длительном нажатии. +Добавлена функция переименования названия списка воспроизведения из интерфейса списка воспроизведения. +Разрешить пользователю делать паузу во время буферизации видео. +Отполировал белую тему. +Исправлено наложение шрифтов при использовании большего размера шрифта. +Исправлено отсутствие видео на устройствах Formuler и Zephier. +Исправлены различные сбои. diff --git a/fastlane/metadata/android/ru/changelogs/969.txt b/fastlane/metadata/android/ru/changelogs/969.txt new file mode 100644 index 00000000000..259c9024df4 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/969.txt @@ -0,0 +1,8 @@ +• Разрешить установку на внешнее хранилище +• [Bandcamp] Добавлена поддержка отображения первых трех комментариев в потоке +• Показывать тост "загрузка началась" только при запуске загрузки +• Не устанавливайте файл cookie reCAPTCHA, если файл cookie не сохранен +• [Player] Повысить производительность кэша +• [Player] Исправлено, что проигрыватель не воспроизводился автоматически +• Отключите предыдущие панели закусок при удалении загрузок +• Исправлена попытка удалить объект, которого нет в списке diff --git a/fastlane/metadata/android/ru/changelogs/970.txt b/fastlane/metadata/android/ru/changelogs/970.txt new file mode 100644 index 00000000000..6d2d8bba9ad --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/970.txt @@ -0,0 +1,11 @@ +Новое + • Просмотр метаданных контента (теги, категории, лицензии и т. д.) под описанием. + • Добавлена опция "Показать информацию о канале" в удаленных (не локальных) плейлистах. + • В меню длительного нажатия добавлена опция "Открыть в браузере". + + Зафиксированный + • Исправлен сбой при вращении на странице сведений о видео. + • Исправлена ошибка, из-за которой кнопка «Играть с Kodi» в плеере всегда предлагала установить Kore. + • Исправлены и улучшены настройки путей импорта и экспорта + • [YouTube] Исправлены комментарии и их количество. + И многое другое diff --git a/fastlane/metadata/android/ru/changelogs/971.txt b/fastlane/metadata/android/ru/changelogs/971.txt new file mode 100644 index 00000000000..27584b05b6c --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/971.txt @@ -0,0 +1,3 @@ +Исправление + • Увеличен буфер для воспроизведения после повторной буферизации + • Исправлен вылет на планшетах и телевизорах при нажатии на иконку play-queue в плеере From d33229a3b862f1e53e1c9b6da9fd7216238695a7 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 1 Mar 2023 10:45:25 +0100 Subject: [PATCH 106/645] Add changelog for v0.25.1 (993) --- fastlane/metadata/android/en-US/changelogs/993.txt | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/993.txt diff --git a/fastlane/metadata/android/en-US/changelogs/993.txt b/fastlane/metadata/android/en-US/changelogs/993.txt new file mode 100644 index 00000000000..5d45efd13c1 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/993.txt @@ -0,0 +1,13 @@ +New +• Add warning when adding playlist duplicates and add button to remove them +• Allow ignoring hardware buttons +• Allow hiding partially watched videos in feed + +Improved +• Use more grid columns on big screens +• Make progress indicators consistent with settings + +Fixed +• Fix opening browser URLs, downloads and external players on Android 11+ +• Fix interacting with fullscreen requiring two taps on MIUI +• Allow tweaking ExoPlayer settings to fix playback on some devices \ No newline at end of file From 3f8e44dc66b6e1cd48220712c808672d3abb49b4 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 1 Mar 2023 10:51:17 +0100 Subject: [PATCH 107/645] Update NewPipeExtractor --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a5d63f429d6..4d5d7344484 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,7 @@ dependencies { // name and the commit hash with the commit hash of the (pushed) commit you want to test // This works thanks to JitPack: https://jitpack.io/ implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'com.github.TeamNewPipe:NewPipeExtractor:7e793c11aec46358ccbfd8bcfcf521105f4f093a' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:19e4b216c905f06f55f20241c1572e48fc284811' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ From c5cf2f4514cbd9c669dfa5a956960ab4bc6370fd Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 1 Mar 2023 10:52:05 +0100 Subject: [PATCH 108/645] Release v0.25.1 (993) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4d5d7344484..0e2fd40015e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,8 +20,8 @@ android { resValue "string", "app_name", "NewPipe" minSdk 21 targetSdk 33 - versionCode 992 - versionName "0.25.0" + versionCode 993 + versionName "0.25.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From d06cc862c88b2585f72af9390da03ca7094f2680 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Fri, 3 Mar 2023 11:58:30 +0100 Subject: [PATCH 109/645] Remove wrong annotation --- app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt index 17071dfcbbb..fcc06210202 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt @@ -6,7 +6,6 @@ import android.util.Log import android.view.View import android.widget.Button import android.widget.TextView -import androidx.annotation.Nullable import androidx.annotation.StringRes import androidx.core.view.isVisible import androidx.fragment.app.Fragment @@ -144,7 +143,7 @@ class ErrorPanelHelper( */ private fun showAndSetErrorButtonAction( @StringRes resid: Int, - @Nullable listener: View.OnClickListener + listener: View.OnClickListener ) { errorActionButton.isVisible = true errorActionButton.setText(resid) From 7c394212974f6785279d3d027d651065dad87871 Mon Sep 17 00:00:00 2001 From: Robin Date: Mon, 6 Mar 2023 16:49:43 +0100 Subject: [PATCH 110/645] bump ExoPlayer to 2.18.4 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a5d63f429d6..5330516c88b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -106,7 +106,7 @@ ext { androidxWorkVersion = '2.7.1' icepickVersion = '3.2.0' - exoPlayerVersion = '2.18.3' + exoPlayerVersion = '2.18.4' googleAutoServiceVersion = '1.0.1' groupieVersion = '2.10.1' markwonVersion = '4.6.2' From bb1f5d8f382f3345478b6b987a903fe177981075 Mon Sep 17 00:00:00 2001 From: Roger Salas <58913883+rogerjs93@users.noreply.github.com> Date: Wed, 8 Mar 2023 19:27:13 +0200 Subject: [PATCH 111/645] Update README.es.md --- doc/README.es.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/README.es.md b/doc/README.es.md index 0d8e6fd6550..ead878bb452 100644 --- a/doc/README.es.md +++ b/doc/README.es.md @@ -20,7 +20,7 @@ *Lea esto en otros idiomas: [English](../README.md), [हिन्दी](README.hi.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md).* -AVISO: ESTA ES UNA VERSIÓN BETA, POR LO TANTO, PUEDE ENCONTRAR BUGS. SI ENCUENTRA UNO ABRA UN ISSUE A TRAVÉS DE NUESTRO REPOSITORIO DE GITHUB. +AVISO: ESTA ES UNA VERSIÓN BETA, POR LO TANTO, PUEDES ENCONTRAR BUGS. SI ENCUENTRAS UNO ABRA UN ISSUE A TRAVÉS DE NUESTRO REPOSITORIO DE GITHUB. COLOCAR NEWPIPE O CUALQUIER FORK DE NEWPIPE EN LA GOOGLE PLAY STORE VIOLARÁ SUS TÉRMINOS Y CONDICIONES. @@ -59,7 +59,7 @@ NewPipe no usa ninguna librería del framework de Google, ni la API de YouTube. * Buscar a través de YouTube en un idioma específico * Mirar/Bloquear videos restringidos por edad * Mostrar información general sobre canales -* Buscar de canales +* Buscador de canales * Mirar videos de un canal * Soporte Orbot/Tor (todavía no directamente) * Soporte para videos en 1080p/2K/4K From de7872d8f2301e7d95d8b6dd362a12cedc80c278 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 17 Mar 2023 21:51:40 +0100 Subject: [PATCH 112/645] feat: add audio language selector --- app/build.gradle | 2 +- .../org/schabi/newpipe/player/Player.java | 11 +++ .../player/mediaitem/MediaItemTag.java | 39 ++++++++ .../player/mediaitem/StreamInfoTag.java | 23 ++++- .../player/resolver/PlaybackResolver.java | 5 + .../resolver/VideoPlaybackResolver.java | 55 ++++++++--- .../newpipe/player/ui/VideoPlayerUi.java | 76 ++++++++++++++- .../org/schabi/newpipe/util/ListHelper.java | 94 +++++++++++++++++-- app/src/main/res/layout/player.xml | 16 ++++ 9 files changed, 295 insertions(+), 26 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a5d63f429d6..c0d42381769 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,7 @@ dependencies { // name and the commit hash with the commit hash of the (pushed) commit you want to test // This works thanks to JitPack: https://jitpack.io/ implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'com.github.TeamNewPipe:NewPipeExtractor:7e793c11aec46358ccbfd8bcfcf521105f4f093a' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:5a9b6ed2e3306b9152cc6689dd61dbbe43483845' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 4243c233bc9..69b1616316c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -88,6 +88,7 @@ import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.error.UserAction; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -1886,6 +1887,12 @@ public Optional getSelectedVideoStream() { .map(quality -> quality.getSortedVideoStreams() .get(quality.getSelectedVideoStreamIndex())); } + + public Optional getSelectedAudioStream() { + return Optional.ofNullable(currentMetadata) + .flatMap(MediaItemTag::getMaybeAudioLanguage) + .map(MediaItemTag.AudioLanguage::getSelectedAudioStream); + } //endregion @@ -2178,6 +2185,10 @@ public void setPlaybackQuality(@Nullable final String quality) { videoResolver.setPlaybackQuality(quality); } + public void setAudioLanguage(@Nullable final String language) { + videoResolver.setAudioLanguage(language); + } + @NonNull public Context getContext() { diff --git a/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java b/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java index f08086287f5..0ef1eaaf134 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java @@ -7,6 +7,7 @@ import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.Player; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -55,6 +56,11 @@ default Optional getMaybeQuality() { return Optional.empty(); } + @NonNull + default Optional getMaybeAudioLanguage() { + return Optional.empty(); + } + Optional getMaybeExtras(@NonNull Class type); MediaItemTag withExtras(@NonNull T extra); @@ -128,4 +134,37 @@ public VideoStream getSelectedVideoStream() { ? null : sortedVideoStreams.get(selectedVideoStreamIndex); } } + + final class AudioLanguage { + @NonNull + private final List audioStreams; + private final int selectedAudioStreamIndex; + + private AudioLanguage(@NonNull final List audioStreams, + final int selectedAudioStreamIndex) { + this.audioStreams = audioStreams; + this.selectedAudioStreamIndex = selectedAudioStreamIndex; + } + + static AudioLanguage of(@NonNull final List audioStreams, + final int selectedAudioStreamIndex) { + return new AudioLanguage(audioStreams, selectedAudioStreamIndex); + } + + @NonNull + public List getAudioStreams() { + return audioStreams; + } + + public int getSelectedAudioStreamIndex() { + return selectedAudioStreamIndex; + } + + @Nullable + public AudioStream getSelectedAudioStream() { + return selectedAudioStreamIndex < 0 + || selectedAudioStreamIndex >= audioStreams.size() + ? null : audioStreams.get(selectedAudioStreamIndex); + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java b/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java index 4095f2bc888..5379fc5a61e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java @@ -2,6 +2,7 @@ import com.google.android.exoplayer2.MediaItem; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -25,25 +26,33 @@ public final class StreamInfoTag implements MediaItemTag { @Nullable private final MediaItemTag.Quality quality; @Nullable + private final MediaItemTag.AudioLanguage audioLanguage; + @Nullable private final Object extras; private StreamInfoTag(@NonNull final StreamInfo streamInfo, @Nullable final MediaItemTag.Quality quality, + @Nullable final MediaItemTag.AudioLanguage audioLanguage, @Nullable final Object extras) { this.streamInfo = streamInfo; this.quality = quality; + this.audioLanguage = audioLanguage; this.extras = extras; } public static StreamInfoTag of(@NonNull final StreamInfo streamInfo, @NonNull final List sortedVideoStreams, - final int selectedVideoStreamIndex) { + final int selectedVideoStreamIndex, + @NonNull final List audioStreams, + final int selectedAudioStreamIndex) { final Quality quality = Quality.of(sortedVideoStreams, selectedVideoStreamIndex); - return new StreamInfoTag(streamInfo, quality, null); + final AudioLanguage audioLanguage = + AudioLanguage.of(audioStreams, selectedAudioStreamIndex); + return new StreamInfoTag(streamInfo, quality, audioLanguage, null); } public static StreamInfoTag of(@NonNull final StreamInfo streamInfo) { - return new StreamInfoTag(streamInfo, null, null); + return new StreamInfoTag(streamInfo, null, null, null); } @Override @@ -103,6 +112,12 @@ public Optional getMaybeQuality() { return Optional.ofNullable(quality); } + @NonNull + @Override + public Optional getMaybeAudioLanguage() { + return Optional.ofNullable(audioLanguage); + } + @Override public Optional getMaybeExtras(@NonNull final Class type) { return Optional.ofNullable(extras).map(type::cast); @@ -110,6 +125,6 @@ public Optional getMaybeExtras(@NonNull final Class type) { @Override public StreamInfoTag withExtras(@NonNull final Object extra) { - return new StreamInfoTag(streamInfo, quality, extra); + return new StreamInfoTag(streamInfo, quality, audioLanguage, extra); } } diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java index 9c8cbb8f6f9..c15447418fd 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java @@ -156,6 +156,11 @@ static String cacheKeyOf(final StreamInfo info, final AudioStream audioStream) { cacheKey.append(audioStream.getAverageBitrate()); } + if (audioStream.getAudioTrackId() != null) { + cacheKey.append(" "); + cacheKey.append(audioStream.getAudioTrackId()); + } + return cacheKey.toString(); } 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 cf7d7355817..2f0c5932509 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 @@ -28,6 +28,7 @@ import java.util.Optional; import static com.google.android.exoplayer2.C.TIME_UNSET; +import static org.schabi.newpipe.util.ListHelper.getFilteredAudioStreams; import static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams; import static org.schabi.newpipe.util.ListHelper.getNonTorrentStreams; @@ -44,6 +45,8 @@ public class VideoPlaybackResolver implements PlaybackResolver { @Nullable private String playbackQuality; + @Nullable + private String audioLanguage; public enum SourceType { LIVE_STREAM, @@ -74,19 +77,39 @@ public MediaSource resolve(@NonNull final StreamInfo info) { final List videoStreamsList = ListHelper.getSortedStreamVideosList(context, getNonTorrentStreams(info.getVideoStreams()), getNonTorrentStreams(info.getVideoOnlyStreams()), false, true); - final int index; + final List audioStreamsList = + getFilteredAudioStreams(context, info.getAudioStreams()); + + final int videoIndex; if (videoStreamsList.isEmpty()) { - index = -1; + videoIndex = -1; } else if (playbackQuality == null) { - index = qualityResolver.getDefaultResolutionIndex(videoStreamsList); + videoIndex = qualityResolver.getDefaultResolutionIndex(videoStreamsList); } else { - index = qualityResolver.getOverrideResolutionIndex(videoStreamsList, + videoIndex = qualityResolver.getOverrideResolutionIndex(videoStreamsList, getPlaybackQuality()); } - final MediaItemTag tag = StreamInfoTag.of(info, videoStreamsList, index); + + int audioIndex = 0; + if (audioLanguage != null) { + for (int i = 0; i < audioStreamsList.size(); i++) { + final AudioStream stream = audioStreamsList.get(i); + if (stream.getAudioTrackId() != null + && stream.getAudioTrackId().equals(audioLanguage)) { + audioIndex = i; + break; + } + } + } + + final MediaItemTag tag = + StreamInfoTag.of(info, videoStreamsList, videoIndex, audioStreamsList, audioIndex); @Nullable final VideoStream video = tag.getMaybeQuality() .map(MediaItemTag.Quality::getSelectedVideoStream) .orElse(null); + @Nullable final AudioStream audio = tag.getMaybeAudioLanguage() + .map(MediaItemTag.AudioLanguage::getSelectedAudioStream) + .orElse(null); if (video != null) { try { @@ -99,14 +122,9 @@ public MediaSource resolve(@NonNull final StreamInfo info) { } } - // Create optional audio stream source - final List audioStreams = getNonTorrentStreams(info.getAudioStreams()); - final AudioStream audio = audioStreams.isEmpty() ? null : audioStreams.get( - ListHelper.getDefaultAudioFormat(context, audioStreams)); - // Use the audio stream if there is no video stream, or // merge with audio stream in case if video does not contain audio - if (audio != null && (video == null || video.isVideoOnly())) { + if (audio != null && (video == null || video.isVideoOnly() || audioLanguage != null)) { try { final MediaSource audioSource = PlaybackResolver.buildMediaSource( dataSource, audio, info, PlaybackResolver.cacheKeyOf(info, audio), tag); @@ -179,9 +197,24 @@ public void setPlaybackQuality(@Nullable final String playbackQuality) { this.playbackQuality = playbackQuality; } + @Nullable + public String getAudioLanguage() { + return audioLanguage; + } + + public void setAudioLanguage(@Nullable final String audioLanguage) { + this.audioLanguage = audioLanguage; + } + public interface QualityResolver { int getDefaultResolutionIndex(List sortedVideos); int getOverrideResolutionIndex(List sortedVideos, String playbackQuality); } + + public interface AudioLanguageResolver { + int getDefaultLanguageIndex(List audioStreams); + + int getOverrideLanguageIndex(List audioStreams, String audioLanguage); + } } diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 9afd1bf240b..3365ade72b1 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -63,6 +63,7 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.databinding.PlayerBinding; import org.schabi.newpipe.extractor.MediaFormat; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; @@ -117,11 +118,13 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa //////////////////////////////////////////////////////////////////////////*/ private static final int POPUP_MENU_ID_QUALITY = 69; + private static final int POPUP_MENU_ID_LANGUAGE = 70; private static final int POPUP_MENU_ID_PLAYBACK_SPEED = 79; private static final int POPUP_MENU_ID_CAPTION = 89; protected boolean isSomePopupMenuVisible = false; private PopupMenu qualityPopupMenu; + private PopupMenu languagePopupMenu; protected PopupMenu playbackSpeedPopupMenu; private PopupMenu captionPopupMenu; @@ -146,7 +149,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa //region Constructor, setup, destroy protected VideoPlayerUi(@NonNull final Player player, - @NonNull final PlayerBinding playerBinding) { + @NonNull final PlayerBinding playerBinding) { super(player); binding = playerBinding; setupFromView(); @@ -173,6 +176,7 @@ private void initViews() { R.style.DarkPopupMenu); qualityPopupMenu = new PopupMenu(themeWrapper, binding.qualityTextView); + languagePopupMenu = new PopupMenu(themeWrapper, binding.languageTextView); playbackSpeedPopupMenu = new PopupMenu(context, binding.playbackSpeed); captionPopupMenu = new PopupMenu(themeWrapper, binding.captionTextView); @@ -190,6 +194,8 @@ private void initViews() { protected void initListeners() { binding.qualityTextView.setOnClickListener(makeOnClickListener(this::onQualityClicked)); + binding.languageTextView.setOnClickListener( + makeOnClickListener(this::onAudioLanguageClicked)); binding.playbackSpeed.setOnClickListener(makeOnClickListener(this::onPlaybackSpeedClicked)); binding.playbackSeekBar.setOnSeekBarChangeListener(this); @@ -266,6 +272,7 @@ protected void initListeners() { protected void deinitListeners() { binding.qualityTextView.setOnClickListener(null); + binding.languageTextView.setOnClickListener(null); binding.playbackSpeed.setOnClickListener(null); binding.playbackSeekBar.setOnSeekBarChangeListener(null); binding.captionTextView.setOnClickListener(null); @@ -419,6 +426,7 @@ protected void setupElementsSize(final int buttonsMinWidth, binding.topControls.setPaddingRelative(controlsPad, playerTopPad, controlsPad, 0); binding.bottomControls.setPaddingRelative(controlsPad, 0, controlsPad, 0); binding.qualityTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); + binding.languageTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); binding.playbackSpeed.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); binding.playbackSpeed.setMinimumWidth(buttonsMinWidth); binding.captionTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); @@ -984,6 +992,7 @@ public void onMetadataChanged(@NonNull final StreamInfo info) { private void updateStreamRelatedViews() { player.getCurrentStreamInfo().ifPresent(info -> { binding.qualityTextView.setVisibility(View.GONE); + binding.languageTextView.setVisibility(View.GONE); binding.playbackSpeed.setVisibility(View.GONE); binding.playbackEndTime.setVisibility(View.GONE); @@ -1019,6 +1028,7 @@ private void updateStreamRelatedViews() { } buildQualityMenu(); + buildLanguageMenu(); binding.qualityTextView.setVisibility(View.VISIBLE); binding.surfaceView.setVisibility(View.VISIBLE); @@ -1067,6 +1077,37 @@ private void buildQualityMenu() { .ifPresent(s -> binding.qualityTextView.setText(s.getResolution())); } + private void buildLanguageMenu() { + if (languagePopupMenu == null) { + return; + } + languagePopupMenu.getMenu().removeGroup(POPUP_MENU_ID_LANGUAGE); + + final List availableStreams = Optional.ofNullable(player.getCurrentMetadata()) + .flatMap(MediaItemTag::getMaybeAudioLanguage) + .map(MediaItemTag.AudioLanguage::getAudioStreams) + .orElse(null); + if (availableStreams == null || availableStreams.size() < 2) { + return; + } + + for (int i = 0; i < availableStreams.size(); i++) { + final AudioStream audioStream = availableStreams.get(i); + // TODO: ensure that audio streams have track names + if (audioStream.getAudioTrackName() == null) { + continue; + } + languagePopupMenu.getMenu().add(POPUP_MENU_ID_LANGUAGE, i, Menu.NONE, + audioStream.getAudioTrackName()); + } + + player.getSelectedAudioStream() + .ifPresent(s -> binding.languageTextView.setText(s.getAudioTrackName())); + binding.languageTextView.setVisibility(View.VISIBLE); + languagePopupMenu.setOnMenuItemClickListener(this); + languagePopupMenu.setOnDismissListener(this); + } + private void buildPlaybackSpeedMenu() { if (playbackSpeedPopupMenu == null) { return; @@ -1175,6 +1216,15 @@ private void onQualityClicked() { .ifPresent(binding.qualityTextView::setText); } + private void onAudioLanguageClicked() { + languagePopupMenu.show(); + isSomePopupMenuVisible = true; + + player.getSelectedAudioStream() + .map(AudioStream::getAudioTrackName) + .ifPresent(binding.languageTextView::setText); + } + /** * Called when an item of the quality selector or the playback speed selector is selected. */ @@ -1208,6 +1258,30 @@ public boolean onMenuItemClick(@NonNull final MenuItem menuItem) { binding.qualityTextView.setText(menuItem.getTitle()); return true; + } else if (menuItem.getGroupId() == POPUP_MENU_ID_LANGUAGE) { + final int menuItemIndex = menuItem.getItemId(); + @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); + //noinspection SimplifyOptionalCallChains + if (currentMetadata == null || !currentMetadata.getMaybeAudioLanguage().isPresent()) { + return true; + } + + final MediaItemTag.AudioLanguage language = + currentMetadata.getMaybeAudioLanguage().get(); + final List availableStreams = language.getAudioStreams(); + final int selectedStreamIndex = language.getSelectedAudioStreamIndex(); + if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { + return true; + } + + player.saveStreamProgressState(); + final String newLanguage = availableStreams.get(menuItemIndex).getAudioTrackId(); + player.setRecovery(); + player.setAudioLanguage(newLanguage); + player.reloadPlayQueueManager(); + + binding.languageTextView.setText(menuItem.getTitle()); + return true; } else if (menuItem.getGroupId() == POPUP_MENU_ID_PLAYBACK_SPEED) { final int speedIndex = menuItem.getItemId(); final float speed = PLAYBACK_SPEEDS[speedIndex]; diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index b3b7c1792db..ed1e1e80146 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -23,6 +23,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.Set; import java.util.function.Predicate; @@ -42,13 +43,14 @@ public final class ListHelper { // Use a Set for better performance private static final Set HIGH_RESOLUTION_LIST = Set.of("1440p", "2160p"); - private ListHelper() { } + private ListHelper() { + } /** - * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) * @param context Android app context * @param videoStreams list of the video streams to check * @return index of the video stream with the default index + * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) */ public static int getDefaultResolutionIndex(final Context context, final List videoStreams) { @@ -58,11 +60,11 @@ public static int getDefaultResolutionIndex(final Context context, } /** - * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) * @param context Android app context * @param videoStreams list of the video streams to check * @param defaultResolution the default resolution to look for * @return index of the video stream with the default index + * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) */ public static int getResolutionIndex(final Context context, final List videoStreams, @@ -71,10 +73,10 @@ public static int getResolutionIndex(final Context context, } /** - * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) - * @param context Android app context - * @param videoStreams list of the video streams to check + * @param context Android app context + * @param videoStreams list of the video streams to check * @return index of the video stream with the default index + * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) */ public static int getPopupDefaultResolutionIndex(final Context context, final List videoStreams) { @@ -84,11 +86,11 @@ public static int getPopupDefaultResolutionIndex(final Context context, } /** - * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) * @param context Android app context * @param videoStreams list of the video streams to check * @param defaultResolution the default resolution to look for * @return index of the video stream with the default index + * @see #getDefaultResolutionIndex(String, String, MediaFormat, List) */ public static int getPopupResolutionIndex(final Context context, final List videoStreams, @@ -186,6 +188,80 @@ public static List getSortedStreamVideosList( videoOnlyStreams, ascendingOrder, preferVideoOnlyStreams); } + public static List getFilteredAudioStreams( + @NonNull final Context context, + @Nullable final List audioStreams) { + if (audioStreams == null) { + return Collections.emptyList(); + } + + final HashMap collectedStreams = new HashMap<>(); + + final Comparator cmp; + if (isLimitingDataUsage(context)) { + cmp = getAudioStreamComparator(AUDIO_FORMAT_EFFICIENCY_RANKING); + } else { + cmp = getAudioStreamComparator(AUDIO_FORMAT_QUALITY_RANKING); + } + + final String preferredLanguage = Localization.getPreferredLocale(context).getISO3Language(); + boolean hasPreferredLanguage = false; + + for (final AudioStream stream : audioStreams) { + if (stream.getDeliveryMethod() == DeliveryMethod.TORRENT) { + continue; + } + + final String trackId; + if (stream.getAudioTrackId() != null) { + trackId = stream.getAudioTrackId(); + } else { + trackId = ""; + } + + final AudioStream presentStream = collectedStreams.get(trackId); + if (presentStream == null || cmp.compare(stream, presentStream) > 0) { + collectedStreams.put(trackId, stream); + + if (stream.getAudioLocale() != null + && stream.getAudioLocale().getISO3Language().equals(preferredLanguage)) { + hasPreferredLanguage = true; + } + } + } + + // Fall back to English if the preferred language was not found + final String preferredLanguageOrEnglish = + hasPreferredLanguage ? preferredLanguage : Locale.ENGLISH.getISO3Language(); + + // Sort collected streams + return collectedStreams.values().stream() + .sorted((s1, s2) -> { + // Preferred language comes first + if (s1.getAudioLocale() != null + && s1.getAudioLocale().getISO3Language() + .equals(preferredLanguageOrEnglish)) { + return -1; + } + if (s2.getAudioLocale() != null + && s2.getAudioLocale().getISO3Language() + .equals(preferredLanguageOrEnglish)) { + return 1; + } + + // Sort audio tracks alphabetically + if (s1.getAudioTrackName() != null) { + if (s2.getAudioTrackName() != null) { + return s1.getAudioTrackName().compareTo(s2.getAudioTrackName()); + } else { + return -1; + } + } + return 1; + }) + .collect(Collectors.toList()); + } + /*////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////*/ @@ -300,8 +376,8 @@ static List getSortedStreamVideosList( // Filter out higher resolutions (or not if high resolutions should always be shown) .filter(stream -> showHigherResolutions || !HIGH_RESOLUTION_LIST.contains(stream.getResolution() - // Replace any frame rate with nothing - .replaceAll("p\\d+$", "p"))) + // Replace any frame rate with nothing + .replaceAll("p\\d+$", "p"))) .collect(Collectors.toList()); final HashMap hashMap = new HashMap<>(); diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index b528e4e9bc0..82760be3aa9 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -157,6 +157,22 @@ tools:text="The Video Artist LONG very LONG very Long" /> + + Date: Sat, 18 Mar 2023 14:50:19 +0100 Subject: [PATCH 113/645] feat: improve audio track sorting, add prefer_descriptive_audio option --- .../org/schabi/newpipe/util/ListHelper.java | 53 ++++++++++--------- app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/content_settings.xml | 8 +++ 4 files changed, 39 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index ed1e1e80146..2714337c2fd 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -233,33 +233,16 @@ public static List getFilteredAudioStreams( // Fall back to English if the preferred language was not found final String preferredLanguageOrEnglish = hasPreferredLanguage ? preferredLanguage : Locale.ENGLISH.getISO3Language(); + final SharedPreferences preferences = + PreferenceManager.getDefaultSharedPreferences(context); + final boolean preferDescriptiveAudio = + preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key), + false); + final Comparator trackCmp = + getAudioTrackComparator(preferredLanguageOrEnglish, preferDescriptiveAudio); // Sort collected streams - return collectedStreams.values().stream() - .sorted((s1, s2) -> { - // Preferred language comes first - if (s1.getAudioLocale() != null - && s1.getAudioLocale().getISO3Language() - .equals(preferredLanguageOrEnglish)) { - return -1; - } - if (s2.getAudioLocale() != null - && s2.getAudioLocale().getISO3Language() - .equals(preferredLanguageOrEnglish)) { - return 1; - } - - // Sort audio tracks alphabetically - if (s1.getAudioTrackName() != null) { - if (s2.getAudioTrackName() != null) { - return s1.getAudioTrackName().compareTo(s2.getAudioTrackName()); - } else { - return -1; - } - } - return 1; - }) - .collect(Collectors.toList()); + return collectedStreams.values().stream().sorted(trackCmp).collect(Collectors.toList()); } /*////////////////////////////////////////////////////////////////////////// @@ -680,4 +663,24 @@ public static boolean isMeteredNetwork(@NonNull final Context context) { return manager.isActiveNetworkMetered(); } + + private static Comparator getAudioTrackComparator( + final String preferredLanguage, final boolean preferDescriptiveAudio) { + return Comparator.comparing(AudioStream::getAudioLocale, (o1, o2) -> Boolean.compare( + o1 == null || !o1.getISO3Language().equals(preferredLanguage), + o2 == null || !o2.getISO3Language().equals(preferredLanguage)) + ).thenComparing(AudioStream::isDescriptive, (o1, o2) -> + Boolean.compare(o1 ^ preferDescriptiveAudio, o2 ^ preferDescriptiveAudio) + ).thenComparing(AudioStream::getAudioTrackName, (o1, o2) -> { + if (o1 != null) { + if (o2 != null) { + return o1.compareTo(o2); + } else { + return -1; + } + } else { + return 1; + } + }); + } } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 6a1d5cd459c..9ed34bf26c4 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -260,6 +260,7 @@ show_next_video show_description show_meta_info + prefer_descriptive_audio stream_info_selected_tab show_hold_to_append content_language diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e1c75bba412..9867a8f2173 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -94,6 +94,8 @@ Turn off to hide video description and additional information Show meta info Turn off to hide meta info boxes with additional information about the stream creator, stream content or a search request + Prefer descriptive audio + Select an audio track with descriptions for visually impaired people if available 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 fddb966c847..684b9e55814 100644 --- a/app/src/main/res/xml/content_settings.xml +++ b/app/src/main/res/xml/content_settings.xml @@ -114,6 +114,14 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> + + Date: Sat, 18 Mar 2023 16:14:07 +0100 Subject: [PATCH 114/645] fix: remove todo --- .../main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 3365ade72b1..72d2f0b260a 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -1093,7 +1093,6 @@ private void buildLanguageMenu() { for (int i = 0; i < availableStreams.size(); i++) { final AudioStream audioStream = availableStreams.get(i); - // TODO: ensure that audio streams have track names if (audioStream.getAudioTrackName() == null) { continue; } From 77649d388c01c0fbca3a1fad2399eb79aa5a8cd2 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 18 Mar 2023 16:28:09 +0100 Subject: [PATCH 115/645] fix: reduce complexity --- .../newpipe/player/ui/VideoPlayerUi.java | 91 ++++++++++--------- .../org/schabi/newpipe/util/ListHelper.java | 7 +- 2 files changed, 50 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 72d2f0b260a..13cbc9fd3f8 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -1236,50 +1236,10 @@ public boolean onMenuItemClick(@NonNull final MenuItem menuItem) { } if (menuItem.getGroupId() == POPUP_MENU_ID_QUALITY) { - final int menuItemIndex = menuItem.getItemId(); - @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); - if (currentMetadata == null || currentMetadata.getMaybeQuality().isEmpty()) { - return true; - } - - final MediaItemTag.Quality quality = currentMetadata.getMaybeQuality().get(); - final List availableStreams = quality.getSortedVideoStreams(); - final int selectedStreamIndex = quality.getSelectedVideoStreamIndex(); - if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { - return true; - } - - player.saveStreamProgressState(); //TODO added, check if good - final String newResolution = availableStreams.get(menuItemIndex).getResolution(); - player.setRecovery(); - player.setPlaybackQuality(newResolution); - player.reloadPlayQueueManager(); - - binding.qualityTextView.setText(menuItem.getTitle()); + onQualityItemClick(menuItem); return true; } else if (menuItem.getGroupId() == POPUP_MENU_ID_LANGUAGE) { - final int menuItemIndex = menuItem.getItemId(); - @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); - //noinspection SimplifyOptionalCallChains - if (currentMetadata == null || !currentMetadata.getMaybeAudioLanguage().isPresent()) { - return true; - } - - final MediaItemTag.AudioLanguage language = - currentMetadata.getMaybeAudioLanguage().get(); - final List availableStreams = language.getAudioStreams(); - final int selectedStreamIndex = language.getSelectedAudioStreamIndex(); - if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { - return true; - } - - player.saveStreamProgressState(); - final String newLanguage = availableStreams.get(menuItemIndex).getAudioTrackId(); - player.setRecovery(); - player.setAudioLanguage(newLanguage); - player.reloadPlayQueueManager(); - - binding.languageTextView.setText(menuItem.getTitle()); + onLanguageItemClick(menuItem); return true; } else if (menuItem.getGroupId() == POPUP_MENU_ID_PLAYBACK_SPEED) { final int speedIndex = menuItem.getItemId(); @@ -1292,6 +1252,53 @@ public boolean onMenuItemClick(@NonNull final MenuItem menuItem) { return false; } + private void onQualityItemClick(@NonNull final MenuItem menuItem) { + final int menuItemIndex = menuItem.getItemId(); + @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); + if (currentMetadata == null || currentMetadata.getMaybeQuality().isEmpty()) { + return; + } + + final MediaItemTag.Quality quality = currentMetadata.getMaybeQuality().get(); + final List availableStreams = quality.getSortedVideoStreams(); + final int selectedStreamIndex = quality.getSelectedVideoStreamIndex(); + if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { + return; + } + + player.saveStreamProgressState(); + final String newResolution = availableStreams.get(menuItemIndex).getResolution(); + player.setRecovery(); + player.setPlaybackQuality(newResolution); + player.reloadPlayQueueManager(); + + binding.qualityTextView.setText(menuItem.getTitle()); + } + + private void onLanguageItemClick(@NonNull final MenuItem menuItem) { + final int menuItemIndex = menuItem.getItemId(); + @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); + if (currentMetadata == null || currentMetadata.getMaybeAudioLanguage().isEmpty()) { + return; + } + + final MediaItemTag.AudioLanguage language = + currentMetadata.getMaybeAudioLanguage().get(); + final List availableStreams = language.getAudioStreams(); + final int selectedStreamIndex = language.getSelectedAudioStreamIndex(); + if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { + return; + } + + player.saveStreamProgressState(); + final String newLanguage = availableStreams.get(menuItemIndex).getAudioTrackId(); + player.setRecovery(); + player.setAudioLanguage(newLanguage); + player.reloadPlayQueueManager(); + + binding.languageTextView.setText(menuItem.getTitle()); + } + /** * Called when some popup menu is dismissed. */ diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 2714337c2fd..ef40692d7e2 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -212,12 +212,7 @@ public static List getFilteredAudioStreams( continue; } - final String trackId; - if (stream.getAudioTrackId() != null) { - trackId = stream.getAudioTrackId(); - } else { - trackId = ""; - } + final String trackId = Objects.toString(stream.getAudioTrackId(), ""); final AudioStream presentStream = collectedStreams.get(trackId); if (presentStream == null || cmp.compare(stream, presentStream) > 0) { From 366c39d4c6e52d1c3a9875421d99d38b300bfd0a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 19 Mar 2023 01:15:36 +0100 Subject: [PATCH 116/645] feat: add language selector to audio player --- .../newpipe/player/PlayQueueActivity.java | 89 +++++++++++++++++++ .../org/schabi/newpipe/player/Player.java | 28 +++++- .../player/event/PlayerEventListener.java | 1 + .../player/mediaitem/MediaItemTag.java | 14 +-- .../player/mediaitem/StreamInfoTag.java | 26 ++++-- .../resolver/AudioPlaybackResolver.java | 69 ++++++++------ .../resolver/VideoPlaybackResolver.java | 26 +++--- .../newpipe/player/ui/VideoPlayerUi.java | 66 +++++++------- .../org/schabi/newpipe/util/ListHelper.java | 8 ++ app/src/main/res/layout/player.xml | 2 +- app/src/main/res/menu/menu_play_queue.xml | 8 ++ app/src/main/res/values/strings.xml | 2 + 12 files changed, 241 insertions(+), 98 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index 9ce99c15b4b..fa3668e8b9c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -13,6 +13,7 @@ import android.util.Log; import android.view.Menu; import android.view.MenuItem; +import android.view.SubMenu; import android.view.View; import android.view.ViewGroup; import android.widget.SeekBar; @@ -27,11 +28,13 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.databinding.ActivityPlayerQueueControlBinding; +import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.local.dialog.PlaylistDialog; import org.schabi.newpipe.player.event.PlayerEventListener; import org.schabi.newpipe.player.helper.PlaybackParameterDialog; +import org.schabi.newpipe.player.mediaitem.MediaItemTag; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueueAdapter; import org.schabi.newpipe.player.playqueue.PlayQueueItem; @@ -44,6 +47,10 @@ import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.util.ThemeHelper; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + public final class PlayQueueActivity extends AppCompatActivity implements PlayerEventListener, SeekBar.OnSeekBarChangeListener, View.OnClickListener, PlaybackParameterDialog.Callback { @@ -52,6 +59,8 @@ public final class PlayQueueActivity extends AppCompatActivity private static final int SMOOTH_SCROLL_MAXIMUM_DISTANCE = 80; + private static final int MENU_ID_AUDIO_TRACK = 71; + private Player player; private boolean serviceBound; @@ -97,6 +106,7 @@ public boolean onCreateOptionsMenu(final Menu m) { this.menu = m; getMenuInflater().inflate(R.menu.menu_play_queue, m); getMenuInflater().inflate(R.menu.menu_play_queue_bg, m); + buildAudioTrackMenu(); onMaybeMuteChanged(); // to avoid null reference if (player != null) { @@ -153,6 +163,12 @@ public boolean onOptionsItemSelected(final MenuItem item) { NavigationHelper.playOnBackgroundPlayer(this, player.getPlayQueue(), true); return true; } + + if (item.getGroupId() == MENU_ID_AUDIO_TRACK) { + onAudioTrackClick(item.getItemId()); + return true; + } + return super.onOptionsItemSelected(item); } @@ -591,4 +607,77 @@ private void onMaybeMuteChanged() { item.setIcon(player.isMuted() ? R.drawable.ic_volume_off : R.drawable.ic_volume_up); } } + + @Override + public void onAudioTrackUpdate() { + buildAudioTrackMenu(); + } + + private void buildAudioTrackMenu() { + if (menu == null) { + return; + } + + final MenuItem audioTrackSelector = menu.findItem(R.id.action_audio_track); + final List availableStreams = + Optional.ofNullable(player.getCurrentMetadata()) + .flatMap(MediaItemTag::getMaybeAudioTrack) + .map(MediaItemTag.AudioTrack::getAudioStreams) + .orElse(null); + + if (availableStreams == null || availableStreams.size() < 2) { + audioTrackSelector.setVisible(false); + } else { + final SubMenu audioTrackMenu = audioTrackSelector.getSubMenu(); + audioTrackMenu.clear(); + + for (int i = 0; i < availableStreams.size(); i++) { + final AudioStream audioStream = availableStreams.get(i); + if (audioStream.getAudioTrackName() == null) { + continue; + } + + audioTrackMenu.add(MENU_ID_AUDIO_TRACK, i, Menu.NONE, + audioStream.getAudioTrackName()); + } + + player.getSelectedAudioStream().ifPresent(s -> { + final String trackName = Objects.toString(s.getAudioTrackName(), ""); + audioTrackSelector.setTitle(getString(R.string.play_queue_audio_track) + trackName); + + final String shortName = s.getAudioLocale() != null + ? s.getAudioLocale().getLanguage() : trackName; + audioTrackSelector.setTitleCondensed( + shortName.substring(0, Math.min(shortName.length(), 2))); + audioTrackSelector.setVisible(true); + }); + + } + } + + /** + * Called when an item from the audio track selector is selected. + * + * @param itemId index of the selected item + */ + private void onAudioTrackClick(final int itemId) { + @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); + if (currentMetadata == null || currentMetadata.getMaybeAudioTrack().isEmpty()) { + return; + } + + final MediaItemTag.AudioTrack audioTrack = + currentMetadata.getMaybeAudioTrack().get(); + final List availableStreams = audioTrack.getAudioStreams(); + final int selectedStreamIndex = audioTrack.getSelectedAudioStreamIndex(); + if (selectedStreamIndex == itemId || availableStreams.size() <= itemId) { + return; + } + + player.saveStreamProgressState(); + final String newAudioTrack = availableStreams.get(itemId).getAudioTrackId(); + player.setRecovery(); + player.setAudioTrack(newAudioTrack); + player.reloadPlayQueueManager(); + } } diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 69b1616316c..2d6d23a23f6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -1243,6 +1243,9 @@ public void onEvents(@NonNull final com.google.android.exoplayer2.Player player, } final StreamInfo previousInfo = Optional.ofNullable(currentMetadata) .flatMap(MediaItemTag::getMaybeStreamInfo).orElse(null); + final MediaItemTag.AudioTrack previousAudioTrack = + Optional.ofNullable(currentMetadata) + .flatMap(MediaItemTag::getMaybeAudioTrack).orElse(null); currentMetadata = tag; if (!currentMetadata.getErrors().isEmpty()) { @@ -1263,6 +1266,12 @@ public void onEvents(@NonNull final com.google.android.exoplayer2.Player player, if (previousInfo == null || !previousInfo.getUrl().equals(info.getUrl())) { // only update with the new stream info if it has actually changed updateMetadataWith(info); + } else if (previousAudioTrack == null + || tag.getMaybeAudioTrack() + .map(t -> t.getSelectedAudioStreamIndex() + != previousAudioTrack.getSelectedAudioStreamIndex()) + .orElse(false)) { + notifyAudioTrackUpdateToListeners(); } }); }); @@ -1759,6 +1768,7 @@ private void updateMetadataWith(@NonNull final StreamInfo info) { registerStreamViewed(); notifyMetadataUpdateToListeners(); + notifyAudioTrackUpdateToListeners(); UIs.call(playerUi -> playerUi.onMetadataChanged(info)); } @@ -1890,8 +1900,8 @@ public Optional getSelectedVideoStream() { public Optional getSelectedAudioStream() { return Optional.ofNullable(currentMetadata) - .flatMap(MediaItemTag::getMaybeAudioLanguage) - .map(MediaItemTag.AudioLanguage::getSelectedAudioStream); + .flatMap(MediaItemTag::getMaybeAudioTrack) + .map(MediaItemTag.AudioTrack::getSelectedAudioStream); } //endregion @@ -2024,6 +2034,15 @@ private void notifyProgressUpdateToListeners(final int currentProgress, } } + private void notifyAudioTrackUpdateToListeners() { + if (fragmentListener != null) { + fragmentListener.onAudioTrackUpdate(); + } + if (activityListener != null) { + activityListener.onAudioTrackUpdate(); + } + } + public void useVideoSource(final boolean videoEnabled) { if (playQueue == null || isAudioOnly == !videoEnabled || audioPlayerSelected()) { return; @@ -2185,8 +2204,9 @@ public void setPlaybackQuality(@Nullable final String quality) { videoResolver.setPlaybackQuality(quality); } - public void setAudioLanguage(@Nullable final String language) { - videoResolver.setAudioLanguage(language); + public void setAudioTrack(@Nullable final String audioTrackId) { + videoResolver.setAudioTrack(audioTrackId); + audioResolver.setAudioTrack(audioTrackId); } diff --git a/app/src/main/java/org/schabi/newpipe/player/event/PlayerEventListener.java b/app/src/main/java/org/schabi/newpipe/player/event/PlayerEventListener.java index 84bd9d277b3..2cca259c2f3 100644 --- a/app/src/main/java/org/schabi/newpipe/player/event/PlayerEventListener.java +++ b/app/src/main/java/org/schabi/newpipe/player/event/PlayerEventListener.java @@ -11,5 +11,6 @@ void onPlaybackUpdate(int state, int repeatMode, boolean shuffled, PlaybackParameters parameters); void onProgressUpdate(int currentProgress, int duration, int bufferPercent); void onMetadataUpdate(StreamInfo info, PlayQueue queue); + default void onAudioTrackUpdate() { } void onServiceStopped(); } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java b/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java index 0ef1eaaf134..1119fb903f0 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java @@ -57,7 +57,7 @@ default Optional getMaybeQuality() { } @NonNull - default Optional getMaybeAudioLanguage() { + default Optional getMaybeAudioTrack() { return Optional.empty(); } @@ -135,20 +135,20 @@ public VideoStream getSelectedVideoStream() { } } - final class AudioLanguage { + final class AudioTrack { @NonNull private final List audioStreams; private final int selectedAudioStreamIndex; - private AudioLanguage(@NonNull final List audioStreams, - final int selectedAudioStreamIndex) { + private AudioTrack(@NonNull final List audioStreams, + final int selectedAudioStreamIndex) { this.audioStreams = audioStreams; this.selectedAudioStreamIndex = selectedAudioStreamIndex; } - static AudioLanguage of(@NonNull final List audioStreams, - final int selectedAudioStreamIndex) { - return new AudioLanguage(audioStreams, selectedAudioStreamIndex); + static AudioTrack of(@NonNull final List audioStreams, + final int selectedAudioStreamIndex) { + return new AudioTrack(audioStreams, selectedAudioStreamIndex); } @NonNull diff --git a/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java b/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java index 5379fc5a61e..689f5c72bc6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java @@ -26,17 +26,17 @@ public final class StreamInfoTag implements MediaItemTag { @Nullable private final MediaItemTag.Quality quality; @Nullable - private final MediaItemTag.AudioLanguage audioLanguage; + private final MediaItemTag.AudioTrack audioTrack; @Nullable private final Object extras; private StreamInfoTag(@NonNull final StreamInfo streamInfo, @Nullable final MediaItemTag.Quality quality, - @Nullable final MediaItemTag.AudioLanguage audioLanguage, + @Nullable final MediaItemTag.AudioTrack audioTrack, @Nullable final Object extras) { this.streamInfo = streamInfo; this.quality = quality; - this.audioLanguage = audioLanguage; + this.audioTrack = audioTrack; this.extras = extras; } @@ -46,9 +46,17 @@ public static StreamInfoTag of(@NonNull final StreamInfo streamInfo, @NonNull final List audioStreams, final int selectedAudioStreamIndex) { final Quality quality = Quality.of(sortedVideoStreams, selectedVideoStreamIndex); - final AudioLanguage audioLanguage = - AudioLanguage.of(audioStreams, selectedAudioStreamIndex); - return new StreamInfoTag(streamInfo, quality, audioLanguage, null); + final AudioTrack audioTrack = + AudioTrack.of(audioStreams, selectedAudioStreamIndex); + return new StreamInfoTag(streamInfo, quality, audioTrack, null); + } + + public static StreamInfoTag of(@NonNull final StreamInfo streamInfo, + @NonNull final List audioStreams, + final int selectedAudioStreamIndex) { + final AudioTrack audioTrack = + AudioTrack.of(audioStreams, selectedAudioStreamIndex); + return new StreamInfoTag(streamInfo, null, audioTrack, null); } public static StreamInfoTag of(@NonNull final StreamInfo streamInfo) { @@ -114,8 +122,8 @@ public Optional getMaybeQuality() { @NonNull @Override - public Optional getMaybeAudioLanguage() { - return Optional.ofNullable(audioLanguage); + public Optional getMaybeAudioTrack() { + return Optional.ofNullable(audioTrack); } @Override @@ -125,6 +133,6 @@ public Optional getMaybeExtras(@NonNull final Class type) { @Override public StreamInfoTag withExtras(@NonNull final Object extra) { - return new StreamInfoTag(streamInfo, quality, audioLanguage, extra); + return new StreamInfoTag(streamInfo, quality, audioTrack, extra); } } diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java index e87c9311497..2e7b5c7d550 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.player.resolver; +import static org.schabi.newpipe.util.ListHelper.getFilteredAudioStreams; import static org.schabi.newpipe.util.ListHelper.getNonTorrentStreams; import android.content.Context; @@ -28,6 +29,8 @@ public class AudioPlaybackResolver implements PlaybackResolver { private final Context context; @NonNull private final PlayerDataSource dataSource; + @Nullable + private String audioTrack; public AudioPlaybackResolver(@NonNull final Context context, @NonNull final PlayerDataSource dataSource) { @@ -43,12 +46,36 @@ public MediaSource resolve(@NonNull final StreamInfo info) { return liveSource; } - final Stream stream = getAudioSource(info); - if (stream == null) { - return null; - } + final List audioStreams = + getFilteredAudioStreams(context, info.getAudioStreams()); + final Stream stream; + final MediaItemTag tag; - final MediaItemTag tag = StreamInfoTag.of(info); + if (!audioStreams.isEmpty()) { + int audioIndex = 0; + + if (audioTrack != null) { + for (int i = 0; i < audioStreams.size(); i++) { + final AudioStream audioStream = audioStreams.get(i); + if (audioStream.getAudioTrackId() != null + && audioStream.getAudioTrackId().equals(audioTrack)) { + audioIndex = i; + break; + } + } + } + stream = getStreamForIndex(audioIndex, audioStreams); + tag = StreamInfoTag.of(info, audioStreams, audioIndex); + } else { + final List videoStreams = getNonTorrentStreams(info.getVideoStreams()); + if (!videoStreams.isEmpty()) { + final int index = ListHelper.getDefaultResolutionIndex(context, videoStreams); + stream = getStreamForIndex(index, videoStreams); + tag = StreamInfoTag.of(info); + } else { + return null; + } + } try { return PlaybackResolver.buildMediaSource( @@ -59,29 +86,6 @@ public MediaSource resolve(@NonNull final StreamInfo info) { } } - /** - * Get a stream to be played as audio. If a service has no separate {@link AudioStream}s we - * use a video stream as audio source to support audio background playback. - * - * @param info of the stream - * @return the audio source to use or null if none could be found - */ - @Nullable - private Stream getAudioSource(@NonNull final StreamInfo info) { - final List audioStreams = getNonTorrentStreams(info.getAudioStreams()); - if (!audioStreams.isEmpty()) { - final int index = ListHelper.getDefaultAudioFormat(context, audioStreams); - return getStreamForIndex(index, audioStreams); - } else { - final List videoStreams = getNonTorrentStreams(info.getVideoStreams()); - if (!videoStreams.isEmpty()) { - final int index = ListHelper.getDefaultResolutionIndex(context, videoStreams); - return getStreamForIndex(index, videoStreams); - } - } - return null; - } - @Nullable Stream getStreamForIndex(final int index, @NonNull final List streams) { if (index >= 0 && index < streams.size()) { @@ -89,4 +93,13 @@ Stream getStreamForIndex(final int index, @NonNull final List } return null; } + + @Nullable + public String getAudioTrack() { + return audioTrack; + } + + public void setAudioTrack(@Nullable final String audioLanguage) { + this.audioTrack = audioLanguage; + } } 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 2f0c5932509..64349409dcf 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 @@ -46,7 +46,7 @@ public class VideoPlaybackResolver implements PlaybackResolver { @Nullable private String playbackQuality; @Nullable - private String audioLanguage; + private String audioTrack; public enum SourceType { LIVE_STREAM, @@ -91,11 +91,11 @@ public MediaSource resolve(@NonNull final StreamInfo info) { } int audioIndex = 0; - if (audioLanguage != null) { + if (audioTrack != null) { for (int i = 0; i < audioStreamsList.size(); i++) { final AudioStream stream = audioStreamsList.get(i); if (stream.getAudioTrackId() != null - && stream.getAudioTrackId().equals(audioLanguage)) { + && stream.getAudioTrackId().equals(audioTrack)) { audioIndex = i; break; } @@ -107,8 +107,8 @@ public MediaSource resolve(@NonNull final StreamInfo info) { @Nullable final VideoStream video = tag.getMaybeQuality() .map(MediaItemTag.Quality::getSelectedVideoStream) .orElse(null); - @Nullable final AudioStream audio = tag.getMaybeAudioLanguage() - .map(MediaItemTag.AudioLanguage::getSelectedAudioStream) + @Nullable final AudioStream audio = tag.getMaybeAudioTrack() + .map(MediaItemTag.AudioTrack::getSelectedAudioStream) .orElse(null); if (video != null) { @@ -124,7 +124,7 @@ public MediaSource resolve(@NonNull final StreamInfo info) { // Use the audio stream if there is no video stream, or // merge with audio stream in case if video does not contain audio - if (audio != null && (video == null || video.isVideoOnly() || audioLanguage != null)) { + if (audio != null && (video == null || video.isVideoOnly() || audioTrack != null)) { try { final MediaSource audioSource = PlaybackResolver.buildMediaSource( dataSource, audio, info, PlaybackResolver.cacheKeyOf(info, audio), tag); @@ -198,12 +198,12 @@ public void setPlaybackQuality(@Nullable final String playbackQuality) { } @Nullable - public String getAudioLanguage() { - return audioLanguage; + public String getAudioTrack() { + return audioTrack; } - public void setAudioLanguage(@Nullable final String audioLanguage) { - this.audioLanguage = audioLanguage; + public void setAudioTrack(@Nullable final String audioLanguage) { + this.audioTrack = audioLanguage; } public interface QualityResolver { @@ -211,10 +211,4 @@ public interface QualityResolver { int getOverrideResolutionIndex(List sortedVideos, String playbackQuality); } - - public interface AudioLanguageResolver { - int getDefaultLanguageIndex(List audioStreams); - - int getOverrideLanguageIndex(List audioStreams, String audioLanguage); - } } diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 13cbc9fd3f8..df966d59174 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -118,13 +118,13 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa //////////////////////////////////////////////////////////////////////////*/ private static final int POPUP_MENU_ID_QUALITY = 69; - private static final int POPUP_MENU_ID_LANGUAGE = 70; + private static final int POPUP_MENU_ID_AUDIO_TRACK = 70; private static final int POPUP_MENU_ID_PLAYBACK_SPEED = 79; private static final int POPUP_MENU_ID_CAPTION = 89; protected boolean isSomePopupMenuVisible = false; private PopupMenu qualityPopupMenu; - private PopupMenu languagePopupMenu; + private PopupMenu audioTrackPopupMenu; protected PopupMenu playbackSpeedPopupMenu; private PopupMenu captionPopupMenu; @@ -176,7 +176,7 @@ private void initViews() { R.style.DarkPopupMenu); qualityPopupMenu = new PopupMenu(themeWrapper, binding.qualityTextView); - languagePopupMenu = new PopupMenu(themeWrapper, binding.languageTextView); + audioTrackPopupMenu = new PopupMenu(themeWrapper, binding.audioTrackTextView); playbackSpeedPopupMenu = new PopupMenu(context, binding.playbackSpeed); captionPopupMenu = new PopupMenu(themeWrapper, binding.captionTextView); @@ -194,8 +194,8 @@ private void initViews() { protected void initListeners() { binding.qualityTextView.setOnClickListener(makeOnClickListener(this::onQualityClicked)); - binding.languageTextView.setOnClickListener( - makeOnClickListener(this::onAudioLanguageClicked)); + binding.audioTrackTextView.setOnClickListener( + makeOnClickListener(this::onAudioTracksClicked)); binding.playbackSpeed.setOnClickListener(makeOnClickListener(this::onPlaybackSpeedClicked)); binding.playbackSeekBar.setOnSeekBarChangeListener(this); @@ -272,7 +272,7 @@ protected void initListeners() { protected void deinitListeners() { binding.qualityTextView.setOnClickListener(null); - binding.languageTextView.setOnClickListener(null); + binding.audioTrackTextView.setOnClickListener(null); binding.playbackSpeed.setOnClickListener(null); binding.playbackSeekBar.setOnSeekBarChangeListener(null); binding.captionTextView.setOnClickListener(null); @@ -426,7 +426,7 @@ protected void setupElementsSize(final int buttonsMinWidth, binding.topControls.setPaddingRelative(controlsPad, playerTopPad, controlsPad, 0); binding.bottomControls.setPaddingRelative(controlsPad, 0, controlsPad, 0); binding.qualityTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); - binding.languageTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); + binding.audioTrackTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); binding.playbackSpeed.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); binding.playbackSpeed.setMinimumWidth(buttonsMinWidth); binding.captionTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad); @@ -992,7 +992,7 @@ public void onMetadataChanged(@NonNull final StreamInfo info) { private void updateStreamRelatedViews() { player.getCurrentStreamInfo().ifPresent(info -> { binding.qualityTextView.setVisibility(View.GONE); - binding.languageTextView.setVisibility(View.GONE); + binding.audioTrackTextView.setVisibility(View.GONE); binding.playbackSpeed.setVisibility(View.GONE); binding.playbackEndTime.setVisibility(View.GONE); @@ -1028,7 +1028,7 @@ private void updateStreamRelatedViews() { } buildQualityMenu(); - buildLanguageMenu(); + buildAudioTrackMenu(); binding.qualityTextView.setVisibility(View.VISIBLE); binding.surfaceView.setVisibility(View.VISIBLE); @@ -1077,15 +1077,15 @@ private void buildQualityMenu() { .ifPresent(s -> binding.qualityTextView.setText(s.getResolution())); } - private void buildLanguageMenu() { - if (languagePopupMenu == null) { + private void buildAudioTrackMenu() { + if (audioTrackPopupMenu == null) { return; } - languagePopupMenu.getMenu().removeGroup(POPUP_MENU_ID_LANGUAGE); + audioTrackPopupMenu.getMenu().removeGroup(POPUP_MENU_ID_AUDIO_TRACK); final List availableStreams = Optional.ofNullable(player.getCurrentMetadata()) - .flatMap(MediaItemTag::getMaybeAudioLanguage) - .map(MediaItemTag.AudioLanguage::getAudioStreams) + .flatMap(MediaItemTag::getMaybeAudioTrack) + .map(MediaItemTag.AudioTrack::getAudioStreams) .orElse(null); if (availableStreams == null || availableStreams.size() < 2) { return; @@ -1096,15 +1096,15 @@ private void buildLanguageMenu() { if (audioStream.getAudioTrackName() == null) { continue; } - languagePopupMenu.getMenu().add(POPUP_MENU_ID_LANGUAGE, i, Menu.NONE, + audioTrackPopupMenu.getMenu().add(POPUP_MENU_ID_AUDIO_TRACK, i, Menu.NONE, audioStream.getAudioTrackName()); } player.getSelectedAudioStream() - .ifPresent(s -> binding.languageTextView.setText(s.getAudioTrackName())); - binding.languageTextView.setVisibility(View.VISIBLE); - languagePopupMenu.setOnMenuItemClickListener(this); - languagePopupMenu.setOnDismissListener(this); + .ifPresent(s -> binding.audioTrackTextView.setText(s.getAudioTrackName())); + binding.audioTrackTextView.setVisibility(View.VISIBLE); + audioTrackPopupMenu.setOnMenuItemClickListener(this); + audioTrackPopupMenu.setOnDismissListener(this); } private void buildPlaybackSpeedMenu() { @@ -1215,13 +1215,13 @@ private void onQualityClicked() { .ifPresent(binding.qualityTextView::setText); } - private void onAudioLanguageClicked() { - languagePopupMenu.show(); + private void onAudioTracksClicked() { + audioTrackPopupMenu.show(); isSomePopupMenuVisible = true; player.getSelectedAudioStream() .map(AudioStream::getAudioTrackName) - .ifPresent(binding.languageTextView::setText); + .ifPresent(binding.audioTrackTextView::setText); } /** @@ -1238,8 +1238,8 @@ public boolean onMenuItemClick(@NonNull final MenuItem menuItem) { if (menuItem.getGroupId() == POPUP_MENU_ID_QUALITY) { onQualityItemClick(menuItem); return true; - } else if (menuItem.getGroupId() == POPUP_MENU_ID_LANGUAGE) { - onLanguageItemClick(menuItem); + } else if (menuItem.getGroupId() == POPUP_MENU_ID_AUDIO_TRACK) { + onAudioTrackItemClick(menuItem); return true; } else if (menuItem.getGroupId() == POPUP_MENU_ID_PLAYBACK_SPEED) { final int speedIndex = menuItem.getItemId(); @@ -1275,28 +1275,28 @@ private void onQualityItemClick(@NonNull final MenuItem menuItem) { binding.qualityTextView.setText(menuItem.getTitle()); } - private void onLanguageItemClick(@NonNull final MenuItem menuItem) { + private void onAudioTrackItemClick(@NonNull final MenuItem menuItem) { final int menuItemIndex = menuItem.getItemId(); @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); - if (currentMetadata == null || currentMetadata.getMaybeAudioLanguage().isEmpty()) { + if (currentMetadata == null || currentMetadata.getMaybeAudioTrack().isEmpty()) { return; } - final MediaItemTag.AudioLanguage language = - currentMetadata.getMaybeAudioLanguage().get(); - final List availableStreams = language.getAudioStreams(); - final int selectedStreamIndex = language.getSelectedAudioStreamIndex(); + final MediaItemTag.AudioTrack audioTrack = + currentMetadata.getMaybeAudioTrack().get(); + final List availableStreams = audioTrack.getAudioStreams(); + final int selectedStreamIndex = audioTrack.getSelectedAudioStreamIndex(); if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) { return; } player.saveStreamProgressState(); - final String newLanguage = availableStreams.get(menuItemIndex).getAudioTrackId(); + final String newAudioTrack = availableStreams.get(menuItemIndex).getAudioTrackId(); player.setRecovery(); - player.setAudioLanguage(newLanguage); + player.setAudioTrack(newAudioTrack); player.reloadPlayQueueManager(); - binding.languageTextView.setText(menuItem.getTitle()); + binding.audioTrackTextView.setText(menuItem.getTitle()); } /** diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index ef40692d7e2..a2e8216a37f 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -188,6 +188,14 @@ public static List getSortedStreamVideosList( videoOnlyStreams, ascendingOrder, preferVideoOnlyStreams); } + /** + * Filter the list of audio streams and return a list with the preferred stream for + * each audio track. Streams are sorted with the preferred language in the first position. + * + * @param context the context to search for the track to give preference + * @param audioStreams the list of audio streams + * @return the sorted, filtered list + */ public static List getFilteredAudioStreams( @NonNull final Context context, @Nullable final List audioStreams) { diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 82760be3aa9..89f1ed88e72 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -158,7 +158,7 @@ + +

+ + Remove Details Audio Settings + Audio: + Audio track Hold to enqueue Show channel details Enqueue From 87a88e4df7f6c0040e5bfce735a24d7f8034b20d Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 19 Mar 2023 03:06:29 +0100 Subject: [PATCH 117/645] feat: localized audio track names --- app/build.gradle | 2 +- .../newpipe/player/PlayQueueActivity.java | 32 +++++++------- .../newpipe/player/ui/VideoPlayerUi.java | 13 ++---- .../org/schabi/newpipe/util/ListHelper.java | 11 ++++- .../org/schabi/newpipe/util/Localization.java | 42 +++++++++++++++++++ app/src/main/res/values/strings.xml | 6 ++- 6 files changed, 76 insertions(+), 30 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c0d42381769..a766b16a831 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,7 @@ dependencies { // name and the commit hash with the commit hash of the (pushed) commit you want to test // This works thanks to JitPack: https://jitpack.io/ implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'com.github.TeamNewPipe:NewPipeExtractor:5a9b6ed2e3306b9152cc6689dd61dbbe43483845' + implementation 'com.github.Theta-Dev:NewPipeExtractor:3fb356a7065c75909ee3856a29be92317c295bb9' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index fa3668e8b9c..8c56627ecd5 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -5,6 +5,7 @@ import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; @@ -48,7 +49,6 @@ import org.schabi.newpipe.util.ThemeHelper; import java.util.List; -import java.util.Objects; import java.util.Optional; public final class PlayQueueActivity extends AppCompatActivity @@ -618,14 +618,17 @@ private void buildAudioTrackMenu() { return; } + final Context context = player.getContext(); final MenuItem audioTrackSelector = menu.findItem(R.id.action_audio_track); final List availableStreams = Optional.ofNullable(player.getCurrentMetadata()) .flatMap(MediaItemTag::getMaybeAudioTrack) .map(MediaItemTag.AudioTrack::getAudioStreams) .orElse(null); + final Optional selectedAudioStream = player.getSelectedAudioStream(); - if (availableStreams == null || availableStreams.size() < 2) { + if (availableStreams == null || availableStreams.size() < 2 + || selectedAudioStream.isEmpty()) { audioTrackSelector.setVisible(false); } else { final SubMenu audioTrackMenu = audioTrackSelector.getSubMenu(); @@ -633,25 +636,20 @@ private void buildAudioTrackMenu() { for (int i = 0; i < availableStreams.size(); i++) { final AudioStream audioStream = availableStreams.get(i); - if (audioStream.getAudioTrackName() == null) { - continue; - } - audioTrackMenu.add(MENU_ID_AUDIO_TRACK, i, Menu.NONE, - audioStream.getAudioTrackName()); + Localization.audioTrackName(context, audioStream)); } - player.getSelectedAudioStream().ifPresent(s -> { - final String trackName = Objects.toString(s.getAudioTrackName(), ""); - audioTrackSelector.setTitle(getString(R.string.play_queue_audio_track) + trackName); - - final String shortName = s.getAudioLocale() != null - ? s.getAudioLocale().getLanguage() : trackName; - audioTrackSelector.setTitleCondensed( - shortName.substring(0, Math.min(shortName.length(), 2))); - audioTrackSelector.setVisible(true); - }); + final AudioStream s = selectedAudioStream.get(); + final String trackName = Localization.audioTrackName(context, s); + audioTrackSelector.setTitle( + context.getString(R.string.play_queue_audio_track, trackName)); + final String shortName = s.getAudioLocale() != null + ? s.getAudioLocale().getLanguage() : trackName; + audioTrackSelector.setTitleCondensed( + shortName.substring(0, Math.min(shortName.length(), 2))); + audioTrackSelector.setVisible(true); } } diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index df966d59174..8aff0af878a 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -79,6 +79,7 @@ import org.schabi.newpipe.player.seekbarpreview.SeekbarPreviewThumbnailHelper; import org.schabi.newpipe.player.seekbarpreview.SeekbarPreviewThumbnailHolder; import org.schabi.newpipe.util.DeviceUtils; +import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.external_communication.KoreUtils; import org.schabi.newpipe.util.external_communication.ShareUtils; @@ -1093,15 +1094,13 @@ private void buildAudioTrackMenu() { for (int i = 0; i < availableStreams.size(); i++) { final AudioStream audioStream = availableStreams.get(i); - if (audioStream.getAudioTrackName() == null) { - continue; - } audioTrackPopupMenu.getMenu().add(POPUP_MENU_ID_AUDIO_TRACK, i, Menu.NONE, - audioStream.getAudioTrackName()); + Localization.audioTrackName(context, audioStream)); } player.getSelectedAudioStream() - .ifPresent(s -> binding.audioTrackTextView.setText(s.getAudioTrackName())); + .ifPresent(s -> binding.audioTrackTextView.setText( + Localization.audioTrackName(context, s))); binding.audioTrackTextView.setVisibility(View.VISIBLE); audioTrackPopupMenu.setOnMenuItemClickListener(this); audioTrackPopupMenu.setOnDismissListener(this); @@ -1218,10 +1217,6 @@ private void onQualityClicked() { private void onAudioTracksClicked() { audioTrackPopupMenu.show(); isSomePopupMenuVisible = true; - - player.getSelectedAudioStream() - .map(AudioStream::getAudioTrackName) - .ifPresent(binding.audioTrackTextView::setText); } /** diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index a2e8216a37f..971ee27598e 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -13,6 +13,7 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.AudioTrackType; import org.schabi.newpipe.extractor.stream.DeliveryMethod; import org.schabi.newpipe.extractor.stream.Stream; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -244,8 +245,14 @@ public static List getFilteredAudioStreams( final Comparator trackCmp = getAudioTrackComparator(preferredLanguageOrEnglish, preferDescriptiveAudio); + // Filter unknown audio tracks if there are multiple tracks + java.util.stream.Stream cs = collectedStreams.values().stream(); + if (collectedStreams.size() > 1) { + cs = cs.filter(s -> s.getAudioTrackId() != null); + } + // Sort collected streams - return collectedStreams.values().stream().sorted(trackCmp).collect(Collectors.toList()); + return cs.sorted(trackCmp).collect(Collectors.toList()); } /*////////////////////////////////////////////////////////////////////////// @@ -672,7 +679,7 @@ private static Comparator getAudioTrackComparator( return Comparator.comparing(AudioStream::getAudioLocale, (o1, o2) -> Boolean.compare( o1 == null || !o1.getISO3Language().equals(preferredLanguage), o2 == null || !o2.getISO3Language().equals(preferredLanguage)) - ).thenComparing(AudioStream::isDescriptive, (o1, o2) -> + ).thenComparing(s -> s.getAudioTrackType() == AudioTrackType.DESCRIPTIVE, (o1, o2) -> Boolean.compare(o1 ^ preferDescriptiveAudio, o2 ^ preferDescriptiveAudio) ).thenComparing(AudioStream::getAudioTrackName, (o1, o2) -> { if (o1 != null) { diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java index 916b902f0ba..b4745560c74 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -21,6 +21,7 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.localization.ContentCountry; +import org.schabi.newpipe.extractor.stream.AudioStream; import java.math.BigDecimal; import java.math.RoundingMode; @@ -261,6 +262,47 @@ public static String localizeDuration(final Context context, final int durationI } } + /** + * Get the localized name of an audio track. + *

Example:

+ *

English (original)

+ *

English (descriptive)

+ *

Spanish (dubbed)

+ * + * @param context used to get app language + * @param track a {@link AudioStream} of the track + * @return localized track name + */ + public static String audioTrackName(final Context context, final AudioStream track) { + String res; + + if (track.getAudioLocale() != null) { + res = track.getAudioLocale().getDisplayLanguage(getAppLocale(context)); + } else if (track.getAudioTrackName() != null) { + res = track.getAudioTrackName(); + } else { + res = context.getString(R.string.unknown_audio_track); + } + + if (track.getAudioTrackType() != null) { + res += " ("; + switch (track.getAudioTrackType()) { + case ORIGINAL: + res += context.getString(R.string.track_type_original); + break; + case DUBBED: + res += context.getString(R.string.track_type_dubbed); + break; + case DESCRIPTIVE: + res += context.getString(R.string.track_type_descriptive); + break; + } + res += ")"; + } + + return res; + } + /*////////////////////////////////////////////////////////////////////////// // Pretty Time //////////////////////////////////////////////////////////////////////////*/ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c578eeb2ac..91d618852b1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -413,7 +413,7 @@ Remove Details Audio Settings - Audio: + Audio: %s Audio track Hold to enqueue Show channel details @@ -768,10 +768,14 @@ Select quality for external players Unknown format Unknown quality + Unknown Show future items Hide future items Fully watched Partially watched Upcoming Sort + original + dubbed + descriptive \ No newline at end of file From 7aed2eed8af152edd2713c2ce55c6319d9d31046 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 19 Mar 2023 20:40:27 +0100 Subject: [PATCH 118/645] feat: add prefer original option, improve audio stream ordering --- .../resolver/AudioPlaybackResolver.java | 14 +- .../resolver/VideoPlaybackResolver.java | 14 +- .../org/schabi/newpipe/util/ListHelper.java | 179 +++++++++--------- app/src/main/res/values/settings_keys.xml | 3 +- app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/content_settings.xml | 8 - app/src/main/res/xml/video_audio_settings.xml | 16 ++ 7 files changed, 113 insertions(+), 123 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java index 2e7b5c7d550..e94295724dc 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java @@ -52,18 +52,8 @@ public MediaSource resolve(@NonNull final StreamInfo info) { final MediaItemTag tag; if (!audioStreams.isEmpty()) { - int audioIndex = 0; - - if (audioTrack != null) { - for (int i = 0; i < audioStreams.size(); i++) { - final AudioStream audioStream = audioStreams.get(i); - if (audioStream.getAudioTrackId() != null - && audioStream.getAudioTrackId().equals(audioTrack)) { - audioIndex = i; - break; - } - } - } + final int audioIndex = + ListHelper.getAudioFormatIndex(context, audioStreams, audioTrack); stream = getStreamForIndex(audioIndex, audioStreams); tag = StreamInfoTag.of(info, audioStreams, audioIndex); } else { 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 64349409dcf..4f54657512f 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 @@ -90,18 +90,8 @@ public MediaSource resolve(@NonNull final StreamInfo info) { getPlaybackQuality()); } - int audioIndex = 0; - if (audioTrack != null) { - for (int i = 0; i < audioStreamsList.size(); i++) { - final AudioStream stream = audioStreamsList.get(i); - if (stream.getAudioTrackId() != null - && stream.getAudioTrackId().equals(audioTrack)) { - audioIndex = i; - break; - } - } - } - + final int audioIndex = + ListHelper.getAudioFormatIndex(context, audioStreamsList, audioTrack); final MediaItemTag tag = StreamInfoTag.of(info, videoStreamsList, videoIndex, audioStreamsList, audioIndex); @Nullable final VideoStream video = tag.getMaybeQuality() diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 971ee27598e..1be020eaee1 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -38,11 +38,17 @@ public final class ListHelper { // Audio format in order of quality. 0=lowest quality, n=highest quality private static final List AUDIO_FORMAT_QUALITY_RANKING = List.of(MediaFormat.MP3, MediaFormat.WEBMA, MediaFormat.M4A); - // Audio format in order of efficiency. 0=most efficient, n=least efficient + // Audio format in order of efficiency. 0=least efficient, n=most efficient private static final List AUDIO_FORMAT_EFFICIENCY_RANKING = - List.of(MediaFormat.WEBMA, MediaFormat.M4A, MediaFormat.MP3); + List.of(MediaFormat.MP3, MediaFormat.M4A, MediaFormat.WEBMA); // Use a Set for better performance private static final Set HIGH_RESOLUTION_LIST = Set.of("1440p", "2160p"); + // Audio track types in order of priotity. 0=lowest, n=highest + private static final List AUDIO_TRACK_TYPE_RANKING = + List.of(AudioTrackType.DESCRIPTIVE, AudioTrackType.DUBBED, AudioTrackType.ORIGINAL); + // Audio track types in order of priotity when descriptive audio is preferred. + private static final List AUDIO_TRACK_TYPE_RANKING_DESCRIPTIVE = + List.of(AudioTrackType.ORIGINAL, AudioTrackType.DUBBED, AudioTrackType.DESCRIPTIVE); private ListHelper() { } @@ -104,13 +110,23 @@ public static int getDefaultAudioFormat(final Context context, final MediaFormat defaultFormat = getDefaultFormat(context, R.string.default_audio_format_key, R.string.default_audio_format_value); - // If the user has chosen to limit resolution to conserve mobile data - // usage then we should also limit our audio usage. - if (isLimitingDataUsage(context)) { - return getMostCompactAudioIndex(defaultFormat, audioStreams); - } else { - return getHighestQualityAudioIndex(defaultFormat, audioStreams); + return getAudioIndexByHighestRank(defaultFormat, audioStreams, + getAudioStreamComparator(context)); + } + + public static int getAudioFormatIndex(final Context context, + final List audioStreams, + @Nullable final String trackId) { + if (trackId != null) { + for (int i = 0; i < audioStreams.size(); i++) { + final AudioStream s = audioStreams.get(i); + if (s.getAudioTrackId() != null + && s.getAudioTrackId().equals(trackId)) { + return i; + } + } } + return getDefaultAudioFormat(context, audioStreams); } /** @@ -193,7 +209,7 @@ public static List getSortedStreamVideosList( * Filter the list of audio streams and return a list with the preferred stream for * each audio track. Streams are sorted with the preferred language in the first position. * - * @param context the context to search for the track to give preference + * @param context the context to search for the track to give preference * @param audioStreams the list of audio streams * @return the sorted, filtered list */ @@ -206,15 +222,7 @@ public static List getFilteredAudioStreams( final HashMap collectedStreams = new HashMap<>(); - final Comparator cmp; - if (isLimitingDataUsage(context)) { - cmp = getAudioStreamComparator(AUDIO_FORMAT_EFFICIENCY_RANKING); - } else { - cmp = getAudioStreamComparator(AUDIO_FORMAT_QUALITY_RANKING); - } - - final String preferredLanguage = Localization.getPreferredLocale(context).getISO3Language(); - boolean hasPreferredLanguage = false; + final Comparator cmp = getAudioStreamFormatComparator(context); for (final AudioStream stream : audioStreams) { if (stream.getDeliveryMethod() == DeliveryMethod.TORRENT) { @@ -226,33 +234,18 @@ public static List getFilteredAudioStreams( final AudioStream presentStream = collectedStreams.get(trackId); if (presentStream == null || cmp.compare(stream, presentStream) > 0) { collectedStreams.put(trackId, stream); - - if (stream.getAudioLocale() != null - && stream.getAudioLocale().getISO3Language().equals(preferredLanguage)) { - hasPreferredLanguage = true; - } } } - // Fall back to English if the preferred language was not found - final String preferredLanguageOrEnglish = - hasPreferredLanguage ? preferredLanguage : Locale.ENGLISH.getISO3Language(); - final SharedPreferences preferences = - PreferenceManager.getDefaultSharedPreferences(context); - final boolean preferDescriptiveAudio = - preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key), - false); - final Comparator trackCmp = - getAudioTrackComparator(preferredLanguageOrEnglish, preferDescriptiveAudio); - // Filter unknown audio tracks if there are multiple tracks java.util.stream.Stream cs = collectedStreams.values().stream(); if (collectedStreams.size() > 1) { cs = cs.filter(s -> s.getAudioTrackId() != null); } - // Sort collected streams - return cs.sorted(trackCmp).collect(Collectors.toList()); + // Sort collected streams by name + return cs.sorted(Comparator.comparing(audioStream -> + Localization.audioTrackName(context, audioStream))).collect(Collectors.toList()); } /*////////////////////////////////////////////////////////////////////////// @@ -420,42 +413,6 @@ private static List sortStreamList(final List videoStr return videoStreams; } - /** - * Get the audio from the list with the highest quality. - * Format will be ignored if it yields no results. - * - * @param format The target format type or null if it doesn't matter - * @param audioStreams List of audio streams - * @return Index of audio stream that produces the most compact results or -1 if not found - */ - static int getHighestQualityAudioIndex(@Nullable final MediaFormat format, - @Nullable final List audioStreams) { - return getAudioIndexByHighestRank(format, audioStreams, - // Compares descending (last = highest rank) - getAudioStreamComparator(AUDIO_FORMAT_QUALITY_RANKING)); - } - - /** - * Get the audio from the list with the lowest bitrate and most efficient format. - * Format will be ignored if it yields no results. - * - * @param format The target format type or null if it doesn't matter - * @param audioStreams List of audio streams - * @return Index of audio stream that produces the most compact results or -1 if not found - */ - static int getMostCompactAudioIndex(@Nullable final MediaFormat format, - @Nullable final List audioStreams) { - return getAudioIndexByHighestRank(format, audioStreams, - // The "reversed()" is important -> Compares ascending (first = highest rank) - getAudioStreamComparator(AUDIO_FORMAT_EFFICIENCY_RANKING).reversed()); - } - - private static Comparator getAudioStreamComparator( - final List formatRanking) { - return Comparator.nullsLast(Comparator.comparingInt(AudioStream::getAverageBitrate)) - .thenComparingInt(stream -> formatRanking.indexOf(stream.getFormat())); - } - /** * Get the audio-stream from the list with the highest rank, depending on the comparator. * Format will be ignored if it yields no results. @@ -674,23 +631,65 @@ public static boolean isMeteredNetwork(@NonNull final Context context) { return manager.isActiveNetworkMetered(); } - private static Comparator getAudioTrackComparator( - final String preferredLanguage, final boolean preferDescriptiveAudio) { - return Comparator.comparing(AudioStream::getAudioLocale, (o1, o2) -> Boolean.compare( - o1 == null || !o1.getISO3Language().equals(preferredLanguage), - o2 == null || !o2.getISO3Language().equals(preferredLanguage)) - ).thenComparing(s -> s.getAudioTrackType() == AudioTrackType.DESCRIPTIVE, (o1, o2) -> - Boolean.compare(o1 ^ preferDescriptiveAudio, o2 ^ preferDescriptiveAudio) - ).thenComparing(AudioStream::getAudioTrackName, (o1, o2) -> { - if (o1 != null) { - if (o2 != null) { - return o1.compareTo(o2); - } else { - return -1; - } - } else { - return 1; - } - }); + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. + * + * @param context App context + * @return Comparator + */ + private static Comparator getAudioStreamFormatComparator( + @NonNull final Context context) { + final boolean limitDataUsage = isLimitingDataUsage(context); + final List formatRanking = limitDataUsage + ? AUDIO_FORMAT_EFFICIENCY_RANKING : AUDIO_FORMAT_QUALITY_RANKING; + + Comparator bitrateComparator = + Comparator.comparingInt(AudioStream::getAverageBitrate); + if (limitDataUsage) { + bitrateComparator = bitrateComparator.reversed(); + } + + return bitrateComparator.thenComparingInt( + stream -> formatRanking.indexOf(stream.getFormat())); + } + + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their language, format + * and bitrate. + * + * @param context App context + * @return Comparator + */ + private static Comparator getAudioStreamComparator( + @NonNull final Context context) { + final SharedPreferences preferences = + PreferenceManager.getDefaultSharedPreferences(context); + final boolean preferOriginalAudio = + preferences.getBoolean(context.getString(R.string.prefer_original_audio_key), + false); + final boolean preferDescriptiveAudio = + preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key), + false); + final String preferredLanguage = Localization.getPreferredLocale(context).getISO3Language(); + + final List trackTypeRanking = preferDescriptiveAudio + ? AUDIO_TRACK_TYPE_RANKING_DESCRIPTIVE : AUDIO_TRACK_TYPE_RANKING; + + return Comparator.comparing(AudioStream::getAudioTrackType, (o1, o2) -> { + if (preferOriginalAudio) { + return Boolean.compare( + o1 == AudioTrackType.ORIGINAL, o2 == AudioTrackType.ORIGINAL); + } + return 0; + }).thenComparing(AudioStream::getAudioLocale, + Comparator.nullsFirst(Comparator.comparing( + locale -> locale.getISO3Language().equals(preferredLanguage)))) + .thenComparing(AudioStream::getAudioTrackType, + Comparator.nullsLast(Comparator.comparingInt(trackTypeRanking::indexOf))) + .thenComparing(AudioStream::getAudioLocale, + Comparator.nullsFirst(Comparator.comparing( + locale -> locale.getISO3Language().equals( + Locale.ENGLISH.getISO3Language())))) + .thenComparing(getAudioStreamFormatComparator(context)); } } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 9ed34bf26c4..36dcf2b3304 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -192,6 +192,8 @@ @string/audio_webm_key + prefer_original_audio + prefer_descriptive_audio last_resize_mode @@ -260,7 +262,6 @@ show_next_video show_description show_meta_info - prefer_descriptive_audio stream_info_selected_tab show_hold_to_append content_language diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 91d618852b1..475585879cf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -94,6 +94,8 @@ Turn off to hide video description and additional information Show meta info Turn off to hide meta info boxes with additional information about the stream creator, stream content or a search request + Prefer original audio + Select the original audio track regardless of the language Prefer descriptive audio Select an audio track with descriptions for visually impaired people if available Image cache wiped diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml index 684b9e55814..fddb966c847 100644 --- a/app/src/main/res/xml/content_settings.xml +++ b/app/src/main/res/xml/content_settings.xml @@ -114,14 +114,6 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - - + + + + Date: Sun, 19 Mar 2023 21:05:48 +0100 Subject: [PATCH 119/645] feat: add external audio playback language selector --- .../fragments/detail/VideoDetailFragment.java | 65 ++++++++++++++----- .../newpipe/player/PlayQueueActivity.java | 8 +-- app/src/main/res/values/strings.xml | 1 + 3 files changed, 52 insertions(+), 22 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 7278716c081..4bb418e80e5 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 @@ -164,8 +164,12 @@ public final class VideoDetailFragment private boolean showRelatedItems; private boolean showDescription; private String selectedTabTag; - @AttrRes @NonNull final List tabIcons = new ArrayList<>(); - @StringRes @NonNull final List tabContentDescriptions = new ArrayList<>(); + @AttrRes + @NonNull + final List tabIcons = new ArrayList<>(); + @StringRes + @NonNull + final List tabContentDescriptions = new ArrayList<>(); private boolean tabSettingsChanged = false; private int lastAppBarVerticalOffset = Integer.MAX_VALUE; // prevents useless updates @@ -1042,20 +1046,10 @@ private void openBackgroundPlayer(final boolean append) { player.setRecovery(); } - if (!useExternalAudioPlayer) { - openNormalBackgroundPlayer(append); + if (useExternalAudioPlayer) { + showExternalAudioPlaybackDialog(); } else { - final List audioStreams = getUrlAndNonTorrentStreams( - currentInfo.getAudioStreams()); - final int index = ListHelper.getDefaultAudioFormat(activity, audioStreams); - - if (index == -1) { - Toast.makeText(activity, R.string.no_audio_streams_available_for_external_players, - Toast.LENGTH_SHORT).show(); - return; - } - - startOnExternalPlayer(activity, currentInfo, audioStreams.get(index)); + openNormalBackgroundPlayer(append); } } @@ -1108,7 +1102,7 @@ public void openVideoPlayer(final boolean directlyFullscreenIfApplicable) { if (PreferenceManager.getDefaultSharedPreferences(activity) .getBoolean(this.getString(R.string.use_external_video_player_key), false)) { - showExternalPlaybackDialog(); + showExternalVideoPlaybackDialog(); } else { replaceQueueIfUserConfirms(this::openMainPlayer); } @@ -2102,7 +2096,7 @@ private void showClearingQueueConfirmation(final Runnable onAllow) { }).show(); } - private void showExternalPlaybackDialog() { + private void showExternalVideoPlaybackDialog() { if (currentInfo == null) { return; } @@ -2149,6 +2143,43 @@ private void showExternalPlaybackDialog() { builder.show(); } + private void showExternalAudioPlaybackDialog() { + if (currentInfo == null) { + return; + } + + final List audioStreams = getUrlAndNonTorrentStreams( + currentInfo.getAudioStreams()); + final List audioTracks = + ListHelper.getFilteredAudioStreams(activity, audioStreams); + + if (audioTracks.isEmpty()) { + Toast.makeText(activity, R.string.no_audio_streams_available_for_external_players, + Toast.LENGTH_SHORT).show(); + + } else if (audioTracks.size() == 1) { + startOnExternalPlayer(activity, currentInfo, audioTracks.get(0)); + } else { + final AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle(R.string.select_audio_track_external_players); + + final int selectedAudioStream = + ListHelper.getDefaultAudioFormat(activity, audioTracks); + final CharSequence[] trackNames = audioTracks.stream() + .map(audioStream -> Localization.audioTrackName(activity, audioStream)) + .toArray(CharSequence[]::new); + + builder.setSingleChoiceItems(trackNames, selectedAudioStream, null); + builder.setNegativeButton(R.string.cancel, null); + builder.setPositiveButton(R.string.ok, (dialog, i) -> { + final int index = ((AlertDialog) dialog).getListView().getCheckedItemPosition(); + startOnExternalPlayer(activity, currentInfo, + audioTracks.get(index)); + }); + builder.show(); + } + } + /* * Remove unneeded information while waiting for a next task * */ diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index 8c56627ecd5..fd2128216f1 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -5,7 +5,6 @@ import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage; import android.content.ComponentName; -import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; @@ -618,7 +617,6 @@ private void buildAudioTrackMenu() { return; } - final Context context = player.getContext(); final MenuItem audioTrackSelector = menu.findItem(R.id.action_audio_track); final List availableStreams = Optional.ofNullable(player.getCurrentMetadata()) @@ -637,13 +635,13 @@ private void buildAudioTrackMenu() { for (int i = 0; i < availableStreams.size(); i++) { final AudioStream audioStream = availableStreams.get(i); audioTrackMenu.add(MENU_ID_AUDIO_TRACK, i, Menu.NONE, - Localization.audioTrackName(context, audioStream)); + Localization.audioTrackName(this, audioStream)); } final AudioStream s = selectedAudioStream.get(); - final String trackName = Localization.audioTrackName(context, s); + final String trackName = Localization.audioTrackName(this, s); audioTrackSelector.setTitle( - context.getString(R.string.play_queue_audio_track, trackName)); + getString(R.string.play_queue_audio_track, trackName)); final String shortName = s.getAudioLocale() != null ? s.getAudioLocale().getLanguage() : trackName; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 475585879cf..a4fbba67b80 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -768,6 +768,7 @@ No audio streams are available for external players No video streams are available for external players Select quality for external players + Select audio track for external players Unknown format Unknown quality Unknown From 9b8ffdd2aa9a0c74d6bdd247ada98a9376df802a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 19 Mar 2023 21:20:21 +0100 Subject: [PATCH 120/645] fix: improve track name localization --- .../org/schabi/newpipe/util/Localization.java | 40 ++++++++++--------- app/src/main/res/values/strings.xml | 7 ++-- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java index b4745560c74..9123d377c88 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -11,6 +11,7 @@ import android.util.DisplayMetrics; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.PluralsRes; import androidx.annotation.StringRes; import androidx.core.math.MathUtils; @@ -22,6 +23,7 @@ import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.localization.ContentCountry; import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.AudioTrackType; import java.math.BigDecimal; import java.math.RoundingMode; @@ -274,33 +276,35 @@ public static String localizeDuration(final Context context, final int durationI * @return localized track name */ public static String audioTrackName(final Context context, final AudioStream track) { - String res; - + final String name; if (track.getAudioLocale() != null) { - res = track.getAudioLocale().getDisplayLanguage(getAppLocale(context)); + name = track.getAudioLocale().getDisplayLanguage(getAppLocale(context)); } else if (track.getAudioTrackName() != null) { - res = track.getAudioTrackName(); + name = track.getAudioTrackName(); } else { - res = context.getString(R.string.unknown_audio_track); + name = context.getString(R.string.unknown_audio_track); } if (track.getAudioTrackType() != null) { - res += " ("; - switch (track.getAudioTrackType()) { - case ORIGINAL: - res += context.getString(R.string.track_type_original); - break; - case DUBBED: - res += context.getString(R.string.track_type_dubbed); - break; - case DESCRIPTIVE: - res += context.getString(R.string.track_type_descriptive); - break; + final String trackType = audioTrackType(context, track.getAudioTrackType()); + if (trackType != null) { + return context.getString(R.string.audio_track_name, name, trackType); } - res += ")"; } + return name; + } - return res; + @Nullable + private static String audioTrackType(final Context context, final AudioTrackType trackType) { + switch (trackType) { + case ORIGINAL: + return context.getString(R.string.audio_track_type_original); + case DUBBED: + return context.getString(R.string.audio_track_type_dubbed); + case DESCRIPTIVE: + return context.getString(R.string.audio_track_type_descriptive); + } + return null; } /*////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a4fbba67b80..cc340e99c63 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -778,7 +778,8 @@ Partially watched Upcoming Sort - original - dubbed - descriptive + %s %s + original + dubbed + descriptive \ No newline at end of file From 61a14765f3bc23c93a004df03b063c4c6014706e Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 19 Mar 2023 22:31:31 +0100 Subject: [PATCH 121/645] fix: ListHelper tests --- .../org/schabi/newpipe/util/ListHelper.java | 34 +++-- .../schabi/newpipe/util/ListHelperTest.java | 122 ++++++++++++++---- 2 files changed, 123 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 1be020eaee1..002a8014e79 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -222,7 +222,8 @@ public static List getFilteredAudioStreams( final HashMap collectedStreams = new HashMap<>(); - final Comparator cmp = getAudioStreamFormatComparator(context); + final Comparator cmp = + getAudioStreamFormatComparator(isLimitingDataUsage(context)); for (final AudioStream stream : audioStreams) { if (stream.getDeliveryMethod() == DeliveryMethod.TORRENT) { @@ -422,7 +423,7 @@ private static List sortStreamList(final List videoStr * @param comparator The comparator used for determining the max/best/highest ranked value * @return Index of audio stream that produces the highest ranked result or -1 if not found */ - private static int getAudioIndexByHighestRank(@Nullable final MediaFormat targetedFormat, + static int getAudioIndexByHighestRank(@Nullable final MediaFormat targetedFormat, @Nullable final List audioStreams, final Comparator comparator) { if (audioStreams == null || audioStreams.isEmpty()) { @@ -634,12 +635,11 @@ public static boolean isMeteredNetwork(@NonNull final Context context) { /** * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. * - * @param context App context + * @param limitDataUsage choose low bitrate audio stream * @return Comparator */ private static Comparator getAudioStreamFormatComparator( - @NonNull final Context context) { - final boolean limitDataUsage = isLimitingDataUsage(context); + final boolean limitDataUsage) { final List formatRanking = limitDataUsage ? AUDIO_FORMAT_EFFICIENCY_RANKING : AUDIO_FORMAT_QUALITY_RANKING; @@ -664,14 +664,32 @@ private static Comparator getAudioStreamComparator( @NonNull final Context context) { final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); + final Locale preferredLanguage = Localization.getPreferredLocale(context); final boolean preferOriginalAudio = preferences.getBoolean(context.getString(R.string.prefer_original_audio_key), false); final boolean preferDescriptiveAudio = preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key), false); - final String preferredLanguage = Localization.getPreferredLocale(context).getISO3Language(); + return getAudioStreamComparator(preferredLanguage, preferOriginalAudio, + preferDescriptiveAudio, isLimitingDataUsage(context)); + } + + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their language, format + * and bitrate. + * @param preferredLanguage Preferred audio stream language + * @param preferOriginalAudio Get the original audio track regardless of its language + * @param preferDescriptiveAudio Prefer the descriptive audio track if available + * @param limitDataUsage choose low bitrate audio stream + * @return Comparator + */ + static Comparator getAudioStreamComparator(final Locale preferredLanguage, + final boolean preferOriginalAudio, + final boolean preferDescriptiveAudio, + final boolean limitDataUsage) { + final String langCode = preferredLanguage.getISO3Language(); final List trackTypeRanking = preferDescriptiveAudio ? AUDIO_TRACK_TYPE_RANKING_DESCRIPTIVE : AUDIO_TRACK_TYPE_RANKING; @@ -683,13 +701,13 @@ private static Comparator getAudioStreamComparator( return 0; }).thenComparing(AudioStream::getAudioLocale, Comparator.nullsFirst(Comparator.comparing( - locale -> locale.getISO3Language().equals(preferredLanguage)))) + locale -> locale.getISO3Language().equals(langCode)))) .thenComparing(AudioStream::getAudioTrackType, Comparator.nullsLast(Comparator.comparingInt(trackTypeRanking::indexOf))) .thenComparing(AudioStream::getAudioLocale, Comparator.nullsFirst(Comparator.comparing( locale -> locale.getISO3Language().equals( Locale.ENGLISH.getISO3Language())))) - .thenComparing(getAudioStreamFormatComparator(context)); + .thenComparing(getAudioStreamFormatComparator(limitDataUsage)); } } diff --git a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java index 8a75b1b4e07..173892e5a19 100644 --- a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java +++ b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java @@ -3,10 +3,13 @@ import org.junit.Test; import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.AudioTrackType; import org.schabi.newpipe.extractor.stream.VideoStream; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.Locale; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -29,6 +32,15 @@ public class ListHelperTest { generateAudioStream("mp3-192", MediaFormat.MP3, 192), generateAudioStream("webma-320", MediaFormat.WEBMA, 320)); + private static final List AUDIO_TRACKS_TEST_LIST = List.of( + generateAudioTrack("en.or", "en.or", Locale.ENGLISH, AudioTrackType.ORIGINAL), + generateAudioTrack("en.du", "en.du", Locale.ENGLISH, AudioTrackType.DUBBED), + generateAudioTrack("en.ds", "en.ds", Locale.ENGLISH, AudioTrackType.DESCRIPTIVE), + generateAudioTrack("unknown", null, null, null), + generateAudioTrack("de.du", "de.du", Locale.GERMAN, AudioTrackType.DUBBED), + generateAudioTrack("de.ds", "de.ds", Locale.GERMAN, AudioTrackType.DESCRIPTIVE) + ); + private static final List VIDEO_STREAMS_TEST_LIST = List.of( generateVideoStream("mpeg_4-720", MediaFormat.MPEG_4, "720p", false), generateVideoStream("v3gpp-240", MediaFormat.v3GPP, "240p", false), @@ -199,24 +211,28 @@ public void getDefaultResolutionTest() { @Test public void getHighestQualityAudioFormatTest() { - AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getHighestQualityAudioIndex( - MediaFormat.M4A, AUDIO_STREAMS_TEST_LIST)); + final Comparator cmp = + ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); + AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.M4A, AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(320, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); - stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getHighestQualityAudioIndex( - MediaFormat.WEBMA, AUDIO_STREAMS_TEST_LIST)); + stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.WEBMA, AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(320, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); - stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getHighestQualityAudioIndex( - MediaFormat.MP3, AUDIO_STREAMS_TEST_LIST)); + stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.MP3, AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.MP3, stream.getFormat()); } @Test public void getHighestQualityAudioFormatPreferredAbsent() { + final Comparator cmp = + ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); ////////////////////////////////////////// // Doesn't contain the preferred format // @@ -227,8 +243,8 @@ public void getHighestQualityAudioFormatPreferredAbsent() { generateAudioStream("webma-192", MediaFormat.WEBMA, 192)); // List doesn't contains this format // It should fallback to the highest bitrate audio no matter what format it is - AudioStream stream = testList.get(ListHelper.getHighestQualityAudioIndex( - MediaFormat.MP3, testList)); + AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.MP3, testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); @@ -246,44 +262,53 @@ public void getHighestQualityAudioFormatPreferredAbsent() { generateAudioStream("webma-192-4", MediaFormat.WEBMA, 192))); // List doesn't contains this format, it should fallback to the highest bitrate audio and // the highest quality format. - stream = testList.get(ListHelper.getHighestQualityAudioIndex(MediaFormat.MP3, testList)); + stream = + testList.get(ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); // Adding a new format and bitrate. Adding another stream will have no impact since // it's not a preferred format. testList.add(generateAudioStream("webma-192-5", MediaFormat.WEBMA, 192)); - stream = testList.get(ListHelper.getHighestQualityAudioIndex(MediaFormat.MP3, testList)); + stream = + testList.get(ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); } @Test public void getHighestQualityAudioNull() { - assertEquals(-1, ListHelper.getHighestQualityAudioIndex(null, null)); - assertEquals(-1, ListHelper.getHighestQualityAudioIndex(null, new ArrayList<>())); + final Comparator cmp = + ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, null, cmp)); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, new ArrayList<>(), cmp)); } @Test public void getLowestQualityAudioFormatTest() { - AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getMostCompactAudioIndex( - MediaFormat.M4A, AUDIO_STREAMS_TEST_LIST)); + final Comparator cmp = + ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, true); + + AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.M4A, AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); - stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getMostCompactAudioIndex( - MediaFormat.WEBMA, AUDIO_STREAMS_TEST_LIST)); + stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.WEBMA, AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(64, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); - stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getMostCompactAudioIndex( - MediaFormat.MP3, AUDIO_STREAMS_TEST_LIST)); + stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.MP3, AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(64, stream.getAverageBitrate()); assertEquals(MediaFormat.MP3, stream.getFormat()); } @Test public void getLowestQualityAudioFormatPreferredAbsent() { + final Comparator cmp = + ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, true); ////////////////////////////////////////// // Doesn't contain the preferred format // @@ -294,14 +319,15 @@ public void getLowestQualityAudioFormatPreferredAbsent() { generateAudioStream("webma-192-1", MediaFormat.WEBMA, 192))); // List doesn't contains this format // It should fallback to the most compact audio no matter what format it is. - AudioStream stream = testList.get(ListHelper.getMostCompactAudioIndex( - MediaFormat.MP3, testList)); + AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank( + MediaFormat.MP3, testList, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); // WEBMA is more compact than M4A testList.add(generateAudioStream("webma-192-2", MediaFormat.WEBMA, 128)); - stream = testList.get(ListHelper.getMostCompactAudioIndex(MediaFormat.MP3, testList)); + stream = + testList.get(ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); @@ -318,20 +344,52 @@ public void getLowestQualityAudioFormatPreferredAbsent() { generateAudioStream("m4a-192-3", MediaFormat.M4A, 192))); // List doesn't contain this format // It should fallback to the most compact audio no matter what format it is. - stream = testList.get(ListHelper.getMostCompactAudioIndex(MediaFormat.MP3, testList)); + stream = testList.get( + ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); // Should be same as above - stream = testList.get(ListHelper.getMostCompactAudioIndex(null, testList)); + stream = testList.get( + ListHelper.getAudioIndexByHighestRank(null, testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); } @Test public void getLowestQualityAudioNull() { - assertEquals(-1, ListHelper.getMostCompactAudioIndex(null, null)); - assertEquals(-1, ListHelper.getMostCompactAudioIndex(null, new ArrayList<>())); + final Comparator cmp = + ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, null, cmp)); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, new ArrayList<>(), cmp)); + } + + @Test + public void getAudioTrack() { + // English language + Comparator cmp = + ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); + AudioStream stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + null, AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("en.or", stream.getId()); + + // German language + cmp = ListHelper.getAudioStreamComparator(Locale.GERMAN, false, false, false); + stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + null, AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("de.du", stream.getId()); + + // German language, but prefer original + cmp = ListHelper.getAudioStreamComparator(Locale.GERMAN, true, false, false); + stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + null, AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("en.or", stream.getId()); + + // Prefer descriptive audio + cmp = ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, true, false); + stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + null, AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("en.ds", stream.getId()); } @Test @@ -390,6 +448,20 @@ private static AudioStream generateAudioStream(@NonNull final String id, .build(); } + private static AudioStream generateAudioTrack( + @NonNull final String id, @Nullable final String trackId, + @Nullable final Locale locale, @Nullable final AudioTrackType trackType) { + return new AudioStream.Builder() + .setId(id) + .setContent("", true) + .setMediaFormat(MediaFormat.M4A) + .setAverageBitrate(128) + .setAudioTrackId(trackId) + .setAudioLocale(locale) + .setAudioTrackType(trackType) + .build(); + } + @NonNull private static VideoStream generateVideoStream(@NonNull final String id, @Nullable final MediaFormat mediaFormat, From dbd6e4d11f43e5b4cf69a7db18d11f1605a7cc32 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 19 Mar 2023 22:55:37 +0100 Subject: [PATCH 122/645] fix: sonarcloud lint --- .../newpipe/player/PlayQueueActivity.java | 28 +++++++++---------- .../org/schabi/newpipe/util/ListHelper.java | 5 ++-- .../schabi/newpipe/util/ListHelperTest.java | 6 ++++ 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index fd2128216f1..bf0dc4a56d8 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -657,23 +657,21 @@ private void buildAudioTrackMenu() { * @param itemId index of the selected item */ private void onAudioTrackClick(final int itemId) { - @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata(); - if (currentMetadata == null || currentMetadata.getMaybeAudioTrack().isEmpty()) { - return; - } - - final MediaItemTag.AudioTrack audioTrack = - currentMetadata.getMaybeAudioTrack().get(); - final List availableStreams = audioTrack.getAudioStreams(); - final int selectedStreamIndex = audioTrack.getSelectedAudioStreamIndex(); - if (selectedStreamIndex == itemId || availableStreams.size() <= itemId) { + if (player.getCurrentMetadata() == null) { return; } + player.getCurrentMetadata().getMaybeAudioTrack().ifPresent(audioTrack -> { + final List availableStreams = audioTrack.getAudioStreams(); + final int selectedStreamIndex = audioTrack.getSelectedAudioStreamIndex(); + if (selectedStreamIndex == itemId || availableStreams.size() <= itemId) { + return; + } - player.saveStreamProgressState(); - final String newAudioTrack = availableStreams.get(itemId).getAudioTrackId(); - player.setRecovery(); - player.setAudioTrack(newAudioTrack); - player.reloadPlayQueueManager(); + player.saveStreamProgressState(); + final String newAudioTrack = availableStreams.get(itemId).getAudioTrackId(); + player.setRecovery(); + player.setAudioTrack(newAudioTrack); + player.reloadPlayQueueManager(); + }); } } diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 002a8014e79..68e50b9c1e7 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -239,13 +239,12 @@ public static List getFilteredAudioStreams( } // Filter unknown audio tracks if there are multiple tracks - java.util.stream.Stream cs = collectedStreams.values().stream(); if (collectedStreams.size() > 1) { - cs = cs.filter(s -> s.getAudioTrackId() != null); + collectedStreams.remove(""); } // Sort collected streams by name - return cs.sorted(Comparator.comparing(audioStream -> + return collectedStreams.values().stream().sorted(Comparator.comparing(audioStream -> Localization.audioTrackName(context, audioStream))).collect(Collectors.toList()); } diff --git a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java index 173892e5a19..4619f8ad7df 100644 --- a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java +++ b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java @@ -390,6 +390,12 @@ public void getAudioTrack() { stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( null, AUDIO_TRACKS_TEST_LIST, cmp)); assertEquals("en.ds", stream.getId()); + + // Japanese language, fall back to original + cmp = ListHelper.getAudioStreamComparator(Locale.JAPANESE, true, false, false); + stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( + null, AUDIO_TRACKS_TEST_LIST, cmp)); + assertEquals("en.or", stream.getId()); } @Test From fdd3b03fe5b1848ccf1765d9eabca49b01a98f01 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 19 Mar 2023 23:37:52 +0100 Subject: [PATCH 123/645] fix: audio stream format selection --- .../org/schabi/newpipe/util/ListHelper.java | 78 +++++++++--------- .../schabi/newpipe/util/ListHelperTest.java | 80 +++++++++---------- 2 files changed, 75 insertions(+), 83 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 68e50b9c1e7..0164b708f67 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -107,11 +107,8 @@ public static int getPopupResolutionIndex(final Context context, public static int getDefaultAudioFormat(final Context context, final List audioStreams) { - final MediaFormat defaultFormat = getDefaultFormat(context, - R.string.default_audio_format_key, R.string.default_audio_format_value); - - return getAudioIndexByHighestRank(defaultFormat, audioStreams, - getAudioStreamComparator(context)); + return getAudioIndexByHighestRank(audioStreams, + getAudioTrackComparator(context).thenComparing(getAudioFormatComparator(context))); } public static int getAudioFormatIndex(final Context context, @@ -222,8 +219,7 @@ public static List getFilteredAudioStreams( final HashMap collectedStreams = new HashMap<>(); - final Comparator cmp = - getAudioStreamFormatComparator(isLimitingDataUsage(context)); + final Comparator cmp = getAudioFormatComparator(context); for (final AudioStream stream : audioStreams) { if (stream.getDeliveryMethod() == DeliveryMethod.TORRENT) { @@ -417,32 +413,18 @@ private static List sortStreamList(final List videoStr * Get the audio-stream from the list with the highest rank, depending on the comparator. * Format will be ignored if it yields no results. * - * @param targetedFormat The target format type or null if it doesn't matter * @param audioStreams List of audio streams * @param comparator The comparator used for determining the max/best/highest ranked value * @return Index of audio stream that produces the highest ranked result or -1 if not found */ - static int getAudioIndexByHighestRank(@Nullable final MediaFormat targetedFormat, - @Nullable final List audioStreams, - final Comparator comparator) { + static int getAudioIndexByHighestRank(@Nullable final List audioStreams, + final Comparator comparator) { if (audioStreams == null || audioStreams.isEmpty()) { return -1; } final AudioStream highestRankedAudioStream = audioStreams.stream() - .filter(audioStream -> targetedFormat == null - || audioStream.getFormat() == targetedFormat) - .max(comparator) - .orElse(null); - - if (highestRankedAudioStream == null) { - // Fallback: Ignore targetedFormat if not null - if (targetedFormat != null) { - return getAudioIndexByHighestRank(null, audioStreams, comparator); - } - // targetedFormat is already null -> return -1 - return -1; - } + .max(comparator).orElse(null); return audioStreams.indexOf(highestRankedAudioStream); } @@ -631,14 +613,27 @@ public static boolean isMeteredNetwork(@NonNull final Context context) { return manager.isActiveNetworkMetered(); } + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. + * @param context app context + * @return Comparator + */ + private static Comparator getAudioFormatComparator( + final @NonNull Context context) { + final MediaFormat defaultFormat = getDefaultFormat(context, + R.string.default_audio_format_key, R.string.default_audio_format_value); + return getAudioFormatComparator(defaultFormat, isLimitingDataUsage(context)); + } + /** * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. * + * @param defaultFormat the default format to look for * @param limitDataUsage choose low bitrate audio stream * @return Comparator */ - private static Comparator getAudioStreamFormatComparator( - final boolean limitDataUsage) { + static Comparator getAudioFormatComparator( + @Nullable final MediaFormat defaultFormat, final boolean limitDataUsage) { final List formatRanking = limitDataUsage ? AUDIO_FORMAT_EFFICIENCY_RANKING : AUDIO_FORMAT_QUALITY_RANKING; @@ -648,18 +643,22 @@ private static Comparator getAudioStreamFormatComparator( bitrateComparator = bitrateComparator.reversed(); } - return bitrateComparator.thenComparingInt( + return Comparator.comparing(AudioStream::getFormat, (o1, o2) -> { + if (defaultFormat != null) { + return Boolean.compare(o1 == defaultFormat, o2 == defaultFormat); + } + return 0; + }).thenComparing(bitrateComparator).thenComparingInt( stream -> formatRanking.indexOf(stream.getFormat())); } /** - * Get a {@link Comparator} to compare {@link AudioStream}s by their language, format - * and bitrate. + * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks. * * @param context App context * @return Comparator */ - private static Comparator getAudioStreamComparator( + private static Comparator getAudioTrackComparator( @NonNull final Context context) { final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); @@ -671,23 +670,21 @@ private static Comparator getAudioStreamComparator( preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key), false); - return getAudioStreamComparator(preferredLanguage, preferOriginalAudio, - preferDescriptiveAudio, isLimitingDataUsage(context)); + return getAudioTrackComparator(preferredLanguage, preferOriginalAudio, + preferDescriptiveAudio); } /** - * Get a {@link Comparator} to compare {@link AudioStream}s by their language, format - * and bitrate. + * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks. + * * @param preferredLanguage Preferred audio stream language * @param preferOriginalAudio Get the original audio track regardless of its language * @param preferDescriptiveAudio Prefer the descriptive audio track if available - * @param limitDataUsage choose low bitrate audio stream * @return Comparator */ - static Comparator getAudioStreamComparator(final Locale preferredLanguage, - final boolean preferOriginalAudio, - final boolean preferDescriptiveAudio, - final boolean limitDataUsage) { + static Comparator getAudioTrackComparator( + final Locale preferredLanguage, final boolean preferOriginalAudio, + final boolean preferDescriptiveAudio) { final String langCode = preferredLanguage.getISO3Language(); final List trackTypeRanking = preferDescriptiveAudio ? AUDIO_TRACK_TYPE_RANKING_DESCRIPTIVE : AUDIO_TRACK_TYPE_RANKING; @@ -706,7 +703,6 @@ static Comparator getAudioStreamComparator(final Locale preferredLa .thenComparing(AudioStream::getAudioLocale, Comparator.nullsFirst(Comparator.comparing( locale -> locale.getISO3Language().equals( - Locale.ENGLISH.getISO3Language())))) - .thenComparing(getAudioStreamFormatComparator(limitDataUsage)); + Locale.ENGLISH.getISO3Language())))); } } diff --git a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java index 4619f8ad7df..b4a4167cf02 100644 --- a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java +++ b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java @@ -211,20 +211,21 @@ public void getDefaultResolutionTest() { @Test public void getHighestQualityAudioFormatTest() { - final Comparator cmp = - ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); + Comparator cmp = ListHelper.getAudioFormatComparator(MediaFormat.M4A, false); AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.M4A, AUDIO_STREAMS_TEST_LIST, cmp)); + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(320, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); + cmp = ListHelper.getAudioFormatComparator(MediaFormat.WEBMA, false); stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.WEBMA, AUDIO_STREAMS_TEST_LIST, cmp)); + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(320, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); + cmp = ListHelper.getAudioFormatComparator(MediaFormat.MP3, false); stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.MP3, AUDIO_STREAMS_TEST_LIST, cmp)); + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.MP3, stream.getFormat()); } @@ -232,7 +233,7 @@ public void getHighestQualityAudioFormatTest() { @Test public void getHighestQualityAudioFormatPreferredAbsent() { final Comparator cmp = - ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); + ListHelper.getAudioFormatComparator(MediaFormat.MP3, false); ////////////////////////////////////////// // Doesn't contain the preferred format // @@ -243,8 +244,7 @@ public void getHighestQualityAudioFormatPreferredAbsent() { generateAudioStream("webma-192", MediaFormat.WEBMA, 192)); // List doesn't contains this format // It should fallback to the highest bitrate audio no matter what format it is - AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.MP3, testList, cmp)); + AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); @@ -263,7 +263,7 @@ public void getHighestQualityAudioFormatPreferredAbsent() { // List doesn't contains this format, it should fallback to the highest bitrate audio and // the highest quality format. stream = - testList.get(ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); + testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); @@ -271,44 +271,42 @@ public void getHighestQualityAudioFormatPreferredAbsent() { // it's not a preferred format. testList.add(generateAudioStream("webma-192-5", MediaFormat.WEBMA, 192)); stream = - testList.get(ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); + testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); } @Test public void getHighestQualityAudioNull() { - final Comparator cmp = - ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); - assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, null, cmp)); - assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, new ArrayList<>(), cmp)); + final Comparator cmp = ListHelper.getAudioFormatComparator(null, false); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, cmp)); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(new ArrayList<>(), cmp)); } @Test public void getLowestQualityAudioFormatTest() { - final Comparator cmp = - ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, true); - + Comparator cmp = ListHelper.getAudioFormatComparator(MediaFormat.M4A, true); AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.M4A, AUDIO_STREAMS_TEST_LIST, cmp)); + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); + cmp = ListHelper.getAudioFormatComparator(MediaFormat.WEBMA, true); stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.WEBMA, AUDIO_STREAMS_TEST_LIST, cmp)); + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(64, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); + cmp = ListHelper.getAudioFormatComparator(MediaFormat.MP3, true); stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.MP3, AUDIO_STREAMS_TEST_LIST, cmp)); + AUDIO_STREAMS_TEST_LIST, cmp)); assertEquals(64, stream.getAverageBitrate()); assertEquals(MediaFormat.MP3, stream.getFormat()); } @Test public void getLowestQualityAudioFormatPreferredAbsent() { - final Comparator cmp = - ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, true); + Comparator cmp = ListHelper.getAudioFormatComparator(MediaFormat.MP3, true); ////////////////////////////////////////// // Doesn't contain the preferred format // @@ -319,15 +317,13 @@ public void getLowestQualityAudioFormatPreferredAbsent() { generateAudioStream("webma-192-1", MediaFormat.WEBMA, 192))); // List doesn't contains this format // It should fallback to the most compact audio no matter what format it is. - AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank( - MediaFormat.MP3, testList, cmp)); + AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.M4A, stream.getFormat()); // WEBMA is more compact than M4A testList.add(generateAudioStream("webma-192-2", MediaFormat.WEBMA, 128)); - stream = - testList.get(ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); + stream = testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(128, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); @@ -345,56 +341,56 @@ public void getLowestQualityAudioFormatPreferredAbsent() { // List doesn't contain this format // It should fallback to the most compact audio no matter what format it is. stream = testList.get( - ListHelper.getAudioIndexByHighestRank(MediaFormat.MP3, testList, cmp)); + ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); // Should be same as above + cmp = ListHelper.getAudioFormatComparator(null, true); stream = testList.get( - ListHelper.getAudioIndexByHighestRank(null, testList, cmp)); + ListHelper.getAudioIndexByHighestRank(testList, cmp)); assertEquals(192, stream.getAverageBitrate()); assertEquals(MediaFormat.WEBMA, stream.getFormat()); } @Test public void getLowestQualityAudioNull() { - final Comparator cmp = - ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); - assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, null, cmp)); - assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, new ArrayList<>(), cmp)); + final Comparator cmp = ListHelper.getAudioFormatComparator(null, false); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, cmp)); + assertEquals(-1, ListHelper.getAudioIndexByHighestRank(new ArrayList<>(), cmp)); } @Test public void getAudioTrack() { // English language Comparator cmp = - ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, false, false); + ListHelper.getAudioTrackComparator(Locale.ENGLISH, false, false); AudioStream stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - null, AUDIO_TRACKS_TEST_LIST, cmp)); + AUDIO_TRACKS_TEST_LIST, cmp)); assertEquals("en.or", stream.getId()); // German language - cmp = ListHelper.getAudioStreamComparator(Locale.GERMAN, false, false, false); + cmp = ListHelper.getAudioTrackComparator(Locale.GERMAN, false, false); stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - null, AUDIO_TRACKS_TEST_LIST, cmp)); + AUDIO_TRACKS_TEST_LIST, cmp)); assertEquals("de.du", stream.getId()); // German language, but prefer original - cmp = ListHelper.getAudioStreamComparator(Locale.GERMAN, true, false, false); + cmp = ListHelper.getAudioTrackComparator(Locale.GERMAN, true, false); stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - null, AUDIO_TRACKS_TEST_LIST, cmp)); + AUDIO_TRACKS_TEST_LIST, cmp)); assertEquals("en.or", stream.getId()); // Prefer descriptive audio - cmp = ListHelper.getAudioStreamComparator(Locale.ENGLISH, false, true, false); + cmp = ListHelper.getAudioTrackComparator(Locale.ENGLISH, false, true); stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - null, AUDIO_TRACKS_TEST_LIST, cmp)); + AUDIO_TRACKS_TEST_LIST, cmp)); assertEquals("en.ds", stream.getId()); // Japanese language, fall back to original - cmp = ListHelper.getAudioStreamComparator(Locale.JAPANESE, true, false, false); + cmp = ListHelper.getAudioTrackComparator(Locale.JAPANESE, true, false); stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank( - null, AUDIO_TRACKS_TEST_LIST, cmp)); + AUDIO_TRACKS_TEST_LIST, cmp)); assertEquals("en.or", stream.getId()); } From ed06f559aed1a466c2b659474a5f0b5719f224db Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 20 Mar 2023 14:12:08 +0100 Subject: [PATCH 124/645] feat: add track selection to downloader --- app/build.gradle | 2 +- .../newpipe/download/DownloadDialog.java | 164 +++++++++++++----- .../newpipe/util/AudioTrackAdapter.java | 94 ++++++++++ .../org/schabi/newpipe/util/ListHelper.java | 122 ++++++++++++- app/src/main/res/layout/download_dialog.xml | 36 +++- app/src/main/res/values/strings.xml | 1 + 6 files changed, 362 insertions(+), 57 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/util/AudioTrackAdapter.java diff --git a/app/build.gradle b/app/build.gradle index a766b16a831..e9e1ea1246b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,7 @@ dependencies { // name and the commit hash with the commit hash of the (pushed) commit you want to test // This works thanks to JitPack: https://jitpack.io/ implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'com.github.Theta-Dev:NewPipeExtractor:3fb356a7065c75909ee3856a29be92317c295bb9' + implementation 'com.github.Theta-Dev:NewPipeExtractor:1aa232475e957ce5d2c036406a983db4190ebf2b' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index d1ee0ee881d..5d3679471c5 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -68,6 +68,8 @@ import org.schabi.newpipe.util.SimpleOnSeekBarChangeListener; import org.schabi.newpipe.util.StreamItemAdapter; import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; +import org.schabi.newpipe.util.AudioTrackAdapter; +import org.schabi.newpipe.util.AudioTrackAdapter.AudioTracksWrapper; import org.schabi.newpipe.util.ThemeHelper; import java.io.File; @@ -95,12 +97,14 @@ public class DownloadDialog extends DialogFragment @State StreamInfo currentInfo; @State - StreamSizeWrapper wrappedAudioStreams; - @State StreamSizeWrapper wrappedVideoStreams; @State StreamSizeWrapper wrappedSubtitleStreams; @State + AudioTracksWrapper wrappedAudioTracks; + @State + int selectedAudioStreamIndex; + @State int selectedVideoIndex; // set in the constructor @State int selectedAudioIndex = 0; // default to the first item @@ -117,6 +121,7 @@ public class DownloadDialog extends DialogFragment private Context context; private boolean askForSavePath; + private AudioTrackAdapter audioTrackAdapter; private StreamItemAdapter audioStreamsAdapter; private StreamItemAdapter videoStreamsAdapter; private StreamItemAdapter subtitleStreamsAdapter; @@ -163,18 +168,26 @@ public DownloadDialog() { public DownloadDialog(@NonNull final Context context, @NonNull final StreamInfo info) { this.currentInfo = info; + final List audioStreams = + getStreamsOfSpecifiedDelivery(info.getAudioStreams(), PROGRESSIVE_HTTP); + final List> groupedAudioStreams = + ListHelper.getGroupedAudioStreams(context, audioStreams); + this.wrappedAudioTracks = new AudioTracksWrapper(groupedAudioStreams, context); + this.selectedAudioStreamIndex = + ListHelper.getDefaultAudioTrackGroup(context, groupedAudioStreams); + // TODO: Adapt this code when the downloader support other types of stream deliveries final List videoStreams = ListHelper.getSortedStreamVideosList( context, getStreamsOfSpecifiedDelivery(info.getVideoStreams(), PROGRESSIVE_HTTP), getStreamsOfSpecifiedDelivery(info.getVideoOnlyStreams(), PROGRESSIVE_HTTP), false, - false + // If there are multiple languages available, prefer streams without audio + // to allow language selection + wrappedAudioTracks.size() > 1 ); this.wrappedVideoStreams = new StreamSizeWrapper<>(videoStreams, context); - this.wrappedAudioStreams = new StreamSizeWrapper<>( - getStreamsOfSpecifiedDelivery(info.getAudioStreams(), PROGRESSIVE_HTTP), context); this.wrappedSubtitleStreams = new StreamSizeWrapper<>( getStreamsOfSpecifiedDelivery(info.getSubtitles(), PROGRESSIVE_HTTP), context); @@ -212,33 +225,9 @@ public void onCreate(@Nullable final Bundle savedInstanceState) { setStyle(STYLE_NO_TITLE, ThemeHelper.getDialogTheme(context)); Icepick.restoreInstanceState(this, savedInstanceState); - final var secondaryStreams = new SparseArrayCompat>(4); - final List videoStreams = wrappedVideoStreams.getStreamsList(); - - for (int i = 0; i < videoStreams.size(); i++) { - if (!videoStreams.get(i).isVideoOnly()) { - continue; - } - final AudioStream audioStream = SecondaryStreamHelper - .getAudioStreamFor(wrappedAudioStreams.getStreamsList(), videoStreams.get(i)); - - if (audioStream != null) { - secondaryStreams.append(i, new SecondaryStreamHelper<>(wrappedAudioStreams, - audioStream)); - } else if (DEBUG) { - final MediaFormat mediaFormat = videoStreams.get(i).getFormat(); - if (mediaFormat != null) { - Log.w(TAG, "No audio stream candidates for video format " - + mediaFormat.name()); - } else { - Log.w(TAG, "No audio stream candidates for unknown video format"); - } - } - } - - this.videoStreamsAdapter = new StreamItemAdapter<>(wrappedVideoStreams, secondaryStreams); - this.audioStreamsAdapter = new StreamItemAdapter<>(wrappedAudioStreams); + this.audioTrackAdapter = new AudioTrackAdapter(wrappedAudioTracks); this.subtitleStreamsAdapter = new StreamItemAdapter<>(wrappedSubtitleStreams); + updateSecondaryStreams(); final Intent intent = new Intent(context, DownloadManagerService.class); context.startService(intent); @@ -265,6 +254,38 @@ public void onServiceDisconnected(final ComponentName name) { }, Context.BIND_AUTO_CREATE); } + /** + * Update the displayed video streams based on the selected audio track. + */ + private void updateSecondaryStreams() { + final StreamSizeWrapper audioStreams = getWrappedAudioStreams(); + final var secondaryStreams = new SparseArrayCompat>(4); + final List videoStreams = wrappedVideoStreams.getStreamsList(); + + for (int i = 0; i < videoStreams.size(); i++) { + if (!videoStreams.get(i).isVideoOnly()) { + continue; + } + final AudioStream audioStream = SecondaryStreamHelper + .getAudioStreamFor(audioStreams.getStreamsList(), videoStreams.get(i)); + + if (audioStream != null) { + secondaryStreams.append(i, new SecondaryStreamHelper<>(audioStreams, audioStream)); + } else if (DEBUG) { + final MediaFormat mediaFormat = videoStreams.get(i).getFormat(); + if (mediaFormat != null) { + Log.w(TAG, "No audio stream candidates for video format " + + mediaFormat.name()); + } else { + Log.w(TAG, "No audio stream candidates for unknown video format"); + } + } + } + + this.videoStreamsAdapter = new StreamItemAdapter<>(wrappedVideoStreams, secondaryStreams); + this.audioStreamsAdapter = new StreamItemAdapter<>(audioStreams); + } + @Override public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container, @@ -285,13 +306,13 @@ public void onViewCreated(@NonNull final View view, dialogBinding.fileName.setText(FilenameUtils.createFilename(getContext(), currentInfo.getName())); - selectedAudioIndex = ListHelper - .getDefaultAudioFormat(getContext(), wrappedAudioStreams.getStreamsList()); + selectedAudioIndex = ListHelper.getDefaultAudioFormat(getContext(), + getWrappedAudioStreams().getStreamsList()); selectedSubtitleIndex = getSubtitleIndexBy(subtitleStreamsAdapter.getAll()); dialogBinding.qualitySpinner.setOnItemSelectedListener(this); - + dialogBinding.audioTrackSpinner.setOnItemSelectedListener(this); dialogBinding.videoAudioGroup.setOnCheckedChangeListener(this); initToolbar(dialogBinding.toolbarLayout.toolbar); @@ -383,7 +404,7 @@ private void fetchStreamsSize() { new ErrorInfo(throwable, UserAction.DOWNLOAD_OPEN_DIALOG, "Downloading video stream size", currentInfo.getServiceId())))); - disposables.add(StreamSizeWrapper.fetchSizeForWrapper(wrappedAudioStreams) + disposables.add(StreamSizeWrapper.fetchSizeForWrapper(getWrappedAudioStreams()) .subscribe(result -> { if (dialogBinding.videoAudioGroup.getCheckedRadioButtonId() == R.id.audio_button) { @@ -405,14 +426,29 @@ private void fetchStreamsSize() { currentInfo.getServiceId())))); } + private void setupAudioTrackSpinner() { + if (getContext() == null) { + return; + } + + dialogBinding.audioTrackSpinner.setAdapter(audioTrackAdapter); + dialogBinding.audioTrackSpinner.setSelection(selectedAudioStreamIndex); + + dialogBinding.audioStreamSpinner.setAdapter(audioStreamsAdapter); + dialogBinding.audioStreamSpinner.setSelection(selectedAudioIndex); + } + private void setupAudioSpinner() { if (getContext() == null) { return; } - dialogBinding.qualitySpinner.setAdapter(audioStreamsAdapter); - dialogBinding.qualitySpinner.setSelection(selectedAudioIndex); + dialogBinding.qualitySpinner.setVisibility(View.GONE); setRadioButtonsState(true); + dialogBinding.audioStreamSpinner.setVisibility(View.VISIBLE); + dialogBinding.audioTrackSpinner.setVisibility( + wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); + dialogBinding.defaultAudioTrackPresentText.setVisibility(View.GONE); } private void setupVideoSpinner() { @@ -422,7 +458,21 @@ private void setupVideoSpinner() { dialogBinding.qualitySpinner.setAdapter(videoStreamsAdapter); dialogBinding.qualitySpinner.setSelection(selectedVideoIndex); + dialogBinding.qualitySpinner.setVisibility(View.VISIBLE); setRadioButtonsState(true); + dialogBinding.audioStreamSpinner.setVisibility(View.GONE); + onVideoStreamSelected(); + } + + private void onVideoStreamSelected() { + final boolean isVideoOnly = videoStreamsAdapter.getItem(selectedVideoIndex).isVideoOnly(); + + dialogBinding.audioTrackSpinner.setVisibility( + isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); + dialogBinding.defaultAudioTrackPresentText.setVisibility( + !isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE + + ); } private void setupSubtitleSpinner() { @@ -432,7 +482,11 @@ private void setupSubtitleSpinner() { dialogBinding.qualitySpinner.setAdapter(subtitleStreamsAdapter); dialogBinding.qualitySpinner.setSelection(selectedSubtitleIndex); + dialogBinding.qualitySpinner.setVisibility(View.VISIBLE); setRadioButtonsState(true); + dialogBinding.audioStreamSpinner.setVisibility(View.GONE); + dialogBinding.audioTrackSpinner.setVisibility(View.GONE); + dialogBinding.defaultAudioTrackPresentText.setVisibility(View.GONE); } @@ -550,18 +604,27 @@ public void onItemSelected(final AdapterView parent, + "parent = [" + parent + "], view = [" + view + "], " + "position = [" + position + "], id = [" + id + "]"); } - switch (dialogBinding.videoAudioGroup.getCheckedRadioButtonId()) { - case R.id.audio_button: - selectedAudioIndex = position; - break; - case R.id.video_button: - selectedVideoIndex = position; + + switch (parent.getId()) { + case R.id.quality_spinner: + switch (dialogBinding.videoAudioGroup.getCheckedRadioButtonId()) { + case R.id.video_button: + selectedVideoIndex = position; + onVideoStreamSelected(); + break; + case R.id.subtitle_button: + selectedSubtitleIndex = position; + break; + } + onItemSelectedSetFileName(); break; - case R.id.subtitle_button: - selectedSubtitleIndex = position; + case R.id.audio_track_spinner: + selectedAudioStreamIndex = position; + updateSecondaryStreams(); break; + case R.id.audio_stream_spinner: + selectedAudioIndex = position; } - onItemSelectedSetFileName(); } private void onItemSelectedSetFileName() { @@ -607,6 +670,7 @@ public void onNothingSelected(final AdapterView parent) { protected void setupDownloadOptions() { setRadioButtonsState(false); + setupAudioTrackSpinner(); final boolean isVideoStreamsAvailable = videoStreamsAdapter.getCount() > 0; final boolean isAudioStreamsAvailable = audioStreamsAdapter.getCount() > 0; @@ -657,6 +721,13 @@ private void setRadioButtonsState(final boolean enabled) { dialogBinding.subtitleButton.setEnabled(enabled); } + private StreamSizeWrapper getWrappedAudioStreams() { + if (selectedAudioStreamIndex < 0 || selectedAudioStreamIndex > wrappedAudioTracks.size()) { + return StreamSizeWrapper.empty(); + } + return wrappedAudioTracks.getTracksList().get(selectedAudioStreamIndex); + } + private int getSubtitleIndexBy(@NonNull final List streams) { final Localization preferredLocalization = NewPipe.getPreferredLocalization(); @@ -1013,7 +1084,6 @@ private void continueSelectedDownload(@NonNull final StoredFileHelper storage) { psName = Postprocessing.ALGORITHM_WEBM_MUXER; } - psArgs = null; final long videoSize = wrappedVideoStreams.getSizeInBytes( (VideoStream) selectedStream); diff --git a/app/src/main/java/org/schabi/newpipe/util/AudioTrackAdapter.java b/app/src/main/java/org/schabi/newpipe/util/AudioTrackAdapter.java new file mode 100644 index 00000000000..39a05acb313 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/AudioTrackAdapter.java @@ -0,0 +1,94 @@ +package org.schabi.newpipe.util; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; + +/** + * A list adapter for groups of {@link AudioStream}s (audio tracks). + */ +public class AudioTrackAdapter extends BaseAdapter { + private final AudioTracksWrapper tracksWrapper; + + public AudioTrackAdapter(final AudioTracksWrapper tracksWrapper) { + this.tracksWrapper = tracksWrapper; + } + + @Override + public int getCount() { + return tracksWrapper.size(); + } + + @Override + public List getItem(final int position) { + return tracksWrapper.getTracksList().get(position).getStreamsList(); + } + + @Override + public long getItemId(final int position) { + return position; + } + + @Override + public View getView(final int position, final View convertView, final ViewGroup parent) { + final var context = parent.getContext(); + final View view; + if (convertView == null) { + view = LayoutInflater.from(context).inflate( + R.layout.stream_quality_item, parent, false); + } else { + view = convertView; + } + + final ImageView woSoundIconView = view.findViewById(R.id.wo_sound_icon); + final TextView formatNameView = view.findViewById(R.id.stream_format_name); + final TextView qualityView = view.findViewById(R.id.stream_quality); + final TextView sizeView = view.findViewById(R.id.stream_size); + + final List streams = getItem(position); + final AudioStream stream = streams.get(0); + + woSoundIconView.setVisibility(View.GONE); + sizeView.setVisibility(View.VISIBLE); + + if (stream.getAudioTrackId() != null) { + formatNameView.setText(stream.getAudioTrackId()); + } + qualityView.setText(Localization.audioTrackName(context, stream)); + + return view; + } + + public static class AudioTracksWrapper implements Serializable { + private final List> tracksList; + + public AudioTracksWrapper(@NonNull final List> groupedAudioStreams, + @Nullable final Context context) { + this.tracksList = groupedAudioStreams.stream().map(streams -> + new StreamSizeWrapper<>(streams, context)).collect(Collectors.toList()); + } + + public List> getTracksList() { + return tracksList; + } + + public int size() { + return tracksList.size(); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 0164b708f67..f8a800b0e29 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -111,6 +111,19 @@ public static int getDefaultAudioFormat(final Context context, getAudioTrackComparator(context).thenComparing(getAudioFormatComparator(context))); } + public static int getDefaultAudioTrackGroup(final Context context, + final List> groupedAudioStreams) { + if (groupedAudioStreams == null || groupedAudioStreams.isEmpty()) { + return -1; + } + + final Comparator cmp = getAudioTrackComparator(context); + final List highestRanked = groupedAudioStreams.stream() + .max((o1, o2) -> cmp.compare(o1.get(0), o2.get(0))) + .orElse(null); + return groupedAudioStreams.indexOf(highestRanked); + } + public static int getAudioFormatIndex(final Context context, final List audioStreams, @Nullable final String trackId) { @@ -240,8 +253,50 @@ public static List getFilteredAudioStreams( } // Sort collected streams by name - return collectedStreams.values().stream().sorted(Comparator.comparing(audioStream -> - Localization.audioTrackName(context, audioStream))).collect(Collectors.toList()); + return collectedStreams.values().stream().sorted(getAudioTrackNameComparator(context)) + .collect(Collectors.toList()); + } + + /** + * Group the list of audioStreams by their track ID and sort the resulting list by track name. + * + * @param context app context to get track names for sorting + * @param audioStreams list of audio streams + * @return list of audio streams lists representing individual tracks + */ + public static List> getGroupedAudioStreams( + @NonNull final Context context, + @Nullable final List audioStreams) { + if (audioStreams == null) { + return Collections.emptyList(); + } + + final HashMap> collectedStreams = new HashMap<>(); + + for (final AudioStream stream : audioStreams) { + final String trackId = Objects.toString(stream.getAudioTrackId(), ""); + if (collectedStreams.containsKey(trackId)) { + collectedStreams.get(trackId).add(stream); + } else { + final List list = new ArrayList<>(); + list.add(stream); + collectedStreams.put(trackId, list); + } + } + + // Filter unknown audio tracks if there are multiple tracks + if (collectedStreams.size() > 1) { + collectedStreams.remove(""); + } + + // Sort tracks alphabetically, sort track streams by quality + final Comparator nameCmp = getAudioTrackNameComparator(context); + final Comparator formatCmp = getAudioFormatComparator(context); + + return collectedStreams.values().stream() + .sorted((o1, o2) -> nameCmp.compare(o1.get(0), o2.get(0))) + .map(streams -> streams.stream().sorted(formatCmp).collect(Collectors.toList())) + .collect(Collectors.toList()); } /*////////////////////////////////////////////////////////////////////////// @@ -413,8 +468,8 @@ private static List sortStreamList(final List videoStr * Get the audio-stream from the list with the highest rank, depending on the comparator. * Format will be ignored if it yields no results. * - * @param audioStreams List of audio streams - * @param comparator The comparator used for determining the max/best/highest ranked value + * @param audioStreams List of audio streams + * @param comparator The comparator used for determining the max/best/highest ranked value * @return Index of audio stream that produces the highest ranked result or -1 if not found */ static int getAudioIndexByHighestRank(@Nullable final List audioStreams, @@ -615,6 +670,9 @@ public static boolean isMeteredNetwork(@NonNull final Context context) { /** * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. + * + *

The prefered stream will be ordered last.

+ * * @param context app context * @return Comparator */ @@ -628,7 +686,9 @@ private static Comparator getAudioFormatComparator( /** * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. * - * @param defaultFormat the default format to look for + *

The prefered stream will be ordered last.

+ * + * @param defaultFormat the default format to look for * @param limitDataUsage choose low bitrate audio stream * @return Comparator */ @@ -655,6 +715,21 @@ static Comparator getAudioFormatComparator( /** * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks. * + *

In this order:

+ *
    + *
  1. If {@code preferOriginalAudio}: is original audio
  2. + *
  3. Language matches {@code preferredLanguage}
  4. + *
  5. + * Track type ranks highest in this order: + * Original > Dubbed > Descriptive + *

    If {@code preferDescriptiveAudio}: + * Descriptive > Dubbed > Original

    + *
  6. + *
  7. Language is English
  8. + *
+ * + *

The prefered track will be ordered last.

+ * * @param context App context * @return Comparator */ @@ -677,8 +752,23 @@ private static Comparator getAudioTrackComparator( /** * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks. * - * @param preferredLanguage Preferred audio stream language - * @param preferOriginalAudio Get the original audio track regardless of its language + *

In this order:

+ *
    + *
  1. If {@code preferOriginalAudio}: is original audio
  2. + *
  3. Language matches {@code preferredLanguage}
  4. + *
  5. + * Track type ranks highest in this order: + * Original > Dubbed > Descriptive + *

    If {@code preferDescriptiveAudio}: + * Descriptive > Dubbed > Original

    + *
  6. + *
  7. Language is English
  8. + *
+ * + *

The prefered track will be ordered last.

+ * + * @param preferredLanguage Preferred audio stream language + * @param preferOriginalAudio Get the original audio track regardless of its language * @param preferDescriptiveAudio Prefer the descriptive audio track if available * @return Comparator */ @@ -699,10 +789,26 @@ static Comparator getAudioTrackComparator( Comparator.nullsFirst(Comparator.comparing( locale -> locale.getISO3Language().equals(langCode)))) .thenComparing(AudioStream::getAudioTrackType, - Comparator.nullsLast(Comparator.comparingInt(trackTypeRanking::indexOf))) + Comparator.nullsFirst(Comparator.comparingInt(trackTypeRanking::indexOf))) .thenComparing(AudioStream::getAudioLocale, Comparator.nullsFirst(Comparator.comparing( locale -> locale.getISO3Language().equals( Locale.ENGLISH.getISO3Language())))); } + + /** + * Get a {@link Comparator} to compare {@link AudioStream}s by their languages and track types + * for alphabetical sorting. + * + * @param context app context for localization + * @return Comparator + */ + private static Comparator getAudioTrackNameComparator( + @NonNull final Context context) { + final Locale appLoc = Localization.getAppLocale(context); + + return Comparator.comparing(AudioStream::getAudioLocale, Comparator.nullsLast( + Comparator.comparing(locale -> locale.getDisplayName(appLoc)))) + .thenComparing(AudioStream::getAudioTrackType); + } } diff --git a/app/src/main/res/layout/download_dialog.xml b/app/src/main/res/layout/download_dialog.xml index 37bbf2b03d4..6b0a36cc8e4 100644 --- a/app/src/main/res/layout/download_dialog.xml +++ b/app/src/main/res/layout/download_dialog.xml @@ -71,11 +71,45 @@ android:minWidth="150dp" tools:listitem="@layout/stream_quality_item" /> + + + + + + ,
Toggle all Streams which are not yet supported by the downloader are not shown + The default audio track should be already present in this stream The selected stream is not supported by external players No audio streams are available for external players No video streams are available for external players From 694418d30dd3bedd817a56687096f892c0904db8 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 21 Mar 2023 16:58:36 +0100 Subject: [PATCH 125/645] fix: update stream sizes when audio track changed --- .../org/schabi/newpipe/download/DownloadDialog.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 5d3679471c5..2295c3c7ade 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -433,9 +433,6 @@ private void setupAudioTrackSpinner() { dialogBinding.audioTrackSpinner.setAdapter(audioTrackAdapter); dialogBinding.audioTrackSpinner.setSelection(selectedAudioStreamIndex); - - dialogBinding.audioStreamSpinner.setAdapter(audioStreamsAdapter); - dialogBinding.audioStreamSpinner.setSelection(selectedAudioIndex); } private void setupAudioSpinner() { @@ -445,6 +442,8 @@ private void setupAudioSpinner() { dialogBinding.qualitySpinner.setVisibility(View.GONE); setRadioButtonsState(true); + dialogBinding.audioStreamSpinner.setAdapter(audioStreamsAdapter); + dialogBinding.audioStreamSpinner.setSelection(selectedAudioIndex); dialogBinding.audioStreamSpinner.setVisibility(View.VISIBLE); dialogBinding.audioTrackSpinner.setVisibility( wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); @@ -619,8 +618,12 @@ public void onItemSelected(final AdapterView parent, onItemSelectedSetFileName(); break; case R.id.audio_track_spinner: + final boolean trackChanged = selectedAudioStreamIndex != position; selectedAudioStreamIndex = position; - updateSecondaryStreams(); + if (trackChanged) { + updateSecondaryStreams(); + fetchStreamsSize(); + } break; case R.id.audio_stream_spinner: selectedAudioIndex = position; From 23178644223a27793c28637de0a303279e0560df Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 23 Mar 2023 15:03:07 +0100 Subject: [PATCH 126/645] Bump ExoPlayer to 2.18.5 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5330516c88b..1417f5973c9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -106,7 +106,7 @@ ext { androidxWorkVersion = '2.7.1' icepickVersion = '3.2.0' - exoPlayerVersion = '2.18.4' + exoPlayerVersion = '2.18.5' googleAutoServiceVersion = '1.0.1' groupieVersion = '2.10.1' markwonVersion = '4.6.2' From 1a8aa8b17eeaee626fe97551270142ade7e0c5d6 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Fri, 24 Mar 2023 23:05:15 +0100 Subject: [PATCH 127/645] Use a system chooser when opening links in browser in the case there is no browser available This change makes the app using the behavior when there is no default browser on Android 11 and lower, by opening a system chooser when there is no browser available (on all Android versions). Also catch any exception when the system chooser cannot be opened and show the "No app on your device can open this" toast in this case, as an `ActivityNotFoundException` could be thrown if no app is available to open a given web link. --- .../external_communication/ShareUtils.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java index 2f50a94ae3c..118b77026a0 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java @@ -86,15 +86,19 @@ public static void openUrlInBrowser(@NonNull final Context context, final String PackageManager.MATCH_DEFAULT_ONLY); } + final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (defaultBrowserInfo == null) { - // No app installed to open a web url - Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG).show(); + // No app installed to open a web URL, but it may be handled by other apps so try + // opening a system chooser for the link in this case (it could be bypassed by the + // system if there is only one app which can open the link or a default app associated + // with the link domain on Android 12 and higher) + openAppChooser(context, intent, true); return; } final String defaultBrowserPackage = defaultBrowserInfo.activityInfo.packageName; - final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (defaultBrowserPackage.equals("android")) { // No browser set as default (doesn't work on some devices) @@ -205,7 +209,12 @@ private static void openAppChooser(@NonNull final Context context, chooserIntent.addFlags(permFlags); } } - context.startActivity(chooserIntent); + + try { + context.startActivity(chooserIntent); + } catch (final ActivityNotFoundException e) { + Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG).show(); + } } /** From 39a5c8bdfb08a9e5b60b479dbd9968efd331687a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 29 Mar 2023 13:39:29 +0200 Subject: [PATCH 128/645] fix: reset video stream sizes on audio track selection --- .../java/org/schabi/newpipe/download/DownloadDialog.java | 1 + .../java/org/schabi/newpipe/util/StreamItemAdapter.java | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 2295c3c7ade..7dd482b214c 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -261,6 +261,7 @@ private void updateSecondaryStreams() { final StreamSizeWrapper audioStreams = getWrappedAudioStreams(); final var secondaryStreams = new SparseArrayCompat>(4); final List videoStreams = wrappedVideoStreams.getStreamsList(); + wrappedVideoStreams.resetSizes(); for (int i = 0; i < videoStreams.size(); i++) { if (!videoStreams.get(i).isVideoOnly()) { 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 74de4572027..4bcdfd02a36 100644 --- a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java @@ -235,7 +235,7 @@ public StreamSizeWrapper(@NonNull final List streamList, this.unknownSize = context == null ? "--.-" : context.getString(R.string.unknown_content); - Arrays.fill(streamSizes, -2); + resetSizes(); } /** @@ -269,6 +269,10 @@ public static Single fetchSizeForWrapper( .onErrorReturnItem(true); } + public void resetSizes() { + Arrays.fill(streamSizes, -2); + } + public static StreamSizeWrapper empty() { //noinspection unchecked return (StreamSizeWrapper) EMPTY; From 03fd2869564dfd7cc5832dde438696add0dd153b Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 2 Apr 2023 22:48:15 +0200 Subject: [PATCH 129/645] Translated using Weblate (Odia) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Swedish) Currently translated at 59.4% (44 of 74 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Czech) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 18.9% (14 of 74 strings) Translated using Weblate (Danish) Currently translated at 98.3% (650 of 661 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Korean) Currently translated at 99.8% (660 of 661 strings) Translated using Weblate (French) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (German) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Indonesian) Currently translated at 74.3% (55 of 74 strings) Translated using Weblate (Czech) Currently translated at 98.6% (73 of 74 strings) Translated using Weblate (Ukrainian) Currently translated at 98.6% (73 of 74 strings) Translated using Weblate (Basque) Currently translated at 43.2% (32 of 74 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 85.6% (566 of 661 strings) Translated using Weblate (Belarusian) Currently translated at 92.7% (613 of 661 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Czech) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Latvian) Currently translated at 89.7% (593 of 661 strings) Translated using Weblate (Malay) Currently translated at 54.3% (359 of 661 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 98.3% (650 of 661 strings) Translated using Weblate (Vietnamese) Currently translated at 97.7% (646 of 661 strings) Translated using Weblate (Lithuanian) Currently translated at 97.4% (644 of 661 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Korean) Currently translated at 99.8% (660 of 661 strings) Translated using Weblate (Hungarian) Currently translated at 97.4% (644 of 661 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (English) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Assamese) Currently translated at 14.8% (98 of 661 strings) Translated using Weblate (Georgian) Currently translated at 96.6% (639 of 661 strings) Translated using Weblate (Bosnian) Currently translated at 17.8% (118 of 661 strings) Translated using Weblate (Gujarati) Currently translated at 9.9% (66 of 661 strings) Translated using Weblate (Marathi) Currently translated at 8.4% (56 of 661 strings) Translated using Weblate (Odia) Currently translated at 99.8% (660 of 661 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Bengali) Currently translated at 87.7% (580 of 661 strings) Translated using Weblate (Bengali (India)) Currently translated at 45.9% (304 of 661 strings) Translated using Weblate (Filipino) Currently translated at 34.9% (231 of 661 strings) Translated using Weblate (Danish) Currently translated at 97.5% (645 of 661 strings) Translated using Weblate (Galician) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Belarusian) Currently translated at 91.2% (603 of 661 strings) Translated using Weblate (Belarusian) Currently translated at 91.2% (603 of 661 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Albanian) Currently translated at 83.9% (555 of 661 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 85.3% (564 of 661 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Catalan) Currently translated at 93.3% (617 of 661 strings) Translated using Weblate (Bulgarian) Currently translated at 68.9% (456 of 661 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Finnish) Currently translated at 90.0% (595 of 661 strings) Translated using Weblate (Croatian) Currently translated at 96.2% (636 of 661 strings) Translated using Weblate (Vietnamese) Currently translated at 97.7% (646 of 661 strings) Translated using Weblate (Hebrew) Currently translated at 98.7% (653 of 661 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Asturian) Currently translated at 71.5% (473 of 661 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Czech) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Basque) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Dutch) Currently translated at 98.3% (650 of 661 strings) Translated using Weblate (French) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (German) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (English) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Korean) Currently translated at 10.8% (8 of 74 strings) Translated using Weblate (Russian) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Belarusian) Currently translated at 84.2% (557 of 661 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Korean) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Azerbaijani) Currently translated at 95.9% (71 of 74 strings) Translated using Weblate (Belarusian) Currently translated at 78.9% (522 of 661 strings) Translated using Weblate (Persian) Currently translated at 99.3% (657 of 661 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Russian) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Sardinian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Filipino) Currently translated at 34.9% (231 of 661 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Basque) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (French) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Czech) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Russian) Currently translated at 89.1% (66 of 74 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Galician) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Odia) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Italian) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Italian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Sinhala) Currently translated at 3.4% (23 of 661 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 64.8% (48 of 74 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Polish) Currently translated at 60.8% (45 of 74 strings) Translated using Weblate (Czech) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (74 of 74 strings) Translated using Weblate (Russian) Currently translated at 78.3% (58 of 74 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 18.9% (14 of 74 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Polish) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Czech) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Greek) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Italian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Russian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (German) Currently translated at 100.0% (661 of 661 strings) Co-authored-by: Agnieszka C Co-authored-by: Ajeje Brazorf Co-authored-by: Alex25820 Co-authored-by: Alexthegib Co-authored-by: Alfred Makne Poulsen Co-authored-by: Cyndaquissshhh Co-authored-by: Danial Behzadi Co-authored-by: Eric Co-authored-by: Fjuro Co-authored-by: GET100PERCENT Co-authored-by: Gontzal Manuel Pujana Onaindia Co-authored-by: Hosted Weblate Co-authored-by: Igor Rückert Co-authored-by: Igor Sorocean Co-authored-by: Ihor Hordiichuk Co-authored-by: Jeff Huang Co-authored-by: Linerly Co-authored-by: Maday Co-authored-by: Nidi Co-authored-by: Olivia Ng Co-authored-by: Oğuz Ersen Co-authored-by: Priit Jõerüüt Co-authored-by: Ray Co-authored-by: Rex_sa Co-authored-by: Rui Martins Co-authored-by: SC Co-authored-by: Sean Minnaert Co-authored-by: ShareASmile Co-authored-by: Simon Nilsson Co-authored-by: Subham Jena Co-authored-by: TXRdev Archive Co-authored-by: Translator Co-authored-by: Vasilis K Co-authored-by: VfBFan Co-authored-by: WB Co-authored-by: Xəyyam Qocayev Co-authored-by: Yaron Shahrabani Co-authored-by: fincent Co-authored-by: gallegonovato Co-authored-by: jc Co-authored-by: komiratsu192 <502badgateway@duck.com> Co-authored-by: nautilusx Co-authored-by: pjammo Co-authored-by: random r Co-authored-by: ssantos Co-authored-by: tndsG Co-authored-by: Макар Разин Co-authored-by: 모르것다 Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/az/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/es/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/eu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/id/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ko/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pa/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_PT/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ru/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/uk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant_HK/ Translation: NewPipe/Metadata --- app/src/main/res/values-ar/strings.xml | 8 + app/src/main/res/values-as/strings.xml | 2 +- app/src/main/res/values-az/strings.xml | 10 +- app/src/main/res/values-b+ast/strings.xml | 2 +- app/src/main/res/values-be/strings.xml | 273 ++++++++++++++---- app/src/main/res/values-bg/strings.xml | 2 +- app/src/main/res/values-bn-rIN/strings.xml | 2 +- app/src/main/res/values-bn/strings.xml | 2 +- app/src/main/res/values-bs/strings.xml | 2 +- app/src/main/res/values-ca/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 10 +- app/src/main/res/values-da/strings.xml | 9 +- app/src/main/res/values-de/strings.xml | 8 + app/src/main/res/values-el/strings.xml | 8 + app/src/main/res/values-es/strings.xml | 10 +- app/src/main/res/values-et/strings.xml | 10 +- app/src/main/res/values-eu/strings.xml | 14 +- app/src/main/res/values-fa/strings.xml | 10 +- app/src/main/res/values-fi/strings.xml | 2 +- app/src/main/res/values-fil/strings.xml | 12 +- app/src/main/res/values-fr/strings.xml | 14 +- app/src/main/res/values-gl/strings.xml | 14 +- app/src/main/res/values-gu/strings.xml | 2 +- app/src/main/res/values-he/strings.xml | 2 +- app/src/main/res/values-hi/strings.xml | 12 +- app/src/main/res/values-hr/strings.xml | 2 +- app/src/main/res/values-hu/strings.xml | 2 +- app/src/main/res/values-in/strings.xml | 10 +- app/src/main/res/values-it/strings.xml | 12 +- app/src/main/res/values-ja/strings.xml | 12 +- app/src/main/res/values-ka/strings.xml | 2 +- app/src/main/res/values-ko/strings.xml | 98 ++++--- app/src/main/res/values-lt/strings.xml | 2 +- app/src/main/res/values-lv/strings.xml | 2 +- app/src/main/res/values-mr/strings.xml | 18 +- app/src/main/res/values-ms/strings.xml | 2 +- app/src/main/res/values-nb-rNO/strings.xml | 2 +- app/src/main/res/values-nl-rBE/strings.xml | 4 +- app/src/main/res/values-nl/strings.xml | 2 +- app/src/main/res/values-or/strings.xml | 22 +- app/src/main/res/values-pa/strings.xml | 12 +- app/src/main/res/values-pl/strings.xml | 8 + app/src/main/res/values-pt-rBR/strings.xml | 8 + app/src/main/res/values-pt-rPT/strings.xml | 23 +- app/src/main/res/values-pt/strings.xml | 12 +- app/src/main/res/values-ro/strings.xml | 20 +- app/src/main/res/values-ru/strings.xml | 10 + app/src/main/res/values-sc/strings.xml | 12 +- app/src/main/res/values-si/strings.xml | 19 ++ app/src/main/res/values-sq/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 12 +- app/src/main/res/values-tr/strings.xml | 8 + app/src/main/res/values-uk/strings.xml | 10 +- app/src/main/res/values-vi/strings.xml | 3 +- app/src/main/res/values-zh-rCN/strings.xml | 8 + app/src/main/res/values-zh-rHK/strings.xml | 34 ++- app/src/main/res/values-zh-rTW/strings.xml | 10 +- app/src/main/res/values/strings.xml | 2 +- .../metadata/android/az/changelogs/989.txt | 3 + .../metadata/android/cs/changelogs/66.txt | 26 +- .../metadata/android/cs/changelogs/993.txt | 13 + .../metadata/android/es/changelogs/993.txt | 13 + .../metadata/android/eu/changelogs/66.txt | 13 - .../metadata/android/hi/changelogs/993.txt | 13 + .../metadata/android/id/changelogs/66.txt | 3 - .../metadata/android/it/changelogs/993.txt | 13 + .../metadata/android/ko/changelogs/992.txt | 17 ++ .../metadata/android/pa/changelogs/986.txt | 24 +- .../metadata/android/pa/changelogs/990.txt | 24 +- .../metadata/android/pa/changelogs/993.txt | 13 + .../metadata/android/pl/changelogs/993.txt | 13 + .../metadata/android/pt-PT/changelogs/65.txt | 10 +- .../metadata/android/pt-PT/changelogs/66.txt | 33 +++ .../metadata/android/pt-PT/changelogs/68.txt | 31 ++ .../metadata/android/pt-PT/changelogs/69.txt | 19 ++ .../metadata/android/pt-PT/changelogs/70.txt | 25 ++ .../metadata/android/pt-PT/changelogs/71.txt | 10 + .../metadata/android/pt-PT/changelogs/740.txt | 23 ++ .../metadata/android/pt-PT/changelogs/750.txt | 22 ++ .../metadata/android/pt-PT/changelogs/760.txt | 43 +++ .../metadata/android/pt-PT/changelogs/780.txt | 12 + .../metadata/android/pt-PT/changelogs/790.txt | 14 + .../metadata/android/pt-PT/changelogs/800.txt | 27 ++ .../metadata/android/pt-PT/changelogs/810.txt | 19 ++ .../metadata/android/pt-PT/changelogs/840.txt | 22 ++ .../metadata/android/pt-PT/changelogs/930.txt | 19 ++ .../metadata/android/pt-PT/changelogs/952.txt | 10 +- .../metadata/android/pt-PT/changelogs/953.txt | 2 +- .../metadata/android/pt-PT/changelogs/954.txt | 14 +- .../metadata/android/pt-PT/changelogs/955.txt | 4 +- .../metadata/android/pt-PT/changelogs/956.txt | 2 +- .../metadata/android/pt-PT/changelogs/957.txt | 20 +- .../metadata/android/pt-PT/changelogs/958.txt | 4 +- .../metadata/android/pt-PT/changelogs/959.txt | 4 +- .../metadata/android/pt-PT/changelogs/961.txt | 12 + .../metadata/android/pt-PT/changelogs/964.txt | 8 + .../metadata/android/pt-PT/changelogs/966.txt | 14 + .../metadata/android/pt-PT/changelogs/969.txt | 8 + .../metadata/android/pt-PT/changelogs/972.txt | 14 + .../metadata/android/pt-PT/changelogs/975.txt | 8 +- .../metadata/android/pt-PT/changelogs/983.txt | 9 + .../metadata/android/pt-PT/changelogs/986.txt | 16 + .../metadata/android/pt-PT/changelogs/987.txt | 12 + .../metadata/android/pt-PT/changelogs/993.txt | 13 + .../android/pt-PT/full_description.txt | 2 +- .../android/pt-PT/short_description.txt | 2 +- .../metadata/android/pt/changelogs/66.txt | 33 +++ .../metadata/android/pt/changelogs/68.txt | 31 ++ .../metadata/android/pt/changelogs/69.txt | 19 ++ .../metadata/android/pt/changelogs/70.txt | 25 ++ .../metadata/android/pt/changelogs/71.txt | 10 + .../metadata/android/pt/changelogs/740.txt | 23 ++ .../metadata/android/pt/changelogs/750.txt | 22 ++ .../metadata/android/pt/changelogs/760.txt | 43 +++ .../metadata/android/pt/changelogs/780.txt | 12 + .../metadata/android/pt/changelogs/790.txt | 14 + .../metadata/android/pt/changelogs/800.txt | 27 ++ .../metadata/android/pt/changelogs/810.txt | 19 ++ .../metadata/android/pt/changelogs/840.txt | 22 ++ .../metadata/android/pt/changelogs/930.txt | 19 ++ .../metadata/android/pt/changelogs/955.txt | 6 +- .../metadata/android/pt/changelogs/956.txt | 2 +- .../metadata/android/pt/changelogs/961.txt | 12 + .../metadata/android/pt/changelogs/964.txt | 8 + .../metadata/android/pt/changelogs/966.txt | 14 + .../metadata/android/pt/changelogs/969.txt | 8 + .../metadata/android/pt/changelogs/972.txt | 14 + .../metadata/android/pt/changelogs/983.txt | 9 + .../metadata/android/pt/changelogs/986.txt | 16 + .../metadata/android/pt/changelogs/987.txt | 12 + .../metadata/android/pt/changelogs/993.txt | 13 + .../metadata/android/pt/short_description.txt | 2 +- .../metadata/android/ru/changelogs/63.txt | 4 +- .../metadata/android/ru/changelogs/64.txt | 4 +- .../metadata/android/ru/changelogs/65.txt | 27 +- .../metadata/android/ru/changelogs/66.txt | 34 ++- .../metadata/android/ru/changelogs/68.txt | 32 +- .../metadata/android/ru/changelogs/69.txt | 20 +- .../metadata/android/ru/changelogs/70.txt | 26 +- .../metadata/android/ru/changelogs/71.txt | 11 +- .../metadata/android/ru/changelogs/740.txt | 12 +- .../metadata/android/ru/changelogs/750.txt | 16 +- .../metadata/android/ru/changelogs/760.txt | 62 ++-- .../metadata/android/ru/changelogs/790.txt | 15 +- .../metadata/android/ru/changelogs/800.txt | 12 +- .../metadata/android/ru/changelogs/810.txt | 12 +- .../metadata/android/ru/changelogs/840.txt | 6 +- .../metadata/android/ru/changelogs/900.txt | 10 +- .../metadata/android/ru/changelogs/930.txt | 10 +- .../metadata/android/ru/changelogs/940.txt | 10 +- .../metadata/android/ru/changelogs/951.txt | 10 +- .../metadata/android/ru/changelogs/954.txt | 6 +- .../metadata/android/ru/changelogs/957.txt | 4 +- .../metadata/android/ru/changelogs/964.txt | 4 +- .../metadata/android/ru/changelogs/966.txt | 6 +- .../metadata/android/ru/changelogs/970.txt | 20 +- .../metadata/android/ru/changelogs/972.txt | 14 + .../metadata/android/ru/changelogs/973.txt | 4 + .../metadata/android/ru/changelogs/974.txt | 5 + .../metadata/android/ru/changelogs/975.txt | 17 ++ .../metadata/android/ru/changelogs/976.txt | 10 + .../metadata/android/ru/changelogs/977.txt | 10 + .../metadata/android/ru/changelogs/978.txt | 1 + .../metadata/android/ru/changelogs/979.txt | 2 + .../metadata/android/ru/changelogs/980.txt | 13 + .../metadata/android/ru/changelogs/981.txt | 2 + .../metadata/android/ru/changelogs/983.txt | 9 + .../metadata/android/ru/changelogs/984.txt | 7 + .../metadata/android/ru/changelogs/986.txt | 16 + .../metadata/android/ru/changelogs/987.txt | 6 +- .../metadata/android/ru/changelogs/988.txt | 2 + .../metadata/android/ru/changelogs/989.txt | 3 + .../metadata/android/ru/changelogs/990.txt | 15 + .../metadata/android/ru/changelogs/991.txt | 13 + .../metadata/android/ru/changelogs/992.txt | 17 ++ .../metadata/android/ru/changelogs/993.txt | 13 + .../metadata/android/ru/full_description.txt | 2 +- .../metadata/android/sv/changelogs/790.txt | 14 + .../metadata/android/uk/changelogs/993.txt | 13 + .../android/zh-Hant/changelogs/993.txt | 13 + .../android/zh_Hant_HK/changelogs/981.txt | 4 +- .../android/zh_Hant_HK/changelogs/983.txt | 18 +- .../android/zh_Hant_HK/changelogs/984.txt | 12 +- .../android/zh_Hant_HK/changelogs/985.txt | 2 +- .../android/zh_Hant_HK/changelogs/986.txt | 20 +- .../android/zh_Hant_HK/changelogs/993.txt | 13 + .../android/zh_Hant_HK/full_description.txt | 2 +- .../android/zh_Hant_HK/short_description.txt | 2 +- 188 files changed, 2231 insertions(+), 413 deletions(-) create mode 100644 fastlane/metadata/android/az/changelogs/989.txt create mode 100644 fastlane/metadata/android/cs/changelogs/993.txt create mode 100644 fastlane/metadata/android/es/changelogs/993.txt delete mode 100644 fastlane/metadata/android/eu/changelogs/66.txt create mode 100644 fastlane/metadata/android/hi/changelogs/993.txt delete mode 100644 fastlane/metadata/android/id/changelogs/66.txt create mode 100644 fastlane/metadata/android/it/changelogs/993.txt create mode 100644 fastlane/metadata/android/ko/changelogs/992.txt create mode 100644 fastlane/metadata/android/pa/changelogs/993.txt create mode 100644 fastlane/metadata/android/pl/changelogs/993.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/66.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/68.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/69.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/70.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/71.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/740.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/750.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/760.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/780.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/790.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/800.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/810.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/840.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/930.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/961.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/964.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/966.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/969.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/972.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/983.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/986.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/987.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/993.txt create mode 100644 fastlane/metadata/android/pt/changelogs/66.txt create mode 100644 fastlane/metadata/android/pt/changelogs/68.txt create mode 100644 fastlane/metadata/android/pt/changelogs/69.txt create mode 100644 fastlane/metadata/android/pt/changelogs/70.txt create mode 100644 fastlane/metadata/android/pt/changelogs/71.txt create mode 100644 fastlane/metadata/android/pt/changelogs/740.txt create mode 100644 fastlane/metadata/android/pt/changelogs/750.txt create mode 100644 fastlane/metadata/android/pt/changelogs/760.txt create mode 100644 fastlane/metadata/android/pt/changelogs/780.txt create mode 100644 fastlane/metadata/android/pt/changelogs/790.txt create mode 100644 fastlane/metadata/android/pt/changelogs/800.txt create mode 100644 fastlane/metadata/android/pt/changelogs/810.txt create mode 100644 fastlane/metadata/android/pt/changelogs/840.txt create mode 100644 fastlane/metadata/android/pt/changelogs/930.txt create mode 100644 fastlane/metadata/android/pt/changelogs/961.txt create mode 100644 fastlane/metadata/android/pt/changelogs/964.txt create mode 100644 fastlane/metadata/android/pt/changelogs/966.txt create mode 100644 fastlane/metadata/android/pt/changelogs/969.txt create mode 100644 fastlane/metadata/android/pt/changelogs/972.txt create mode 100644 fastlane/metadata/android/pt/changelogs/983.txt create mode 100644 fastlane/metadata/android/pt/changelogs/986.txt create mode 100644 fastlane/metadata/android/pt/changelogs/987.txt create mode 100644 fastlane/metadata/android/pt/changelogs/993.txt create mode 100644 fastlane/metadata/android/ru/changelogs/972.txt create mode 100644 fastlane/metadata/android/ru/changelogs/973.txt create mode 100644 fastlane/metadata/android/ru/changelogs/974.txt create mode 100644 fastlane/metadata/android/ru/changelogs/975.txt create mode 100644 fastlane/metadata/android/ru/changelogs/976.txt create mode 100644 fastlane/metadata/android/ru/changelogs/977.txt create mode 100644 fastlane/metadata/android/ru/changelogs/978.txt create mode 100644 fastlane/metadata/android/ru/changelogs/979.txt create mode 100644 fastlane/metadata/android/ru/changelogs/980.txt create mode 100644 fastlane/metadata/android/ru/changelogs/981.txt create mode 100644 fastlane/metadata/android/ru/changelogs/983.txt create mode 100644 fastlane/metadata/android/ru/changelogs/984.txt create mode 100644 fastlane/metadata/android/ru/changelogs/986.txt create mode 100644 fastlane/metadata/android/ru/changelogs/988.txt create mode 100644 fastlane/metadata/android/ru/changelogs/989.txt create mode 100644 fastlane/metadata/android/ru/changelogs/990.txt create mode 100644 fastlane/metadata/android/ru/changelogs/991.txt create mode 100644 fastlane/metadata/android/ru/changelogs/992.txt create mode 100644 fastlane/metadata/android/ru/changelogs/993.txt create mode 100644 fastlane/metadata/android/sv/changelogs/790.txt create mode 100644 fastlane/metadata/android/uk/changelogs/993.txt create mode 100644 fastlane/metadata/android/zh-Hant/changelogs/993.txt create mode 100644 fastlane/metadata/android/zh_Hant_HK/changelogs/993.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 861726dd321..95e620ad8e4 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -785,4 +785,12 @@ تحتوي قوائم التشغيل رمادية اللون بالفعل على هذا العنصر. مفيد ، على سبيل المثال ، إذا كنت تستخدم سماعة رأس بأزرار مادية مكسورة تجاهل أحداث ازرار الوسائط الأجهزة + هل تريد إزالة جميع التدفقات المكررة في قائمة التشغيل هذه؟ + إظهار/إخفاء التدفقات + تمت مشاهدته جزئيا + القادمة + إزالة التكرارات + إزالة التكرارات؟ + إظهار التدفقات التالية + شاهدت بالكامل \ No newline at end of file diff --git a/app/src/main/res/values-as/strings.xml b/app/src/main/res/values-as/strings.xml index be845845a3d..93e9e363e0b 100644 --- a/app/src/main/res/values-as/strings.xml +++ b/app/src/main/res/values-as/strings.xml @@ -39,7 +39,7 @@ উচ্চ ৰিজ\'লিউচন দেখুৱাওক কেৱল কিছুমান ডিভাইচেহে 2K/4K ভিডিঅ’ বজাব পাৰে Kodi ৰ সৈতে বজাওক - Kore এপ ইনষ্টল\? + Kode এপ ইনষ্টল\? \"Kodi ৰ সৈতে খোলক\" বিকল্প দেখুৱাওক Kodi মিডিয়া চেণ্টাৰৰ জৰিয়তে এটা ভিডিঅ\' চলাবলৈ এটা বিকল্প প্ৰদৰ্শন কৰক প্লেয়াৰটো ক্ৰেচ কৰক diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index a9eca55c9be..68413792e1c 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -34,7 +34,7 @@ Standart ayırdetmə Daha böyük ayırdetmələr göstər \"Kodi\" ilə Oynat - Çatışmayan \"Kore\" tətbiqi yüklənilsin\? + Çatışmayan \"Kode\" tətbiqi yüklənilsin\? \"Kodi ilə Oynat\" seçimini göstər Kodi media mərkəzindən video oynatmaq üçün seçim göstər Səs @@ -733,4 +733,12 @@ Dublikat %d dəfə əlavə edildi Aparat mühiti media düyməsi hadisələrinə məhəl qoyma Məsələn, fiziki düymələri qırılan qulaqlıq işlədirsinizsə faydalıdır + Dublikatları sil + Dublikatlar silinsin\? + Aşağıdakı yayımları göstər + Yayımları Göstər/Gizlə + Tam baxılıb + Qismən baxılıb + Bu pleylistdəki bütün dublikat yayımları silmək istəyirsiniz\? + Yaxınlaşan \ No newline at end of file diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index 0b857e59b75..15beb49bb08 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -277,7 +277,7 @@ Desanicia tolos datos na caché de les páxines web Llimpiar los metadatos de la caché Llimpióse la caché d\'imáxenes - ¿Instalar Kore\? + ¿Instalar Kode\? Qué asocedió:\\nSolicitú:\\nLlingua del conteníu:\\nPaís del conteníu:\\nLlingua de l\'aplicación:\\nServiciu:\\nHora en GMT:\\nPaquete:\\nVersión de l\'aplicación:\\nVersión del SO: Nun s\'atopó nengún reproductor de fluxos (pues instalar VLC pa reproducilos). Amuesa una miniatura nel fondu de la pantalla de bloquéu y dientro de los avisos diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index e77a820978f..7bbe49ebd26 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1,8 +1,8 @@ - Націсніце лупу, каб пачаць. + Націсніце «Пошук», каб пачаць. Апублікавана %1$s - Патокавы плэер не знойдзены. Усталяваць VLC? + Патокавы прайгравальнік не знойдзены. Усталяваць VLC\? Патокавы плэер не знойдзены (вы можаце ўсталяваць VLC). Усталяваць Скасаваць @@ -16,7 +16,7 @@ Магчыма, вы мелі на ўвазе \"%1$s\"\? Падзяліцца з дапамогай Знешні відэаплэер - Прыбірае гук у некаторых разрозненнях + Адключае гук для некаторых раздзяленнях Знешні аўдыяплэер Падпісацца Вы падпісаныя @@ -30,18 +30,18 @@ У фоне У акне Дадаць да - Каталог для спампаванага відэа - Папка для спампаванга відэа - Увядзіце шлях да папкі для спампавання відэа + Тэчка загрузкі відэа + Загружаныя відэафайлы захоўваюцца тут + Абярыце тэчку загрузкі для відэафайлаў Тэчка загрузкі аўдыё - Папка для спампаванага аўдыя - Увядзіце шлях да папкі для спампавання аўдыя + Загружаныя аўдыёфайлы захоўваюцца тут + Абярыце тэчку загрузкі для аўдыёфайлаў Разрознянне па змаўчанні Разрозненне усплываючага акна Высокія разрозненні Толькі некаторыя прылады могуць прайграваць відэа ў 2K/4K Прайграць у Kodi - Дадатак Kore не знойдзены. Усталяваць яго? + Усталяваць адсутную праграму Kore\? Паказаць опцыю \"Прайграць у Kodi\" Паказаць опцыю прайгравання відэа праз медыяцэнтр Kodi Аўдыё @@ -64,17 +64,17 @@ Аўта- чарга наступнага патока Дадаваць падобныя патокі ў чаргу пры прайграванні апошняга, калі не ўключаны паўтор Варыянты пошуку - Адлюстроўваць падказкі пры пошуку + Выберыце прапановы для паказу пры пошуку Гісторыя пошуку Захоўваць пошукавыя запыты лакальна Гісторыя праглядаў Запамінаць прагледжаныя відэа - Аднавіць прайграванне - Аднаўляць прайграванне пасля перарыванняў (напр. тэлефонных званкоў) + Узнавіць прайграванне + Працягваць прайграванне пасля перапынкаў (напрыклад, тэлефонных званкоў) Загрузіць \"Наступнае\" и \"Прапанаванае\" відэа - \"Зацісніце, каб дадаць\" - Паказаць падказку пры націсканні \"У акне\" ці \"У фоне\" на старонцы звестак аб відэа + Паказаць падказку \"Утрымлівайце, каб паставіць у чаргу\" + Паказаць падказку пры націсканні фонавай або ўсплывальнай кнопкі ў відэа \"Падрабязнасці:\" URL не падтрымліваецца Краіна кантэнту па змаўчанні Мова кантэнту па змаўчанні @@ -87,7 +87,7 @@ Прайграванне ў фонавым рэжыме Прайграванне ва ўсплываючым акне Кантэнт - Кантэнт 18+ + Паказаць кантэнт 18+ Трансляцыя Загрузкі Загрузкі @@ -113,10 +113,10 @@ Перайсці ў галоўнае акно Імпарт дадзеных Экспарт дадзеных - Бягучыя падпіскі, плэйлісты і гісторыя будуць заменены - Экспарт гісторыі, падпісак і плэйлістоў + Перавызначае вашу бягучую гісторыю, падпіскі, плэйлісты і (неабавязкова) налады + Экспарт гісторыі, падпісак, плэйлістоў і налад Ачысціць гісторыю праглядаў - Выдаліць гісторыю прайграных патокаў + Выдаліць гісторыю прайграных патокаў і пазіцыі прайгравання Выдаліць усю гісторыю праглядаў\? Гісторыя праглядаў выдалена Ачысціць гісторыю пошуку @@ -144,9 +144,9 @@ Адбылася памылка: %1$s Няма трансляцый, даступных для загрузкі Прабачце, гэта не павінна было адбыцца. - Адправіць справаздачу па e-mail - Прабачце, адбыліся памылкі. - СПРАВАЗДАЧА + Паведаміць па электроннай пошце + На жаль, нешта пайшло не так. + Справаздача Інфармацыя: Што адбылося: Што:\\nЗапыт:\\nМова кантэнту:\\nКраіна кантэнту:\\nМова праграмы:\\nСэрвіс:\\nЧас GMT:\\nПакет:\\nВерсія:\\nВерсія АС: @@ -182,6 +182,7 @@ %s Відэа %s відэа %s відэа + %s відэа Пачаць Паўза @@ -213,14 +214,14 @@ Аб NewPipe Іншыя ліцэнзіі © %1$s %2$s пад ліцэнзіяй %3$s - Аб дадатку + Аб праграме Ліцэнзіі Свабоднае легкавагавае патокавае прайграванне на Android. Дапамога праекту Вітаецца ўсё - ідэі, пераклад, змены дызайну, чыстка кода або велізарныя змены ў кодзе. Чым больш зроблена, тым лепш! Адкрыць на GitHub Ахвяраваць - Распрацоўшчыкі NewPipe цаной свайго вольнага часу робяць ваша жыццё крышачку зручней. Адплаціце ім тым жа - атрымліваючы асалоду ад кубачка кавы, яны змогуць зрабіць NewPipe яшчэ лепей. + NewPipe распрацаваны добраахвотнікамі, якія праводзяць свой вольны час, забяспечваючы лепшы карыстацкі досвед. Дапамажыце распрацоўшчыкам зрабіць NewPipe яшчэ лепшым, пакуль яны атрымліваюць асалоду ад кавы. Аддаць належнае Вэб-сайт Дзеля атрымання больш падрабязнай інфармацыі і апошніх навін аб NewPipe наведайце наш вэб-сайт. @@ -229,7 +230,7 @@ \nПалітыка прыватнасці NewPipe падрабязна тлумачыць, якія дадзеныя адпраўляюцца і захоўваюцца пры адпраўцы справаздачы аб збоях. Прачытаць палітыку Ліцэнзія NewPipe - NewPipe - свабоднае праграмнае забеспячэнне: вы можаце выкарыстоўваць, вывучаць і паляпшаць яго па сваім меркаванні. У прыватнасці, вы можаце распаўсюджваць і / або змяняць яго ў адпаведнасці з умовамі GNU General Public License, апублікаванай Free Software Foundation, альбо версіі 3, альбо (па вашаму выбару) любой больш позняй версіі. + NewPipe - гэта праграмнае забеспячэнне, свабоднае ад копілефта: вы можаце выкарыстоўваць, вывучаць, дзяліцца і паляпшаць яго па жаданні. У прыватнасці, вы можаце распаўсюджваць і/ці змяняць яго ў адпаведнасці з умовамі Агульнай грамадскай ліцэнзіі GNU, апублікаванай Фондам свабоднага праграмнага забеспячэння, альбо версіі 3 Ліцэнзіі, альбо (на ваш выбар) любой пазнейшай версіі. Прачытаць ліцэнзію Гісторыя Гісторыя @@ -257,7 +258,7 @@ Налады аўдыё Утрымлівайце, каб дадаць у чаргу Пачаць адсюль у фоне - Пачаць адсюль у акне + Пачніце гуляць ва ўсплываючым акне Адкрыць бакавую панэль Зачыніць бакавую панэль Пры адкрыцці кантэнту @@ -272,7 +273,7 @@ Перайменаваць Імя Дадаць у плэйліст - На мініяцюру плэйліста + Усталяваць як мініяцюру плэйліста Дадаць плэйліст у закладкі Выдаліць закладку Выдаліць плэйліст\? @@ -285,7 +286,7 @@ Наблізіць Створаны аўтаматычна Тытры - Змяніць памер тэкста і фон тытраў. Патрэбен перазапуск + Змяніць маштаб тэксту субтытраў гульца і стылі фону. Патрабуецца перазапуск праграмы, каб яна ўступіла ў сілу Маніторынг уцечкі памяці можа прывесці да завісання прыкладання Паведамляць пра памылкі жыццёвага цыклу Прымусова паведамляць пра недастаўляемыя Rx-выключэнні па-за фрагментам або жыццёвым цыкле пасля выдалення @@ -298,11 +299,15 @@ Папярэдні экспарт Не атрымалася імпартаваць падпіскі Не атрымалася экспартаваць падпіскі - Імпарт падпісак з YouTube загрузкай файла экспарту: -\n -\n1. Перайдзіце на: %1$s -\n2. Увайдзіце, калі неабходна -\n3. Павінна пачацца загрузка (гэта будзе файл экспарту) + Імпарт падпісак YouTube з Google Takeout: +\n +\n1. Перайдзіце па гэтым URL: %1$s +\n2. Увайдзіце, калі вас папросяць +\n3. Націсніце на «Усе дадзеныя ўключаны», затым на «Адмяніць выбар усіх», затым выберыце толькі «падпіскі» і націсніце «ОК» +\n4. Націсніце на «Наступны крок», а затым на «Стварыць экспарт» +\n5. Націсніце на кнопку «Спампаваць» пасля таго, як яна з\'явіцца +\n6. Пстрыкніце ФАЙЛ ІМПАРТУВАЦЬ ніжэй і выберыце спампаваны файл .zip +\n7. [Калі імпарт .zip не ўдаецца] Распакуйце файл .csv (звычайна ў раздзеле \"YouTube і YouTube Music/subscriptions/subscriptions.csv\"), націсніце ФАЙЛ ІМПАРТУВАЦЬ ніжэй і выберыце выняты файл CSV Імпарт падпісак з SoundCloud набраўшы альбо URL, альбо ваш ID: \n \n1. Уключыце \"рэжым працоўнага стала\" у браўзэры (сайт недаступны на тэлефоне) @@ -316,11 +321,11 @@ Кіраванне хуткасцю прайгравання Тэмп Тон - Незалежна (скажэнні) + Адчапіць (можа выклікаць скажэнне) Прапускаць цішыню Крок Скід - У адпаведнасці з Агульным рэгламентам па абароне дадзеных ЕС (GDPR), звяртаем вашу ўвагу на палітыку прыватнасці NewPipe. Калі ласка, уважліва азнаёмцеся з ёй. + У адпаведнасці з Агульным рэгламентам па абароне дадзеных ЕС (GDPR), звяртаем вашу ўвагу на палітыку прыватнасці NewPipe. Калі ласка, уважліва азнаёмцеся з ёй. \nВам неабходна прыняць яе ўмовы, каб адправіць нам справаздачу пра памылку. Прыняць Адмовіцца @@ -334,9 +339,9 @@ Адпісацца Абярыце ўкладку Жэст гучнасці - Выкарыстоўвай жэсты для кіравання гучнасцю плэера + Мяняць гучнасць плэера жэстамі Жэст яркасці - Выкарыстоўвай жэсты для кіравання яркасцю плэера + Мяняць яркасць плэера жэстамі Абнаўленні Файл выдалены Апавяшчэнне аб абнаўленні праграмы @@ -360,18 +365,18 @@ прыпынена у чарзе постапрацоўка - Чарга + Паставіць у чаргу Дзеянне забаронена сістэмай Памылка загрузкі Стварыць унікальнае імя Перазапісаць Загрузка з такім імем ужо выконваецца Паказаць тэкст памылкі - Тэчка прызначэння не можа быць створана - Файл не можа быць створаны - Немагчыма ўсталяваць абароненае злучэнне + Немагчыма стварыць папку прызначэння + Немагчыма стварыць файл + Не атрымалася ўсталяваць бяспечнае злучэнне Сервер не знойдзены - Немагчыма злучыцца з серверам + Немагчыма падключыцца да сервера Не атрымалася атрымаць дадзеныя з сервера Сервер не падтрымлівае шматструменную загрузку, паспрабуйце з @string/msg_threads = 1 Не знойдзена @@ -412,11 +417,11 @@ Запытваць тэчку загрузкі Вам будзе прапанавана ўказаць месца захавання кожнай загрузкі. \nУключыце сістэмны выбарнік тэчкі (SAF), калі вы хочаце загружаць файлы на знешнюю SD-картку - Выкарыстоўваць SAF + Выкарыстоўвайце сродак выбару сістэмных тэчак (SAF) \'Storage Access Framework\' дазваляе загружаць на знешнюю SD-картку Пераключыць службу, выбраную ў дадзены момант: Выдаліць ўсе пазіцыі прайгравання - Абмежаваны рэжым YouTube + Уключыце \"Абмежаваны рэжым\" YouTube Падтрымліваюцца толькі адрасы URL HTTPS Дадаць экзэмпляр Экзэмпляры PeerTube @@ -434,10 +439,10 @@ Выдаліць загружаныя файлы Арыгінальныя тэксты з сэрвісаў будуць бачны ў ленце элементаў Ачысціце cookie, якія NewPipe захоўвае пры рашэнні reCAPTCHA - Экзэмпляр ужо існуе + Інстанцыя ўжо існуе Немагчыма праверыць экзэмпляр - Увесці URL экзэмпляра - Выберыце улюбёныя экзэмпляры PeerTube + Увядзіце адрас URL інстанцыі + Выбярыце улюбёныя інстанцыі PeerTube Актыўны плэер быў зменены Змена плэера можа замяніць вашу чаргу Запытаць, перш чым ачысціць чаргу @@ -463,7 +468,7 @@ Скапіруйце адфарматаваны багрэпарт Дайце дазвол на адлюстраванне паверх іншых праграм Выдаліць усе пазіцыі прайгравання\? - Выдаліць пазіцыі прайгравання + Выдаліць пазіцыю прайгравання Ачысціць reCAPTCHA cookies reCAPTCHA cookies былі ачышчаны Выканаўцы @@ -471,7 +476,7 @@ Песні Відэа Аўтаматычная чарга - Працягласць перамоткі ўперад/назад + Крок перамотвання Каляровыя апавяшчэнні Нічога Буферызацыя @@ -589,5 +594,175 @@ Змяніць памер інтэрвалу загрузкі (зараз %s). Меншае значэнне можа паскорыць пачатковую загрузку відэа. Змены патрабуюць перазапуск плэера Выключыце, каб схаваць апісанне відэа і дадатковую інфармацыю - + Прапановы лакальнага пошуку + Наладзіць апавяшчэнне аб бягучым прайграванні патоку + Гэта відэа абмежавана па ўзросце. +\n +\nУключыце \"%1$s\" у наладах, калі хочаце бачыць гэта. + Апавяшчэнне аб памылцы + Апавяшчэнні для паведамлення аб памылках + NewPipe выявіў памылку, націсніце, каб паведаміць + Не запускайце відэа ў міні-прайгравальніку, а пераключыце непасрэдна ў поўнаэкранны рэжым, калі аўтаматычны паварот заблакіраваны. Вы ўсё яшчэ можаце атрымаць доступ да міні-плэера, выйшоўшы з поўнаэкраннага рэжыму + Знайдзіце асобнікі, якія вам падабаюцца, на %s + Паказаць метаінфармацыю + Ігнараваць падзеі апаратных медыякнопак + Паказваць змесціва, магчыма непрыдатнае для дзяцей, таму што яно мае ўзроставыя абмежаванні (напрыклад, 18+) + Калі ласка, праверце, ці існуе ўжо праблема з абмеркаваннем вашага збою. Пры стварэнні дублікатаў тыкетаў вы забіраеце ў нас час, які мы маглі б патраціць на выпраўленне фактычнай памылкі. + Адбылася памылка, глядзіце апавяшчэнне + Збой плэера + Карысна, напрыклад, калі вы карыстаецеся гарнітурай са зламанымі фізічнымі кнопкамі + Адключыце, каб схаваць поля метаінфармацыі з дадатковай інфармацыяй пра стваральніка патоку, змесціва патоку або пошукавы запыт + Прапановы аддаленага пошуку + Гэта відэа абмежавана па ўзросце. +\nУ сувязі з новай палітыкай YouTube у дачыненні да відэа з узроставымі абмежаваннямі, NewPipe не можа атрымаць доступ ні да аднаго са сваіх відэапатокаў і, такім чынам, не можа іх прайграваць. + YouTube забяспечвае \"Абмежаваны рэжым\", які хавае патэнцыйна змесціва для дарослых + Разлік хэша + Вырашана + Створана аўтаматычна (запампавальнік не знойдзены) + Плэйлісты, якія пазначаны шэрым, ужо ўтрымліваюць гэты элемент. + + %s новы стрым + %s новыя стрымы + %s новых стрымаў + %s новых стрымаў + + Каментарыі + У чаргу далей + У чарзе наступны + Загрузка звестак аб стрыме… + Апрацоўка... Можа заняць некаторы час + Дублікат дададзены %d раз + LeakCanary недаступны + Паказаць уцечкі памяці + Адключыце мультымедыйнае тунэляванне, калі ў вас з\'яўляецца чорны экран або заіканне падчас прайгравання відэа + Не ўдалося скапіраваць у буфер абмену + Папка спампоўкі пакуль не ўстаноўлена, выберыце папку спампоўкі па змаўчанні + Часта задаюць пытанні + Перайсці на вэбсайт + Правядзіце пальцам па элементах, каб выдаліць іх + Адмяніць пастаянную мініяцюру + Паказаць індыкатары выявы + Паказваць каляровыя стужкі Пікаса на выявах, якія пазначаюць іх крыніцу: чырвоная для сеткі, сіняя для дыска і зялёная для памяці + Апрацоўка стужкі… + Вам будзе прапанавана, дзе захоўваць кожную спампоўку + Загрузка стужкі… + Выдаліць прагледжаныя відэа\? + Ды і відэа часткова прагледзеў + Працэнт + Відэа, якія былі прагледжаны да і пасля дадання ў спіс прайгравання, будуць выдалены. +\nВы ўпэўнены\? Гэта не можа быць адменена! + Паказвае варыянт збою пры выкарыстанні плэера + Выдаліць прагледжанае + Паказаць панэль памылак + Паўтон + Любая сетка + Не загружана: %d + Пачынаючы з Android 10 падтрымліваецца толькі \"Storage Access Framework\" + Праверка абнаўленняў… + Выдаліць дублікаты\? + Выдаліць дублікаты + Вы хочаце выдаліць усе паўтаральныя стрымы ў гэтым плэйлісце\? + Новыя элементы стужкі + + %d выбраны + %d выбраныя + %d выбраных + %d выбраных + + Пустая назва групы + Вы хочаце выдаліць гэту групу\? + Новы + Паказаць толькі разгрупаваныя падпіскі + Маючыя адбыцца + Паказаць «Збой плэера» + Запусціце праверку новых патокаў + Збой праграмы + Апавяшчэнні аб новых стрымах + Апавяшчаць аб новых стрымах з падпісак + Частата праверкі + Патрабуецца падключэнне да сеткі + Праверце наяўнасць абнаўленняў + Праверце новыя версіі ўручную + Аўтаматычны запуск прайгравання — %s + Картка + Націсніце, каб спампаваць %s + + Загрузка скончана + %s загрузкі скончаны + %s загрузак скончана + %s загрузак скончана + + Заўсёды абнаўляць + Парог абнаўлення стужкі + Немагчыма загрузіць канал для «%s». + Стужка + Час пасля апошняга абнаўлення, перш чым падпіска лічыцца састарэлай — %s + Памылка загрузкі стужкі + Уліковы запіс аўтара быў спынены. +\nNewPipe не зможа загрузіць гэты канал у будучыні. +\nВы хочаце адмовіцца ад падпіскі на гэты канал\? + Рэжым хуткай загрузкі стужкі не дае дадатковай інфармацыі аб гэтым. + Атрымлівайце са спецыяльнага канала, калі ён даступны + Уключыць хуткі рэжым + Катэгорыя + Тэгі + Ліцэнзія + Хост + URL мініяцюры + Не ў спісе + Прыватная + , + Пераключыць усё + Стрымы, якія яшчэ не падтрымліваюцца загрузчыкам, не адлюстроўваюцца + Мініяцюра аватара канала + Аўтар: %s + Аўтару відэа спадабалася гэта + Створана %s + Адключыць хуткі рэжым + Публічная + Замацаваны каментар + Вы падпісаліся на канал + Апошнія + Радыё + Паказаць наступныя стрымы + Паказаць/схаваць стрымы + Гэты кантэнт яшчэ не падтрымліваецца NewPipe. +\n +\nСпадзяюся, ён будзе падтрымлівацца ў наступных версіях. + Старонка плэйліста + Паказаць мініяцюру + Выкарыстоўвайце мініяцюру як для фону экрана блакіроўкі, так і для апавяшчэнняў + Для гэтага дзеяння не знойдзены адпаведны дыспетчар файлаў. +\nКалі ласка, усталюйце файлавы мэнэджар або паспрабуйце адключыць «%s» у наладах загрузкі + Гэты кантэнт недаступны ў вашай краіне. + Гэта трэк SoundCloud Go+, прынамсі ў вашай краіне, таму NewPipe не можа трансляваць ці спампоўваць яго. + Гэта змесціва з\'яўляецца прыватным, таму NewPipe не можа яго трансляваць або спампоўваць. + Гэта відэа даступна толькі для падпісчыкаў YouTube Music Premium, таму NewPipe не можа яго трансляваць або спампоўваць. + Уліковы запіс спынены + %s дае наступную прычыну: + Рэкамендаваны + Унутраная + Цалкам прагледзеў + Гэты кантэнт даступны толькі для аплачаных карыстальнікаў, таму NewPipe не можа яго трансляваць або спампоўваць. + Даступны ў некаторых службах, звычайна нашмат хутчэй, але можа вяртаць абмежаваную колькасць элементаў і часта няпоўную інфармацыю (напрыклад, без працягласці, тыпу элемента, без актыўнага стану) + Узроставае абмежаванне + Для гэтага дзеяння не знойдзены адпаведны дыспетчар файлаў. +\nКалі ласка, усталюйце файлавы менеджэр, сумяшчальны з Storage Access Framework + Ніякая праграма на вашай прыладзе не можа адкрыць гэта + Стандартнае значэнне ExoPlayer + Часткова прагледжана + Як вы думаеце, загрузка корму адбываецца занадта павольна\? Калі так, паспрабуйце ўключыць хуткую загрузку (гэта можна змяніць у наладах або націснуўшы кнопку ніжэй). +\n +\nNewPipe прапануе дзве стратэгіі загрузкі корму: +\n• Атрыманне ўсяго канала падпіскі павольнае, але поўнае. +\n• Выкарыстанне спецыяльнай канчатковай кропкі абслугоўвання, якая працуе хутка, але звычайна не поўная. +\n +\nРозніца паміж імі заключаецца ў тым, што хуткаму звычайна не хапае некаторай інфармацыі, напрыклад, працягласці або тыпу элемента (не можа адрозніць жывыя відэа ад звычайных), і ён можа вяртаць менш элементаў. +\n +\nYouTube з\'яўляецца прыкладам сэрвісу, які прапануе гэты хуткі метад са сваім RSS-каналам. +\n +\nТакім чынам, выбар зводзіцца да таго, што вы аддаеце перавагу: хуткасць або дакладная інфармацыя. + Прыватнасць + Мова + Падтрымка \ No newline at end of file diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 27a70053e27..d1cb10fd74b 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -36,7 +36,7 @@ Покажи по-високи резолюции Само някои устройства могат да възпроизвеждат 2K/4K видео Въпроизвеждане с Kodi - Инсталиране на липсващото приложение \"Kore\"\? + Инсталиране на липсващото приложение \"Kode\"\? Покажи „Възпроизвеждане с Kodi“ Показване на опция за възпроизвеждане на видео чрез „Kodi media center“ Аудио diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 096674cce38..53d99fb5fdb 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -101,7 +101,7 @@ অডিও Kodi মিডিয়া সেন্টারে এর মাধ্যমে ভিডিও প্লে করার জন্য একটি বিকল্প প্রদর্শন কর দেখাও \"Kodi এর মাধ্যমে চালাও \" বিকল্প - হারানো কোর ইনস্টল করবেন\? + অনুপস্থিত কোড অ্যাপ ইনস্টল করবেন\? Kodi এর মাধ্যমে চালান শুধুমাত্র কিছু ডিভাইস 2K/4K ভিডিও চালাতে পারে উচ্চ রেজোল্যুশন দেখাও diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 75a41c99a45..6bfe27af86d 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -251,7 +251,7 @@ থাম্বনেলে ১:১ অনুপাতে করো Kodi মিডিয়া সেন্টারে এর মাধ্যমে ভিডিও প্লে করার জন্য একটি বিকল্প প্রদর্শন কর \"Kodi দ্বারা চালান\" বিকল্পটি প্রদর্শন কর - হারানো কোর ইনস্টল করবে\? + অনুপস্থিত কোড অ্যাপ ইনস্টল করবেন\? Kodi দ্বারা চালাও শুধুমাত্র কিছু ডিভাইস 2K/4K ভিডিও চালাতে পারে উচ্চতর রেজুলেশন প্রদর্শন করা হবে diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index e865f3c22ce..855c577a62c 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -28,7 +28,7 @@ Otkazana pratnja kanala Nije moguće promijeniti pratnju Nije moguće ažurirati pratnju - Instalirajte nedostajeću Kore aplikaciju\? + Instalirajte nedostajeću Kode aplikaciju\? Obilježeni Popisi Iskačni prozor Izaberite Podprozor diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 633599827c9..ac25b29923a 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -114,7 +114,7 @@ Mostra resolucions superiors Només alguns dispositius poden reproduir vídeos en 2K/4K Reprodueix amb el Kodi - No s\'ha trobat l\'aplicació Kore. Voleu instal·lar-la\? + No s\'ha trobat l\'aplicació Kode. Voleu instal·lar-la\? Mostra «Reprodueix amb el Kodi» Mostra una opció per reproduir un vídeo amb el centre multimèdia Kodi Reproductor emergent intel·ligent diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index c13e8ddb399..eda30eb11bf 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -551,7 +551,7 @@ Pouze na Wi-Fi Automaticky zahájit přehrávání — %s Přehrát frontu - Nelze rozpoznat zadané URL. Otevřít pomocí jiné aplikace\? + Nelze rozpoznat zadanou adresu URL. Otevřít pomocí jiné aplikace\? Automatické přehravání Fronta aktivního přehrávače bude smazána Při přechodu z jednoho přehrávače do druhého může dojít k smazání fronty @@ -746,4 +746,12 @@ Duplikát přidán %dkrát Ignorovat události hardwarových tlačítek médií Užitečné například v případě, že používáte sluchátka s rozbitými fyzickými tlačítky + Odstranit duplicity\? + Zobrazit následující streamy + Zobrazit/skrýt streamy + Celé zhlédnuto + Částečně zhlédnuto + Nadcházející + Odstranit duplicity + Chcete odstranit všechny duplicitní streamy v tomto playlistu\? \ No newline at end of file diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 4f219e97be7..6b16e6eae4e 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -43,7 +43,7 @@ Vis højere opløsninger Kun nogle enheder kan afspille 2K-/4K-videoer Afspil med Kodi - Installer manglede Kore-app\? + Installer manglede Kode-app\? Vis valgmuligheden \"Afspil med Kodi\" Vis en knap til at afspille en video via Kodi-mediecenteret Lyd @@ -163,7 +163,7 @@ Genskab standardindstillinger Vil du genoprette standardindstillingerne\? Undskyld, dette skulle ikke være sket. - Rapporter denne fejl via e-mail + Rapporter via e-mail Beklager, noget gik galt. Rapporter Information: @@ -726,4 +726,9 @@ Vælg kvalitet til eksterne afspillere Vis fremtidige elementer Sortér + Ignorer hardware medie knapper + Brugbart f.eks. hvis du bruger et headset med ødelagte fysiske knapper + Playlists der er grået ud, indeholder allerede dette objekt. + Inaktiver permanent thumbnail + Fejlede at kopiere til udklipsholderen \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 6d643f1b9e3..36941050804 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -733,4 +733,12 @@ Die ausgegrauten Wiedergabelisten enthalten dieses Element bereits. Nützlich, wenn z. B. ein Headset mit defekten physischen Tasten verwendet wird Ereignisse der Hardware-Medientasten ignorieren + Duplikate entfernen + Duplikate entfernen\? + Möchtest du alle doppelten Streams in dieser Wiedergabeliste entfernen\? + Streams anzeigen/ausblenden + Folgende Streams anzeigen + Demnächst + Vollständig angeschaut + Teilweise angeschaut \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 1ba8811a666..0a42d5d0fbe 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -733,4 +733,12 @@ Προστέθηκε διπλότυπο %d φορά(ες) Αγνοήστε τα συμβάντα κουμπιών πολυμέσων υλικού Χρήσιμο, για παράδειγμα, εάν χρησιμοποιείτε ακουστικά με χαλασμένα φυσικά κουμπιά + Εμφάνιση των ακόλουθων ροών + Θεαθέντα πλήρως + Προσεχή + Εμφάνιση/Απόκρυψη ροών + Αφαίρεση διπλοτύπων; + Θέλετε να καταργήσετε όλες τις διπλότυπες ροές σε αυτήν τη λίστα αναπαραγωγής; + Αφαίρεση διπλοτύπων + Θεαθέντα μερικώς \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index b99af00e136..91ba5b6543d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -16,7 +16,7 @@ Elija la carpeta de descarga para los archivos de vídeo Resolución predefinida Reproducir con Kodi - ¿Instalar la aplicación Kore que falta\? + ¿Instalar la aplicación Kode que falta\? Mostrar opción «Reproducir con Kodi» Mostrar una opción para reproducir un vídeo a través de Kodi media center Audio @@ -749,4 +749,12 @@ Las listas de reproducción que están en gris ya contienen este elemento. Útil, por ejemplo, si está utilizando un auricular con botones físicos rotos Ignorar eventos para botones multimedia de hardware + ¿Eliminar los duplicados\? + ¿Desea eliminar todas las secuencias duplicadas de esta lista de reproducción\? + Mostrar las siguientes secuencias + Mostrar/Ocultar secuencias + Próximamente + Eliminar los duplicados + Completamente visto + Parcialmente visto \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 7c439800782..a4ee72c5729 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -41,7 +41,7 @@ Kuva kõrgemaid lahutusi Ainult mõned seadmed suudavad esitada 2K/4K videoid Esita Kodi abil - Kas paigaldada puuduv Kore rakendus\? + Kas paigaldada puuduv Kode rakendus\? Kuva valik \"Esita Kodi abil\" Kuva valik video esitamiseks Kodi meediakeskuse kaudu Heli @@ -733,4 +733,12 @@ Topeltkirje lisatud %d kord(a) Kasulik näiteks kui olukorras kui kõrvaklappide nupud on katki Eira nutiseadmes asuvate või seotud seadmete meedianuppude vajutusi + Eemalda topeltkirjed + Kas eemaldame topeltkirjed\? + Kas sa soovid eemaldada kõik topelt meediavood sellest esitusloendist\? + Näita järgmisi meediavooge + Näita/peida meediavood + Tulemas + Lõpuni vaadatud + Osaliselt vaadatud \ No newline at end of file diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index d94924259c8..946de5363bb 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -14,7 +14,7 @@ Aukeratu bideoak deskargatzeko karpeta Lehenetsitako bereizmena Jo Kodirekin - Kore aplikazioa instalatu\? + Kode aplikazioa instalatu\? Erakutsi \"Jo Kodirekin\" aukera Erakutsi bideoa Kodi multimedia zentroarekin erreproduzitzeko aukera Audioa @@ -74,7 +74,7 @@ Ezin izan da deskargen menua ezarri Aplikazioa/interfazea kraskatu da Hori ez litzateke gertatu behar. - Eman errore honen berri e-posta bidez + Eman honen berri e-posta bidez Barkatu, zerbait gaizki atera da. Salatu Informazioa: @@ -731,4 +731,14 @@ Modu azkarra Hiru-puntutako menutik harpidetzak inportatu edo esportatu Maiz galdetutako galderak + Ezikusi hardware multimedia botoien gertaerak + Erabilgarria, adibidez, botoi fisiko hautsiak dituen entzungailua erabiltzen ari bazara + Kendu bikoiztuak + Kendu bikoiztuak\? + Jario bikoiztu guztiak kendu nahi dituzu erreprodukzio-zerrenda honetatik\? + Erakutsi hurrengo jarioak + Erakutsi/Ezkutatu jarioak + Partzialki ikusita + Guztiz ikusia + Laster agertzeko \ No newline at end of file diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 6836ccb87dc..fe5750dd962 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -51,7 +51,7 @@ محتوا در دسترس نیست نمی‌توان فهرست بارگیری را برپا ساخت ببخشید! نباید این اتّفاق زخ می‌داد. - این خطا را با رایانامه گزارش کنید + گزارش با رایانامه ببخشید، چیزی به درستی پیش نرفت. گزارش اطّلاعات: @@ -729,4 +729,12 @@ کارت شکست در رونوشت به تخته‌گیره ناتنظیم بندانگشتی ثابت + چشم‌پوشی از رخدادهای دکمهٔ رسانهٔ سخت‌افزاری + برداشتن تکراری‌ها + برداشتن تکراری‌ها؟ + نمایش یا نهفتن جریان‌ها + نمایش جریان‌های زیر + پیش رو + کامل دیده شده + نیمه دیده شده \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 026839c5098..fcd0cb609e8 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -36,7 +36,7 @@ Näytä korkeammat resoluutiot Vain jotkin laitteet voivat toistaa 2K/4K-videota Toista Kodissa - Asennetaanko puuttuva Kore-sovellus\? + Asennetaanko puuttuva Kode-sovellus\? Näytä ”Toista Kodissa”-vaihtoehto Näyttää vaihtoehdon videon toistamiseen Kodi-mediasoittimessa Ääni diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index b1529c7f7aa..c66d1db759f 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -1,6 +1,6 @@ - Pindutin ang magnifying glass upang magsimula. + Pindutin ang magnifying glass para magsimula. Inilathala noong %1$s Walang nakitang stream player. I-install ang VLC\? Walang nakitang stream player (pwede mong i-install ang VLC para ma-play ito). @@ -16,11 +16,11 @@ \"%1$s\" ba ang tinutukoy mo\? Ibahagi sa Gumamit ng ibang video player - Natatanggal ang tunog sa ilang mga resolusyon + Nawawala ang tunog sa ilang resolusyon Gumamit ng ibang audio player Sumubaybay - Sinusubaybayan - Ihinto ang pagsubaybay + Sumusubaybay + Tumigil sa pagsubaybay Hininto ang pagsubaybay sa channel Hindi mabago ang pagsubaybay Hindi ma-update ang pagsubaybay @@ -58,7 +58,7 @@ Tema Lokal na mungkahi Remote na mungkahi - Markahan bilang napanood + Markahan bilang napanood na Kusang ipila Ulitin Halo-halo @@ -104,7 +104,7 @@ Tandaan ang mga property ng popup Panimulang linaw ng popup Mape-play lang ng ilang device ang mga video na 2K/4K - I-install ang nawawalang Kore app\? + I-install ang nawawalang Kode app\? I-scale ang thumbnail sa 1:1 aspect ratio I-scale ang thumbnail ng video sa abiso mula 16:9 papuntang 1:1 aspect ratio (pwedeng magkaroon ng distortion) Unang action button diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 370f75ccf54..ea891723b96 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -53,7 +53,7 @@ Impossible de charger toutes les miniatures Impossible de déchiffrer la signature URL de la vidéo Désolé, cela n’aurait pas dû se produire. - Signaler cette erreur par courriel + Signaler par courriel Information : Ce qui s’est passé : Votre commentaire (en anglais) : @@ -744,4 +744,16 @@ Cette option est disponible seulement si %s est sélectionné pour le thème Les listes de lecture grisées contiennent déjà cet élément. Carte + Utile si vous utilisez un casque avec des boutons dysfonctionnels, par exemple + Effacer les doublons + Effacer les doublons \? + Voulez-vous retirer tous les doublons de cette liste \? + Afficher les flux suivants + Entièrement vu + Partiellement vu + À venir + Ignorer les évènements des boutons média des périphériques + Doublon ajouté %d fois + Afficher/Cacher les flux + Enlever la miniature permanente \ No newline at end of file diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index dc7ae60110b..7aafe4e7e8d 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -41,7 +41,7 @@ Mostrar resolucións máis altas Só algúns dispositivos poden reproducir vídeos en 2K/4K Reproducir co Kodi - Quere instalar o aplicativo Kore que falta\? + Quere instalar o aplicativo Kode que falta\? Mostrar a opción «Reproducir co Kodi» Mostrar unha opción para reproducir o vídeo co Kodi Media Center Audio @@ -143,7 +143,7 @@ Ocorreu un erro: %1$s Non hai emisións para descargar Deculpe, isto non debería ter acontecido. - Informar deste erro por enderezo electrónico + Informar por correo electrónico Desculpe, algo foi mal. Informe Información: @@ -731,4 +731,14 @@ Tarxeta As listas de reprodución que se atopan atenuadas xa conteñen este elemento. Duplicado engadido %d vez/veces + Mostrar/Ocultar emisións + Ignorar eventos con botóns multimedia físicos + Útil, por exemplo, se estiver usando un auricular con botóns rotos + Eliminar duplicados + Eliminar duplicados\? + Desexa eliminar todas as emisións duplicadas nesta lista de reprodución\? + Mostrar os seguintes vídeos + Completamente visto + Parcialmente visto + Proximamente \ No newline at end of file diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml index 2b43cbf1481..e910db9cc0d 100644 --- a/app/src/main/res/values-gu/strings.xml +++ b/app/src/main/res/values-gu/strings.xml @@ -24,7 +24,7 @@ સૂચનામાં 16: 9 થી 1: 1 અસ્પેક્ટ રેશિયોમાં બતાવેલ વિડિઓ થંબનેલને સ્કેલ કરો (વિકૃતિ રજૂ કરી શકે છે) સ્કેલ થંબનેલથી 1: 1 પાસા રેશિયો કોડી મીડિયા સેન્ટર દ્વારા વિડિઓ ચલાવવાનો વિકલ્પ દર્શાવો - અનુપસ્થિત Kore એપ્લિકેશન ઇન્સ્ટોલ કરીએ\? + અનુપસ્થિત Kode એપ્લિકેશન ઇન્સ્ટોલ કરીએ\? ફક્ત થોડા ઉપકરણો 2K / 4K વિડિઓઝ ચલાવી શકે છે ઉચ્ચ રીઝોલ્યુશન બતાવો ડિફોલ્ટ પોપઅપ રીઝોલ્યુશન diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index c6358ae264e..ffd65b736c6 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -29,7 +29,7 @@ הצגת רזולוציות גבוהות יותר רק חלק מהמכשירים יכולים לנגן סרטונים ב־2K/4K נגינה ב־Kodi - להתקין את יישומון Kore החסר\? + להתקין את יישומון Kode החסר\? הצגת האפשרות לניגון עם Kodi הצגת אפשרות לנגן סרטון דרך מרכז המדיה Kodi שמע diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index f2f084f8680..86e7a98d078 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -58,7 +58,7 @@ उच्च गुणवत्ता स्तर दिखाएं केवल कुछ ही डिवाईस 2के/4के मे वीडियो चला सकते हैं कोडी मे चलाए - कोरे ऐप नहीं मिला, इसे स्थापित करें\? + लापता Kode ऐप स्थापित करें\? \"कोडी मे चलाएं\" वाला विकल्प दिखाएँ कोडी मीडिया सेंटर से वीडियो चलने के लिए विकल्प प्रदर्शित करें प्रथम स्थापित ध्वनि फॉर्मेट @@ -731,4 +731,14 @@ क्लिपबोर्ड पर कॉपी करने में विफल धुंधली की गई प्‍लेलिस्‍ट में पहले से ही यह आइटम है। डुप्लीकेट जोड़ा गया %d बार + डुप्लीकेट हटाएं + डुप्लीकेट हटाएं\? + क्या आप इस प्लेलिस्ट की सभी डुप्लीकेट स्ट्रीम हटाना चाहते हैं\? + निम्नलिखित स्ट्रीम दिखाएँ + आगामी + हार्डवेयर मीडिया बटन घटनाओं की अनदेखी करें + उपयोगी है, उदाहरण के लिए, यदि आप टूटे हुए भौतिक बटन वाले हेडसेट का उपयोग कर रहे हैं + स्ट्रीम दिखाएँ / छिपाएँ + पूरा देखा + आंशिक रूप से देखा गया \ No newline at end of file diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index cdaae6cf9d5..fa350501112 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -36,7 +36,7 @@ Prikaži veće rezolucije Samo neki uređaji podržavaju reprodukciju 2K/4K videa Reproduciraj s Kodijem - Instalirati nedostajući Kore program\? + Instalirati nedostajući Kode program\? Prikaži opciju „Reproduciraj pomoću Kodija” Prikaži opciju za reproduciranje videozapisa putem Kodija Audiosnimka diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 5ae2288c084..6327aba2d99 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -16,7 +16,7 @@ Válasszon letöltési mappát a videófájloknak Alapértelmezett felbontás Lejátszás Kodival - Telepíti a hiányzó Kore alkalmazást\? + Telepíti a hiányzó Kode alkalmazást\? A „Lejátszás Kodival” lehetőség megjelenítése A videók Kodi médiaközponttal történő lejátszásának megjelenítése Hang diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index ca225f2f1ff..06df200827f 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -20,7 +20,7 @@ Pilih folder unduhan untuk berkas audio Pilih kualitas Putar dengan Kodi - Instal aplikasi Kore yang hilang\? + Instal aplikasi Kode yang hilang\? Tampilkan opsi \"Putar dengan Kodi\" Tampilkan opsi untuk memutar video via Kodi Audio @@ -720,4 +720,12 @@ Duplikat ditambahkan %d kali Berguna, misalnya, jika Anda menggunakan sebuah headset dengan tombol fisik yang rusak Abaikan peristiwa tombol media perangkat keras + Hapus duplikat + Ditonton secara lengkap + Ditonton sebagian + Mendatang + Tampilkan/Sembunyikan saluran + Hapus duplikat\? + Apakah Anda ingin menghapus semua saluran duplikat di daftar putar ini\? + Tampilkan saluran berikut \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index c40a74ef19a..cac9b0d2a8b 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -52,7 +52,7 @@ Tocca la lente d\'ingrandimento per iniziare. In diretta Spiacenti, non sarebbe dovuto succedere. - Segnala l\'errore via e-mail + Segnala via e-mail Spiacente, qualcosa è andato storto. Segnala Info: @@ -744,4 +744,14 @@ Disattiva copertina permanente Le playlist in grigio contengono già questo elemento. Doppione aggiunto %d volta/e + Ignora eventi dei pulsanti multimediali hardware + Utile usando cuffie con tasti fisici rotti + Rimuovi elementi doppi + Rimuovere gli elementi doppi\? + Rimuovere tutti gli elementi doppi di questa playlist\? + Mostra gli elementi seguenti + Mostra/Nascondi elementi + Visto parzialmente + Visto completamente + Prossimamente \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 6a83d9fad6e..e9b0798bbc1 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -16,7 +16,7 @@ 動画ファイルをダウンロードするフォルダーを選択して下さい デフォルトの画質 Kodi で再生 - Kore をインストールしますか? + Kode をインストールしますか? 「Kodi で再生」オプションを表示 Kodi メディアセンター経由で動画を再生するための設定を表示します 音声 @@ -718,4 +718,14 @@ 灰色で表示されているプレイリストには、すでにこのアイテムが含まれています。 %d 回重複追加されました 固定サムネイルの設定を解除 + 重複を削除しますか\? + たとえば、物理ボタンが壊れたヘッドセットを使用している場合に便利です + この再生リスト内の重複したストリームをすべて削除しますか\? + ハードウェア メディア ボタン イベントを無視する + 重複を削除 + 次のストリームを表示 + ストリームの表示/非表示 + 完全に視聴済み + 一部視聴済み + 今後 \ No newline at end of file diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index ecc868f9e84..9ba01e672f9 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -89,7 +89,7 @@ გადმოწერილი ვიდეო ფაილები ინახება აქ აუდიოს ჩამოტვირთვის საქაღალდე უფრო მაღალი რეზოლუციის ჩვენება - დააინსტალიროთ დაკარგული Kore აპი\? + დააინსტალიროთ დაკარგული Kode აპი\? აჩვენეთ \"დაუკარი კოდით\" ვარიანტი აჩვენეთ ვიდეოს დაკვრის ვარიანტი Kodi მედია ცენტრის საშუალებით შეტყობინებაში ნაჩვენები ვიდეოს ესკიზის ამოჭრა 16:9-დან 1:1-მდე ასპექტის თანაფარდობით diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 8e4d024aa9f..20ddac7762e 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -16,7 +16,7 @@ 비디오 파일이 다운로드 될 폴더를 선택하세요 기본 해상도 Kodi로 재생 - Kore 앱이 발견되지 않았습니다. Kore를 설치할까요\? + 누락된 한국어 앱을 설치하시겠습니까\? \"Kodi로 재생\" 옵션 표시 비디오를 Kodi 미디어 센터를 사용해 재생하는 옵션을 표시합니다 오디오 @@ -36,8 +36,8 @@ 다운로드된 오디오 파일이 이 곳에 저장됩니다 오디오 파일이 다운로드 될 폴더를 선택하세요 테마 - 어두운 테마 - 밝은 테마 + 다크 테마 + 라이트 테마 외관 백그라운드에서 재생 중 네트워크 오류 @@ -52,7 +52,7 @@ 컨텐츠를 사용할 수 없습니다 다운로드 메뉴를 설정할 수 없습니다 죄송합니다. 오류가 발생했습니다. - 이메일을 통해 이 오류 보고 + 이메일을 통해 보고 죄송합니다. 문제가 발생했습니다. 보고 정보: @@ -83,7 +83,7 @@ 높은 해상도 표시 일부 기기에서만 2K/4K 해상도 재생이 지원됩니다 기본 비디오 형식 - 검은 테마 + 블랙 테마 팝업 크기 및 위치 기억 마지막으로 사용한 팝업 위치 및 크기를 기억합니다 검색 제안 @@ -131,7 +131,7 @@ 비디오 없음 OK 파일명 - 쓰레드 + 스레드 오류 NewPipe 다운로드 중 터치해서 상세 정보 확인 @@ -150,7 +150,7 @@ NewPipe에 대해서 제3자 라이센스 © %3$s 하에서 %2$s 에 의한 %1$s - 정보 및 자주 묻는 질문들 + 정보 및 자주 묻는 질문 라이센스 가볍고 빠른 자유 안드로이드 스트리밍 앱입니다. 기여 @@ -181,14 +181,14 @@ 오디오 설정 눌러서 대기열에 추가 백그라운드에서 재생 - 팝업에서 재생 시작 + 팝업으로 재생 스트림 플레이어를 찾을 수 없습니다 (VLC를 설치하여 동영상을 재생할 수 있습니다). 스트림 파일 다운로드하기 정보 보기 재생목록 북마크 이곳에 추가 - 정확하지는 않지만 빠른 탐색 - 정확하지 않은 탐색은 더 빠르게 위치를 탐색할 수 있지만 정확도는 떨어집니다. 5, 15 또는 25초 탐색기능은 같이 동작하지 않음 + 정확하지 않은 빠른 탐색 사용 + 정확하지 않은 탐색을 사용하면 정확도가 떨어지는 대신 더 빠르게 위치를 탐색할 수 있습니다. 5초, 15초 또는 25초 탐색 기능은 이 기능과 같이 동작하지 않습니다 다음 스트림을 자동 대기열에 추가 이전 스트림이 반복 재생 대기열이 아닐 경우, 관련 스트림을 자동 재생 기본 콘텐츠 국가 @@ -259,15 +259,15 @@ 이전 내보내기 구독 목록 가져오기 실패 구독 목록 내보내기 실패 - 구글 테이크아웃에서 유튜브 구독 가져오기: + Google 테이크아웃에서 YouTube 구독 가져오기: \n -\n1. 다음 URL로 이동: %1$s -\n2. 요청 시 로그인 -\n3. \"모든 데이터 포함\"을 클릭한 다음 \"모두 선택 취소\"를 클릭한 후 \"구독\"만 선택하고 \"확인\" 클릭 -\n4. \"다음 단계\"를 클릭한 다음 \"내보내기 만들기\" 클릭 -\n5. \"다운로드\" 버튼이 나타나면 클릭 -\n6. 아래 파일 가져오기를 클릭하고 다운로드한 .zip 파일 선택 -\n7. [.zip 가져오기가 실패한 경우] .csv 파일(일반적으로 \"YouTube 및 YouTube Music/subscriptions/subscriptions.csv\" 아래에 있음)의 압축을 풀고, 아래 파일 가져오기를 클릭하고 압축을 푼 csv 파일 선택 +\n1. 이 URL로 이동합니다: %1$s +\n2. 요청에 따라 로그인을 합니다 +\n3. \"모든 데이터 포함됨\"을 클릭한 다음 \"모두 선택 해제\"를 클릭한 후 \"구독정보\"만 선택하고 \"확인\"을 클릭합니다 +\n4. \"다음 단계\"를 클릭한 다음 \"내보내기 생성\"을 클릭합니다 +\n5. \"다운로드\" 버튼이 나타나면 클릭합니다 +\n6. 아래의 \"파일 가져오기\"를 클릭하고 다운로드한 .zip 파일을 선택합니다 +\n7. [.zip 파일 가져오기를 실패한 경우] .csv 파일(일반적으로 \"YouTube 및 YouTube Music/구독정보/구독정보.csv\")을 추출하고, 아래의 \"파일 가져오기\"를 클릭한 후 추출한 csv 파일을 선택합니다 URL 또는 ID를 입력하여 SoundCloud 프로필을 가져옵니다: \n \n1. 웹 브라우저에서 \"데스크톱 모드\"를 활성화합니다(모바일 장치에서는 사이트를 사용할 수 없습니다) @@ -319,9 +319,9 @@ 구독 취소 탭 선택 제스처 음량 조작 - 제스처를 사용하여 재생기 볼륨 제어하기 + 제스처를 사용하여 플레이어의 볼륨 제어 제스처 밝기 조작 - 제스처를 사용하여 플레이어 밝기 제어 + 제스처를 사용하여 플레이어의 밝기 제어 업데이트 트랙 사용자 @@ -386,7 +386,7 @@ 댓글 없음 댓글을 불러올 수 없음 닫기 - 재생 재개 + 재생 위치 기억 마지막 재생 위치부터 재생 리스트 내 위치 표시 리스트에서 재생 위치를 표시합니다 @@ -480,16 +480,16 @@ 썸네일 보기 그룹 이름이 없음 - %d 일 + %d일 - %d 시간 + %d시간 - %d 분 + %d분 - %d 초 + %d초 시청 기록을 지우겠습니까\? 시청 기록 지우기 @@ -510,7 +510,7 @@ 시청한 것으로 처리 비활성화하면 비디오 설명과 추가 정보를 표시하지 않습니다 설명 표시하기 - 한 플레이어에서 다른 플레이어로 전환하면 대기열이 대체될 수 있음 + 한 플레이어에서 다른 플레이어로 전환하면 대기열이 대체될 수 있습니다 어두운 테마 최대 3개까지 축소 알림에 표시될 항목을 고를 수 있습니다! 아래의 각 알림 작업을 눌러 편집하세요. 오른쪽에 있는 확인란을 사용하여 압축 알림에 표시할 항목을 최대 3개까지 선택 @@ -522,7 +522,7 @@ reCAPTCHA 쿠키를 비웠습니다 플레이어 알림 알림 - 유튜브는 잔인할 수 있는 컨텐츠를 숨겨주는 \"제한 모드\"를 제공합니다 + YouTube는 잠재적으로 성인용 콘텐츠를 숨기는 \'제한 모드\'를 제공합니다 reCAPTCHA 쿠키 비우기 플레이어 크래시 발생 존재하지 않음 @@ -532,7 +532,7 @@ 다음에 대기열에 추가됨 다음 대기열에 넣기 현재 재생 중인 스트림 알림 구성 - 연령 제한(예: 18세 이상)이 있으므로 어린이에게 적합하지 않을 수 있는 콘텐츠 표시 + 연령 제한(예: 18세 이상)이 있어 어린이에게 적합하지 않을 수 있는 콘텐츠 표시 오류 보고 알림 NewPipe에 오류가 발생했습니다. 보고하려면 탭하세요 오류가 발생했습니다. 알림을 참조하세요 @@ -561,17 +561,17 @@ 오류 스낵바 표시 새로운 스트림 알림 구독에서 새로운 스트림에 대해 알림 - 주파수 확인 + 확인 빈도 필요한 네트워크 연결 모든 네트워크 업데이트 확인 새로운 버전을 수동으로 확인 자동으로 재생 시작 — %s Wi-Fi에서만 - 절대 + 사용하지 않음 탐색막대 썸네일 미리보기 고품질 (크게) - 저품질 (작음) + 저품질 (작게) 표시하지 않음 업데이트 확인 중… 디스크에서 다운로드한 모든 파일을 지우겠습니까\? @@ -588,10 +588,10 @@ 지역 검색 제안 원격 검색 제안 이 동영상은 연령 제한이 있습니다. -\n연령 제한 동영상에 대한 새로운 유튜브 정책으로 인해 NewPipe는 동영상 스트림에 접속할 수 없으므로 재생할 수 없습니다. +\n연령 제한 동영상에 대한 새로운 YouTube 정책으로 인해 NewPipe는 동영상 스트림에 접속할 수 없으므로 재생할 수 없습니다. reCAPTCHA를 해결할 때 NewPipe가 저장하는 쿠키 지우기 설명 - 코멘트 + 댓글 해결 잠금 화면 배경과 알림 모두에 썸네일 사용 선택한 구독이 없습니다 @@ -604,8 +604,8 @@ 예, 부분적으로 본 비디오 카테고리 %s에 의해 - 아래에서 좋아하는 밤 테마를 선택할 수 있습니다 - 이 영상은 유튜브 뮤직 프리미엄 회원만 볼 수 있어 뉴파이프에서 스트리밍이나 다운로드가 불가능합니다. + 아래에서 선호하는 어두운 테마를 선택할 수 있습니다 + 이 영상은 YouTube Music Premium 회원만 볼 수 있기 때문에 NewPipe에서 스트리밍이나 다운로드가 불가능합니다. 이 콘텐츠는 비공개이므로 NewPipe에서 스트리밍하거나 다운로드할 수 없습니다. 내부 처리 중... 시간이 걸릴 수 있습니다 @@ -676,29 +676,29 @@ 안드로이드 10부터 \'저장영역 접속 프레임워크\'만 지원됩니다 재생 목록에 추가되기 전과 후에 시청한 동영상은 제거됩니다. \n확실합니까\? 이것은 취소 할 수 없습니다! - 미니 플레이어에서 동영상을 시작하지 말고 자동 회전이 잠겨 있는 경우 전체 화면 모드로 직접 전환하십시오. 전체 화면을 종료하여 미니 플레이어에 계속 접속할 수 있습니다 + 화면 자동 회전이 잠겨 있는 경우 미니 플레이어에서 동영상을 시작하지 말고 바로 전체 화면 모드로 재생하세요. 전체 화면을 종료해서 미니 플레이어를 이용할 수도 있습니다 공식 라디오 설명에서 텍스트 선택 활성화 이 콘텐츠는 귀하의 국가에서 사용할 수 없습니다. - 좋아하는 밤 테마 선택 — %s + 선호하는 어두운 테마 선택 — %s 다운로드가 시작되었습니다 이제 설명 내에서 텍스트를 선택할 수 있습니다. 선택 모드에서는 페이지가 깜박이고 링크를 클릭할 수 없는 경우가 있습니다. 이 작업에 적합한 파일 관리자를 찾을 수 없습니다. \n저장영역 접속 프레임워크 호환 파일 관리자를 설치하십시오 이 작업에 적합한 파일 관리자를 찾을 수 없습니다. \n파일 관리자를 설치하거나 다운로드 설정에서 \'%s\'을(를) 비활성화하십시오 - 피드 로딩이 너무 느리다고 생각하십니까\? 그렇다면 빠른 로딩을 활성화해 보십시오 (설정에서 변경하거나 아래 버튼을 눌러 변경할 수 있습니다). + 피드 로딩이 너무 느리다고 생각하시나요\? 그렇다면 빠른 로딩을 활성화해 보세요. (설정에서 변경하거나 아래 버튼을 눌러 변경할 수 있습니다) \n \nNewPipe는 두 가지 피드 로딩 전략을 제공합니다: -\n• 느리지만 완전한 전체 구독 채널을 가져옵니다. -\n• 빠르지만 일반적으로 완전하지는 않은 전용 서비스 엔드포인트를 사용합니다. +\n• 전체 구독 채널 가져오기: 느리지만 완전합니다. +\n• 전용 서비스 엔드포인트 사용: 빠르지만 일반적으로 완전하지 않습니다. \n -\n둘의 차이점은 빠른 동영상은 일반적으로 항목의 길이나 유형(라이브 동영상과 일반 동영상을 구분할 수 없음)과 같은 일부 정보가 부족하고 더 적은 항목을 반환할 수 있다는 것입니다. +\n이 두 가지의 차이점은 빠른 방식이 일반적으로 항목의 길이나 유형(실시간 동영상과 일반 동영상을 구분할 수 없음)과 같은 일부 정보가 부족하고 더 적은 항목을 반환할 수 있다는 점입니다. \n -\n유튜브는 RSS 피드로 이 빠른 방법을 제공하는 서비스의 한 예입니다. +\nYouTube는 RSS 피드를 통해 이 빠른 방법을 제공하는 서비스의 예입니다. \n -\n따라서 선택은 속도 또는 정확한 정보 중에서 선호하는 것으로 귀결됩니다. +\n따라서 선택은 속도와 정확한 정보 중 무엇을 선호하느냐에 달려 있습니다. 이 기능은 아직 NewPipe에서 지원하지 않습니다. \n \n이후 버전에서 지원될 예정입니다. @@ -713,9 +713,19 @@ 최신 버전의 NewPipe를 실행 중입니다 %s를 다운로드하려면 탭하세요. 영구 썸네일 설정 해제 - 이 옵션은 테마로 %s를 선택한 경우에만 사용할 수 있음 + 이 옵션은 테마로 %s을 선택한 경우에만 사용할 수 있습니다 중복 추가 %d 번 회색으로 표시된 재생 목록에 이미 이 항목이 포함되어 있습니다. 카드 클립보드 복사 실패 + 복제 삭제 + 복제를 삭제하시겠습니까\? + 이 재생목록의 모든 스트림 복사본을 삭제하겠습니까\? + 다음 스트림 표시 + 부분적 시청 + 완전 시청 + 예정 + 하드웨어 미디어 버튼 이벤트 무시 + 예를 들어, 물리적 버튼이 망가진 헤드셋을 사용하는 경우 유용합니다 + 스트림 보이기/숨기기 \ No newline at end of file diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 5792c826c51..64026f53c95 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -29,7 +29,7 @@ Rodyti didesnes raiškas Tik kai kurie įrenginiai palaiko 2K/4K vaizdo įrašų peržiūrą Groti su Kodi - Įdiegti nereastą Kore programėlę\? + Įdiegti nereastą Kode programėlę\? Rodyti „Peržiūra su Kodi“ pasirinkimą Rodyti pasirinkimą peržiūrėti vaizdo įrašus per Kodi mediacentrą Garso įrašas diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 8667422dd11..5c5c7ba428c 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -562,7 +562,7 @@ Piemērot video attēlu 1:1 proporcijai Rādīt opciju atskaņot video ar Kodi mediju centru Rādīt \"Atskaņot ar Kodi\" opciju - Instalēt trūkstošo Kore aplikāciju\? + Instalēt trūkstošo Kode aplikāciju\? Atskaņot ar Kodi Tikai dažas ierīcas var atskaņot 2K/4K videoklipus Rādīt augstākas izšķirtspējas diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml index 078fd0fc45a..8fabe4fc5ad 100644 --- a/app/src/main/res/values-mr/strings.xml +++ b/app/src/main/res/values-mr/strings.xml @@ -34,11 +34,27 @@ इंस्टॉल प्लेअर सापडले नाही (तुम्ही VLC player वापरून फाईल चालवू शकता). प्लेअर सापडले नाही. VLC प्लेअर इंस्टॉल करू इच्छिता का\? - सुरू करण्यासाठी \"शोधा\" दाबा + प्रारंभ करण्यासाठी मॅग्निफाइंग ग्लासवर टॅप करा. कोडी वापरून चालवा फक्त काही उपकरणे 2k/4k व्हिडिओ चालवू शकतात वरचे रेसॉल्युशन दाखवा डिफॉल्ट पॉप अप रेसिल्युशन डीफॉल्ट रेसोल्युशन निवडा मध्ये टाका + %1$s रोजी प्रकाशित + \"कोडीबरोबर प्ले करा\" हा पर्याय दाखवा + कोडी मीडिया सेंटरद्वारे व्हिडिओ प्ले करण्याचा पर्याय प्रदर्शित करा + पाहिले म्हणून चिन्हांकित करा + ठीक आहे + प्लेअर क्रॅश करा + दुसरे क्रिया बटण + तिसरे क्रिया बटण + चौथे क्रिया बटण + पाचवे क्रिया बटण + तुम्हाला \"%1$s\" म्हणायचे आहे का\? + काही रेसॉल्युशनवर ऑडिओ काढून टाकते + गहाळ Kode ॲप इंस्टॉल करायचे\? + 16:9 ते 1:1 आस्पेक्ट रेशो पर्यंत नोटिफिकेशनमध्ये दाखवलेली व्हिडिओ थंबनेल क्रॉप करा + प्रथम क्रिया बटण + 1:1 आस्पेक्ट रेशोवर थंबनेल क्रॉप करा \ No newline at end of file diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 202597f2bba..24dcbfc867c 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -43,7 +43,7 @@ Papar resolusi yang lebih tinggi Hanya peranti tertentu yang boleh bermain video 2K/4K Main dengan Kodi - Pasangkan aplikasi Kore yang tidak dijumpai\? + Pasangkan aplikasi Kode yang tidak dijumpai\? Paparkan opsyen \"Main dengan Kodi\" Paparkan opsyen untuk memain video dengan Kodi Audio diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index ee2ba11a010..d03ae7c5abb 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -21,7 +21,7 @@ Velg nedlastingsmappe for lydfiler Forvalgt oppløsning Spill av med Kodi - Installer manglende Kore-app\? + Installer manglende Kode-app\? Vis \"Spill av med Kodi\"-valg Vis valg for avspilling via Kodi mediasenter Lyd diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 507ae7d1436..490b75bb8e2 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -564,8 +564,8 @@ Derde actie knop Tweede actie knop Eerste actie knop - Schaal de miniatuurafbeelding van de video die getoond wordt in de notificatie van 16:9 naar 1:1 verhouding (kan vervorming creëren) - Schaal miniatuurafbeelding naar verhouding 1:1 + Snij de miniatuurafbeelding van de video die getoond wordt in de notificatie bij van 16:9 naar een 1:1 verhouding + Miniatuurafbeelding naar verhouding 1:1 bijknippen Toon oorspronkelijke tijd geleden op items Laat Android de kleur van de notificatie aanpassen, op basis van de meest voorkomende kleur in de thumbnail (let op: niet beschikbaar op elk apparaat) Notificatie kleur aanpassen diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index c01a5a5c439..bd901a26f06 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -16,7 +16,7 @@ Voer de downloadlocatie in voor video\'s Standaardresolutie Afspelen met Kodi - Kore-app niet gevonden. Deze installeren\? + Kode-app niet gevonden. Deze installeren\? \"Afspelen met Kodi\"-optie tonen Toon een optie om een video af te spelen via Kodi media center Audio diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 16406583664..eacac40f163 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -118,7 +118,7 @@ ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକର ଟ୍ରାକ୍ ରଖନ୍ତୁ ଖେଳିବା ଆରମ୍ଭ କରନ୍ତୁ ଫୁଲ ସ୍କ୍ରିନରେ ମୁଖ୍ୟ ପ୍ଲେୟାର ଆରମ୍ଭ କରନ୍ତୁ - ସ୍ଵତଃ ଚଳିତ + ସ୍ୱତଃଚାଳନ URL ଚିହ୍ନି ପାରିଲା ନାହିଁ । ଅନ୍ୟ ଏକ ଆପ୍ ସହିତ ଖୋଲନ୍ତୁ\? ଡିଫଲ୍ଟ ବିଷୟବସ୍ତୁ ଦେଶ ଡିଫଲ୍ଟ ବିଷୟବସ୍ତୁ ଭାଷା @@ -128,7 +128,7 @@ ଇନଷ୍ଟାଣ୍ଟ ପୂର୍ବରୁ ବିଦ୍ୟମାନ ଅଛି ପ୍ଲେୟାର ଇତିହାସ ଏବଂ କ୍ୟାଚ୍ - ଦୃଶ୍ୟ + ରୂପ ତ୍ରୁଟି ନିବାରଣ କରନ୍ତୁ ଅଦ୍ୟତନଗୁଡିକ ପ୍ଲେବେକ୍ ଲୋଡ୍ ବ୍ୟବଧାନ ଆକାର @@ -149,7 +149,7 @@ ଭିଡିଓ \"ବିବରଣୀ:\" ରେ ପୃଷ୍ଠଭୂମି କିମ୍ବା ପପ୍ଅପ୍ ବଟନ୍ ଦବାଇବା ସମୟରେ ଟିପ୍ ଦେଖାନ୍ତୁ ଆପଣଙ୍କର ପ୍ରିୟ PeerTube ଉଦାହରଣଗୁଡିକ ବାଛନ୍ତୁ ବ୍ୟବହାର - ଭିଡିଓ ଏବଂ ଅଡିଓ + ଵିଡ଼ିଓ ଓ ଅଡ଼ିଓ ମିନି ପ୍ଲେୟାରରେ ଭିଡିଓ ଆରମ୍ଭ କରନ୍ତୁ ନାହିଁ, କିନ୍ତୁ ଅଟୋ ଘୂର୍ଣ୍ଣନ ବନ୍ଦ ହୋଇଗଲେ ସିଧାସଳଖ ଫୁଲ୍ ସ୍କ୍ରିନ୍ ମୋଡ୍ କୁ ଯାଆନ୍ତୁ। ଫୁଲ୍ ସ୍କ୍ରିନ୍ ଛାଡି ଆପଣ ଏପର୍ଯ୍ୟନ୍ତ ମିନି ପ୍ଲେୟାରକୁ ପ୍ରବେଶ କରିପାରିବେ ଏହା ଉପରେ ଟ୍ୟାପ୍ କରି ନିମ୍ନରେ ପ୍ରତ୍ୟେକ ବିଜ୍ଞପ୍ତି କାର୍ଯ୍ୟ ସଂପାଦନ କରନ୍ତୁ। ଡାହାଣରେ ଥିବା ଚେକ୍ ବକ୍ସ ବ୍ୟବହାର କରି କମ୍ପାକ୍ଟ ବିଜ୍ଞପ୍ତିରେ ଦେଖାଯିବାକୁ ସେମାନଙ୍କ ମଧ୍ୟରୁ ତିନୋଟି ପର୍ଯ୍ୟନ୍ତ ଚୟନ କରନ୍ତୁ ଥମ୍ବନେଲ ଲୋଡିଂ, ଡାଟା ଏବଂ ମେମୋରୀ ବ୍ୟବହାରକୁ ରୋକିବା ପାଇଁ ବନ୍ଦ କରନ୍ତୁ । ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ଉଭୟ ଇନ-ମେମୋରୀ ଏବଂ ଅନ୍-ଡିସ୍କ ଇମେଜ୍ କ୍ୟାଚ୍ ସଫା କରେ @@ -287,7 +287,7 @@ ଆପଣ ଡିଫଲ୍ଟ ପୁନଃସ୍ଥାପନ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? NewPipe ଏକ ତ୍ରୁଟିର ସମ୍ମୁଖୀନ ହେଲା, ରିପୋର୍ଟ କରିବାକୁ ଟ୍ୟାପ୍ କରନ୍ତୁ ଦୁଃଖିତ, ତାହା ହୋଇ ନଥାନ୍ତା । - ଇ-ମେଲ ମାଧ୍ୟମରେ ଏହି ତ୍ରୁଟି ରିପୋର୍ଟ କରନ୍ତୁ + ଇ-ମେଲ ମାଧ୍ୟମରେ ରିପୋର୍ଟ କରନ୍ତୁ GitHub ରେ ରିପୋର୍ଟ କରନ୍ତୁ ଭିଡିଓ ଅଡିଓ @@ -446,7 +446,7 @@ ନାପସନ୍ଦ ମନ୍ତବ୍ୟ ଗୁଡିକ ବର୍ଣ୍ଣନା - ମିଲିୟନ + ନିୟୁତ ସମାଧାନ ପ୍ଲେବେକ୍ ସ୍ପିଡ୍ ନିୟନ୍ତ୍ରଣ ଟେମ୍ପୋ @@ -538,7 +538,7 @@ ସମ୍ବନ୍ଧୀୟ ଆଇଟମ୍ ଗୁଡ଼ିକ ପୁନଃ ସଯାଇବାକୁ ଡ୍ରାଗ୍ କରନ୍ତୁ ବିରାମ - ବିଲିଅନ୍ + ଵୃନ୍ଦ କୌଣସି ଗ୍ରାହକ ନାହାଁନ୍ତି ସୃଷ୍ଟି କରନ୍ତୁ ବିବରଣୀ ପାଇଁ ଟ୍ୟାପ୍ କରନ୍ତୁ @@ -731,4 +731,14 @@ ସ୍ଥାୟୀ ଥମ୍ୱନେଲ୍ ସେଟ୍ କରନ୍ତୁ ଧୂସର ହୋଇଯାଇଥିବା ପ୍ଲେଲିଷ୍ଟଗୁଡିକ ପୂର୍ବରୁ ଏହି ଆଇଟମ୍ ଧାରଣ କରିଥାଏ । ନକଲ %d ସମୟ (ମୋଟ) ଯୋଡି ହୋଇଛି + ହାର୍ଡୱେର୍ ମିଡିଆ ବଟନ୍ ଇଭେଣ୍ଟଗୁଡ଼ିକୁ ଉପେକ୍ଷା କରନ୍ତୁ + ଉପଯୋଗୀ, ଉଦାହରଣ ସ୍ୱରୂପ, ଯଦି ଆପଣ ଭଙ୍ଗା ଶାରୀରିକ ବଟନ୍ ସହିତ ହେଡସେଟ୍ ବ୍ୟବହାର କରୁଛନ୍ତି + ନକଲଗୁଡିକ ଅପସାରଣ କରନ୍ତୁ + ନକଲ ଗୁଡିକ ହଟାନ୍ତୁ\? + ଆପଣ ଏହି ପ୍ଲେଲିଷ୍ଟରେ ଥିବା ସମସ୍ତ ନକଲ ଷ୍ଟ୍ରିମ୍ ଅପସାରଣ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? + ନିମ୍ନଲିଖିତ ଷ୍ଟ୍ରିମ୍ ଗୁଡିକ ଦେଖାନ୍ତୁ + ଷ୍ଟ୍ରିମ୍ ଗୁଡିକ ଦେଖାନ୍ତୁ/ଲୁଚାନ୍ତୁ + ପୁରା ଦେଖାଯାଇଛି + ଆଂଶିକ ଦେଖାଯାଇଛି + ଆଗାମୀ \ No newline at end of file diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 438fe48084d..f5a38353bc1 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -138,7 +138,7 @@ ਇੱਕ ਤਰੁੱਟੀ ਆਈ ਹੈ: %1$s ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਕੋਈ ਸਟ੍ਰੀਮ ਉਪਲਬਧ ਨਹੀਂ ਹੈ ਮੁਆਫ ਕਰਨਾ, ਅਜਿਹਾ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ ਸੀ। - ਈ-ਮੇਲ ਦੁਆਰਾ ਇਸ ਤਰੁੱਟੀ ਦੀ ਇਤਲਾਹ ਦਿਓ + ਈ-ਮੇਲ ਦੁਆਰਾ ਇਤਲਾਹ ਦਿਓ ਅਫ਼ਸੋਸ ਹੈ, ਕੁਝ ਤਰੁੱਟੀਆਂ ਸਾਹਮਣੇ ਆਈਆਂ ਹਨ। ਇਤਲਾਹ ਕਰੋ ਜਾਣਕਾਰੀ: @@ -731,4 +731,14 @@ ਕਾਰਡ ਪਲੇਲਿਸਟਾਂ ਜੋ ਧੁੰਦਲੀਆਂ ਹੋ ਗਈਆਂ ਹਨ ਉਹਨਾਂ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਇਹ ਆਈਟਮ ਹੈ। ਡੁਪਲੀਕੇਟ ਜੋੜਿਆ ਗਿਆ %d ਵਾਰ + ਉਪਯੋਗੀ ਹੈ, ਉਦਾਹਰਨ ਲਈ, ਜੇਕਰ ਤੁਸੀਂ ਟੁੱਟੇ ਭੌਤਿਕ ਬਟਨਾਂ ਵਾਲਾ ਹੈੱਡਸੈੱਟ ਵਰਤ ਰਹੇ ਹੋ + ਡੁਪਲੀਕੇਟ ਹਟਾਓ + ਕੀ ਡੁਪਲੀਕੇਟ ਹਟਾਉਣੇ ਹਨ\? + ਕੀ ਤੁਸੀਂ ਇਸ ਪਲੇਲਿਸਟ ਵਿੱਚ ਸਾਰੀਆਂ ਡੁਪਲੀਕੇਟ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਅੱਗੇ ਦਿੱਤੀਆਂ ਸਟ੍ਰੀਮਾਂ ਵਿਖਾਓ + ਪੂਰੀ ਤਰ੍ਹਾਂ ਵੇਖਿਆ ਗਿਆ + ਅੰਸ਼ਕ ਤੌਰ \'ਤੇ ਵੇਖਿਆ ਗਿਆ + ਆਗਾਮੀ + ਹਾਰਡਵੇਅਰ ਮੀਡੀਆ ਬਟਨ ਇਵੈਂਟਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰੋ + ਸਟ੍ਰੀਮ ਵਿਖਾਓ/ਲੁਕਾਓ \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 6ca815fb760..109accb820e 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -754,4 +754,12 @@ Dodano duplikat %d raz(y) Przydatne, na przykład, jeśli używasz zestawu słuchawkowego z zepsutymi fizycznymi przyciskami Ignoruj zdarzenia sprzętowego przycisku multimedialnego + Czy usunąć duplikaty\? + Pokaż następujące strumienie + Pokaż/Ukryj strumienie + Usuń duplikaty + Czy chcesz usunąć wszystkie zduplikowane strumienie z tej playlisty\? + W pełni obejrzane + Częściowo obejrzane + Nadchodzące \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 388673db630..91be57038ec 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -746,4 +746,12 @@ As playlists em cinza já contêm este item. Ignorar eventos de botão de mídia de hardware Útil, por exemplo, se você estiver usando um fone de ouvido com botões físicos quebrados + Remover duplicados + Remover duplicados\? + Deseja remover todos os streams duplicados nesta playlist\? + Mostrar os seguintes streams + Mostrar/ocultar streams + Parcialmente assistido + Em breve + Totalmente assistido \ No newline at end of file diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 749784f2a56..9c3958ba3c0 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -44,6 +44,7 @@ Histórico de visualizações %s visualização + %s visualizações %s visualizações Deseja limpar o histórico de descargas ou remover todos os ficheiros descarregados\? @@ -111,10 +112,12 @@ Criado por %s %d segundo + %d segundos %d segundos %d selecionada + %d selecionadas %d selecionadas Partilhar @@ -147,6 +150,7 @@ \nTem a certeza\? Esta ação não pode ser revertida! %s a ver + %s a ver %s a ver Por favor aguarde… @@ -232,6 +236,7 @@ Ainda não há listas de reprodução favoritas %s ouvinte + %s ouvintes %s ouvintes Remover todo o histórico de pesquisas\? @@ -256,6 +261,7 @@ Abrir menu %s subscritor + %s subscritores %s subscritores Deseja repor as predefinições\? @@ -284,6 +290,7 @@ Remover vídeos visualizados\? %d minuto + %d minutos %d minutos Terminada @@ -330,12 +337,14 @@ Recentes %s vídeo + %s vídeos %s vídeos Importar Remove o histórico dos vídeos reproduzidos e as posições de reprodução %d dia + %d dias %d dias Pausa nas transferências @@ -346,6 +355,7 @@ Página \'kiosk\' %d hora + %d horas %d horas Enfileirar o próximo stream automaticamente @@ -649,10 +659,12 @@ Sugestões de pesquisa locais %1$s descarga apagada + %1$s descargas apagadas %1$s descargas apagadas Descarga concluída + %s descargas concluídas %s descargas concluídas Deslizar itens para removê-los @@ -691,6 +703,7 @@ Notificações são desativadas %s fluxo novo + %s fluxos novos %s fluxos novos Notificar sobre novos fluxos de assinaturas @@ -731,6 +744,14 @@ Cartão As listas de reprodução acinzentadas já contêm este item. Duplicar adicionado %d vez(es) - Ignorar eventos com botões de hardware + Ignorar eventos com botões físicos Útil, por exemplo, se estiver a utilizar um auscultador com botões físicos defeitos + Remover duplicados + Mostrar os seguintes fluxos + Mostrar/ocultar fluxos + Completamente visto + Parcialmente visto + Proximamente + Remover duplicados\? + Quer remover todos os fluxos duplicados nesta lista de reprodução\? \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 7830ad0b408..0d71e00b8e9 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -744,6 +744,14 @@ Cartão As listas de reprodução acinzentadas já contêm este item. Duplicar adicionado %d vez(es) - Ignorar eventos com botões de hardware - Útil, por exemplo, se estiver a utilizar um auscultador com botões físicos defeitos + Ignorar eventos com botões físicos + Útil por exemplo se estiver a utilizar auscultadores com botões físicos danificados + Remover duplicados + Remover duplicados\? + Mostrar/ocultar vídeos + Proximamente + Quer remover todos os vídeos duplicados nesta lista de reprodução\? + Completamente visto + Mostrar os seguintes vídeos + Parcialmente visto \ No newline at end of file diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 08f8f6a1f9f..84eed26ecbb 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -55,7 +55,7 @@ Descărcări Raport de erori Ne pare rău, asta nu trebuia să se întâmple. - Raportați această eroare prin e-mail + Raport prin e-mail Ne pare rău, ceva a mers prost. Raportați Informații: @@ -92,7 +92,7 @@ Toate Dezactivat Aplicația/UI s-a oprit - Ce:\\nSolicitare:\\nLimba conținutului:\\nȚara conținutului:\\nLimba aplicației:\\nServiciu:\\nOra GMT:\\nPachet:\\nVersiune: \\nVersiune SO: + Ce:\\nSolicitare:\\nLimba conținutului:\\nȚara conținutului:\\nLimba aplicației:\\nServiciu:\\nOra GMT:\\nPachet:\\nVersiune:\\nVersiune SO: k mil. mld. @@ -580,9 +580,9 @@ Nimeni nu ascultă - %s vizionează - %s vizionează - %s vizionează + %s spectator + %s spectatori + %s spectatori Nimeni nu se uită Comutare serviciu, selectat în prezent: @@ -744,4 +744,14 @@ Dezactivare miniatură permanentă Listele de redare care colorate în gri conțin deja acest element. Duplicat adăugat de %d ori + Ignoră evenimentele butonului media hardware + Util, de exemplu, dacă utilizezi o cască cu butoane fizice defecte + Dorești să elimini toate fluxurile dublate din această listă de redare\? + Eliminare dubluri + Elimini dublurile\? + Afișează următoarele fluxuri + Afișare/Ascundere fluxuri + Vizionat complet + Vizionat parțial + Urmează \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c9e27f46d5b..2f9ca0f4e66 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -748,4 +748,14 @@ Убрать постоянную миниатюру Дубликат добавлен %d раз(а) Плейлисты, выделенные серым уже содержат этот объект. + Игнорировать события аппаратной мультимедийной кнопки + Полезно, например, если вы используете гарнитуру со сломанными физическими кнопками + Показать следующие стримы + Показать/скрыть стримы + Полностью просмотрено + Предстоящие + Удалить дубликаты + Удалить дубликаты\? + Частично просмотрено + Вы хотите удалить все повторяющиеся потоки в этом плейлисте\? \ No newline at end of file diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index ce25d6b3fad..d2af2693057 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -184,7 +184,7 @@ Ite est acontèssidu: Informatziones: Sinnala - Sinnala custu errore pro mèdiu de posta eletrònica + Sinnala cun sa posta eletrònica Iscusa, custu non diat dèpere èssere acontèssidu. Fruni su permissu pro l\'ammustrare in subra de àteras aplicatziones Cheres ripristinare sos valores predefinidos\? @@ -731,4 +731,14 @@ Disativa sa miniadura permanente Sas iscalitas in colore murru tenent giai custu elementu. Duplicadu annantu %d borta(s) + Ignora eventos de sos butones multimediales fìsicos + Ùtile, a esempru, si ses impreende cùfias cun butones fìsicos segados + Ammustra sos flussos chi sighint + Boga sos duplicados + Bogare sos duplicados\? + Boles bogare totu sos flussos duplicados in custa iscalita\? + Ammustra/Cua flussos + Bidu de su totu + Bidu in parte + Luego \ No newline at end of file diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 08c22c5f740..cbc248b8b92 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -4,4 +4,23 @@ ඔබ අදහස් කළේ \"%1$s\" ද\? සැකසුම් සොයන්න + බාහිර මෘදුකාංගයක් භාවිත කරන්න + Subscribe කිරීම + ටැබය තෝරන්න + භාගත කල චලන රූප මෙහි තැන්පත් ය + ආරම්භ කිරීමට අණ්වීක්ෂය ඔබන්න. + හරහා විවෘත කරන්න + බෙදාගන්න + පලකරන ලද්දේ %1$s + ස්ථාපනය කරන්න + අවලංගු කරන්න + Browser එක මගින් විවෘත කරන්න + බාගත කරන්න + බැලූ ලෙස සලකුණු කරන්න + හරි + %s සඳහා ප්‍රතිපල පෙන්වයි + Subscribe කර ඇත + ඇතුලත් කරන්න මෙයට + චලන රූප භාගත කරන ස්තානය + චලන රූප ගබඩා කිරීමට ස්තානයක් තෝරන්න \ No newline at end of file diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 7c248c53eff..5fbe1c01288 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -507,7 +507,7 @@ Formati i parazgjedhur audio Shfaq një opsion për të luajtur videot përmes Kodi Shfaq opsionin \"Luaj me Kodi\" - Instaloni aplikacionin Kore që mungon\? + Instaloni aplikacionin Kode që mungon\? Vetëm disa pajisje mund të luajnë video 2K/4K Shfaq rezolucione më të larta Rezolucioni i parazgjedhur i popup diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index dbff70e8f0d..92a1d2294c7 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -104,7 +104,7 @@ Misslyckades med att spela denna ström Allvarligt spelarfel inträffade Återhämtar sig från spelarfel - Rapportera detta fel via e-post + Rapportera via e-post Vad:\\nBegäran:\\nInnehållsspråk:\\nInnehållsland:\\nApp-språk:\\nTjänst:\\nGMT-tid:\\nPaket:\\nVersion:\\nOS-version: Spela video, längd: Uppladdarens avatar-miniatyrbild @@ -731,4 +731,14 @@ Kort Dubblett tillagd %d gång(er) Spellistor som är gråmarkerade innehåller redan det här objektet. + Användbart om du till exempel använder ett headset med trasiga fysiska knappar + Ignorera hårdvarans media knappar + Ta bort dubbletter\? + Visa följande strömmar + Delvis sedd + Vill du ta bort alla duplicerade strömmar i den här spellistan\? + Ta bort dubbletter + Visa/Dölj strömmar + Fullständigt sedd + Kommande \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 9449e05a50e..7943e8adf1f 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -733,4 +733,12 @@ Gri oynatma listeleri halihazırda bu ögeyi içeriyor. Donanımsal ortam düğmesi olaylarını yoksay Örneğin, fiziksel düğmeleri bozuk bir kulaklık kullanıyorsanız kullanışlıdır + Kopyaları kaldır + Kopyalar kaldırılsın mı\? + Bu oynatma listesindeki tüm yinelenen akışları kaldırmak istiyor musunuz\? + Aşağıdaki akışları göster + Akışları göster/gizle + Tamamen izlendi + Yaklaşan + Kısmen izlendi \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 4c977dd4e92..6706396aed3 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -21,7 +21,7 @@ Завантажені аудіофайли зберігаються тут Типова роздільність Програти в Kodi - Встановити відсутній застосунок Kore\? + Установити відсутній застосунок Kore\? Показати опцію «Відтворити у Kodi» Показати опцію відтворення відео в Kodi Аудіо @@ -750,4 +750,12 @@ У виділених сірим кольором добірках цей елемент уже є. Ігнорувати події апаратних медіакнопок Корисно, наприклад, якщо ви використовуєте гарнітуру зі зламаними фізичними кнопками + Вилучити дублікати + Вилучити дублікати\? + Бажаєте вилучити всі повторювані трансляції в цій добірці\? + Показати/сховати трансляції + Незабаром + Показати такі трансляції + Повністю переглянуто + Частково переглянуто \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index bb6b38d3ec0..fc00769ba3d 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -28,7 +28,7 @@ Hiện độ phân giải cao hơn Chỉ một số thiết bị hỗ trợ phát video 2K/4K Phát bằng Kodi - Cài đặt ứng dụng Kore\? + Cài đặt ứng dụng Kode\? Hiện tùy chọn \"Phát bằng Kodi\" Hiện tùy chọn phát video qua trung tâm media Kodi Âm thanh @@ -716,4 +716,5 @@ Tùy chọn này chỉ được bật khi chủ đề %s được dùng Nhấn để tải %s Chế độ tia sét + Danh sách này bị trùng lặp. \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 8393fe0cea6..4ee6bc285c5 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -720,4 +720,12 @@ 重复添加了 %d 次 如果你在使用一副物理按钮坏掉的耳机,该选项应该会有帮助 忽略硬件媒体按钮事件 + 删除重复吗? + 你想删除这个播放列表中所有重复项吗? + 显示下列音视频流 + 显示/隐藏音视频流 + 完整看过 + 只看了一部分 + 即将到来 + 删除重复 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 701b89c079c..ee1ef78e5f7 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -7,9 +7,9 @@ 下載 搜尋 設定 - 您係咪想搵「%1$s」? - 用外面嘅影片播放器 - 用外面嘅音樂播放器 + 你係咪想搵「%1$s」? + 用出面嘅影片播放器 + 用出面嘅音樂播放器 影片下載路徑 下載咗嘅影片檔案會收埋喺度 揀選影片檔案嘅下載資料夾 @@ -37,7 +37,7 @@ 劣評 搵唔到串流播放器。要唔要裝 VLC? 喺瀏覽器開啟 - 分享影片 + 分享影片比 音樂下載資料夾 下載咗嘅音樂檔案會收埋喺度 揀選音樂檔案嘅下載資料夾 @@ -51,7 +51,7 @@ 解析唔到網站 設定唔到下載功能表 啫係嗱,世事講唔埋嘅,真係唔好意思。 - 以電郵報告今次問題 + 以電郵報告 出咗啲問題,唔好意思。 報告 資訊: @@ -94,7 +94,7 @@ 以浮面模式開啟 \n有呢個權限至得 要完成 reCAPTCHA 考驗 - 某啲解像度可能會冇聲 + 某啲影片可能會冇聲 幕後播 浮面播 記住浮面點擺法 @@ -112,7 +112,7 @@ 版權協議 喺 Android 上盡享自由輕便串流。 去 GitHub 睇下 - NewPipe 嘅授權協議 + NewPipe 嘅版權協議 無論您對翻譯、設計改動、打掃程式碼,抑或開山劈石編寫程式碼有咩偈仔,都無任歡迎您幫手。聚沙成塔,眾志成城! 閱讀版權協議 貢獻 @@ -122,7 +122,7 @@ 訂閱 訂閱咗 取消訂閱 - 已成功取消訂閱頻道 + 已取消訂閱頻道 轉唔到訂閱 更新唔到訂閱 顯示資訊 @@ -154,8 +154,8 @@ 跳前/跳後嘅快轉長短 關閉去隱藏影片描述同附加資訊 剔低睇過 - 開啟方式 - 搵緊呢挺嘢:%s + 開啟方式係 + 搜尋到嘅嘢係:%s 第五粒動作掣 撳一下下面每粒掣去更改各個通知動作。用右手邊嘅格仔剔選最多三個,擺喺精簡通知度顯示 精簡通知最多淨係擺到三個動作! @@ -604,7 +604,7 @@ 通知已停用 單曲 全部剷走晒播放到邊個位 - 請查看係咪已經有人喺度講緊您呢次彈 app 嘅狀況。若然重複發表新嘅議題,將會嘥我哋可以真正用嚟修復個問題嘅時間㗎喇。 + 請睇過係咪已經有人喺度講緊您呢次彈 app 嘅狀況。若然重複發表新嘅議題,就會嘥咗我哋可以真正用嚟修復個問題嘅時間㗎喇。 NewPipe 係由一班熱心人用空閒時間義務開發,為您帶嚟最佳嘅使用體驗。係時候少少無拘,支持返開發者令 NewPipe 更臻完美,同時一顆心意挺佢哋可以嘆返杯咖啡。 站內 聚首 @@ -713,9 +713,19 @@ 您已經用緊最新版本嘅 NewPipe 撳一下去下載 %s 唔再揀定封面縮圖 - 色系揀做%s嘅時候至有得揀 + 色系揀做%s 嘅時候至有得揀 複製唔到去剪貼簿 一張張 灰咗嘅播放清單,即係已經有呢個項目。 重複加入咗 %d 次 + 忽略硬件多媒體掣嘅事件 + 譬如話您個耳機上面啲實體掣軭咗就會有用 + 重複嗰啲剷咗佢 + 重複咗嗰啲係咪要剷走? + 下列嘅串流騷出嚟 + 顯示/隱藏串流 + 睇晒 + 未睇晒 + 未夠鐘上畫 + 您係咪要剷走呢個播放清單入面所有重複咗嘅串流? \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 2cc840ac865..75e77fa18cc 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -20,7 +20,7 @@ 用 Kodi 播放 顯示用 Kodi 媒體中心播放影片的選項 聲音 - 未找到 Kore app,是否安裝? + 要安裝缺少的 Kore 應用程式嗎? 顯示「用 Kodi 播放」的選項 預設音訊格式 主題 @@ -720,4 +720,12 @@ 變灰的播放清單已經包含此項目。 忽略硬體媒體鍵事件 這很有用,舉例來說,若您正在使用物理按鍵壞掉的耳機 + 移除重複的? + 顯示以下串流 + 顯示/隱藏串流 + 完全觀看 + 部份觀看 + 即將到來 + 移除重複的 + 您想要移除所有在此播放清單中重複的串流? \ 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 e1c75bba412..dd8b8a58d62 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -46,7 +46,7 @@ Show higher resolutions Only some devices can play 2K/4K videos Play with Kodi - Install missing Kore app? + Install missing Kore app\? Show \"Play with Kodi\" option Display an option to play a video via Kodi media center Crash the player diff --git a/fastlane/metadata/android/az/changelogs/989.txt b/fastlane/metadata/android/az/changelogs/989.txt new file mode 100644 index 00000000000..cb32456dc4d --- /dev/null +++ b/fastlane/metadata/android/az/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] İstənilən videonu oynatmağa cəhd edilərkən sonsuz tüklənmə düzəldildi +• [YouTube] Bəzi videolarda yavaşılama aradan qaldırıldı +• jsoup kitabxanası 1.15.3 versiyasına qədər yeniləndi, buraya da təhlükəsizlik riskləri aradan qaldırılması da daxildir diff --git a/fastlane/metadata/android/cs/changelogs/66.txt b/fastlane/metadata/android/cs/changelogs/66.txt index d62f6db4fa8..3c892ffdc99 100644 --- a/fastlane/metadata/android/cs/changelogs/66.txt +++ b/fastlane/metadata/android/cs/changelogs/66.txt @@ -1,16 +1,18 @@ -# Changelog of v0.13.7 +# v0.13.17 - seznam změn -### Fixed -- Fix sort filter issues of v0.13.6 +### Opraveno +- Řazení filtrů -# Changelog of v0.13.6 +# v0.13.6 - seznam změn -### Improvements +### Vylepšeno -- Disable burgermenu icon animation #1486 -- undo delete of downloads #1472 -- Download option in share menu #1498 -- Added share option to long tap menu #1454 -- Minimize main player on exit #1354 -- Library version update and database backup fix #1510 -- ExoPlayer 2.8.2 Update #1392 +- Zakázání animace tlačítka menu +- Zrušení odstranění stahování +- Možnost stažení v menu sdílení +- Sdílení v menu při dlouhém podržení +- Minimalizace hlavního přehrávače při opuštění +-Aktualizace ExoPlayer 2.8.2 + - Přepracován dialog ovládání rychlosti přehrávání + - Přidán přepínač pro rychlé přetočení v tichých částech +Další změny/opravy viz GitHub. diff --git a/fastlane/metadata/android/cs/changelogs/993.txt b/fastlane/metadata/android/cs/changelogs/993.txt new file mode 100644 index 00000000000..3df0fe64b4a --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/993.txt @@ -0,0 +1,13 @@ +Nové +• Upozornění při přidávání duplicit do playlistu a tlačítko pro jejich odstranění +• Povolit ignorování hardwarových tlačítek +• Povolit skrývání částečně zhlédnutých videí v kanálu + +Vylepšeno +• Více sloupců mřížky na velkých obrazovkách +• Ukazatele průběhu konzistentní s nastavením + +Opraveno +• Oprava otevírání URL prohlížeče, stahování a externích přehrávačů v Android 11+ +• Oprava interakce s celou obrazovkou v MIUI +• Úpravy nastavení ExoPlayer pro opravu přehrávání na některých zařízeních diff --git a/fastlane/metadata/android/es/changelogs/993.txt b/fastlane/metadata/android/es/changelogs/993.txt new file mode 100644 index 00000000000..66c147a4289 --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/993.txt @@ -0,0 +1,13 @@ +Nuevo +• Aviso al poner duplicados en lista de reproducción y botón para quitarlos +• Ignorar botones físicos +• Ocultar videos vistos a medias en el feed + +Mejorado +• Más columnas en pantallas grandes +• Indicadores de progreso sean consistentes con la configuración + +Solucionado +• Abrir URL del navegador, descargas y reproductores externos en Android 11+ +• Interación en pantalla completa, requería dos toques en MIUI +• Cambiar la configuración de ExoPlayer para la reproducción en algunos dispositivos diff --git a/fastlane/metadata/android/eu/changelogs/66.txt b/fastlane/metadata/android/eu/changelogs/66.txt deleted file mode 100644 index cd2fcc89940..00000000000 --- a/fastlane/metadata/android/eu/changelogs/66.txt +++ /dev/null @@ -1,13 +0,0 @@ -# Changelog of v0.13.7 - -### Improvements - -- Download option in share menu #1498 -- Added share option to long tap menu #1454 -- Minimize main player on exit #1354 - - Support different step sizes for faster speed change - - Added a toggle to fast-forward during silences in playback speed control - - Refactored media source resolution - - Fixed remote playlist metadata not updating. - - Various UI fixes -- Use new extractor with refactored architecture for multiservice. diff --git a/fastlane/metadata/android/hi/changelogs/993.txt b/fastlane/metadata/android/hi/changelogs/993.txt new file mode 100644 index 00000000000..e3aa57e5ff4 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/993.txt @@ -0,0 +1,13 @@ +New +• Add warning when adding playlist duplicates and add button to remove them +• Allow ignoring hardware buttons +• Allow hiding partially watched videos in feed + +Improved +• Use more grid columns on big screens +• Make progress indicators consistent with settings + +Fixed +• Fix opening browser URLs, downloads and external players on Android 11+ +• Fix interacting with fullscreen requiring two taps on MIUI +• Allow tweaking ExoPlayer settings to fix playback on some devices diff --git a/fastlane/metadata/android/id/changelogs/66.txt b/fastlane/metadata/android/id/changelogs/66.txt deleted file mode 100644 index 4681fb5f464..00000000000 --- a/fastlane/metadata/android/id/changelogs/66.txt +++ /dev/null @@ -1,3 +0,0 @@ -old version not being translated. (F-Droid only show updated verson description) -versi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru) -(weblate notification : Translation text too long! (terjemahan terlalu panjang). diff --git a/fastlane/metadata/android/it/changelogs/993.txt b/fastlane/metadata/android/it/changelogs/993.txt new file mode 100644 index 00000000000..b7098fd2405 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/993.txt @@ -0,0 +1,13 @@ +Nuovo +• Aggiunto avviso di aggiunta playlist doppia e un pulsante per rimuoverla +• Ignora pulsanti hardware +• Nascondi video visti parzialmente + +Migliorato +• Usa più colonne nella griglia su schermi grandi +• Indicatori di avanzamento consistenti con le impostazioni + +Corretto +• Fix apertura URL, download e player esterni su Android 11+ +• Fix interazione con schermo intero che richiedeva due otcchi su MIUI +• Regola le impostazioni di ExoPlayer per correggere la riproduzione su alcuni dispositivi diff --git a/fastlane/metadata/android/ko/changelogs/992.txt b/fastlane/metadata/android/ko/changelogs/992.txt new file mode 100644 index 00000000000..5798994fd07 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/992.txt @@ -0,0 +1,17 @@ +새로운 기능 +• 영상 상세정보에서 구독자 수 표시 +• 대기열에서 다운로드 +• 영구적으로 재생목록 썸네일 설정 +• 해시태그와 링크 길게 누르기 +• 카드 보기 모드 + +향상된 기능 +• 더 커진 미니 플레이어 닫기 버튼 +• 더 부드러운 썸네일 다운스케일링 +• 안드로이드 13 지원 (API 33) +• 검색 시 플레이어를 중지하지 않음 + +수정된 기능 +• Dex/마우스에서 오버레이 수정 +• 별도의 오디오 스트림 없이 백그라운드 플레이어 허용 +• 다양한 YouTube 수정들과 더 많은 것들… diff --git a/fastlane/metadata/android/pa/changelogs/986.txt b/fastlane/metadata/android/pa/changelogs/986.txt index c9ab694a465..b072d6cb9b1 100644 --- a/fastlane/metadata/android/pa/changelogs/986.txt +++ b/fastlane/metadata/android/pa/changelogs/986.txt @@ -1,15 +1,15 @@ -ਨਵਾਂ -• ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਲਈ ਸੂਚਨਾਵਾਂ -• ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਵੀਡੀਓ ਪਲੇਅਰਾਂ ਵਿਚਕਾਰ ਅਰਾਮ ਨਾਲ ਤਬਦੀਲੀ -• ਸੈਮੀਟੋਨਸ ਦੁਆਰਾ ਪਿੱਚ ਬਦਲੋ -• ਇੱਕ ਪਲੇਲਿਸਟ ਵਿੱਚ ਮੁੱਖ ਪਲੇਅਰ ਕਤਾਰ ਜੋੜੋ +ਨਵਾਂ +• ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਲਈ ਸੂਚਨਾਵਾਂ +• ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਵੀਡੀਓ ਪਲੇਅਰਾਂ ਵਿਚਕਾਰ ਅਰਾਮ ਨਾਲ ਤਬਦੀਲੀ +• ਸੈਮੀਟੋਨਸ ਦੁਆਰਾ ਪਿੱਚ ਬਦਲੋ +• ਇੱਕ ਪਲੇਲਿਸਟ ਵਿੱਚ ਮੁੱਖ ਪਲੇਅਰ ਕਤਾਰ ਜੋੜੋ -ਸੁਧਾਰ -• ਸਪੀਡ/ਪਿਚ ਸਟੈਪ ਦਾ ਆਕਾਰ ਯਾਦ ਰੱਖੋ -• ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ ਸ਼ੁਰੂਆਤੀ ਲੰਬੇ ਬਫਰਿੰਗ ਨੂੰ ਘੱਟ ਕਰੋ • Android TV ਲਈ ਪਲੇਅਰ UI ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ -• ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁਸ਼ਟੀ ਕਰੋ +ਸੁਧਾਰ +• ਸਪੀਡ/ਪਿਚ ਸਟੈਪ ਦਾ ਆਕਾਰ ਯਾਦ ਰੱਖੋ +• ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ ਸ਼ੁਰੂਆਤੀ ਲੰਬੇ ਬਫਰਿੰਗ ਨੂੰ ਘੱਟ ਕਰੋ • Android TV ਲਈ ਪਲੇਅਰ UI ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ +• ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁਸ਼ਟੀ ਕਰੋ -ਠੀਕ ਕੀਤਾ -• ਮੀਡੀਆ ਬਟਨ ਨੂੰ ਫਿਕਸ ਕਰੋ ਜੋ ਪਲੇਅਰ ਨਿਯੰਤਰਣਾਂ ਨੂੰ ਨਹੀਂ ਲੁਕਾਉਂਦਾ ਹੈ -• ਪਲੇਅਰ ਦੀ ਕਿਸਮ ਬਦਲਣ 'ਤੇ ਪਲੇਬੈਕ ਰੀਸੈਟ ਨੂੰ ਠੀਕ ਕਰੋ +ਠੀਕ ਕੀਤਾ +• ਮੀਡੀਆ ਬਟਨ ਨੂੰ ਫਿਕਸ ਕਰੋ ਜੋ ਪਲੇਅਰ ਨਿਯੰਤਰਣਾਂ ਨੂੰ ਨਹੀਂ ਲੁਕਾਉਂਦਾ ਹੈ +• ਪਲੇਅਰ ਦੀ ਕਿਸਮ ਬਦਲਣ 'ਤੇ ਪਲੇਬੈਕ ਰੀਸੈਟ ਨੂੰ ਠੀਕ ਕਰੋ • ਪਲੇਲਿਸਟ ਡਾਇਲਾਗ ਨੂੰ ਘੁੰਮਾਉਣ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/990.txt b/fastlane/metadata/android/pa/changelogs/990.txt index ce82cbdd66a..bd532ecb0da 100644 --- a/fastlane/metadata/android/pa/changelogs/990.txt +++ b/fastlane/metadata/android/pa/changelogs/990.txt @@ -1,13 +1,13 @@ -ਇਹ ਰੀਲੀਜ਼ Android 4.4 ਕਿਟਕੈਟ ਲਈ ਸਮਰਥਨ ਛੱਡਦੀ ਹੈ, ਹੁਣ ਘੱਟੋ-ਘੱਟ ਸੰਸਕਰਣ Android 5 Lollipop ਹੈ! -ਨਵਾਂ -• ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਵਾਲੇ ਮੀਨੂ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ -• ਫੀਡ ਵਿੱਚ ਭਵਿੱਖ ਦੇ ਵੀਡੀਓ ਲੁਕਾਓ -• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ -ਸੁਧਾਰ -• ਪਲੇਅਰ ਕੋਡ ਨੂੰ ਛੋਟੇ ਹਿੱਸਿਆਂ ਵਿੱਚ ਰੀਫੈਕਟਰ ਕਰੋ: ਘੱਟ RAM ਵਰਤੀ ਗਈ, ਘੱਟ ਬੱਗ -• ਥੰਮਨੇਲ ਦੇ ਸਕੇਲ ਮੋਡ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ -• ਚਿੱਤਰ ਪਲੇਸਹੋਲਡਰ ਨੂੰ ਵੈਕਟਰਾਈਜ਼ ਕਰੋ - -ਠੀਕ ਕੀਤਾ -• ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਾਲ ਵੱਖ-ਵੱਖ ਮੁੱਦਿਆਂ ਨੂੰ ਹੱਲ ਕਰੋ: ਪੁਰਾਣੀ/ਗੁੰਮ ਮੀਡੀਆ ਜਾਣਕਾਰੀ, ਵਿਗੜਿਆ ਥੰਮਨੇਲ +ਇਹ ਰੀਲੀਜ਼ Android 4.4 ਕਿਟਕੈਟ ਲਈ ਸਮਰਥਨ ਛੱਡਦੀ ਹੈ, ਹੁਣ ਘੱਟੋ-ਘੱਟ ਸੰਸਕਰਣ Android 5 Lollipop ਹੈ! +ਨਵਾਂ +• ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਵਾਲੇ ਮੀਨੂ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ +• ਫੀਡ ਵਿੱਚ ਭਵਿੱਖ ਦੇ ਵੀਡੀਓ ਲੁਕਾਓ +• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ +ਸੁਧਾਰ +• ਪਲੇਅਰ ਕੋਡ ਨੂੰ ਛੋਟੇ ਹਿੱਸਿਆਂ ਵਿੱਚ ਰੀਫੈਕਟਰ ਕਰੋ: ਘੱਟ RAM ਵਰਤੀ ਗਈ, ਘੱਟ ਬੱਗ +• ਥੰਮਨੇਲ ਦੇ ਸਕੇਲ ਮੋਡ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ +• ਚਿੱਤਰ ਪਲੇਸਹੋਲਡਰ ਨੂੰ ਵੈਕਟਰਾਈਜ਼ ਕਰੋ + +ਠੀਕ ਕੀਤਾ +• ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਾਲ ਵੱਖ-ਵੱਖ ਮੁੱਦਿਆਂ ਨੂੰ ਹੱਲ ਕਰੋ: ਪੁਰਾਣੀ/ਗੁੰਮ ਮੀਡੀਆ ਜਾਣਕਾਰੀ, ਵਿਗੜਿਆ ਥੰਮਨੇਲ • ਪੂਰੀ ਸਕ੍ਰੀਨ ਦੀ ਥਾਂ ਉਸਦੇ 1/4 ਹਿੱਸੇ ਦੀ ਵਰਤੋਂ ਨੂੰ ਠੀਕ ਕਰੋ diff --git a/fastlane/metadata/android/pa/changelogs/993.txt b/fastlane/metadata/android/pa/changelogs/993.txt new file mode 100644 index 00000000000..6fad07e20ff --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/993.txt @@ -0,0 +1,13 @@ +ਨਵਾਂ +• ਪਲੇਲਿਸਟ ਡੁਪਲੀਕੇਟ ਜੋੜਨ ਵੇਲੇ ਚੇਤਾਵਨੀ ਸ਼ਾਮਲ ਕਰੋ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਹਟਾਉਣ ਲਈ ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ +• ਹਾਰਡਵੇਅਰ ਬਟਨਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ +• ਫੀਡ ਵਿੱਚ ਅੰਸ਼ਕ ਤੌਰ 'ਤੇ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਨੂੰ ਲੁਕਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ + +ਸੁਧਾਰ +• ਵੱਡੀਆਂ ਸਕ੍ਰੀਨਾਂ 'ਤੇ ਹੋਰ ਗਰਿੱਡ ਕਾਲਮਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ +• ਪ੍ਰਗਤੀ ਸੂਚਕਾਂ ਨੂੰ ਸੈਟਿੰਗਾਂ ਦੇ ਨਾਲ ਇਕਸਾਰ ਬਣਾਓ + +ਠੀਕ ਕੀਤੇ +• Android 11 'ਤੇ ਖੋਲ੍ਹਣ ਵਾਲੇ ਬ੍ਰਾਊਜ਼ਰ URL, ਡਾਊਨਲੋਡ ਅਤੇ ਬਾਹਰੀ ਪਲੇਅਰ ਨੂੰ ਠੀਕ ਕਰੋ +• MIUI 'ਤੇ ਦੋ ਟੈਪਾਂ ਦੀ ਲੋੜ ਵਾਲੀ ਪੂਰੀ ਸਕ੍ਰੀਨ ਨਾਲ ਇੰਟਰੈਕਟਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ +• ਕੁਝ ਡਿਵਾਈਸਾਂ 'ਤੇ ਪਲੇਬੈਕ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ExoPlayer ਸੈਟਿੰਗਾਂ ਨੂੰ ਟਵੀਕ ਕਰਨ ਦਿਓ diff --git a/fastlane/metadata/android/pl/changelogs/993.txt b/fastlane/metadata/android/pl/changelogs/993.txt new file mode 100644 index 00000000000..38cd01325b2 --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/993.txt @@ -0,0 +1,13 @@ +Nowe +• Ostrzeż. podczas dodaw. duplikatów playlist i przycisk, aby je usunąć +• Opcja ignorow. przycisków sprzęt. +• Opcja ukryw. częściowo obejrzanych wideo w kanale + +Ulepszone +• Używ. więcej kol. siatki na dużych ekranach +• Ujednol. wskaź. postępu z ustawieniami + +Naprawione +• Otwier. URL-i przeglądarki, pobranych i zew. odtwarzaczy na Androidzie 11+ +• Interakcja z trybem pełnoekr. wymagającym dwóch naciśnięć na MIUI +• Dostosow. ustawień ExoPlayera, aby naprawić odtwarzanie na niektórych urządz. diff --git a/fastlane/metadata/android/pt-PT/changelogs/65.txt b/fastlane/metadata/android/pt-PT/changelogs/65.txt index a72ca3242c8..92b3dd535df 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/65.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/65.txt @@ -8,17 +8,17 @@ - Atualização da versão da biblioteca e correção de cópia de segurança da base de dados #1510 - ExoPlayer 2.8.2 Atualização #1392 - Retrabalhado a caixa de diálogo de controlo de velocidade de reprodução para suportar diferentes tamanhos de etapa para uma mudança de velocidade mais rápida. -- Adicionado uma alternância para avanço rápido durante silêncios no controlo de velocidade de reprodução. Isso deve ser útil para audiolivros e certos géneros musicais, e pode trazer uma experiência verdadeiramente perfeita (e pode quebrar uma música com muitos silêncios =\\). -- Resolução de fonte de média ré fatorada para permitir a passagem de metadados com a média internamente no reprodutor, em vez de fazê-lo manualmente. Agora temos uma única fonte de metadados e está disponível diretamente quando a reprodução é iniciada. +- Adicionado uma alternância para avanço rápido durante silêncios no controle de velocidade de reprodução. Isso deve ser útil para audiolivros e certos gêneros musicais, e pode trazer uma experiência verdadeiramente perfeita (e pode quebrar uma música com muitos silêncios =\\). +- Resolução de fonte de média ré fatorada para permitir a passagem de metadados junto com a média internamente no reprodutor, em vez de fazê-lo manualmente. Agora temos uma única fonte de metadados e está disponível diretamente quando a reprodução é iniciada. - Correção de metadados de listas de reprodução remotas que não são atualizadas quando novos metadados estão disponíveis quando o fragmento da lista de reprodução é aberta. -- Várias correções de interface do utilizador: #1383, controles de notificação do reprodutor em segundo plano agora sempre brancos, mais fácil de desligar o reprodutor pop-up por meio de arremesso +- Várias correções de interface do utilizador : #1383, controles de notificação do reprodutor em segundo plano agora sempre brancos, mais fácil de desligar o reprodutor pop-up por meio de arremesso - Use novo extrator com arquitetura ré fatorada para multisserviço ### Conserta - Correção #1440 Layout de informações de vídeo quebrado #1491 -- Ver correção de histórico #1497 -- #1495, atualizando os metadados (miniatura, título e contagem de vídeos) assim que o utilizador acessar a lista de reprodução. +-Ver correção de histórico #1497 +- #1495, atualizando os metadados (miniatura, título e contagem de vídeos) assim que o usuário acessar a lista de reprodução. - #1475, registando uma visualização na base de dados quando o utilizador inicia um vídeo no reprodutor externo no fragmento de detalhes. - Correção de tempo limite de criação em caso de modo pop-up. #1463 (Corrigido #640) - Correção do reprodutor de vídeo principal #1509 diff --git a/fastlane/metadata/android/pt-PT/changelogs/66.txt b/fastlane/metadata/android/pt-PT/changelogs/66.txt new file mode 100644 index 00000000000..ed84a27599e --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/66.txt @@ -0,0 +1,33 @@ +# Changelog de v0.13.7 + +### Fixo +- Fixar questões de filtro de ordenação da v0.13.6 + +# Mudança do v0.13.6 + +### Melhorias + +- Desactivar animação de ícones de burgermenu #1486 +- anular a eliminação dos downloads #1472 +- Opção de download no menu de partilha #1498 +- Adicionada a opção de partilha no menu de toque longo #1454 +- Minimizar o jogador principal na saída #1354 +- Actualização da versão da biblioteca e correcção da cópia de segurança da base de dados #1510 +- ExoPlayer 2.8.2 Actualização #1392 + - Reformulou o diálogo de controlo de velocidade de reprodução para suportar diferentes tamanhos de passos para uma mudança de velocidade mais rápida. + - Adicionada uma alternância para avançar rapidamente durante os silêncios no controlo de velocidade de reprodução. Isto deve ser útil para audiolivros e certos géneros musicais, e pode trazer uma verdadeira experiência sem falhas (e pode quebrar uma canção com muitos silêncios =\i1). + - A resolução da fonte dos meios de comunicação foi refeita para permitir a passagem de metadados ao lado dos meios de comunicação internamente no leitor, em vez de o fazer manualmente. Agora temos uma única fonte de metadados e está directamente disponível quando a reprodução começa. + - Fixados os metadados da lista de reprodução remota que não são actualizados quando novos metadados estão disponíveis quando o fragmento da lista de reprodução é aberto. + - Várias correcções UI: #1383, a notificação do leitor de fundo controla agora sempre branco, mais fácil de desligar o leitor de pop-ups através do fling +- Usar novo extractor com arquitectura refacturada para multiserviços + +### Correcções + +- Reparação #1440 Layout de Informação de Vídeo Partido #1491 +- Ver histórico correcção #1497 + - #1495, actualizando os metadados (miniatura, título e contagem de vídeo) assim que o utilizador aceda à lista de reprodução. + - #1475, através do registo de uma vista na base de dados quando o utilizador inicia um vídeo no leitor externo sobre fragmento de detalhe. +- Fixar tempo limite de creen em caso de modo popup. #1463 (Fixado #640) +- Correcção principal do leitor de vídeo #1509 + - [#1412] Modo de repetição fixo causando NPE do jogador quando novas intenções são recebidas enquanto a actividade do jogador está em segundo plano. + - Fixa a minimização do jogador a popup não destrói o jogador quando não é concedida permissão de popup. diff --git a/fastlane/metadata/android/pt-PT/changelogs/68.txt b/fastlane/metadata/android/pt-PT/changelogs/68.txt new file mode 100644 index 00000000000..1e6c42e01d2 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/68.txt @@ -0,0 +1,31 @@ +# mudanças da v0.14.1 + +### fixo +- Fixo falhou em desencriptar a url de vídeo #1659 +- Ligação de descrição fixa não extraída bem #1657 + +# mudanças de v0.14.0 + +### Novo +- Novo desenho de gaveta #1461 +- Nova página inicial personalizável #1461 + +### Melhorias +- Controlos por gestos retrabalhados #1604 +- Nova forma de fechar o leitor de popup #1597 + +### Fixa +- Corrigir erro quando a contagem de assinaturas não está disponível. Fecha #1649. + - Mostrar "Contagem de subscritores não disponível" nesses casos +- Consertar NPE quando uma lista de reprodução do YouTube está vazia +- Correcção rápida para os quiosques em SoundCloud +- Refactor e correcção de bugs #1623 + - Resultado de pesquisa cíclica reparada #1562 + - Barra de procura fixa não estática + - Os vídeos do YT Premium não estão bloqueados correctamente + - Vídeos Fixos por vezes não carregados (devido à análise do DASH) + - Corrigir ligações na descrição vídeo + - Mostrar aviso quando alguém tenta descarregar para sdcard externo + - nada de excepção mostrado dispara o relatório + - thumbnail não mostrado no leitor de fundo para andróide 8.1 [ver aqui](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Correcção do registo do receptor de radiodifusão. Fecha #1641. diff --git a/fastlane/metadata/android/pt-PT/changelogs/69.txt b/fastlane/metadata/android/pt-PT/changelogs/69.txt new file mode 100644 index 00000000000..fa7d5d85cda --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/69.txt @@ -0,0 +1,19 @@ +#### Novo +- Eliminação de longa duração e partilha de subscrições #1516 +- Tabela UI e esquema de lista de grelha #1617 + +### Melhorias +- armazenar e recarregar a última relação de aspeto utilizada #1748 +- Ativar a disposição linear na atividade de Downloads com nomes de vídeo completos #1771 +- Apagar e partilhar subscrições diretamente do separador de subscrições #1516 +- Enqueuing agora ativa a reprodução de vídeo se a fila de reprodução já tiver terminado #1783 +- Configurações separadas para os gestos de volume e luminosidade #1644 +- Adicionar apoio à Localização #1792 + +### Correções +- Fixar a análise do tempo para . formato, para que NewPipe possa ser usado na Finlândia +- Contagem fixa de assinaturas +- Adicionar permissão de serviço em primeiro plano para dispositivos API 28+ #1830 + +### Bugs conhecidos +- O estado de reprodução não pode ser guardado no Android P diff --git a/fastlane/metadata/android/pt-PT/changelogs/70.txt b/fastlane/metadata/android/pt-PT/changelogs/70.txt new file mode 100644 index 00000000000..61de40666ef --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/70.txt @@ -0,0 +1,25 @@ +Atenção: esta versão é provavelmente um bugfest, tal como a última. No entanto, devido ao desligamento total desde o 17. uma versão quebrada é melhor do que nenhuma versão. Certo? ¯\_(ツ)_/¯ + +### Melhoria +* os arquivos baixados agora podem ser abertos com um clique #1879 +* suporte drop para android 4.1-4.3 #1884 +* remover jogador antigo #1884 +* remova os fluxos da fila de reprodução atual passando-os para a direita #1915 +* remova o fluxo enfileirado automático quando um novo fluxo é enfileirado manualmente # 1878 +* Pós-processamento para downloads e implementar recursos ausentes #1759 por @ kapodamy + * Infra-estruturas de pós-processamento + * Tratamento adequado de erros "infraestrutura" (para downloader) + * Fila em vez de vários downloads + * Mover transferências pendentes serializadas (`.arquivos giga`) para dados do aplicativo + * Implementar nova tentativa máxima de download + * Pausa adequada para o download de vários segmentos + * Parar downloads quando swicthing à rede móvel (nunca funciona, ver ponto 2) + * Salve a contagem de threads para os próximos downloads + * Muitas incoerências corrigidas + +### Corrigido +* Corrigir falha com resolução padrão definida como a melhor e limitada resolução de dados móveis #1835 +* falha do jogador pop-up corrigida #1874 +* NPE ao tentar abrir o jogador de fundo #1901 +* Correção para inserir novos fluxos quando o enfileiramento automático está habilitado #1878 +* Corrigido o problema decypering shuttown diff --git a/fastlane/metadata/android/pt-PT/changelogs/71.txt b/fastlane/metadata/android/pt-PT/changelogs/71.txt new file mode 100644 index 00000000000..fb525ccccca --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/71.txt @@ -0,0 +1,10 @@ +### Melhoria +* Adicionar notificação de atualização do aplicativo para compilação do GitHub (#1608 por @ krtkush) +* Várias melhorias para o downloader(# 1944 por @kapodamy): + * * adicione ícones brancos ausentes e use o modo hardcore para alterar as cores dos ícones + * verifique se o iterador foi inicializado (correções #2031) + * * permitir novas tentativas de downloads com erro "Falha no pós-processamento" no novo mixer + * novo muxer MPEG - 4 que fixa fluxos de vídeo e áudio não síncronos (#2039) + +### Corrigido +* * As transmissões ao vivo do YouTube param de ser reproduzidas após um curto período de tempo(# 1996 por @username) diff --git a/fastlane/metadata/android/pt-PT/changelogs/740.txt b/fastlane/metadata/android/pt-PT/changelogs/740.txt new file mode 100644 index 00000000000..d591eda53e0 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/740.txt @@ -0,0 +1,23 @@ +< H4 > melhorias< / h4> +< ul> +< li>tornar os links nos comentários clicáveis, aumentar o tamanho do texto< / li> +< li>procurar ao clicar em links de carimbo de data/hora nos comentários< / li> +< li>mostrar a guia preferida com base no estado selecionado recentemente< / li> +< li>adicionar lista de reprodução à fila ao clicar longamente em & # 39;fundo& # 39; na janela da lista de reprodução< / li> +< li>procurar texto partilhado quando não é um URL< / li> +< li>adicionar o botão"Partilhar no momento atual & quot; ao leitor de vídeo principal< / li> +< li>adicionar botão fechar ao leitor principal quando terminar a fila de vídeo< / li> +< li>Adicionar & quot;Reproduzir diretamente em segundo plano & quot; ao menu longpress para itens da lista de vídeos< / li> +< li>melhorar as traduções em Inglês para comandos Play / Enqueue< / li> +< li>pequenas melhorias de desempenho< / li> +< li>remover ficheiros não utilizados < / li> +< li>Atualizar o ExoPlayer para 2.9.6< / li> +< li>adicionar suporte para links ofensivos< / li> +< / ul> +

fixo < /h4> +< ul> +< li>rolagem fixa com comentários e fluxos relacionados desativados < / li> +< li>Corrigido CheckForNewAppVersionTask sendo executado quando deveria & # 39; t< / li> +< li>importação de assinatura fixa do youtube: ignore aqueles com url inválido e mantenha aqueles com título vazio< / li> +< li>corrigir URL inválido do YouTube: o nome da marca de assinatura nem sempre é "Assinatura", impedindo o carregamento de fluxos< / li> +< / ul> diff --git a/fastlane/metadata/android/pt-PT/changelogs/750.txt b/fastlane/metadata/android/pt-PT/changelogs/750.txt new file mode 100644 index 00000000000..25f0c1dbfdc --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/750.txt @@ -0,0 +1,22 @@ +Novo +Resumo da reprodução #2288 +* Retomar fluxos onde parou da última vez +Melhorias Do Downloader #2149 +* Use o Storage Access Framework para armazenar downloads em cartões SD externos +* Novo MP4 muxer +* Opcionalmente, altere o diretório de download antes de iniciar um download +* Respeitar as redes de medição + + +Melhorado +* Cordas gema removidas #2295 +* Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444 +* Tornar os menus de pressão longa consistentes #2368 + +Corrigido +* Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394 +• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 +* Downloads fixos presos em 99,9% #2440 +* Atualizar meta dados da fila de reprodução #2453 +* [*[SoundCloud] corrigida a falha ao carregar listas de reprodução Team New Pipe / New Pipe Extractor#170 +* [*[YouTube] A duração fixa não pode ser analisada Team New Pipe / New Pipe Extractor#177 diff --git a/fastlane/metadata/android/pt-PT/changelogs/760.txt b/fastlane/metadata/android/pt-PT/changelogs/760.txt new file mode 100644 index 00000000000..113a92615f7 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/760.txt @@ -0,0 +1,43 @@ +Alterações em 0.17.1 + +Novo +* Localização tailandesa + + +Melhorado +* Adicionar começar a jogar aqui ação em menus de longo imprensa para playlists novamente #2518 +* Adicionar interruptor para SAF / legacy file picker #2521 + +Corrigido +* Corrigir botões desaparecendo na visualização de downloads ao alternar aplicativos #2487 +* Corrigir a posição de reprodução é armazenada, embora o histórico de exibição esteja desativado +* Corrigir desempenho reduzido causado pela posição de reprodução em visualizações de lista #2517 +* [Extractor] Corrigir ReCaptchaActivity # 2527, TeamNewPipe / NewPipeExtractor#186 +* [Extractor] [YouTube] Corrigir Erro de pesquisa casual quando as listas de reprodução estão nos resultados TeamNewPipe / NewPipeExtractor#185 + + + +Alterações em 0.17.0 + +Novo +Resumo da reprodução #2288 +* Retomar fluxos onde parou da última vez +Melhorias Do Downloader #2149 +* Use o Storage Access Framework para armazenar downloads em cartões SD externos +* Novo MP4 muxer +* Opcionalmente, altere o diretório de download antes de iniciar um download +* Respeitar as redes de medição + + +Melhorado +* Cordas gema removidas #2295 +* Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444 +* Tornar os menus de pressão longa consistentes #2368 + +Corrigido +* Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394 +• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 +* Downloads fixos presos em 99,9% #2440 +* Atualizar metadados da fila de reprodução #2453 +* [SoundCloud] corrigida a falha ao carregar listas de reprodução TeamNewPipe / NewPipeExtractor#170 +* [YouTube] duração fixa não pode ser Paresd TeamNewPipe / NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pt-PT/changelogs/780.txt b/fastlane/metadata/android/pt-PT/changelogs/780.txt new file mode 100644 index 00000000000..961f1babdc7 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/780.txt @@ -0,0 +1,12 @@ +Alterações em 0.17.3 + +Melhorado em +- Adicionada opção para limpar estados de reprodução #2550 +- Mostrar diretórios ocultos no seletor de ficheiros #2591 +- URLs de apoio de instâncias `invidio.us` a serem abertas com NewPipe #2488 +- Adicionar suporte para `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 + +Fixa +- [YouTube] Fixo 'java.lang.IllegalArgumentException #192 +- [YouTube] Fluxos fixos ao vivo não funcionam TeamNewPipe/NewPipeExtractor#195 +- Resolvido problema de desempenho em torta de android ao descarregar um fluxo #2592 diff --git a/fastlane/metadata/android/pt-PT/changelogs/790.txt b/fastlane/metadata/android/pt-PT/changelogs/790.txt new file mode 100644 index 00000000000..f1b3a2dd98c --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/790.txt @@ -0,0 +1,14 @@ +Melhorado +- Adicionar mais títulos para melhorar a acessibilidade para os cegos #2655 +- Tornar a linguagem da pasta de download mais consistente e menos ambígua #2637 + +Fixa +- Verificar se o último byte no bloco é descarregado #2646 +- Rolagem fixa em fragmento de detalhe de vídeo #2672 +- Remover a dupla pesquisa de animações de caixa transparente para uma #2695 +- Fixar extracção client_id #2745 + +Desenvolvimento +- Adicionar dependências em falta herdadas de NewPipeExtractor em NewPipe #2535 +- Migrar para AndroidX #2685 +- Actualização para ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/pt-PT/changelogs/800.txt b/fastlane/metadata/android/pt-PT/changelogs/800.txt new file mode 100644 index 00000000000..1b6ec1a4c7c --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/800.txt @@ -0,0 +1,27 @@ +Novo +- Suporte PeerTube sem P2P (#2201) [Beta]: + ◦ Ver e descarregar vídeos de instâncias do PeerTube + ◦ Adicionar instâncias nas definições para aceder ao mundo completo do PeerTube + ◦ Pode haver problemas com apertos de mão SSL no Android 4.4 e 7.1 quando o acesso a certos casos resulta num erro de rede. + +- Downloader (#2679): + ◦ Calcular ETA de descarregamento + ◦ Descarregar opus (ficheiros webm) como ogg + ◦ Recuperar ligações expiradas para retomar os downloads após uma longa pausa + +Melhorado +- Tornar o KioskFragment consciente das mudanças no país de conteúdo preferido e melhorar o desempenho de todos os separadores principais #2742 +- Utilizar novas implementações de Localização e Downloader do extractor #2713 +- Tornar o fio "Quiosque por defeito" traduzível +- Barra de navegação preta para o tema preto #2569 + +Fixa +- Corrigido um bug que não podia mover o leitor de popup se outro dedo fosse colocado enquanto se movia o leitor de popup #2772 +- Permitir listas de reprodução sem um carregador e corrigir falhas relacionadas com este problema #2724, TeamNewPipe/NewPipeExtractor#219 +- Habilitação de TLS1.1/1.2 em dispositivos Android 4.4 (API 19/KitKat) para corrigir o aperto de mão de TLS com MediaCCC e algumas instâncias PeerTube #2792 +- [SoundCloud] Equipa fixa de extracção client_idNewPipe/NewPipeExtractor#217 +- Fixar a extracção do fluxo de áudio + +Desenvolvimento +- Atualizar ExoPlayer para 2.10.8 #2791, #2816 +- Atualizar o Gradle para 3.5.1 e adicionar o suporte Kotlin #2714 diff --git a/fastlane/metadata/android/pt-PT/changelogs/810.txt b/fastlane/metadata/android/pt-PT/changelogs/810.txt new file mode 100644 index 00000000000..3cb60e434ae --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/810.txt @@ -0,0 +1,19 @@ +Novo +- Mostrar a miniatura do vídeo no ecrã de bloqueio ao tocar em fundo + +Melhorado +- Adicionar lista de reprodução local à fila de espera ao premir durante muito tempo no botão de fundo / popup +- Faça com que os separadores da página principal possam ser deslocados e escondidos quando só existe um único separador +- Quantidade limite de actualizações de miniaturas de notificação no leitor de fundo +- Adicionar miniatura de miniatura para listas de reprodução locais vazias +- Use a extensão de ficheiro *.opus em vez de *.webm e mostre "opus" na etiqueta de formato em vez de "WebM Opus" no menu pendente de download +- Adicionar botão para apagar ficheiros descarregados ou histórico de descarregamentos em "Downloads +- [YouTube] Adicionar suporte a /c/shortened_url channel links + +Fixa +- Corrigido múltiplos problemas ao partilhar um vídeo para NewPipe e descarregar diretamente os seus fluxos +- Acesso fixo do jogador fora do seu fio de criação +- Paginação fixa de resultados de pesquisa +- Ligar nulo fixo causando NPE +- [YouTube] Comentários de visualização fixos ao abrir uma url invidio.us +- ClientCloud] Client_id actualizado diff --git a/fastlane/metadata/android/pt-PT/changelogs/840.txt b/fastlane/metadata/android/pt-PT/changelogs/840.txt new file mode 100644 index 00000000000..4ee1d8ab395 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/840.txt @@ -0,0 +1,22 @@ +Novo +- Adicionado o seletor de língua para alterar a língua da aplicação +- Adicionado enviar para o botão Kodi ao menu desmontável do leitor +- Capacidade adicional de copiar comentários sobre imprensa longa + +Melhorado +- Fixar a actividade ReCaptcha e guardar corretamente os cookies obtidos +- Removido o ponto-menu a favor da gaveta e botão esconder histórico quando o histórico do relógio não está ativado nas definições +- Pedir permissão de visualização sobre outras aplicações em definições corretamente no Android 6 e posteriores +- Renomear playlist local através de um clique longo em BookmarkFragment +- Vários melhoramentos do PeerTube +- Melhorou várias cadeias de caracteres em inglês + +Fixa +- Jogador fixo a recomeçar, embora seja pausado quando a opção "minimizar no comutador da aplicação" é ativada e o NewPipe é minimizado +- Fixar o valor de brilho inicial para o gesto +- Downloads de subtítulos .srt fixos contendo nem todas as quebras de linha +- Corrigido o download para cartão SD falhando porque alguns dispositivos Android 5 não são compatíveis com CTF +- Descarregamento fixo no Android KitKat +- Ficheiro fixo de vídeo corrupto .mp4 sendo reconhecido como ficheiro de áudio +- Resolvidos problemas de localização múltipla, incluindo códigos de língua chinesa errados +- Os carimbos temporais em descrição podem ser clicados novamente diff --git a/fastlane/metadata/android/pt-PT/changelogs/930.txt b/fastlane/metadata/android/pt-PT/changelogs/930.txt new file mode 100644 index 00000000000..1ded9e8870f --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/930.txt @@ -0,0 +1,19 @@ +Novo +- Pesquisa no YouTube Música +- Suporte básico de TV Android + +Melhorado +- Adicionada a capacidade de remover todos os vídeos vistos de uma lista de reprodução local +- Mostrar mensagem quando o conteúdo ainda não é suportado, em vez de se chocar +- Reprodutor popup melhorado redimensionado com gestos de beliscão +- Enqueue streams em fundo e botões de popup no canal +- Melhor manuseamento do tamanho do título do cabeçalho da gaveta + +Fixa +- Definição de conteúdo com restrição de idade fixa não funciona +- Fixação de certos tipos de reCAPTCHAs +- Corrigido o crash ao abrir marcadores enquanto a lista de reprodução é "nula". +- Deteção fixa de exceções relacionadas com a rede +- Visibilidade fixa do botão de ordenação do grupo no fragmento de subscrições + +e mais diff --git a/fastlane/metadata/android/pt-PT/changelogs/952.txt b/fastlane/metadata/android/pt-PT/changelogs/952.txt index 93724fdaee9..0a31a12e70b 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/952.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/952.txt @@ -1,7 +1,7 @@ Melhorado -- O autoplay está disponível para todos os serviços (em vez de apenas para o YouTube) +• A reprodução automática está disponível para todos os serviços (em vez de apenas para o YouTube) -Correções -- Fluxos relacionados corrigidos, a apoiar as novas continuações do YouTube -- Vídeos do YouTube com restrição de idade corrigido -- [Android TV] Foco e sobreposição de destaque prolongado corrigidos +Corrigido +• Transmissões relacionadas, permintindo novas continuações do YouTube +• Restrições etárias em videos do YouTube +• [Android TV] Foco e sobreposição de destaque prolongado corrigidos diff --git a/fastlane/metadata/android/pt-PT/changelogs/953.txt b/fastlane/metadata/android/pt-PT/changelogs/953.txt index dd3b4bf2b41..923f5f8b198 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/953.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/953.txt @@ -1 +1 @@ -Conserta a extração da função de desencriptação do YouTube. +Correção da extração da função de desencriptação do YouTube. diff --git a/fastlane/metadata/android/pt-PT/changelogs/954.txt b/fastlane/metadata/android/pt-PT/changelogs/954.txt index 1da36f6fa29..3d519962187 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/954.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/954.txt @@ -1,9 +1,9 @@ -• fluxo de trabalho da app nova: reproduz vídeos na página de detalhes, deslize para baixo para minimizar o reprodutor -• notificações MediaStyle: ações personalizáveis em notificações, melhorias de desempenho -• redimensionamento básico ao usar NewPipe como app de desktop +• novo fluxo de trabalho da app: reproduz vídeos na página de detalhes, deslizar p/ baixo p/ minimizar o reprodutor +• notificações MediaStyle: c/ ações personalizáveis, melhorias de desempenho +• redimensionamento básico ao usar NewPipe como app desktop -• mostrar diálogo com opções abertas em caso de URL não suportado -• experiência de sugestão de pesquisa melhorada -• qualidade de vídeo predefinido aumentada a 720p60 (player do app) e 480p (pop-up) +• mostrar diálogo com opções de carregamento em caso de URL não suportado +• sugestão de pesquisa melhorada +• qualidade predefinida aumentada a 720p60 (reprodutor da app) e 480p (pop-up) -• correções de bugs +• correção de bugs diff --git a/fastlane/metadata/android/pt-PT/changelogs/955.txt b/fastlane/metadata/android/pt-PT/changelogs/955.txt index cd70b41c9ba..edc87b56b22 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/955.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/955.txt @@ -1,3 +1,3 @@ -[YouTube] A procura por alguns utilizadores corrigida -[YouTube] Exceções de desencriptação aleatórias corrigidas +[YouTube] Pesquisa corrigida para alguns utilizadores +[YouTube] Corrigidas exceções de desencriptação aleatórias [SounCloud] URLs que terminam com uma barra são agora analisados corretamente diff --git a/fastlane/metadata/android/pt-PT/changelogs/956.txt b/fastlane/metadata/android/pt-PT/changelogs/956.txt index e258a451eba..dcebd05626c 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/956.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/956.txt @@ -1 +1 @@ -[YouTube] Falha corrigida ao carregar qualquer vídeo +[YouTube] Corrigida falha ao carregar qualquer vídeo diff --git a/fastlane/metadata/android/pt-PT/changelogs/957.txt b/fastlane/metadata/android/pt-PT/changelogs/957.txt index 8bdc458b0be..e64899c8fc4 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/957.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/957.txt @@ -1,10 +1,10 @@ -- Unir ações específicas de inquérito em uma -- Gesto de dois dedos para fechar o jogador -- Permitir a limpeza de cookies reCAPTCHA -- Opção de não colorir a notificação -- Melhorar como os detalhes do vídeo são abertos para não por no buffer infinitamente -- Acelerar os vídeos do YouTube e corrigir os de idade restrita -- Reparação de colisão em avanço/retrocesso rápido -- Não reordenar as listas a arrastar as miniaturas -- Lembrar sempre das propriedades popup -- Acrescentar a língua Santali +Unir ações específicas de enfileiramento +Gesto 2 dedos p/ fechar APP +Permitir limpeza de cookies reCAPTCHA +Opção não colorir notific. +Melhorar forma como os detalhes do vídeo são abertos p/ corrigir buffering infinito, comportamento errático ao compartilhar com NewPipe, etc +Acelerar vídeos do YouTube e corrijir restrições etárias +Corrigir falha no avanço/recuo rápido +Não reorganizar listas ao arrastar miniaturas +Lembrar sempre as propriedades pop-up +Adicionar idioma Santali diff --git a/fastlane/metadata/android/pt-PT/changelogs/958.txt b/fastlane/metadata/android/pt-PT/changelogs/958.txt index d7616b944ec..fc2507f64f4 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/958.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/958.txt @@ -1,10 +1,10 @@ Novo e melhorado: -- Opção reajustada para esconder a miniatura na tela de bloqueio +- Opção reajustada para esconder a miniatura no ecrã de bloqueio - Puxar para atualizar o feed - Melhor desempenho na busca de listas locais Corrigido: -- Falha ao iniciar o NewPipe depois de ter sido removido da RAM +- Falha ao iniciar o NewPipe após ter sido removido da RAM - Falha na inicialização quando não há conexão à Internet - Respeitando as configurações de luminosidade e de volume - Listas de reprodução longas diff --git a/fastlane/metadata/android/pt-PT/changelogs/959.txt b/fastlane/metadata/android/pt-PT/changelogs/959.txt index a50b8d058f4..2ceda197e6a 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/959.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/959.txt @@ -1,3 +1,3 @@ -O loop infinito de falhas corrigido após a abertura do repórter de erro. -Lista atualizada de instâncias do PeerTube que podem ser abertas automaticamente pelo NewPipe. +Corrigido o ciclo infinito de falhas após a abertura do repórter de erros. +Atualizada a lista de instâncias PeerTube que podem ser abertas automaticamente pelo NewPipe. Traduções atualizadas. diff --git a/fastlane/metadata/android/pt-PT/changelogs/961.txt b/fastlane/metadata/android/pt-PT/changelogs/961.txt new file mode 100644 index 00000000000..61f2a981b67 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/961.txt @@ -0,0 +1,12 @@ +- Apoio à mistura +- [YouTube] Mostrar informação sobre emissoras públicas e Covid-19 +- [media.ccc.de] Adicionados vídeos recentes +- Acrescentada tradução somaliana + +- Muitas melhorias internas + +- Vídeos fixos de partilha de dentro do leitor +- Vista Web ReCaptcha em branco fixa +- Reparação de um acidente que ocorreu ao remover um fluxo de uma lista +- Fluxos relacionados fixos +- [YouTube] Pesquisa fixa de música no YouTube diff --git a/fastlane/metadata/android/pt-PT/changelogs/964.txt b/fastlane/metadata/android/pt-PT/changelogs/964.txt new file mode 100644 index 00000000000..7aa3c9fe458 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/964.txt @@ -0,0 +1,8 @@ +- Apoio adicional para capítulos nos controlos de jogadores +- Adicionada a pesquisa Sepia +- Botão de partilha reajustado na visualização detalhada do vídeo e moveu a descrição do fluxo para o layout do separador +- Desativar o restabelecimento do brilho se o gesto de brilho for desativado +- Adicionado item da lista para reproduzir vídeo no kodi +- Corrigida a falha quando não está definido um navegador padrão em alguns dispositivos e melhorados os diálogos de partilha +- Alternar jogo/pausa com botão de espaço de hardware no leitor de ecrã inteiro +- [media.ccc.de] Várias correções e melhorias diff --git a/fastlane/metadata/android/pt-PT/changelogs/966.txt b/fastlane/metadata/android/pt-PT/changelogs/966.txt new file mode 100644 index 00000000000..10aad806c6f --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/966.txt @@ -0,0 +1,14 @@ +Novo: +- Acrescentar um novo serviço: Bandcamp + +Melhorado: +- Adicionar uma opção para que a aplicação siga o tema do dispositivo +- Prevenir alguns acidentes mostrando um painel de erro melhorado +- Mostrar mais informações sobre o porquê do conteúdo na indisponibilidade +- O botão de espaço de hardware ativa o jogo/pausa +- Mostrar "Download iniciado" brinde + +Fixo: +- Fixar miniaturas muito pequenas em detalhes de vídeo enquanto se reproduz em fundo +- Corrigir título vazio em jogador minimizado +- O último modo de reparação do tamanho não está a ser restaurado corretamente diff --git a/fastlane/metadata/android/pt-PT/changelogs/969.txt b/fastlane/metadata/android/pt-PT/changelogs/969.txt new file mode 100644 index 00000000000..28650ae9bb6 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/969.txt @@ -0,0 +1,8 @@ +* Permitir a instalação no armazenamento externo +* [Bandcamp] Adicionado suporte para exibir os três primeiros comentários em um fluxo +* Mostrar apenas o brinde 'o download começou' quando o download é iniciado +• Não defina o cookie reCaptcha quando não existir nenhum cookie armazenado +* [Jogador] melhorar o desempenho do cache +* [Jogador] jogador fixo que não joga automaticamente +* Dispensar Snackbars anteriores ao excluir downloads +* Corrigido tentando excluir objeto não na lista diff --git a/fastlane/metadata/android/pt-PT/changelogs/972.txt b/fastlane/metadata/android/pt-PT/changelogs/972.txt new file mode 100644 index 00000000000..9838ebadda5 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/972.txt @@ -0,0 +1,14 @@ +Novo +Reconhecer os timestamps e hashtags na descrição +Acrescentada a definição do modo tablet manual +Capacidade adicional de esconder itens jogados numa ração + +Melhorado +Apoiar adequadamente o Quadro de Acesso ao Armazenamento +Melhor tratamento de erros de canais indisponíveis e terminados +A folha de partilha do Android para utilizadores do Android 10+ mostra agora o título do conteúdo. +Atualização de instâncias Invidious e suporte de links Piped. + +Corrigido +[YouTube] Conteúdo restrito à idade +Prevenir fugas na janela Exceção ao abrir o diálogo de escolha diff --git a/fastlane/metadata/android/pt-PT/changelogs/975.txt b/fastlane/metadata/android/pt-PT/changelogs/975.txt index 994f0e8c560..e867d1b1152 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/975.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/975.txt @@ -8,8 +8,8 @@ Melhorias • Layout de metadados e etiquetas Fixo -• Corrigida miniatura no miniplayer -• Corrigido buffer sem fim em itens de fila duplicados -• Corrigido ReCAPTCHA que permanece carregado em segundo plano +• Corrigir miniatura no miniplayer +• Corrigir buffer sem fim em itens de fila duplicados +• Corrigir ReCAPTCHA que permanece carregado em segundo plano • Desativados os cliques enquanto atualiza o feed -• Corrigidas algumas falhas do descarregador +• Corrigir algumas falhas do descarregador diff --git a/fastlane/metadata/android/pt-PT/changelogs/983.txt b/fastlane/metadata/android/pt-PT/changelogs/983.txt new file mode 100644 index 00000000000..489f58b5b4d --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/983.txt @@ -0,0 +1,9 @@ +Acrescentar nova IU e comportamento de dupla tatuagem +Tornar as definições pesquisáveis +Destaque para os comentários em destaque como tal +Adicionar suporte open-with-app para a instância PeerTube da FSFE +Adicionar notificações de erro +Repor a repetição do item da primeira fila na mudança de jogador +Esperar mais tempo ao buffering durante os livestreams antes de falhar +Ordem fixa dos resultados da pesquisa local +Corrigir campos de itens vazios na fila de jogo diff --git a/fastlane/metadata/android/pt-PT/changelogs/986.txt b/fastlane/metadata/android/pt-PT/changelogs/986.txt new file mode 100644 index 00000000000..102422ee23a --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/986.txt @@ -0,0 +1,16 @@ +Novo +- Notificações para novas correntes +- Transição sem falhas entre o fundo e os leitores de vídeo +- Alterar o passo por semitons +- Anexar a fila principal de jogadores a uma lista de reprodução + +Melhorado +- Lembre-se da velocidade/tamanho do passo +- Mitigar o longo amortecimento inicial no leitor de vídeo +- Melhorar a interface do leitor para a TV Android +- Confirmar antes de apagar todos os ficheiros descarregados + +Fixa +- Botão de fixação do media não esconde os controlos do leitor +- Reposição da reprodução corrigida na mudança de tipo de leitor +- Fixar a rotação do diálogo da lista de reprodução diff --git a/fastlane/metadata/android/pt-PT/changelogs/987.txt b/fastlane/metadata/android/pt-PT/changelogs/987.txt new file mode 100644 index 00000000000..334af9772d2 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/987.txt @@ -0,0 +1,12 @@ +Novo +- Métodos de entrega de suporte que não o HTTP progressivo: tempo de carregamento de reprodução mais rápido, correções para PeerTube e SoundCloud, reprodução de livestreams do YouTube recentemente terminados +- Adicionar botão para adicionar uma lista de reprodução remota a uma lista local +- Pré-visualização de imagem na folha de partilha Android 10+ + +Melhorado +- Melhorar o diálogo dos parâmetros de reprodução +- Mover botões de importação/exportação de subscrição para o menu de três pontos + +Fixa +- Correção da remoção de vídeos totalmente vistos da lista de reprodução +- Corrigir o tema do menu de partilha e a entrada "adicionar à lista de reprodução diff --git a/fastlane/metadata/android/pt-PT/changelogs/993.txt b/fastlane/metadata/android/pt-PT/changelogs/993.txt new file mode 100644 index 00000000000..7f06f808180 --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/993.txt @@ -0,0 +1,13 @@ +Novo +- Adicionar aviso ao adicionar duplicados da lista de reprodução e adicionar botão para os remover +- Permitir ignorar os botões de hardware +- Permitir a ocultação de vídeos parcialmente vistos na alimentação + +Melhorado +- Utilizar mais colunas de grelha em ecrãs grandes +- Tornar os indicadores de progresso consistentes com as definições + +Fixa +- Corrigir URLs de abertura do navegador, downloads e leitores externos no Android 11+ +- Fixação interagindo com tela cheia requer duas torneiras no MIUI +- Permitir ajustes no ExoPlayer para fixar a reprodução em alguns dispositivos diff --git a/fastlane/metadata/android/pt-PT/full_description.txt b/fastlane/metadata/android/pt-PT/full_description.txt index cf8f2a2554d..af5b0f9118b 100644 --- a/fastlane/metadata/android/pt-PT/full_description.txt +++ b/fastlane/metadata/android/pt-PT/full_description.txt @@ -1 +1 @@ -NewPipe não utiliza nenhuma biblioteca de estrutura do Google, nem a API do YouTube. Apenas analisa o site para obter as informações necessárias. Portanto, esta app pode ser usado em aparelhos sem os Serviços do Google instalados. Além disso, não precisa de uma conta no YouTube para usar o NewPipe, e é FLOSS. +NewPipe não utiliza nenhuma biblioteca de estrutura do Google, nem a API do YouTube. Apenas analisa o site para obter as informações necessárias. Desta forma, esta aplicação pode ser utilizada em aparelhos que não tenham Google Services instalados. Não precisa de uma conta Youtube e, além disso, é uma aplicação FLOSS. diff --git a/fastlane/metadata/android/pt-PT/short_description.txt b/fastlane/metadata/android/pt-PT/short_description.txt index 5e111585bc8..6c0629adc12 100644 --- a/fastlane/metadata/android/pt-PT/short_description.txt +++ b/fastlane/metadata/android/pt-PT/short_description.txt @@ -1 +1 @@ -Um frontend gratuito e leve do YouTube para o Android. +Um reprodutor Youtube para Android. diff --git a/fastlane/metadata/android/pt/changelogs/66.txt b/fastlane/metadata/android/pt/changelogs/66.txt new file mode 100644 index 00000000000..ed84a27599e --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/66.txt @@ -0,0 +1,33 @@ +# Changelog de v0.13.7 + +### Fixo +- Fixar questões de filtro de ordenação da v0.13.6 + +# Mudança do v0.13.6 + +### Melhorias + +- Desactivar animação de ícones de burgermenu #1486 +- anular a eliminação dos downloads #1472 +- Opção de download no menu de partilha #1498 +- Adicionada a opção de partilha no menu de toque longo #1454 +- Minimizar o jogador principal na saída #1354 +- Actualização da versão da biblioteca e correcção da cópia de segurança da base de dados #1510 +- ExoPlayer 2.8.2 Actualização #1392 + - Reformulou o diálogo de controlo de velocidade de reprodução para suportar diferentes tamanhos de passos para uma mudança de velocidade mais rápida. + - Adicionada uma alternância para avançar rapidamente durante os silêncios no controlo de velocidade de reprodução. Isto deve ser útil para audiolivros e certos géneros musicais, e pode trazer uma verdadeira experiência sem falhas (e pode quebrar uma canção com muitos silêncios =\i1). + - A resolução da fonte dos meios de comunicação foi refeita para permitir a passagem de metadados ao lado dos meios de comunicação internamente no leitor, em vez de o fazer manualmente. Agora temos uma única fonte de metadados e está directamente disponível quando a reprodução começa. + - Fixados os metadados da lista de reprodução remota que não são actualizados quando novos metadados estão disponíveis quando o fragmento da lista de reprodução é aberto. + - Várias correcções UI: #1383, a notificação do leitor de fundo controla agora sempre branco, mais fácil de desligar o leitor de pop-ups através do fling +- Usar novo extractor com arquitectura refacturada para multiserviços + +### Correcções + +- Reparação #1440 Layout de Informação de Vídeo Partido #1491 +- Ver histórico correcção #1497 + - #1495, actualizando os metadados (miniatura, título e contagem de vídeo) assim que o utilizador aceda à lista de reprodução. + - #1475, através do registo de uma vista na base de dados quando o utilizador inicia um vídeo no leitor externo sobre fragmento de detalhe. +- Fixar tempo limite de creen em caso de modo popup. #1463 (Fixado #640) +- Correcção principal do leitor de vídeo #1509 + - [#1412] Modo de repetição fixo causando NPE do jogador quando novas intenções são recebidas enquanto a actividade do jogador está em segundo plano. + - Fixa a minimização do jogador a popup não destrói o jogador quando não é concedida permissão de popup. diff --git a/fastlane/metadata/android/pt/changelogs/68.txt b/fastlane/metadata/android/pt/changelogs/68.txt new file mode 100644 index 00000000000..1e6c42e01d2 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/68.txt @@ -0,0 +1,31 @@ +# mudanças da v0.14.1 + +### fixo +- Fixo falhou em desencriptar a url de vídeo #1659 +- Ligação de descrição fixa não extraída bem #1657 + +# mudanças de v0.14.0 + +### Novo +- Novo desenho de gaveta #1461 +- Nova página inicial personalizável #1461 + +### Melhorias +- Controlos por gestos retrabalhados #1604 +- Nova forma de fechar o leitor de popup #1597 + +### Fixa +- Corrigir erro quando a contagem de assinaturas não está disponível. Fecha #1649. + - Mostrar "Contagem de subscritores não disponível" nesses casos +- Consertar NPE quando uma lista de reprodução do YouTube está vazia +- Correcção rápida para os quiosques em SoundCloud +- Refactor e correcção de bugs #1623 + - Resultado de pesquisa cíclica reparada #1562 + - Barra de procura fixa não estática + - Os vídeos do YT Premium não estão bloqueados correctamente + - Vídeos Fixos por vezes não carregados (devido à análise do DASH) + - Corrigir ligações na descrição vídeo + - Mostrar aviso quando alguém tenta descarregar para sdcard externo + - nada de excepção mostrado dispara o relatório + - thumbnail não mostrado no leitor de fundo para andróide 8.1 [ver aqui](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Correcção do registo do receptor de radiodifusão. Fecha #1641. diff --git a/fastlane/metadata/android/pt/changelogs/69.txt b/fastlane/metadata/android/pt/changelogs/69.txt new file mode 100644 index 00000000000..fa7d5d85cda --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/69.txt @@ -0,0 +1,19 @@ +#### Novo +- Eliminação de longa duração e partilha de subscrições #1516 +- Tabela UI e esquema de lista de grelha #1617 + +### Melhorias +- armazenar e recarregar a última relação de aspeto utilizada #1748 +- Ativar a disposição linear na atividade de Downloads com nomes de vídeo completos #1771 +- Apagar e partilhar subscrições diretamente do separador de subscrições #1516 +- Enqueuing agora ativa a reprodução de vídeo se a fila de reprodução já tiver terminado #1783 +- Configurações separadas para os gestos de volume e luminosidade #1644 +- Adicionar apoio à Localização #1792 + +### Correções +- Fixar a análise do tempo para . formato, para que NewPipe possa ser usado na Finlândia +- Contagem fixa de assinaturas +- Adicionar permissão de serviço em primeiro plano para dispositivos API 28+ #1830 + +### Bugs conhecidos +- O estado de reprodução não pode ser guardado no Android P diff --git a/fastlane/metadata/android/pt/changelogs/70.txt b/fastlane/metadata/android/pt/changelogs/70.txt new file mode 100644 index 00000000000..61de40666ef --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/70.txt @@ -0,0 +1,25 @@ +Atenção: esta versão é provavelmente um bugfest, tal como a última. No entanto, devido ao desligamento total desde o 17. uma versão quebrada é melhor do que nenhuma versão. Certo? ¯\_(ツ)_/¯ + +### Melhoria +* os arquivos baixados agora podem ser abertos com um clique #1879 +* suporte drop para android 4.1-4.3 #1884 +* remover jogador antigo #1884 +* remova os fluxos da fila de reprodução atual passando-os para a direita #1915 +* remova o fluxo enfileirado automático quando um novo fluxo é enfileirado manualmente # 1878 +* Pós-processamento para downloads e implementar recursos ausentes #1759 por @ kapodamy + * Infra-estruturas de pós-processamento + * Tratamento adequado de erros "infraestrutura" (para downloader) + * Fila em vez de vários downloads + * Mover transferências pendentes serializadas (`.arquivos giga`) para dados do aplicativo + * Implementar nova tentativa máxima de download + * Pausa adequada para o download de vários segmentos + * Parar downloads quando swicthing à rede móvel (nunca funciona, ver ponto 2) + * Salve a contagem de threads para os próximos downloads + * Muitas incoerências corrigidas + +### Corrigido +* Corrigir falha com resolução padrão definida como a melhor e limitada resolução de dados móveis #1835 +* falha do jogador pop-up corrigida #1874 +* NPE ao tentar abrir o jogador de fundo #1901 +* Correção para inserir novos fluxos quando o enfileiramento automático está habilitado #1878 +* Corrigido o problema decypering shuttown diff --git a/fastlane/metadata/android/pt/changelogs/71.txt b/fastlane/metadata/android/pt/changelogs/71.txt new file mode 100644 index 00000000000..fb525ccccca --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/71.txt @@ -0,0 +1,10 @@ +### Melhoria +* Adicionar notificação de atualização do aplicativo para compilação do GitHub (#1608 por @ krtkush) +* Várias melhorias para o downloader(# 1944 por @kapodamy): + * * adicione ícones brancos ausentes e use o modo hardcore para alterar as cores dos ícones + * verifique se o iterador foi inicializado (correções #2031) + * * permitir novas tentativas de downloads com erro "Falha no pós-processamento" no novo mixer + * novo muxer MPEG - 4 que fixa fluxos de vídeo e áudio não síncronos (#2039) + +### Corrigido +* * As transmissões ao vivo do YouTube param de ser reproduzidas após um curto período de tempo(# 1996 por @username) diff --git a/fastlane/metadata/android/pt/changelogs/740.txt b/fastlane/metadata/android/pt/changelogs/740.txt new file mode 100644 index 00000000000..c795978a894 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/740.txt @@ -0,0 +1,23 @@ +

Improvements

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

Fixed

+
    +
  • fixed scroll w/ comments and related streams disabled
  • +
  • fixed CheckForNewAppVersionTask being executed when it shouldn't
  • +
  • fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title
  • +
  • fix invalid YouTube url: signature tag name is not always "signature" preventing streams from loading
  • +
diff --git a/fastlane/metadata/android/pt/changelogs/750.txt b/fastlane/metadata/android/pt/changelogs/750.txt new file mode 100644 index 00000000000..25f0c1dbfdc --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/750.txt @@ -0,0 +1,22 @@ +Novo +Resumo da reprodução #2288 +* Retomar fluxos onde parou da última vez +Melhorias Do Downloader #2149 +* Use o Storage Access Framework para armazenar downloads em cartões SD externos +* Novo MP4 muxer +* Opcionalmente, altere o diretório de download antes de iniciar um download +* Respeitar as redes de medição + + +Melhorado +* Cordas gema removidas #2295 +* Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444 +* Tornar os menus de pressão longa consistentes #2368 + +Corrigido +* Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394 +• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 +* Downloads fixos presos em 99,9% #2440 +* Atualizar meta dados da fila de reprodução #2453 +* [*[SoundCloud] corrigida a falha ao carregar listas de reprodução Team New Pipe / New Pipe Extractor#170 +* [*[YouTube] A duração fixa não pode ser analisada Team New Pipe / New Pipe Extractor#177 diff --git a/fastlane/metadata/android/pt/changelogs/760.txt b/fastlane/metadata/android/pt/changelogs/760.txt new file mode 100644 index 00000000000..113a92615f7 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/760.txt @@ -0,0 +1,43 @@ +Alterações em 0.17.1 + +Novo +* Localização tailandesa + + +Melhorado +* Adicionar começar a jogar aqui ação em menus de longo imprensa para playlists novamente #2518 +* Adicionar interruptor para SAF / legacy file picker #2521 + +Corrigido +* Corrigir botões desaparecendo na visualização de downloads ao alternar aplicativos #2487 +* Corrigir a posição de reprodução é armazenada, embora o histórico de exibição esteja desativado +* Corrigir desempenho reduzido causado pela posição de reprodução em visualizações de lista #2517 +* [Extractor] Corrigir ReCaptchaActivity # 2527, TeamNewPipe / NewPipeExtractor#186 +* [Extractor] [YouTube] Corrigir Erro de pesquisa casual quando as listas de reprodução estão nos resultados TeamNewPipe / NewPipeExtractor#185 + + + +Alterações em 0.17.0 + +Novo +Resumo da reprodução #2288 +* Retomar fluxos onde parou da última vez +Melhorias Do Downloader #2149 +* Use o Storage Access Framework para armazenar downloads em cartões SD externos +* Novo MP4 muxer +* Opcionalmente, altere o diretório de download antes de iniciar um download +* Respeitar as redes de medição + + +Melhorado +* Cordas gema removidas #2295 +* Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444 +* Tornar os menus de pressão longa consistentes #2368 + +Corrigido +* Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394 +• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 +* Downloads fixos presos em 99,9% #2440 +* Atualizar metadados da fila de reprodução #2453 +* [SoundCloud] corrigida a falha ao carregar listas de reprodução TeamNewPipe / NewPipeExtractor#170 +* [YouTube] duração fixa não pode ser Paresd TeamNewPipe / NewPipeExtractor#177 diff --git a/fastlane/metadata/android/pt/changelogs/780.txt b/fastlane/metadata/android/pt/changelogs/780.txt new file mode 100644 index 00000000000..961f1babdc7 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/780.txt @@ -0,0 +1,12 @@ +Alterações em 0.17.3 + +Melhorado em +- Adicionada opção para limpar estados de reprodução #2550 +- Mostrar diretórios ocultos no seletor de ficheiros #2591 +- URLs de apoio de instâncias `invidio.us` a serem abertas com NewPipe #2488 +- Adicionar suporte para `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 + +Fixa +- [YouTube] Fixo 'java.lang.IllegalArgumentException #192 +- [YouTube] Fluxos fixos ao vivo não funcionam TeamNewPipe/NewPipeExtractor#195 +- Resolvido problema de desempenho em torta de android ao descarregar um fluxo #2592 diff --git a/fastlane/metadata/android/pt/changelogs/790.txt b/fastlane/metadata/android/pt/changelogs/790.txt new file mode 100644 index 00000000000..f1b3a2dd98c --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/790.txt @@ -0,0 +1,14 @@ +Melhorado +- Adicionar mais títulos para melhorar a acessibilidade para os cegos #2655 +- Tornar a linguagem da pasta de download mais consistente e menos ambígua #2637 + +Fixa +- Verificar se o último byte no bloco é descarregado #2646 +- Rolagem fixa em fragmento de detalhe de vídeo #2672 +- Remover a dupla pesquisa de animações de caixa transparente para uma #2695 +- Fixar extracção client_id #2745 + +Desenvolvimento +- Adicionar dependências em falta herdadas de NewPipeExtractor em NewPipe #2535 +- Migrar para AndroidX #2685 +- Actualização para ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/pt/changelogs/800.txt b/fastlane/metadata/android/pt/changelogs/800.txt new file mode 100644 index 00000000000..1b6ec1a4c7c --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/800.txt @@ -0,0 +1,27 @@ +Novo +- Suporte PeerTube sem P2P (#2201) [Beta]: + ◦ Ver e descarregar vídeos de instâncias do PeerTube + ◦ Adicionar instâncias nas definições para aceder ao mundo completo do PeerTube + ◦ Pode haver problemas com apertos de mão SSL no Android 4.4 e 7.1 quando o acesso a certos casos resulta num erro de rede. + +- Downloader (#2679): + ◦ Calcular ETA de descarregamento + ◦ Descarregar opus (ficheiros webm) como ogg + ◦ Recuperar ligações expiradas para retomar os downloads após uma longa pausa + +Melhorado +- Tornar o KioskFragment consciente das mudanças no país de conteúdo preferido e melhorar o desempenho de todos os separadores principais #2742 +- Utilizar novas implementações de Localização e Downloader do extractor #2713 +- Tornar o fio "Quiosque por defeito" traduzível +- Barra de navegação preta para o tema preto #2569 + +Fixa +- Corrigido um bug que não podia mover o leitor de popup se outro dedo fosse colocado enquanto se movia o leitor de popup #2772 +- Permitir listas de reprodução sem um carregador e corrigir falhas relacionadas com este problema #2724, TeamNewPipe/NewPipeExtractor#219 +- Habilitação de TLS1.1/1.2 em dispositivos Android 4.4 (API 19/KitKat) para corrigir o aperto de mão de TLS com MediaCCC e algumas instâncias PeerTube #2792 +- [SoundCloud] Equipa fixa de extracção client_idNewPipe/NewPipeExtractor#217 +- Fixar a extracção do fluxo de áudio + +Desenvolvimento +- Atualizar ExoPlayer para 2.10.8 #2791, #2816 +- Atualizar o Gradle para 3.5.1 e adicionar o suporte Kotlin #2714 diff --git a/fastlane/metadata/android/pt/changelogs/810.txt b/fastlane/metadata/android/pt/changelogs/810.txt new file mode 100644 index 00000000000..3cb60e434ae --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/810.txt @@ -0,0 +1,19 @@ +Novo +- Mostrar a miniatura do vídeo no ecrã de bloqueio ao tocar em fundo + +Melhorado +- Adicionar lista de reprodução local à fila de espera ao premir durante muito tempo no botão de fundo / popup +- Faça com que os separadores da página principal possam ser deslocados e escondidos quando só existe um único separador +- Quantidade limite de actualizações de miniaturas de notificação no leitor de fundo +- Adicionar miniatura de miniatura para listas de reprodução locais vazias +- Use a extensão de ficheiro *.opus em vez de *.webm e mostre "opus" na etiqueta de formato em vez de "WebM Opus" no menu pendente de download +- Adicionar botão para apagar ficheiros descarregados ou histórico de descarregamentos em "Downloads +- [YouTube] Adicionar suporte a /c/shortened_url channel links + +Fixa +- Corrigido múltiplos problemas ao partilhar um vídeo para NewPipe e descarregar diretamente os seus fluxos +- Acesso fixo do jogador fora do seu fio de criação +- Paginação fixa de resultados de pesquisa +- Ligar nulo fixo causando NPE +- [YouTube] Comentários de visualização fixos ao abrir uma url invidio.us +- ClientCloud] Client_id actualizado diff --git a/fastlane/metadata/android/pt/changelogs/840.txt b/fastlane/metadata/android/pt/changelogs/840.txt new file mode 100644 index 00000000000..4ee1d8ab395 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/840.txt @@ -0,0 +1,22 @@ +Novo +- Adicionado o seletor de língua para alterar a língua da aplicação +- Adicionado enviar para o botão Kodi ao menu desmontável do leitor +- Capacidade adicional de copiar comentários sobre imprensa longa + +Melhorado +- Fixar a actividade ReCaptcha e guardar corretamente os cookies obtidos +- Removido o ponto-menu a favor da gaveta e botão esconder histórico quando o histórico do relógio não está ativado nas definições +- Pedir permissão de visualização sobre outras aplicações em definições corretamente no Android 6 e posteriores +- Renomear playlist local através de um clique longo em BookmarkFragment +- Vários melhoramentos do PeerTube +- Melhorou várias cadeias de caracteres em inglês + +Fixa +- Jogador fixo a recomeçar, embora seja pausado quando a opção "minimizar no comutador da aplicação" é ativada e o NewPipe é minimizado +- Fixar o valor de brilho inicial para o gesto +- Downloads de subtítulos .srt fixos contendo nem todas as quebras de linha +- Corrigido o download para cartão SD falhando porque alguns dispositivos Android 5 não são compatíveis com CTF +- Descarregamento fixo no Android KitKat +- Ficheiro fixo de vídeo corrupto .mp4 sendo reconhecido como ficheiro de áudio +- Resolvidos problemas de localização múltipla, incluindo códigos de língua chinesa errados +- Os carimbos temporais em descrição podem ser clicados novamente diff --git a/fastlane/metadata/android/pt/changelogs/930.txt b/fastlane/metadata/android/pt/changelogs/930.txt new file mode 100644 index 00000000000..1ded9e8870f --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/930.txt @@ -0,0 +1,19 @@ +Novo +- Pesquisa no YouTube Música +- Suporte básico de TV Android + +Melhorado +- Adicionada a capacidade de remover todos os vídeos vistos de uma lista de reprodução local +- Mostrar mensagem quando o conteúdo ainda não é suportado, em vez de se chocar +- Reprodutor popup melhorado redimensionado com gestos de beliscão +- Enqueue streams em fundo e botões de popup no canal +- Melhor manuseamento do tamanho do título do cabeçalho da gaveta + +Fixa +- Definição de conteúdo com restrição de idade fixa não funciona +- Fixação de certos tipos de reCAPTCHAs +- Corrigido o crash ao abrir marcadores enquanto a lista de reprodução é "nula". +- Deteção fixa de exceções relacionadas com a rede +- Visibilidade fixa do botão de ordenação do grupo no fragmento de subscrições + +e mais diff --git a/fastlane/metadata/android/pt/changelogs/955.txt b/fastlane/metadata/android/pt/changelogs/955.txt index 98bed58fecd..edc87b56b22 100644 --- a/fastlane/metadata/android/pt/changelogs/955.txt +++ b/fastlane/metadata/android/pt/changelogs/955.txt @@ -1,3 +1,3 @@ -[YouTube] O problema com busca que afetava utilizadores foi corrigida -[YouTube] Exceções de desencriptação aleatórias foram corrigidas -[SounCloud] URLs que terminam com uma barra são analisadas corretamente +[YouTube] Pesquisa corrigida para alguns utilizadores +[YouTube] Corrigidas exceções de desencriptação aleatórias +[SounCloud] URLs que terminam com uma barra são agora analisados corretamente diff --git a/fastlane/metadata/android/pt/changelogs/956.txt b/fastlane/metadata/android/pt/changelogs/956.txt index e258a451eba..dcebd05626c 100644 --- a/fastlane/metadata/android/pt/changelogs/956.txt +++ b/fastlane/metadata/android/pt/changelogs/956.txt @@ -1 +1 @@ -[YouTube] Falha corrigida ao carregar qualquer vídeo +[YouTube] Corrigida falha ao carregar qualquer vídeo diff --git a/fastlane/metadata/android/pt/changelogs/961.txt b/fastlane/metadata/android/pt/changelogs/961.txt new file mode 100644 index 00000000000..61f2a981b67 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/961.txt @@ -0,0 +1,12 @@ +- Apoio à mistura +- [YouTube] Mostrar informação sobre emissoras públicas e Covid-19 +- [media.ccc.de] Adicionados vídeos recentes +- Acrescentada tradução somaliana + +- Muitas melhorias internas + +- Vídeos fixos de partilha de dentro do leitor +- Vista Web ReCaptcha em branco fixa +- Reparação de um acidente que ocorreu ao remover um fluxo de uma lista +- Fluxos relacionados fixos +- [YouTube] Pesquisa fixa de música no YouTube diff --git a/fastlane/metadata/android/pt/changelogs/964.txt b/fastlane/metadata/android/pt/changelogs/964.txt new file mode 100644 index 00000000000..7aa3c9fe458 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/964.txt @@ -0,0 +1,8 @@ +- Apoio adicional para capítulos nos controlos de jogadores +- Adicionada a pesquisa Sepia +- Botão de partilha reajustado na visualização detalhada do vídeo e moveu a descrição do fluxo para o layout do separador +- Desativar o restabelecimento do brilho se o gesto de brilho for desativado +- Adicionado item da lista para reproduzir vídeo no kodi +- Corrigida a falha quando não está definido um navegador padrão em alguns dispositivos e melhorados os diálogos de partilha +- Alternar jogo/pausa com botão de espaço de hardware no leitor de ecrã inteiro +- [media.ccc.de] Várias correções e melhorias diff --git a/fastlane/metadata/android/pt/changelogs/966.txt b/fastlane/metadata/android/pt/changelogs/966.txt new file mode 100644 index 00000000000..10aad806c6f --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/966.txt @@ -0,0 +1,14 @@ +Novo: +- Acrescentar um novo serviço: Bandcamp + +Melhorado: +- Adicionar uma opção para que a aplicação siga o tema do dispositivo +- Prevenir alguns acidentes mostrando um painel de erro melhorado +- Mostrar mais informações sobre o porquê do conteúdo na indisponibilidade +- O botão de espaço de hardware ativa o jogo/pausa +- Mostrar "Download iniciado" brinde + +Fixo: +- Fixar miniaturas muito pequenas em detalhes de vídeo enquanto se reproduz em fundo +- Corrigir título vazio em jogador minimizado +- O último modo de reparação do tamanho não está a ser restaurado corretamente diff --git a/fastlane/metadata/android/pt/changelogs/969.txt b/fastlane/metadata/android/pt/changelogs/969.txt new file mode 100644 index 00000000000..28650ae9bb6 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/969.txt @@ -0,0 +1,8 @@ +* Permitir a instalação no armazenamento externo +* [Bandcamp] Adicionado suporte para exibir os três primeiros comentários em um fluxo +* Mostrar apenas o brinde 'o download começou' quando o download é iniciado +• Não defina o cookie reCaptcha quando não existir nenhum cookie armazenado +* [Jogador] melhorar o desempenho do cache +* [Jogador] jogador fixo que não joga automaticamente +* Dispensar Snackbars anteriores ao excluir downloads +* Corrigido tentando excluir objeto não na lista diff --git a/fastlane/metadata/android/pt/changelogs/972.txt b/fastlane/metadata/android/pt/changelogs/972.txt new file mode 100644 index 00000000000..9838ebadda5 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/972.txt @@ -0,0 +1,14 @@ +Novo +Reconhecer os timestamps e hashtags na descrição +Acrescentada a definição do modo tablet manual +Capacidade adicional de esconder itens jogados numa ração + +Melhorado +Apoiar adequadamente o Quadro de Acesso ao Armazenamento +Melhor tratamento de erros de canais indisponíveis e terminados +A folha de partilha do Android para utilizadores do Android 10+ mostra agora o título do conteúdo. +Atualização de instâncias Invidious e suporte de links Piped. + +Corrigido +[YouTube] Conteúdo restrito à idade +Prevenir fugas na janela Exceção ao abrir o diálogo de escolha diff --git a/fastlane/metadata/android/pt/changelogs/983.txt b/fastlane/metadata/android/pt/changelogs/983.txt new file mode 100644 index 00000000000..489f58b5b4d --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/983.txt @@ -0,0 +1,9 @@ +Acrescentar nova IU e comportamento de dupla tatuagem +Tornar as definições pesquisáveis +Destaque para os comentários em destaque como tal +Adicionar suporte open-with-app para a instância PeerTube da FSFE +Adicionar notificações de erro +Repor a repetição do item da primeira fila na mudança de jogador +Esperar mais tempo ao buffering durante os livestreams antes de falhar +Ordem fixa dos resultados da pesquisa local +Corrigir campos de itens vazios na fila de jogo diff --git a/fastlane/metadata/android/pt/changelogs/986.txt b/fastlane/metadata/android/pt/changelogs/986.txt new file mode 100644 index 00000000000..102422ee23a --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/986.txt @@ -0,0 +1,16 @@ +Novo +- Notificações para novas correntes +- Transição sem falhas entre o fundo e os leitores de vídeo +- Alterar o passo por semitons +- Anexar a fila principal de jogadores a uma lista de reprodução + +Melhorado +- Lembre-se da velocidade/tamanho do passo +- Mitigar o longo amortecimento inicial no leitor de vídeo +- Melhorar a interface do leitor para a TV Android +- Confirmar antes de apagar todos os ficheiros descarregados + +Fixa +- Botão de fixação do media não esconde os controlos do leitor +- Reposição da reprodução corrigida na mudança de tipo de leitor +- Fixar a rotação do diálogo da lista de reprodução diff --git a/fastlane/metadata/android/pt/changelogs/987.txt b/fastlane/metadata/android/pt/changelogs/987.txt new file mode 100644 index 00000000000..334af9772d2 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/987.txt @@ -0,0 +1,12 @@ +Novo +- Métodos de entrega de suporte que não o HTTP progressivo: tempo de carregamento de reprodução mais rápido, correções para PeerTube e SoundCloud, reprodução de livestreams do YouTube recentemente terminados +- Adicionar botão para adicionar uma lista de reprodução remota a uma lista local +- Pré-visualização de imagem na folha de partilha Android 10+ + +Melhorado +- Melhorar o diálogo dos parâmetros de reprodução +- Mover botões de importação/exportação de subscrição para o menu de três pontos + +Fixa +- Correção da remoção de vídeos totalmente vistos da lista de reprodução +- Corrigir o tema do menu de partilha e a entrada "adicionar à lista de reprodução diff --git a/fastlane/metadata/android/pt/changelogs/993.txt b/fastlane/metadata/android/pt/changelogs/993.txt new file mode 100644 index 00000000000..7f06f808180 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/993.txt @@ -0,0 +1,13 @@ +Novo +- Adicionar aviso ao adicionar duplicados da lista de reprodução e adicionar botão para os remover +- Permitir ignorar os botões de hardware +- Permitir a ocultação de vídeos parcialmente vistos na alimentação + +Melhorado +- Utilizar mais colunas de grelha em ecrãs grandes +- Tornar os indicadores de progresso consistentes com as definições + +Fixa +- Corrigir URLs de abertura do navegador, downloads e leitores externos no Android 11+ +- Fixação interagindo com tela cheia requer duas torneiras no MIUI +- Permitir ajustes no ExoPlayer para fixar a reprodução em alguns dispositivos diff --git a/fastlane/metadata/android/pt/short_description.txt b/fastlane/metadata/android/pt/short_description.txt index 6c0629adc12..1f2c457236d 100644 --- a/fastlane/metadata/android/pt/short_description.txt +++ b/fastlane/metadata/android/pt/short_description.txt @@ -1 +1 @@ -Um reprodutor Youtube para Android. +Um frontend gratuito e leve do YouTube para Android. diff --git a/fastlane/metadata/android/ru/changelogs/63.txt b/fastlane/metadata/android/ru/changelogs/63.txt index 8cb650ef4c8..59101af13ca 100644 --- a/fastlane/metadata/android/ru/changelogs/63.txt +++ b/fastlane/metadata/android/ru/changelogs/63.txt @@ -1,8 +1,8 @@ ### Улучшения - Импорт/экспорт настроек #1333 -- Уменьшена перерисовка (оптимизация производительности) #1371 +- Уменьшено количество перерисовки (повышена производительность) #1371 - Небольшие улучшения кода #1375 - Добавлено всё о GDPR #1420 -### Исправлено +### Исправления - Загрузчик: Исправлен вылет при продолжении незавершённых загрузок с форматом .giga #1407 diff --git a/fastlane/metadata/android/ru/changelogs/64.txt b/fastlane/metadata/android/ru/changelogs/64.txt index e2a02f8ee70..ffa1927c289 100644 --- a/fastlane/metadata/android/ru/changelogs/64.txt +++ b/fastlane/metadata/android/ru/changelogs/64.txt @@ -1,8 +1,8 @@ ### Улучшения -- Добавлена возможность ограничить качество видео при использовании мобильного интернета #1339 +- Добавлена возможность ограничения качества видео при использовании мобильного интернета #1339 - Теперь яркость запоминается на время сессии #1442 - Улучшена производительность загрузки для более слабых процессоров #1431 - Добавлена (работающая) поддержка для медиа-сессии #1433 -### Исправлено +### Исправления - Исправлен вылет при открытии Загрузок (доступно в релизных сборках) #1441 diff --git a/fastlane/metadata/android/ru/changelogs/65.txt b/fastlane/metadata/android/ru/changelogs/65.txt index 51993fef336..bd81955c480 100644 --- a/fastlane/metadata/android/ru/changelogs/65.txt +++ b/fastlane/metadata/android/ru/changelogs/65.txt @@ -1 +1,26 @@ -эскиз видео +### Улучшения + +- Отключение анимации значка burgermenu #1486 +- Отменение удаления загрузок #1472 +- Опция загрузки в меню общего доступа #1498 +- Добавлена опция "Поделиться" в меню долгого нажатием #1454 +- Минимизировать главного игрока на выходе #1354 +- Обновление версии библиотеки и исправление резервного копирования базы данных #1510 +- Обновление ExoPlayer до 2.8.2 #1392 +- Переработан диалог управления скоростью воспроизведения для поддержки различных размеров шага для более быстрого изменения скорости. +- Добавлен переключатель для быстрой перемотки вперед во время пауз в управлении скоростью воспроизведения. Это должно быть полезно для аудиокниг и определенных музыкальных жанров и может принести по-настоящему плавный опыт (и может прервать песню большим количеством пауз =\\). +- Переработано разрешение источника мультимедиа, позволяющее передавать метаданные вместе с мультимедиа внутри проигрывателя, а не делать это вручную. Теперь у нас есть единый источник метаданных, и он доступен непосредственно при запуске воспроизведения. +- Исправлено, что метаданные удаленного плейлиста не обновлялись, когда новые метаданные были доступны при открытии фрагмента плейлиста. +- Различные исправления пользовательского интерфейса: # 1383, элементы управления уведомлениями фонового проигрывателя теперь всегда белые, проще отключить всплывающее окно проигрывателя с помощью щелчка +- Используйте новый экстрактор с переработанной архитектурой для мультисервиса + +### Исправления + +- Исправлено #1440 неработающий макет видеоинформации #1491 +- Исправление истории просмотра #1497 +- # 1495, обновляя метаданные (миниатюру, заголовок и количество видео), как только пользователь получает доступ к списку воспроизведения. +- #1475, путем регистрации просмотра в базе данных, когда пользователь запускает видео на внешнем проигрывателе на детальном фрагменте. +- Исправлен тайм-аут creen в случае всплывающего режима. #1463 (исправлено #640) +- Исправление основного видеоплеера #1509 +- [#1412] Исправлен режим повтора, вызывающий NPE плеера при получении нового намерения, когда активность игрока находится в фоновом режиме. +- Исправлено сведение проигрывателя к всплывающему окну не приводит к уничтожению проигрывателя, если разрешение на всплывающее окно не предоставлено. diff --git a/fastlane/metadata/android/ru/changelogs/66.txt b/fastlane/metadata/android/ru/changelogs/66.txt index 51993fef336..d37569a6820 100644 --- a/fastlane/metadata/android/ru/changelogs/66.txt +++ b/fastlane/metadata/android/ru/changelogs/66.txt @@ -1 +1,33 @@ -эскиз видео +# Список изменений версии 0.13.7 + +### Исправлено +- Исправлены проблемы с фильтром сортировки версии 0.13.6 + +# Список изменений версии 0.13.6 + +### Улучшения + +- Отключение анимации значка burgermenu #1486 +- Отменение удаления загрузок #1472 +- Опция загрузки в меню общего доступа #1498 +- Добавлена опция "Поделиться" в меню с длинным нажатием #1454 +- Минимизировать главного игрока на выходе #1354 +- Обновление версии библиотеки и исправление резервного копирования базы данных #1510 +- Обновление ExoPlayer до 2.8.2 #1392 +- Переработан диалог управления скоростью воспроизведения для поддержки различных размеров шага для более быстрого изменения скорости. +- Добавлен переключатель для быстрой перемотки вперед во время пауз в управлении скоростью воспроизведения. Это должно быть полезно для аудиокниг и определенных музыкальных жанров и может принести по-настоящему плавный опыт (и может прервать песню большим количеством пауз =\\). +- Переработано разрешение источника мультимедиа, позволяющее передавать метаданные вместе с мультимедиа внутри проигрывателя, а не делать это вручную. Теперь у нас есть единый источник метаданных, и он доступен непосредственно при запуске воспроизведения. +- Исправлено, что метаданные удаленного плейлиста не обновлялись, когда новые метаданные были доступны при открытии фрагмента плейлиста. +- Различные исправления пользовательского интерфейса: # 1383, элементы управления уведомлениями фонового проигрывателя теперь всегда белые, проще отключить всплывающее окно проигрывателя с помощью щелчка +- Используйте новый экстрактор с переработанной архитектурой для мультисервиса + +### Исправления + +- Исправлено #1440 неработающий макет видеоинформации #1491 +- Исправление истории просмотра #1497 +- # 1495, обновляя метаданные (миниатюру, заголовок и количество видео), как только пользователь получает доступ к списку воспроизведения. +- #1475, путем регистрации просмотра в базе данных, когда пользователь запускает видео на внешнем проигрывателе на детальном фрагменте. +- Исправлен тайм-аут creen в случае всплывающего режима. #1463 (исправлено #640) +- Исправление основного видеоплеера #1509 +- [#1412] Исправлен режим повтора, вызывающий NPE плеера при получении нового намерения, когда активность игрока находится в фоновом режиме. +- Исправлено сведение проигрывателя к всплывающему окну не приводит к уничтожению проигрывателя, если разрешение на всплывающее окно не предоставлено. diff --git a/fastlane/metadata/android/ru/changelogs/68.txt b/fastlane/metadata/android/ru/changelogs/68.txt index 51993fef336..71e6bf4bbff 100644 --- a/fastlane/metadata/android/ru/changelogs/68.txt +++ b/fastlane/metadata/android/ru/changelogs/68.txt @@ -1 +1,31 @@ -эскиз видео +# Изменения в версии 0.14.1 + +### Исправлено +- Исправлена ошибка при расшифровке URL-адреса видео #1659 +- Исправлена плохо извлекающаяся ссылка на описание#1657 + +# Изменения в версии 0.14.0 + +### Из нового +- Новый дизайн выпадающего списка #1461 +- Новая настраиваемая главная страница #1461 + +### Улучшения +- Переработанное управление жестами #1604 +- Новый способ закрытия всплывающего окна проигрывателя #1597 + +### Исправления +- Исправлена ошибка недоступности количества подписок. Закрыто #1649. +- Показ "Количество подписчиков недоступно" в этих случаях +- Исправлено NPE, при пустом плейлист YouTube +- Быстрое исправление киосков в SoundCloud +- Рефакторинг и исправление ошибок #1623 +- Исправлен результат циклического поиска #1562 +- Исправлена панель поиска, не размещенная статически +- Исправлено, что видео YT Premium блокируется неправильно +- Исправлено, что видео иногда не загружалось (из-за разбора ТИРЕ) +- Исправлены ссылки в описании видео +- Показывать предупреждение, когда кто-то пытается загрузить на внешнюю SD-карту +- Исправлено ничего непоказывающее сообщение о триггерах исключений +- Неотображаемая миниатура в фоновом проигрывателе на Android 8.1 [смотрите здесь](https://github.com/TeamNewPipe/NewPipe/issues/943 ) +- Исправлена регистрация широковещательного приемника. Закрыто #1641. diff --git a/fastlane/metadata/android/ru/changelogs/69.txt b/fastlane/metadata/android/ru/changelogs/69.txt index c081690f841..1d97b0283cf 100644 --- a/fastlane/metadata/android/ru/changelogs/69.txt +++ b/fastlane/metadata/android/ru/changelogs/69.txt @@ -1 +1,19 @@ -настройки +### Из нового +- Длительное нажатие на удаление и общий доступ в подписках #1516 +- Пользовательский интерфейс планшета и макет списка таблиц #1617 + +### Улучшения +- Сохранение и перезагрузка последнего использованного соотношения сторон #1748 +- Включена линейная компоновка в активности загрузки с полными названиями видео #1771 +- Удалять подписки и делиться ими непосредственно с вкладки подписки #1516 +- Постановка в очередь теперь запускает воспроизведение видео, если очередь воспроизведения уже закончилась #1783 +- Отдельные настройки для жестов громкости и яркости #1644 +- Добавлена поддержка локализации #1792 + +### Исправления +- Исправлено время разбора для . format, чтобы NewPipe можно было использовать в Финляндии +- Исправлено количество подписок +- Добавить разрешение на работу в активном режиме для устройств API 28+ #1830 + +### Известные ошибки +- Состояние воспроизведения не может быть сохранено на телефоне Android P diff --git a/fastlane/metadata/android/ru/changelogs/70.txt b/fastlane/metadata/android/ru/changelogs/70.txt index da96c42fda6..8272619cda4 100644 --- a/fastlane/metadata/android/ru/changelogs/70.txt +++ b/fastlane/metadata/android/ru/changelogs/70.txt @@ -1 +1,25 @@ -всплывающий +ВНИМАНИЕ: Эта версия, вероятно, является багфестом, как и предыдущая. Однако из-за полного отключения с 17. сломанная версия лучше, чем без версии. Верно? ¯\_(ツ)_/¯ + +### Улучшения +* Загруженные файлы теперь можно открыть одним щелчком мыши #1879 +* Поддержка drop для Android 4.1 - 4.3 #1884 +* Удалён старый плеер #1884 +* Удаление потоков из текущей очереди воспроизведения, проведя по ним пальцем вправо #1915 +* Удаление потока, автоматически поставленного в очередь, когда новый поток ставится в очередь вручную #1878 +* Постобработка для загрузки и реализации недостающих функций #1759 от @kapodamy +* Инфраструктура постобработки +* Правильная обработка ошибок "инфраструктуры" (для загрузчика) +* Очередь вместо нескольких загрузок +* Переместить сериализованные ожидающие загрузки (файлы `.giga`) в данные приложения +* Реализовать максимальную повторную попытку загрузки +* Правильная приостановка многопоточной загрузки +* Остановка загрузки при подключении к мобильной сети (никогда не работает, см. 2-й пункт) +* Сохраните количество потоков для следующих загрузок +* Исправлено множество несогласованностей + +### Исправления +* Исправлена ошибка с разрешением по умолчанию, установленным на лучшее и ограниченное разрешение мобильных данных #1835 +* исправлен сбой всплывающего проигрывателя #1874 +* NPE при попытке открыть фоновый проигрыватель #1901 +* Исправлена ошибка вставки новых потоков при включенной автоматической постановке в очередь #1878 +* Исправлена проблема с отключением decypering shuttown diff --git a/fastlane/metadata/android/ru/changelogs/71.txt b/fastlane/metadata/android/ru/changelogs/71.txt index 57b179cf25e..c66f055d1aa 100644 --- a/fastlane/metadata/android/ru/changelogs/71.txt +++ b/fastlane/metadata/android/ru/changelogs/71.txt @@ -1 +1,10 @@ -стрим +### Улучшения +* Добавлено уведомление об обновлении приложения из сборки на GitHub (# 1608 от @krtkush) +* Различные улучшения загрузчика (#1944 от @kapodamy): +* Добавьте недостающие белые значки и используйте hardcore way для изменения цвета значков +* Проверка инициализации итератора (исправления #2031) +* Добавлена повторная загрузка для "ошибки постобработки" в новом микшере +* Новый микшер MPEG-4, исправляющий асинхронные видео- и аудиопотоки (#2039) + +### Исправления +* Прямые трансляции YouTube переставали воспроизводиться спустя короткое время (#1996 от @username) diff --git a/fastlane/metadata/android/ru/changelogs/740.txt b/fastlane/metadata/android/ru/changelogs/740.txt index a89174aeb8d..61f21baa822 100644 --- a/fastlane/metadata/android/ru/changelogs/740.txt +++ b/fastlane/metadata/android/ru/changelogs/740.txt @@ -1,23 +1,23 @@

Улучшения

    -
  • сделана возможность нажимать на ссылки в комментариях, увеличен размер текста
  • -
  • поиск по нажатию на временные отметки в комментариях
  • +
  • добавлены интерактивность для ссылок в комментариях, увеличен размер текста
  • +
  • поиск нажатием по временные отметки в комментариях
  • показывать предпочитаемую вкладку, на основании состояния недавно выбраных
  • добавить плейлист в очередь при длинном нажатии на 'Фон' в окне плейлиста
  • поиск по тексту переданному приложению, если это не ссылка
  • добавить "поделиться на этом моменте" кнопку в основной видео-проигрыватель
  • добавить кнопку закрытия в основной видео-проигрыватель, когда очередь проигрывания закончилась
  • добавить "Воспроизвести на фоне" в меню длинного нажатия для предметов из видео-листа
  • -
  • улучшить английский перевод для команд Воспроизвести/Добавить в очередь
  • +
  • улучшен английский перевод для команд Воспроизвести/Добавить в очередь
  • мелкие улучшения работы приложения
  • уюрать неиспользованные файлы
  • -
  • обновить ExoPlayer до 2.9.6
  • +
  • обновлён ExoPlayer до 2.9.6
  • добавить поддержку ссылок Invidious
-

Исправлено

+

Исправления

  • исправлено пролистывание с выключенными комментариями и похожими трансляциями
  • исправлено запуск CheckForNewAppVersionTask когда это не нужно't
  • исправлено импорт подписок с youtube: игнорирование подписок с неправильными ссылками и сохранение тех, у которых пустые названия
  • -
  • исправить неправильные YouTube ссылки: название метки подписи не всегда "signature", что не даёт загружаться трансляциям
  • +
  • исправить неправильные YouTube - ссылки: название метки подписи не всегда "signature", что не даёт загружаться трансляциям
diff --git a/fastlane/metadata/android/ru/changelogs/750.txt b/fastlane/metadata/android/ru/changelogs/750.txt index aac46059afc..ebe57b15972 100644 --- a/fastlane/metadata/android/ru/changelogs/750.txt +++ b/fastlane/metadata/android/ru/changelogs/750.txt @@ -1,22 +1,22 @@ -Новое +Из нового Продолжить проигрывание #2288 • Продолжать трансляции с того момента, где вы остановились -Улучшения загрузчика #2149 +Улучшения загрузчика #2149 • Использовать Storage Access Framework для хранения загрузок на SD-картах • Новый mp4 микшер • Выборочно меняйте путь загрузки перед тем, как начать скачивание -• Учитывать сети с измеряемым трафиком +• Учитывать сети с измеряемым трафиком -Улучшено -• Убрано gema строчки #2295 +Улучшения +• Убраны gema строчки #2295 • Работа с изменениями (авто)поворота во время цикла использования #2444 • Сделать меню длинного нажатия постоянными #2368 -Исправлено +Исправления • Исправлено не показывающееся название выбранной дорожки субтитров #2394 -• Не вылетать при провальной проверке обновлений приложения (GitHub версия) #2423 +• Не вылетать при провальной проверке обновлений приложения (GitHub версия) #2423 • Исправлено вечную загрузку при достижении 99.9% #2440 -• Обновление метаданных очереди проигрывания #2453 +• Обновление метаданных очереди проигрывания #2453 • [SoundCloud] Исправлен вылет при загрузке плейлистов TeamNewPipe/NewPipeExtractor#170 • [YouTube] Исправлена ошибка парсинга времени проигрывания TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/ru/changelogs/760.txt b/fastlane/metadata/android/ru/changelogs/760.txt index 5990094b669..9780bf28f89 100644 --- a/fastlane/metadata/android/ru/changelogs/760.txt +++ b/fastlane/metadata/android/ru/changelogs/760.txt @@ -1,43 +1,43 @@ Изменения в 0.17.1 - Новый - • Тайская локализация +Из нового +• Тайская локализация - Улучшен - • Добавить действие "Начать воспроизведение здесь" в меню длительного нажатия для плейлистов #2518. - • Добавлен переключатель для SAF/устаревшего средства выбора файлов #2521. +Улучшения +• Добавлено действие "Начать воспроизведение здесь" в меню с длительным нажатием для списков воспроизведения #2518 +• Добавлен переключатель для SAF / legacy средства выбора файлов #2521 - Зафиксированный - • Исправлено исчезновение кнопок в режиме просмотра загрузок при переключении приложений #2487. - • Фиксированная позиция воспроизведения сохраняется, хотя история просмотра отключена. - • Исправлено снижение производительности, вызванное положением воспроизведения в представлениях списка #2517. - • [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186. - • [Extractor] [YouTube] Исправлена случайная ошибка поиска, когда плейлисты находятся в результатах. TeamNewPipe/NewPipeExtractor#185 +Исправления +• Исправлено исчезновение кнопок в режиме загрузки при переключении приложений #2487 +• Фиксированная позиция воспроизведения сохраняется, хотя история просмотра отключена +• Исправлено снижение производительности, вызванное позицией воспроизведения в списках просмотров #2517 +• [Extractor] Исправлено ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 +• [Extractor] [YouTube] Исправлена случайная ошибка поиска, когда плейлисты отображаются в результатах TeamNewPipe/NewPipeExtractor#185 - Изменения в 0.17.0 +Изменения в версии 0.17.0 - Новый - Воспроизведение резюме #2288 - • Возобновить трансляции с того места, где вы остановились в прошлый раз. - Усовершенствования загрузчика #2149 - • Используйте Storage Access Framework для хранения загрузок на внешних SD-картах. - • Новый мультиплексор mp4 - • При желании измените каталог загрузки перед началом загрузки - • Соблюдайте тарифные сети +Из нового +Возобновление воспроизведения #2288 +• Возобновите потоки с того места, где вы остановились в прошлый раз +Улучшения загрузчика #2149 +• Используйте платформу доступа к хранилищу для хранения загрузок на внешних SD-картах +• Новый мультиплексор mp4 +• При необходимости измените каталог загрузки перед началом загрузки +• Уважайте дозированные сети - Улучшен - • Удалены гема-строки #2295. - • Обработка (автоматического) поворота во время жизненного цикла активности #2444. - • Сделать меню, вызываемые длительным нажатием, согласованными #2368. +Улучшения +• Удалены gema строки #2295 +• Изменение поворота ручки (автоматически) в течение жизненного цикла действия #2444 +• Сделайте меню при длительном нажатии согласованным #2368 - Зафиксированный - • Исправлена ошибка, из-за которой имя выбранной дорожки субтитров не отображалось #2394 - • Не происходит сбой при сбое проверки обновлений приложения (версия GitHub) #2423. - • Исправлено зависание загрузки на уровне 99,9% #2440 - • Обновлены метаданные очереди воспроизведения – 2453. - • [SoundCloud] Исправлен сбой при загрузке плейлистов TeamNewPipe/NewPipeExtractor#170. - • [YouTube] Фиксированная продолжительность не может быть обработана TeamNewPipe/NewPipeExtractor#177 +Исправления +• Исправлено, что название выбранного трека субтитров не отображалось #2394 +• Не происходит сбой при сбое проверки обновления приложения (версия GitHub) #2423 +• Исправлено застревание загрузок на уровне 99,9% #2440 +• Обновить метаданные очереди воспроизведения #2453 +• [SoundCloud] Исправлен сбой при загрузке плейлистов TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Фиксированная продолжительность не может быть разделена на TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/ru/changelogs/790.txt b/fastlane/metadata/android/ru/changelogs/790.txt index 24d1c115af0..e5724384f52 100644 --- a/fastlane/metadata/android/ru/changelogs/790.txt +++ b/fastlane/metadata/android/ru/changelogs/790.txt @@ -1 +1,14 @@ -папки +Улучшения +• Добавлено больше названий, чтобы улучшить доступность для слепых людей #2655 +• Язык папки загрузки сделан более согласованным и менее двусмысленным #2637 + +Исправления +• Проверка загрузки последнего байта в блоке #2646 +• Исправлена прокрутка в детальном фрагменте видео #2672 +• Удалите анимацию двойного поиска в поле очистки до одного #2695 +• [SoundCloud] Исправлено извлечение идентификатора клиента #2745 + +Разработка +• Добавлены недостающие зависимости, унаследованные от New Pipe Extractor, в New Pipe #2535 +• Переход на AndroidX #2685 +• Обновление ExoPlayer до 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/ru/changelogs/800.txt b/fastlane/metadata/android/ru/changelogs/800.txt index 983abbf962a..1ae6c2bd7e5 100644 --- a/fastlane/metadata/android/ru/changelogs/800.txt +++ b/fastlane/metadata/android/ru/changelogs/800.txt @@ -1,4 +1,4 @@ -Новое +Из нового • Поддержка PeerTube без P2P (#2201) [бета-версия]: ◦ Смотрите и скачивайте видео с сайтов PeerTube. ◦ Добавлены экземпляры в настройках, чтобы получить доступ ко всему миру PeerTube @@ -9,19 +9,19 @@ ◦ Загрузить opus (файлы webm) в формате ogg ◦ Восстанавливайте ссылки для скачивания с истекшим сроком действия, чтобы возобновить загрузку после длительной паузы -Улучшено +Улучшения • Информируйте KioskFragment об изменениях в предпочитаемой стране контента и улучшайте производительность всех основных вкладок #2742 • Используйте новые реализации локализации и загрузчика из extractor #2713 • Сделайте строку "Киоск по умолчанию" переводимой • Черная панель навигации для черной темы #2569 -Исправлено +Исправления • Исправлена ошибка, из-за которой всплывающий проигрыватель не мог перемещаться, если при перемещении всплывающего проигрывателя был помещен другой палец #2772 • Разрешить плейлистам отсутствие загрузчика и исправить сбои, связанные с этой проблемой #2724, TeamNewPipe/NewPipeExtractor#219 • Включение TLS1.1/1.2 на устройствах Android 4.4 (API 19/KitKat) для исправления рукопожатия TLS с MediaCCC и некоторыми экземплярами PeerTube #2792 • [SoundCloud] Исправлено извлечение идентификатора клиента TeamNewPipe/NewPipeExtractor#217 • [SoundCloud] Исправлено извлечение аудиопотока -Развитие -• Обновите ExoPlayer до 2.10.8 #2791, #2816 -• Обновите Gradle до версии 3.5.1 и добавьте поддержку Kotlin #2714 +Разработка +• Обновление ExoPlayer до 2.10.8 #2791, #2816 +• Обновление Gradle до 3.5.1 и добавлена поддержка Kotlin #2714 diff --git a/fastlane/metadata/android/ru/changelogs/810.txt b/fastlane/metadata/android/ru/changelogs/810.txt index 70007f261b2..bd0eb6fc54b 100644 --- a/fastlane/metadata/android/ru/changelogs/810.txt +++ b/fastlane/metadata/android/ru/changelogs/810.txt @@ -1,19 +1,19 @@ -Новое +Из нового • Показывать миниатюру видео на экране блокировки при воспроизведении в фоновом режиме -Улучшено +Улучшения • Добавление локального списка воспроизведения в очередь при длительном нажатии на фоновую / всплывающую кнопку • Сделайте вкладки главной страницы прокручиваемыми и скрывайте, когда есть только одна вкладка. • Ограничить количество обновлений миниатюр уведомлений в фоновом проигрывателе • Добавить фиктивный эскиз для пустых локальных списков воспроизведения -• * Пользователь *.открывает расширение файла вместо *.webmd и показывает "открывает" в метке формата вместо "WebMOpus" в раскрывающемся списке загрузки +• Используется расширение файла *.opus вместо *.webm и показывает "opus" в метке формата вместо "WebMOpus" в выпадающем списке загрузки • Добавить кнопку для удаления загруженных файлов или истории загрузок в разделе "Загрузки" • [YouTube] Добавить поддержку ссылок на каналы /c/shortened_url -Исправлено -• * Исправлены многочисленные проблемы при совместном использовании видео в New Pipe и прямой загрузке его потоков +Исправления +• Исправлены многочисленные проблемы при совместном использовании видео в New Pipe и прямой загрузке его потоков • Исправлен доступ игрока из потока его создания • Исправлена подкачка результатов поиска по страницам • [YouTube] Исправлено включение null, приводящее к NPE -• [* [YouTube] Исправлен просмотр комментариев при открытии invidia.us url-адрес +• [YouTube] Исправлен просмотр комментариев при открытии invidia.us url-адрес • [SoundCloud] Обновлен идентификатор клиента diff --git a/fastlane/metadata/android/ru/changelogs/840.txt b/fastlane/metadata/android/ru/changelogs/840.txt index 2383c75a03c..af4791a7d69 100644 --- a/fastlane/metadata/android/ru/changelogs/840.txt +++ b/fastlane/metadata/android/ru/changelogs/840.txt @@ -1,9 +1,9 @@ -Новое +Из нового • Добавлен выбор языка для изменения языка приложения • Добавлена кнопка "Отправить Коди" в складное меню плеера • Добавлена возможность копировать комментарии при длительном нажатии -Улучшенный +Улучшения • Исправьте активность reCAPTCHA и правильно сохраните полученные файлы cookie • Удалено точечное меню в пользу ящика и кнопки скрыть историю, когда просмотр истории не включен в настройках • Правильно запрашивайте разрешение на отображение поверх других приложений в настройках на Android 6 и более поздних версиях @@ -11,7 +11,7 @@ • Различные улучшения PeerTube • Улучшены несколько исходных строк на английском языке -Исправлено +Исправления • Исправлен повторный запуск проигрывателя, хотя он приостановлен, когда включена опция "свернуть при переключении приложений" и NewPipe свернут • Исправьте начальное значение яркости для жеста • Исправлена загрузка субтитров .srt, содержащих не все разрывы строк diff --git a/fastlane/metadata/android/ru/changelogs/900.txt b/fastlane/metadata/android/ru/changelogs/900.txt index 2243215e919..001561bfb62 100644 --- a/fastlane/metadata/android/ru/changelogs/900.txt +++ b/fastlane/metadata/android/ru/changelogs/900.txt @@ -1,14 +1,14 @@ -Новое +Из нового • Группы подписок и отсортированные каналы • Кнопка отключения звука в проигрывателях -Улучшено -• * Разрешить открытие music.youtube.com и media.ccc.de соединения в новой трубе +Улучшения +• Разрешить открытие music.youtube.com и media.ccc.de соединения в новой трубе • Переместите две настройки с внешнего вида на содержимое • Скрыть параметры поиска на 5, 15, 25 секунд, если включен неточный поиск -Исправлено +Исправления • некоторые видеоролики WebM недоступны для поиска -• * резервное копирование базы данных на телефоне Android +• резервное копирование базы данных на телефоне Android • сбой при совместном использовании загруженного файла • тонны проблем с извлечением с YouTube и многое другое... diff --git a/fastlane/metadata/android/ru/changelogs/930.txt b/fastlane/metadata/android/ru/changelogs/930.txt index 40fa443c221..58a849bf479 100644 --- a/fastlane/metadata/android/ru/changelogs/930.txt +++ b/fastlane/metadata/android/ru/changelogs/930.txt @@ -1,19 +1,19 @@ -Новое +Из нового • Поиск музыки на YouTube • Базовая поддержка Android TV -Улучшено +Улучшения • Добавлена возможность удалять все просмотренные видео из локального списка воспроизведения • Показывать сообщение, когда контент еще не поддерживается, вместо сбоя • Улучшено изменение размера всплывающего проигрывателя с помощью пинч-жестов • Постановка потоков в очередь при длительном нажатии на фоновые и всплывающие кнопки в канале • Улучшена обработка размера заголовка заголовка ящика -Исправлено +Исправления • Исправлена ошибка, из-за которой не работает настройка контента с ограничением по возрасту -• * Исправлены некоторые виды рекапчи +• Исправлены некоторые виды рекапчи • Исправлен сбой при открытии закладок, когда плейлист имеет значение `null` • Исправлено обнаружение исключений, связанных с сетью • Исправлена видимость кнопки сортировки по группам во фрагменте подписок -и более +и много чего ещё diff --git a/fastlane/metadata/android/ru/changelogs/940.txt b/fastlane/metadata/android/ru/changelogs/940.txt index c37293c4bdb..a375d726dfa 100644 --- a/fastlane/metadata/android/ru/changelogs/940.txt +++ b/fastlane/metadata/android/ru/changelogs/940.txt @@ -1,16 +1,16 @@ -Новое +Из нового • Добавлена поддержка комментариев SoundCloud • Добавить настройку ограниченного режима YouTube • Показать сведения о родительском канале PeerTube -Улучшено +Улучшения • Показывать кнопку Kore только для поддерживаемых сервисов -• * Блокируйте жесты игрока, которые начинаются с панели навигации или строки состояния +• Блокируйте жесты игрока, которые начинаются с панели навигации или строки состояния • Измените цвет фона кнопок повтора и подписки на основе цвета сервиса -Исправлено +Исправления • Исправлена блокировка диалогового окна загрузки • Кнопка Открыть в браузере теперь действительно открывается в браузере • Исправлена ошибка при открытии видео и "Не удалось воспроизвести этот поток" -и более +и много чего ещё diff --git a/fastlane/metadata/android/ru/changelogs/951.txt b/fastlane/metadata/android/ru/changelogs/951.txt index 18f47adc04c..d45fb542b56 100644 --- a/fastlane/metadata/android/ru/changelogs/951.txt +++ b/fastlane/metadata/android/ru/changelogs/951.txt @@ -1,17 +1,17 @@ -Новое +Из нового • Добавить поиск для средства выбора подписки в диалоговом окне группы каналов • Добавьте фильтр в диалоговое окно группы каналов, чтобы показывать только негруппированные подписки • Добавить вкладку плейлиста на главную страницу • Быстрая перемотка вперед / назад в фоновом режиме / очередь всплывающих окон проигрывателя • Отобразить предложение по поиску: вы имели в виду и показываете результат для -Улучшено -• * Удалите метаданные приложения для записи в смешанные файлы +Улучшения +• Удалите метаданные приложения для записи в смешанные файлы • Не удаляйте сбойные потоки из очереди • Обновите цвет строки состояния, чтобы он соответствовал цвету панели инструментов -Исправлено +Исправления • Исправлена рассинхронизация аудио / видео, вызванная накопительными ошибками с плавающей запятой • [PeerTube] Обрабатывает удаленные комментарии -и более +и много чего ещё diff --git a/fastlane/metadata/android/ru/changelogs/954.txt b/fastlane/metadata/android/ru/changelogs/954.txt index f0da442028b..6d6273af19d 100644 --- a/fastlane/metadata/android/ru/changelogs/954.txt +++ b/fastlane/metadata/android/ru/changelogs/954.txt @@ -1,9 +1,9 @@ • новый рабочий процесс приложения: воспроизведение видео на странице сведений, проведите пальцем вниз, чтобы свернуть проигрыватель • Уведомления в стиле медиастайла: настраиваемые действия в уведомлениях, повышение производительности -• * базовое изменение размера при использовании New Pipe в качестве настольного приложения +• базовое изменение размера при использовании New Pipe в качестве настольного приложения -• показывать диалоговое окно с открытыми параметрами в случае появления неподдерживаемого URL-адреса. +• показывать диалоговое окно с открытыми параметрами в случае появления неподдерживаемого URL-адреса • Улучшите работу с поисковыми предложениями, когда удаленные предложения не могут быть извлечены -• Увеличено качество видео по умолчанию до 720p60 (встроенный проигрыватель) и 480p (всплывающий проигрыватель). +• Увеличено качество видео по умолчанию до 720p60 (встроенный проигрыватель) и 480p (всплывающий проигрыватель) • тонны исправлений ошибок и многое другое diff --git a/fastlane/metadata/android/ru/changelogs/957.txt b/fastlane/metadata/android/ru/changelogs/957.txt index 55e12b906a6..3f3af1d3cb5 100644 --- a/fastlane/metadata/android/ru/changelogs/957.txt +++ b/fastlane/metadata/android/ru/changelogs/957.txt @@ -2,9 +2,9 @@ • Жест двумя пальцами для закрытия проигрывателя • Разрешить очистку файлов cookie reCAPTCHA • Возможность не раскрашивать уведомление -• * Улучшите способ открытия деталей видео, чтобы исправить бесконечную буферизацию, ошибки при совместном использовании с новым каналом и другие несоответствия. +• Улучшите способ открытия деталей видео, чтобы исправить бесконечную буферизацию, ошибки при совместном использовании с новым каналом и другие несоответствия • Ускорьте просмотр видео на YouTube и исправьте возрастные ограничения • Исправлен сбой при быстрой перемотке вперед / назад • Не переставляйте списки, перетаскивая миниатюры • Всегда помните о свойствах всплывающего окна -• Добавить язык сантали +• Добавить язык Сантали diff --git a/fastlane/metadata/android/ru/changelogs/964.txt b/fastlane/metadata/android/ru/changelogs/964.txt index d31f3ef2c2d..74c406568ed 100644 --- a/fastlane/metadata/android/ru/changelogs/964.txt +++ b/fastlane/metadata/android/ru/changelogs/964.txt @@ -3,6 +3,6 @@ • Повторно добавлена кнопка "Поделиться" в подробном просмотре видео и перенесено описание потока в макет вкладки • Отключите восстановление яркости, если жест яркости отключен • Добавлен элемент списка для воспроизведения видео на kodi -• Исправлен сбой, когда на некоторых устройствах не был установлен браузер по умолчанию, и улучшены диалоги общего доступа. +• Исправлен сбой, когда на некоторых устройствах не был установлен браузер по умолчанию, и улучшены диалоги общего доступа • Переключение воспроизведения / паузы с помощью аппаратной кнопки пробела в полноэкранном проигрывателе -• [media.ccc.de ] Различные исправления и улучшения +• [media.ccc.de] Различные исправления и улучшения diff --git a/fastlane/metadata/android/ru/changelogs/966.txt b/fastlane/metadata/android/ru/changelogs/966.txt index 651c8683877..dd76fc64850 100644 --- a/fastlane/metadata/android/ru/changelogs/966.txt +++ b/fastlane/metadata/android/ru/changelogs/966.txt @@ -1,14 +1,14 @@ -Новое: +Из нового: • Добавить новую услугу: Bandcamp -Улучшенный: +Улучшения: • Добавьте опцию, чтобы приложение соответствовало теме устройства • Предотвратите некоторые сбои, показав улучшенную панель ошибок • Показать дополнительную информацию о том, почему контент в недоступном • Аппаратная кнопка пробела запускает воспроизведение/паузу • Показать тост "Загрузка начата" -Исправлено: +Исправления: • Исправлена очень маленькая миниатюра в деталях видео при воспроизведении в фоновом режиме • Исправлен пустой заголовок в свернутом проигрывателе • Исправлено, что последний режим изменения размера восстанавливался неправильно diff --git a/fastlane/metadata/android/ru/changelogs/970.txt b/fastlane/metadata/android/ru/changelogs/970.txt index 6d2d8bba9ad..92a89e07ed5 100644 --- a/fastlane/metadata/android/ru/changelogs/970.txt +++ b/fastlane/metadata/android/ru/changelogs/970.txt @@ -1,11 +1,11 @@ -Новое - • Просмотр метаданных контента (теги, категории, лицензии и т. д.) под описанием. - • Добавлена опция "Показать информацию о канале" в удаленных (не локальных) плейлистах. - • В меню длительного нажатия добавлена опция "Открыть в браузере". +Из нового +• Просмотр метаданных контента (теги, категории, лицензии и т.д.) под описанием. +• Добавлена опция "Показать информацию о канале" в удаленных (не локальных) плейлистах. +• В меню длительного нажатия добавлена опция "Открыть в браузере". - Зафиксированный - • Исправлен сбой при вращении на странице сведений о видео. - • Исправлена ошибка, из-за которой кнопка «Играть с Kodi» в плеере всегда предлагала установить Kore. - • Исправлены и улучшены настройки путей импорта и экспорта - • [YouTube] Исправлены комментарии и их количество. - И многое другое +Исправления +• Исправлен сбой при вращении на странице сведений о видео. +• Исправлена ошибка, из-за которой кнопка «Играть с Kodi» в плеере всегда предлагала установить Kore. +• Исправлены и улучшены настройки путей импорта и экспорта +• [YouTube] Исправлены комментарии и их количество. +И много чего ещё diff --git a/fastlane/metadata/android/ru/changelogs/972.txt b/fastlane/metadata/android/ru/changelogs/972.txt new file mode 100644 index 00000000000..c254c0a5481 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/972.txt @@ -0,0 +1,14 @@ +Из нового +Распознавание временных меток и хэштегов в описании +Добавлена ручная настройка режима планшета +Добавлена возможность скрывать воспроизводимые элементы в ленте + +Улучшения +Исправлена поддержка Storage Access Framework +Улучшенная обработка ошибок недоступных и прерванных каналов +На листе обмена Android для пользователей Android 10+ теперь отображается заголовок контента +Обновлены экземпляры Invidious и добавлена поддержка каналов + +Исправления +[YouTube] Контент с ограничением по возрасту +Утечка окна Исключение при открытии диалогового окна выбора diff --git a/fastlane/metadata/android/ru/changelogs/973.txt b/fastlane/metadata/android/ru/changelogs/973.txt new file mode 100644 index 00000000000..a3733fa2556 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/973.txt @@ -0,0 +1,4 @@ +Быстрое исправление +• Исправлена ошибка, из-за которой миниатюры и заголовки обрезались в макете сетки из-за неправильного расчета количества видео, которое может поместиться в одну строку +• Исправлена ошибка, из-за которой диалоговое окно загрузки исчезало без каких-либо действий, если оно было открыто из меню «Поделиться» +• Обновлена библиотека, связанная с открытием внешних действий, таких как средство выбора файлов Storage Access Framework diff --git a/fastlane/metadata/android/ru/changelogs/974.txt b/fastlane/metadata/android/ru/changelogs/974.txt new file mode 100644 index 00000000000..b3591946a5a --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/974.txt @@ -0,0 +1,5 @@ +Быстрое исправление +•Исправлены проблемы с буферизацией, вызванные тротлингом YouTube +•Исправлено извлечение комментариев YouTube и сбои с отключенными комментариями +• Исправлен поиск музыки на YouTube +• Исправления прямых трансляций PeerTube diff --git a/fastlane/metadata/android/ru/changelogs/975.txt b/fastlane/metadata/android/ru/changelogs/975.txt new file mode 100644 index 00000000000..f0a6630fccc --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/975.txt @@ -0,0 +1,17 @@ +Из нового +• Показ миниатюры во время поиска +• Обнаружение отключённых комментариев +• Разрешение отмечать элемент ленты как просматриваемый +• Показывать сердечки комментариев + +Улучшения +• Улучшено расположение метаданных и тегов +• Применение служебного цвета к компонентам пользовательского интерфейса + +Исправления +• Исправлена миниатюра в мини-плеере +• Исправлена бесконечная буферизация повторяющихся элементов очереди +• Некоторые исправления плеера, такие как вращение и более быстрое закрытие +• Исправлена ошибка, из-за которой ReCAPTCHA оставалась загруженной в фоновом режиме +• Отключины клики во время обновления элементов ленты +• Исправлены некоторые сбои загрузчика diff --git a/fastlane/metadata/android/ru/changelogs/976.txt b/fastlane/metadata/android/ru/changelogs/976.txt new file mode 100644 index 00000000000..2b24b0350a7 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/976.txt @@ -0,0 +1,10 @@ +• Добавлена возможность прямого открытия плеера в полноэкранном режиме +• Разрешение выбирать, какие типы поисковых предложений показывать +• Тёмная тема стала темнее + добавлен тёмный экран-заставка +• Улучшено средство выбора файлов, позволяющее выделить ненужные файлы серым цветом +• Исправлен импорт подписок YouTube +• Для повторного воспроизведения потока требуется повторное нажатие на кнопку воспроизведения +• Исправлено закрытие аудио сессии +• [Android TV] Исправлены долгие скачки панели поиска при использовании DPad + +Чтобы увидеть дальнейшие изменения, просмотрите журнал изменений (и сообщение в блоге) на вкладке «Ссылки» ниже. diff --git a/fastlane/metadata/android/ru/changelogs/977.txt b/fastlane/metadata/android/ru/changelogs/977.txt new file mode 100644 index 00000000000..f63e6a575ee --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/977.txt @@ -0,0 +1,10 @@ +• В меню длительного нажатия добавлена кнопка "перейти к следующему" +• В фильтр намерений добавлен префикс пути к YouTube shorts +• Исправлен импорт настроек +• Поменяны местами панель поиска с кнопками проигрывателя на экране очереди +• Различные исправления, связанные с MediasessionManager +• Исправлена ошибка, из-за которой панель поиска не закрывалась после окончания видео +• Отключено медиа-туннелирование на RealtekATV +• Расширена интерактивная область кнопок свёрнутого проигрывателя + +Чтобы увидеть дальнейшие изменения, просмотрите журнал изменений (и сообщение в блоге) на вкладке «Ссылки» ниже. diff --git a/fastlane/metadata/android/ru/changelogs/978.txt b/fastlane/metadata/android/ru/changelogs/978.txt new file mode 100644 index 00000000000..1ae2c65da9f --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/978.txt @@ -0,0 +1 @@ +Исправлено выполнение проверки для новых версий NewPipe. Иногда эта проверка выполнялась слишком рано, что приводило к падению приложения. Теперь это должно быть исправлено. diff --git a/fastlane/metadata/android/ru/changelogs/979.txt b/fastlane/metadata/android/ru/changelogs/979.txt new file mode 100644 index 00000000000..81235074a21 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/979.txt @@ -0,0 +1,2 @@ +- Исправлено возобновление воспроизведения +- Улучшения для службы, определяющей, должен ли NewPipe проверять наличие новой версии, не запускалась в фоновом режиме diff --git a/fastlane/metadata/android/ru/changelogs/980.txt b/fastlane/metadata/android/ru/changelogs/980.txt new file mode 100644 index 00000000000..7bc804b06d3 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/980.txt @@ -0,0 +1,13 @@ +Из нового +• Добавлена опция «Добавить в плейлист» в меню «Поделиться» +• Добавлена поддержка коротких ссылок y2u.be и PeerTube + +Улучшения +• Элементы управления скоростью воспроизведения стали более компактными. +• Лента теперь выделяет новые элементы +• Опция «Показывать просмотренные элементы» в ленте теперь сохраняется + +Исправления +• Исправлено извлечение лайков и дизлайков YouTube. +• Исправлен автоматический повтор после выхода из фонового режима +И многое другое diff --git a/fastlane/metadata/android/ru/changelogs/981.txt b/fastlane/metadata/android/ru/changelogs/981.txt new file mode 100644 index 00000000000..1e6aeb5aedc --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/981.txt @@ -0,0 +1,2 @@ +Удалена поддержка MediaParser для исправления возобновления воспроизведения после буферизации на Android 11+. +Отключено медиа-туннелирование на Philips QM16XE для решения проблем с воспроизведением. diff --git a/fastlane/metadata/android/ru/changelogs/983.txt b/fastlane/metadata/android/ru/changelogs/983.txt new file mode 100644 index 00000000000..9e9a6e52c43 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/983.txt @@ -0,0 +1,9 @@ +Добавлен новый пользовательский интерфейс для поиска через двойное нажатие и поведения +Настройки сделаны более доступными для поиска +Выделенные закреплённые комментарии как таковые +Добавлена поддержка открытия с помощью приложения для экземпляра FSFE PeerTube. +Добавлены уведомления об ошибках +Исправлено повторное воспроизведение первого элемента очереди при смене плеера. +Подождите дольше при буферизации во время прямых трансляций, прежде чем произойдет сбой +Исправлен порядок результатов локального поиска +Исправлены пустые поля предметов в очереди воспроизведения diff --git a/fastlane/metadata/android/ru/changelogs/984.txt b/fastlane/metadata/android/ru/changelogs/984.txt new file mode 100644 index 00000000000..0a7a8ebcd0d --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/984.txt @@ -0,0 +1,7 @@ +Загружайте достаточно начальных элементов в списках, чтобы заполнить весь экран и исправить прокрутку на планшетах и телевизорах +Исправлены случайные сбои при прокрутке списков +Оверлейная дуга быстрого поиска теперь идёт под системным пользовательским интерфейсом +Отменены изменения в вырезах при воспроизведении в многооконном режиме, вызывая неуместную регрессию проигрывателя на некоторых телефонах. +Увеличен compileSdk с 30 до 31 +Обновлена библиотека отчётов об ошибках +Рефакторинг кода в плеере diff --git a/fastlane/metadata/android/ru/changelogs/986.txt b/fastlane/metadata/android/ru/changelogs/986.txt new file mode 100644 index 00000000000..679ea7d7cdf --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/986.txt @@ -0,0 +1,16 @@ +Из нового +• Уведомления о новых трансляциях +• Плавный переход между фоном и видеоплеерами +• Изменение скорости по полушагам +• Добавлена очередь основного проигрывателя в список воспроизведения + +Улучшения +• Запоминание размера шага скорости +• Уменьшина начальная долгая буферизация в видеоплеере +• Улучшен пользовательский интерфейс плеера для Android TV +• Подтверждение удаления всех загруженных файлов + +Исправления +• Исправлена ошибка, из-за которой кнопка мультимедиа не скрывала элементы управления проигрывателем +• Исправлен сброс воспроизведения при смене типа проигрывателя +• Исправлен поворот диалогового окна плейлиста diff --git a/fastlane/metadata/android/ru/changelogs/987.txt b/fastlane/metadata/android/ru/changelogs/987.txt index 8e97023650f..257179fc636 100644 --- a/fastlane/metadata/android/ru/changelogs/987.txt +++ b/fastlane/metadata/android/ru/changelogs/987.txt @@ -1,12 +1,12 @@ -Новое +Из нового • Поддержка методов доставки, отличных от прогрессивного HTTP: ускорение времени загрузки воспроизведения, исправления PeerTube и SoundCloud, воспроизведение недавно закончившихся трансляций YouTube • Кнопка «Добавить», чтобы добавить удаленный плейлист к локальному • Предпросмотр изображения на странице общего доступа Android 10+ -Улучшено +Улучшения • Улучшения окна параметров воспроизведения • Перемещение кнопки импорта/экспорта подписки в трехточечное меню -Исправлено +Исправления • Исправлено удаление полностью просмотренных видео из плейлиста • Исправлена тема меню «Поделиться» и пункт «Добавить в плейлист» diff --git a/fastlane/metadata/android/ru/changelogs/988.txt b/fastlane/metadata/android/ru/changelogs/988.txt new file mode 100644 index 00000000000..1464aa3b5c2 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Исправлена ошибка «Не удалось получить поток» при попытке воспроизвести любое видео. +[YouTube] Исправление «Следующий контент недоступен в этом приложении». Сообщение отображается вместо запрошенного видео diff --git a/fastlane/metadata/android/ru/changelogs/989.txt b/fastlane/metadata/android/ru/changelogs/989.txt new file mode 100644 index 00000000000..889fec465ca --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] Исправлена бесконечная загрузка при попытке воспроизвести любое видео +• [YouTube] Исправлено замедление некоторых видео +• Обновлена библиотека jsoup до версии 1.15.3, которая включает исправления безопасности diff --git a/fastlane/metadata/android/ru/changelogs/990.txt b/fastlane/metadata/android/ru/changelogs/990.txt new file mode 100644 index 00000000000..195704f3a74 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/990.txt @@ -0,0 +1,15 @@ +В этом выпуске прекращена поддержка Android 4.4 KitKat, теперь минимальная версия — Android 5 Lollipop! + +Из нового +• Добавлен пункт "Загрузка" в меню длительного нажатия +• Возможность скрыть будущие видео в ленте +• Возможность делиться локальными плейлистами + +Улучшения +• Рефакторинг кода проигрывателя на небольшие компоненты: меньше оперативной памяти, меньше ошибок +• Улучшен режим масштабирования миниатюр. +• Заполнители векторных изображений + +Исправления +• Исправлены различные проблемы с уведомлением проигрывателя: устаревшая/отсутствующая информация о медиа, искажённая миниатюра +• Исправлен полноэкранный режим с использованием 1/4 экрана diff --git a/fastlane/metadata/android/ru/changelogs/991.txt b/fastlane/metadata/android/ru/changelogs/991.txt new file mode 100644 index 00000000000..6d4f2beac73 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/991.txt @@ -0,0 +1,13 @@ +Из нового +• Добавлена кнопка "Открыть в браузере" на панели ошибок +• Добавлена возможность отображать группы каналов в виде списка +• [YouTube] Нажмите и удерживайте сегменты потока, чтобы поделиться URL-адресом временной метки +• Добавлена кнопка очереди воспроизведения в мини-плеер + +Улучшения +• Добавлена исландская локализация и обновлены многие другие переводы +• Множество внутренних улучшений + +Исправления +• Исправление нескольких сбоев +• [YouTube] Исправлены проблемы с загрузкой каналов, невыделенной лентой и временным решением проблем с воспроизведением в некоторых странах diff --git a/fastlane/metadata/android/ru/changelogs/992.txt b/fastlane/metadata/android/ru/changelogs/992.txt new file mode 100644 index 00000000000..d4e5616fa50 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/992.txt @@ -0,0 +1,17 @@ +Из нового +• Количество подписчиков в сведениях о видео. +• Загрузить из очереди +• Навсегда установить миниатюру плейлиста +• Нажмите и удерживайте хэштеги и ссылки. +• Режим просмотра "карта" + +Улучшения +• Увеличенная кнопка закрытия мини-плеера +• Более плавное уменьшение миниатюр +• Целевой Android 13 (API 33) +• Поиск больше не останавливает плеер + +Исправления +• Исправлено наложение на DeX/мыши. +• Разрешить фоновый проигрыватель без отдельных аудиопотоков +• Различные исправления YouTube и многое другое… diff --git a/fastlane/metadata/android/ru/changelogs/993.txt b/fastlane/metadata/android/ru/changelogs/993.txt new file mode 100644 index 00000000000..ea26a1aff3c --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/993.txt @@ -0,0 +1,13 @@ +Из нового +• Добавлено предупреждение при добавлении дубликатов плейлистов и добавлена кнопка для их удаления +• Разрешение игнорировать аппаратные кнопки +• Разрешение скрывать частично просмотренные видео в ленте + +Улучшения +• Используйте больше столбцов сетки на больших экранах +• Приведите индикаторы прогресса в соответствие с настройками + +Исправления +• Исправлено открытие URL-адресов браузера, загрузок и внешних проигрывателей на Android 11+ +• Исправлено взаимодействие с полноэкранным режимом, требующее двух нажатий в MIUI +• Разрешить изменять настройки ExoPlayer, чтобы исправить воспроизведение на некоторых устройствах diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru/full_description.txt index d25f04b0029..8daf4ef3a9f 100644 --- a/fastlane/metadata/android/ru/full_description.txt +++ b/fastlane/metadata/android/ru/full_description.txt @@ -1 +1 @@ -NewPipe не использует библиотеки фреймворка Google или API YouTube, взаимодействуя только с сайтом сервиса для получения необходимых сведений. NewPipe может работать на устройствах без установленных Сервисов Google и не требует учётной записи YouTube, это свободное программное обеспечение. +NewPipe не использует библиотеки фреймворка Google или API YouTube, взаимодействуя только с сайтом сервиса для получения необходимых данных. NewPipe может работать на устройствах без установленных Сервисов Google и не требует учётной записи YouTube, это свободное программное обеспечение. diff --git a/fastlane/metadata/android/sv/changelogs/790.txt b/fastlane/metadata/android/sv/changelogs/790.txt new file mode 100644 index 00000000000..367e97cfb2f --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/790.txt @@ -0,0 +1,14 @@ +Förbättrad +- Lägg till fler titlar för att förbättra tillgängligheten för blinda #2655 +- Språket i inställningen för nedladdningsmappen blir mer konsekvent och mindre tvetydigt #2637 + +Rättad +- Kontrollera om sista byte i blocket laddas ner #2646 +- Fastställd rullning i videodetaljfragment #2672 +- Ta bort dubbla animationer av sökrutan till en enda #2695 +- [SoundCloud] Fixa utvinning av client_id #2745 + +Utveckling +- Lägg till saknade beroenden som ärvts från NewPipeExtractor i NewPipe #2535 +- Migrera till AndroidX #2685 +- Uppdatering till ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/uk/changelogs/993.txt b/fastlane/metadata/android/uk/changelogs/993.txt new file mode 100644 index 00000000000..1ce103bca7e --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/993.txt @@ -0,0 +1,13 @@ +Нове +• Додано попередження про дублікати добірок і кнопку їх видалення +• Дозвіл ігнорувати апаратні кнопки +• Дозвіл ховати частково переглянуті відео + +Поліпшено +• Більше стовпців сітки на великих екранах +• Індикатори перегляду відповідні налаштуванням + +Виправлено +• Відкриття URL-адрес браузера, завантажень і зовнішніх програвачів на Android 11+ +• Роботу повноекранного режиму, який вимагав двох дотиків у MIUI +• Дозвіл змінювати налаштування ExoPlayer, щоб виправити відтворення на деяких пристроях diff --git a/fastlane/metadata/android/zh-Hant/changelogs/993.txt b/fastlane/metadata/android/zh-Hant/changelogs/993.txt new file mode 100644 index 00000000000..edb1f70fe72 --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/993.txt @@ -0,0 +1,13 @@ +新增 +• 重複加入至播放清單時警告,同時另設移除重複項目的按鈕 +• 允許忽略硬體按鈕 +• 允許在摘要中隱藏已部分觀看的影片 + +改進 +• 在大螢幕上以格線顯示更多欄 +• 進度標示器與設定一致 + +修正 +• 修正 Android 11+ 上開啟瀏覽器 URL、下載與外部播放器 +• 修正 MIUI 上全螢幕操作需要輕觸兩下 +• 允許微調 ExoPlayer 設定以修正部分裝置上的播放問題 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/981.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/981.txt index cf0bd858878..5bcc922a83f 100644 --- a/fastlane/metadata/android/zh_Hant_HK/changelogs/981.txt +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/981.txt @@ -1,2 +1,2 @@ -移除了對MediaParser的支持,以解決在Android 11+上緩衝後恢復播放失敗的問題。 -在Philips QM16XE上禁用了媒體隧道,以解決播放問題。 +移除咗對MediaParser(媒體解析器)嘅支持,解決咗喺Android 11+上面緩衝後,恢復播放時失敗嘅問題。 +喺Philips QM16XE上禁用了media tunneling(隧道模式),去解決恢復播放卡機嘅問題。 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/983.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/983.txt index ec2edbe3844..d141dc9ce59 100644 --- a/fastlane/metadata/android/zh_Hant_HK/changelogs/983.txt +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/983.txt @@ -1,9 +1,9 @@ -新加撳兩下跳轉嘅介面同功能 -設定有得打字嚟搵 -留言置頂有色水分辨 -為 FSFE 嘅 PeerTube 站新加「用 app 嚟開」支援 -新加錯誤通知 -修正播放器轉變時重播隊頭項目 -直播串流緩衝時等耐啲先至算失敗 -修正本機搜尋結果嘅排位 -修正排隊播入面開天窗嘅項目欄位 +新加咗撳兩下就跳轉介面嘅功能 +可以喺設定入面打字搵嘢 +突出咗置頂嘅留言 +支援咗用 app 去開由FSFE (歐洲自由軟件基金會)託管嘅 PeerTube站 +新加咗錯誤通知 +修正咗播放器轉換嗰陣重播排隊嘅首項 +等耐啲實況串流緩衝再定輸數 +修正咗本機搜尋結果嘅順位 +修正咗播放順位入面空寥寥項目嘅欄位 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/984.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/984.txt index 34be1e7efbb..d93c53791c4 100644 --- a/fastlane/metadata/android/zh_Hant_HK/changelogs/984.txt +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/984.txt @@ -1,7 +1,7 @@ -喺清單度載入足夠多初始項目去填滿成個螢幕並修正喺平板電腦同電視上面嘅捲動問題 -修正捲動清單時偶發閃退 +喺清單度載入足量初始項目去填滿全螢幕,並修正喺平板電腦同電視機上面嘅捲動問題 +修正咗捲動播放清單嗰陣突然出現嘅閃退問題 播放器快轉嘅覆蓋弧形擺喺系統介面後面 -撤回多視窗播放時嘅 M 字額變動,以免部份手機出現播放器錯位嘅倒退 -將 compileSdk 由 30 升至 31 -更新問題報告程式庫 -執整播放器部份程式碼 +撤回多視窗播放時嘅 M 字額變動,以免部份手機出現播放器錯位嘅倒放 +將 compileSdk (指定 Gradle 應該使用嘅Android API 級別去編譯你嘅應用)由 30 升至 31 +更新咗回報問題報告嘅程式庫 +重構部份喺播放器嘅程式碼 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/985.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/985.txt index f1d67925fda..9a4721551a1 100644 --- a/fastlane/metadata/android/zh_Hant_HK/changelogs/985.txt +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/985.txt @@ -1 +1 @@ -修正 YouTube 乜串流都播唔到 +修正咗 YouTube 乜嘢實況串流都播唔到嘅問題 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/986.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/986.txt index e451189ef6e..c3c2fbbe8eb 100644 --- a/fastlane/metadata/android/zh_Hant_HK/changelogs/986.txt +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/986.txt @@ -1,16 +1,16 @@ 新嘢 -• 新加串流有通知 -• 幕後同影片播放器無縫切換 +• 新嘅實況串流會顯示通知出嚟 +• 無隙切換背景同影片播放器 • 按半度調整音高 -• 將主版面播放器排隊播追加落播放清單 +• 將主版面播放器隊列追加後變成播放清單 進步 -• 記住速率/音高調整步伐 -• 改善影片播放器開波時漫長緩衝 -• 完善 Android TV 嘅播放器版面 -• 刪除晒全部下載咗嘅檔案之前先確認 +• 記住咗倍速/音高嘅調整步調 +• 改善咗影片播放器開波嗰陣嘅漫長緩衝期 +• 改善咗 Android TV 嘅播放器版面 +• 確認多次係咪真係要刪除晒所有下載咗嘅檔案 修正 -• 修正媒體掣冇隱藏到啲播放器控掣 -• 修正播放器類型有變時重頭再播 -• 修正播放器清單對話方塊嘅方向旋轉 +• 修正咗媒體掣入面冇隱藏到啲播放器控掣選項 +• 修正咗播放器換轉類別嗰陣嘅重頭再播過 +• 修正咗播放器清單對話方塊嘅旋轉方向 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/993.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/993.txt new file mode 100644 index 00000000000..754da7342ab --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/993.txt @@ -0,0 +1,13 @@ +新嘢 +• 重複加入去播放清單時警告,同時整多個掣剷走重複咗嗰啲 +• 硬件掣有得當佢冇到 +• 摘要有得收埋未睇晒嘅片 + +進步 +• 大螢幕一格格騷多幾欄 +• 轉圈公仔跟返設定噉樣 + +執漏 +• 修正 Android 11+ 開啟瀏覽器 URL、下載同外面播放器 +• 修正 MIUI 全螢幕時要撳兩下至搞得掂 +• 有得調校 ExoPlayer 設定解決某啲機播唔到片嘅問題 diff --git a/fastlane/metadata/android/zh_Hant_HK/full_description.txt b/fastlane/metadata/android/zh_Hant_HK/full_description.txt index 9fe7dfeb96a..9c6fbaef6d8 100644 --- a/fastlane/metadata/android/zh_Hant_HK/full_description.txt +++ b/fastlane/metadata/android/zh_Hant_HK/full_description.txt @@ -1 +1 @@ -NewPipe 冇用到任何 Google 框架程式庫又或者 YouTube API,單憑解析網站去攞到所需嘅資訊,因此就算冇裝 Google 服務嘅機都用得呢個 app。此外,NewPipe 亦毋需您要有 YouTube 帳戶就用得,而且係自由同開放原始碼嘅軟件 (FLOSS)。 +NewPipe 冇用到任何 Google 框架程式庫同YouTube API。而NewPipe透過解析網站,就可以攞到所需嘅資訊。因此,就算冇裝到使用Google 架構嘅機,都用得呢個 app。此外,您亦毋需有 YouTube 帳戶就用到NewPipe,而且呢個係自由同有開放原始碼嘅軟件 (FLOSS)。 diff --git a/fastlane/metadata/android/zh_Hant_HK/short_description.txt b/fastlane/metadata/android/zh_Hant_HK/short_description.txt index 8f4a31c0399..4dd4818cf45 100644 --- a/fastlane/metadata/android/zh_Hant_HK/short_description.txt +++ b/fastlane/metadata/android/zh_Hant_HK/short_description.txt @@ -1 +1 @@ -一個自由輕巧嘅 Android YouTube 前端。 +適用於Android嘅免費,自由、輕量級同具有前瞻性嘅YouTube。 From 41da2bfb002644b38cc909bf227ca43911ce73cc Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sun, 2 Apr 2023 23:02:19 +0200 Subject: [PATCH 130/645] Bump NewPipe Extractor to 0.22.6 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0e2fd40015e..350c59cf6bf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,7 @@ dependencies { // name and the commit hash with the commit hash of the (pushed) commit you want to test // This works thanks to JitPack: https://jitpack.io/ implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'com.github.TeamNewPipe:NewPipeExtractor:19e4b216c905f06f55f20241c1572e48fc284811' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.22.6' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ From ec974a2b3da128354d1c608a107a4cd9122ac4c5 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 3 Apr 2023 14:47:45 +0200 Subject: [PATCH 131/645] Translated using Weblate (Estonian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (661 of 661 strings) Co-authored-by: Hosted Weblate Co-authored-by: Nidi Co-authored-by: Olivia Ng Co-authored-by: Priit Jõerüüt --- app/src/main/res/values-az/strings.xml | 2 +- app/src/main/res/values-et/strings.xml | 2 +- app/src/main/res/values-zh-rHK/strings.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 68413792e1c..8779fb8670e 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -34,7 +34,7 @@ Standart ayırdetmə Daha böyük ayırdetmələr göstər \"Kodi\" ilə Oynat - Çatışmayan \"Kode\" tətbiqi yüklənilsin\? + Çatışmayan \"Kore\" tətbiqi yüklənilsin\? \"Kodi ilə Oynat\" seçimini göstər Kodi media mərkəzindən video oynatmaq üçün seçim göstər Səs diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index a4ee72c5729..9ec65ce9984 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -41,7 +41,7 @@ Kuva kõrgemaid lahutusi Ainult mõned seadmed suudavad esitada 2K/4K videoid Esita Kodi abil - Kas paigaldada puuduv Kode rakendus\? + Kas paigaldame puuduva Kore rakenduse\? Kuva valik \"Esita Kodi abil\" Kuva valik video esitamiseks Kodi meediakeskuse kaudu Heli diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index ee1ef78e5f7..8e83c40150f 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -123,11 +123,11 @@ 訂閱咗 取消訂閱 已取消訂閱頻道 - 轉唔到訂閱 + 改唔到訂閱 更新唔到訂閱 顯示資訊 訂閱 - 收起嘅播放清單 + 儲起嘅播放清單 用粗略快轉 加入去 選擇標籤 From 7a8116b2cf44c00bbe31689ec0b556a304ffb84f Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 4 Apr 2023 09:47:51 +0200 Subject: [PATCH 132/645] Remove "ExoPlayer settings" from 0.25.1 changelogs Also remove "hi" changelog completely, as it was not really translated --- fastlane/metadata/android/cs/changelogs/993.txt | 1 - fastlane/metadata/android/en-US/changelogs/993.txt | 1 - fastlane/metadata/android/es/changelogs/993.txt | 1 - fastlane/metadata/android/hi/changelogs/993.txt | 13 ------------- fastlane/metadata/android/it/changelogs/993.txt | 1 - fastlane/metadata/android/pa/changelogs/993.txt | 1 - fastlane/metadata/android/pl/changelogs/993.txt | 1 - fastlane/metadata/android/pt-PT/changelogs/993.txt | 1 - fastlane/metadata/android/pt/changelogs/993.txt | 1 - fastlane/metadata/android/ru/changelogs/993.txt | 1 - fastlane/metadata/android/uk/changelogs/993.txt | 1 - .../metadata/android/zh-Hant/changelogs/993.txt | 1 - .../metadata/android/zh_Hant_HK/changelogs/993.txt | 1 - 13 files changed, 25 deletions(-) delete mode 100644 fastlane/metadata/android/hi/changelogs/993.txt diff --git a/fastlane/metadata/android/cs/changelogs/993.txt b/fastlane/metadata/android/cs/changelogs/993.txt index 3df0fe64b4a..2d57d44a130 100644 --- a/fastlane/metadata/android/cs/changelogs/993.txt +++ b/fastlane/metadata/android/cs/changelogs/993.txt @@ -10,4 +10,3 @@ Vylepšeno Opraveno • Oprava otevírání URL prohlížeče, stahování a externích přehrávačů v Android 11+ • Oprava interakce s celou obrazovkou v MIUI -• Úpravy nastavení ExoPlayer pro opravu přehrávání na některých zařízeních diff --git a/fastlane/metadata/android/en-US/changelogs/993.txt b/fastlane/metadata/android/en-US/changelogs/993.txt index 5d45efd13c1..722bc50cffb 100644 --- a/fastlane/metadata/android/en-US/changelogs/993.txt +++ b/fastlane/metadata/android/en-US/changelogs/993.txt @@ -10,4 +10,3 @@ Improved Fixed • Fix opening browser URLs, downloads and external players on Android 11+ • Fix interacting with fullscreen requiring two taps on MIUI -• Allow tweaking ExoPlayer settings to fix playback on some devices \ No newline at end of file diff --git a/fastlane/metadata/android/es/changelogs/993.txt b/fastlane/metadata/android/es/changelogs/993.txt index 66c147a4289..f951484e00b 100644 --- a/fastlane/metadata/android/es/changelogs/993.txt +++ b/fastlane/metadata/android/es/changelogs/993.txt @@ -10,4 +10,3 @@ Mejorado Solucionado • Abrir URL del navegador, descargas y reproductores externos en Android 11+ • Interación en pantalla completa, requería dos toques en MIUI -• Cambiar la configuración de ExoPlayer para la reproducción en algunos dispositivos diff --git a/fastlane/metadata/android/hi/changelogs/993.txt b/fastlane/metadata/android/hi/changelogs/993.txt deleted file mode 100644 index e3aa57e5ff4..00000000000 --- a/fastlane/metadata/android/hi/changelogs/993.txt +++ /dev/null @@ -1,13 +0,0 @@ -New -• Add warning when adding playlist duplicates and add button to remove them -• Allow ignoring hardware buttons -• Allow hiding partially watched videos in feed - -Improved -• Use more grid columns on big screens -• Make progress indicators consistent with settings - -Fixed -• Fix opening browser URLs, downloads and external players on Android 11+ -• Fix interacting with fullscreen requiring two taps on MIUI -• Allow tweaking ExoPlayer settings to fix playback on some devices diff --git a/fastlane/metadata/android/it/changelogs/993.txt b/fastlane/metadata/android/it/changelogs/993.txt index b7098fd2405..ecaf530d21b 100644 --- a/fastlane/metadata/android/it/changelogs/993.txt +++ b/fastlane/metadata/android/it/changelogs/993.txt @@ -10,4 +10,3 @@ Migliorato Corretto • Fix apertura URL, download e player esterni su Android 11+ • Fix interazione con schermo intero che richiedeva due otcchi su MIUI -• Regola le impostazioni di ExoPlayer per correggere la riproduzione su alcuni dispositivi diff --git a/fastlane/metadata/android/pa/changelogs/993.txt b/fastlane/metadata/android/pa/changelogs/993.txt index 6fad07e20ff..e8395072464 100644 --- a/fastlane/metadata/android/pa/changelogs/993.txt +++ b/fastlane/metadata/android/pa/changelogs/993.txt @@ -10,4 +10,3 @@ ਠੀਕ ਕੀਤੇ • Android 11 'ਤੇ ਖੋਲ੍ਹਣ ਵਾਲੇ ਬ੍ਰਾਊਜ਼ਰ URL, ਡਾਊਨਲੋਡ ਅਤੇ ਬਾਹਰੀ ਪਲੇਅਰ ਨੂੰ ਠੀਕ ਕਰੋ • MIUI 'ਤੇ ਦੋ ਟੈਪਾਂ ਦੀ ਲੋੜ ਵਾਲੀ ਪੂਰੀ ਸਕ੍ਰੀਨ ਨਾਲ ਇੰਟਰੈਕਟਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ -• ਕੁਝ ਡਿਵਾਈਸਾਂ 'ਤੇ ਪਲੇਬੈਕ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ExoPlayer ਸੈਟਿੰਗਾਂ ਨੂੰ ਟਵੀਕ ਕਰਨ ਦਿਓ diff --git a/fastlane/metadata/android/pl/changelogs/993.txt b/fastlane/metadata/android/pl/changelogs/993.txt index 38cd01325b2..a24d4077eaa 100644 --- a/fastlane/metadata/android/pl/changelogs/993.txt +++ b/fastlane/metadata/android/pl/changelogs/993.txt @@ -10,4 +10,3 @@ Ulepszone Naprawione • Otwier. URL-i przeglądarki, pobranych i zew. odtwarzaczy na Androidzie 11+ • Interakcja z trybem pełnoekr. wymagającym dwóch naciśnięć na MIUI -• Dostosow. ustawień ExoPlayera, aby naprawić odtwarzanie na niektórych urządz. diff --git a/fastlane/metadata/android/pt-PT/changelogs/993.txt b/fastlane/metadata/android/pt-PT/changelogs/993.txt index 7f06f808180..80c7b25f58b 100644 --- a/fastlane/metadata/android/pt-PT/changelogs/993.txt +++ b/fastlane/metadata/android/pt-PT/changelogs/993.txt @@ -10,4 +10,3 @@ Melhorado Fixa - Corrigir URLs de abertura do navegador, downloads e leitores externos no Android 11+ - Fixação interagindo com tela cheia requer duas torneiras no MIUI -- Permitir ajustes no ExoPlayer para fixar a reprodução em alguns dispositivos diff --git a/fastlane/metadata/android/pt/changelogs/993.txt b/fastlane/metadata/android/pt/changelogs/993.txt index 7f06f808180..80c7b25f58b 100644 --- a/fastlane/metadata/android/pt/changelogs/993.txt +++ b/fastlane/metadata/android/pt/changelogs/993.txt @@ -10,4 +10,3 @@ Melhorado Fixa - Corrigir URLs de abertura do navegador, downloads e leitores externos no Android 11+ - Fixação interagindo com tela cheia requer duas torneiras no MIUI -- Permitir ajustes no ExoPlayer para fixar a reprodução em alguns dispositivos diff --git a/fastlane/metadata/android/ru/changelogs/993.txt b/fastlane/metadata/android/ru/changelogs/993.txt index ea26a1aff3c..dc0f2f63862 100644 --- a/fastlane/metadata/android/ru/changelogs/993.txt +++ b/fastlane/metadata/android/ru/changelogs/993.txt @@ -10,4 +10,3 @@ Исправления • Исправлено открытие URL-адресов браузера, загрузок и внешних проигрывателей на Android 11+ • Исправлено взаимодействие с полноэкранным режимом, требующее двух нажатий в MIUI -• Разрешить изменять настройки ExoPlayer, чтобы исправить воспроизведение на некоторых устройствах diff --git a/fastlane/metadata/android/uk/changelogs/993.txt b/fastlane/metadata/android/uk/changelogs/993.txt index 1ce103bca7e..7b540cda236 100644 --- a/fastlane/metadata/android/uk/changelogs/993.txt +++ b/fastlane/metadata/android/uk/changelogs/993.txt @@ -10,4 +10,3 @@ Виправлено • Відкриття URL-адрес браузера, завантажень і зовнішніх програвачів на Android 11+ • Роботу повноекранного режиму, який вимагав двох дотиків у MIUI -• Дозвіл змінювати налаштування ExoPlayer, щоб виправити відтворення на деяких пристроях diff --git a/fastlane/metadata/android/zh-Hant/changelogs/993.txt b/fastlane/metadata/android/zh-Hant/changelogs/993.txt index edb1f70fe72..0a095cff931 100644 --- a/fastlane/metadata/android/zh-Hant/changelogs/993.txt +++ b/fastlane/metadata/android/zh-Hant/changelogs/993.txt @@ -10,4 +10,3 @@ 修正 • 修正 Android 11+ 上開啟瀏覽器 URL、下載與外部播放器 • 修正 MIUI 上全螢幕操作需要輕觸兩下 -• 允許微調 ExoPlayer 設定以修正部分裝置上的播放問題 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/993.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/993.txt index 754da7342ab..76e24fb31fc 100644 --- a/fastlane/metadata/android/zh_Hant_HK/changelogs/993.txt +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/993.txt @@ -10,4 +10,3 @@ 執漏 • 修正 Android 11+ 開啟瀏覽器 URL、下載同外面播放器 • 修正 MIUI 全螢幕時要撳兩下至搞得掂 -• 有得調校 ExoPlayer 設定解決某啲機播唔到片嘅問題 From 3c74cb3439bd64f7ac92add78e0492e04afaa334 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Fri, 20 Jan 2023 16:35:47 +0100 Subject: [PATCH 133/645] Created a setting to switch the sides of volume and brightness --- .../gesture/MainPlayerGestureListener.kt | 13 +++++++++--- .../settings/VideoAudioSettingsFragment.java | 20 +++++++++++++++++++ app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/video_audio_settings.xml | 8 ++++++++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index a6dba0dd597..75a27896d17 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -9,6 +9,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources import androidx.core.math.MathUtils import androidx.core.view.isVisible +import androidx.preference.PreferenceManager import org.schabi.newpipe.MainActivity import org.schabi.newpipe.R import org.schabi.newpipe.ktx.AnimationType @@ -193,10 +194,16 @@ class MainPlayerGestureListener( isMoving = true // -- Brightness and Volume control -- - val isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) - val isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) + var isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) + var isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) + var displaySide = DisplayPortion.LEFT_HALF + val sidesSwitched = PreferenceManager.getDefaultSharedPreferences(player.context) + .getBoolean(R.string.switch_gesture_sides_key.toString(), false) + if (sidesSwitched) { + displaySide = DisplayPortion.RIGHT_HALF + } if (isBrightnessGestureEnabled && isVolumeGestureEnabled) { - if (getDisplayHalfPortion(initialEvent) === DisplayPortion.LEFT_HALF) { + if (getDisplayHalfPortion(initialEvent) === displaySide) { onScrollBrightness(distanceY) } else /* DisplayPortion.RIGHT_HALF */ { onScrollVolume(distanceY) diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java index aae9cfca556..4936f979b24 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -6,8 +6,11 @@ import android.os.Bundle; import android.provider.Settings; import android.text.format.DateUtils; +import android.view.View; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.preference.ListPreference; import com.google.android.material.snackbar.Snackbar; @@ -21,6 +24,17 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { private SharedPreferences.OnSharedPreferenceChangeListener listener; + @Override + public void onViewCreated(@NonNull final View rootView, + @Nullable final Bundle savedInstanceState) { + super.onViewCreated(rootView, savedInstanceState); + findPreference(getString(R.string.switch_gesture_sides_key)) + .setEnabled(getPreferenceManager().getSharedPreferences() + .getBoolean(getString(R.string.volume_gesture_control_key), true) + && getPreferenceManager().getSharedPreferences() + .getBoolean(getString(R.string.brightness_gesture_control_key), true)); + } + @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { addPreferencesFromResourceRegistry(); @@ -29,6 +43,12 @@ public void onCreatePreferences(final Bundle savedInstanceState, final String ro listener = (sharedPreferences, key) -> { + findPreference(getString(R.string.switch_gesture_sides_key)) + .setEnabled(sharedPreferences.getBoolean( + getString(R.string.volume_gesture_control_key), true) + && sharedPreferences.getBoolean( + getString(R.string.brightness_gesture_control_key), true)); + // on M and above, if user chooses to minimise to popup player on exit // and the app doesn't have display over other apps permission, // show a snackbar to let the user give permission diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 6a1d5cd459c..dae8cc113f8 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -18,6 +18,7 @@ volume_gesture_control brightness_gesture_control + switch_gesture_sides resume_on_audio_focus_gain popup_remember_size_pos_key use_inexact_seek_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dd8b8a58d62..67acdcf0c89 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -105,6 +105,8 @@ Use gestures to control player volume Brightness gesture control Use gestures to control player brightness + Switch gesture sides + Switches the sides of the volume and brightness gesture controls Search suggestions Choose the suggestions to show when searching Local search suggestions diff --git a/app/src/main/res/xml/video_audio_settings.xml b/app/src/main/res/xml/video_audio_settings.xml index 117ee870370..da932bb3882 100644 --- a/app/src/main/res/xml/video_audio_settings.xml +++ b/app/src/main/res/xml/video_audio_settings.xml @@ -190,6 +190,14 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> + + Date: Fri, 20 Jan 2023 22:48:10 +0100 Subject: [PATCH 134/645] Update app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt Co-authored-by: Stypox --- .../newpipe/player/gesture/MainPlayerGestureListener.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index 75a27896d17..d6dc37e9522 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -196,12 +196,9 @@ class MainPlayerGestureListener( // -- Brightness and Volume control -- var isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) var isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) - var displaySide = DisplayPortion.LEFT_HALF - val sidesSwitched = PreferenceManager.getDefaultSharedPreferences(player.context) - .getBoolean(R.string.switch_gesture_sides_key.toString(), false) - if (sidesSwitched) { - displaySide = DisplayPortion.RIGHT_HALF - } + val brightnessSide = if (PreferenceManager.getDefaultSharedPreferences(player.context) + .getBoolean(R.string.switch_gesture_sides_key.toString(), false)) DisplayPortion.RIGHT_HALF + else DisplayPortion.LEFT_HALF if (isBrightnessGestureEnabled && isVolumeGestureEnabled) { if (getDisplayHalfPortion(initialEvent) === displaySide) { onScrollBrightness(distanceY) From c8d54ec6c77d172bf51dc5d6988aee953375bc6e Mon Sep 17 00:00:00 2001 From: ge78fug Date: Fri, 20 Jan 2023 23:10:55 +0100 Subject: [PATCH 135/645] Changed to val --- .../newpipe/player/gesture/MainPlayerGestureListener.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index d6dc37e9522..3c40f714eb3 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -194,13 +194,13 @@ class MainPlayerGestureListener( isMoving = true // -- Brightness and Volume control -- - var isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) - var isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) + val isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) + val isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) val brightnessSide = if (PreferenceManager.getDefaultSharedPreferences(player.context) .getBoolean(R.string.switch_gesture_sides_key.toString(), false)) DisplayPortion.RIGHT_HALF else DisplayPortion.LEFT_HALF if (isBrightnessGestureEnabled && isVolumeGestureEnabled) { - if (getDisplayHalfPortion(initialEvent) === displaySide) { + if (getDisplayHalfPortion(initialEvent) === brightnessSide) { onScrollBrightness(distanceY) } else /* DisplayPortion.RIGHT_HALF */ { onScrollVolume(distanceY) From 2ba649949fbb6968706dfa5e3058ad7a4fbfcf7e Mon Sep 17 00:00:00 2001 From: ge78fug Date: Sat, 21 Jan 2023 17:11:45 +0100 Subject: [PATCH 136/645] Updated the gesture-switch-toggle --- .../gesture/MainPlayerGestureListener.kt | 5 ++- .../settings/VideoAudioSettingsFragment.java | 40 +++++++++---------- app/src/main/res/values/strings.xml | 1 + 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index 3c40f714eb3..960edbce2d8 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -197,8 +197,9 @@ class MainPlayerGestureListener( val isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) val isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) val brightnessSide = if (PreferenceManager.getDefaultSharedPreferences(player.context) - .getBoolean(R.string.switch_gesture_sides_key.toString(), false)) DisplayPortion.RIGHT_HALF - else DisplayPortion.LEFT_HALF + .getBoolean(R.string.switch_gesture_sides_key.toString(), false) + ) DisplayPortion.RIGHT_HALF + else DisplayPortion.LEFT_HALF if (isBrightnessGestureEnabled && isVolumeGestureEnabled) { if (getDisplayHalfPortion(initialEvent) === brightnessSide) { onScrollBrightness(distanceY) diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java index 4936f979b24..e1a8dd90b97 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -6,12 +6,10 @@ import android.os.Bundle; import android.provider.Settings; import android.text.format.DateUtils; -import android.view.View; import android.widget.Toast; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.preference.ListPreference; +import androidx.preference.SwitchPreferenceCompat; import com.google.android.material.snackbar.Snackbar; @@ -24,31 +22,15 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { private SharedPreferences.OnSharedPreferenceChangeListener listener; - @Override - public void onViewCreated(@NonNull final View rootView, - @Nullable final Bundle savedInstanceState) { - super.onViewCreated(rootView, savedInstanceState); - findPreference(getString(R.string.switch_gesture_sides_key)) - .setEnabled(getPreferenceManager().getSharedPreferences() - .getBoolean(getString(R.string.volume_gesture_control_key), true) - && getPreferenceManager().getSharedPreferences() - .getBoolean(getString(R.string.brightness_gesture_control_key), true)); - } - @Override public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { addPreferencesFromResourceRegistry(); updateSeekOptions(); + updateGestureSwitch(); listener = (sharedPreferences, key) -> { - findPreference(getString(R.string.switch_gesture_sides_key)) - .setEnabled(sharedPreferences.getBoolean( - getString(R.string.volume_gesture_control_key), true) - && sharedPreferences.getBoolean( - getString(R.string.brightness_gesture_control_key), true)); - // on M and above, if user chooses to minimise to popup player on exit // and the app doesn't have display over other apps permission, // show a snackbar to let the user give permission @@ -68,6 +50,9 @@ && getString(R.string.minimize_on_exit_key).equals(key)) { } } else if (getString(R.string.use_inexact_seek_key).equals(key)) { updateSeekOptions(); + } else if (getString(R.string.volume_gesture_control_key).equals(key) + || getString(R.string.brightness_gesture_control_key).equals(key)) { + updateGestureSwitch(); } }; } @@ -137,4 +122,19 @@ public void onPause() { getPreferenceManager().getSharedPreferences() .unregisterOnSharedPreferenceChangeListener(listener); } + + private void updateGestureSwitch() { + final SwitchPreferenceCompat gestureSwitch = (SwitchPreferenceCompat) + findPreference(getString(R.string.switch_gesture_sides_key)); + if (getPreferenceManager().getSharedPreferences() + .getBoolean(getString(R.string.volume_gesture_control_key), true) + && getPreferenceManager().getSharedPreferences() + .getBoolean(getString(R.string.brightness_gesture_control_key), true)) { + gestureSwitch.setEnabled(true); + gestureSwitch.setSummary(getString(R.string.switch_gesture_sides_summary)); + } else { + gestureSwitch.setEnabled(false); + gestureSwitch.setSummary(getString(R.string.switch_gesture_sides_summary_disabled)); + } + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 67acdcf0c89..e1c5bc0bb98 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -107,6 +107,7 @@ Use gestures to control player brightness Switch gesture sides Switches the sides of the volume and brightness gesture controls + Enable both brightness and volume gestures to use this feature Search suggestions Choose the suggestions to show when searching Local search suggestions From 759a9080a8af28b52f56eda187faca5bb69c15fd Mon Sep 17 00:00:00 2001 From: ge78fug Date: Mon, 23 Jan 2023 21:25:05 +0100 Subject: [PATCH 137/645] Fixed a bug --- .../newpipe/player/gesture/MainPlayerGestureListener.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index 960edbce2d8..74542af7023 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -197,11 +197,12 @@ class MainPlayerGestureListener( val isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) val isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) val brightnessSide = if (PreferenceManager.getDefaultSharedPreferences(player.context) - .getBoolean(R.string.switch_gesture_sides_key.toString(), false) - ) DisplayPortion.RIGHT_HALF + .getBoolean( + player.context.getString(R.string.switch_gesture_sides_key), false)) + DisplayPortion.RIGHT_HALF else DisplayPortion.LEFT_HALF if (isBrightnessGestureEnabled && isVolumeGestureEnabled) { - if (getDisplayHalfPortion(initialEvent) === brightnessSide) { + if (getDisplayHalfPortion(initialEvent) == brightnessSide) { onScrollBrightness(distanceY) } else /* DisplayPortion.RIGHT_HALF */ { onScrollVolume(distanceY) From 2ded8c7cc18b7414d244e0e559acd3a1e9d7259f Mon Sep 17 00:00:00 2001 From: ge78fug Date: Sun, 29 Jan 2023 19:23:39 +0100 Subject: [PATCH 138/645] Made two list options --- .../fragments/detail/VideoDetailFragment.java | 5 ++- .../gesture/MainPlayerGestureListener.kt | 33 +++++++++-------- .../newpipe/player/helper/PlayerHelper.java | 10 +++--- .../settings/VideoAudioSettingsFragment.java | 20 ----------- app/src/main/res/values/settings_keys.xml | 35 +++++++++++++++++-- app/src/main/res/values/strings.xml | 14 ++++---- app/src/main/res/xml/video_audio_settings.xml | 32 ++++++++--------- 7 files changed, 79 insertions(+), 70 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 3d59ac6febf..885034e5af9 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 @@ -2013,7 +2013,10 @@ private void setupBrightness() { restoreDefaultBrightness(); } else { // Do not restore if user has disabled brightness gesture - if (!PlayerHelper.isBrightnessGestureEnabled(activity)) { + if (!(PlayerHelper.getRightSideGesture(activity) + .equals(getString(R.string.right_brightness_control_key)) + && PlayerHelper.getLeftSideGesture(activity) + .equals(getString(R.string.left_brightness_control_key)))) { return; } // Restore already saved brightness level diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index 74542af7023..82cf2244c79 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -9,7 +9,6 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources import androidx.core.math.MathUtils import androidx.core.view.isVisible -import androidx.preference.PreferenceManager import org.schabi.newpipe.MainActivity import org.schabi.newpipe.R import org.schabi.newpipe.ktx.AnimationType @@ -194,23 +193,23 @@ class MainPlayerGestureListener( isMoving = true // -- Brightness and Volume control -- - val isBrightnessGestureEnabled = PlayerHelper.isBrightnessGestureEnabled(player.context) - val isVolumeGestureEnabled = PlayerHelper.isVolumeGestureEnabled(player.context) - val brightnessSide = if (PreferenceManager.getDefaultSharedPreferences(player.context) - .getBoolean( - player.context.getString(R.string.switch_gesture_sides_key), false)) - DisplayPortion.RIGHT_HALF - else DisplayPortion.LEFT_HALF - if (isBrightnessGestureEnabled && isVolumeGestureEnabled) { - if (getDisplayHalfPortion(initialEvent) == brightnessSide) { - onScrollBrightness(distanceY) - } else /* DisplayPortion.RIGHT_HALF */ { - onScrollVolume(distanceY) + val rightSide = PlayerHelper.getRightSideGesture(player.context) + val leftSide = PlayerHelper.getLeftSideGesture(player.context) + + if (getDisplayHalfPortion(initialEvent) == DisplayPortion.RIGHT_HALF) { + when (rightSide) { + player.context.getString(R.string.right_volume_control_key) -> + onScrollVolume(distanceY) + player.context.getString(R.string.right_brightness_control_key) -> + onScrollBrightness(distanceY) + } + } else { + when (leftSide) { + player.context.getString(R.string.left_volume_control_key) -> + onScrollVolume(distanceY) + player.context.getString(R.string.left_brightness_control_key) -> + onScrollBrightness(distanceY) } - } else if (isBrightnessGestureEnabled) { - onScrollBrightness(distanceY) - } else if (isVolumeGestureEnabled) { - onScrollVolume(distanceY) } return true diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index 1bc6f41a1cd..74bcf047ced 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -228,14 +228,16 @@ public static boolean isResumeAfterAudioFocusGain(@NonNull final Context context .getBoolean(context.getString(R.string.resume_on_audio_focus_gain_key), false); } - public static boolean isVolumeGestureEnabled(@NonNull final Context context) { + public static String getRightSideGesture(@NonNull final Context context) { return getPreferences(context) - .getBoolean(context.getString(R.string.volume_gesture_control_key), true); + .getString(context.getString(R.string.right_gesture_control_key), + context.getString(R.string.default_right_gesture_control_value)); } - public static boolean isBrightnessGestureEnabled(@NonNull final Context context) { + public static String getLeftSideGesture(@NonNull final Context context) { return getPreferences(context) - .getBoolean(context.getString(R.string.brightness_gesture_control_key), true); + .getString(context.getString(R.string.left_gesture_control_key), + context.getString(R.string.default_left_gesture_control_value)); } public static boolean isStartMainPlayerFullscreenEnabled(@NonNull final Context context) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java index e1a8dd90b97..aae9cfca556 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -9,7 +9,6 @@ import android.widget.Toast; import androidx.preference.ListPreference; -import androidx.preference.SwitchPreferenceCompat; import com.google.android.material.snackbar.Snackbar; @@ -27,7 +26,6 @@ public void onCreatePreferences(final Bundle savedInstanceState, final String ro addPreferencesFromResourceRegistry(); updateSeekOptions(); - updateGestureSwitch(); listener = (sharedPreferences, key) -> { @@ -50,9 +48,6 @@ && getString(R.string.minimize_on_exit_key).equals(key)) { } } else if (getString(R.string.use_inexact_seek_key).equals(key)) { updateSeekOptions(); - } else if (getString(R.string.volume_gesture_control_key).equals(key) - || getString(R.string.brightness_gesture_control_key).equals(key)) { - updateGestureSwitch(); } }; } @@ -122,19 +117,4 @@ public void onPause() { getPreferenceManager().getSharedPreferences() .unregisterOnSharedPreferenceChangeListener(listener); } - - private void updateGestureSwitch() { - final SwitchPreferenceCompat gestureSwitch = (SwitchPreferenceCompat) - findPreference(getString(R.string.switch_gesture_sides_key)); - if (getPreferenceManager().getSharedPreferences() - .getBoolean(getString(R.string.volume_gesture_control_key), true) - && getPreferenceManager().getSharedPreferences() - .getBoolean(getString(R.string.brightness_gesture_control_key), true)) { - gestureSwitch.setEnabled(true); - gestureSwitch.setSummary(getString(R.string.switch_gesture_sides_summary)); - } else { - gestureSwitch.setEnabled(false); - gestureSwitch.setSummary(getString(R.string.switch_gesture_sides_summary_disabled)); - } - } } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index dae8cc113f8..ad6b1777bf8 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -16,9 +16,6 @@ use_external_video_player use_external_audio_player - volume_gesture_control - brightness_gesture_control - switch_gesture_sides resume_on_audio_focus_gain popup_remember_size_pos_key use_inexact_seek_key @@ -193,6 +190,38 @@ @string/audio_webm_key + left_gesture_control + @string/left_brightness_control_key + left_brightness_control + left_volume_control + left_none_control + + @string/brightness + @string/volume + @string/none + + + @string/left_brightness_control_key + @string/left_volume_control_key + @string/left_none_control_key + + + right_gesture_control + @string/right_volume_control_key + right_brightness_control + right_volume_control + right_none_control + + @string/volume + @string/brightness + @string/none + + + @string/right_volume_control_key + @string/right_brightness_control_key + @string/right_none_control_key + + last_resize_mode diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e1c5bc0bb98..6890e4dd097 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -101,13 +101,13 @@ Auto-enqueue next stream Continue ending (non-repeating) playback queue by appending a related stream Auto-enqueuing - Volume gesture control - Use gestures to control player volume - Brightness gesture control - Use gestures to control player brightness - Switch gesture sides - Switches the sides of the volume and brightness gesture controls - Enable both brightness and volume gestures to use this feature + Change the left gesture control + Left gesture control + Change the right gesture control + Right gesture control + Brightness + Volume + None Search suggestions Choose the suggestions to show when searching Local search suggestions diff --git a/app/src/main/res/xml/video_audio_settings.xml b/app/src/main/res/xml/video_audio_settings.xml index da932bb3882..e4485f1541b 100644 --- a/app/src/main/res/xml/video_audio_settings.xml +++ b/app/src/main/res/xml/video_audio_settings.xml @@ -174,27 +174,23 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - - - - From 72ca52a29b403961c43ac3e53491b3c1641af159 Mon Sep 17 00:00:00 2001 From: Marius Wagner Date: Tue, 7 Feb 2023 17:10:18 +0000 Subject: [PATCH 139/645] Made the requested changes --- .../fragments/detail/VideoDetailFragment.java | 8 +++--- .../gesture/MainPlayerGestureListener.kt | 8 +++--- app/src/main/res/values/settings_keys.xml | 25 ++++++++----------- 3 files changed, 19 insertions(+), 22 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 885034e5af9..e63e549a229 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 @@ -2013,10 +2013,10 @@ private void setupBrightness() { restoreDefaultBrightness(); } else { // Do not restore if user has disabled brightness gesture - if (!(PlayerHelper.getRightSideGesture(activity) - .equals(getString(R.string.right_brightness_control_key)) - && PlayerHelper.getLeftSideGesture(activity) - .equals(getString(R.string.left_brightness_control_key)))) { + if (PlayerHelper.getRightSideGesture(activity) + .equals(getString(R.string.brightness_control_key)) + || PlayerHelper.getLeftSideGesture(activity) + .equals(getString(R.string.brightness_control_key))) { return; } // Restore already saved brightness level diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index 82cf2244c79..ce78fcfe220 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -198,16 +198,16 @@ class MainPlayerGestureListener( if (getDisplayHalfPortion(initialEvent) == DisplayPortion.RIGHT_HALF) { when (rightSide) { - player.context.getString(R.string.right_volume_control_key) -> + player.context.getString(R.string.volume_control_key) -> onScrollVolume(distanceY) - player.context.getString(R.string.right_brightness_control_key) -> + player.context.getString(R.string.brightness_control_key) -> onScrollBrightness(distanceY) } } else { when (leftSide) { - player.context.getString(R.string.left_volume_control_key) -> + player.context.getString(R.string.volume_control_key) -> onScrollVolume(distanceY) - player.context.getString(R.string.left_brightness_control_key) -> + player.context.getString(R.string.brightness_control_key) -> onScrollBrightness(distanceY) } } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index ad6b1777bf8..8f3e8e192d7 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -191,35 +191,32 @@ left_gesture_control - @string/left_brightness_control_key - left_brightness_control - left_volume_control - left_none_control + @string/brightness_control_key + brightness_control + volume_control + none_control @string/brightness @string/volume @string/none - @string/left_brightness_control_key - @string/left_volume_control_key - @string/left_none_control_key + @string/brightness_control_key + @string/volume_control_key + @string/none_control_key right_gesture_control - @string/right_volume_control_key - right_brightness_control - right_volume_control - right_none_control + @string/volume_control_key @string/volume @string/brightness @string/none - @string/right_volume_control_key - @string/right_brightness_control_key - @string/right_none_control_key + @string/volume_control_key + @string/brightness_control_key + @string/none_control_key last_resize_mode From 32cec6c9a74efd65b58ebf504c646bb61a222961 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Tue, 7 Feb 2023 19:08:47 +0100 Subject: [PATCH 140/645] Changed the naming --- .../newpipe/fragments/detail/VideoDetailFragment.java | 4 ++-- .../newpipe/player/gesture/MainPlayerGestureListener.kt | 7 ++----- .../org/schabi/newpipe/player/helper/PlayerHelper.java | 4 ++-- 3 files changed, 6 insertions(+), 9 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 e63e549a229..7654e7689c6 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 @@ -2013,9 +2013,9 @@ private void setupBrightness() { restoreDefaultBrightness(); } else { // Do not restore if user has disabled brightness gesture - if (PlayerHelper.getRightSideGesture(activity) + if (PlayerHelper.getActionForRightGestureSide(activity) .equals(getString(R.string.brightness_control_key)) - || PlayerHelper.getLeftSideGesture(activity) + || PlayerHelper.getActionForLeftGestureSide(activity) .equals(getString(R.string.brightness_control_key))) { return; } diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index ce78fcfe220..0d28f2f585b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -193,18 +193,15 @@ class MainPlayerGestureListener( isMoving = true // -- Brightness and Volume control -- - val rightSide = PlayerHelper.getRightSideGesture(player.context) - val leftSide = PlayerHelper.getLeftSideGesture(player.context) - if (getDisplayHalfPortion(initialEvent) == DisplayPortion.RIGHT_HALF) { - when (rightSide) { + when (PlayerHelper.getActionForRightGestureSide(player.context)) { player.context.getString(R.string.volume_control_key) -> onScrollVolume(distanceY) player.context.getString(R.string.brightness_control_key) -> onScrollBrightness(distanceY) } } else { - when (leftSide) { + when (PlayerHelper.getActionForLeftGestureSide(player.context)) { player.context.getString(R.string.volume_control_key) -> onScrollVolume(distanceY) player.context.getString(R.string.brightness_control_key) -> diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index 74bcf047ced..a110a80d676 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -228,13 +228,13 @@ public static boolean isResumeAfterAudioFocusGain(@NonNull final Context context .getBoolean(context.getString(R.string.resume_on_audio_focus_gain_key), false); } - public static String getRightSideGesture(@NonNull final Context context) { + public static String getActionForRightGestureSide(@NonNull final Context context) { return getPreferences(context) .getString(context.getString(R.string.right_gesture_control_key), context.getString(R.string.default_right_gesture_control_value)); } - public static String getLeftSideGesture(@NonNull final Context context) { + public static String getActionForLeftGestureSide(@NonNull final Context context) { return getPreferences(context) .getString(context.getString(R.string.left_gesture_control_key), context.getString(R.string.default_left_gesture_control_value)); From 65d8589e7a40c1d2d5fdbf66a4096e4de7030c15 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Fri, 10 Feb 2023 08:41:54 +0100 Subject: [PATCH 141/645] Changed the naming --- app/src/main/res/values/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6890e4dd097..43705056bc6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -101,10 +101,10 @@ Auto-enqueue next stream Continue ending (non-repeating) playback queue by appending a related stream Auto-enqueuing - Change the left gesture control - Left gesture control - Change the right gesture control - Right gesture control + Choose gesture for left half of player screen + Left gesture action + Choose gesture for right half of player screen + Right gesture action Brightness Volume None From 7689d1d15cb26ef31193aef4cf0b02f59db13374 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Wed, 1 Mar 2023 23:22:30 +0100 Subject: [PATCH 142/645] Added the migration --- .../newpipe/settings/SettingMigrations.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java index b1e2c04ebf3..21c0e1be4dc 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -108,6 +108,39 @@ protected void migrate(final Context context) { } }; + public static final Migration MIGRATION_4_5 = new Migration(4, 5) { + @Override + protected void migrate(final Context context) { + boolean brightnessGestureSwitch = sp.getBoolean( + context.getString(R.string.left_gesture_control_key), false); + boolean volumeGestureSwitch = sp.getBoolean( + context.getString(R.string.right_gesture_control_key), false); + + SharedPreferences.Editor editor = sp.edit(); + + if (volumeGestureSwitch) { + if (!brightnessGestureSwitch) { + editor.putString(context.getString(R.string.left_gesture_control_key), + context.getString(R.string.brightness)); + } + editor.putString(context.getString(R.string.right_gesture_control_key), + context.getString(R.string.volume)); + } else if (brightnessGestureSwitch) { + editor.putString(context.getString(R.string.right_gesture_control_key), + context.getString(R.string.brightness)); + editor.putString(context.getString(R.string.left_gesture_control_key), + context.getString(R.string.volume)); + } else { + editor.putString(context.getString(R.string.left_gesture_control_key), + context.getString(R.string.none)); + editor.putString(context.getString(R.string.right_gesture_control_key), + context.getString(R.string.none)); + } + + editor.apply(); + } + }; + /** * List of all implemented migrations. *

@@ -119,12 +152,13 @@ protected void migrate(final Context context) { MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, + MIGRATION_4_5, }; /** * Version number for preferences. Must be incremented every time a migration is necessary. */ - public static final int VERSION = 4; + public static final int VERSION = 5; public static void initMigrations(final Context context, final boolean isFirstRun) { From 3c72992c395fc1053c821ed8069bfedf40449ad3 Mon Sep 17 00:00:00 2001 From: Marius Wagner Date: Sun, 26 Feb 2023 17:00:06 +0100 Subject: [PATCH 143/645] Update app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java Co-authored-by: Stypox --- .../schabi/newpipe/fragments/detail/VideoDetailFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 7654e7689c6..0950afc3e6a 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 @@ -2013,9 +2013,9 @@ private void setupBrightness() { restoreDefaultBrightness(); } else { // Do not restore if user has disabled brightness gesture - if (PlayerHelper.getActionForRightGestureSide(activity) + if (!PlayerHelper.getActionForRightGestureSide(activity) .equals(getString(R.string.brightness_control_key)) - || PlayerHelper.getActionForLeftGestureSide(activity) + && !PlayerHelper.getActionForLeftGestureSide(activity) .equals(getString(R.string.brightness_control_key))) { return; } From d2735607b84a5fbe442302ec9464161faed5daa1 Mon Sep 17 00:00:00 2001 From: ge78fug Date: Mon, 3 Apr 2023 23:11:40 +0200 Subject: [PATCH 144/645] Changed the default of the switches --- .../java/org/schabi/newpipe/settings/SettingMigrations.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java index 21c0e1be4dc..e2bb18b2d47 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -112,9 +112,9 @@ protected void migrate(final Context context) { @Override protected void migrate(final Context context) { boolean brightnessGestureSwitch = sp.getBoolean( - context.getString(R.string.left_gesture_control_key), false); + context.getString(R.string.left_gesture_control_key), true); boolean volumeGestureSwitch = sp.getBoolean( - context.getString(R.string.right_gesture_control_key), false); + context.getString(R.string.right_gesture_control_key), true); SharedPreferences.Editor editor = sp.edit(); From 704e9bd7b6e4d58d10b0cce349cd3f8a13e46b85 Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 4 Apr 2023 10:02:01 +0200 Subject: [PATCH 145/645] Fix checkstyle --- .../java/org/schabi/newpipe/settings/SettingMigrations.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java index e2bb18b2d47..818d587d58d 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -111,12 +111,12 @@ protected void migrate(final Context context) { public static final Migration MIGRATION_4_5 = new Migration(4, 5) { @Override protected void migrate(final Context context) { - boolean brightnessGestureSwitch = sp.getBoolean( + final boolean brightnessGestureSwitch = sp.getBoolean( context.getString(R.string.left_gesture_control_key), true); - boolean volumeGestureSwitch = sp.getBoolean( + final boolean volumeGestureSwitch = sp.getBoolean( context.getString(R.string.right_gesture_control_key), true); - SharedPreferences.Editor editor = sp.edit(); + final SharedPreferences.Editor editor = sp.edit(); if (volumeGestureSwitch) { if (!brightnessGestureSwitch) { From 7350b1f32ecd4d571d601036b46b84240658c1ab Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 4 Apr 2023 10:38:13 +0200 Subject: [PATCH 146/645] Add notice to README to not open feature PRs --- .github/CONTRIBUTING.md | 2 ++ README.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index d5fdc97e0a7..088707b6ee2 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,3 +1,5 @@ +### Please do **not** open pull requests for *new features* now, as we are planning to rewrite large chunks of the code. Only bugfix PRs will be accepted. More details will be announced soon! + NewPipe contribution guidelines =============================== diff --git a/README.md b/README.md index 52e6eef1a96..f184b536078 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +### Please do **not** open pull requests for *new features* now, as we are planning to rewrite large chunks of the code. Only bugfix PRs will be accepted. More details will be announced soon! +

NewPipe

A libre lightweight streaming front-end for Android.

From 4bb45c001de54d9734f7e3e1c7fbed75744b9c3e Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 4 Apr 2023 10:27:43 +0200 Subject: [PATCH 147/645] Fix settings migration --- .../newpipe/settings/SettingMigrations.java | 30 +++++-------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java index 818d587d58d..1bfaec6c287 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -111,31 +111,17 @@ protected void migrate(final Context context) { public static final Migration MIGRATION_4_5 = new Migration(4, 5) { @Override protected void migrate(final Context context) { - final boolean brightnessGestureSwitch = sp.getBoolean( - context.getString(R.string.left_gesture_control_key), true); - final boolean volumeGestureSwitch = sp.getBoolean( - context.getString(R.string.right_gesture_control_key), true); + final boolean brightness = sp.getBoolean("brightness_gesture_control", true); + final boolean volume = sp.getBoolean("volume_gesture_control", true); final SharedPreferences.Editor editor = sp.edit(); - if (volumeGestureSwitch) { - if (!brightnessGestureSwitch) { - editor.putString(context.getString(R.string.left_gesture_control_key), - context.getString(R.string.brightness)); - } - editor.putString(context.getString(R.string.right_gesture_control_key), - context.getString(R.string.volume)); - } else if (brightnessGestureSwitch) { - editor.putString(context.getString(R.string.right_gesture_control_key), - context.getString(R.string.brightness)); - editor.putString(context.getString(R.string.left_gesture_control_key), - context.getString(R.string.volume)); - } else { - editor.putString(context.getString(R.string.left_gesture_control_key), - context.getString(R.string.none)); - editor.putString(context.getString(R.string.right_gesture_control_key), - context.getString(R.string.none)); - } + editor.putString(context.getString(R.string.right_gesture_control_key), + context.getString(volume + ? R.string.volume_control_key : R.string.none_control_key)); + editor.putString(context.getString(R.string.left_gesture_control_key), + context.getString(brightness + ? R.string.brightness_control_key : R.string.none_control_key)); editor.apply(); } From c08538d25dbe9f4cf005558ef0aa5c2d20144fc4 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Tue, 4 Apr 2023 17:42:34 +0200 Subject: [PATCH 148/645] Remove jsoup files from APK Two jsoup files slipped into the META-INF dir of the APK for some reason. README.md and CHANGES are removed automatically now. --- app/build.gradle | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index a2617aa5810..6662b38460b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -96,6 +96,13 @@ android { buildFeatures { viewBinding true } + + packagingOptions { + // remove two files which belong to jsoup + // no idea how they ended up in the META-INF dir... + exclude 'META-INF/README.md' + exclude 'META-INF/CHANGES' + } } ext { @@ -313,6 +320,7 @@ static String getGitWorkingBranch() { } } +// fix reproducible builds project.afterEvaluate { tasks.compileReleaseArtProfile.doLast { outputs.files.each { file -> From 74bd28cbd9fff4e294b7ede63f09d946084ac804 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sun, 9 Apr 2023 18:45:57 +0530 Subject: [PATCH 149/645] Update AndroidX Core to 1.10.0. --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a2617aa5810..5e3e5cbcb3c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -205,7 +205,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'androidx.core:core-ktx:1.10.0' implementation 'androidx.documentfile:documentfile:1.0.1' implementation 'androidx.fragment:fragment-ktx:1.4.1' implementation "androidx.lifecycle:lifecycle-livedata-ktx:${androidxLifecycleVersion}" From a4a9957a155ddb2564b6381002a759acb7a1ce61 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Thu, 18 Aug 2022 18:35:22 +0200 Subject: [PATCH 150/645] Add ExoPlayerSettingsFragment and move playback load interval size setting into it This fragment has been added into SettingsResourceRegistry, to allow searches in its options. It has been placed at the place of the previous playback load interval size setting (so in Video and Audio settings). --- .../settings/ExoPlayerSettingsFragment.java | 14 ++++++++++++++ .../settings/SettingsResourceRegistry.java | 1 + app/src/main/res/values/settings_keys.xml | 2 ++ app/src/main/res/values/strings.xml | 4 ++++ app/src/main/res/xml/exoplayer_settings.xml | 16 ++++++++++++++++ app/src/main/res/xml/video_audio_settings.xml | 12 +++++------- 6 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/settings/ExoPlayerSettingsFragment.java create mode 100644 app/src/main/res/xml/exoplayer_settings.xml diff --git a/app/src/main/java/org/schabi/newpipe/settings/ExoPlayerSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ExoPlayerSettingsFragment.java new file mode 100644 index 00000000000..7e740f8698d --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/ExoPlayerSettingsFragment.java @@ -0,0 +1,14 @@ +package org.schabi.newpipe.settings; + +import android.os.Bundle; + +import androidx.annotation.Nullable; + +public class ExoPlayerSettingsFragment extends BasePreferenceFragment { + + @Override + public void onCreatePreferences(@Nullable final Bundle savedInstanceState, + @Nullable final String rootKey) { + addPreferencesFromResourceRegistry(); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java index 78ddb37866d..b3d0741bb44 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java @@ -40,6 +40,7 @@ private SettingsResourceRegistry() { add(PlayerNotificationSettingsFragment.class, R.xml.player_notification_settings); add(UpdateSettingsFragment.class, R.xml.update_settings); add(VideoAudioSettingsFragment.class, R.xml.video_audio_settings); + add(ExoPlayerSettingsFragment.class, R.xml.exoplayer_settings); } private SettingRegistryEntry add( diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 8f3e8e192d7..f00c25c8c6e 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -1366,4 +1366,6 @@ streams_notifications_channels player_notification_screen + + exoplayer_settings_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 43705056bc6..1dad7c01d56 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -773,4 +773,8 @@ Partially watched Upcoming Sort + ExoPlayer settings + Manage some ExoPlayer settings. These changes require a player restart to take effect + Use ExoPlayer\'s decoder fallback feature + Enable this option if you have decoder initialization issues, which falls back to lower-priority decoders if primary decoders initialization fail. This may result in poor playback performance than when using primary decoders \ No newline at end of file diff --git a/app/src/main/res/xml/exoplayer_settings.xml b/app/src/main/res/xml/exoplayer_settings.xml new file mode 100644 index 00000000000..fd563711509 --- /dev/null +++ b/app/src/main/res/xml/exoplayer_settings.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/video_audio_settings.xml b/app/src/main/res/xml/video_audio_settings.xml index e4485f1541b..75a925c65a7 100644 --- a/app/src/main/res/xml/video_audio_settings.xml +++ b/app/src/main/res/xml/video_audio_settings.xml @@ -61,13 +61,11 @@ app:iconSpaceReserved="false" app:useSimpleSummaryProvider="true" /> - From 41da8fc05faf744f7e9a57a1a6adf2225be6cfd4 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Thu, 18 Aug 2022 18:59:45 +0200 Subject: [PATCH 151/645] Add ability to use ExoPlayer's decoder fallback option This option could help to avoid decoder initialization issues, which falls back to lower-priority decoders if decoder initialization fails. This may result in poor playback performance than when using primary decoders. It is disabled by default, but can be enabled in ExoPlayer settings. --- app/src/main/java/org/schabi/newpipe/player/Player.java | 4 +++- app/src/main/res/values/settings_keys.xml | 2 ++ app/src/main/res/xml/exoplayer_settings.xml | 8 ++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 4243c233bc9..cc75a2c22a3 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -263,7 +263,9 @@ public Player(@NonNull final PlayerService service) { final PlayerDataSource dataSource = new PlayerDataSource(context, new DefaultBandwidthMeter.Builder(context).build()); loadController = new LoadController(); - renderFactory = new DefaultRenderersFactory(context); + renderFactory = new DefaultRenderersFactory(context) + .setEnableDecoderFallback(prefs.getBoolean( + context.getString(R.string.use_exoplayer_decoder_fallback_key), false)); videoResolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver()); audioResolver = new AudioPlaybackResolver(context, dataSource); diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index f00c25c8c6e..7d8c48bda74 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -1367,5 +1367,7 @@ streams_notifications_channels player_notification_screen + exoplayer_settings_key + use_exoplayer_decoder_fallback_key diff --git a/app/src/main/res/xml/exoplayer_settings.xml b/app/src/main/res/xml/exoplayer_settings.xml index fd563711509..f5314182eec 100644 --- a/app/src/main/res/xml/exoplayer_settings.xml +++ b/app/src/main/res/xml/exoplayer_settings.xml @@ -13,4 +13,12 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> + + \ No newline at end of file From a6ff85a208ec174f48ea31f4487c66d490a1ae1c Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Thu, 18 Aug 2022 19:21:29 +0200 Subject: [PATCH 152/645] Move media tunneling setting to ExoPlayer settings and make this setting available on release builds Media tunneling may be not supported by more devices than the ones we whitelisted before. As a matter of fact, the list of devices on which media tunneling is disabled could be not maintainable in the future, especially if the list of devices grows more and more. A preferable solution is to allow users to configure this setting themselves, allowing them to not wait for their device(s) to be whitelisted in a future NewPipe update. This solution has been applied in this commit and works on every build type. The corresponding preference in the debug settings has been of course removed and the code used to prevent media tunneling activation on specific devices has been removed. --- .../org/schabi/newpipe/player/Player.java | 11 ++------ .../org/schabi/newpipe/util/DeviceUtils.java | 28 ------------------- app/src/main/res/values/settings_keys.xml | 2 +- app/src/main/res/xml/debug_settings.xml | 8 ------ app/src/main/res/xml/exoplayer_settings.xml | 8 ++++++ 5 files changed, 11 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index cc75a2c22a3..5dc9382e7ba 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -77,7 +77,6 @@ import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; -import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoSize; import com.squareup.picasso.Picasso; import com.squareup.picasso.Target; @@ -115,7 +114,6 @@ import org.schabi.newpipe.player.ui.PopupPlayerUi; import org.schabi.newpipe.player.ui.VideoPlayerUi; import org.schabi.newpipe.util.DependentPreferenceHelper; -import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PicassoHelper; @@ -522,16 +520,11 @@ private void initPlayer(final boolean playOnReady) { // Setup UIs UIs.call(PlayerUi::initPlayer); - // enable media tunneling - if (DEBUG && PreferenceManager.getDefaultSharedPreferences(context) + // Disable media tunneling if requested by the user from ExoPlayer settings + if (!PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(context.getString(R.string.disable_media_tunneling_key), false)) { - Log.d(TAG, "[" + Util.DEVICE_DEBUG_INFO + "] " - + "media tunneling disabled in debug preferences"); - } else if (DeviceUtils.shouldSupportMediaTunneling()) { trackSelector.setParameters(trackSelector.buildUponParameters() .setTunnelingEnabled(true)); - } else if (DEBUG) { - Log.d(TAG, "[" + Util.DEVICE_DEBUG_INFO + "] does not support media tunneling"); } } //endregion diff --git a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java index 4b08cfcb501..f656c61446a 100644 --- a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java @@ -36,22 +36,6 @@ public final class DeviceUtils { private static Boolean isTV = null; private static Boolean isFireTV = null; - /* - * Devices that do not support media tunneling - */ - // Formuler Z8 Pro, Z8, CC, Z Alpha, Z+ Neo - private static final boolean HI3798MV200 = Build.VERSION.SDK_INT == 24 - && Build.DEVICE.equals("Hi3798MV200"); - // Zephir TS43UHD-2 - private static final boolean CVT_MT5886_EU_1G = Build.VERSION.SDK_INT == 24 - && Build.DEVICE.equals("cvt_mt5886_eu_1g"); - // Hilife TV - private static final boolean REALTEKATV = Build.VERSION.SDK_INT == 25 - && Build.DEVICE.equals("RealtekATV"); - // Philips QM16XE - private static final boolean QM16XE_U = Build.VERSION.SDK_INT == 23 - && Build.DEVICE.equals("QM16XE_U"); - private DeviceUtils() { } @@ -211,18 +195,6 @@ public static int spToPx(@Dimension(unit = Dimension.SP) final int sp, context.getResources().getDisplayMetrics()); } - /** - * Some devices have broken tunneled video playback but claim to support it. - * See https://github.com/TeamNewPipe/NewPipe/issues/5911 - * @return false if affected device - */ - public static boolean shouldSupportMediaTunneling() { - return !HI3798MV200 - && !CVT_MT5886_EU_1G - && !REALTEKATV - && !QM16XE_U; - } - public static boolean isLandscape(final Context context) { return context.getResources().getDisplayMetrics().heightPixels < context.getResources() .getDisplayMetrics().widthPixels; diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 7d8c48bda74..8ff61717206 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -227,7 +227,6 @@ show_memory_leaks_key allow_disposed_exceptions_key show_original_time_ago_key - disable_media_tunneling_key show_image_indicators_key show_crash_the_player_key check_new_streams @@ -1369,5 +1368,6 @@ exoplayer_settings_key + disable_media_tunneling_key use_exoplayer_decoder_fallback_key diff --git a/app/src/main/res/xml/debug_settings.xml b/app/src/main/res/xml/debug_settings.xml index 7405e47acf7..84bb281f31e 100644 --- a/app/src/main/res/xml/debug_settings.xml +++ b/app/src/main/res/xml/debug_settings.xml @@ -34,14 +34,6 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - - + + \ No newline at end of file From a02b92fd59ad7585c42fc5839c0d4b360150a4d0 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Sun, 21 Aug 2022 22:20:29 +0200 Subject: [PATCH 153/645] Update playback load interval size setting description - Remove redundant player restart requirement note, as it is written on the ExoPlayer settings description page; - Add precision about the setting effect/limitation, as it only applies on progressive contents/media sources and not on every content/media source; - Remove translations of this description, to ensure that they will be updated by translators. --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-bs/strings.xml | 1 - app/src/main/res/values-ckb/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 3 +-- app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fil/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-ml/strings.xml | 1 - app/src/main/res/values-nl-rBE/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 3 +-- app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-te/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/strings.xml | 2 +- 40 files changed, 3 insertions(+), 42 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 95e620ad8e4..97717799699 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -729,7 +729,6 @@ تعليق مثبت LeakCanary غير متوفر الافتراضي ExoPlayer - تغيير حجم الفاصل الزمني للتحميل (حاليا %s). قد تؤدي القيمة الأقل إلى تسريع تحميل الفيديو الأولي. تتطلب التغييرات إعادة تشغيل المشغل تكوين إشعار مشغل البث الحالي الإشعارات تحميل تفاصيل البث… diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 8779fb8670e..14e915a9e3d 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -496,7 +496,6 @@ Video fayl xülasəsi prosesi üçün bildirişlər Miniatürü 1:1 görünüş nisbətinə kəs - Yükləmə intervalı həcmini dəyişdir (hazırda %s). Daha aşağı dəyər ilkin video yükləməni sürətləndirə bilər. Dəyişikliklər oynadıcını yenidən başlatmağı tələb edir Yayım yaradıcısı, məzmunu və ya axtarış sorğusu haqqında əlavə məlumat olan üst məlumat qutularını gizlətmək üçün söndür Əlaqəli yayımı əlavə etməklə (təkrarlanmayan) sonlanacaq oynatma növbəsini davam etdir Kənar axtarış təklifləri diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 855c577a62c..8654715a61c 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -70,7 +70,6 @@ Zapamtite posljednju veličinu i položaj iskočnog prozora Koristite brzo neprecizno premotavanje Neprecizno premotavanje dozvoljava pokretaču brže premotavanje s gorom preciznošću. Premotavanje za 5, 15 ili 25 sekundi ne radi s ovim - Promijenite veličinu intervala za učitavanje (trenutačno %s). Niža vrijednost bi vam moglo ubrzat učitavanje videa. Trebate te ponovno učitati pokretač za promjenu. Prebacivanje sa jednog pokretača na drugi bi van moglo zamijeniti pokretni red Isključite da sakrijete komentare Pitajte za potvrdu prije isčišćavanja reda diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 53d32cd93ce..239740e5930 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -700,7 +700,6 @@ هەموو فایلە دابەزێنراوەکان لە دیسک بسڕدرێتەوە؟ پەیامەکان ناکاراکراون پەیامم بکە - "قەبارەی نێوان بارکردنەکە بگۆڕە (لە ئێستادا %s) . بەهایەکی کەمتر لەوانەیە بارکردنی ڤیدیۆی سەرەتایی خێراتر بکات. گۆڕانکارییەکان پێویستیان بە داگیرساندنەوەی لێدەر هەیە" لەسەدا نیمچەتەن بنەڕەتی ExoPlayer diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index eda30eb11bf..68fa32c3c02 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -691,7 +691,6 @@ Zobrazit krátké oznámení o chybě Připnutý komentář Shodit přehrávač - Změnit interval načítání (aktuálně %s). Menší hodnota může zrychlit počáteční načítání videa. Změna vyžaduje restart přehrávače LeakCanary není dostupné Výchozí ExoPlayer Nastavit oznámení o právě přehrávaném streamu diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 6b16e6eae4e..3322590e858 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -462,7 +462,6 @@ Download fuldført %s downloads fuldført - Ændr indlæsningsintervallets størrelse (som nu er på %s). En lavere værdi kan øge videoindlæsningshastigheden. Ændringer kræver en genstart af afspiller Den aktive spilleliste bliver udskiftet Hvis du skifter fra en spiller til en anden, kan din kø blive erstattet Vis metainformation @@ -731,4 +730,4 @@ Playlists der er grået ud, indeholder allerede dette objekt. Inaktiver permanent thumbnail Fejlede at kopiere til udklipsholderen - \ No newline at end of file + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 36941050804..14fbbc0570d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -682,7 +682,6 @@ \nBitte installiere einen Storage Access Framework kompatiblen Dateimanager Angehefteter Kommentar LeakCanary ist nicht verfügbar - Ändern der Größe des Ladeintervalls (derzeit %s). Ein niedrigerer Wert kann das anfängliche Laden des Videos beschleunigen. Änderungen erfordern einen Neustart des Players ExoPlayer Standard Benachrichtigungen Benachrichtigen über neue abonnierbare Streams diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 0a42d5d0fbe..83df4f5a415 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -681,7 +681,6 @@ Καρφιτσωμένο σχόλιο Το LeakCanary δεν είναι διαθέσιμο Εξ\' ορισμού ExoPlayer - Αλλάξτε το μέγεθος του διαστήματος φόρτωσης (επί του παρόντος είναι %s). Μια χαμηλότερη τιμή μπορεί να επιταχύνει την αρχική φόρτωση βίντεο. Οι αλλαγές απαιτούν επανεκκίνηση της εφαρμογής Ειδοποιήσεις %s νέα ροή diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 91ba5b6543d..239bfa81cfa 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -696,7 +696,6 @@ Comentario fijado LeakCanary no está disponible ExoPlayer valor por defecto - Cambie el tamaño del intervalo de carga (actualmente %s). Un valor más bajo puede acelerar la carga inicial de video. Los cambios requieren un reinicio del reproductor Notificaciones Nuevos streams Notificación del reproductor diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 9ec65ce9984..07b52d9d298 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -681,7 +681,6 @@ Esiletõstetud kommentaar LeakCanary pole saadaval ExoPlayer\'i vaikimisi väärtused - Muuda video laadimise välpa (hetkel %s). Väiksemast väärtusest võib abi olla, kui tahad et video esitamine algaks varem. Muudatuste jõustamine eeldab rakenduse uuesti käivitamist Meediamängija teavitused Teavitused pole kasutusel Kontrollimise sagedus diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 946de5363bb..5900031ef4a 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -690,7 +690,6 @@ Kanal honetara harpidetu zara , Txandakatu denak - Aldatu karga maiztasun tamaina (unean %s). Balio txikiago batek bideoaren hasierako karga azkartu dezake. Erreproduzigailuaren berrabiaraztea behar du Harpidetzen jario berriei buruz jakinarazi Ezabatu deskargatutako fitxategi guztiak biltegitik\? Harpidetzentzako jario berrien jakinarazpenak diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index fe5750dd962..22a7956fab8 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -680,7 +680,6 @@ خطایی رخ داد. آگاهی را ببینید نظر سنجاق شده لیک‌کاناری موجود نیست - تغییر اندازهٔ بازهٔ بار (هم‌اکنون %s). مقداری پایین‌تر، می‌تواند بار کردن نخستین ویدیو را سرعت بخشد. تغییرها نیاز به یک آغاز دوبارهٔ پخش‌کننده دارند پیش‌گزیدهٔ اگزوپلیر آگاهی‌ها بار کردن جزییات جریان… diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index c66d1db759f..38719e96065 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -48,7 +48,6 @@ Pangalawang action button Pangatlong action button Pinapayagan ng di-saktong seek ang player na mag-seek sa mga posisyon nang mabilis ngunit na may pinababang kasaktuhan. Di ito gagana sa pag-seek nang 5, 15, o 25 segundo. - Baguhin ang laki ng pagitan na ilo-load (kasalukuyang %s). Maaaring mapabilis ang unang pag-load sa video kung mababa ito. Kailangang i-restart ang player para gumana ang pagbabago. Patayin para mapigilan ang pag-load sa mga thumbnail, para makatipid ng data at paggamit sa memory. Lilinisin ang parehong image cache na nasa memory at nasa disk Piliin ang mga mungkahing ipapakita habang naghahanap Patayin para itago ang paglalarawan ng video at karagdagang impormasyon diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ea891723b96..496a23b65ad 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -694,7 +694,6 @@ \nVeuillez installer un gestionnaire de fichiers ou essayez de désactiver « %s » dans les paramètres de téléchargement Commentaire épinglé LeakCanary n\'est pas disponible - Modifie la taille de l\'intervalle de chargement (actuellement %s). Une valeur plus faible peut accélérer le chargement initial des vidéos. Changer cette valeur nécessite de redémarrer le lecteur Valeur par défaut d’ExoPlayer Nouveaux flux Configurer la notification du flux en cours de lecture diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 7aafe4e7e8d..20ceff5faca 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -671,7 +671,6 @@ Procurar manualmente novas versións A procurar actualizacións… A partir do Android 10, só o \'Sistema de Acceso ao Almacenamento\' está soportado - Cambial dimensión do intervalo de carga (actualmente %s). Un valor máis baixo pode alixeirala carga inicial do vídeo. Os cambios requiren un reinicio da aplicacion Procesando... Pode devagar un momento Crear unha notificación de erro Amosar fitas coloridas de Picasso na cima das imaxes que indican a súa fonte: vermello para a rede, azul para o disco e verde para a memoria diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index ffd65b736c6..b1989b842b2 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -705,7 +705,6 @@ הערה ננעצה LeakCanary אינה זמינה ברירת מחדל של ExoPlayer - שינוי גודל מרווח הטעינה (כרגע %s). ערך נמוך יותר עשוי להאיץ את טעינת הווידאו הראשונית. שינויים דורשים את הפעלת הנגן מחדש התראות על תזרימים חדשים להרשמה תדירות בדיקה נדרש חיבור לרשת diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 06df200827f..985544fe4cd 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -669,7 +669,6 @@ Komentar dipin LeakCanary tidak tersedia Default ExoPlayer - Ubah ukuran interval pemuatan (saat ini %s). Nilai yang rendah mungkin dapat membuat pemuatan video awal lebih cepat. Perubahan membutuhkan pemutar dimulai ulang Memuat detail stream… Frekuensi pemeriksaan Dibutuhkan koneksi jaringan diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index cac9b0d2a8b..aff0b3bee16 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -693,7 +693,6 @@ Commento in primo piano LeakCanary non è disponibile Predefinito ExoPlayer - Cambia la dimensione dell\'intervallo da caricare (attualmente %s). Un valore basso può velocizzare il caricamento iniziale del video. La modifica richiede il riavvio del lettore Notifiche di nuovi contenuti dalle iscrizioni Frequenza controllo Connessione di rete richiesta diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e9b0798bbc1..fafbf91f909 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -688,7 +688,6 @@ 新しいストリーム 通知 現在再生しているストリームの通知を構成 - 読み込み間隔を変更します (現在 %s)。小さくすると再生開始までの時間が短くなります。変更を適用するには再起動が必要です 必要なネットワークの種類 パーセント 半音 diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 5c5c7ba428c..d54d043dbeb 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -677,7 +677,6 @@ Tagad varat atlasīt tekstu video aprakstā. Notifikācijas - Izmainīt ielādēšanas intervāla izmēru (pašlaik %s). Zemāka vērtība var paātrināt sākotnējo video ielādi. Izmainot vērtību, nepieciešams restartēt atskaņotāju. Avarēt atskaņotāju Pielāgojiet pašlaik atskaņotās plūsmas notifikāciju Atskaņotāja notifikācija diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 2a61f4b0a49..286e68bc3da 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -653,6 +653,5 @@ അറിയിപ്പുകൾ പ്ലേയർ അറിയിപ്പ് പുതിയ സ്ട്രീമുകൾ - ലോഡ് ഇടവേള മാറ്റുക (ഇപ്പൊൾ %s). കുറഞ്ഞ മൂല്യം വീഡിയോ വേഗത്തിൽ ലോഡ് ചെയ്യാൻ ഇടയാക്കാം. മാറ്റങ്ങൾ പ്രാഭല്യതിൽ വരുത്താൻ പ്ലേയർ പുനരാരംഭിക്കണം. പ്ലേയർ തകർക്കുക \ No newline at end of file diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 490b75bb8e2..4c4b5c95dea 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -625,7 +625,6 @@ Nieuwe streams Meldingen over nieuwe streams voor abonnementen NewPipe meldt een fout, tik om te rapporteren - Verander het laadinterval (momenteel %s). Een lagere waarde kan het laden van video versnellen. Vereist een herstart van de speler. %s nieuwe stream %s nieuwe streams diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index bd901a26f06..f6d8ccffaf1 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -680,7 +680,6 @@ \nInstalleer een bestandsbeheerder die compatibel is met het Storage Access Framework Vastgemaakt commentaar LeakCanary is niet beschikbaar - Verander de laad interval tijd (nu %s). Een lagere waarde kan het initiële laden van de video versnellen. De wijziging vereist een herstart van de speler ExoPlayer standaard Speler melding Configureer meldingen van de huidige spelende stream diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 109accb820e..895b1a93553 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -700,7 +700,6 @@ Przypięty komentarz LeakCanary jest niedostępne Rozmiar interwału ładowania odtwarzania - Zmień rozmiar interwału ładowania (aktualnie %s). Niższa wartość może przyspieszyć początkowe ładowanie wideo. Zmiany wymagają ponownego uruchomienia odtwarzacza domyślny ExoPlayera Powiadomienie odtwarzacza Skonfiguruj powiadomienie aktualnie odtwarzanego strumienia diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 91be57038ec..bfa888d6be8 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -692,7 +692,6 @@ \nInstale um gerenciador de arquivos ou tente desativar \'%s\' nas configurações de download Comentário fixado O LeakCanary não está disponível - Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. As alterações exigem que o player seja reiniciado ExoPlayer padrão Notificação do reprodutor Configurar a notificação do fluxo da reprodução atual diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 9c3958ba3c0..f38a4180d0a 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -692,7 +692,6 @@ \nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework Comentário fixado LeakCanary não está disponível - Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. As alterações exigem que o player seja reiniciado Predefinido do ExoPlayer Notificações A carregar detalhes do fluxo… diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 0d71e00b8e9..9719292ecb7 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -693,7 +693,6 @@ Comentário fixado LeakCanary não está disponível Predefinido do ExoPlayer - Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo. Se fizer alterações é necessário reiniciar Notificação do reprodutor Configurar a notificação da reprodução do vídeo atual Notificações diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 84eed26ecbb..bb3ef6665bf 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -705,7 +705,6 @@ Procent Semiton Implicit ExoPlayer - Modificați dimensiunea intervalului de încărcare (în prezent %s). O valoare mai mică poate accelera încărcarea inițială a videoclipului. Modificările necesită o repornire a playerului Dați crash player-ului LeakCanary nu este disponibil Notificări diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2f9ca0f4e66..687d8354979 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -715,7 +715,6 @@ Закреплённый комментарий LeakCanary недоступна Стандартное значение ExoPlayer - Изменить интервал загрузки (сейчас %s). Меньшее значение может ускорить запуск видео. Нужен перезапуск плеера Загрузка сведений о трансляции… Проверить наличие новых трансляций Удалить все загруженные файлы\? @@ -758,4 +757,4 @@ Удалить дубликаты\? Частично просмотрено Вы хотите удалить все повторяющиеся потоки в этом плейлисте\? - \ No newline at end of file + diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index d2af2693057..676a8dd07d6 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -681,7 +681,6 @@ Cummentu apicadu LeakCanary no est a disponimentu Valore ExoPlayer predefinidu - Muda sa mannària de s\'intervallu de carrigamentu (in custu momentu %s). Unu valore prus bassu diat pòdere allestrare su carrigamentu de incumintzu de su vìdeu. Sas modìficas tenent bisòngiu de torrare a allùghere su riproduidore Cunfigura sa notìfica de su flussu in cursu de riprodutzione Notìficas de flussos noos dae sas iscritziones diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 05f9c70b9e0..a21b2dfac35 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -693,7 +693,6 @@ Zobraziť krátke oznámenie chyby Oznámte chybu ExoPlayer preddefinovaný - Zmeniť interval načítania (aktuálne %s). Menšia hodnota môže zvýšiť rýchlosť prvotného načítania videa. Zmena vyžaduje reštart Upozornenia Frekvencia kontroly Vymazať všetky stiahnuté súbory z disku\? diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 92a1d2294c7..a3bb7068b72 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -681,7 +681,6 @@ Fäst kommentar LeakCanary är inte tillgänglig ExoPlayer standard - Ändra inläsningsintervallets storlek (för närvarande %s). Ett lägre värde kan påskynda den första videoinläsningen. Ändringar kräver omstart av spelaren Uppdateringsintervall Nödvändig nätverksanslutning Alla nätverk diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index fd38b35d556..a0e65045e69 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -417,7 +417,6 @@ పరివీక్షణ తేలియాడే విధంగా మార్చు తదుపరి స్ట్రీమ్‌ను స్వీయ-ఎన్క్యూ - లోడ్ విరామం పరిమాణాన్ని మార్చండి (ప్రస్తుతం %s). తక్కువ విలువ ప్రారంభ వీడియో లోడింగ్‌ని వేగవంతం చేయవచ్చు. మార్పులకు ప్లేయర్ రీస్టార్ట్ అవసరం. LeakCanary అందుబాటులో లేదు ప్లేయర్ శీర్షిక వచన స్థాయి మరియు నేపథ్య శైలులను సవరించండి. అమలులోకి రావడానికి యాప్ రీస్టార్ట్ అవసరం స్వయంచాలకంగా రూపొందించబడింది (ఎక్కించినవారు కనబడుటలేదు) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 7943e8adf1f..9b07dd7f7c2 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -679,7 +679,6 @@ Oynatıcıyı çöktür Sabitlenmiş yorum LeakCanary yok - Yükleme ara boyutunu değiştir (şu anda %s). Düşük bir değer videonun ilk yüklenişini hızlandırabilir. Değişiklikler oynatıcının yeniden başlatılmasını gerektirir ExoPlayer öntanımlısı Yeni akış bildirimleri Bildirimler diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 6706396aed3..4436b30e987 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -697,7 +697,6 @@ Закріплений коментар LeakCanary недоступний Типовий ExoPlayer - Змінити розмір інтервалу завантаження (наразі %s). Менше значення може прискорити початкове завантаження відео. Зміни вимагають перезапуску програвача Ви підписалися на цей канал , Сповіщення про нові трансляції для підписок diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index fc00769ba3d..7d0f15132cf 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -666,7 +666,6 @@ \nVui lòng cài đặt ứng dụng quản lý tệp tương thích với Storage Access Framework. Không tìm thấy ứng dụng quản lý tệp phù hợp nào để thực hiện hành động. \nVui lòng cài đặt ứng dụng quản lý tệp hoặc tắt \'%s\' trong cài đặt tải xuống - Thay đổi kích thước khoảng thời gian tải (tầm khoảng %s). Để ở giá trị thấp hơn có thể sẽ tăng tốc độ tải video hơn ban đầu. Khởi động lại trình phát để áp dụng thay đổi LeakCanary không khả dụng ExoPlayer mặc định Bình luận được ghim diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 4ee6bc285c5..b4dfa142cd0 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -668,7 +668,6 @@ NewPipe 遇到了一个错误,点击此处报告此错误 置顶评论 LeakCanary 不可用 - 更改加载间隔的大小(当前为 %s),较低的值可以加快视频的首次加载速度。更改需要重启播放器 ExoPlayer 默认 配置当前正在播放的串流的通知 新串流通知 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 8e83c40150f..d70913965b6 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -646,7 +646,6 @@ 係咪要全部剷走晒播放到邊個位? 百分比 半音 - 更改載入斬件大細 (目前係 %s)。細啲或者可以等條片快啲開波。更改要開過個播放器至生效 問過先至將排隊播清零 目前播放器入面嘅排隊播將會清零 加一個站 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 75e77fa18cc..15bf15a0fc6 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -669,7 +669,6 @@ 釘選的留言 LeakCanary 無法使用 ExoPlayer 預設值 - 變更載入間隔大小(目前為 %s)。較低的值可能會提昇初始影片載入速度。變更需要重新啟動播放器 播放器通知 通知 正在載入串流詳細資訊…… diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1dad7c01d56..767dadab0a2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -79,7 +79,7 @@ Inexact seek allows the player to seek to positions faster with reduced precision. Seeking for 5, 15 or 25 seconds doesn\'t work with this Fast-forward/-rewind seek duration Playback load interval size - Change the load interval size (currently %s). A lower value may speed up initial video loading. Changes require a player restart + Change the load interval size on progressive contents (currently %s). A lower value may speed up their initial loading Ask for confirmation before clearing a queue Switching from one player to another may replace your queue The active player queue will be replaced From 787758a4360063cafce3f77d8cf562082419945f Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Sun, 26 Feb 2023 19:39:17 +0100 Subject: [PATCH 154/645] [Android 6+] Add ability to always use ExoPlayer's MediaVideoCodecRenderer setOutputSurface workaround As some devices not present in ExoPlayer's list may not implement MediaCodec.setOutputSurface(Surface) properly, this workaround could be useful on these devices. It forces ExoPlayer to fall back on releasing and re-instantiating video codec instances, which is always used on Android 5 and lower due to addition of this method in Android 6. To do so, a CustomMediaCodecVideoRenderer, based on ExoPlayer's MediaVideoCodecRenderer which always return true for the codecNeedsSetOutputSurfaceWorkaround method has been added, which is used in CustomRenderersFactory, a class based on DefaultRenderersFactory which always returns our CustomMediaCodecVideoRenderer as the video renderers. CustomRenderersFactory replaces DefaultRenderersFactory in the player, in the case this setting is enabled. --- .../org/schabi/newpipe/player/Player.java | 17 ++++-- .../helper/CustomMediaCodecVideoRenderer.java | 54 +++++++++++++++++++ .../player/helper/CustomRenderersFactory.java | 43 +++++++++++++++ app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/exoplayer_settings.xml | 10 +++- 6 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/player/helper/CustomMediaCodecVideoRenderer.java create mode 100644 app/src/main/java/org/schabi/newpipe/player/helper/CustomRenderersFactory.java diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 5dc9382e7ba..b446cbb81d0 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -69,7 +69,6 @@ import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player.PositionInfo; -import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Tracks; import com.google.android.exoplayer2.source.MediaSource; @@ -95,6 +94,7 @@ import org.schabi.newpipe.player.event.PlayerEventListener; import org.schabi.newpipe.player.event.PlayerServiceEventListener; import org.schabi.newpipe.player.helper.AudioReactor; +import org.schabi.newpipe.player.helper.CustomRenderersFactory; import org.schabi.newpipe.player.helper.LoadController; import org.schabi.newpipe.player.helper.PlayerDataSource; import org.schabi.newpipe.player.helper.PlayerHelper; @@ -196,7 +196,7 @@ public final class Player implements PlaybackListener, Listener { @NonNull private final DefaultTrackSelector trackSelector; @NonNull private final LoadController loadController; - @NonNull private final RenderersFactory renderFactory; + @NonNull private final DefaultRenderersFactory renderFactory; @NonNull private final VideoPlaybackResolver videoResolver; @NonNull private final AudioPlaybackResolver audioResolver; @@ -261,9 +261,16 @@ public Player(@NonNull final PlayerService service) { final PlayerDataSource dataSource = new PlayerDataSource(context, new DefaultBandwidthMeter.Builder(context).build()); loadController = new LoadController(); - renderFactory = new DefaultRenderersFactory(context) - .setEnableDecoderFallback(prefs.getBoolean( - context.getString(R.string.use_exoplayer_decoder_fallback_key), false)); + + renderFactory = prefs.getBoolean( + context.getString( + R.string.always_use_exoplayer_set_output_surface_workaround_key), false) + ? new CustomRenderersFactory(context) : new DefaultRenderersFactory(context); + + renderFactory.setEnableDecoderFallback( + prefs.getBoolean( + context.getString( + R.string.use_exoplayer_decoder_fallback_key), false)); videoResolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver()); audioResolver = new AudioPlaybackResolver(context, dataSource); diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/CustomMediaCodecVideoRenderer.java b/app/src/main/java/org/schabi/newpipe/player/helper/CustomMediaCodecVideoRenderer.java new file mode 100644 index 00000000000..66ac6d50bc1 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/helper/CustomMediaCodecVideoRenderer.java @@ -0,0 +1,54 @@ +package org.schabi.newpipe.player.helper; + +import android.content.Context; +import android.os.Handler; + +import androidx.annotation.Nullable; + +import com.google.android.exoplayer2.mediacodec.MediaCodecAdapter; +import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; +import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; +import com.google.android.exoplayer2.video.VideoRendererEventListener; + +/** + * A {@link MediaCodecVideoRenderer} which always enable the output surface workaround that + * ExoPlayer enables on several devices which are known to implement + * {@link android.media.MediaCodec#setOutputSurface(android.view.Surface) + * MediaCodec.setOutputSurface(Surface)} incorrectly. + * + *

+ * See {@link MediaCodecVideoRenderer#codecNeedsSetOutputSurfaceWorkaround(String)} for more + * details. + *

+ * + *

+ * This custom {@link MediaCodecVideoRenderer} may be useful in the case a device is affected by + * this issue but is not present in ExoPlayer's list. + *

+ * + *

+ * This class has only effect on devices with Android 6 and higher, as the {@code setOutputSurface} + * method is only implemented in these Android versions and the method used as a workaround is + * always applied on older Android versions (releasing and re-instantiating video codec instances). + *

+ */ +public final class CustomMediaCodecVideoRenderer extends MediaCodecVideoRenderer { + + @SuppressWarnings({"checkstyle:ParameterNumber", "squid:S107"}) + public CustomMediaCodecVideoRenderer(final Context context, + final MediaCodecAdapter.Factory codecAdapterFactory, + final MediaCodecSelector mediaCodecSelector, + final long allowedJoiningTimeMs, + final boolean enableDecoderFallback, + @Nullable final Handler eventHandler, + @Nullable final VideoRendererEventListener eventListener, + final int maxDroppedFramesToNotify) { + super(context, codecAdapterFactory, mediaCodecSelector, allowedJoiningTimeMs, + enableDecoderFallback, eventHandler, eventListener, maxDroppedFramesToNotify); + } + + @Override + protected boolean codecNeedsSetOutputSurfaceWorkaround(final String name) { + return true; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/CustomRenderersFactory.java b/app/src/main/java/org/schabi/newpipe/player/helper/CustomRenderersFactory.java new file mode 100644 index 00000000000..668b48c306c --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/helper/CustomRenderersFactory.java @@ -0,0 +1,43 @@ +package org.schabi.newpipe.player.helper; + +import android.content.Context; +import android.os.Handler; + +import com.google.android.exoplayer2.DefaultRenderersFactory; +import com.google.android.exoplayer2.Renderer; +import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; +import com.google.android.exoplayer2.video.VideoRendererEventListener; + +import java.util.ArrayList; + +/** + * A {@link DefaultRenderersFactory} which only uses {@link CustomMediaCodecVideoRenderer} as an + * implementation of video codec renders. + * + *

+ * As no ExoPlayer extension is currently used, the reflection code used by ExoPlayer to try to + * load video extension libraries is not needed in our case and has been removed. This should be + * changed in the case an extension is shipped with the app, such as the AV1 one. + *

+ */ +public final class CustomRenderersFactory extends DefaultRenderersFactory { + + public CustomRenderersFactory(final Context context) { + super(context); + } + + @SuppressWarnings("checkstyle:ParameterNumber") + @Override + protected void buildVideoRenderers(final Context context, + @ExtensionRendererMode final int extensionRendererMode, + final MediaCodecSelector mediaCodecSelector, + final boolean enableDecoderFallback, + final Handler eventHandler, + final VideoRendererEventListener eventListener, + final long allowedVideoJoiningTimeMs, + final ArrayList out) { + out.add(new CustomMediaCodecVideoRenderer(context, getCodecAdapterFactory(), + mediaCodecSelector, allowedVideoJoiningTimeMs, enableDecoderFallback, eventHandler, + eventListener, MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY)); + } +} diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 8ff61717206..f9d0572e80c 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -1370,4 +1370,5 @@ exoplayer_settings_key disable_media_tunneling_key use_exoplayer_decoder_fallback_key + always_use_exoplayer_set_output_surface_workaround_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 767dadab0a2..5730e063e9e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -777,4 +777,6 @@ Manage some ExoPlayer settings. These changes require a player restart to take effect Use ExoPlayer\'s decoder fallback feature Enable this option if you have decoder initialization issues, which falls back to lower-priority decoders if primary decoders initialization fail. This may result in poor playback performance than when using primary decoders + Always use ExoPlayer\'s video output surface setting workaround + This workaround releases and re-instantiates video codecs when a surface change occurs, instead of setting the surface to the codec directly. Already used by ExoPlayer on some devices with this issue, this setting has only an effect on Android 6 and higher\n\nEnabling this option may prevent playback errors when switching the current video player or switching to fullscreen \ No newline at end of file diff --git a/app/src/main/res/xml/exoplayer_settings.xml b/app/src/main/res/xml/exoplayer_settings.xml index d855ad936d4..7e903fff151 100644 --- a/app/src/main/res/xml/exoplayer_settings.xml +++ b/app/src/main/res/xml/exoplayer_settings.xml @@ -29,4 +29,12 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - \ No newline at end of file + + + From acebabd02817a9f8bd6e1d22e36c29e56fbe92d8 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sun, 9 Apr 2023 18:46:15 +0530 Subject: [PATCH 155/645] Use AndroidX's PendingIntentCompat class. --- .../org/schabi/newpipe/NewVersionWorker.kt | 4 +- .../org/schabi/newpipe/error/ErrorUtil.kt | 5 +- .../feed/notifications/NotificationHelper.kt | 5 +- .../local/feed/service/FeedLoadService.kt | 6 +- .../player/notification/NotificationUtil.java | 8 +-- .../newpipe/util/PendingIntentCompat.java | 69 ------------------- .../giga/service/DownloadManagerService.java | 6 +- 7 files changed, 18 insertions(+), 85 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/util/PendingIntentCompat.java diff --git a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt index dac831fe427..c46dd63488a 100644 --- a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt @@ -6,6 +6,7 @@ import android.util.Log import android.widget.Toast import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.PendingIntentCompat import androidx.core.content.ContextCompat import androidx.core.content.edit import androidx.core.net.toUri @@ -19,7 +20,6 @@ import com.grack.nanojson.JsonParser import com.grack.nanojson.JsonParserException import org.schabi.newpipe.extractor.downloader.Response import org.schabi.newpipe.extractor.exceptions.ReCaptchaException -import org.schabi.newpipe.util.PendingIntentCompat import org.schabi.newpipe.util.ReleaseVersionUtil.coerceUpdateCheckExpiry import org.schabi.newpipe.util.ReleaseVersionUtil.isLastUpdateCheckExpired import org.schabi.newpipe.util.ReleaseVersionUtil.isReleaseApk @@ -60,7 +60,7 @@ class NewVersionWorker( val intent = Intent(Intent.ACTION_VIEW, apkLocationUrl?.toUri()) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) val pendingIntent = PendingIntentCompat.getActivity( - applicationContext, 0, intent, 0 + applicationContext, 0, intent, 0, false ) val channelId = applicationContext.getString(R.string.app_update_notification_channel_id) val notificationBuilder = NotificationCompat.Builder(applicationContext, channelId) diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt index c7b9beeedd2..daa59850949 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt @@ -9,10 +9,10 @@ import android.view.View import android.widget.Toast import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.PendingIntentCompat import androidx.fragment.app.Fragment import com.google.android.material.snackbar.Snackbar import org.schabi.newpipe.R -import org.schabi.newpipe.util.PendingIntentCompat /** * This class contains all of the methods that should be used to let the user know that an error has @@ -118,7 +118,8 @@ class ErrorUtil { context, 0, getErrorActivityIntent(context, errorInfo), - PendingIntent.FLAG_UPDATE_CURRENT + PendingIntent.FLAG_UPDATE_CURRENT, + false ) ) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt index 61a4936c8c7..dc863126e1a 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt @@ -10,6 +10,7 @@ import android.os.Build import android.provider.Settings import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.PendingIntentCompat import androidx.core.content.ContextCompat import androidx.preference.PreferenceManager import com.squareup.picasso.Picasso @@ -19,7 +20,6 @@ import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.local.feed.service.FeedUpdateInfo import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.NavigationHelper -import org.schabi.newpipe.util.PendingIntentCompat import org.schabi.newpipe.util.PicassoHelper /** @@ -76,7 +76,8 @@ class NotificationHelper(val context: Context) { NavigationHelper .getChannelIntent(context, data.listInfo.serviceId, data.listInfo.url) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), - 0 + 0, + false ) ) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt index 0850fef8c9a..ff5734feb36 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt @@ -29,6 +29,7 @@ import android.os.IBinder import android.util.Log import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.PendingIntentCompat import androidx.core.app.ServiceCompat import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable @@ -42,7 +43,6 @@ import org.schabi.newpipe.extractor.ListInfo import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ErrorResultEvent import org.schabi.newpipe.local.feed.service.FeedEventManager.postEvent -import org.schabi.newpipe.util.PendingIntentCompat import java.util.concurrent.TimeUnit class FeedLoadService : Service() { @@ -152,8 +152,8 @@ class FeedLoadService : Service() { private lateinit var notificationBuilder: NotificationCompat.Builder private fun createNotification(): NotificationCompat.Builder { - val cancelActionIntent = - PendingIntentCompat.getBroadcast(this, NOTIFICATION_ID, Intent(ACTION_CANCEL), 0) + val cancelActionIntent = PendingIntentCompat + .getBroadcast(this, NOTIFICATION_ID, Intent(ACTION_CANCEL), 0, false) return NotificationCompat.Builder(this, getString(R.string.notification_channel_id)) .setOngoing(true) diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java index 6e50dda7d74..05c2e3af6dd 100644 --- a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java @@ -13,6 +13,7 @@ import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; +import androidx.core.app.PendingIntentCompat; import androidx.core.app.ServiceCompat; import androidx.core.content.ContextCompat; @@ -21,7 +22,6 @@ import org.schabi.newpipe.player.Player; import org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi; import org.schabi.newpipe.util.NavigationHelper; -import org.schabi.newpipe.util.PendingIntentCompat; import java.util.List; import java.util.Objects; @@ -134,7 +134,7 @@ private synchronized NotificationCompat.Builder createNotification() { .setColorized(player.getPrefs().getBoolean( player.getContext().getString(R.string.notification_colorize_key), true)) .setDeleteIntent(PendingIntentCompat.getBroadcast(player.getContext(), - NOTIFICATION_ID, new Intent(ACTION_CLOSE), FLAG_UPDATE_CURRENT)); + NOTIFICATION_ID, new Intent(ACTION_CLOSE), FLAG_UPDATE_CURRENT, false)); // set the initial value for the video thumbnail, updatable with updateNotificationThumbnail setLargeIcon(builder); @@ -152,7 +152,7 @@ private synchronized void updateNotification() { // also update content intent, in case the user switched players notificationBuilder.setContentIntent(PendingIntentCompat.getActivity(player.getContext(), - NOTIFICATION_ID, getIntentForNotification(), FLAG_UPDATE_CURRENT)); + NOTIFICATION_ID, getIntentForNotification(), FLAG_UPDATE_CURRENT, false)); notificationBuilder.setContentTitle(player.getVideoTitle()); notificationBuilder.setContentText(player.getUploaderName()); notificationBuilder.setTicker(player.getVideoTitle()); @@ -335,7 +335,7 @@ private NotificationCompat.Action getAction(@DrawableRes final int drawable, final String intentAction) { return new NotificationCompat.Action(drawable, player.getContext().getString(title), PendingIntentCompat.getBroadcast(player.getContext(), NOTIFICATION_ID, - new Intent(intentAction), FLAG_UPDATE_CURRENT)); + new Intent(intentAction), FLAG_UPDATE_CURRENT, false)); } private Intent getIntentForNotification() { diff --git a/app/src/main/java/org/schabi/newpipe/util/PendingIntentCompat.java b/app/src/main/java/org/schabi/newpipe/util/PendingIntentCompat.java deleted file mode 100644 index 6b9c36eab56..00000000000 --- a/app/src/main/java/org/schabi/newpipe/util/PendingIntentCompat.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.schabi.newpipe.util; - -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.os.Build; - -import androidx.annotation.NonNull; - -public final class PendingIntentCompat { - private PendingIntentCompat() { - } - - private static int addImmutableFlag(final int flags) { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - ? flags | PendingIntent.FLAG_IMMUTABLE : flags; - } - - /** - * Creates a {@link PendingIntent} to start an activity. It is immutable on API level 23 and - * greater. - * - * @param context The context in which the activity should be started. - * @param requestCode The request code - * @param intent The Intent of the activity to be launched. - * @param flags The flags for the intent. - * @return The pending intent. - * @see PendingIntent#getActivity(Context, int, Intent, int) - */ - @NonNull - public static PendingIntent getActivity(@NonNull final Context context, final int requestCode, - @NonNull final Intent intent, final int flags) { - return PendingIntent.getActivity(context, requestCode, intent, addImmutableFlag(flags)); - } - - /** - * Creates a {@link PendingIntent} to start a service. It is immutable on API level 23 and - * greater. - * - * @param context The context in which the service should be started. - * @param requestCode The request code - * @param intent The Intent of the service to be launched. - * @param flags The flags for the intent. - * @return The pending intent. - * @see PendingIntent#getService(Context, int, Intent, int) - */ - @NonNull - public static PendingIntent getService(@NonNull final Context context, final int requestCode, - @NonNull final Intent intent, final int flags) { - return PendingIntent.getService(context, requestCode, intent, addImmutableFlag(flags)); - } - - /** - * Creates a {@link PendingIntent} to perform a broadcast. It is immutable on API level 23 and - * greater. - * - * @param context The context in which the broadcast should be performed. - * @param requestCode The request code - * @param intent The Intent to be broadcast. - * @param flags The flags for the intent. - * @return The pending intent. - * @see PendingIntent#getBroadcast(Context, int, Intent, int) - */ - @NonNull - public static PendingIntent getBroadcast(@NonNull final Context context, final int requestCode, - @NonNull final Intent intent, final int flags) { - return PendingIntent.getBroadcast(context, requestCode, intent, addImmutableFlag(flags)); - } -} diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java index edc6bb6fd2e..009a4f4be89 100755 --- a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java @@ -33,6 +33,7 @@ import androidx.collection.SparseArrayCompat; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat.Builder; +import androidx.core.app.PendingIntentCompat; import androidx.core.app.ServiceCompat; import androidx.core.content.ContextCompat; import androidx.preference.PreferenceManager; @@ -43,7 +44,6 @@ import org.schabi.newpipe.streams.io.StoredDirectoryHelper; import org.schabi.newpipe.streams.io.StoredFileHelper; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PendingIntentCompat; import java.io.File; import java.io.IOException; @@ -146,7 +146,7 @@ public void onCreate() { mOpenDownloadList = PendingIntentCompat.getActivity(this, 0, openDownloadListIntent, - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_UPDATE_CURRENT, false); icLauncher = BitmapFactory.decodeResource(this.getResources(), R.mipmap.ic_launcher); @@ -487,7 +487,7 @@ public void notifyFailedDownload(DownloadMission mission) { private PendingIntent makePendingIntent(String action) { Intent intent = new Intent(this, DownloadManagerService.class).setAction(action); return PendingIntentCompat.getService(this, intent.hashCode(), intent, - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_UPDATE_CURRENT, false); } private void manageLock(boolean acquire) { From 20f0011921d7a80787c17d39dc361778b629ef70 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Thu, 13 Apr 2023 10:44:20 +0530 Subject: [PATCH 156/645] Fix Sonar failure. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1384d0a9cef..d199d60f8d9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.6.21' + ext.kotlin_version = '1.8.20' repositories { google() mavenCentral() From f8c3ec4be76c886b7262910bb61e5e25c3e43f68 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 4 Feb 2023 23:10:37 +0100 Subject: [PATCH 157/645] Use a whitelist to filter all streams retrieved by the extractor. NewPipe Extractor now extracts all YouTube Itags and therefore only those which can be handled by the player need to be retrieved from the list of all available streams. --- .../resolver/AudioPlaybackResolver.java | 6 +-- .../resolver/VideoPlaybackResolver.java | 8 ++-- .../org/schabi/newpipe/util/ListHelper.java | 38 ++++++++++++++----- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java index e87c9311497..036df51dd46 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java @@ -1,6 +1,6 @@ package org.schabi.newpipe.player.resolver; -import static org.schabi.newpipe.util.ListHelper.getNonTorrentStreams; +import static org.schabi.newpipe.util.ListHelper.getPlayableStreams; import android.content.Context; import android.util.Log; @@ -68,12 +68,12 @@ public MediaSource resolve(@NonNull final StreamInfo info) { */ @Nullable private Stream getAudioSource(@NonNull final StreamInfo info) { - final List audioStreams = getNonTorrentStreams(info.getAudioStreams()); + final List audioStreams = getPlayableStreams(info.getAudioStreams()); if (!audioStreams.isEmpty()) { final int index = ListHelper.getDefaultAudioFormat(context, audioStreams); return getStreamForIndex(index, audioStreams); } else { - final List videoStreams = getNonTorrentStreams(info.getVideoStreams()); + final List videoStreams = getPlayableStreams(info.getVideoStreams()); if (!videoStreams.isEmpty()) { final int index = ListHelper.getDefaultResolutionIndex(context, videoStreams); return getStreamForIndex(index, videoStreams); 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 cf7d7355817..c3303266a3a 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 @@ -29,7 +29,7 @@ import static com.google.android.exoplayer2.C.TIME_UNSET; import static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams; -import static org.schabi.newpipe.util.ListHelper.getNonTorrentStreams; +import static org.schabi.newpipe.util.ListHelper.getPlayableStreams; public class VideoPlaybackResolver implements PlaybackResolver { private static final String TAG = VideoPlaybackResolver.class.getSimpleName(); @@ -72,8 +72,8 @@ public MediaSource resolve(@NonNull final StreamInfo info) { // Create video stream source final List videoStreamsList = ListHelper.getSortedStreamVideosList(context, - getNonTorrentStreams(info.getVideoStreams()), - getNonTorrentStreams(info.getVideoOnlyStreams()), false, true); + getPlayableStreams(info.getVideoStreams()), + getPlayableStreams(info.getVideoOnlyStreams()), false, true); final int index; if (videoStreamsList.isEmpty()) { index = -1; @@ -100,7 +100,7 @@ public MediaSource resolve(@NonNull final StreamInfo info) { } // Create optional audio stream source - final List audioStreams = getNonTorrentStreams(info.getAudioStreams()); + final List audioStreams = getPlayableStreams(info.getAudioStreams()); final AudioStream audio = audioStreams.isEmpty() ? null : audioStreams.get( ListHelper.getDefaultAudioFormat(context, audioStreams)); diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index b3b7c1792db..f36866025c1 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -42,6 +42,21 @@ public final class ListHelper { // Use a Set for better performance private static final Set HIGH_RESOLUTION_LIST = Set.of("1440p", "2160p"); + /** + * List of supported YouTube Itag ids. + * The original order is kept. + * @see {@link org.schabi.newpipe.extractor.services.youtube.ItagItem#ITAG_LIST} + */ + private static final List SUPPORTED_ITAG_IDS = + List.of( + 17, 36, // video v3GPP + 18, 34, 35, 59, 78, 22, 37, 38, // video MPEG4 + 43, 44, 45, 46, // video webm + 171, 172, 139, 140, 141, 249, 250, 251, // audio + 160, 133, 134, 135, 212, 136, 298, 137, 299, 266, // video only + 278, 242, 243, 244, 245, 246, 247, 248, 271, 272, 302, 303, 308, 313, 315 + ); + private ListHelper() { } /** @@ -121,7 +136,7 @@ public static int getDefaultAudioFormat(final Context context, */ @NonNull public static List getStreamsOfSpecifiedDelivery( - final List streamList, + @Nullable final List streamList, final DeliveryMethod deliveryMethod) { return getFilteredStreamList(streamList, stream -> stream.getDeliveryMethod() == deliveryMethod); @@ -136,23 +151,28 @@ public static List getStreamsOfSpecifiedDelivery( */ @NonNull public static List getUrlAndNonTorrentStreams( - final List streamList) { + @Nullable final List streamList) { return getFilteredStreamList(streamList, stream -> stream.isUrl() && stream.getDeliveryMethod() != DeliveryMethod.TORRENT); } /** - * Return a {@link Stream} list which only contains non-torrent streams. + * Return a {@link Stream} list which only contains streams which can be played by the player. + *
+ * Some formats are not supported. For more info, see {@link #SUPPORTED_ITAG_IDS}. + * Torrent streams are also removed, because they cannot be retrieved. * * @param streamList the original stream list * @param the item type's class that extends {@link Stream} - * @return a stream list which only contains non-torrent streams + * @return a stream list which only contains streams that can be played the player */ @NonNull - public static List getNonTorrentStreams( - final List streamList) { + public static List getPlayableStreams( + @Nullable final List streamList) { return getFilteredStreamList(streamList, - stream -> stream.getDeliveryMethod() != DeliveryMethod.TORRENT); + stream -> stream.getDeliveryMethod() != DeliveryMethod.TORRENT + && (stream.getItagItem() == null + || SUPPORTED_ITAG_IDS.contains(stream.getItagItem().id))); } /** @@ -199,7 +219,7 @@ public static List getSortedStreamVideosList( * @return a new stream list filtered using the given predicate */ private static List getFilteredStreamList( - final List streamList, + @Nullable final List streamList, final Predicate streamListPredicate) { if (streamList == null) { return Collections.emptyList(); @@ -210,7 +230,7 @@ private static List getFilteredStreamList( .collect(Collectors.toList()); } - private static String computeDefaultResolution(final Context context, final int key, + private static String computeDefaultResolution(@NonNull final Context context, final int key, final int value) { final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); From e18a6b09f8e76135b31bf41e3b7da11a1ab56581 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Mon, 17 Apr 2023 13:10:29 +0200 Subject: [PATCH 158/645] Apply new itag filter only to YouTube streams --- .../player/resolver/AudioPlaybackResolver.java | 6 ++++-- .../player/resolver/VideoPlaybackResolver.java | 7 ++++--- .../main/java/org/schabi/newpipe/util/ListHelper.java | 11 ++++++++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java index 036df51dd46..e1d3af33550 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java @@ -68,12 +68,14 @@ public MediaSource resolve(@NonNull final StreamInfo info) { */ @Nullable private Stream getAudioSource(@NonNull final StreamInfo info) { - final List audioStreams = getPlayableStreams(info.getAudioStreams()); + final List audioStreams = getPlayableStreams( + info.getAudioStreams(), info.getServiceId()); if (!audioStreams.isEmpty()) { final int index = ListHelper.getDefaultAudioFormat(context, audioStreams); return getStreamForIndex(index, audioStreams); } else { - final List videoStreams = getPlayableStreams(info.getVideoStreams()); + final List videoStreams = getPlayableStreams( + info.getVideoStreams(), info.getServiceId()); if (!videoStreams.isEmpty()) { final int index = ListHelper.getDefaultResolutionIndex(context, videoStreams); return getStreamForIndex(index, videoStreams); 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 c3303266a3a..0017312cf9f 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 @@ -72,8 +72,8 @@ public MediaSource resolve(@NonNull final StreamInfo info) { // Create video stream source final List videoStreamsList = ListHelper.getSortedStreamVideosList(context, - getPlayableStreams(info.getVideoStreams()), - getPlayableStreams(info.getVideoOnlyStreams()), false, true); + getPlayableStreams(info.getVideoStreams(), info.getServiceId()), + getPlayableStreams(info.getVideoOnlyStreams(), info.getServiceId()), false, true); final int index; if (videoStreamsList.isEmpty()) { index = -1; @@ -100,7 +100,8 @@ public MediaSource resolve(@NonNull final StreamInfo info) { } // Create optional audio stream source - final List audioStreams = getPlayableStreams(info.getAudioStreams()); + final List audioStreams = getPlayableStreams( + info.getAudioStreams(), info.getServiceId()); final AudioStream audio = audioStreams.isEmpty() ? null : audioStreams.get( ListHelper.getDefaultAudioFormat(context, audioStreams)); diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index f36866025c1..389bcc84fb0 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.util; +import static org.schabi.newpipe.extractor.ServiceList.YouTube; + import android.content.Context; import android.content.SharedPreferences; import android.net.ConnectivityManager; @@ -162,16 +164,19 @@ public static List getUrlAndNonTorrentStreams( * Some formats are not supported. For more info, see {@link #SUPPORTED_ITAG_IDS}. * Torrent streams are also removed, because they cannot be retrieved. * - * @param streamList the original stream list * @param the item type's class that extends {@link Stream} + * @param streamList the original stream list + * @param serviceId * @return a stream list which only contains streams that can be played the player */ @NonNull public static List getPlayableStreams( - @Nullable final List streamList) { + @Nullable final List streamList, final int serviceId) { + final int youtubeServiceId = YouTube.getServiceId(); return getFilteredStreamList(streamList, stream -> stream.getDeliveryMethod() != DeliveryMethod.TORRENT - && (stream.getItagItem() == null + && (serviceId != youtubeServiceId + || stream.getItagItem() == null || SUPPORTED_ITAG_IDS.contains(stream.getItagItem().id))); } From 70b3ba310a8b88b1262249b782f47cbbf57bdfd0 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 20 Apr 2023 10:24:19 +0200 Subject: [PATCH 159/645] Upgrade to Gradle 8.0 --- app/build.gradle | 9 +++++---- build.gradle | 2 +- gradle.properties | 3 +++ gradle/wrapper/gradle-wrapper.properties | 4 ++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6662b38460b..6df7214a0fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -98,10 +98,11 @@ android { } packagingOptions { - // remove two files which belong to jsoup - // no idea how they ended up in the META-INF dir... - exclude 'META-INF/README.md' - exclude 'META-INF/CHANGES' + resources { + // remove two files which belong to jsoup + // no idea how they ended up in the META-INF dir... + excludes += ['META-INF/README.md', 'META-INF/CHANGES'] + } } } diff --git a/build.gradle b/build.gradle index 1384d0a9cef..f5d1a323cee 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.4.0' + classpath 'com.android.tools.build:gradle:8.0.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle.properties b/gradle.properties index 032d70cee99..3b6624de1aa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,7 @@ +android.defaults.buildfeatures.buildconfig=true android.enableJetifier=false +android.nonFinalResIds=false +android.nonTransitiveRClass=false android.useAndroidX=true org.gradle.jvmargs=-Xmx2048M systemProp.file.encoding=utf-8 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5116c5b1869..86eb343672a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip -distributionSha256Sum=f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +distributionSha256Sum=4159b938ec734a8388ce03f52aa8f3c7ed0d31f5438622545de4f83a89b79788 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 6d98ad7abc0e656bcd0359032e03df52801f75d4 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 20 Apr 2023 10:50:48 +0200 Subject: [PATCH 160/645] Further upgrade gradle to 8.1 --- gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 62076 bytes gradle/wrapper/gradle-wrapper.properties | 5 +++-- gradlew | 19 ++++++++++++------- gradlew.bat | 1 + 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832f090a2944b7473328c07c9755baa3196..c1962a79e29d3e0ab67b14947c167a862655af9b 100644 GIT binary patch delta 39834 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 G$^QWPgI3l6 delta 38507 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 Date: Thu, 20 Apr 2023 11:19:21 +0200 Subject: [PATCH 161/645] Fix gradle build for Java 17 and 19 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 3b6624de1aa..7b138b24e7f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,5 +3,5 @@ android.enableJetifier=false android.nonFinalResIds=false android.nonTransitiveRClass=false android.useAndroidX=true -org.gradle.jvmargs=-Xmx2048M +org.gradle.jvmargs=-Xmx2048M --add-opens jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED systemProp.file.encoding=utf-8 From 69ef4a987e92cf393aa44679addbe85bc7070648 Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 20 Apr 2023 11:31:45 +0200 Subject: [PATCH 162/645] Update CI Java version --- .github/workflows/ci.yml | 25 +++++++++++++++---------- app/build.gradle | 6 +++--- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5d12c5a7cc5..67bd469924b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,10 +44,10 @@ jobs: if: github.event_name == 'pull_request' run: git checkout -B ${{ github.head_ref }} - - name: set up JDK 11 + - name: set up JDK 17 uses: actions/setup-java@v3 with: - java-version: 11 + java-version: 17 distribution: "temurin" cache: 'gradle' @@ -66,8 +66,13 @@ jobs: timeout-minutes: 20 strategy: matrix: - # api-level 19 is min sdk, but throws errors related to desugaring - api-level: [ 21, 29 ] + include: + - api-level: 21 + target: default + arch: x86 + - api-level: 33 + target: google_apis # emulator API 33 only exists with Google APIs + arch: x86_64 permissions: contents: read @@ -75,10 +80,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: set up JDK 11 + - name: set up JDK 17 uses: actions/setup-java@v3 with: - java-version: 11 + java-version: 17 distribution: "temurin" cache: 'gradle' @@ -86,8 +91,8 @@ jobs: uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ matrix.api-level }} - # workaround to emulator bug: https://github.com/ReactiveCircus/android-emulator-runner/issues/160 - emulator-build: 7425822 + target: ${{ matrix.target }} + arch: ${{ matrix.arch }} script: ./gradlew connectedCheck --stacktrace - name: Upload test report when tests fail # because the printed out stacktrace (console) is too short, see also #7553 @@ -108,10 +113,10 @@ jobs: with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: 11 # Sonar requires JDK 11 + java-version: 17 distribution: "temurin" cache: 'gradle' diff --git a/app/build.gradle b/app/build.gradle index 6df7214a0fa..b0cd26dd287 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -80,13 +80,13 @@ android { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 encoding 'utf-8' } kotlinOptions { - jvmTarget = JavaVersion.VERSION_11 + jvmTarget = JavaVersion.VERSION_17 } sourceSets { From b567d428ad4617e80a8f085e1833a45b71c3e5e5 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 21 Apr 2023 23:15:37 +0200 Subject: [PATCH 163/645] fix: small codestyle fixes --- .../newpipe/download/DownloadDialog.java | 14 ++-- .../newpipe/player/PlayQueueActivity.java | 3 - .../org/schabi/newpipe/player/Player.java | 83 ++++++++++++------- .../resolver/AudioPlaybackResolver.java | 7 ++ .../newpipe/player/ui/VideoPlayerUi.java | 11 +-- .../org/schabi/newpipe/util/ListHelper.java | 8 +- .../newpipe/util/StreamItemAdapter.java | 6 +- 7 files changed, 80 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 7dd482b214c..e0b1606dc24 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -103,7 +103,7 @@ public class DownloadDialog extends DialogFragment @State AudioTracksWrapper wrappedAudioTracks; @State - int selectedAudioStreamIndex; + int selectedAudioTrackIndex; @State int selectedVideoIndex; // set in the constructor @State @@ -173,7 +173,7 @@ public DownloadDialog(@NonNull final Context context, @NonNull final StreamInfo final List> groupedAudioStreams = ListHelper.getGroupedAudioStreams(context, audioStreams); this.wrappedAudioTracks = new AudioTracksWrapper(groupedAudioStreams, context); - this.selectedAudioStreamIndex = + this.selectedAudioTrackIndex = ListHelper.getDefaultAudioTrackGroup(context, groupedAudioStreams); // TODO: Adapt this code when the downloader support other types of stream deliveries @@ -433,7 +433,7 @@ private void setupAudioTrackSpinner() { } dialogBinding.audioTrackSpinner.setAdapter(audioTrackAdapter); - dialogBinding.audioTrackSpinner.setSelection(selectedAudioStreamIndex); + dialogBinding.audioTrackSpinner.setSelection(selectedAudioTrackIndex); } private void setupAudioSpinner() { @@ -619,8 +619,8 @@ public void onItemSelected(final AdapterView parent, onItemSelectedSetFileName(); break; case R.id.audio_track_spinner: - final boolean trackChanged = selectedAudioStreamIndex != position; - selectedAudioStreamIndex = position; + final boolean trackChanged = selectedAudioTrackIndex != position; + selectedAudioTrackIndex = position; if (trackChanged) { updateSecondaryStreams(); fetchStreamsSize(); @@ -726,10 +726,10 @@ private void setRadioButtonsState(final boolean enabled) { } private StreamSizeWrapper getWrappedAudioStreams() { - if (selectedAudioStreamIndex < 0 || selectedAudioStreamIndex > wrappedAudioTracks.size()) { + if (selectedAudioTrackIndex < 0 || selectedAudioTrackIndex > wrappedAudioTracks.size()) { return StreamSizeWrapper.empty(); } - return wrappedAudioTracks.getTracksList().get(selectedAudioStreamIndex); + return wrappedAudioTracks.getTracksList().get(selectedAudioTrackIndex); } private int getSubtitleIndexBy(@NonNull final List streams) { diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index bf0dc4a56d8..cd71c64e9e8 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -667,11 +667,8 @@ private void onAudioTrackClick(final int itemId) { return; } - player.saveStreamProgressState(); final String newAudioTrack = availableStreams.get(itemId).getAudioTrackId(); - player.setRecovery(); player.setAudioTrack(newAudioTrack); - player.reloadPlayQueueManager(); }); } } diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 144c754a9d1..89bdd9d6949 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -180,13 +180,18 @@ public final class Player implements PlaybackListener, Listener { //////////////////////////////////////////////////////////////////////////*/ // play queue might be null e.g. while player is starting - @Nullable private PlayQueue playQueue; + @Nullable + private PlayQueue playQueue; - @Nullable private MediaSourceManager playQueueManager; + @Nullable + private MediaSourceManager playQueueManager; - @Nullable private PlayQueueItem currentItem; - @Nullable private MediaItemTag currentMetadata; - @Nullable private Bitmap currentThumbnail; + @Nullable + private PlayQueueItem currentItem; + @Nullable + private MediaItemTag currentMetadata; + @Nullable + private Bitmap currentThumbnail; /*////////////////////////////////////////////////////////////////////////// // Player @@ -195,12 +200,17 @@ public final class Player implements PlaybackListener, Listener { private ExoPlayer simpleExoPlayer; private AudioReactor audioReactor; - @NonNull private final DefaultTrackSelector trackSelector; - @NonNull private final LoadController loadController; - @NonNull private final DefaultRenderersFactory renderFactory; + @NonNull + private final DefaultTrackSelector trackSelector; + @NonNull + private final LoadController loadController; + @NonNull + private final DefaultRenderersFactory renderFactory; - @NonNull private final VideoPlaybackResolver videoResolver; - @NonNull private final AudioPlaybackResolver audioResolver; + @NonNull + private final VideoPlaybackResolver videoResolver; + @NonNull + private final AudioPlaybackResolver audioResolver; private final PlayerService service; //TODO try to remove and replace everything with context @@ -225,24 +235,32 @@ public final class Player implements PlaybackListener, Listener { private BroadcastReceiver broadcastReceiver; private IntentFilter intentFilter; - @Nullable private PlayerServiceEventListener fragmentListener = null; - @Nullable private PlayerEventListener activityListener = null; + @Nullable + private PlayerServiceEventListener fragmentListener = null; + @Nullable + private PlayerEventListener activityListener = null; - @NonNull private final SerialDisposable progressUpdateDisposable = new SerialDisposable(); - @NonNull private final CompositeDisposable databaseUpdateDisposable = new CompositeDisposable(); + @NonNull + private final SerialDisposable progressUpdateDisposable = new SerialDisposable(); + @NonNull + private final CompositeDisposable databaseUpdateDisposable = new CompositeDisposable(); // This is the only listener we need for thumbnail loading, since there is always at most only // one thumbnail being loaded at a time. This field is also here to maintain a strong reference, // which would otherwise be garbage collected since Picasso holds weak references to targets. - @NonNull private final Target currentThumbnailTarget; + @NonNull + private final Target currentThumbnailTarget; /*////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////*/ - @NonNull private final Context context; - @NonNull private final SharedPreferences prefs; - @NonNull private final HistoryRecordManager recordManager; + @NonNull + private final Context context; + @NonNull + private final SharedPreferences prefs; + @NonNull + private final HistoryRecordManager recordManager; /*////////////////////////////////////////////////////////////////////////// @@ -334,7 +352,7 @@ public void handleIntent(@NonNull final Intent intent) { isAudioOnly = audioPlayerSelected(); if (intent.hasExtra(PLAYBACK_QUALITY)) { - setPlaybackQuality(intent.getStringExtra(PLAYBACK_QUALITY)); + videoResolver.setPlaybackQuality(intent.getStringExtra(PLAYBACK_QUALITY)); } // Resolve enqueue intents @@ -342,7 +360,7 @@ public void handleIntent(@NonNull final Intent intent) { playQueue.append(newQueue.getStreams()); return; - // Resolve enqueue next intents + // Resolve enqueue next intents } else if (intent.getBooleanExtra(ENQUEUE_NEXT, false) && playQueue != null) { final int currentIndex = playQueue.getIndex(); playQueue.append(newQueue.getStreams()); @@ -914,7 +932,7 @@ public void triggerProgressUpdate() { private Disposable getProgressUpdateDisposable() { return Observable.interval(PROGRESS_LOOP_INTERVAL_MILLIS, MILLISECONDS, - AndroidSchedulers.mainThread()) + AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(ignored -> triggerProgressUpdate(), error -> Log.e(TAG, "Progress update failure: ", error)); @@ -923,7 +941,6 @@ private Disposable getProgressUpdateDisposable() { //endregion - /*////////////////////////////////////////////////////////////////////////// // Playback states //////////////////////////////////////////////////////////////////////////*/ @@ -1247,7 +1264,7 @@ public void onEvents(@NonNull final com.google.android.exoplayer2.Player player, .flatMap(MediaItemTag::getMaybeStreamInfo).orElse(null); final MediaItemTag.AudioTrack previousAudioTrack = Optional.ofNullable(currentMetadata) - .flatMap(MediaItemTag::getMaybeAudioTrack).orElse(null); + .flatMap(MediaItemTag::getMaybeAudioTrack).orElse(null); currentMetadata = tag; if (!currentMetadata.getErrors().isEmpty()) { @@ -1270,9 +1287,9 @@ public void onEvents(@NonNull final com.google.android.exoplayer2.Player player, updateMetadataWith(info); } else if (previousAudioTrack == null || tag.getMaybeAudioTrack() - .map(t -> t.getSelectedAudioStreamIndex() - != previousAudioTrack.getSelectedAudioStreamIndex()) - .orElse(false)) { + .map(t -> t.getSelectedAudioStreamIndex() + != previousAudioTrack.getSelectedAudioStreamIndex()) + .orElse(false)) { notifyAudioTrackUpdateToListeners(); } }); @@ -1361,6 +1378,7 @@ public void onCues(@NonNull final CueGroup cueGroup) { // Errors //////////////////////////////////////////////////////////////////////////*/ //region Errors + /** * Process exceptions produced by {@link com.google.android.exoplayer2.ExoPlayer ExoPlayer}. *

There are multiple types of errors:

@@ -1387,8 +1405,9 @@ public void onCues(@NonNull final CueGroup cueGroup) { * For any error above that is not explicitly catchable, the player will * create a notification so users are aware. * + * * @see com.google.android.exoplayer2.Player.Listener#onPlayerError(PlaybackException) - * */ + */ // Any error code not explicitly covered here are either unrelated to NewPipe use case // (e.g. DRM) or not recoverable (e.g. Decoder error). In both cases, the player should // shutdown. @@ -2141,7 +2160,7 @@ private boolean playQueueManagerReloadingNeeded(final SourceType sourceType, // because the stream source will be probably the same as the current played if (sourceType == SourceType.VIDEO_WITH_SEPARATED_AUDIO || (sourceType == SourceType.VIDEO_WITH_AUDIO_OR_AUDIO_ONLY - && isNullOrEmpty(streamInfo.getAudioStreams()))) { + && isNullOrEmpty(streamInfo.getAudioStreams()))) { // It's not needed to reload the play queue manager only if the content's stream type // is a video stream, a live stream or an ended live stream return !StreamTypeUtil.isVideo(streamType); @@ -2203,12 +2222,18 @@ private boolean isLive() { } public void setPlaybackQuality(@Nullable final String quality) { + saveStreamProgressState(); + setRecovery(); videoResolver.setPlaybackQuality(quality); + reloadPlayQueueManager(); } public void setAudioTrack(@Nullable final String audioTrackId) { + saveStreamProgressState(); + setRecovery(); videoResolver.setAudioTrack(audioTrackId); audioResolver.setAudioTrack(audioTrackId); + reloadPlayQueueManager(); } @@ -2286,7 +2311,7 @@ public PlayerUiList UIs() { /** * Get the video renderer index of the current playing stream. - * + *

* This method returns the video renderer index of the current * {@link MappingTrackSelector.MappedTrackInfo} or {@link #RENDERER_UNAVAILABLE} if the current * {@link MappingTrackSelector.MappedTrackInfo} is null or if there is no video renderer index. diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java index e94295724dc..063a2a2970e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java @@ -38,6 +38,13 @@ public AudioPlaybackResolver(@NonNull final Context context, this.dataSource = dataSource; } + /** + * Get a media source providing audio. If a service has no separate {@link AudioStream}s we + * use a video stream as audio source to support audio background playback. + * + * @param info of the stream + * @return the audio source to use or null if none could be found + */ @Override @Nullable public MediaSource resolve(@NonNull final StreamInfo info) { diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 8aff0af878a..2638ff041a8 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -110,7 +110,8 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa protected PlayerBinding binding; private final Handler controlsVisibilityHandler = new Handler(Looper.getMainLooper()); - @Nullable private SurfaceHolderCallback surfaceHolderCallback; + @Nullable + private SurfaceHolderCallback surfaceHolderCallback; boolean surfaceIsSetup = false; @@ -533,6 +534,7 @@ public void onUpdateProgress(final int currentProgress, /** * Sets the current duration into the corresponding elements. + * * @param currentProgress the current progress, in milliseconds */ private void updatePlayBackElementsCurrentDuration(final int currentProgress) { @@ -545,6 +547,7 @@ private void updatePlayBackElementsCurrentDuration(final int currentProgress) { /** * Sets the video duration time into all control components (e.g. seekbar). + * * @param duration the video duration, in milliseconds */ private void setVideoDurationToControls(final int duration) { @@ -1261,11 +1264,8 @@ private void onQualityItemClick(@NonNull final MenuItem menuItem) { return; } - player.saveStreamProgressState(); final String newResolution = availableStreams.get(menuItemIndex).getResolution(); - player.setRecovery(); player.setPlaybackQuality(newResolution); - player.reloadPlayQueueManager(); binding.qualityTextView.setText(menuItem.getTitle()); } @@ -1285,11 +1285,8 @@ private void onAudioTrackItemClick(@NonNull final MenuItem menuItem) { return; } - player.saveStreamProgressState(); final String newAudioTrack = availableStreams.get(menuItemIndex).getAudioTrackId(); - player.setRecovery(); player.setAudioTrack(newAudioTrack); - player.reloadPlayQueueManager(); binding.audioTrackTextView.setText(menuItem.getTitle()); } diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index f8a800b0e29..b036d55c5ca 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -715,9 +715,9 @@ static Comparator getAudioFormatComparator( /** * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks. * - *

In this order:

+ *

Tracks will be compared this order:

*
    - *
  1. If {@code preferOriginalAudio}: is original audio
  2. + *
  3. If {@code preferOriginalAudio}: use original audio
  4. *
  5. Language matches {@code preferredLanguage}
  6. *
  7. * Track type ranks highest in this order: @@ -752,9 +752,9 @@ private static Comparator getAudioTrackComparator( /** * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks. * - *

    In this order:

    + *

    Tracks will be compared this order:

    *
      - *
    1. If {@code preferOriginalAudio}: is original audio
    2. + *
    3. If {@code preferOriginalAudio}: use original audio
    4. *
    5. Language matches {@code preferredLanguage}
    6. *
    7. * Track type ranks highest in this order: 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 4bcdfd02a36..2eb63ff41c8 100644 --- a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java @@ -224,6 +224,8 @@ private boolean checkHasAnyVideoOnlyStreamWithNoSecondaryStream() { public static class StreamSizeWrapper implements Serializable { private static final StreamSizeWrapper EMPTY = new StreamSizeWrapper<>(Collections.emptyList(), null); + private static final int SIZE_UNSET = -2; + private final List streamsList; private final long[] streamSizes; private final String unknownSize; @@ -251,7 +253,7 @@ public static Single fetchSizeForWrapper( final Callable fetchAndSet = () -> { boolean hasChanged = false; for (final X stream : streamsWrapper.getStreamsList()) { - if (streamsWrapper.getSizeInBytes(stream) > -2) { + if (streamsWrapper.getSizeInBytes(stream) > SIZE_UNSET) { continue; } @@ -270,7 +272,7 @@ public static Single fetchSizeForWrapper( } public void resetSizes() { - Arrays.fill(streamSizes, -2); + Arrays.fill(streamSizes, SIZE_UNSET); } public static StreamSizeWrapper empty() { From 60a5d020182d817c6c56931a92046fdcff9f50f8 Mon Sep 17 00:00:00 2001 From: MBKaba Date: Mon, 24 Apr 2023 10:44:26 +0000 Subject: [PATCH 164/645] =?UTF-8?q?add=20language=20=DF=92=DF=9E=DF=8F=20(?= =?UTF-8?q?nqo)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The translation is already done: https://hosted.weblate.org/projects/newpipe/strings/nqo/ --- app/src/main/res/values/settings_keys.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index f9d0572e80c..f93ed9c4536 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -468,6 +468,7 @@ lt hu nl + nqo no nn uz @@ -548,6 +549,7 @@ Lietuvių Magyar Nederlands + ߒߞߏ Norsk Nynorsk O‘zbek From 85198970896c381bd90380bacc1aaf2ef707ce8f Mon Sep 17 00:00:00 2001 From: Stypox Date: Tue, 25 Apr 2023 18:37:04 +0200 Subject: [PATCH 165/645] Fix ktlint formatter after upgrade to Java 17 See https://github.com/pinterest/ktlint/issues/1195 and https://github.com/ScoopInstaller/Extras/issues/10313. Note that although this should have been fixed in the latest version of ktlint (we are using an old one), the fix doesn't seems to have worked for me. --- app/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 4d350a006e4..8b9659c1fa5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -164,6 +164,7 @@ task runKtlint(type: JavaExec) { getMainClass().set("com.pinterest.ktlint.Main") classpath = configurations.ktlint args "src/**/*.kt" + jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED") } task formatKtlint(type: JavaExec) { @@ -172,6 +173,7 @@ task formatKtlint(type: JavaExec) { getMainClass().set("com.pinterest.ktlint.Main") classpath = configurations.ktlint args "-F", "src/**/*.kt" + jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED") } afterEvaluate { From 43b0167a3a7d97f0a002db2634337faaac95a59d Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 26 Apr 2023 16:01:20 +0200 Subject: [PATCH 166/645] Fix CI command injection vulnerability See https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 67bd469924b..03b04b7c4d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,7 +42,9 @@ jobs: - name: create and checkout branch # push events already checked out the branch if: github.event_name == 'pull_request' - run: git checkout -B ${{ github.head_ref }} + env: + BRANCH: ${{ github.head_ref }} + run: git checkout -B "$BRANCH" - name: set up JDK 17 uses: actions/setup-java@v3 From 60fc662a261b8a966f4be58a7c335878e92c6f1b Mon Sep 17 00:00:00 2001 From: MBKaba Date: Thu, 27 Apr 2023 12:21:59 +0000 Subject: [PATCH 167/645] Update settings_keys.xml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add ߒߞߏ (nqo) language code to Add ߒߞߏ (nqo) language name to --- app/src/main/res/values/settings_keys.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index f93ed9c4536..73f6c30c99b 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -1160,6 +1160,7 @@ ne nl nl-be + nqo oc or pa @@ -1243,6 +1244,7 @@ Nनेपाली Nederlands (NL) Nederlands (BE) + ߒߞߏ Occitan ଓଡ଼ିଆ ਪੰਜਾਬੀ From 4e837e838d08d5447051798dd15e575690d8bcc1 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 1 May 2023 00:02:37 +0200 Subject: [PATCH 168/645] fix docs in app/src/main/java/org/schabi/newpipe/util/Localization.java Co-authored-by: Audric V. <74829229+AudricV@users.noreply.github.com> --- .../org/schabi/newpipe/util/Localization.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java index 9123d377c88..c4034252de3 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -266,14 +266,17 @@ public static String localizeDuration(final Context context, final int durationI /** * Get the localized name of an audio track. - *

      Example:

      - *

      English (original)

      - *

      English (descriptive)

      - *

      Spanish (dubbed)

      * - * @param context used to get app language - * @param track a {@link AudioStream} of the track - * @return localized track name + *

      Examples of results returned by this method:

      + *
        + *
      • English (original)
      • + *
      • English (descriptive)
      • + *
      • Spanish (dubbed)
      • + *
      + * + * @param context the context used to get the app language + * @param track an {@link AudioStream} of the track + * @return the localized name of the audio track */ public static String audioTrackName(final Context context, final AudioStream track) { final String name; From 22671ca16c6d4e2904116d1faebfb6f95b8103ea Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 1 May 2023 00:04:04 +0200 Subject: [PATCH 169/645] fix: audio stream cache key, code fmt --- .../java/org/schabi/newpipe/download/DownloadDialog.java | 4 +--- .../schabi/newpipe/player/resolver/PlaybackResolver.java | 5 +++++ app/src/main/java/org/schabi/newpipe/util/ListHelper.java | 3 ++- .../test/java/org/schabi/newpipe/util/ListHelperTest.java | 6 ++++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index e0b1606dc24..0a92efb937c 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -470,9 +470,7 @@ private void onVideoStreamSelected() { dialogBinding.audioTrackSpinner.setVisibility( isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); dialogBinding.defaultAudioTrackPresentText.setVisibility( - !isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE - - ); + !isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); } private void setupSubtitleSpinner() { diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java index c15447418fd..e204b8372a7 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java @@ -161,6 +161,11 @@ static String cacheKeyOf(final StreamInfo info, final AudioStream audioStream) { cacheKey.append(audioStream.getAudioTrackId()); } + if (audioStream.getAudioLocale() != null) { + cacheKey.append(" "); + cacheKey.append(audioStream.getAudioLocale().getISO3Language()); + } + return cacheKey.toString(); } diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 9c58ed75ec1..f45f3786da9 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -797,7 +797,8 @@ private static Comparator getAudioTrackComparator( * @return Comparator */ static Comparator getAudioTrackComparator( - final Locale preferredLanguage, final boolean preferOriginalAudio, + final Locale preferredLanguage, + final boolean preferOriginalAudio, final boolean preferDescriptiveAudio) { final String langCode = preferredLanguage.getISO3Language(); final List trackTypeRanking = preferDescriptiveAudio diff --git a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java index b4a4167cf02..c7c36eadc62 100644 --- a/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java +++ b/app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java @@ -451,8 +451,10 @@ private static AudioStream generateAudioStream(@NonNull final String id, } private static AudioStream generateAudioTrack( - @NonNull final String id, @Nullable final String trackId, - @Nullable final Locale locale, @Nullable final AudioTrackType trackType) { + @NonNull final String id, + @Nullable final String trackId, + @Nullable final Locale locale, + @Nullable final AudioTrackType trackType) { return new AudioStream.Builder() .setId(id) .setContent("", true) From fb00ee8cf9012358d7a0ebf7682bf34d9db2e752 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 1 May 2023 19:26:42 +0200 Subject: [PATCH 170/645] [YouTube] Improve download speed (#9948) --- .../giga/get/DownloadInitializer.java | 8 +++--- .../java/us/shandian/giga/util/Utility.java | 27 ++++++++++++++++--- 2 files changed, 28 insertions(+), 7 deletions(-) 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 7c0fa90124f..1d5a9358884 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadInitializer.java @@ -54,12 +54,12 @@ public void run() { long lowestSize = Long.MAX_VALUE; for (int i = 0; i < mMission.urls.length && mMission.running; i++) { - mConn = mMission.openConnection(mMission.urls[i], true, -1, -1); + mConn = mMission.openConnection(mMission.urls[i], true, 0, 0); mMission.establishConnection(mId, mConn); dispose(); if (Thread.interrupted()) return; - long length = Utility.getContentLength(mConn); + long length = Utility.getTotalContentLength(mConn); if (i == 0) { httpCode = mConn.getResponseCode(); @@ -84,14 +84,14 @@ public void run() { } } else { // ask for the current resource length - mConn = mMission.openConnection(true, -1, -1); + mConn = mMission.openConnection(true, 0, 0); mMission.establishConnection(mId, mConn); dispose(); if (!mMission.running || Thread.interrupted()) return; httpCode = mConn.getResponseCode(); - mMission.length = Utility.getContentLength(mConn); + mMission.length = Utility.getTotalContentLength(mConn); } if (mMission.length == 0 || httpCode == 204) { diff --git a/app/src/main/java/us/shandian/giga/util/Utility.java b/app/src/main/java/us/shandian/giga/util/Utility.java index ecce6639e97..3cfa22bd9f6 100644 --- a/app/src/main/java/us/shandian/giga/util/Utility.java +++ b/app/src/main/java/us/shandian/giga/util/Utility.java @@ -1,11 +1,8 @@ package us.shandian.giga.util; -import android.content.ClipData; -import android.content.ClipboardManager; import android.content.Context; import android.os.Build; import android.util.Log; -import android.widget.Toast; import androidx.annotation.ColorInt; import androidx.annotation.DrawableRes; @@ -29,8 +26,10 @@ import java.io.Serializable; import java.net.HttpURLConnection; import java.util.Locale; +import java.util.Random; import okio.ByteString; +import us.shandian.giga.get.DownloadMission; public class Utility { @@ -232,6 +231,28 @@ public static long getContentLength(HttpURLConnection connection) { return -1; } + /** + * Get the content length of the entire file even if the HTTP response is partial + * (response code 206). + * @param connection http connection + * @return content length + */ + public static long getTotalContentLength(final HttpURLConnection connection) { + try { + if (connection.getResponseCode() == 206) { + final String rangeStr = connection.getHeaderField("Content-Range"); + final String bytesStr = rangeStr.split("/", 2)[1]; + return Long.parseLong(bytesStr); + } else { + return getContentLength(connection); + } + } catch (Exception err) { + // nothing to do + } + + return -1; + } + private static String pad(int number) { return number < 10 ? ("0" + number) : String.valueOf(number); } From d89a3c6c4d6f3bd4045e7a55732f2249b0e6275b Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Tue, 2 May 2023 00:11:09 +0200 Subject: [PATCH 171/645] Remove "default" from audio track already present message We don't know if, on muxed video streams we get for all services which support multiple audio languages, that the audio language returned is the original one or not, even if it should be the case. In order to avoid saying potential false information, this word has been removed from the string resource (ID and value) and the corresponding layout ID in the download dialog. --- .../java/org/schabi/newpipe/download/DownloadDialog.java | 6 +++--- app/src/main/res/layout/download_dialog.xml | 6 +++--- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 0a92efb937c..88a3484d928 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -448,7 +448,7 @@ private void setupAudioSpinner() { dialogBinding.audioStreamSpinner.setVisibility(View.VISIBLE); dialogBinding.audioTrackSpinner.setVisibility( wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); - dialogBinding.defaultAudioTrackPresentText.setVisibility(View.GONE); + dialogBinding.audioTrackPresentInVideoText.setVisibility(View.GONE); } private void setupVideoSpinner() { @@ -469,7 +469,7 @@ private void onVideoStreamSelected() { dialogBinding.audioTrackSpinner.setVisibility( isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); - dialogBinding.defaultAudioTrackPresentText.setVisibility( + dialogBinding.audioTrackPresentInVideoText.setVisibility( !isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE); } @@ -484,7 +484,7 @@ private void setupSubtitleSpinner() { setRadioButtonsState(true); dialogBinding.audioStreamSpinner.setVisibility(View.GONE); dialogBinding.audioTrackSpinner.setVisibility(View.GONE); - dialogBinding.defaultAudioTrackPresentText.setVisibility(View.GONE); + dialogBinding.audioTrackPresentInVideoText.setVisibility(View.GONE); } diff --git a/app/src/main/res/layout/download_dialog.xml b/app/src/main/res/layout/download_dialog.xml index 6b0a36cc8e4..67aa1577c0c 100644 --- a/app/src/main/res/layout/download_dialog.xml +++ b/app/src/main/res/layout/download_dialog.xml @@ -94,7 +94,7 @@ tools:visibility="gone" /> , Toggle all Streams which are not yet supported by the downloader are not shown - The default audio track should be already present in this stream + An audio track should be already present in this stream The selected stream is not supported by external players No audio streams are available for external players No video streams are available for external players From 023f6166abf7e566662ccf88e5f11164cc838a3e Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Tue, 2 May 2023 00:18:46 +0200 Subject: [PATCH 172/645] Add Open in browser button to audio external players dialog This change makes the dialog consistent with the video one. --- .../schabi/newpipe/fragments/detail/VideoDetailFragment.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index d8b2b43a59d..8227f1c69f2 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 @@ -2166,12 +2166,13 @@ private void showExternalAudioPlaybackDialog() { if (audioTracks.isEmpty()) { Toast.makeText(activity, R.string.no_audio_streams_available_for_external_players, Toast.LENGTH_SHORT).show(); - } else if (audioTracks.size() == 1) { startOnExternalPlayer(activity, currentInfo, audioTracks.get(0)); } else { final AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(R.string.select_audio_track_external_players); + builder.setNeutralButton(R.string.open_in_browser, (dialog, i) -> + ShareUtils.openUrlInBrowser(requireActivity(), url)); final int selectedAudioStream = ListHelper.getDefaultAudioFormat(activity, audioTracks); From 10c42de2f16a5e2162d718ce431a36020506d71e Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 3 May 2023 10:28:24 +0200 Subject: [PATCH 173/645] Fix uploader and subchannel avatars swapped --- .../fragments/detail/VideoDetailFragment.java | 54 +++++++------------ .../fragment_video_detail.xml | 12 ++--- .../main/res/layout/fragment_video_detail.xml | 12 ++--- 3 files changed, 30 insertions(+), 48 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 8227f1c69f2..3c07b1a93c6 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 @@ -61,7 +61,6 @@ import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.tabs.TabLayout; -import com.squareup.picasso.Callback; import org.schabi.newpipe.App; import org.schabi.newpipe.R; @@ -649,27 +648,6 @@ protected void initListeners() { } } - private void initThumbnailViews(@NonNull final StreamInfo info) { - PicassoHelper.loadDetailsThumbnail(info.getThumbnailUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) - .into(binding.detailThumbnailImageView, new Callback() { - @Override - public void onSuccess() { - // nothing to do, the image was loaded correctly into the thumbnail - } - - @Override - public void onError(final Exception e) { - showSnackBarError(new ErrorInfo(e, UserAction.LOAD_IMAGE, - info.getThumbnailUrl(), info)); - } - }); - - PicassoHelper.loadAvatar(info.getSubChannelAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) - .into(binding.detailSubChannelThumbnailView); - PicassoHelper.loadAvatar(info.getUploaderAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) - .into(binding.detailUploaderThumbnailView); - } - /*////////////////////////////////////////////////////////////////////////// // OwnStack //////////////////////////////////////////////////////////////////////////*/ @@ -1480,12 +1458,9 @@ public void handleResult(@NonNull final StreamInfo info) { binding.detailSubChannelThumbnailView.setVisibility(View.GONE); if (!isEmpty(info.getSubChannelName())) { - displayBothUploaderAndSubChannel(info, activity); - } else if (!isEmpty(info.getUploaderName())) { - displayUploaderAsSubChannel(info, activity); + displayBothUploaderAndSubChannel(info); } else { - binding.detailUploaderTextView.setVisibility(View.GONE); - binding.detailUploaderThumbnailView.setVisibility(View.GONE); + displayUploaderAsSubChannel(info); } final Drawable buddyDrawable = @@ -1559,7 +1534,8 @@ public void handleResult(@NonNull final StreamInfo info) { binding.detailSecondaryControlPanel.setVisibility(View.GONE); checkUpdateProgressInfo(info); - initThumbnailViews(info); + PicassoHelper.loadDetailsThumbnail(info.getThumbnailUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailThumbnailImageView); showMetaInfoInTextView(info.getMetaInfo(), binding.detailMetaInfoTextView, binding.detailMetaInfoSeparator, disposables); @@ -1596,27 +1572,30 @@ public void handleResult(@NonNull final StreamInfo info) { noVideoStreams ? R.drawable.ic_headset_shadow : R.drawable.ic_play_arrow_shadow); } - private void displayUploaderAsSubChannel(final StreamInfo info, final Context context) { + private void displayUploaderAsSubChannel(final StreamInfo info) { binding.detailSubChannelTextView.setText(info.getUploaderName()); binding.detailSubChannelTextView.setVisibility(View.VISIBLE); binding.detailSubChannelTextView.setSelected(true); if (info.getUploaderSubscriberCount() > -1) { binding.detailUploaderTextView.setText( - Localization.shortSubscriberCount(context, info.getUploaderSubscriberCount())); + Localization.shortSubscriberCount(activity, info.getUploaderSubscriberCount())); binding.detailUploaderTextView.setVisibility(View.VISIBLE); } else { binding.detailUploaderTextView.setVisibility(View.GONE); } + + PicassoHelper.loadAvatar(info.getUploaderAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailSubChannelThumbnailView); + binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE); + binding.detailUploaderThumbnailView.setVisibility(View.GONE); } - private void displayBothUploaderAndSubChannel(final StreamInfo info, final Context context) { + private void displayBothUploaderAndSubChannel(final StreamInfo info) { binding.detailSubChannelTextView.setText(info.getSubChannelName()); binding.detailSubChannelTextView.setVisibility(View.VISIBLE); binding.detailSubChannelTextView.setSelected(true); - binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE); - final StringBuilder subText = new StringBuilder(); if (!isEmpty(info.getUploaderName())) { subText.append( @@ -1627,7 +1606,7 @@ private void displayBothUploaderAndSubChannel(final StreamInfo info, final Conte subText.append(Localization.DOT_SEPARATOR); } subText.append( - Localization.shortSubscriberCount(context, info.getUploaderSubscriberCount())); + Localization.shortSubscriberCount(activity, info.getUploaderSubscriberCount())); } if (subText.length() > 0) { @@ -1637,6 +1616,13 @@ private void displayBothUploaderAndSubChannel(final StreamInfo info, final Conte } else { binding.detailUploaderTextView.setVisibility(View.GONE); } + + PicassoHelper.loadAvatar(info.getSubChannelAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailSubChannelThumbnailView); + binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE); + PicassoHelper.loadAvatar(info.getUploaderAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + .into(binding.detailUploaderThumbnailView); + binding.detailUploaderThumbnailView.setVisibility(View.VISIBLE); } public void openDownloadDialog() { diff --git a/app/src/main/res/layout-large-land/fragment_video_detail.xml b/app/src/main/res/layout-large-land/fragment_video_detail.xml index 9fdede902f3..d18681056f1 100644 --- a/app/src/main/res/layout-large-land/fragment_video_detail.xml +++ b/app/src/main/res/layout-large-land/fragment_video_detail.xml @@ -267,23 +267,21 @@ android:layout_height="wrap_content"> + app:shapeAppearance="@style/CircularImageView" /> diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index 438c618efc6..9aaf6d8d6c6 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -254,24 +254,22 @@ android:layout_height="wrap_content"> + tools:ignore="RtlHardcoded" /> From 9866eab60fc64ef46e8e4a82f22553bbef764352 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 3 May 2023 11:18:12 +0200 Subject: [PATCH 174/645] Update Android Gradle Plugin to 8.0.1 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ae41b1c8987..f5033c64864 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.0.0' + classpath 'com.android.tools.build:gradle:8.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong From 0bb3e7cb86f336aee00795e9fba914fb8e03e390 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 6 May 2023 01:47:58 +0200 Subject: [PATCH 175/645] Translated using Weblate (Belarusian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 6.7% (5 of 74 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Czech) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Italian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 12.9% (86 of 664 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 99.3% (660 of 664 strings) Translated using Weblate (Estonian) Currently translated at 99.6% (662 of 664 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Polish) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Greek) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Russian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (German) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 0.0% (0 of 74 strings) Translated using Weblate (N’Ko) Currently translated at 8.9% (59 of 661 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Greek) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Vietnamese) Currently translated at 99.6% (659 of 661 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (661 of 661 strings) Added translation using Weblate (N’Ko) Translated using Weblate (Bambara) Currently translated at 0.1% (1 of 661 strings) Translated using Weblate (Bambara) Currently translated at 1.3% (1 of 74 strings) Translated using Weblate (Czech) Currently translated at 100.0% (74 of 74 strings) Added translation using Weblate (Bambara) Merge branch 'origin/dev' into Weblate. Translated using Weblate (Estonian) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (661 of 661 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (661 of 661 strings) Co-authored-by: Agnieszka C Co-authored-by: Alexthegib Co-authored-by: Allan Nordhøy Co-authored-by: Bakary Kaba Co-authored-by: Bdd55oo Co-authored-by: Edward Co-authored-by: Eric Co-authored-by: Fjuro Co-authored-by: Hosted Weblate Co-authored-by: Hoàng Lâm Lê Co-authored-by: Igor Nedoboy Co-authored-by: Igor Rückert Co-authored-by: Ihor Hordiichuk Co-authored-by: Jeff Huang Co-authored-by: Linerly Co-authored-by: Nidi Co-authored-by: Olivia Ng Co-authored-by: Priit Jõerüüt Co-authored-by: Retrial Co-authored-by: Rex_sa Co-authored-by: Vasilis K Co-authored-by: VfBFan Co-authored-by: Weblate Co-authored-by: Yaron Shahrabani Co-authored-by: gallegonovato Co-authored-by: mono Co-authored-by: random r Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/be/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/bm/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nqo/ Translation: NewPipe/Metadata Translated using Weblate (German) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (French) Currently translated at 99.3% (660 of 664 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Catalan) Currently translated at 93.2% (619 of 664 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Sardinian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 41.4% (275 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 4.0% (3 of 74 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nqo/ Translated using Weblate (Dutch) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Turkish) Currently translated at 99.3% (660 of 664 strings) Translated using Weblate (Georgian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 67.9% (451 of 664 strings) Translated using Weblate (French) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (French) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Polish) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Odia) Currently translated at 98.9% (657 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 84.6% (562 of 664 strings) Translated using Weblate (Odia) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Odia) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Italian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Turkish) Currently translated at 99.5% (661 of 664 strings) Translated using Weblate (Odia) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Czech) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Odia) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (Odia) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (French) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (German) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 100.0% (664 of 664 strings) Translated using Weblate (N’Ko) Currently translated at 5.4% (4 of 74 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nqo/ Translated using Weblate (N’Ko) Currently translated at 9.4% (7 of 74 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nqo/ --- app/src/main/res/values-ar/strings.xml | 9 +- app/src/main/res/values-az/strings.xml | 7 + app/src/main/res/values-be/strings.xml | 9 +- app/src/main/res/values-bm/strings.xml | 4 + app/src/main/res/values-ca/strings.xml | 10 +- app/src/main/res/values-cs/strings.xml | 9 +- app/src/main/res/values-de/strings.xml | 9 +- app/src/main/res/values-el/strings.xml | 9 +- app/src/main/res/values-es/strings.xml | 7 + app/src/main/res/values-et/strings.xml | 7 + app/src/main/res/values-fr/strings.xml | 31 +- app/src/main/res/values-he/strings.xml | 17 +- app/src/main/res/values-hi/strings.xml | 9 +- app/src/main/res/values-in/strings.xml | 7 + app/src/main/res/values-it/strings.xml | 13 +- app/src/main/res/values-ja/strings.xml | 9 +- app/src/main/res/values-ka/strings.xml | 70 +- app/src/main/res/values-nb-rNO/strings.xml | 19 +- app/src/main/res/values-nl/strings.xml | 21 +- app/src/main/res/values-nqo/strings.xml | 732 ++++++++++++++++++ app/src/main/res/values-or/strings.xml | 49 +- app/src/main/res/values-pa/strings.xml | 7 + app/src/main/res/values-pl/strings.xml | 13 +- app/src/main/res/values-pt-rBR/strings.xml | 7 + app/src/main/res/values-pt-rPT/strings.xml | 7 + app/src/main/res/values-pt/strings.xml | 7 + app/src/main/res/values-ro/strings.xml | 16 +- app/src/main/res/values-ru/strings.xml | 19 +- app/src/main/res/values-sc/strings.xml | 7 + app/src/main/res/values-sv/strings.xml | 58 +- app/src/main/res/values-tr/strings.xml | 20 +- app/src/main/res/values-uk/strings.xml | 11 +- app/src/main/res/values-vi/strings.xml | 13 +- app/src/main/res/values-zh-rCN/strings.xml | 7 + app/src/main/res/values-zh-rHK/strings.xml | 310 ++++---- app/src/main/res/values-zh-rTW/strings.xml | 7 + .../metadata/android/be/changelogs/65.txt | 26 + .../metadata/android/bm/short_description.txt | 1 + .../metadata/android/cs/short_description.txt | 2 +- .../metadata/android/nqo/changelogs/63.txt | 8 + .../metadata/android/nqo/changelogs/64.txt | 8 + .../metadata/android/nqo/changelogs/65.txt | 26 + .../metadata/android/nqo/changelogs/66.txt | 33 + .../metadata/android/nqo/changelogs/68.txt | 31 + .../metadata/android/nqo/full_description.txt | 1 + .../android/nqo/short_description.txt | 1 + 46 files changed, 1427 insertions(+), 276 deletions(-) create mode 100644 app/src/main/res/values-bm/strings.xml create mode 100644 app/src/main/res/values-nqo/strings.xml create mode 100644 fastlane/metadata/android/be/changelogs/65.txt create mode 100644 fastlane/metadata/android/bm/short_description.txt create mode 100644 fastlane/metadata/android/nqo/changelogs/63.txt create mode 100644 fastlane/metadata/android/nqo/changelogs/64.txt create mode 100644 fastlane/metadata/android/nqo/changelogs/65.txt create mode 100644 fastlane/metadata/android/nqo/changelogs/66.txt create mode 100644 fastlane/metadata/android/nqo/changelogs/68.txt create mode 100644 fastlane/metadata/android/nqo/full_description.txt create mode 100644 fastlane/metadata/android/nqo/short_description.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 97717799699..e3b5245b3a7 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -46,7 +46,7 @@ خطأ تعذر تحليل الموقع تعذر فك تشفير توقيع رابط الفيديو - اضغط على العدسة المكبرة للبدء. + اضغط على \"العدسة المكبرة\" للبدء. اشتراك مشترك الاشتراكات @@ -792,4 +792,11 @@ إزالة التكرارات؟ إظهار التدفقات التالية شاهدت بالكامل + إجراء الإيماءة اليسرى + اجراء الإيماءة اليمنى + السطوع + بدون + اختر إيماءة للنصف الأيسر من شاشة المشغل + اختر إيماءة للنصف الأيمن من شاشة المشغل + مستوى الصوت \ No newline at end of file diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 14e915a9e3d..04201fa52aa 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -740,4 +740,11 @@ Qismən baxılıb Bu pleylistdəki bütün dublikat yayımları silmək istəyirsiniz\? Yaxınlaşan + Sol jest hərəkəti + Oynadıcı ekranının sağ yarısı üçün jest seç + Sağ jest hərəkəti + Parlaqlıq + Səs səviyyəsi + Heç biri + Oynadıcı ekranının sol yarısı üçün jest seç \ No newline at end of file diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 7bbe49ebd26..808e2b0c54a 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -3,7 +3,7 @@ Націсніце «Пошук», каб пачаць. Апублікавана %1$s Патокавы прайгравальнік не знойдзены. Усталяваць VLC\? - Патокавы плэер не знойдзены (вы можаце ўсталяваць VLC). + Патокавы плэер не знойдзены (вы можаце ўсталяваць VLC каб прайграць). Усталяваць Скасаваць Адкрыць у браўзеры @@ -765,4 +765,11 @@ Прыватнасць Мова Падтрымка + Дзеянне левага жэсту + Дзеянне правага жэсту + Яркасць + Нічога + Выбраць жэст для левай часткі экрана прайгравання + Гук + Выбраць жэст для правай часткі экрана прайгравання \ No newline at end of file diff --git a/app/src/main/res/values-bm/strings.xml b/app/src/main/res/values-bm/strings.xml new file mode 100644 index 00000000000..62f8281ab08 --- /dev/null +++ b/app/src/main/res/values-bm/strings.xml @@ -0,0 +1,4 @@ + + + ߥߊߘߏ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬. + \ No newline at end of file diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index ac25b29923a..a690fe13265 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -114,7 +114,7 @@ Mostra resolucions superiors Només alguns dispositius poden reproduir vídeos en 2K/4K Reprodueix amb el Kodi - No s\'ha trobat l\'aplicació Kode. Voleu instal·lar-la\? + No s\'ha trobat l\'aplicació Kore. Voleu instal·lar-la\? Mostra «Reprodueix amb el Kodi» Mostra una opció per reproduir un vídeo amb el centre multimèdia Kodi Reproductor emergent intel·ligent @@ -574,8 +574,8 @@ Tercer botó d\'acció Segon botó d\'acció Primer botó d\'acció - Escala la miniatura del vídeo mostrat a la notificació de 16:9 a raó d\'1:1 (pot causar deformacions) - Escala a raó d\'1:1 + Retalla la miniatura del vídeo mostrat a la notificació de 16:9 a 1:1 + Retalla la miniatura amb una relació d\'aspecte 1:1 Mostrant resultats per a: %s Capítols Descripció @@ -702,4 +702,8 @@ Ordenar Configura la notificació de reproducció actual. Canvia la mida de l\'interval de càrrega (actualment %s). Un valor inferior pot accelerar la càrrega inicial del vídeo. Els canvis requereixen un reinici del jugador. + Ignora els esdeveniments dels botons de reproducció físics + Útil, per exemple, si feu servir uns auriculars amb els botons físicament trencats + Trieu un gest per la part esquerra de la pantalla + Mida de l\'interval de càrrega de reproducció \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 68fa32c3c02..f6bc2cfa2ed 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -550,7 +550,7 @@ Nikdy Pouze na Wi-Fi Automaticky zahájit přehrávání — %s - Přehrát frontu + Fronta přehravání Nelze rozpoznat zadanou adresu URL. Otevřít pomocí jiné aplikace\? Automatické přehravání Fronta aktivního přehrávače bude smazána @@ -753,4 +753,11 @@ Nadcházející Odstranit duplicity Chcete odstranit všechny duplicitní streamy v tomto playlistu\? + Akce levého gesta + Akce pravého gesta + Hlasitost + Žádné + Vyberte gesto pro levou polovinu obrazovky přehrávače + Jas + Vyberte gesto pro pravou polovinu obrazovky přehrávače \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 14fbbc0570d..77243f37d33 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -318,7 +318,7 @@ 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. + Um der europäischen Datenschutz-Grundverordnung (DSGVO) gerecht zu werden, weisen wir hiermit auf NewPipes Datenschutzerklärung hin. Bitte lies sie sorgfältig durch. \nDu musst den Datenschutzrichtlinien zustimmen, um den Fehlerbericht an uns zu senden. Unbegrenzt Auflösung bei Verwendung mobiler Daten begrenzen @@ -740,4 +740,11 @@ Demnächst Vollständig angeschaut Teilweise angeschaut + Geste für die linke Hälfte des Player-Bildschirms auswählen + Geste für die rechte Hälfte des Player-Bildschirms auswählen + Keine + Rechte Gestenaktion + Linke Gestenaktion + Helligkeit + Lautstärke \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 83df4f5a415..091dd25cbdb 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -96,7 +96,7 @@ Εκκαθάριση προσωρινά αποθηκευμένων μεταδεδομένων Αφαίρεση όλων των προσωρινά αποθηκευμένων δεδομένων ιστοσελίδων Η προσωρινή μνήμη μεταδεδομένων εκκαθαρίστηκε - Αυτόματη πρόσθεση της επόμενης ροής στην ουρά + Αυτόματη προσθήκη της επόμενης ροής στην ουρά Συνέχεια της τρέχουσας (μη επαναλαμβανόμενης) ουράς μετά τη λήξη της, με την προσθήκη μιας σχετικής ροής Επιλογή των προτάσεων που εμφανίζονται κατά την αναζήτηση Αποθήκευση αναζητήσεων στη συσκευή @@ -740,4 +740,11 @@ Θέλετε να καταργήσετε όλες τις διπλότυπες ροές σε αυτήν τη λίστα αναπαραγωγής; Αφαίρεση διπλοτύπων Θεαθέντα μερικώς + Επιλέξτε χειρονομία για το αριστερό μισό της οθόνης του προγράμματος αναπαραγωγής + Ενέργεια αριστερής χειρονομίας + Επιλέξτε χειρονομία για το δεξί μισό της οθόνης του προγράμματος αναπαραγωγής + Ενέργεια δεξιάς χειρονομίας + Φωτεινότητα + Ένταση + Καμία \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 239bfa81cfa..d4087640e69 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -756,4 +756,11 @@ Eliminar los duplicados Completamente visto Parcialmente visto + Acción del gesto en la izquierda + Acción del gesto a la derecha + Brillo + Volumen + Ninguno + Elige un gesto para la mitad izquierda de la pantalla del reproductor + Elige un gesto para la mitad derecha de la pantalla del reproductor \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 07b52d9d298..a2056cba7e9 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -740,4 +740,11 @@ Tulemas Lõpuni vaadatud Osaliselt vaadatud + Toiming viipel vasakul poolel + Helitugevus + Määratlemata + Vali viibe meediamängija ekraani vasaku poole jaoks + Eredus + Vali viibe meediamängija ekraani parema poole jaoks + Toiming viipel paremal poolel \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 496a23b65ad..742c13c007f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -257,7 +257,7 @@ Le nom du fichier ne peut pas être vide Une erreur est survenue : %1$s Télécharger le flux - Ajout automatique du flux suivant à la file + Ajout automatique du flux suivant à la file de lecture Continue la file de lecture (non répétitive) en ajoutant un flux lié Débogage Remplir @@ -556,7 +556,7 @@ Démarrer la lecture automatiquement — %s Liste de lecture Impossible de reconnaitre l’URL fournie. Voulez-vous l’ouvrir avec une autre application \? - Ajout automatique à la file + Ajout auto. à la file La file de lecture du lecteur actif sera remplacée Confirmer avant de supprimer une file de lecture Rien @@ -672,8 +672,8 @@ Balayez un élément pour le supprimer Ne pas lancer les vidéos dans le mini lecteur mais directement en plein écran si la rotation automatique est verrouillée. Vous pouvez toujours accéder au mini-lecteur en quittant le mode plein écran Lancer le lecteur principal en plein écran - Placer en suivant dans la file - Placé en suivant dans la file + Ajouter à la file de lecture + Ajouté à la file de lecture Traitement en cours… Veuillez patienter Vérifier manuellement de nouvelles versions Vérification des mises à jour… @@ -720,13 +720,13 @@ Tout basculer Pourcent Demi-ton - Les flux qui ne sont pas encore supportés ne sont pas montrés - Aucun flux audio n\'est disponible pour les lecteurs externes + Les flux qui ne sont pas encore pris en charge ne sont pas montrés + Aucun flux audio n’est disponible pour les lecteurs externes Sélectionner la qualité pour les lecteurs externes Format inconnu Qualité inconnue - Le flux séléctionné n\'est pas supporté par les lecteurs externes - Aucun flux vidéo n\'est disponible pour les lecteurs externes + Le flux sélectionné n’est pas pris en charge par les lecteurs externes + Aucun flux vidéo n’est disponible pour les lecteurs externes Taille de l\'intervalle de chargement de la lecture Afficher les éléments à venir Masquer les éléments visionnés @@ -743,16 +743,23 @@ Cette option est disponible seulement si %s est sélectionné pour le thème Les listes de lecture grisées contiennent déjà cet élément. Carte - Utile si vous utilisez un casque avec des boutons dysfonctionnels, par exemple + Utile si, par exemple, vous utilisez un casque avec des boutons dysfonctionnels Effacer les doublons - Effacer les doublons \? - Voulez-vous retirer tous les doublons de cette liste \? + Effacer les doublons \? + Voulez-vous retirer tous les doublons de cette liste \? Afficher les flux suivants Entièrement vu Partiellement vu À venir - Ignorer les évènements des boutons média des périphériques + Ignorer les évènements des boutons média physiques Doublon ajouté %d fois Afficher/Cacher les flux Enlever la miniature permanente + Choisir le geste pour la moitié gauche de l’écran du lecteur + Action du geste vers la gauche + Choisir le geste pour la moitié droite de l’écran du lecteur + Volume + Aucune + Action du geste vers la droite + Luminosité \ No newline at end of file diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index b1989b842b2..f1eee568ed8 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -560,7 +560,7 @@ אף פעם לא רק עם רשת אלחוטית להתחיל לנגן אוטומטית — %s - לנגן את התור + תור נגינה לא ניתן לזהות את הכתובת. לפתוח אותה ביישומון אחר\? סידור אוטומטי בתור התור מהנגן הפעיל יוחלף @@ -758,4 +758,19 @@ הכפיל נוסף %d פעמים התעלמות מאירועי כפתורי מדיה חומרתיים שימושי, למשל, אם יש לך אוזניות עם כפתורי חומרה מקולקלים + פעולת מחווה שמאלית + פעולת מחווה ימנית + עוצמת שמע + בלי + להסיר את כל השידורים הכפולים ברשימת הנגינה\? + נצפו חלקית + בקרוב + בהירות + נא לבחור מחווה לחצי השמאלי של מסך הנגן + נא לבחור מחווה לחצי הימני של מסך הנגן + הסרת כפילויות + להסיר כפילויות\? + נצפו במלואם + להציג את השידורים הבאים + להציג/להסתיר שידורים \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 86e7a98d078..f2e97d28b1a 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -58,7 +58,7 @@ उच्च गुणवत्ता स्तर दिखाएं केवल कुछ ही डिवाईस 2के/4के मे वीडियो चला सकते हैं कोडी मे चलाए - लापता Kode ऐप स्थापित करें\? + गैर- मौजूदा Kore ऐप स्थापित करें\? \"कोडी मे चलाएं\" वाला विकल्प दिखाएँ कोडी मीडिया सेंटर से वीडियो चलने के लिए विकल्प प्रदर्शित करें प्रथम स्थापित ध्वनि फॉर्मेट @@ -741,4 +741,11 @@ स्ट्रीम दिखाएँ / छिपाएँ पूरा देखा आंशिक रूप से देखा गया + बाएँ इशारा क्रिया + चमक + आवाज + कोई नहीं + प्लेयर स्क्रीन के बाएँ आधे हिस्से के लिए जेस्चर चुनें + प्लेयर स्क्रीन के दाहिने आधे हिस्से के लिए जेस्चर चुनें + दाएँ इशारा क्रिया \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 985544fe4cd..bffd486a016 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -727,4 +727,11 @@ Hapus duplikat\? Apakah Anda ingin menghapus semua saluran duplikat di daftar putar ini\? Tampilkan saluran berikut + Pilih gestur untuk bagian kiri dari layar pemutar + Tindakan gestur kiri + Tidak ada + Pilih gestur untuk bagian kanan dari layar pemutar + Tindakan gestur kanan + Kecerahan + Volume \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index aff0b3bee16..68aca05cb6c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -750,7 +750,14 @@ Rimuovere tutti gli elementi doppi di questa playlist\? Mostra gli elementi seguenti Mostra/Nascondi elementi - Visto parzialmente - Visto completamente - Prossimamente + Visti parzialmente + Visti completamente + Elementi futuri + Azione gesto sinistro + Azione gesto destro + Luminosità + Volume + Scegli il gesto per la metà sinistra del riproduttore + Nessuno + Scegli il gesto per la metà destra del riproduttore \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index fafbf91f909..be3874247de 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -16,7 +16,7 @@ 動画ファイルをダウンロードするフォルダーを選択して下さい デフォルトの画質 Kodi で再生 - Kode をインストールしますか? + インストールされてない Kore アプリをインストールしますか? 「Kodi で再生」オプションを表示 Kodi メディアセンター経由で動画を再生するための設定を表示します 音声 @@ -727,4 +727,11 @@ 完全に視聴済み 一部視聴済み 今後 + 再生画面の左半分用にジェスチャーを選択 + 左のジェスチャー動作 + 再生画面の右半分用のジェスチャーを選択 + 右のジェスチャー動作 + 明るさ + 音量 + \ No newline at end of file diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 9ba01e672f9..8574ee3b699 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -1,7 +1,7 @@ ნაკადის პლეერი ვერ მოიძებნა (მის დასაკრავად შეგიძლიათ დააინსტალიროთ VLC). - "ნაკადის მოთამაშე ვერ მოიძებნა. დააინსტალირე VLC\?" + ნაკადის მოთამაშე ვერ მოიძებნა. დააყენეთ VLC\? გაუქმება გააზიარეთ როგორც გამოიყენეთ გარე ვიდეო დამკვრელი @@ -18,7 +18,7 @@ დაარტყა დამკვრელი ესკიზის ჩამოჭრა ასპექტის თანაფარდობაზე 1:1 თქვენ შეგიძლიათ აირჩიოთ მაქსიმუმ სამი მოქმედება კომპაქტურ შეტყობინებაში საჩვენებლად! - "შეცვალეთ თითოეული შეტყობინებების მოქმედება ქვემოთ მასზე შეხებით. აირჩიეთ მაქსიმუმ სამი მათგანი, რომლებიც ნაჩვენები იქნება კომპაქტურ შეტყობინებაში მარჯვნივ მდებარე ველების გამოყენებით" + შეცვალეთ თითოეული შეტყობინებების მოქმედება ქვემოთ მასზე შეხებით. აირჩიეთ მაქსიმუმ სამი მათგანი, რომლებიც ნაჩვენები იქნება კომპაქტურ შეტყობინებაში მარჯვნივ მდებარე ველების გამოყენებით დისტანციური ძიების შეთავაზებები გამორთეთ ვიდეოს აღწერილობისა და დამატებითი ინფორმაციის დასამალად თემა @@ -33,13 +33,13 @@ გააგრძელეთ დაკვრა გააგრძელეთ დაკვრა შეფერხებების შემდეგ (მაგ. სატელეფონო ზარები დაიწყეთ მთავარი მოთამაშე სრულ ეკრანზე - "URL-ის ამოცნობა ვერ მოხერხდა. სხვა აპით გახსნა\?" + URL-ის ამოცნობა ვერ მოხერხდა. გავხსნა სხვა აპით\? ნაგულისხმევი აუდიო ფორმატი აირჩიეთ თქვენი საყვარელი PeerTube ეგზემპლარები დაკვრის დატვირთვის ინტერვალის ზომა - "შეცვალეთ დატვირთვის ინტერვალის ზომა (ამჟამად %s). დაბალმა მნიშვნელობამ შეიძლება დააჩქაროს საწყისი ვიდეოს ჩატვირთვა. ცვლილებები მოითხოვს მოთამაშის გადატვირთვას" + შეცვალეთ დატვირთვის ინტერვალის ზომა (ამჟამად %s). დაბალმა მნიშვნელობამ შეიძლება დააჩქაროს საწყისი ვიდეოს ჩატვირთვა. ცვლილებები მოითხოვს მოთამაშის გადატვირთვას მოითხოვეთ დადასტურება რიგის გასუფთავებამდე - "არაზუსტი ძიება საშუალებას აძლევს მოთამაშეს უფრო სწრაფად მოიძიოს პოზიციები შემცირებული სიზუსტით. 5, 15 ან 25 წამის ძიება ამით არ მუშაობს" + არაზუსტი ძიება საშუალებას აძლევს მოთამაშეს უფრო სწრაფად მოიძიოს პოზიციები შემცირებული სიზუსტით. 5, 15 ან 25 წამის ძიება ამით არ მუშაობს სწრაფი წინსვლა/-გადახვევა ძიების ხანგრძლივობა ერთი მოთამაშიდან მეორეზე გადართვამ შესაძლოა შეცვალოს თქვენი რიგი გამორთეთ ესკიზების ჩატვირთვის თავიდან ასაცილებლად, მონაცემთა დაზოგვისა და მეხსიერების გამოყენების თავიდან ასაცილებლად. იცვლება როგორც მეხსიერებაში, ასევე დისკზე გამოსახულების ქეშის გასუფთავება @@ -84,12 +84,12 @@ გამოწერები ფონი ამომხტარი ფანჯარა - დამატება: + დამატება ვიდეოს ჩამოტვირთვის საქაღალდე გადმოწერილი ვიდეო ფაილები ინახება აქ აუდიოს ჩამოტვირთვის საქაღალდე უფრო მაღალი რეზოლუციის ჩვენება - დააინსტალიროთ დაკარგული Kode აპი\? + დავაყენო აუცილებელი Kore აპი\? აჩვენეთ \"დაუკარი კოდით\" ვარიანტი აჩვენეთ ვიდეოს დაკვრის ვარიანტი Kodi მედია ცენტრის საშუალებით შეტყობინებაში ნაჩვენები ვიდეოს ესკიზის ამოჭრა 16:9-დან 1:1-მდე ასპექტის თანაფარდობით @@ -124,7 +124,7 @@ განაახლეთ დაკვრა აღადგინეთ დაკვრის ბოლო პოზიცია Ავტომატური ჩართვა - აჩვენეთ წვერი \"შეაჩერე რიგში\". + აჩვენეთ წვერი \"შეაჩერე რიგში\" რჩევის ჩვენება ფონზე ან ამომხტარ ღილაკზე დაჭერისას ვიდეოში \"დეტალები:\" URL მხარდაუჭერელია ნაგულისხმევი კონტენტის ქვეყანა @@ -223,7 +223,7 @@ NewPipe-ს შეექმნა შეცდომა, შეეხეთ შეტყობინებისთვის მოხდა შეცდომა, იხილეთ შეტყობინება უკაცრავად, ეს არ უნდა მომხდარიყო. - შეატყობინეთ ამ შეცდომის შესახებ ელფოსტით + ელფოსტით შეტყობინება დააკოპირეთ ფორმატირებული ანგარიში მოხსენება GitHub-ზე Ბოდიში, რაღაც არ არის რიგზე. @@ -292,7 +292,8 @@ ჰეშის გაანგარიშება გთხოვთ მოიცადოთ… კოპირებულია ბუფერში - ეს ნებართვა საჭიროა ამომხტარი ფანჯრის რეჟიმში გასახსნელად + ეს უფლება აუცილებელია +\nმხტუნარა რეჟიმში გასახსნელად 1 ელემენტი წაიშალა. reCAPTCHA გამოწვევა როდესაც მოგვარდება, დააჭირეთ შესრულებულია @@ -312,8 +313,8 @@ საიტი ეწვიეთ NewPipe ვებსაიტს დამატებითი ინფორმაციისა და სიახლეებისთვის. NewPipe-ის კონფიდენციალურობის პოლიტიკა - "NewPipe პროექტი თქვენს კონფიდენციალურობას ძალიან სერიოზულად ეკიდება. ამიტომ, აპლიკაცია არ აგროვებს მონაცემებს თქვენი თანხმობის გარეშე. -\n NewPipe-ის კონფიდენციალურობის პოლიტიკა დეტალურად განმარტავს, თუ რა მონაცემები იგზავნება და ინახება ავარიის ანგარიშის გაგზავნისას." + NewPipe პროექტი თქვენს კონფიდენციალურობას ძალიან სერიოზულად ეკიდება. ამიტომ, აპლიკაცია არ აგროვებს მონაცემებს თქვენი თანხმობის გარეშე. +\nNewPipe-ის კონფიდენციალურობის პოლიტიკა დეტალურად განმარტავს, თუ რა მონაცემები იგზავნება და ინახება ავარიის ანგარიშის გაგზავნისას. წაიკითხეთ კონფიდენციალურობის პოლიტიკა NewPipe-ის ლიცენზია წაიკითხეთ ლიცენზია @@ -557,7 +558,7 @@ ეს კონტენტი მიუწვდომელია თქვენს ქვეყანაში. ეს კონტენტი პირადია, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. ანგარიში შეწყვეტილია - %s იძლევა ამ მიზეზს + %s იძლევა ამ მიზეზს: ეს კონტენტი ხელმისაწვდომია მხოლოდ მომხმარებლებისთვის, რომლებმაც გადაიხადეს, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. გამორჩეული რადიო @@ -601,8 +602,9 @@ ეგეთი უკვე არსებობს ინსტანციის დადასტურება ვერ მოხერხდა ჩართეთ YouTube-ის „შეზღუდული რეჟიმი“ - "ეს ვიდეო ასაკობრივი შეზღუდულია. -\n თუ გსურთ მისი ნახვა, ჩართეთ „%1$s“ პარამეტრებში." + ეს ვიდეო ასაკობრივი შეზღუდულია. +\n +\nთუ გსურთ მისი ნახვა, ჩართეთ „%1$s“ პარამეტრებში. ლაივი ეს ვიდეო ასაკობრივად შეზღუდულია. \n YouTube-ის ახალი წესების გამო ასაკობრივად შეზღუდული ვიდეოებით, NewPipe-ს არ შეუძლია წვდომა მის რომელიმე ვიდეო ნაკადზე და, შესაბამისად, ვერ ახერხებს მის დაკვრას. @@ -619,7 +621,7 @@ გარე დამკვრელს არ აქვთ ამ ტიპის ბმულების მხარდაჭერა ფაილი არ არსებობს ან მასზე წაკითხვის ან ჩაწერის ნებართვა აკლია შენახული ჩანართების წაკითხვა ვერ მოხერხდა, ამიტომ გამოიყენეთ ნაგულისხმევი ჩანართები - რა:\\nმოითხოვეთ:\\შინაარსის ენა:\\nშინაარსის ქვეყანა:\\nაპლიკაციის ენა:\\nმომსახურება:\\nGMT დრო:\\პაკეტი:\\ვერსია:\\nOS ვერსია: + რა:\\nმოითხოვეთ:\\nშემცველობის ენა:\\nშემცველობის ქვეყანა:\\nაპლიკაციის ენა:\\nსერვისი:\\nGMT დრო:\\nპაკეტი:\\nვერსია:\\nOS ვერსია: ამტვირთველის ავატარის ესკიზი კომენტარები გამორთულია Შექმნა @@ -644,7 +646,7 @@ \n 4. დააწკაპუნეთ „შემდეგი ნაბიჯი“ და შემდეგ „ექსპორტის შექმნა“ \n 5. დააწკაპუნეთ ღილაკზე „ჩამოტვირთვა“ მისი გამოჩენის შემდეგ \n 6. დააწკაპუნეთ IMPORT FILE ქვემოთ და აირჩიეთ გადმოწერილი .zip ფაილი -\n 7. [თუ .zip-ის იმპორტი ვერ მოხერხდა] ამოიღეთ. +\n 7. [თუ .zip-ის შემოტანავერ მოხერხდა] ამოიღეთ მოედანი ახალი ნაკადების შეტყობინებები მონაცემთა დაცვის ევროპული ზოგადი რეგულაციის (GDPR) შესაბამისობის მიზნით, ჩვენ ვაქცევთ თქვენს ყურადღებას NewPipe-ის კონფიდენციალურობის პოლიტიკაზე. გთხოვთ ყურადღებით წაიკითხოთ. @@ -688,7 +690,7 @@ დამუშავება… შეიძლება რამდენიმე წუთი დასჭირდეს წაშალოთ ეს დასაკრავი სია\? მეხსიერების გაჟონვის ჩვენება - აღდგენა. + აღდგენა რიგი გამოწერების იმპორტი ვერ მოხერხდა შეატყობინეთ სასიცოცხლო ციკლის შეცდომებს @@ -698,7 +700,7 @@ „%s“-ის არხის ჩატვირთვა ვერ მოხერხდა. ხელმისაწვდომია ზოგიერთ სერვისში, როგორც წესი, ბევრად უფრო სწრაფია, მაგრამ შეიძლება დააბრუნოს შეზღუდული რაოდენობის ელემენტი და ხშირად არასრული ინფორმაცია (მაგ. ხანგრძლივობის გარეშე, ელემენტის ტიპი, არ არის ლაივის სტატუსი) გამოიყენეთ ესკიზი როგორც ჩაკეტილი ეკრანის ფონისთვის, ასევე შეტყობინებებისთვის - "როგორ ფიქრობთ, არხის ჩატვირთვა ძალიან ნელია\? თუ ასეა, სცადეთ ჩართოთ სწრაფი ჩატვირთვა (შეგიძლიათ შეცვალოთ ის პარამეტრებში ან ქვემოთ მოცემულ ღილაკზე დაჭერით). + როგორ ფიქრობთ, არხის ჩატვირთვა ძალიან ნელია\? თუ ასეა, სცადეთ ჩართოთ სწრაფი ჩატვირთვა (შეგიძლიათ შეცვალოთ ის პარამეტრებში ან ქვემოთ მოცემულ ღილაკზე დაჭერით). \n \n NewPipe გთავაზობთ არხის ჩატვირთვის ორ სტრატეგიას: \n • მთელი სააბონენტო არხის მიღება, რომელიც ნელია, მაგრამ დასრულებულია. @@ -708,7 +710,7 @@ \n \n YouTube არის სერვისის მაგალითი, რომელიც გთავაზობთ ამ სწრაფ მეთოდს თავისი RSS არხით. \n -\n ასე რომ, არჩევანი დამოკიდებულია იმაზე, თუ რა გირჩევნიათ: სიჩქარე ან ზუსტი ინფორმაცია." +\n ასე რომ, არჩევანი დამოკიდებულია იმაზე, თუ რა გირჩევნიათ: სიჩქარე ან ზუსტი ინფორმაცია. ეს არის SoundCloud Go+ სიმღერა, ყოველ შემთხვევაში თქვენს ქვეყანაში, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. ამ მოქმედებისთვის შესაბამისი ფაილების მენეჯერი ვერ მოიძებნა. \n გთხოვთ, დააინსტალიროთ ფაილის მენეჯერი ან სცადოთ გამორთოთ \'%s\' ჩამოტვირთვის პარამეტრებში @@ -718,4 +720,32 @@ ახლა შეგიძლიათ აირჩიოთ ტექსტი აღწერილობაში. გაითვალისწინეთ, რომ გვერდი შეიძლება ციმციმდეს და ბმულები არ იყოს დაწკაპუნებული შერჩევის რეჟიმში. მხარდაჭერა აუდიო ნაკადები არ არის ხელმისაწვდომი გარე დამკვრელებისთვის + მარცხენა ჟესტის ქმედება + მარჯვენა ჟესტის ქმედება + სიკაშკაშე + ბუფერში კოპირების შეცდომა + ბარათი + გნებავთ წავშალო ყველა დუბლირებული ნაკადი ამ დასაკრავი სიიდან\? + ასლი დამატებულია %d-ჯერ + %s-ის გადმოსაწერად დაატყაპუნეთ + აპარატურული მედია ღილაკების მოვლენების გამოტოვება + ნაკადების ჩვენება/დამალვა + შემდეგი ნაკადების ჩვენება + სრულად ნანახი + ეს პარამეტრი ხელმისაწვდომია მხოლოდ როცა თემისთვის %s-ა მონიშნული + სასარგებლოა, მაგალითად, თუ იყენებთ ყურსაცვამდებს, რომლის ფიზიკური ღილაკებიც დაზიანებულია + აირჩიეთ ჟესტი მოთამაშის ეკრანის მარცხენა ნახევრისთვის + აირჩიეთ ჟესტი მოთამაშის ეკრანის მარჯვენა ნახევრისთვის + არაფერი + სწრაფი რეჟიმი + მომავალი + ხმა + ხელმისაწვდომია NewPipe-ის განახლება! + გამოწერების შეტანა/გამოტანა სამწერტილიანი მენიუდან + განაცრისფერებული დასაკრავი სიები ამ ელემენტს უკვე შეიცავენ. + თქვენი NewPipe-ის ვერსია უახლესია + დუბლიკატების წაშლა + მუდმივი მინიატურის მოხსნა + წავშალო დუბლიკატები\? + ნაწილობრივ ნანახი \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index d03ae7c5abb..42d4d258c29 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -51,7 +51,7 @@ Innholdet er utilgjengelig Kunne ikke sette opp nedlastingsmeny Beklager, dette skal ikke skje. - Rapporter denne feilen via e-post + Rapporter via e-post Beklager, noe gikk galt. Rapporter Info: @@ -731,4 +731,21 @@ Hurtigmodus Spillelistene som er utgrået inneholder allerede dette elementet. Duplikat lagt til %d gang(er) + Ignorer enhetens fysiske knapper + Lysstyrke + Velg håndvending for venstre halvdel av avspillerskjermen + Fullført + Velg håndvending for høyre halvdel av avspillerskjermen + Ingen + Fjern duplikater + Fjern alle duplikatstrømmer i denne spillelisten\? + Kommende + Venstre håndvendingshandling + Høyre håndvendingshandling + Lydstyrke + Fjern duplikater\? + Vis/skjul strømmer + Delvis sett + Nyttig hvis hodsettet ditt har knapper som fungerer dårlig + Vis følgende strømmer \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index f6d8ccffaf1..aff8dda8472 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -16,7 +16,7 @@ Voer de downloadlocatie in voor video\'s Standaardresolutie Afspelen met Kodi - Kode-app niet gevonden. Deze installeren\? + Kore-app niet gevonden. Deze installeren\? \"Afspelen met Kodi\"-optie tonen Toon een optie om een video af te spelen via Kodi media center Audio @@ -50,7 +50,7 @@ Kan downloadmenu niet instellen Vind-ik-leuks Sorry, dit had niet mogen gebeuren. - Deze fout melden via e-mail + Melden via e-mail Sorry, er is iets fout gegaan. Melden Informatie: @@ -730,4 +730,21 @@ Miniatuur niet ingesteld De afspeellijsten die grijs zijn, bevatten dit item al. Duplicaat is %d tijd(en) toegevoegd + Linker gebaaractie + Rechter gebaaractie + Geen + Verwijder duplicaten + Verwijder duplicaten\? + Wil je alle dubbele streams in deze afspeellijst verwijderen\? + Streams weergeven/verbergen + Volledig bekeken + Gedeeltelijk bekeken + Aanstaande + Kies een gebaar voor de rechterhelft van het spelersscherm + Negeer hardware-mediaknopgebeurtenissen + Helderheid + Volume + Handig als je bijvoorbeeld een headset gebruikt met kapotte fysieke knoppen + Kies een gebaar voor de linkerhelft van het spelersscherm + Laat de volgende streams zien \ No newline at end of file diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml new file mode 100644 index 00000000000..16c6e6e225f --- /dev/null +++ b/app/src/main/res/values-nqo/strings.xml @@ -0,0 +1,732 @@ + + + ߞߊ߬ ߢߣߊߕߊߟߌ ߘߏ߫ ߦߌ߬ߘߊ߬ ߞߊ߬ ߦߋߡߍ߲ߕߊ ߕߏߟߏ߲߫ Kodi ߞߟߋߞߟߋ߫ ߕߊ߲ߓߊ߲ ߘߐ߫ + Kore ߟߥߊߟߌߟߊ߲ ߡߊ߫ ߛߐ߬ߘߐ߲߬߸ ߞߵߊ߬ ߡߊߗߍ߫؟ + ߦߋߡߍ߲ߕߊ ߞߏ߬ߋߞߏ߬ߋ߫ ߡߍ߲ ߦߌ߬ߘߊ߬ߕߐ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߘߐ߫߸ ߞߵߏ߬ ߟߊߕߍ߰ ߞߊ߬ ߓߐ߫ ߁߆:߉ ߞߊ߬ ߞߍ߫ ߁:߁ ߓߍ߲߬ߡߊ ߘߌ߫ + ߞߍߟߌ߫ ߝߌߟߊߣߊ߲ ߞߎ߬ߘߎ + ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߫ ߞߍߟߌ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ ߡߊߝߊ߬ߟߋ߲߬ ߘߎ߰ߟߊ߫ ߛߐ߲߬ߞߌ߲߬ߠߌ߲ ߘߐ߫ ߊ߬ߟߎ߫ ߞߊ߲߬. ߘߏ߫ ߟߎ߫ ߓߊߕߐߡߐ߲߫ (ߞߣߊ߫ ߕߊ߬ߡߌ߲߬ ߃ ߟߊ߫) ߞߵߊ߬ߟߎ߫ ߝߍ߲߬ߛߍ߲߫ ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߫ ߜߘߋ ߘߐ߫߸ ߞߌߣߌ߲߫ ߛߐ߲߬ߞߌ߲ ߛߌߟߊ ߝߍ߬ ߘߋ߲߬ߞߊ߬ߣߍ߲߬ ߘߐߞߍߕߊ ߞߊ߲߬ + ߞߊ߬ \"ߊ߬ ߕߏߟߏ߲߫ Kodi ߞߣߐ߫\" ߢߣߊߕߊߟߌ ߦߌ߬ߘߊ߬ + ߞߊ߬ ߕߏߟߏ߲ߟߊ߲ ߠߜߊߘߊ߲߫ + ߞߏ߬ߋߞߏ߬ߋ ߟߊ߬ߕߍ߰ ߁:߁ ߡߊ߬ + ߞߍߟߌ߫ ߝߟߐ ߞߎ߬ߘߎ + ߞߍߟߌ߫ ߛߓߊߣߊ߲ ߞߎ߬ߘߎ + ߞߍߟߌ߫ ߣߊ߯ߣߌ߲ߣߊ߲ ߞߎ߬ߘߎ + ߞߍߟߌ߫ ߟߏ߯ߟߎߣߊ߲ ߞߎ߬ߘߎ + ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߬ ߜߘߋ ߘߐ߫ ߌ ߘߌ߫ ߛߋ߫ ߞߍߟߌ߫ ߛߓߊ߬ ߔߋ߫ ߟߋ߬ ߓߊߕߐߡߐ߲߫ ߠߊ߫ ߞߵߊ߬ ߝߍ߲߬ߛߍ߲߫߹ + ߕߎ߬ߡߊ߬ ߘߐ߫߸ ߌ ߞߊ߲߫ ߦߋ߫ \"%1$s\" ߟߋ߫ ߡߊ߬؟ + ߊ߬ ߟߊߖߍ߲ߛߍ߲߫ ߘߊ߫ %1$s + ߥߦߏ߬ ߕߏߟߏ߲ߟߊ߲߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬. ߞߊ߬ VLC ߡߊߗߍ߫؟ + ߥߦߏ߬ ߕߏߟߏ߲ߟߊ߲߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ (ߌ ߘߌ߫ ߛߋ߫ VLC ߡߊߗߍ߫ ߞߵߊ߬ ߕߏߟߏ߲߫). + ߞߵߊ߬ ߟߊߞߊ߬ ߛߏ߲߯ߓߊߟߊ߲ ߞߣߐ߫ + ߞߵߊ߬ ߢߊߣߐ߯ߦߊ߫ ߦߏ߫ ߡߊߝߟߍߣߍ߲ + ߞߵߊ߬ ߡߊߗߍ߫ + ߞߵߊ߬ ߘߐߛߊ߬ + ߏ߬ߞߍ߫ + ߞߵߊ߬ ߘߐߕߟߊ߫ + ߞߴߊ߬ ߘߊߦߟߍ߬ ߝߢߐߘߊ߫ ߝߎ߲ߞߊ߲ߡߊ ߞߣߐ߫ + ߞߵߊ߬ ߘߊߦߍ߬ߟߍ߫ ߦߊ߲߬ + ߞߵߊ߬ ߟߊߖߌ߰ + ߞߊ߬ ߥߏ߬ߦߏ ߞߐߘߐ߮ ߟߊߖߌ߰ + ߢߊߓߐߟߌ ߟߎ߬ + ߢߌߣߌ߲ߠߌ߲ + ߡߊ߬ߝߘߎ߬ߟߌ ߡߊߝߊ߬ߟߋ߲߬ߞߏ ߡߊ߫ ߛߐ߲߬ + ߢߌߣߌ߲ߝߋ߲߫ ߞߐߝߟߌ ߟߎ߬: %s + ߞߵߊ߬ ߘߐߝߘߊ߫ + ߞߐߞߊ߫ ߕߏߟߏ߲ߟߊ߲ ߠߊߓߊ߯ߙߊ߫ + ߊ߬ ߦߋ߫ ߡߍ߲ߕߊ ߟߋ߫ ߖߐ߬ߛߌ߫ ߟߊ߫ ߓߍ߲߬ߡߊ ߘߏ߫ ߟߎ ߞߘߐ߫ + ߞߊ߬ ߞߐߞߊ߲߫ ߡߍ߲ߕߊ߫ ߕߏߟߏ߲ߟߊ߲ ߠߊߓߊ߯ߙߊ߫ + ߞߵߊ߬ ߟߊߓߌ߬ߟߊ߬ + ߊ߬ ߡߊߝߘߎ߫ + ߊ߬ ߡߊߝߘߎߣߍ߲߫ ߌ ߓߟߏ߫ + ߥߙߏߝߋ ߓߘߊ߫ ߟߊߓߌ߬ߟߊ߬ + ߡߊ߬ߝߘߎ߬ߟߌ߫ ߟߏ߲ߘߐߦߊߞߏ ߡߊ߫ ߛߐ߲߬ + ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ + ߞߊ߬ ߟߌ߬ߤߟߊ ߦߌ߬ߘߊ߬ + ߡߍ߲ߕߊ߫ ߟߊߌ߰ߣߍ߲ ߠߎ߬ ߞߐߕߐ߮ ߟߎ߬ ߟߊߡߊ߲߬ߘߌ߬ߣߍ߲߫ ߦߊ߲߬ ߠߋ߬ + ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ + ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ + ߞߵߊ߬ ߝߙߊ߬ + ߦߋߡߍ߲ߕߊ߫ ߟߊߌ߰ߣߍ߲ ߠߎ߬ ߞߐߕߐ߮ ߟߎ߬ ߟߊߡߊ߲߬ߘߌ߬ߣߍ߲߫ ߦߊ߲߬ ߠߋ߬ + ߝߎ߲ߞߊ߲ߡߊ + ߛߏ߬ߙߌ߲߬ߘߐ ߛߎߥߊ߲ߘߌ߫ + ߦߋߡߍ߲ߕߊ߫ ߟߊߖߌ߰ߣߍ߲ ߞߎ߲ߓߍ߲ + ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ ߦߋߡߍ߲ߕߊ߫ ߞߐߕߐ߮ ߟߎ߬ ߢߍ߫ + ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ ߡߍ߲ߕߊ߫ ߞߐߕߐ߮ ߟߎ߬ ߢߍ߫ + ߓߍ߲߬ߡߊ߬ ߖߏߣߡߊ + ߓߍ߲߬ߡߊ߬ ߛߊ߲ߘߐߕߊ ߟߎ߬ + ߡߍ߲ߕߊ߫ ߟߊߖߌ߰ߣߍ߲ ߞߎ߲ߓߍ߲ + ߝߎ߲ߞߊ߲߫ ߝߢߐߘߊ߫ ߓߍ߲߬ߡߊ߬ ߖߏߣߡߊ + ߊ߬ ߕߏߟߏ߲߫ Kodi ߞߣߐ߫ + ߕߙߏߞߏ߫ ߘߊ߲ߘߐ߫ߣߍ߲߫ ߠߋ߬ ߦߋ߫ ߛߋ߫ ߟߊ߫ 2K/4K ߦߋߡߍ߲ߕߊ ߟߎ߬ ߕߏߟߏ߲߫ ߠߊ߫ + ߊ߬ ߛߐ߲߬ߞߌ߫ ߥߊߘߏ ߞߊ߲߬ ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬. + ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߫ ߞߟߐ߬ߡߊ + ߞߊ߬ ߊ߲ߘߙߏߌߘ ߟߐ߬ ߛߐ߬ߓߌ߲߬ߘߐ߬ߓߏ߲ ߞ߬ߟߐ ߟߊߖߘߍ߬ߕߦߊ߬ ߟߊ߫ ߞߵߊ߬ ߓߍ߲߬ ߞߏ߬ߋߞߏ߬ߋ߫ ߞߐ߬ߟߐ ߓߊߖߎ ߡߊ߬ (ߦߴߊ߬ ߟߐ߲߫ ߞߴߏ߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߕߙߏߞߏ ߓߍ߯ ߟߊ߫) + ߔߙߏ߬ߔߙߏ߬ ߢߌߣߌ߲ߠߌ߲߫ ߠߵߊ߬ ߞߍ߫ ߟߊ߫ ߕߏߟߏ߲ߟߊ߲ ߘߌ߫ ߘߌ߲߬ߞߌߙߊ ߟߎ߬ ߢߌߣߌ߲߫ ߞߊߟߌߦߊߓߟߏ ߡߊ߬ ߞߏ߬ߣߵߊ߬ ߕߋߟߋ߲ߣߍ߲߫ ߕߍ߫ ߖߋߞߎ߫. ߞߊ߬ ߢߌߣߌ߲ߠߌ߲ ߞߍ߫ ߝߌ߬ߟߊ߲߬ ߅، ߁߅، ߥߟߊ߫ ߂߅ ߞߘߐ߫߸ ߊ߬ ߣߴߏ߬ ߕߍ߫ ߛߋ߫ ߓߍ߲߬ ߠߊ߫ + ߞߊ߬ ߖߛߐߟߌ ߕߍߟߊ߫ ߘߍ߲߬ߘߍ߲ ߡߊߝߊ߬ߟߋ߲߬ (ߕߋ߲߭ߕߋ߲߬ %s). ߡߐ߬ߟߐ߲߬ ߘߋ߲߬ߣߍ߲ ߘߌ߫ ߛߋ߫ ߦߋߡߍ߲ߕߊ߫ ߘߊߦߟߍ ߟߞߊߟߌߦߊ߫ ߟߊ߫. ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߡߊ߬ߞߏ߫ ߦߋ߫ ߡߍߣߍ߲ߡߊߛߊߦߌ ߟߊ߫ + ߞߊ߬ ߟߊ߬ߛߙߋ߬ߦߊ߬ߟߌ ߡߊ߬ߣߌ߲߬ߞߊ߬ ߕߎ߲߰ߠߌ߲ ߘߏ߫ ߝߌߘߊ߲߫ ߕߐ߫ + ߞߊ߬ ߓߐ߫ ߕߏߟߏ߲ߟߊ߲ ߘߏ߫ ߟߊ ߞߊ߬ ߥߊ߫ ߘߏ߫ ߜߘߍ߫ ߟߊ߫߸ ߏ߬ ߘߌ߫ ߛߋߴߌ ߟߊ߫ ߕߎ߲߰ߠߌ߲ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ ߟߊ߫ + ߡߊ߬ߛߊߦߌ + ߢߓߊߛߊ߲ + ߦߟߌߘߐߗߍ + ߝߏߛߌ߬ + ߡߍ߲ߕߊ + ߡߍ߲ߕߊ߫ ߢߊ߲ߞߊ߫ ߖߏߣߡߊ + ߦߋߡߍ߲ߕߊ ߢߊ߲ߞߊ߫ ߖߏߣߡߊ + ߛߊߛߊ + ߛߎߘߐ߫ ߛߊߛߊ + ߞߣߍߦߊߣߍ߲ + ߘߓߌ߬ߣߍ߲ + ߝߌ߲߬ߡߊ߲ + ߞߊ߬ ߖߊ߬ߕߏ߫ ߝߎ߲ߞߊ߲߫ ߝߢߐߘߊ ߟߊ߫ ߕߦߊ ߟߎ߬ ߞߐ߫ + ߞߊ߬ ߖߊ߲߬ߕߏ߫ ߝߎ߲ߞߊ߫ ߝߢߐߘߊ ߘߍ߲߬ߘߍ߲ ߣߴߊ߬ ߘߌ߲߬ߞߌߙߊ ߞߐ߫ + ߞߊ߬ ߔߙߏ߬ߔߙߏ߬ ߢߌߣߌ߲ߠߌ߲߫ ߞߊߟߌ߲ ߠߊߓߊ߯ߙߊ߫ + ߢߍߝߍ߫/ߞߐߝߍ߫ ߢߌߣߌ߲ߠߌ߲߫ ߥߛߎ߬ ߞߊߟߌ߲ + ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߖߛߐߟߌ ߕߍߟߊ߫ ߘߍ߲߬ߘߍ߲ + ߛߋ߲߬ߠߊ߬ ߕߏߟߏ߲ߟߊ߲ ߠߊ߫ ߕߎ߲߰ߠߌ߲ ߘߌߣߊ߬ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ + ߞߊ߬ ߕߙߏߞߏ ߞߟߋߞߟߋ߫ ߞߘߎ ߟߊ߫ ߖߊ߲߬ߖߊ߲߬ ߠߎ߬ ߡߊߓߌ߬ߟߊ߬ + ߏ߬ ߢߊߕߣߐ ߞߊߓߏ߬߸ ߣߴߌ ߦߋ߫ ߕߟߏߡߊߘߏ߲ ߠߊߓߊ߯ߙߊ ߟߊ߫ ߡߍ߲ ߞߘߎ߬ ߜߎ ߟߎ߬ ߕߍ߫ ߛߐ߲߬ + ߞߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߟߎ߬ ߖߛߐ߫ + ߣߎߡߊ߲߫ ߖߍ߰ߙߍ ߞߍߟߌ + ߕߏߟߏ߲ߟߊ߲߫ ߥߊ߲߬ߥߊ߲ ߞߌߣߌ߲߫ ߕߟߊ ߖߍ߰ߙߍ ߛߎߥߊ߲ߘߌ߫ + ߞߌߣߌ߲߫ ߖߍ߰ߙߍ ߞߍߟߌ + ߞߣߍߦߊ + ߡߊ߲߬ߞߊ߲ + ߝߏߛߌ߬ + ߢߌߣߌ߲ߠߌ߲߫ ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬ + ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬ ߓߊߕߐߡߐ߲߫ ߞߵߊ߬ߟߎ߫ ߝߍ߲߬ߛߍ߲߫ ߢߌߣߌ߲ߠߌ߲߫ ߕߎߡߊ + ߘߌ߲߬ߞߌ߬ߙߊ߬ߘߐ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬ + ߥߎߟߊߟߊ߫ ߢߌߣߌ߲ߠߌ߲߫ ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬ + ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰ ߊ߬ ߘߊ߲߬ߘߌ߬ߦߊ߬ ߟߊߓߊ߲ ߠߊ߫ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌ߬ߦߊ߬ ߡߊ߬ߛߙߋ ߟߎ߫ ߦߌ߬ߘߊ߬ ߛߙߍߘߍ ߟߎ߬ ߘߐ߫ + ߞߊ߬ ߦߋߡߍ߲ߕߊ߫ ߡߊߝߍߣߍ߲ߣߍ߲ ߠߎ߫ ߘߝߐ߬ߦߊ߫ + ߞߵߊ߬ ߟߊߖߌ߰ + ߞߊ߬ ߕߏߟߏ߲ߟߊ߲߫ ߓߊߖߎ ߘߊߦߟߍ߬ ߥߊ߲߬ߥߊ߬ ߝߊ ߘߐ߫ + ߞߊ߬ ߞߍߞߌߦߊ \"ߊ߬ ߛߐ߲߬ߞߌ߲߬ߣߍ߲ ߕߏ߫ ߞߵߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫\" ߦߌ߬ߘߊ߬ + ߛߘߌ߬ߜߋ߲߬ ߘߌߣߍ߲ ߡߊ߫ ߛߋ߫ ߡߊߟߐ߲߫ ߠߊ߫. ߞߵߊ߬ ߘߊߦߟߍ߬ ߟߥߊߟߌߟߊ߲߫ ߜߘߍ߫ ߞߣߐ߫؟ + ߞߣߐߘߐ߫ ߖߡߊ߬ߣߊ߬ ߖߏߣߡߊ + ߌ ߘߌߦߊߣߍ߲߫ ߛߐߘߊ ߟߎ߫ ߛߐ߬ߘߐ߲߫ ߦߊ߲߬: %s + ߛߐߘߊ ߘߏ߫ ߝߙߊ߬ + ߛߐߘߊ߫ ߛߘߌ߬ߜߋ߲ + ߛߐߘߊ ߡߊ߫ ߛߋ߫ ߕߎ߬ߢߊ߬ߟߐ߲߬ ߠߊ߫ + HTTPS ߛߘߌߜߋ߲ ߠߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߦߋ߫ ߕߊ߬ ߟߊ߫ + ߞߏߟߊߕߊ߯ߡߢߊ + ߦߋߡߍ߲ߕߊ ߣߌ߫ ߡߍ߲ߕߊ + ߘߝߐ߬ߦߊ ߣߌ߫ ߦߟߌߡߊߛߌ߮ + ߦߋߢߊ + ߞߊߘߊ߲ߓߐ + ߟߏ߲ߘߐߦߊߟߌ + ߥߦߏ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߕߐ ߛߏ߬ߓߌ߬ߘߐߓߏ߲ ߢߊߓߐ߫ + ߝߊ߲߬ߝߘߊ߬ߞߘߐ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ + ߝߎ߲ߞߊ߲ߡߊ ߞߙߊ߬ߞߏ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ + ߞߣߐߘߐ + ߦߕߎߓߎ߫ \"ߜߍ߲߬ߘߍ߬ߣߍ߲߫ ߗߏ߯ߦߊ\" ߟߊߡߍߣߍ߲߫ + \"ߜߍ߲߬ߘߍ߬ߣߍ߲ ߗߏ߯ߦߊ\" ߘߏ߫ ߦߋ߫ ߦߕߎߓߎ ߓߟߏ߫߸ ߡߍ߲ ߦߋ߫ ߞߣߐߘߐ߫ ߘߋߣߍ߲ߞߏߓߊߦߋ ߟߎ߬ ߢߡߊߘߏ߲߰ ߠߊ߫ + ߝߊ߲ߞߢߊ + ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ + ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ + ߖߊ߲߬ߖߏ߲ ߠߎ߬ + ߘߐ߲߬ߞߟߌ ߟߎ߬ + ߢߊ߰ߙߊ ߟߎ߬ + ߟߊߛߊ߬ߣߍ߲ + ߞߵߊ߬ ߝߌߘߊ߲߫ + ߓߍ߲߬ߡߊ ߓߘߍ߬ߡߊ + ߞߵߊ߬ ߘߐߛߊ߬ + ߞߵߊ߬ ߓߍ߯ ߕߏߟߏ߲߫ + ߞߘߊߎ߫ + ߟߥߊߟߌߟߊ߲߫ ߟߏ߲ߘߐߦߊߟߌ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ + ߣߌߎߔߌߔ ߓߐߞߏ߫ ߞߎߘߊ ߟߎ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߞߊ߬ ߦߟߍ߬ߡߊ߲߫ ߝߎ߲ߞߊ߲ߡߊ ߘߐ߫ + ߞߊ߬ ߦߟߍ߬ߡߊ߲߫ ߓߊߖߎ ߘߐ߫ + ߞߊ߬ ߟߐ߲ߕߊߓߘߐ ߟߊߝߏ߬ߦߌ߬ + ߡߐ߰ߦߊ߬ߟߐ߲߫ ߦߟߌߘߏ߲ ߠߎ߬ ߓߘߊ߫ ߝߌߘߊ߲߫ + ߘߝߐ߬ߦߊ ߣߌ߫ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߣߌ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߎ߬ ߣߌ߫ ߢߊߓߐߟߌ ߟߎ߬ ߟߊߝߏ߬ߦߌ߬ + ߦߟߌߘߏ߲ ߠߎ߬ ߖߏ߬ߛߌ߬߸ ߣߌߎߔߌߔ ߦߋ߫ ߡߍ߲ ߠߎ߬ ߟߊߡߊ߲߬ߘߌ߬ ߟߊ߫ ߡߐ߰ߦߊ߬ߟߐ߲ ߘߏ߫ ߝߎߟߋ߲߫ ߕߎߡߊ ߌ ߓߟߏ߫ + ߦߋߞߏ߫ ߘߝߐ߬ߦߊ ߝߌߘߊ߲߫ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ ߓߍ߯ ߖߐ߬ߛߌ߫؟ + ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ ߓߍ߯ ߓߘߊ߫ ߖߐ߬ߛߌ߫ + ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߞߎߡߊߘߋ߲ ߠߎ߫ ߘߝߐ߬ߦߊ ߖߐ߬ߛߌ߫ + ߗߏ߯ߦߊ߫ ߞߊߟߌ߲ + ߝߎ߬ߕߎ߲߬ߕߌ + ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲߫ ߕߍ߫ ߦߋ߲߬ + ߞߙߏ߬ߝߏ߫ ߝߎ߬ߕߎ߲߬ߕߌ + ߦߋߡߍ߲ߕߊ߫ ߛߘߌ߬ߜߋ߲߫ ߞߟߊ߬ߣߐ߮ ߡߊ߫ ߝߙߍߕߍߓߐ߫ ߟߊ߫ + ߗߍߦߙߐ ߡߊ߫ ߛߋ߫ ߘߐߛߏ߯ߙߋ߫ ߟߊ߫ + ߞߣߐߘߐ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ + ߟߥߊ߬ߟߌ߬ߟߊ߲ ߓߘߊ߫ ߜߊߘߊ߲߫ + ߞߐߕߐ߮ ߓߘߊ߫ ߡߊߘߏ߬ߣߌ߲߬ ߥߟߴߊ߬ ߓߘߊ߫ ߖߐ߬ߛߌ߫ + ߞߎ߲ߓߍ߲ ߛߎߝߊ߫ ߏ߬ ߕߍ߫ ߦߋ߲߬ + ߞߎ߲ߓߍ߲ ߥߟߊ߫ ߞߣߐߘߐ߫ ߛߎߝߊ ߏ߬ ߕߍ߫ ߦߋ߲߬ + ߞߐߕߐ߮ ߕߍ߲߬ ߦߋ߲߬ ߥߟߴߊ߬ ߕߍ߫ ߟߊߛߐ߬ߘߐ߲߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߥߟߊ߫ ߛߓߍߟߌ߫ ߓߟߏ ߡߊ߬ + ߞߐߕߐ߯ ߕߐ߮ ߘߐߞߏߟߏ߲ ߕߍ߫ ߛߋ߫ ߕߏ߫ ߟߊ߫ + ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߓߘߊ߫ ߞߍ߫: %1$s + ߥߦߏ߬ ߟߊߖߌ߰ߕߊ߬ ߕߍ߫߫ ߦߋ߲߬ + ߛߏ߬ߙߌ߲߬ߘߐ߬ ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲ ߠߎ߬ ߕߍ߫ ߞߊ߬ߙߊ߲߬ ߠߊ߫߸ ߛߏ߬ߙߏ߲߬ߘߐ߬ ߖߏߣߡߊ ߟߎ߬ ߟߋ߬ ߟߊߓߊ߯ߙߊ ߌߘߐ߫ + ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߓߘߊ߫ ߞߍ߫߸ ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߡߊߝߍߣߍ߲߫ + ߘߌ߬ߢߍ߬߸ ߊ߬ ߡߊ߫ ߟߊߥߌ߬ߟߴߊ߬ ߡߊ߬. + ߘߌ߬ߢߍ߬߸ ߞߏ߫ ߘߏ߫ ߡߊ߫ ߕߊ߬ߡߌ߲߬ ߞߏߢߊ߬. + ߟߌ߬ߤߟߊ: + ߡߎ߲߬ ߞߍߣߍ߲߫: + ߡߎ߲߬:\\nRequest:\\nContent Language:\\nContent Country:\\nApp Language:\\nService:\\nGMT Time:\\nPackage:\\nVersion:\\nOS version: + ߌ ߟߊ߫ ߞߊ߲߬ߞߎߡߊ (ߊ߲߬ߞߌ߬ߟߍ߬ ߞߊ߲ ߘߐ߫): + ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬: + ߦߋߡߍ߲ߕߊ ߘߐߞߊ߬ߙߊ߲߸ ߥߎ߬ߛߎ: + ߟߊ߬ߦߟߍ߬ߓߊ߮ ߞߐߦߌߘߊ߫ ߖߌߦߊ ߞߏ߬ߋߞߏ߬ߋ + ߊ߬ ߘߎߡߊ߲߫ ߒߧߍ߫ + ߊ߬ ߡߊ߲ߘߌ߫ ߒߧߍ߫ + ߞߊ߲߬ߞߎߡߊ ߟߎ߬ + ߢߐ߲߰ߘߐ߬ ߥߦߏ ߟߎ߬ + ߞߐߝߟߌ߫ ߕߍ߫ ߦߋ߲߬ + ߡߍ߲ߕߊ + ߞߵߊ߬ ߡߊߛߊ߬ߦߌ߬ + ߥߊ߯ + ߞߋ߲߬ + ߥߟߡ + ߞߊ߬ ߥߏ߬ߦߏ߫ ߣߊ߬ߕߊ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ ߞߍ߲ߖߘߍߡߊߓߟߏ ߡߊ߬ + ߞߊ߬ ߕߎ߲߰ߠߌ߲ ߘߐߞߊ߬ߙߊ߲ ߓߟߏߕߎ߰ (ߞߊߣߊ߬ ߡߊߛߊ߬ߦߌ߬) ߥߏ߬ߦߏ߫ ߢߐ߲߰ߘߐ ߟߎ߫ ߟߊ߫ + ߕߏߟߏ߲ߟߊ߲߫ ߥߊ߲߬ߥߊ߲ ߣߎߡߊ߲߫ ߕߟߊ ߖߍ߰ߙߍ ߛߎߥߊ߲ߘߌ߫ + ߘߊ߲߬ߘߌߦߊ ߢߌߣߌ߲ߠߌ߲ ߘߐ߫ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰ + ߞߊ߬ ߘߐ߲߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰ ߓߟߏߕߍ߯ߟߌ ߞߐߝߍ߬ (ߟߊߒߡߊ߫ ߘߐ߫، ߜߋߟߋ߲ߜߋߟߋ߲ ߠߊ߫ ߞߟߌߟߌ ߟߎ߬) + ߞߊ߬ ߞߍߞߌߦߊ ߦߌ߬ߘߊ߬ ߦߋߡߍ߲ߕߊ߫ ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ ߞߐߜߍ ߞߊ߲߬ \"ߝߎ߲ߞߊ߲ߡߊ\" ߥߟߊ߫ \"ߞߘߐߝߊ߲ߝߘߊ\" ߞߎ߬ߘߎ ߛߐ߲߬ߞߌ߲߬ ߕߎߡߊ + ߕߏߟߏ߲ߟߊ߲߫ ߠߊ߫ ߛߐߓߌ߬ߘߐ߬ߓߏ߲ + ߞߊ߬ ߞߣߐߘߐ߫ ߛߐ߬ߘߐ߲߬ߛߌ߯ ߘߊ߲߬ߠߊߕߍ߰ߣߍ߲ ߦߌ߬ߘߊ߬ + ߞߊ߬ ߞߣߐߘߐ ߟߎ߬ ߦߌ߬ߘߊ߬ ߤߊߟߌ߬ ߘߋ߲ߣߍ߲ ߠߎ߬ ߡߊ߲ߞߊ߲߫ ߞߊ߬ ߡߍ߲ ߡߊߝߍߣߍ߲߫ (ߦߏ߫ +߁߈) + ߛߐ߬ߘߐ߲߬ߛߌ߰ ߘߊ߲ߠߊߕߍ߮ ߦߋ߫ ߖߌ߬ߦߊ߬ߖߟߎ ߣߌ߲߬ ߠߊ߫. +\n +\n\"%1$s\" ߟߊߢߊ߯ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߵߊ߬ ߝߟߍ߫. + ߛߐ߬ߘߐ߲߬ߛߌ߰ ߘߊ߲ߠߊߕߍ߯ ߦߋ߫ ߖߌ߬ߦߊ߬ߖߟߎ ߣߌ߲߬ ߠߊ߫. +\nߦߕߎߓߎ߫ ߟߊ߫ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߏߛߐ߲߬ ߞߊ߬ ߓߍ߲߬ ߖߌ߬ߦߊ߬ߖߟߎ߫ ߛߐ߬ߘߐ߲߬ߛߌ߯ ߘߊ߲ߠߊߕߍ߰ߣߍ߲ ߠߎ߬ ߠߊ߫ ߞߏ ߡߊ߬، ߣߌߎߔߌߔ ߕߍ߫ ߛߋ߫ ߦߋߡߍ߲ߕߊ߫ ߥߦߏ ߣߌ߲߬ ߛߌ߫ ߟߊߛߐ߬ߘߐ߲߬ ߠߊ߫߸ ߏ߬ ߞߏߟߐ߲߬ ߊ߬ ߕߍ߫ ߛߴߊ߬ߟߎ߬ ߕߏߟߏ߲߫ ߠߊ߫. + ߞߊ߬ ߟߐ߲ߕߊߓߘߐ ߟߊߛߣߍ߫ + ߞߐߕߐ߮ ߓߘߊ߫ ߖߏ߬ߛߌ߫ + ߣߌߎߔߌߔ ߕߏߟߏ߲ߟߊ߲߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߌ ߟߊ߫ ߘߝߐ߬ߦߊ߸ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬߸ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߎ߬ ߊ߬ߣߌ߫ (ߢߣߊߕߊߟߌ ߘߐ߫) ߢߊߓߐߟߌ ߟߎ߬ ߘߌ߫ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ + ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߫ ߖߐ߬ߛߌ߫ + ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߟߎ߬ ߝߌߘߊ߲߫ + ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ ߓߍ߯ ߖߐ߬ߛߌ߫ + ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲߫ ߞߊ߲߬ ߟߊ߬ߖߌ߰ߟߌ ߕߍ߫ ߓߍ߲߬. ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߘߌ߲߬ߞߌߙߊ ߢߡߊߛߊ߬ߦߌ߬ ؟ + ߟߊ߬ߖߌ߰ߟߌ ߢߣߊߥߟߊ߫ ߕߍ߫ ߛߋ߫ ߘߐߛߌ߰ ߟߊ߫ + ߊ߬ ߟߊߛߊ߬ ߞߏߛߊ߫ ߞߏ߬ߋߞߏ߬ߋ ߟߎ߬ ߞߊߣߊ߬ ߖߛߐ߫߸ ߞߊ߬ ߟߐ߲ߕߊ ߣߌ߫ ߦߟߌߕߏߟߊ߲ ߡߊߞߐߙߐ߲ߞߐߙߐ߲߫. ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߘߌ߫ ߖߌ߬ߦߊ߬ߓߍ ߟߎ߬ ߦߟߌߡߊߛߌ ߓߍ߯ ߖߏ߬ߛߌ߫ ߦߟߌߕߏߟߊ߲ ߣߌ߫ ߝߘߍ߬ߜߍߟߍ߲ ߞߊ߲߬ + ߞߊ߬ ߞߊ߲߬ߞߎߡߊ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߊ߬ ߟߊߛߊ߬ ߞߊ߬ ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߢߡߊߘߏ߲߰ + ߞߊ߬ ߦߋߡߍ߲ߕߊ߫ ߣߊ߬ߕߊ ߟߎ߬ ߣߌ߫ ߢߐ߲߰ߘߐ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߞߊ߬ ߞߊ߲߬ߛߓߍ ߦߌ߬ߘߊ߬ + ߊ߬ ߟߊߛߊ߬ ߞߊ߬ ߦߋߡߍ߲ߕߊ߫ ߞߊ߲߬ߛߓߍ ߣߴߊ߬ ߟߌ߬ߤߟߊ߬ ߜߘߍ߫ ߟߎ߬ ߢߡߊߘߏ߲߰ + ߞߊ߬ ߟߌ߬ߤߟߊ߬ ߞߎ߲ߓߊ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߊ߬߬ ߟߊߛߊ߬ ߞߊ߬ ߟߌ߬ߤߟߊ߬ ߞߎ߲ߓߊ ߟߎ߫ ߝߏ߬ߘߏ ߢߡߊߘߏ߲߰߸ ߣߴߊ߬ ߦߋ߫ ߥߏ߬ߦߏ ߛߌ߲ߘߌߓߊ߮ ߣߌ߫ ߥߏ߬ߦߏ ߞߣߐߘߐ ߟߥߊ߫ ߢߌߣߌ߲ߠߌ߲߫ ߡߊߢߌߣߌ߲߫ ߘߌ߫ + ߦߟߌߡߊߛߌ߯ ߖߌ߬ߦߊ߬ߓߍ ߟߎ߬ ߓߘߊ߫ ߝߌߘߊ߲߫ + ߞߊ߬ ߦߟߌߡߊߛߌ߯ ߟߐ߲ߕߊ߫ ߞߎ߲ߓߊ ߟߎ߬ ߝߌߘߊ߲߫ + ߞߊ߬ ߓߟߐߟߐ߫ ߞߐߜߍ ߟߎ߬ ߟߐ߲ߕߊ ߟߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߫ ߦߟߌߡߊߛߌ߯ ߘߐ߫ + ߟߐ߲ߕߊ߫ ߞߎ߲ߓߊ ߟߎ߬ ߓߘߊ߫ ߖߏ߬ߛߌ߫ ߦߟߌߡߊߛߌ߮ ߞߣߐ߫ + ߞߴߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߴߊ߬ ߖߍ߬ߘߍߡߊ߬ + ߦߋߣߍ߲ ߠߎ߫ ߘߝߐ߬ߦߊ + ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߟߎ߬ ߟߊߡߊ߲߬ߘߌ߫ ߕߙߏߞߏ ߞߊ߲߬ + ߞߊ߬ ߟߐ߲ߕߊ ߟߎ߬ ߝߌߘߊ߲߫ + ߕߏߟߏ߲ߖߘߍ߬ߡߊ + ߛߘߌ߬ߜߋ߲߫ ߕߊ߬ߓߊߟߌ + ߦߋߡߍ߲ߕߊ ߟߎ߬ ߞߊߣߊ߬ ߘߊߦߟߍ߬ ߕߏߟߏ߲ߟߊ߲ ߞߏߘߋߞߏߘߋ ߞߣߐ߫߸ ߞߏ߬ߣߌ߲߬ ߞߵߊ߬ ߟߊߞߊ߬ ߥߊ߲߬ߥߊ߲߬ ߝߊ ߘߐ߫ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߥߟߏߒߖߘߍ߬ߡߊ ߜߊߛߏ߲ߣߍ߲߫. ߌ ߘߌ߫ ߛߋ߫ ߕߏߟߏ߲ߟߊ߲ ߞߏߘߋߞߏߘߋ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߣߴߌ ߓߐ߫ ߘߊ߫ ߥߊ߲߬ߥߊ߲߬ ߝߊ ߗߏ߯ߦߊ ߘߐ߫ + ߞߣߐߘߐ߫ ߞߊ߲߫ ߖߏߣߡߊ + PeerTube ߛߐߘߊ ߟߎ߬ + ߌ ߟߊ߫ PeerTube ߛߐߘߊ߫ ߤߍߣߍ߲ߣߊ߲ߕߊ ߟߎ߬ ߛߎߥߊ߲ߘߌ߫ + ߛߐߘߊ ߏ߬ ߦߋ߲߬ ߞߘߐ߬ߡߊ߲߫ + ߕߏߟߏ߲ߟߊ߲ + ߊ߬ߓߍ߯ + ߝߎ߬ߕߎ߲߬ߕߌ߫ ߘߊ߲߬ߕߍ߰ߟߌ + ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ + ߥߙߏߝߋ ߟߎ߬ + ߖߌ߬ߦߊ߬ߖߟߎ ߟߎ߬ + ߓߟߏ + ߕߣߐ߬ߓߐ߬ߟߊ ߟߎ߬ + ߕߌߛߐ߲ ߠߎ߬ + ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߣߌߎߔߌߔ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ + ߛߎ߬ߢߊ߬ ߞߋߟߋ߲߫ ߔߋ߫ + ߞߐߕߐ߮ + ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߞߊ߬ ߝߎ߬ߕߎ߲߬ߕߌ ߟߎ߬ ߞߐߡߌ߲ߦߊ߫ + [ߟߐ߲ߓߊߟߌ] + ߞߊ߬ ߦߟߍ߬ߡߊ߲߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߘߐ߫ + ߖߌ߬ߦߊ߬ߖߟߎ߬ ߘߐ߬ߢߋߙߋ߲ߞߎ߲ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ + ߖߌ߬ߦߊ߬ߖߟߎ߬ ߘߐ߬ߢߋߙߋ߲ߞߎ߲ ߛߋ߲߬ߕߊ߯ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߥߦߏ߬ ߞߎߘߊ ߟߎ߬ + ߡߊ߬ߝߘߎ߬ߟߌ߫ ߥߦߏ߬ ߞߎߘߊ ߟߎ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ + ߝߎ߬ߕߎ߲߬ߕߌ߫ ߘߊ߲߬ߕߍ߰ߟߌ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ + ߞߊ߬ ߡߐ߰ߦߊ߬ߟߐ߲߫ ߦߟߌߘߏ߲ ߠߎ߬ ߝߌߘߊ߲߫ + ߥߦߏ߬ ߕߏߟߏ߲ߣߍ߲ ߠߎ߬ ߘߝߐ߬ߦߊ ߖߐ߬ߛߌ߫ ߊ߬ߣߌ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ + ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߡߊ߬ߝߍ߬ߣߍ߲߬ߣߍ߲߫ ߘߝߐ߬ߦߊ ߡߎ߬ߡߍ ߖߐ߬ߛߌ߫ ؟ + ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲߫ ߘߝߐ߬ߦߊ ߓߘߊ߫ ߖߐ߬ߛߌ߫ + ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߡߎ߬ߡߍ ߖߐ߬ߛߌ߫ ؟ + ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߓߘߊ߫ ߖߐ߬ߛߌ߫ + ߛߋ߫ ߡߊ߫ ߞߍ߫ ߞߏ߬ߋߞߏ߬ߋ ߟߎ߬ ߓߍ߯ ߖߛߐ߫ ߟߋ߫ + ߝߎ߬ߕߎ߲߬ߕߌ߬ ߘߊߓߍ߲߬ߓߊߟߌ ߘߏ߫ ߓߘߊ߫ ߓߌ߬ߟߵߊ߬ ߘߐ߫ + ߟߛߊ߬ߦߌ߬ߟߌ ߞߊ߬ ߝߘߊ߫ ߕߏߟߏ߲ߠߊ ߝߎ߬ߕߎ߲߬ߕߌ ߟߊ߫ + ߞߐߞߊ߲߫ ߕߏߟߏ߲ߟߊ߲ ߠߎ߬ ߕߍ߫ ߛߘߌ߬ߜߋ߲߬ ߛߎ߯ߦߊ ߣߌ߲߬ ߕߊ߬ ߟߊ߫ + ߦߋߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ + ߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ + ߥߏ߬ߦߏ ߣߌ߲߬ ߕߍ߫ ߛߋ߫ ߟߊ߫ ߕߏߟߏ߲߫ ߠߊ߫ + ߞߵߊ߬ ߝߍ߲߬ߛߍ߲߬ߠߌ߲ ߠߊߘߌ߬ߢߍ߬ ߟߥߊߟߌߟߊ߲߫ ߜߘߍ߫ ߟߎ߫ ߞߐߞߊ߲߬ + ߣߌߎߔߌߔ ߓߘߊ߫ ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߛߐ߬ߘߐ߲߬߸ ߊ߬ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߘߊ߲߭ߕߍ߰ + ߞߊ߬ ߡߐ߬ߟߐ߲߬ ߖߏߣߡߊ ߟߎ߬ ߟߊߛߊ߬ߦߌ߬ + ߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߡߐ߬ߟߐ߲߬ ߖߏߣߡߊ ߟߎ߬ ߟߊߛߊ߬ߦߌ߬ ؟ + ߞߵߊ߬ ߞߏߝߐ߫ ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߟߊ߫ + ߘߊ߲߬ߕߍ߰ߟߌ߬ ߢߊ߲ߞߊ߲ߦߊߣߍ߲ ߓߊߓߌߟߊ߫ + ߊ߬ ߞߏߝߐ߫ GitHub ߞߊ߲߬ + ߊ߬ ߞߏߝߐ߫ + ߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߟߊߛߣߍ߫ ߥߟߊ߬ ߞߵߊ߬ߟߎ߬ ߟߊߝߏ߬ߦߌ߬ ߢߣߊߥߟߊ ߘߐ߫ ߕߏ߲ߘߋߣߍ߲߫ ߃ߝߍ߬ + ߝߏߛߌ߬ ߕߍ߫ ߦߋ߲߬ + ߊ߬ ߕߣߍߣߍ߫ ߞߵߊ߬ ߘߊߕߏߡߦߊ߫ + ߦߋߡߍ߲ߕߊ + ߊ߬ ߡߊߝߍߣߍ߲߫ ߣߴߌ ߟߊ߫ ߝߙߋߞߋ߫ ߛߎ߮ ߣߌ߲߬ ߘߊ߲߭ߕߍ߰ߣߍ߲߫ ߞߘߐ߬ߡߊ߲߫. ߝߙߋߞߋ߫ ߞߋߟߋ߲ ߓߊ߫ ߞߏߝߐ߫ ߞߏ߫ ߝߌ߲߬߸ ߏ߬ ߦߋ߫ ߊ߲ ߠߊ߫ ߕߎ߬ߡߊ ߟߋ߬ ߘߐߕߌߢߍ߫ ߟߊ߫߸ ߞߊ߬ ߞߏ߫ ߜߘߍ߫ ߟߎ߫ ߞߍ ߘߐߛߊ߬ ߊ߲ ߡߊ߬. + ߞߊ߲߬ߛߓߍ + ߝߊ߬ߝߘߎ߬ߓߊ߯ ߖߊ߬ߕߋ ߡߊ߬ߛߐ߬ߘߐ߲߬ߣߍ߲߬ ߕߍ߫ + ߞߊ߬ ߗߋߢߊ߫ ߟߎ߬ ߟߊߦߟߍ߬ߡߊ߲߬߸ ߡߍ߲ ߠߎ߬ ߓߊߕߐߡߐ߲ߣߍ߲߫ ߕߋ߲߬: + ߡߊ߬ߝߘߎ߬ߓߊ߰ ߝߏߛߌ߬ + + ߡߊ߬ߝߘߎ߬ߓߊ߰ %s + + ߦߋߟߌ߫ ߕߍ߫ ߦߋ߲߬ + + ߦߋߞߏ߫ %s + + ߡߐ߰ ߛߌ߫ ߕߴߊ߬ ߘߐߜߍ߫ ߠߊ߫ + + ߘߐߜߍߓߊ߯ %s + + ߡߐ߰ ߛߌ߫ ߕߴߊ߬ ߟߊߡߍ߲߫ ߠߊ߫ + + ߟߊ߬ߡߍ߲߬ߓߊ߰ %s + + ߦߋߡߍ߲ߕߊ߫ ߕߍ߫ ߦߋ߲߬ + ߦߋߡߍ߲ߕߊ߫ ߁߀߀+ + ߞߊ߲߬ߞߎ߬ߡߊ߬ ߕߍ߫ ߦߋ߲߬ + + ߥߦߏ߬ ߞߎߘߊ߫ %s + + ߞߵߊ߬ ߟߊߟߐ߬ + ߞߵߊ߬ ߛߌ߲ߘߌ߫ + ߜߋ߲߬ߟߎ߲߬ߠߌ߲߫ ߘߊ߬ߡߊ + ߞߵߊ߬ ߟߊߓߌ߬ߟߊ߬ + ߞߵߊ߬ ߕߐ߯ߟߊ߫ + ߞߐߕߐ߯ ߕߐ߮ + ߜߊ߲߬ߞߎ߲߬ߠߌ߲߫ ߢߐ߲߰ߝߍ + ߝߎ߬ߕߎ߲߬ߕߌ + ߣߌߎߔߌߔ ߦߋ߫ ߟߊ߬ߖߌ߰ߟߌ ߟߊ߫ + ߊ߬ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߕߐ߬ߝߍ߬ߦߊ߫ + ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲߫ ߛߌ߫ ߡߊ߫ ߘߊ߬ߠߊߕߍ߰ ߡߎߣߎ߲߬߸ ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲߬ ߖߏߣߡߊ ߛߎߥߊ߲ߘߌ߫ ߛߌߛߍ߲߬ + ߞߵߊ߬ ߝߎߟߋ߲߫ + ߞߟߏߘߋ߲߫ ߞߙߍߞߙߍߣߍ߲ ߝߊ߲߬ߓߊ + ߣߌߎߔߌߔ ߞߊ߲߬ + © %1$s߸ %2$s ߓߟߏ߫ %3$s ߞߘߐ߫ + ߊ߬ ߞߊ߲߬ & ߢߞߛ + ߡߊ߬ߜߍ߲߬ߠߌ߲ ߞߍ߫ + ߣߌߎߔߌߔ ߟߊ߬ߘߌߜߍ + ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ߬ ߞߍߣߍ߲߫ ߛߌߦߊߡߊ߲ ߠߎ߬ + ߣߴߌ ߞߊ߬ ߜߟߍ߬ߦߊ߬ ߡߊߛߐ߬ߘߐ߲߬ ߟߥߊߟߌߟߊ߲ ߠߊߓߊ߯ߙߊ ߘߐ߫߸ ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ߬ ߞߍߣߍ߲߫ ߛߌߦߊߡߊ߲ ߠߎ߬ ߡߊߝߍߣߍ߲߫ ߹ + ߘߝߐ߬ߦߊ + ߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߝߌ߬ߛߌ ߣߌ߲߬ ߖߐ߬ߛߌ߫ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߟߎ߬ ߘߐ߫؟ + ߦߋߡߍ߲ߕߊ߫ ߦߋߣߍ߲ߓߊ ߟߎ߬ + ߓߏ߬ߟߏ߲߬ ߞߐߜߍ ߞߣߐߘߐ + ߏ߬ ߘߴߌ ߟߊ߫ ߛߋ߲߬ߠߊ߬ ߢߊߓߐߟߌ ߟߎ߬ ߓߍ߯ ߝߌߘߊ߲߫. + ߛߎߥߊ߲ߘߟߌ ߞߍ߫ ߛߏ߬ߙߌ߲߬ߘߐ ߟߎ߬ ߟߊ߫߸ ߡߍ߲ ߠߎ߫ ߦߌ߬ߘߊ߬ߕߐ߫ ߓߏ߬ߟߏ߲߬ ߞߐߜߍ ߞߊ߲߬ + ߝߌ߬ߛߌ ߘߏ߫ ߕߣߍ߬ߣߍ߫ ߞߵߊ߬ ߖߏ߬ߛߌ߫ + ߞߐߜߍ߫ ߘߐߞߏߟߏ߲ + ߡߊ߬ߝߘߎ߬ߓߊ߰ ߕߍ߫ ߥߙߏߝߋ ߟߊ߫ ߝߟߐ߫ + ߥߙߏߝߋ ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ ߝߍ߲߬ߛߍ߲߫ + ߞߵߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߛߏ߬ߘߊ߲߬ߛߏ߬ ߅߀ + ߞߍߟߌ߫ ߖߏߣߡߊ ߞߣߐߘߐ߫ ߘߊߦߟߍ ߘߐ߫ — %s + ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ + ߝߎ߲ߞߊ߲ߡߊ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ + ߞߊ߬ ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ ߞߍ߫ ߞߎߘߍߦߌ߫ + ߡߊ߲߬ߞߊ߲ ߕߍ߰ + ߡߊ߲߬ߞߊ߲ ߓߌ߬ߟߊ߬ + ߊ߬ ߞߍ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߞߏ߬ߋߞߏ߬ߋ ߘߌ߫ + ߞߏ߬ߋ߬ߞߏ߬ߋ߬ ߘߎ߲ߡߕߊ ߓߐ߫ ߦߋ߲߬ + ߞߊ߬ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊߞߎ߲߬ߘߎ߬ + ߟߌ߬ߥߟߊ ߟߎ߬ ߡߊߛߐ߬ߘߐ߲… + ߞߣߐߘߐ߫ ߡߊߢߌߣߌ߲ߣߍ߲ ߖߛߐߟߌ + ߕߏߟߏ߲ߛߙߍߘߍ߫ ߞߎߘߊ + ߞߵߊ߬ ߘߐߕߐ߯ߟߊ߫ + ߞߊ߬ ߜߡߊ ߖߐ߬ߛߌ߫ + ߞߊ߬ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߣߌ߲߬ ߖߐ߬ߛߌ߫ ؟ + ߕߏߟߏ߲߫ ߛߙߍߘߍ ߓߘߊ߫ ߛߌ߲ߘߌ߫ + ߊ߬ ߓߘߊ߫ ߝߙߊ߬ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊ߫ + ߓߊߟߌߣߍ߲ ߓߘߊ߫ ߝߙߊ߬ ߛߎ߬ߢߊ߬ %d + ߛߌ߲ߘߌߣߍ߲߫ ߖߘߍ߬ߡߊ (ߟߊ߬ߦߟߍ߬ߓߊ߮ ߡߊ߫ ߛߐ߬ߘߐ߲߬) + ߞߘߐ߫ ߛߓߍ߫ ߛߌ߫ ߕߍ߫ ߦߋ߲߬ + ߞߵߊ߬ ߟߊߓߍ߲߬ + ߞߵߊ߬ ߟߝߊ߫ + ߛߌ߲ߘߌߣߍ߲߫ ߖߘߍ߬ߡߊ + ߞߘߐߛߓߍ ߟߎ߬ + ߦߟߌߕߏߟߊ߲ ߠߊ߫ ߝߎ߲ߘߌ ߟߎ߫ ߜߋ߬ߟߎ߲ ߘߌ߫ ߛߋ߫ ߞߍ߫ ߟߊ߫ ߛߊߓߎ߫ ߘߌ߫ ߞߊ߬ ߟߥߊߟߌߟߊ߲ ߜߊߘߊ߲߫ + ߞߊ߬ ߝߎ߬ߕߎ߲߬ߕߌ߬ ߝߙߊߕߌ ߦߌ߬ߘߊ߬ + ߝߎ߬ߕߎ߲߬ߕߌ߬ ߛߐߓߌߘߐߓߏ߲߫ ߘߏ߫ ߛߌ߲ߘߌ߫ + ߞߵߊ߬ ߟߊߛߣߍ߫ + ߊ߬ ߟߊߛߣߍ߫ ߞߊ߬ߓߌ߯ + ߞߵߊ߬ ߟߊߓߐ߫ ߞߊߕߘߍ߬ + ߟߊ߬ߛߣߍ߬ߟߌ ߦߴߌߘߐ߫… + ߞߊ߬ ߞߐߕߐ߮ ߟߊߛߣߍ߫ + ߟߊ߬ߓߐ߬ߟߌ߫ ߕߊ߬ߡߌ߲߬ߣߍ߲ + ߦߋߡߍ߲ߕߊ߫ ߞߎߘߊ + ߦߋߡߍ߲ߕߊ߫ ∞ + + ߦߋߡߍ߲ߕߊ߫ %s + + ߘߌ߬ߢߍ߬ ߦߴߊ߬ ߡߊߞߐ߬ߣߐ߲߬… + ߊ߬ ߓߘߊ߫ ߓߊߓߌߟߊ߫ ߞߓߊ߬ߞߘߐ߬ߘߏ߲ ߘߐ߫ + ߊ߬ ߡߊ߫ ߛߋ߫ ߓߊߓߌߟߊ߫ ߟߊ߫ ߞߓߊ߬ߞߘߐ߬ߘߏ߲ ߘߐ߫ + ߢߋߙߋ߲ߞߎ߲߫ ߖߊ߬ߕߋ߬ߓߐ + ߡߊ߬ߞߏ ߦߋ߫ ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߣߌ߲߬ ߠߊ߫ ߞߊ߬ +\nߝߎ߲ߞߊ߲ߡߊ߫ ߗߏ߯ߦߊ ߘߊߦߟߍ߬ + ߝߛߌ߬ ߞߋߟߋ߲߫ ߓߘߊ߫ ߖߏ߬ߛߌ߬. + ߡߐ߰ߦߊ߬ߟߐ߲߫ ߓߋ߭ + ߡߐ߰ߦߊ߬ߟߐ߲߫ ߓߋ߭ ߡߊߢߌߣߌ߲ߣߍ߲߫ + ߌ ߓߴߊ߬ ߝߎߟߋ߲߫ ߦߋ߫ \"ߊ߬ ߓߘߊ߫ ߓߊ߲߫\" ߛߐ߲߬ߞߌ߲߫ + ߞߟߏߘߋ߲߫ ߠߊߘߌ߬ߢߍ߬ߣߍ߲ ߠߎ߬ ߞߐߕߐ߯ ߕߐ߮ ߘߐ߫ + ߞߟߏߘߋ߲߫ ߠߊߘߌ߬ߢߍ߬ߓߊߟߌ ߟߎ߫ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ߕߐ߫ ߡߐ߬ߟߐ߲ ߣߌ߬ ߠߋ߬ ߟߊ߫ + ߣߘߐ߬ߓߌ߬ߟߊ߬ߟߌ߬ ߞߟߏߘߋ߲ + ߊ߬ ߓߘߊ߫ ߓߊ߲߫ + ߟߊ߬ߖߌ߰ߟߌ + ߟߊ߬ߘߌߢߍ ߟߎ߬ + ߊ߬ ߡߊߝߍߣߍ߲߫ GitHub ߞߊ߲߬ + ߊ߲ ߞߣߐߘߐߘߌߦߊ߫ + ߞߊ߬ ߓߟߏߢߐ߲߯ߠߊߛߊ߬ߦߌ߬ + ߊ߬ ߞߍ߫ ߘߊ߫ ߘߟߊߡߌߣߊߟߌ߫ ߡߙߌߦߊ߫ ߘߌ߫ ߓߊ߬߸ ߥߟߊ߫ ߡߊ߬ߞߙߍ߬ߟߌ߫߸ ߥߟߊ߫ ߘߏߝߙߍߕߍ߫ ߟߛߊߣߌ߲ߧߊ߫߸ ߤߊߡߊ߲ߕߍ߫ ߘߏߝߙߍߕߍ߫ ߡߝߊߟߋ߲. ߘߍ߬ߡߍ߲ ߞߍ߫ ߘߊ߫ ߢߊ߫ ߛߌ߫ ߡߊ߬߸ ߊ߬ ߞߊߢߌ߲߬. ߏ߬ ߟߋ ߦߴߊ߬ ߟߊߢߊ߬ ߟߊ߫ ߓߘߍߞߍ߹ + ߗߍߦߙߐ + ߣߌߎߔߌߔ ߟߊ߫ ߗߍߦߙߐ ߡߊߝߍߣߍ߲߫ ߞߊ߬ ߟߌ߬ߤߟߊ ߟߎ߬ ߣߌ߫ ߗߍߞߎߘߊ ߟߎ߫ ߛߐ߬ߘߐ߲߬. + ߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߓߘߍ߬ߓߘߍ߬ߟߌ + ߞߊ߬ ߜߎ߲߬ߘߎ߬ߞߏ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߊ߬ߙߊ߲߬ + ߞߊ߬ ߟߊ߬ߘߌߢߍ ߞߊ߬ߙߊ߲߬ + ߊ߬ ߡߊߝߍߣߍ߲߫ ߗߍߦߙߐ ߟߊ߫ + ߘߝߐ߬ߦߊ + ߞߐߟߕߊ߫ ߕߏߟߏ߲ߣߍ߲ ߠߎ߬ + ߥߙߏߝߋ߫ ߞߐߜߍ + ߝߎ߲ߞߎ߲ߟߋ߲ + ߥߙߏߝߋ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ + ߝߎ߲ߞߎ߲ߟߋ߲߫ ߖߏߣߡߊ + ߝߎ߲ߞߎ߲ߟߋ߲ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ + ߊ߬ ߓߘߊ߫ ߟߊߛߣߍ߫ + ZIP ߞߐߕߐ߮ ߕߍ߫ ߛߐ߲߬ + ߊ߬ ߓߘߊ߫ ߟߊߓߐ߫ + ߖߊ߲߬ߕߏ߬ߒߘߐ: ߞߐߕߐ߮ ߟߎ߬ ߓߍ߯ ߕߍ߫ ߛߋ߫ ߟߊߛߣߍ߫ ߟߊ߫. + ߕߏߟߏ߲߫ ߛߙߍߘߍ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ + ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲߬ ߕߍ߫ ߝߟߐ߫ + ߞߊ߲ ߘߌߣߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߣߌ߫ ߟߥߊߟߌߟߊ߲ ߣߊ߬ ߘߊ߫ ߘߐߟߥߌ߬ + ߛߊ߲ߞߊߥߟߌ ߟߎ߬ + ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߕߍ߫ ߛߋ߫ ߟߊ߫ ߖߛߐ߫ ߟߊ߫ + ߘߌ߲߬ߞߌ߬ߙߊ߬ߡߊ + ߘߌߦߊߢߍߣߍ߲ߓߊ ߟߎ߬ + ߜߊ߬ߙߊ ߟߎ߬ + ߕߏߟߏ߲߫ ߛߙߍߘߍ + ߞߵߊ߬ ߖߏ߬ߛߌ߫ + ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ + ߡߍ߲ߕߊ߫ ߢߊߓߐߟߌ ߟߎ߬ + ߊ߬ ߘߌ߯ߣߍ߲ ߕߏ߫ ߞߵߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߞߎߘߊ ߣߌ߫ ߞߟߊߡߊ߲ + ߞߎߘߊ߫ ߝߙߊ߬ߣߍ߲ ߠߎ߬ + ߞߵߊ߬ ߞߍ߫ ߣߊ߬ߕߐ ߘߌ߫ ߕߎ߲߰ߠߌ߲ ߘߐ߫ + ߊ߬ ߓߘߊ߫ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߊ߬ ߓߘߊ߫ ߞߍ߫ ߣߊ߬ߕߐ ߘߌ߫ ߕߎ߲߰ߠߌ߲ ߘߐ߫ + ߞߊ߬ ߕߏߟߏ߲ ߘߊߡߌ߬ߣߊ߬ ߝߢߐߘߊ߫ ߝߎ߲ߞߊ߲ߡߊ ߘߐ߫ + ߥߏ߬ߦߏ߫ ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ ߖߛߐ ߦߴߌߘߐ߫… + ߢߣߊߥߟߊ ߘߊߦߟߍ߬ + ߢߣߊߥߟߊ ߘߊߕߎ߲߯ + ߟߞߊ߬ߟߌ߫ ߞߍߟߊ߲߫ ߛߊ߬ߥߏ߬ߣߍ߲ߕߊ + ߕߐ߮ + ߞߵߊ߬ ߝߙߊ߬ ߕߏߟߏ߲ߛߙߍߘߍ ߟߊ߫ + LeakCanary ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ + ߞߊ߬ ߦߟߌߕߏߟߊ߲ ߠߊ߫ ߝߎ߲ߘߌ ߟߎ߬ ߦߌ߬ߘߊ߬ + ߞߊ߬ \"ߘߐߛߊߙߌߟߊ߲ ߠߜߊߛߊ߲߫\" ߦߌ߬ߘߊ߬ + ߞߊ߬ \"ߘߐߛߊߙߌߟߊ߲ ߠߜߊߛߊ߲߫\" ߦߌ߬ߘߊ߬ + ߥߦߏ߬ ߞߎߘߊ ߟߎ߫ ߕߎ߬ߢߊ߬ߟߐ߲ ߠߊߥߟߌ߬ + ߞߊ߬ ߟߥߊߟߌߟߊ߲ ߠߊߜߊߛߊ߲߫ + ߗߋߢߊߟߌ ߟߎ߬ ߞߟߏߜߍ߫ ߓߐߛߎ߲ߡߊ ߟߎ߬ ߦߌ߬ߘߊ߬ߕߐ߫ ߟߋ߬ ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߠߌ߲ ߘߐ߫ + ߞߋߟߋߞߋߟߋ ߟߊ߫ ߝߊߟߊ߲ߓߍߦߊ ߟߊߛߊ߬ + ߞߋߟߋߞߋߟߋ ߟߊ߫ ߝߊߟߊ߲ߓߍߦߊ ߟߊߛߊ߬ ߣߴߌ ߞߊ߬ ߥߊ߲߬ߊߥߊ߲߬ ߝߌ߲ ߦߋ߫ ߥߟߊ߫ ߜߊߘߊ߲ߜߊߘߊ߲ߠߌ߲ ߦߋߡߍ߲ߕߊ ߘߏ߫ ߘߐߛߊߙߌ߫ ߕߎߡߊ + ߞߊ߬ ߖߌ߬ߦߊ߬ߓߍ߫ ߦߌ߬ߘߊ߬ߟߊ߲ ߠߎ߫ ߝߍ߲߬ߛߍ߲߫ + ߏ߬ ߦߋ߫ ߔߌߛߊߞߏ߫ ߟߊ߫ ߡߙߎߝߋ߫ ߞߟߐ߬ߡߊ ߟߎ߫ ߟߋ߬ ߝߍ߲߬ߛߍ߲߬ ߠߊ߫ ߖߌ߬ߦߊ߬ߓߍ ߟߎ߫ ߞߎ߲߬ߘߐ߫ ߞߵߊ߬ߟߎ߬ ߓߐߛߎ߲ ߦߌ߬ߘߊ߬: ߥߎߟߋ߲߬ߡߊ߲ ߦߋ߫ ߞߙߏ߬ߝߏ ߕߊ ߘߌ߫߸ ߓߊ߯ߡߊ ߦߋ߫ ߝߘߍ߬ ߜߍߟߍ߲ ߕߊ ߘߌ߫ ߊ߬ߣߌ߫ ߝߙߌߛߌߡߊ ߦߋ߫ ߦߟߌߕߏߟߊ߲ ߕߊ ߘߌ߫ + ߟߊ߬ߓߐ߬ߟߌ ߦߴߌߘߐ߫… + ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬ + ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߟߊߛߊ߬ߣߍ߲ ߠߋ߬ + ߞߵߊ߬ ߖߏ߬ߛߌ߫ + ߘߌ߬ߢߍ߬ ߦߋ߫ ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߛߎߥߊ߲ߘߌ߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߞߐߟߊ߫ + ߛߓߍߘߋ߲ ߣߋ߫ ߖߊ߬ߕߋ߬ߘߋ߲ ߠߎ߬ + ߥߦߏ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߊ ߞߊߟߌ߲ ߣߌ߫ ߝߍ߯ߡߊ߲ ߊ߲ߘߙߏߦߌߘ ߞߊ߲߬. + ߣߌߎߔߌߔ ߟߊߥߙߌߞߌߣߍ߲߫ ߓߐߒߖߘߍߘߐߓߊ߮ ߟߎ߫ ߟߋ߬ ߓߟߏ߫ ߊ߬ߟߎ߬ ߟߊ߫ ߕߎ߬ߡߊ߬ ߘߐ߬ߞߏߟߏ߲ ߠߎ߬ ߘߐ߫߸ ߞߴߊ߬ ߟߊߢߊ߬ ߊ߬ߟߎ߬ ߛߋߞߏ߫ ߘߊ߬ߡߊ߬ߦߌߙߊ ߟߊ߫. ߌ ߘߌ߫ ߛߋ߫ ߝߌ߬ߙߋ߲߬ߕߎ߬ ߛߐ߲ߞߐ ߘߌ߫ ߟߴߊ߬ߟߎ߫ ߡߊ߬߸ ߞߴߊ߬ߟߎ߬ ߞߣߐߘߐߘߌߦߊ߫ ߟߢߊ߬ߟߌ ߟߊ߫ ߓߘߍߞߍ. + ߣߌߎߔߌߔ ߘߊߞߎ߲ ߦߴߊߟߎ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߕߊ߬ ߟߊ߫ ߛߍ߬ߓߍ ߖߍ߬ߘߍߖߍ߬ߘߍ ߟߋ߬ ߟߊ߫. ߏ߬ ߘߐ߫߸ ߟߥߊߟߌߟߊ߲ ߕߍ߫ ߟߐ߲ߕߊ߫ ߛߌ߫ ߟߥߊ߫ ߟߊ߫ ߣߴߊ߬ ߡߴߌ ߟߊ߫ ߘߌ߬ߢߍ ߢߌߣߌ߲߫. +\nߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߓߘߍ߬ߓߘߍ߬ߟߌ ߦߴߊ߬ ߝߊߙߊ߲ߝߊ߯ߛߌ߫ ߟߴߌ ߢߍ߫ ߟߋ߬ ߥߘߋ߬ߥߘߋ߬ߟߌ ߘߝߊߣߍ߲ ߘߐ߫߸ ߟߐ߲ߕߊ߫ ߢߌ߬ߡߊ߲߬ ߠߥߊߕߐ߫ ߊ߬ ߣߌ߫ ߢߌ߬ߡߊ߲߬ ߠߊߞߎ߲߬ߘߎ߲߬ߕߐ߫ ߌ ߓߊ߫ ߞߍ߫ ߜߊߛߊ߲ߠߌ߲߫ ߘߊ߲߬ߕߍ߰ߟߌ ߟߥߊ߫ ߟߊ߫. + ߣߌߎߔߌߔ (NewPipe) ߦߋ߫ ߡߊ߬ߞߏ߬ߟߊ߬ߓߐ߬ ߛߎ߲ߝߘߍ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߠߋ߬ ߘߌ߫: ߌ ߘߌ߫ ߛߴߊ߬ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߞߵߊ߬ ߞߊ߬ߙߊ߲߬߸ ߞߵߊ߬ ߘߐߕߟߊ߫߸ ߊ߬ߣߌ߫ ߞߵߊ߬ ߟߊߢߊ߬ ߦߏ߫ ߊ߬ ߘߎߡߊ߲߫ ߌ ߢߍ߫ ߢߊ ߡߍ߲. ߊ߬ ߕߌ߯ߕߌ߮ ߘߐ߫߸ ߌ ߘߌ߫ ߛߴߊ߬ ߟߊߖߍ߲ߛߍ߲߫ ߠߊ߫ ߥߟߊ߫ ߞߊ߬ ߘߐ߬ߝߊ߬ߟߋ߲߬ߠߌ߲ ߞߍ߫ ߊ߬ ߘߐ߫ ߝߘߏ߬ߓߊ߬ ߟߊߘߌߢߍ߫ ߛߙߊߕߌ ߟߎ߬ ߞߘߐ߫ (GNU General Public License) ߦߏ߫ ߊ߬ ߟߊߖߍ߲ߛߍ߲ߣߍ߲߫ ߛߎ߲ߝߘߍ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߠߎ߬ ߛߌ߲ߘߌߘߊ ߓߟߏ߫ ߢߊ ߡߍ߲ (Free Software Foundation) ߊ߬ ߓߐߞߏ߫ ߃߲ ߘߐ߫߸ ߥߟߊ߫߸ ߌ ߛߊ߬ߥߏ߬ߣߍ߲߬ߕߊ ߟߊ߫ ߞߊ߬ ߓߍ߲߬ ߊ߬ ߓߐߞߏ߫ ߞߘߐ߫ ߛߌ߫ ߡߊ߬. + ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߢߊߓߐߟߌ ߟߎ߬ ߝߊߣߊ߲߫ ߟߊߛߣߍ߫؟ + ߞߊ߬ ߕߏߟߏ߲ ߘߊߡߌ߬ߣߊ߬ ߝߊ߲߬ߝߘߊ ߞߘߐ߫ + ߦߙߍߞߍߟߌ ߦߴߌߘߐ߫... ߊ߬ ߘߌ߫ ߛߋ߫ ߥߛߎ߬ ߞߎߘߎ߲߬ߣߍ߲߫ ߕߊ߬ ߟߊ߫ + ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߞߏ߬ߋߞߏ߬ߋ ߓߘߊ߫ ߡߊߝߊ߬ߟߋ߲߬. + ߞߵߊ߬ ߥߊߘߏ߫ + ߞߊ߬ Rx ߢߌ߬ߣߊ߬ߓߐ߬ߕߊ߫ ߟߊߘߌߓߊߟߌ ߟߎ߫ ߘߊ߲߬ߕߍ߰ߟߌ߫ ߞߘߊߡߊ߫ ߞߎߘߎ߲ ߠߎ߬ ߞߐߞߊ߲߬ ߥߟߊ߫ ߥߊߟߌߦߊ ߛߌ߬ߡߊ߬ߦߊ ߞߎ߲߬ߕߊ߮ ߞߘߐ߫ ߦߙߍߞߍߟߌ߫ ߞߐߝߍ߬ + ߞߊ߬ ߕߎ߬ߡߘߊ߬ ߓߐߛߎ߲ߡߊ ߦߌ߬ߘߊ߬ ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߠߌ߲ ߠߎ߫ ߞߊ߬ + ߜߘߍ ߟߊ߫ ߟߊ߬ߘߌߢߍ + ߦߋߡߍ߲ߕߊ߫ ߘߐߛߊߙߌߟߊ߲ + ߝߌ߬ߛߌ ߣߌ߲߬ ߦߋ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߝߎߛߋߡߦߊߣߍ߲ ߠߎ߬ ߞߣߐ߫ ߞߘߐ߬ߡߊ߲߫. + ߞߊ߬ ߞߟߏߜߍ߫ ߘߍ߲߬ߘߍ߲ ߣߌ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߫ ߞߘߐߛߓߍ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ߫ ߝߙߋߞߟߊ ߟߎ߬ ߡߊߝߊ߬ߟߋ߲߬. ߡߊ߬ߞߏ ߦߋ߫ ߟߥߊߟߌߟߊ߲߫ ߘߐ߬ߥߌ߬ߟߌ ߟߊ߫ ߞߵߊ߬ ߓߟߏߦߊ߫ + ߝߎ߬ߕߎ߲߬ߕߌ߫ ߛߌ߬ ߓߊ߲ߣߍ߲ ߠߎ߬ ߞߏߐߝߐ߫ + ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߣߍ߫ ߟߊߛߣߍ߫ ߟߊ߫ + ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߕߍ߫ ߛߋ߫ ߟߊߓߐ߫ ߟߊ߫ + ߌߟߊ߫ߜߊ߲߬ߞߎ߲߬ߕߐ߮߸ soundcloud.com/ߌߟߊ߫ߜߊ߲߬ߞߎ߲߬ߕߐ߮ + ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߗߋߥߊߟߌ ߣߌ߲߬ ߘߌߣߊ߬ ߞߙߏ߬ߝߏ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߖߛߐ߫ ߞߏߛߓߍ߫. +\n +\nߞߵߊ߬ ߓߟߏߕߎ߲߰؟ + ߞߵߊ߬ ߢߡߊߛߊ߬ߦߌ߬ + ߞߊ߲ߡߊߛߙߋ߫-ߕߟߊ + ߞߊ߬ ߓߍ߲߬ ߟߐ߲ߕߊ ߟߎ߬ ߟߊߞߊ߲ߘߊ߫ ߝߘߏ߬ߓߊ߬ ߞߎߙߎ߲ߘߎ (GDPR) ߡߊߓߏ߲߬ߧߊ ߡߊ߬߸ ߊ߲ ߧߴߌ ߖߊ߲߭ߓߌ߬ߟߊ߬ ߟߊ߫ ߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ߫ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߐ߫. ߘߌ߬ߢߍ߬ ߦߴߊ߬ ߘߐߞߊ߬ߙߊ߲߬ ߞߏߢߌ߲߬ߡߊ߬. +\nߌ ߞߊߞߊ߲߫ ߠߋ߬ ߞߵߌ ߛߐ߲߬ ߊ߬ ߡߊ߬ ߞߏ߫ ߛߴߌ ߘߌ߫ ߛߋ߫ ߜߊߛߊ߲ߠߌ߲߫ ߘߊ߲߬ߕߍ߰ߟߌ ߟߥߊ߫ ߊ߲ ߡߊ߬. + ߌ ߛߐ߲߬ + ߌ ߓߊ߲߬ + ߘߊ߲߬ ߕߴߊ߬ ߟߊ߫ + ߞߊ߬ ߓߍ߲߬ߡߊ ߘߊ߲߬ߠߊߕߍ߬ ߜߋߟߋ߲ߜߋߟߋ߲߫ ߟߐ߲ߕߊ ߟߎ߬ ߟߊߓߊ߯ߙߊ߫ ߕߎߡߊ + ߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߟߊ߫ ߥߦߏ߬ ߞߎߘߊ ߟߎ߫ ߛߏߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߟߊߣߊ߬ + ߞߙߏ߬ߝߏ߫ ߛߎ߮ ߓߍ߯ + ߟߏ߲ߘߐߦߊߟߌ ߟߎ߬ + ߟߏ߲ߘߐߦߊߟߌ ߟߎ߬ ߡߊߝߍߣߍ߲߫ + ߞߊ߬ ߓߐߞߏ߫ ߞߎߘߊ ߟߎ߫ ߕߎ߬ߢߊ߬ߟߐ߲߫ ߓߟߏ ߟߊ߫ + ߞߵߊ߬ ߡߊߖߌ߰ ߟߥߊߟߌߟߊ߲ ߘߐߦߟߍߡߊ߲߫ ߕߎߡߊ + ߝߏߛߌ߬ + ߞߵߊ߬ ߡߊߖߌ߰ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߬ ߝߎ߲ߞߊ߲ߡߊ ߘߐ߫ + ߞߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߘߊߦߟߍ߬ ߊ߬ ߖߍ߬ߘߍߡߊ߬ — %s + ߥߝߌ߫ ߘߐߙߐ߲߫ ߞߊ߲߬ + ߦߋߟߌ߫ ߗߏ߯ߦߊ߫ ߛߙߍߘߍ + ߢߊ߲ߛߊ߲ + ߔߊ߬ߔߘߊ + ߖߘߍ߬ߢߍ߫ + ߞߊ߬ ߢߍߕߊ߮ ߜߊߟߊ߲ߞߊ ߟߊߕߌ߲ ߦߌ߬ߘߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߞߊ߲߬ + ߓߘߍ߬ߦߊ߫ ߘߎ߰ߟߊ߬ߕߊ (ߘߐ߰ߡߊ߬ߣߍ߲) + ߊ߬ ߞߣߊ߫ ߦߌ߬ߘߊ߬ + ߌ ߦߋ߫ ߣߌߎߔߌߔ ߓߐߞߏ߫ ߟߊߓߊ߲ ߠߋ߬ ߟߊߓߊ߯ߙߊ ߟߊ߫ + ߊ߬ ߕߐߘߐ߲߫ ߞߵߊ߬ ߟߊߖߌ߰ %s + ߊ߬ ߓߘߊ߫ ߓߊ߲߫ + ߘߞߐ߬ߣߐ߲߬ߠߌ߲ + ߊ߬ ߟߊߟߐ߬ߣߍ߲߫ + ߞߐߝߍ߫-ߦߙߍߞߍߟߌ + ߟߛߊ߬ߦߌ߬ߟߌ + ߞߵߊ߬ ߟߊߕߎ߲߰ + ߓߊ߲߬ ߓߘߊ߫ ߞߍ߫ ߗߋߥߊߟߌ ߘߐ߫ ߞߊ߲ߞߋ ߓߟߏ߫ + ߟߏ߲ߘߐߦߊߟߌ߫ ߕߎ߬ߢߊ߬ߟߐ߲ ߦߴߌߘߐ߫… + ߟߊ߬ߖߌ߰ߟߌ ߓߘߊ߫ ߗߌߙߏ߲߫ + ߞߐߕߐ߯ ߘߏ߫ ߓߘߊ߫ ߟߊߖߌ߰ ߕߐ߯ ߛߎ߯ ߞߋߟߋ߲ ߣߌ߲߬ ߘߌ߫ ߞߘߐ߬ߡߊ߲߫ + ߟߊ߬ߖߌ߰ߟߌ ߘߏ߫ ߦߴߌߘߐ߫ ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߘߌ߫ + ߞߊ߬ ߝߎ߬ߕߎ߲߬ߕߌ ߦߌ߬ߘߊ߬ + ߞߐߕߐ߮ ߕߍ߫ ߛߋ߫ ߛߌ߲ߘߌ߫ ߟߊ߫ + ߜߊ߲߬ߞߎ߲߬ߠߌ߲߬ ߠߊߞߊ߲ߘߊߣߍ߲ ߕߍ߫ ߛߋ߫ ߓߌ߬ߟߊ߬ ߟߊ߫ ߛߋ߲߬ߠߊ߫ + ߛߐߘߊ ߕߍ߫ ߛߋ߫ ߟߊ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ + ߛߐߘߊ ߕߍ߫ ߟߐ߲ߕߊ߫ ߟߊߣߊ߬ ߟߊ߫ + ߊ߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ + ߞߐߝߍ߫-ߦߙߍߞߍߟߌ ߓߘߊ߫ ߗߌߙߏ߲߫ + ߣߌߎߔߌߔ ߘߊߕߎ߲߯ ߘߊ߫ ߟߋ߬ ߞߵߊ߬ ߕߘߍ߬ ߊ߬ ߦߋ߫ ߓߊ߯ߙߊ߫ ߟߊ߫ ߞߐߕߐ߮ ߞߊ߲߬ + ߜߍߞߣߍ߫ ߛߌ߫ ߕߍ߫ ߕߙߏߞߏ ߞߊ߲߬ + ߢߍߕߊ߮ ߓߘߊ߫ ߝߏ߫߸ ߓߊߏ߬ ߞߐߕߐ߮ ߓߘߊ߫ ߖߏ߬ߛߌ߫ + ߟߊ߬ߖߌ߰ߟߌ ߣߌ߲߬ ߕߍ߫ ߛߋ߫ ߟߊߛߊ߬ߦߌ߬ ߟߊ߫ + ߞߊ߬ ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߠߎ߬ ߖߏ߬ߛߌ߫ + ߞߊ߬ ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߠߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߫ ߝߍ߬ߘߍ ߞߊ߲߬ ؟ + ߟߥߊߟߌߟߊ߲߫ ߞߊ߲ + ߞߵߊ߬ ߟߞߊߟߌߦߊ߫ ߡߊ߬ߞߎ߲ ߕߎ߬ߡߊ ߟߎ߬ ߘߐ߫ + ߛߋ߲߬ߘߊ + ߗߡߍ߬ߘߐ߬ߦߊ + ߕߎ߬ߢߊ߬ߟߐ߲ ߡߊߛߊ߬ߦߌ + ߞߙߏ߬ߝߏ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲߫ ߛߎ߯ߦߊ + ߞߊ߬ ߟߥߊߟߌߟߊ߲߫ ߟߏ߲ߘߐߦߊߟߌ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߦߌ߬ߘߊ߬ ߣߌ߫ ߓߐߞߏ߫ ߞߎߘߊ߫ ߛߐ߬ߘߐ߲߬ ߘߊ߫ + ߞߵߊ߬ ߡߊߖߌ߰ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߘߐ߫ + ߤߓߊߘߊ߲߫ + ߊ߬ ߓߘߊ߫ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߞߊ߬ ߕߐ߯ ߞߎ߲߬ߞߋߟߋ߲߫ ߘߏ߫ ߛߌ߲ߘߌ߫ + + ߟߊ߬ߖߌ߰ߟߌ߬ %s ߓߘߊ߫ ߓߊ߲߫ + + ߞߵߊ߬ ߞߊ߲߬ߟߊ߫ + ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߦߋ߫ ߞߐߕߐ߮ ߘߏ߫ ߟߊ߫ ߦߊ߲߬ ߞߘߐ߬ߡߊ߲߫ + ߟߊ߬ߖߌ߰ߟߌ ߘߏ߫ ߦߋ߫ ߘߞߐ߬ߣߐ߲߬ߠߌ߲ ߠߊ߫ ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߘߌ߫ + ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲߫ ߖߊ߬ߕߋ ߘߊ߲߭ + ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲߫ ߖߊ߬ߕߋ ߘߊ߲߭ ߖߊ߬ߣߌ߲߬ ߟߊ߬ߖߌ߰ߟߌ ߘߐߛߊ߬ ߕߍ߫ + ߞߵߊ߬ ߓߟߏߕߍ߰ ߜߋߟߋ߲ߜߋߟߋ߲߫ ߠߊ߫ ߜߊ߲ߞߎ߲ߠߌ߲ ߠߎ߬ ߟߊ߫ + ߊ߬ ߕߐ߬ߣߐ ߦߴߊ߬ ߟߊ߫ ߦߟߍ߬ߡߊ߲߬ ߕߎߡߊ ߜߋߟߋ߲ߜߋߟߋ߲ߠߊ߫ ߟߐ߲ߕߊ ߟߎ߫ ߞߊ߲߬߸ ߞߏ߬ߣߌ߲߬ ߟߊ߬ߖߌ߰ߟߌ ߓߍ߯ ߕߍ߫ ߛߐ߲߬ ߠߊ߫ ߟߊ߬ߘߎ߲߬ߠߌ߲ ߡߊ߬ + ߞߵߊ߬ ߘߊߕߎ߲߯ + + ߟߊ߬ߖߌ߰ߟߌ߬ %1$s ߓߘߊ߫ ߖߏ߬ߛߌ߬ + + ߞߵߊ߬ ߟߊߟߐ߬ + ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ ߘߊߡߌ߬ߣߊ߬ + ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ ߟߊߘߎ߲߫ + ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߫ ߥߊ߫ ߦߙߐ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߫ + ߌ ߣߊ߬ߕߐ߫ ߟߋ߬ ߡߊ߬ߢߌ߬ߣߌ߲߬ߞߊ߬ ߟߊ߫ ߟߊ߬ߖߌ߰ߟߌ߫ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ߫ ߟߊߞߎ߲߬ߘߎ߲߬ ߦߙߐ ߡߊ߬. +\nߟߊ߬ߘߌߢߍ ߘߌ߫ ߞߊ߲ߞߋ߫ ߞߎ߲ߓߍ߲߫ ߛߎߥߊ߲ߘߌߟߊ߲ (SAF) ߡߊ߬ ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߵߊ߬ ߟߊߖߌ߰ ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲ ߠߋ߫ ߞߊ߲߬ + ߞߊ߬ ߘߊ߲߭ߛߌ߰ ߟߊ߬ߖߌ߰ߟߌ߫ ߕߎ߲߰ߠߌ߲ ߠߊ߫ + ߟߊ߬ߖߌ߰ߟߌ߬ ߞߋߟߋ߲߫ ߔߋ߫ ߟߋ߫ ߣߊ߬ߕߐ߬ ߞߍ߫ ߟߊ߫ ߕߎ߬ߡߊ߬ߣߍ߲߬ ߞߋߟߋ߲ ߠߊ߫ + ߟߊ߬ߖߌ߰ߟߌ߫ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ߫ ߓߍ߯ ߟߊߞߎ߲߬ߘߎ߬ ߦߙߐ ߘߌߣߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߵߌ ߟߊ߫ + ߞߊ߲ߞߋ߫ ߞߎ߲ߓߍ߲߫ ߛߎߥߊ߲ߘߌߟߊ߲ (SAF) ߟߊߓߊ߯ߙߊ߫ + ߛߐߘߊ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ + ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ + ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ ؟ + ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߬ ߛߙߍߘߍ ߣߌ߲߬ ߘߐ߫ ؟ + ߌ ߟߊ߫ ߦߕߎߓߎ߫ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߟߊߛߣߍ߫ ߞߊ߬ߓߌ߫ Google Takeout: +\n +\n߁. ߛߘߌ߬ߜߋ߲ ߣߌ߲߬ ߞߐߡߌ߬ߘߊ߬: %1$s +\n߂. ߌ ߜߊ߲߬ߞߎ߲߬ ߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߟߊ߫ ߣߴߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ ߘߊ߫ +\n߃. ߌ ߦߋ߫ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫ \"ߟߐ߲ߕߊ ߟߎ߬ ߓߍ߯ ߦߴߊ߬ ߘߐ߫\"߸ ߏ߬ ߞߐ߫ ߦߋ߫ \"ߞߊ߬ ߓߍ߯ ߓߊߕߐߡߐ߲ߣߍ߲߫ ߓߐ߫\"߸ ߏ߬ ߞߐ߫߸ ߌ ߦߋ߫ \"ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬\" ߘߐߙߐ߲߫ ߓߊߕߐߡߐ߲߫ ߞߊ߬ ߓߊ߲߫ ߞߊ߬ \"ߏ߬ߞߍ߫\" ߛߐ߲߬ߞߌ߲߫ +\n߄. ߌ ߦߋ߫ \"ߢߍߕߊ\" ߛߐ߲߬ߞߌ߲߫ ߞߊ߬ ߓߊ߲߫ ߞߊ߬ \"ߟߊ߬ߓߐߟߌ ߘߏ߫ ߛߌ߲ߘߌ߫\" ߛߐ߲߬ߞߌ߲߫ +\n߅. ߌ ߦߋ߫ \"ߞߊ߬ ߟߊߖߌ߰\" ߞߎ߬ߘߎ ߛߐ߲߬ߞߌ߲߫ ߊ߬ ߟߊ߲ߞߣߍߡߊߣߍ߲ ߞߐ߫ +\n߆. ߊ߬ ߛߐ߲߬ߞߌ߲߫ \"ߞߊ߬ ߞߐߕߐ߮ ߟߊߛߣߍ߫\" ߞߊ߲߬ ߘߎ߰ߟߊ߫ ߦߊ߬߸ ߦߋ߫ .zip ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߛߎߥߊ߲ߘߌ߫ +\n߇. [ߣߌ߫ ߝߝߝ ߟߊߛߣߍ ߗߌߙߏ߲߫ ߘߊ߲߫] ߦߋ߫ ߝߝߝ ߞߐߕߐ߮ ߓߐ߬ߛߌ߬ ߊ߬ ߘߐ߫ (ߊ߬ ߛߌߦߊߡߊ߲ ߘߐ߫ ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߠߋ߬ \"YouTube and YouTube Music/subscriptions/subscriptions.csv\")߸ߊ߬ ߛߐ߲߬ߞߌ߲߫ \"ߞߐߕߐ߮ ߟߊߛߣߍ߲߫\" ߞߊ߲߬ ߘߎ߰ߟߊ߫߸ ߞߊ߬ csv ߞߐߕߐ߯ ߓߐ߬ߛߌ߬ߣߍ߲ ߛߎ߲ߥߊ߲ߘߌ߫ + ߌ ߟߊ߫ SoundCloud ߢߊߞߙߍ߫ ߛߘߌ߬ߜߋ߲ ߠߊߘߏ߬ ߥߊߟߴߌߟߊ߫ ߜߊ߬ߞߎ߲߬ߕߐ߮ ߞߊ߬ SoundCloud ߢߊߞߙߍ߫ ߘߏ߫ ߟߊߛߣߍ߫: +\n +\n߁. \"ߛߓߍߘߊ߫ ߗߏ߯ߦߊ\" ߟߊߢߊ߯ ߌߟߊ߫ ߓߟߐߟߐ߫ ߛߏ߲߯ߓߊߟߊ߲ ߞߣߐ߫ (ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߏ߬ ߕߴߌߟߊ߫ ߕߙߏߞߏ߫ ߕߊ߬ߕߊ ߟߊ߫) +\n߂. ߥߊ߫ ߛߘߌ߬ߜߋ߲ ߣߌ߲߬ ߞߊ߲߬: %1$s +\n߃. ߌ ߜߊ߲߬ߞߎ߲߬ ߣߴߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ ߘߊ߫ +\n߄. ߢߊߞߙߍ߫ ߛߘߌ߬ߜߋ߲ ߓߊߓߌߟߊ߫߸ ߌ ߟߊߛߌ߲߫ ߛߊ߲ ߦߋ߫ ߡߍ߲ ߡߊ߬ ߏ߬ ߘߌ߬. + ߘߐ߬ߛߊ߬ߙߌ߬ߟߌ߫ ߓߏ߬ߙߌ߬ߛߋ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߎ߬ + ߞߍߛߋ߲ + ߞߊ߲ߡߊߛߙߋ + ߓߐߢߐ߲߯ߓߟߏ (ߊ߬ ߘߌ߫ ߛߋ߫ ߞߍ߫ ߟߊ߫ ߘߐ߬ߝߊ߰ߟߌ ߛߊߓߎ߫ ߘߌ߫) + ߞߍߥߟߌ߫ ߞߍߕߊ߸ ߌ ߓߊ߫ ߞߍ߫ ߦߟߍ߬ߡߊ߲߬ ߠߊ߫ ߟߥߊߟߌߟߊ߲߫ ߜߘߍ߫ ߞߣߐ߫ ߞߵߌ ߕߏ߫ ߦߋߡߍ߲ߕߊ߫ ߘߐߛߊߙߌߟߊ߲ ߓߊߖߎ ߞߊ߲߬ — %s + ߛߙߍߘߍ + ߓߘߍ߬ߦߊ߫ ߛߊ߲ߘߐߕߊ (ߓߟߋ߬ߓߟߋ߬ߓߊ) + ߣߌߎߔߌߔ ߟߏ߲ߘߐߦߊߟߌ ߘߏ߫ ߡߊߛߐ߬ߘߐ߲߬ߕߊ ߦߋ߫߹ + ߞߐߕߐ߮ ߕߍ߫ ߛߋ߫ ߞߊ߲߬ߟߊ߫ ߟߊ߫ + ߞߎ߲߬ߕߋߟߋ߲߫ ߞߎ߲ߓߍ߲ ߕߍ߫ ߛߋ߫ ߛߌ߲ߘߌ߫ ߟߊ߫ + ߛߐߘߊ ߕߍ߫ ߛߐ߲߬ ߠߊ߫ ߟߊ߬ߖߌ߰ߟߌ߬ ߥߙߍ ߟߎ߫ ߡߊ߬߸ ߘߌ߬ߢߍ߬ ߦߴߊ߬ ߡߊߛߊ߬ߦߌ߬ @string/msg_threads = 1 ߟߊ߫ + ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߕߍ߫ ߛߋ߬ ߟߊ߫ ߞߍ߫ ߟߊ߫ ߛߐߘߊ ߟߊ߫ + ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߛߕߊ ߓߘߊ߫ ߓߊ߲߫ + ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߫ ߘߝߐ߬ߦߊ ߝߌߘߊ߲߫ + ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߫ ߘߝߐ߬ߦߊ ߝߌߘߊ߲߫ ߥߟߊ߫ ߞߊ߬ ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߠߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߬ ؟ + \"ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ\" ߟߋ߬ ߞߍ߫ ߟߊ߫ ߛߊߓߎ߫ ߘߌ߫ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ ߞߍ߫ ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲ ߞߊ߲߬ + ߞߵߊ߬ ߘߊߡߌ߲߬ߣߊ߬ ߊ߲ߘߙߏߌߘ 10 ߡߊ߬߸ \"ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ\" ߟߋ߬ ߘߐ߲߬ߙߐ߲߫ ߕߊ߬ ߟߊ߫ + ߞߊ߲ߞߋ ߟߊ߫ ߖߏߣߡߊ + ߞߊ߬ ߖߌ߬ߦߊ߬ߖߟߎ߬ ߦߋߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ ؟ + ߞߊ߬ ߖߌ߬ߦߊ߬ߖߟߎ߬ ߦߋߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ + ߦߋߡߍ߲ߕߊ ߟߎ߫ ߖߏ߬ߛߌ߬ߕߐ߫ ߟߋ߬߸ ߡߍ߲ ߠߎ߬ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߢߍ߫ ߥߊߟߴߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߞߐ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊ߫. +\nߌ ߟߊߣߍ߲߫ ߊ߬ ߟߊ߫ ؟ ߊ߬ ߕߍߣߊ߬ ߛߋ߫ ߟߊ߫ ߟߊߛߊ߬ߦߌ߬ ߟߊ߫߹ + ߐ߬ߤߐ߲߫߸ ߊ߬ߣߌ߫ ߘߏ߫ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߖߌ߬ߦߊ߬ߖߟߎ ߡߍ߲ ߠߎ߬ ߘߐ߫ + ߞߵߊ߬ ߓߍ߲߬ ExoPlayer ߟߊ߫ ߛߙߊߕߌ߫ ߛߌ߰ߣߍ߲ ߠߎ߫ ߡߊ߬߸ ߓߐߒߣߐ߬ߘߐ ߛߋ߲߬ߕߊ ߓߘߊ߬ ߞߍ߫ ߝߌ߬ߟߊ߲߬ %d ߘߌ߫ + + ߡߌ߬ߛߍ߲߬ %d + + + ߕߎ߬ߡߊ߬ߙߋ߲߬ %d + + ߖߛߐߓߊߟߌ ߟߎ߬: %d + ߥߏ߬ߦߏ ߖߛߐ… + ߥߏ߬ߦߏ ߦߙߍߞߍ… + ߥߏ߬ߦߏ߫ ߝߋ߲߫ ߞߎߘߊ ߟߎ߬ + ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߛߎߥߊ߲ߘߌ߫ + ߡߊ߬ߝߘߎ߬ߟߌ߬ ߛߌ߫ ߛߎߥߊ߲ߘߌߣߍ߲߫ ߕߍ߫ + + %d ߛߎߥߊ߲ߘߌߣߍ߲߫ + + ߞߙߎ ߕߐ߮ ߘߐߞߏߟߏ߲ ߠߋ߬ + ߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߞߙߎ ߣߌ߲߬ ߖߏ߬ߛߌ߫ ؟ + ߞߎߘߊ + ߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ߬ ߞߙߎߝߓߊߟߌ ߟߎ߬ ߘߐߙߐ߲߫ ߦߌ߬ߘߊ߬ + ߥߏ߬ߦߏ + ߥߏ߬ߦߏ߫ ߟߊߞߎߘߦߊ ߟߎ߬ ߕߍߟߊ + ߕߎ߬ߡߊ ߡߍ߲ ߕߊ߬ߡߌ߲ ߞߐ ߘߐ߫߸ ߥߏ߬ߦߏ ߟߎ߬ ߞߊߞߊ߲߫ ߞߊ߬ ߖߊ߬ߕߋ߬ ߞߘߐ߬ߡߊ߲ ߘߌ߫ — %s + ߞߊ߬ ߞߊߟߌ߲ ߗߏ߯ߦߊ ߟߊߢߊ߯ + ߞߊ߬ ߥߏ߬ߦߏ ߟߎ߫ ߦߌ߬ߘߊ߬/ߢߡߊߘߏ߲߰ + ߣߌߎߔߌߔ ߕߍ߫ ߞߣߐߘߐ ߣߌ߲߬ ߕߊ߬ ߟߊ߫ ߡߎߣߎ߲߬. +\n +\nߕߎ߬ߡߊ߬ ߘߐ߫߸ ߊ߬ ߘߌ߫ ߛߴߊ߬ ߕߊ߬ ߟߊ߫ ߓߐߞߏ߫ ߣߊ߬ߕߐ ߟߎ߬ ߘߐ߫. + ߥߙߏߝߋ߫ ߞߐߖߌߦߊ߫ ߞߏ߬ߋߞߏ߬ߋ + ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬. +\nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߡߍ߲ ߣߌ߫ ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ ߘߌ߫ ߓߍ߲߬ + ߦߋߡߍ߲ߕߊ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ YouTube Music Premium ߛߌ߲߬ߝߏ߲ ߠߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߓߟߏ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ. + %s ߦߋ߫ ߞߎ߲߭ ߣߌ߲߬ ߠߋ߬ ߝߐ߫ ߟߊ߫: + ߛߊ߲ߞߊߥߟߌ + ߥߎߢߊ߲ߓߍ߲ + ߖߘߍ߬ߢߍ߫ (ߕߙߏߞߏ߫ ߛߊߛߊ) + ߌ ߘߌߦߊߣߍ߲߫ ߛߎߘߐ߫ ߛߊߛߊ ߛߎߥߊ߲ߘߌ߫ — %s + ߌ ߘߌ߫ ߛߴߌ ߘߌߦߊߣߍ߲߫ ߛߎߘߐ߫ ߛߊߛߊ ߛߎߥߊ߲ߘߌ߫ ߟߊ߫ ߘߎ߰ߟߊ߫ ߦߊ߲߬ + ߟߊ߬ߖߌ߰ߟߌ ߓߘߊ߫ ߘߊߡߌ߲߬ߣߊ߬ + ߞߊ߬ ߞߟߏߜߍ߫ ߓߊߕߐߡߐ߲ ߠߊߛߊ߬ ߞߊ߲߬ߛߓߍ ߘߐ߫ + ߝߊ߬ߓߏ߲ + ߞߊ߲ + ߞߐߞߘߐߓߌ߲ߓߌ߲ + ߖߊ߬ߕߌ߮ + ߞߏ߬ߋߞߏ߬ߋ߫ ߛߘߌ߬ߜߋ߲ + ߝߘߏ߬ߓߊ + ߊ߬ ߛߙߍߘߍߦߊߣߍ߲߫ ߕߍ߫ + ߘߎ߲߬ߘߎ߬ߡߊ + ߞߣߐߕߊ + ߞߊ߲߬ߞߎ߬ߡߊ߬ ߜߊߘߊ߲ߣߍ߲ + ߡߍ߲ ߕߊ߲߬ߘߏ߬ߣߍ߲߫ ߛߌ߲ߘߌߓߊ߮ ߓߟߏ߫ + ߥߟߊ߬ߙߋ߲ ߗߏ߯ߦߊ + ߟߊߢߊ߯ߣߍ߲ + ߟߊߛߊ߬ߣߍ߲ + ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߟߊߛߊ߬ߣߍ߲߫ + ߞߊ߬ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߡߊߛߐ߬ߘߐ߲߬ + ߸ + ߦߋߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊߛߐ߬ߘߐ߲߬ߕߊ߬ ߕߍ߫ ߦߋ߲߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫ + ߓߘߍ߬ߦߊ ߛߎߥߊ߲ߘߌ߫ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫ + ߓߘߍ߬ߦߊ߬ ߟߐ߲ߓߊߟߌ + ߡߎ߰ߡߍ߬ ߡߊߝߍߣߍ߲ߣߍ߲ + ߝߊ߲߬ߞߋ߬ߟߋ߲߬ ߡߊߝߍߣߍ߲ߣߍ߲ + ߣߊ߬ߕߐ + ߞߵߊ߬ ߘߐߕߐ߬ߡߐ߲߬ + ߞߊ߲ߠߊߛߓߍ ߟߎ߬ + ߟߊ߬ߘߌߢߍ + ߜߎ߲߬ߘߎ߬ߞߏ + ߛߌ߬ߞߛߊߓߌ߫ ߘߊ߲߭ + ߥߦߏ߬ ߛߎߥߊ߲ߘߌߣߍ߲ ߕߍ߫ ߕߊ߬ ߟߊ߫ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߓߟߏ߫ + ߞߵߊ߬ ߓߍ߯ ߟߊߢߊ߯ + ߥߦߏ߬ ߟߎ߬ ߕߍߣߊ߫ ߦߌ߬ߘߊ߬ ߟߊ߫߸ ߡߍ߲ ߠߎ߬ ߕߊ߬ߣߍ߲߬ ߕߍ߫ ߡߎߣߎ߲ + ߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊߛߐ߬ߘߐ߲߬ߕߊ߬ ߕߍ߫ ߦߋ߲߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫ + ߢߊ߲ߞߊ߲߫ ߟߐ߲ߓߊߟߌ + + ߝߌ߬ߟߊ߲߬ %d + + ߞߎߘߊ ߟߎ߬ + ߥߙߏߝߋ߫ ߘߙߎ ߟߎ߬ + ߟߊ߬ߞߎ߬ߘߦߊ߬ߟߌ ߞߍ߫ ߘߊ߫: %s + + ߕߟߋ߬ %d + + ߝߎ߬ߕߎ߲߬ߕߌ ߥߏ߬ߦߏ ߖߛߐ߫ ߕߎߡߊ + \'%s\' ߥߏ߬ߦߏ ߕߍ߫ ߛߋ߫ ߖߛߐ߫ ߟߊ߫. + ߛߌ߲ߘߌߓߊ߮ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߕߍ߰. +\nߣߌߎߔߌߔ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߥߏ߬ߦߏ ߣߌ߲߬ ߖߛߐ߫ ߟߊ߫ ߡߎ߬ߕߎ߲߬. +\nߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߛߊ߬ ߥߙߏߝߋ ߣߌ߲߬ ߡߊ߬ ؟ + ߥߦߏ߬ ߞߊߟߌ߲ ߗߏ߯ߦߊ ߕߍ߫ ߟߌ߬ߤߟߊ߬ ߘߌߦߊߡߊ߲߫ ߘߌ߫ ߟߊ߫ ߝߐߡߊ ߣߌ߲߬ ߞߊ߲߬. + ߞߵߊ߬ ߟߊߛߐ߬ߘߐ߲߬ ߥߦߏ߬ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߘߏ߫ ߝߍ߬ ߣߴߏ ߘߌ߫ ߓߍ߲߬ + ߞߵߊ߬ ߟߊߞߎߘߦߊ߫ ߞߘߊߎ߫ + ߞߊ߬ ߞߊߟߌ߲ ߗߏ߯ߦߊ ߟߊߟߊ߬ + ߞߊ߬ ߥߦߏ߬ ߢߍߕߊ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߊ߬ ߛߌ߲ߘߌߣߍ߲߫ %s ߟߋ߬ ߓߟߏ߫ + ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ ߞߐߜߍ + %s ߓߟߏ߫ + ߞߐߟߕߊ + ߞߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߟߊߓߊ߯ߙߊ߫ ߣߍ߰ߟߌ߬ ߢߊߝߘߍ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߣߌ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߟߊ߫ + ߛߌ߰ߘߊ ߟߎ߬ + ߞߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߦߌ߬ߘߊ߬ + ߟߥߊߟߌߟߊ߲߫ ߛߌ߫ ߕߴߌ ߟߊ߫ ߕߙߏߞߏ ߞߊ߲߬ ߡߍ߲ ߘߌ߫ ߛߋ߫ ߣߌ߲߬ ߠߊߞߊ߬ ߟߊ߫ + ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬. +\nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߥߟߊ߫ ߦߴߊ߬ ߡߊߝߍߣߍ߲߫ ߞߊ߬ \'%s\' ߟߊߛߊ߬ ߟߊ߬ߖߌ߰ߟߌ߲߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ + ߞߣߐߘߐ ߣߌ߲߬ ߦߋ߫ ߘߎ߲߬ߘߎ߬ߡߊ ߟߋ߬ ߘߌ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ߫. + ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߓߍ߰ + ߞߊ߬ ߞߟߏߜߍ߫ ߓߊߕߐߡߐ߲ ߠߊߢߊ߯ ߞߊ߲߬ߛߓߍ ߘߐ߫ + ExoPlayer ߡߐ߬ߟߐ߲߬ ߖߏߣߡߊ + ߝߙߏߝߋ ߣߌ߲߬ ߡߊߝߘߎߣߌ߲߫ ߌ ߓߟߏ߫ ߡߎ߬ߕߎ߲߬ + ߞߊ߬ ߞߍߦߙߐ ߘߊߦߟߍ߬ + ߣߌ߲߬ ߦߋ߫ SoundCloud Go+ ߜߋ߬ߙߋ ߘߏ߫ ߟߋ߬ ߘߌ߫߸ ߡߍ߲ ߕߴߌ ߟߊ߫ ߖߡߊ߬ߣߊ ߞߣߐ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ߫. + ߊ߬ ߦߋ߫ ߗߋߢߊ ߘߏ߫ ߟߎ߫ ߘߐ߫߸ ߊ߬ߟߋ߬ ߞߊߟߌߡߊ߲ߓߊ ߟߋ߬ ߝߊߣߊ߲߫ ߦߋ߫߸ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߌ߫ ߛߋ߫ ߝߌ߬ߛߌ߫ ߘߊ߲߬ߠߊߕߍ߰ߣߍ߲ ߠߥߊ߫ ߟߊ߫ ߊ߬ߣߌ߫ ߟߌ߬ߤߟߊ߬ ߘߝߊߓߊߟߌ ߟߎ߬ (ߟߊߒߡߊ߫ ߘߐ߫߸ ߥߎ߬ߛߎ߸ ߝߌ߬ߛߌ ߛߎ߯ߦߊ ߥߟߊ߫ ߝߊ߲ߞߢߊ߫ ߟߌ߬ߤߟߊ) + ߞߣߐߘߐ ߣߌ߲߬ ߦߋ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߕߣߐ߬ߓߐ߬ߟߊ߫ ߛߙߊ߬ߓߐ߬ߟߊ ߟߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߓߟߏ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ. + ߊ߬ ߦߴߌ ߢߣߊ߫ ߟߋ߬ ߞߏ߫ ߥߏ߬ߦߏ ߟߎ߬ ߖߛߐ ߟߊߛߎߡߊߡߊ߲߫ ߠߋ߬ ߞߏߖߎ߯ߦߊ߫؟ ߣߴߏ߬ ߟߋ߸ ߖߛߐߟߌ߫ ߞߊߟߌ߲ ߡߊߝߍߣߍ߲߫ (ߌ ߘߌ߫ ߛߴߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߥߟߊ߫ ߘߎ߰ߟߊ߬ߘߐ߬ ߞߘߎ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫). +\n +\nߣߌߎߔߌߔ ߘߌ߫ ߛߋ߫ ߥߏ߬ߦߏ ߟߎ߬ ߟߊߞߎߘߦߊ߫ ߟߊ߫ ߢߊ߫ ߝߌ߬ߟߊ߫ ߟߋ߫ ߡߊ߬: +\n• ߞߊ߬ ߝߙߏߝߋ߫ ߡߊߝߘߎߣߍ߲ ߠߎ߬ ߡߎ߰ߡߍ ߡߊߛߐ߲߬ߘߐ߲߬߸ ߏ߬ ߛߎߡߊߡߊ߲߫ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߝߊߣߍ߲߫. +\n• ߞߊ߬ ߗߋߢߊ߫ ߓߟߏߡߞߊ߬ߣߍ߲ ߘߏ߫ ߟߊߓߊ߯ߙߊ߫߸ ߏ߬ ߟߞߊߟߌߡߊ߲߫ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߝߊߣߍ߲߫ ߕߍ߫. +\n +\nߞߍߢߊ߫ ߝߌ߬ߟߊ ߏ߬ ߘߊ߲߬ߝߘߊ߬ߓߐ ߦߋ߫ ߟߋ߬߸ ߡߍ߲ ߞߊߟߌߡߊ߲߫ ߏ߬ ߕߍ߫ ߟߌ߬ߤߟߊ߫ ߓߍ߯ ߛߐ߬ߘߐ߲߬ ߠߊ߫߸ ߦߏ߫ ߝߌ߬ߛߌ ߥߎ߬ߛߎ ߣߴߊ߬ ߛߎ߯ߦߊ (ߢߟߊ߫ ߦߋߟߌ ߘߐ߫ ߘߊ߲߬ߝߘߊ߬ߓߐ߬ ߕߴߊ߬ ߝߊ߲ߞߢߊ߫ ߦߋߡߍ߲ߕߊ ߟߎ߬ ߣߌ߫ ߘߏ߫ ߜߘߍ߫ ߟߎ߫ ߕߍ߫)߸ ߊ߬ ߘߏ߲߬ ߘߌ߫ ߛߋ߫ ߞߍ߫ ߟߴߊ߬ ߡߊ߫ ߥߙߏߝߋ߫ ߝߌ߬ߛߌ ߟߎ߬ ߓߍ߯ ߡߊߛߐ߬ߘߐ߲߬. +\n +\nߟߊߒߡߊ߫ ߘߐ߫߸ ߦߕߎߓߎ ߦߋ߫ ߟߊ߬ߞߎ߬ߘߦߊ߬ߟߌ߬ ߞߊߟߌ߲ (RSS ߥߏ߬ߦߏ) ߕߊ߬ ߟߊ߫. +\n +\nߏ߬ ߘߐ߫߸ ߌߟߋ ߟߵߊ߬ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߠߊ߫: ߣߴߌ ߦߋ߫ ߞߊߟߌߦߊ ߟߋ߫ ߝߍ߬ ߥߟߊ߫ ߟߌ߬ߤߟߊ߬ ߖߐ߲ߖߐ߲. + ߞߣߐߘߐ ߣߌ߲߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌ ߟߊ߫ ߖߡߊ߬ߣߊ ߞߣߐ߫. + ߢߣߊߕߊ ߣߌ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߫ ߠߋ߬ ߘߐߙߐ߲߫ ߣߌ߫ %s ߛߎߥߊ߲ߘߌߣߍ߲߫ ߛߊߛߊ ߢߍ߫ + ߌ ߘߌ߫ ߛߋ߫ ߞߟߏߜߍ ߓߊߕߐߡߐ߲߫ ߠߊ߫ ߞߊ߲߬ߛߓߍ ߘߐ߫ ߡߎ߬ߕߎ߲߬. ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߞߐߜߍ߫ ߘߌ߫ ߛߋ߫ ߡߣߍߡߣߍ߫ ߟߊ߫ ߊ߬ߣߌ߫ ߛߘߌ߬ߜߋ߲ ߠߎ߬ ߝߊߣߊ߲߫ ߘߌ߫ ߛߋ߫ ߟߊߝߏߦߊ߫ ߟߴߊ߬ ߘߐ߫. + ߞߊ߬ ߝߌ߬ߛߌ߫ ߣߊ߬ߕߐ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߞߊ߬ ߝߌ߬ߛߌ߫ ߣߊ߬ߕߐ ߟߎ߬ ߢߡߊߘߏ߲߰ + \ No newline at end of file diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index eacac40f163..7fd1f276225 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -73,7 +73,7 @@ ଉଦାହରଣ ବୈଧ କରିପାରିଲା ନାହିଁ ଭିଡିଓ ବର୍ଣ୍ଣନା ଏବଂ ଅତିରିକ୍ତ ସୂଚନା ଲୁଚାଇବାକୁ ବନ୍ଦ କରନ୍ତୁ ଅଡିଓ - ବାହ୍ୟ ଅଡିଓ ପ୍ଲେୟାର ବ୍ୟବହାର କରନ୍ତୁ + ବହିଃ-ଅଡ଼ିଓଚାଳକ ଵ୍ୟଵହାର କରିବା ସଦସ୍ୟତା ଯୋଡ଼ନ୍ତୁ ସଦସ୍ୟତା ଅଦ୍ୟତନ କରିପାରିଲା ନାହିଁ ଟ୍ୟାବ୍ ବାଛନ୍ତୁ @@ -82,7 +82,7 @@ ଭିଡିଓ ଫାଇଲ୍ ପାଇଁ ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ ବାଛନ୍ତୁ ଡିଫଲ୍ଟ ରେଜୋଲୁସନ କୋଡି ସହିତ ଖୋଲନ୍ତୁ - ଦ୍ୱିତୀୟ କ୍ରିୟା ବଟନ୍ + ଦ୍ୱିତୀୟ କୃତ୍ୟ ବଟନ୍ ପୁନରାବୃତ୍ତି କରନ୍ତୁ ବିଜ୍ଞପ୍ତିକୁ ରଙ୍ଗ କରନ୍ତୁ ପପ୍ଅପ୍ ର ଶେଷ ଆକାର ଏବଂ ସ୍ଥିତି ମନେରଖ @@ -202,21 +202,21 @@ ଡିଫଲ୍ଟ ଅଡିଓ ଫର୍ମାଟ୍ ଅକ୍ଷୟ ସନ୍ଧାନ ପ୍ଲେୟାରକୁ ହ୍ରାସ ହୋଇଥିବା ସଠିକତା ସହିତ ଶୀଘ୍ର ପଦବୀ ଖୋଜିବାକୁ ଅନୁମତି ଦିଏ । 5, 15 କିମ୍ବା 25 ସେକେଣ୍ଡ ଖୋଜିବା ଏହା ସହିତ କାମ କରେ ନାହିଁ %s ପାଇଁ ଫଳାଫଳ ଦେଖାଉଛି - ବାହ୍ୟ ଭିଡିଓ ପ୍ଲେୟାର ବ୍ୟବହାର କରନ୍ତୁ + ବହିଃ-ଵିଡ଼ିଓଚାଳକ ଵ୍ୟଵହାର କରିବା ସଦସ୍ୟତା ସଦସ୍ୟତା ରଦ୍ଦ କରନ୍ତୁ ଚ୍ୟାନେଲ ସଦସ୍ୟତା ରଦ୍ଦ ହେଲା ସଦସ୍ୟତା ପରିବର୍ତ୍ତନ କରିପାରିଲା ନାହିଁ ସୂଚନା ଦେଖାନ୍ତୁ - ମିଶାଅ + ଏଥିରେ ଯୋଡ଼ିବା ଡିଫଲ୍ଟ ପପ୍ଅପ୍ ରେଜୋଲୁସନ କେବଳ କିଛି ଡିଭାଇସ୍ 2K / 4K ଭିଡିଓ ଚଲାଇ ପାରିବେ ନିଖୋଜ କୋର ଆପ୍ ସଂସ୍ଥାପନ କରିବେ\? ଥମ୍ୱନେଲ କୁ 1:1 ଅନୁପାତରେ କ୍ରୋପ୍ କରନ୍ତୁ - ପ୍ରଥମ କ୍ରିୟା ବଟନ୍ - ତୃତୀୟ କ୍ରିୟା ବଟନ୍ - ଚତୁର୍ଥ କ୍ରିୟା ବଟନ୍ - ପଞ୍ଚମ କ୍ରିୟା ବଟନ୍ + ପ୍ରଥମ କୃତ୍ୟ ବଟନ୍ + ତୃତୀୟ କୃତ୍ୟ ବଟନ୍ + ଚତୁର୍ଥ କୃତ୍ୟ ବଟନ୍ + ପଞ୍ଚମ କୃତ୍ୟ ବଟନ୍ ଶଫଲ୍ ବଫରିଂ କିଛି ନୁହେଁ @@ -253,7 +253,7 @@ ସମସ୍ତ ପ୍ଲେ କରନ୍ତୁ ସର୍ବଦା ଫାଇଲ୍ - ବିଜ୍ଞପ୍ତି ଗୁଡିକ + ଵିଜ୍ଞପ୍ତି ଆପ୍ ଅଦ୍ୟତନ ବିଜ୍ଞପ୍ତି ନୂତନ NewPipe ସଂସ୍କରଣ ପାଇଁ ବିଜ୍ଞପ୍ତି ଭିଡିଓ ହ୍ୟାସ୍ ବିଜ୍ଞପ୍ତି @@ -273,7 +273,7 @@ ସମସ୍ତ ପ୍ଲେକ୍ ପୋଜିସନ୍ ଡିଲିଟ୍ କରେ ସନ୍ଧାନ ଇତିହାସ ସଫା କରନ୍ତୁ ସମଗ୍ର ସନ୍ଧାନ ଇତିହାସ ବିଲୋପ କରିବେ କି\? - ବାହ୍ୟ ସଂରକ୍ଷଣ ଉପଲବ୍ଧ ନାହିଁ + ବହିଃ-ଷ୍ଟୋରେଜ୍ ଅନୁପଲବ୍ଧ ନେଟୱର୍କ ତ୍ରୁଟି ସମସ୍ତ ଥମ୍ୱନେଲ୍ ଲୋଡ୍ କରିପାରିଲା ନାହିଁ ୱେବସାଇଟ୍ ପାର୍ସ କରିପାରିଲା ନାହିଁ @@ -392,7 +392,7 @@ ବନ୍ଦ କର ଡାଉନଲୋଡ୍ ବିରତି କରନ୍ତୁ କେଉଁଠାରେ ଡାଉନଲୋଡ୍ କରିବେ ପଚାରନ୍ତୁ - \'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\' ଏକ ବାହ୍ୟ SD କାର୍ଡକୁ ଡାଉନଲୋଡ୍ କରିବାକୁ ଅନୁମତି ଦିଏ + \'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\' ଏକ ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବାକୁ ଅନୁମତି ଦିଏ ଆଣ୍ଡ୍ରଏଡ୍ 10 ରୁ କେବଳ \'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\' ସମର୍ଥିତ ଏକ ଉଦାହରଣ ବାଛନ୍ତୁ ExoPlayer ପ୍ରତିବନ୍ଧକ ହେତୁ ସନ୍ଧାନ ସମୟସୀମା %d ସେକେଣ୍ଡରେ ସେଟ୍ ହୋଇଥିଲା @@ -427,7 +427,7 @@ ଓଭର୍ ରାଇଟ୍ କରନ୍ତୁ ଥମ୍ବନେଲ୍ URL ହୋଷ୍ଟ - ଜନସାଧାରଣ + ସାର୍ଵଜନୀନ ତାଲିକାଭୁକ୍ତ ନୁହେଁ ବ୍ୟକ୍ତିଗତ ମନ୍ତବ୍ୟଗୁଡିକ ଅକ୍ଷମ ହୋଇଛି @@ -508,7 +508,7 @@ \nଯଦି ଆପଣ ଏହାକୁ ଦେଖିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସେଟିଂସମୂହରେ \"%1$s\" ଟର୍ନ୍ ଅନ୍ କରନ୍ତୁ । ତ୍ରୁଟି ରିପୋର୍ଟ ଆଲବମ୍ ଗୁଡ଼ିକ - ବାହ୍ୟ SD କାର୍ଡକୁ ଡାଉନଲୋଡ୍ କରିବା ସମ୍ଭବ ନୁହେଁ ।ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର ଅବସ୍ଥାନ ପୁନଃସେଟ୍ କରନ୍ତୁ\? + ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବା ସମ୍ଭଵ ନୁହେଁ। ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ ଅବସ୍ଥାନ ପୁନଃସେଟ୍ କରିବେ କି\? ଫାଇଲ୍ ଡିଲିଟ୍ ହୋଇଛି କେବଳ ଥରେ ନୂତନ ପାଇପ୍ ବିଜ୍ଞପ୍ତି @@ -525,7 +525,7 @@ ତ୍ରୁଟି ଭିଡିଓ URL ଦସ୍ତଖତକୁ ଡିବଫସ୍କେଟ୍ କରିପାରିଲା ନାହିଁ ପୁନରୁଦ୍ଧାର ନ ହୋଇପାରିଲା ପରି ପ୍ଲେୟାର ତ୍ରୁଟି ଘଟିଲା - ବାହ୍ୟ ପ୍ଲେୟାରମାନେ ଏହି ପ୍ରକାର ଲିଙ୍କକୁ ସମର୍ଥନ କରନ୍ତି ନାହିଁ + ବହିଃ-ଚାଳକ ଏଭଳି ଲିଙ୍କ୍ ସମର୍ଥନ କରେନି ଫାଇଲ୍ ଘୁଞ୍ଚିଗଲା କିମ୍ବା ଡିଲିଟ୍ ହେଲା ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ପ୍ଲେଲିଷ୍ଟ ବୁକମାର୍କ ନାହିଁ ସେପରି କୌଣସି ଫାଇଲ / ବିଷୟବସ୍ତୁ ଉତ୍ସ ନାହିଁ @@ -590,14 +590,14 @@ \nଭବିଷ୍ୟତରେ NewPipe ଏହି ଫିଡ୍ ଲୋଡ୍ କରିବାକୁ ସମର୍ଥ ହେବ ନାହିଁ । \nଆପଣ ଏହି ଚ୍ୟାନେଲରୁ ସଦସ୍ୟତା ରଦ୍ଦ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? ଦେଖାଯାଇଥିବା ଆଇଟମଗୁଡିକ ଦେଖାନ୍ତୁ - ଆଭ୍ୟନ୍ତରୀଣ + ଅନ୍ତଃସ୍ଥ ଆପଣ ବର୍ତ୍ତମାନ ଏହି ଚ୍ୟାନେଲକୁ ସବସ୍କ୍ରାଇବ କରିଛନ୍ତି - ବାହ୍ୟ ଖେଳାଳିଙ୍କ ପାଇଁ କୌଣସି ଭିଡିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ + ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଵିଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ ସୃଷ୍ଟିକର୍ତ୍ତାଙ୍କ ଦ୍ୱାରା ହୃଦୟ ଷ୍ଟ୍ରିମ୍ ଯାହା ଏପର୍ଯ୍ୟନ୍ତ ଡାଉନଲୋଡର୍ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ ଅଜ୍ଞାତ ଫର୍ମାଟ୍ - ପ୍ରତ୍ୟେକ ଡାଉନଲୋଡ୍ କୁ କେଉଁଠାରେ ସେଭ୍ କରାଯିବ ତାହା ଆପଣଙ୍କୁ ପଚରାଯିବ । -\nଯଦି ଆପଣ ଏକ ବାହ୍ୟ SD କାର୍ଡକୁ ଡାଉନଲୋଡ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସିଷ୍ଟମ୍ ଫୋଲ୍ଡର୍ ପିକର୍ (SAF) କୁ ସକ୍ଷମ କରନ୍ତୁ + ପ୍ରତ୍ୟେକ ଡାଉନଲୋଡ୍‍କୁ କେଉଁଠାରେ ସଞ୍ଚୟ କରାଯିବ ତା\' ଆପଣଙ୍କୁ ପଚରାଯିବ। +\nଯଦି ଆପଣ ଏକ ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସିଷ୍ଟମ୍ ଫୋଲ୍ଡର୍ ଚୟକ (SAF)କୁ ସକ୍ଷମ କରନ୍ତୁ ମେମୋରୀ ଲିକ୍ ଦେଖାନ୍ତୁ ଆଇଟମଗୁଡିକରେ ମୂଳ ସମୟ ପୂର୍ବରୁ ଦେଖାନ୍ତୁ ବିସର୍ଜନ ପରେ ଖଣ୍ଡ କିମ୍ବା କାର୍ଯ୍ୟକଳାପ ଜୀବନଚକ୍ର ବାହାରେ ଅଣସଂରକ୍ଷିତ Rx ବ୍ୟତିକ୍ରମଗୁଡିକର ଫୋର୍ସ ରିପୋର୍ଟିଂ @@ -616,8 +616,8 @@ ଗୋଟିଏ ଡାଉନଲୋଡ୍ ଏକ ସମୟରେ ଚାଲିବ ସମ୍ପ୍ରତି ଟାବଲେଟ୍ ମୋଡ୍ - ବାହ୍ୟ ଖେଳାଳିଙ୍କ ପାଇଁ କୌଣସି ଅଡିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ - ବାହ୍ୟ ଖେଳାଳିଙ୍କ ପାଇଁ ଗୁଣବତ୍ତା ଚୟନ କରନ୍ତୁ + ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଅଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ + ବହିଃ-ଚାଳକ ପାଇଁ ଗୁଣବତ୍ତା ଚୟନ କରନ୍ତୁ ପିନ୍ ହୋଇଥିବା ମନ୍ତବ୍ୟ ଭବିଷ୍ୟତର ଆଇଟମ୍ ଲୁଚାନ୍ତୁ ୱେବସାଇଟ୍ ଖୋଲନ୍ତୁ @@ -706,7 +706,7 @@ ଟ୍ୟାଗ୍ସ ସୂଚିତ କର , - ମନୋନୀତ ଷ୍ଟ୍ରିମ୍ ବାହ୍ୟ ଖେଳାଳିଙ୍କ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ + ମନୋନୀତ ଷ୍ଟ୍ରିମ୍ ବହିଃ-ଚାଳକ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ %s ଜଣ ଶ୍ରୋତା ମୋଟ %s ଜଣ ଶ୍ରୋତା @@ -741,4 +741,11 @@ ପୁରା ଦେଖାଯାଇଛି ଆଂଶିକ ଦେଖାଯାଇଛି ଆଗାମୀ + ପ୍ଲେୟାର ସ୍କ୍ରିନର ବାମ ଅଧା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବାଛନ୍ତୁ + ବାମ ଅଙ୍ଗଭଙ୍ଗୀ କାର୍ଯ୍ୟ + ପ୍ଲେୟାର ସ୍କ୍ରିନର ଡାହାଣ ଅଧା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବାଛନ୍ତୁ + ଡାହାଣ ଅଙ୍ଗଭଙ୍ଗୀ କାର୍ଯ୍ୟ + ଉଜ୍ଜ୍ୱଳତା + ଭଲ୍ୟୁମ୍ + କିଛି ନୁହେଁ \ No newline at end of file diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index f5a38353bc1..3759b42a09d 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -741,4 +741,11 @@ ਆਗਾਮੀ ਹਾਰਡਵੇਅਰ ਮੀਡੀਆ ਬਟਨ ਇਵੈਂਟਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰੋ ਸਟ੍ਰੀਮ ਵਿਖਾਓ/ਲੁਕਾਓ + ਸੱਜੇ ਪਾਸੇ ਦੀ ਸੰਕੇਤ ਕਿਰਿਆ + ਖੱਬੇ ਪਾਸੇ ਦੀ ਸੰਕੇਤ ਕਿਰਿਆ + ਚਮਕ + ਕੋਈ ਨਹੀਂ + ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਖੱਬੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ + ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਸੱਜੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ + ਆਵਾਜ਼ \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 895b1a93553..e46190d446f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -420,7 +420,7 @@ \nWłącz systemowy selektor folderów (SAF), jeśli chcesz pobierać pliki na kartę pamięci Minął czas połączenia Używaj systemowego selektora folderów (SAF) - Systemowy selektor folderów (SAF) umożliwia pobieranie na kartę pamięci + Storage Access Framework umożliwia pobieranie na kartę pamięci Wyczyść pozycje odtwarzania Usuwa wszystkie pozycje odtwarzania Usunąć wszystkie pozycje odtwarzania\? @@ -529,7 +529,7 @@ 100+ wideo Artyści Albumy - Piosenki + Utwory To wideo jest objęte ograniczeniem wiekowym. \n \nWłącz „%1$s” w ustawieniach, jeśli chcesz je zobaczyć. @@ -642,7 +642,7 @@ \nNewPipe nie będzie w stanie załadować tego kanału w przyszłości. \nCzy chcesz anulować subskrypcję tego kanału\? Nie udało się załadować kanału dla „%s”. - Począwszy od Androida 10 obsługiwany jest tylko systemowy selektor folderów (SAF) + Począwszy od Androida 10 obsługiwany jest tylko Storage Access Framework Zostaniesz zapytany(-a), gdzie zapisać każdy pobierany plik Nie ustawiono jeszcze folderu zapisywania, wybierz domyślny teraz Błąd podczas ładowania kanału @@ -761,4 +761,11 @@ W pełni obejrzane Częściowo obejrzane Nadchodzące + Wybierz gest dla lewej strony ekranu odtwarzacza + Akcja gestu z lewej + Wybierz gest dla prawej strony ekranu odtwarzacza + Jasność + Głośność + Brak + Akcja gestu z prawej \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index bfa888d6be8..e16fae2b720 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -753,4 +753,11 @@ Parcialmente assistido Em breve Totalmente assistido + Escolha o gesto da mão esquerda da tela do jogador + Ação do gesto esquerdo + Escolha o gesto da mão direita da tela do jogador + Brilho + Volume + Nenhum + Ação do gesto direito \ No newline at end of file diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index f38a4180d0a..6d85f60fbfa 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -753,4 +753,11 @@ Proximamente Remover duplicados\? Quer remover todos os fluxos duplicados nesta lista de reprodução\? + Ação de gesto de esquerda + Ação do gesto correto + Luminosidade + Volume + Nenhum + Escolher gesto para metade esquerda do ecrã do reprodutor + Escolher gesto para metade direita do ecrã do reprodutor \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 9719292ecb7..b04740759fc 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -753,4 +753,11 @@ Completamente visto Mostrar os seguintes vídeos Parcialmente visto + Ação de gesto de esquerda + Ação do gesto correto + Luminosidade + Volume + Nenhum + Escolher gesto para metade esquerda do ecrã do reprodutor + Escolher gesto para metade direita do ecrã do reprodutor \ No newline at end of file diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index bb3ef6665bf..d0239a0624a 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -204,7 +204,7 @@ Importați baza de date Exportați baza de date Suprascrie istoricul, abonamentele, listele de redare și (opțional) setările curente - Exportează istoricul, abonamentele, playlist-urile și setările + Exportați istoricul, abonamentele, listele de redare și setările Nu a putut reda acest flux A apărut o eroare irecuperabilă a player-ului Se recuperează din eroarea player-ului @@ -729,13 +729,13 @@ Afișați elementele din viitor Ascunde elementele vizionate Ascunde elementele din viitor - Vezi pe website + Vedeți pe website Dacă întâmpinați probleme cu utilizarea aplicației, nu uitați să consultați aceste răspunsuri la întrebări frecvente! Întrebări frecvente - Sortează + Sortare Modul rapid Importați sau exportați abonamente din meniul cu 3 puncte - Rulați cea mai recentă versiune NewPipe + Folosiți cea mai recentă versiune NewPipe Atingeți pentru a descărca %s Această opțiune este disponibilă numai dacă %s este selectată ca temă Cartelă @@ -743,11 +743,11 @@ Dezactivare miniatură permanentă Listele de redare care colorate în gri conțin deja acest element. Duplicat adăugat de %d ori - Ignoră evenimentele butonului media hardware - Util, de exemplu, dacă utilizezi o cască cu butoane fizice defecte - Dorești să elimini toate fluxurile dublate din această listă de redare\? + Ignorați evenimentele butonului media hardware + Util, de exemplu, dacă utilizați o cască cu butoane fizice defecte + Doriți să eliminați toate fluxurile dublate din această listă de redare\? Eliminare dubluri - Elimini dublurile\? + Eliminați dublurile\? Afișează următoarele fluxuri Afișare/Ascundere fluxuri Vizionat complet diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 687d8354979..43b5c772f5d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -68,7 +68,7 @@ Не удалось создать меню загрузки Приложение/UI завершило работу Никогда такого не было, и вот опять. - Отправить по электронной почте + Отправить по почте Извините, что-то пошло не так. Отчёт Информация: @@ -325,7 +325,7 @@ При открытии ссылки Хотите импортировать настройки? Конфиденциальность - Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никаких данных без вашего согласия. + Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никакие данные без вашего согласия. \nПолитика конфиденциальности подробно объясняет, какие данные обрабатываются и хранятся при отправке отчёта о сбоях. Прочитать политику В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней. @@ -746,9 +746,9 @@ Доступно, когда Тема установлена в %s Убрать постоянную миниатюру Дубликат добавлен %d раз(а) - Плейлисты, выделенные серым уже содержат этот объект. - Игнорировать события аппаратной мультимедийной кнопки - Полезно, например, если вы используете гарнитуру со сломанными физическими кнопками + Плейлисты, выделенные серым, уже содержат этот объект. + Игнорировать события аппаратных кнопок + Полезно при использовании гарнитуры со сломанными кнопками Показать следующие стримы Показать/скрыть стримы Полностью просмотрено @@ -756,5 +756,12 @@ Удалить дубликаты Удалить дубликаты\? Частично просмотрено - Вы хотите удалить все повторяющиеся потоки в этом плейлисте\? + Удалить все дубликаты потоков в этом плейлисте\? + Жест для левой стороны экрана плеера + Действие жеста слева + Жест для правой стороны экрана плеера + Действие жеста справа + Яркость + Громкость + Ничего diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 676a8dd07d6..544e325208d 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -740,4 +740,11 @@ Bidu de su totu Bidu in parte Luego + Atzione de su gestu de manca + Atzione de su gestu de destra + Volume + Issèbera unu gestu pro sa metade de manca de s\'ischermu de su riproduidore + Issèbera unu gestu pro sa metade de destra de s\'ischermu de su riproduidore + Luminosidade + Perunu \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index a3bb7068b72..ceb87244951 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -17,11 +17,11 @@ Tar bort ljud vid vissa upplösningar Använd extern ljudspelare Bakgrund - Extrafönster - Mapp för hämtning av video + Popup + Hämtningsmapp för video Hämtade videofiler lagras här - Välj hämtningsmappen för videofiler - Mapp för hämtning av ljud + Välj hämtningsmapp för videofiler + Hämtningsmapp för ljud Hämtade ljudfiler lagras här Välj hämtningsmapp för ljudfiler Standardupplösning @@ -39,7 +39,7 @@ Ljust Mörkt Svart - Kom ihåg popupstorlek och position + Kom ihåg popup inställningar Kom ihåg popup-rutans senaste storlek och position Sökförslag Välj förslag att visa i samband med sökning @@ -90,7 +90,7 @@ Håll koll på videor som du tittat på Återuppta uppspelning Fortsätt uppspelning efter avbrott (t.ex. telefonsamtal) - Visa \"Håll för att placera i kön\"-tips + Visa \"Håll för att köa\"-tips Visa tips när bakgrunds- eller popup-knappen trycks på sidan för videodetaljer Spelare Beteende @@ -151,7 +151,7 @@ Hämta Tillåtna tecken i filnamn Ogiltiga tecken ersätts med detta värde - Ersättningstecknet + Ersättningstecken Bokstäver och siffror De flesta specialtecken Om NewPipe @@ -175,13 +175,13 @@ Välj en kanal Inga kanal prenumerationer ännu Välj en kiosk - Trendigt + Trendande Topp 50 Nytt och populärt Ta bort Detaljer Ljudinställningar - Håll för att placera i kön + Håll för att köa Börja spela i bakgrunden Börja spela i en popup Donera @@ -190,7 +190,7 @@ Webbplats För att få mer information och de senaste nyheterna om NewPipe, besök vår webbplats. Visa info - Bokmärkta spellistor + Bokmärkta Spellistor Lägg till i Använd snabb icke-exakt sökning Läs in miniatyrbilder @@ -214,7 +214,7 @@ Spår Användare Växla till Bakgrunden - Växla till popup + Växla till Popup Växla till main Importera databas Exportera databas @@ -280,9 +280,9 @@ Passa Fyll Zoom - Autogenererade + Automatiskt genererad Textning - Ändra spelarens textskala och bakgrundsstil. Kräver omstart av appen för att träda i kraft + Ändra spelarens textskala och bakgrundsstil. Kräver att appen startas om för att träda i kraft Minnesläcka övervakning kan orsaka att appen inte svarar under heap dumpning Rapportera out-of-lifecycle fel Tvinga rapportering av otillåtna Rx-undantag utanför fragment eller aktivitetslivscykel efter uppstädning @@ -303,7 +303,7 @@ \n4. Klicka på \"Nästa steg\" och sen på \"Skapa export\" \n5. Klicka på \"Hämta\"-knappen när den kommer fram \n6. Klicka på IMPORTERA FIL nedan och välj den nedladdade zip-filen -\n7. [Om zip-importen misslyckas] Packa upp .csv-filen (vanligtvis under \"YouTube och YouTube Musik/prenumerationer/prenumerationer.csv\"), klicka på IMPORTERA FIL nedan och välj den uppackade csv-filen +\n7. [Om zip-importen misslyckas] Packa upp .csv-filen (vanligtvis under \"YouTube och YouTube Musik/subscriptions/subscriptions.csv\"), klicka på IMPORTERA FIL nedan och välj den uppackade csv-filen Importera en SoundCloud-profil genom att skriva in webbadressen eller ditt ID: \n \n1. Aktivera \"skrivbordsläge\" i en webbläsare (sidan är inte tillgänglig för mobila enheter) @@ -330,7 +330,7 @@ Minimera vid växling av applikationen Åtgärd när du växlar till andra applikationer från huvudvideospelare — %s Ingen - Minimera till bakgrunds-spelare + Minimera till bakgrundsspelare Minimera till popup-spelare Sluta prenumerera Välj flik @@ -353,7 +353,7 @@ Listvy Lista Rutnät - Automatiskt + Automatisk En NewPipe-uppdatering är tillgänglig! Färdig pausad @@ -431,7 +431,7 @@ kan inte skriva över filen Det finns redan en hämtad fil med det här namnet En fil med det namnet finns redan - återställer + återhämtar Väntande Originaltexter från tjänster kommer att synas i streamobjekt Visa ursprungstid på objekt @@ -536,8 +536,8 @@ Femte åtgärdsknappen Fjärde åtgärdsknappen Tredje åtgärdsknappen - Andra händelseknapp - Första händelseknapp + Andra åtgärdsknappen + Första åtgärdsknappen Detta innehåll stöds ännu inte av NewPipe. \n \nDetta kommer förhoppningsvis ändras i en kommande version. @@ -574,7 +574,7 @@ Inaktivera för att dölja videobeskrivning och ytterligare information Visa meta-information Använd miniatyrbild som bakgrund till både låsskärm och aviseringar - Redigera varje aviseringshandling nedan genom att trycka på den. Välj upp till tre av dem som ska visas i den kompakta aviseringen genom att använda kryssrutorna till höger + Redigera varje aviseringsåtgärd nedan genom att trycka på den. Välj upp till tre av dem som ska visas i den kompakta aviseringen genom att använda kryssrutorna till höger Låt Android färglägga varje avisering individuellt utifrån miniatyrbildens huvudsakliga färg (notera att detta inte är tillgängligt på alla enheter) Färglägg avisering Du kan som mest välja tre åtgärder att visa i den kompakta aviseringen! @@ -637,7 +637,7 @@ Aviseringar för videohashningsframsteg Miniatyrbild-webbadress Inaktivera medietunnel om du upplever en svart skärm eller stamning vid videouppspelning - Inaktivera mediatunnel + Inaktivera medietunnel Hjärtmärkt av innehållsskaparen Du kan välja det natt-tema du föredrar nedan Välj det natt-tema du föredrar — %s @@ -659,7 +659,7 @@ Senaste Svep objekt för att ta bort dem Förslag via fjärrsökning - Starta inte videor i minispelaren, utan byt till helskärmsläge direkt, om auto-rotation är låst. Du kan fortfarande komma åt minispelaren genom att gå ut ur helskärmsläge + Starta inte videor i minispelaren, utan byt till helskärmsläge direkt, om automatisk rotation är låst. Du kan fortfarande komma åt minispelaren genom att gå ut ur helskärmsläge Visa Picasso färgade band ovanpå bilderna som anger deras källa: rött för nätverk, blått för disk och grönt för minne Sök efter uppdateringar Kolla manuellt efter nya versioner @@ -669,7 +669,7 @@ Krascha spelaren Visar ett kraschalternativ vid användning av spelaren Felrapport-avisering - Avisering för att rapportera fel + Aviseringar om att rapportera fel NewPipe stötte på ett fel, tryck för att rapportera Ett fel uppstod, se aviseringen Visa en fel snackbar @@ -681,6 +681,7 @@ Fäst kommentar LeakCanary är inte tillgänglig ExoPlayer standard + Ändra inläsningsintervallets storlek (för närvarande %s). Ett lägre värde kan påskynda den första videoinläsningen. Ändringar kräver att spelaren startas om Uppdateringsintervall Nödvändig nätverksanslutning Alla nätverk @@ -688,7 +689,7 @@ Aviseringar är avstängda Bli meddelad Du har nu prenumenerat till denna kanalen - Avisering om nya strömmar för prenumenanter + Aviseringar om nya strömmar för prenumerationer %s Ny ström %s Nya strömmar @@ -699,7 +700,7 @@ Aviseringar Nya strömmar Laddar strömdetaljer… - Avisering om nya strömmar + Aviseringar om nya strömmar , Spelaravisering Växla alla @@ -740,4 +741,11 @@ Visa/Dölj strömmar Fullständigt sedd Kommande + Volym + Ingen + Välj en gest för den vänstra halvan av spelarskärmen + Ljusstyrka + Vänster gest åtgärd + Välj en gest för den högra halvan av spelarskärmen + Höger gest åtgärd \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 9b07dd7f7c2..d2cf9b9c241 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,9 +1,9 @@ - Başlamak için büyütece dokun. + Başlamak için büyütece dokunun. %1$s tarihinde yayınlandı Akış oynatıcısı bulunamadı. VLC kurulsun mu\? - Yükle + Kur İptal Tarayıcıda aç Paylaş @@ -421,8 +421,8 @@ Öntanımlı Kiosk Kimse izlemiyor - %s izleyen - %s izleyen + %s izleyici + %s izleyici Kimse dinlemiyor @@ -481,8 +481,8 @@ Abonelikleri seç Abonelik seçilmedi - %d seçildi - %d seçildi + %d öğe seçildi + "%d öğe seçildi" Boş grup adı Bu grubu silmek istiyor musunuz\? @@ -683,8 +683,8 @@ Yeni akış bildirimleri Bildirimler - %s yeni akış - %s yeni akış + %s yeni yayın + %s yeni yayın Yeni akışları denetlemeyi çalıştır Oynatıcı bildirimi @@ -740,4 +740,8 @@ Tamamen izlendi Yaklaşan Kısmen izlendi + Parlaklık + Ses düzeyi + Hiçbiri + Parmağınızı ekranın sol yarısında kaydırırken ne yapılacağını seçin \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 4436b30e987..913892dc26a 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -197,7 +197,7 @@ Про застосунок і ЧаП Вільне та легке потокове програвання на Android. Які б не були ваші ідеї: переклад, дизайн, легкий чи глобальний рефакторинг — будь-яка допомога завжди у пригоді. Що більше зроблено, то ліпшим стає NewPipe! - Зневадження + Налагодження Нічого немає… чути лише цвіркунів Немає переглядів @@ -595,7 +595,7 @@ Додано у чергу Додати у чергу Розв\'язати - Обчислення гешу + Обчислення хешу Очистити збережені під час вирішення reCAPTCHA реп\'яшки (cookies) Реп\'яшки (cookies) reCAPTCHA видалено Очистити реп\'яшки (cookies) reCAPTCHA @@ -757,4 +757,11 @@ Показати такі трансляції Повністю переглянуто Частково переглянуто + Яскравість + Нічого + Дія жестом ліворуч + Виберіть жест для лівої половини екрана програвача + Виберіть жест для правої половини екрана програвача + Дія жесту праворуч + Гучність \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 7d0f15132cf..e1e15038b66 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -28,7 +28,7 @@ Hiện độ phân giải cao hơn Chỉ một số thiết bị hỗ trợ phát video 2K/4K Phát bằng Kodi - Cài đặt ứng dụng Kode\? + Cài đặt ứng dụng Kodi\? Hiện tùy chọn \"Phát bằng Kodi\" Hiện tùy chọn phát video qua trung tâm media Kodi Âm thanh @@ -663,7 +663,7 @@ Mục thông báo mới Làm trình phát dừng Không tìm thấy ứng dụng quản lý tệp phù hợp nào để thực hiện hành động. -\nVui lòng cài đặt ứng dụng quản lý tệp tương thích với Storage Access Framework. +\nVui lòng cài đặt ứng dụng quản lý tệp tương thích với Storage Access Framework Không tìm thấy ứng dụng quản lý tệp phù hợp nào để thực hiện hành động. \nVui lòng cài đặt ứng dụng quản lý tệp hoặc tắt \'%s\' trong cài đặt tải xuống LeakCanary không khả dụng @@ -716,4 +716,13 @@ Nhấn để tải %s Chế độ tia sét Danh sách này bị trùng lặp. + Hữu ích trong trường hợp phím bấm âm lượng trên tai nghe hoặc thiết bị của bạn bị hỏng + Không nhận phím điều khiển âm lượng vật lý + Loại bỏ mục trùng lặp + Loại bỏ mục trùng lặp\? + Bạn có muốn loại bỏ tất cả các nguồn trùng nhau trong danh sách phát này\? + Hiện/Ẩn nguồn phát + Hiện các nguồn phát sau + Đã xem xong + Đã xem 1 phần \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index b4dfa142cd0..82ee4b2ff9e 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -727,4 +727,11 @@ 只看了一部分 即将到来 删除重复 + 亮度 + 音量 + 右半边手势动作 + 左半边手势动作 + 选择播放器屏幕左半边手势 + 选择播放器屏幕右半边手势 + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index d70913965b6..100f719385a 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -12,21 +12,21 @@ 用出面嘅音樂播放器 影片下載路徑 下載咗嘅影片檔案會收埋喺度 - 揀選影片檔案嘅下載資料夾 - 預設解像度 + 揀選影片檔案嘅下載文件夾 + 預設嘅解像度 用 Kodi 嚟播放 - 要唔要裝缺少嘅 Kore app? + 裝唔裝缺少咗嘅 Kore app? 顯示「用 Kodi 嚟播放」嘅選項 顯示以 Kodi 媒體中心播放影片嘅選項 聲音 預設聲音檔案格式 - 色系 + 主題 黑暗 明亮 下載 顯示「接續落」同「咁上下」嘅影片 唔支援呢個網址 - 內容預設語言 + 預設內容語言 影音 版面 幕後播緊 @@ -34,17 +34,17 @@ 播放影片,片長: 上載者嘅頭像縮圖 讚好 - 劣評 + 負皮 搵唔到串流播放器。要唔要裝 VLC? 喺瀏覽器開啟 - 分享影片比 - 音樂下載資料夾 + 分享影片畀 + 音樂下載文件夾 下載咗嘅音樂檔案會收埋喺度 - 揀選音樂檔案嘅下載資料夾 + 揀選音樂檔案嘅下載文件夾 撳放大鏡開始。 內容 顯示年齡設限嘅內容 - 直播 + 實況 問題 載入唔晒全部縮圖 影片 URL 簽章解唔到碼 @@ -55,8 +55,8 @@ 出咗啲問題,唔好意思。 報告 資訊: - 出事: - 您嘅意見 (請以英文輸入): + 出咗咩事: + 你嘅見解 (請以英文輸入): 詳情: 影片 聲音 @@ -64,10 +64,10 @@ 下載 下載 問題報告 - 內容未能提供 + 未能提供內容 開始 暫停 - 刪除 + 剷走 校驗碼 檔案名稱 @@ -79,13 +79,13 @@ 複製咗去剪貼簿 請之後喺設定度揀定一個下載資料夾 以浮面模式開啟 - 預設浮面解像度 + 預設浮面播放器嘅解像度 顯示更高解像度 - 得某啲機至播到 2K/4K 影片 - 預設影片檔案格式 + 得某啲機先播到 2K/4K 影片 + 預設嘅影片檔案格式 純黑 浮面播緊 - 魂&我 + 全部嘢 App/界面閃退 經過:\\n請求:\\n內容語言:\\n內容國家:\\nApp 語言:\\n服務:\\nGMT 時間:\\n封裝:\\n版本:\\nOS 版本: @@ -97,12 +97,12 @@ 某啲影片可能會冇聲 幕後播 浮面播 - 記住浮面點擺法 - 記住對上一次浮面嘅大細同擺位 + 記住浮面嘅擺法 + 記住上次浮面嘅大細同擺位 搜尋建議 揀選搜尋嘅時候顯示邊啲建議 不適用 - 清除 + 抹走 最佳解像度 十億 關於 NewPipe @@ -110,14 +110,14 @@ © %1$s %2$s 版權所有,根據 %3$s 嘅條款授權 跋記 版權協議 - 喺 Android 上盡享自由輕便串流。 + 喺 Android 上盡享自由輕快嘅串流。 去 GitHub 睇下 NewPipe 嘅版權協議 - 無論您對翻譯、設計改動、打掃程式碼,抑或開山劈石編寫程式碼有咩偈仔,都無任歡迎您幫手。聚沙成塔,眾志成城! + 無論你對翻譯、設計改動、打掃程式碼,抑或開山劈石編寫程式碼有咩偈仔,都勁歡迎你嚟幫手。聚沙成塔,眾志成城! 閱讀版權協議 貢獻 - 抹走睇過嘅紀錄 - 搵唔到串流播放器 (您可以裝 VLC 嚟播)。 + 抹走播放紀錄 + 搵唔到串流播放器 (你可以裝 VLC 嚟播)。 下載串流檔案 訂閱 訂閱咗 @@ -128,7 +128,7 @@ 顯示資訊 訂閱 儲起嘅播放清單 - 用粗略快轉 + 用粗略嘅快轉 加入去 選擇標籤 第一粒動作掣 @@ -137,27 +137,27 @@ 第四粒動作掣 隨機播放 緩衝緊 - 空白 + 空寥寥 用手勢去控制播放器光暗 本機搜尋建議 遠端搜尋建議 - 喺本機儲存搵過嘅查詢 - 睇過有紀錄 + 喺本機儲低搵過嘅紀錄 + 有睇過有紀錄 恢復播放 - 返返最後播放到去嗰個位 + 返返去最後播放嘅嗰個位 清單度睇到播到去邊 縮圖以 1:1 長寬比框起 顯示喺通知嘅影片縮圖由 16:9 剪成 1:1 長寬比 通知色彩化 等 Android 根據縮圖嘅主色自訂通知嘅顏色 (注意:唔係部部機都用得) - 夜色 + 夜間 跳前/跳後嘅快轉長短 - 關閉去隱藏影片描述同附加資訊 + 閂埋佢去隱藏影片描述同附加資訊 剔低睇過 開啟方式係 搜尋到嘅嘢係:%s 第五粒動作掣 - 撳一下下面每粒掣去更改各個通知動作。用右手邊嘅格仔剔選最多三個,擺喺精簡通知度顯示 + 撳下面嘅掣去更改對應嘅通知動作。用右手邊嘅格仔剔選最多三個,擺喺精簡通知度 精簡通知最多淨係擺到三個動作! 循環播放 載入縮圖 @@ -172,16 +172,16 @@ 音量手勢控制 用手勢去控制播放器音量 光暗手勢控制 - 關閉去避免載入縮圖,慳返啲數據同埋用少啲 RAM。更改會抹走記憶體以及磁碟機上面嘅影像快取 - 粗糙快轉允許播放器比較籠統噉快轉去其他位置。快轉 5、15 或 25 秒就太精緻,粗做唔到 + 關閉佢去避免載入條片嘅縮圖,慳返啲數據同埋用少啲 RAM。更改會抹走記憶體以及磁碟機上面嘅影像快取 + 粗略嘅快轉允許播放器比較籠統咁快轉去其他位置。快轉 5、15 或 25 秒就太仔細,做唔到 播放器 - 內容預設國家 + 預設嘅國家內容 演出者 專輯 淨係支援 HTTPS 嘅 URL 除錯 復原 - 刪除咗個檔案 + 剷走咗個檔案 幾時都係 一次咁多 檔案 @@ -194,19 +194,19 @@ 使用者 事件 歌曲 - 抹走當您完成 reCAPTCHA 嘅時候 NewPipe 儲存嘅 Cookie + 抹走當你完成 reCAPTCHA 嘅時候, NewPipe 儲存嘅 Cookie 轉返主版面 收埋喺背景 撈起去浮面 匯入資料庫 主播放器用全螢幕開啟 - 開啟影片嘅時候唔用袖珍播放器就直接飛去全螢幕模式,如果自動旋轉鎖定嘅話。您仍可結束全螢幕返返去袖珍播放器 + 開啟影片嘅時候唔用袖珍播放器就直接飛去全螢幕模式,如果自動旋轉鎖定嘅話。你仍可結束全螢幕返返去袖珍播放器 認唔出呢個 URL。要唔要用另一個 app 開? YouTube 提供嘅「嚴格篩選模式」可以過濾潛在嘅成人內容 - 有年齡限制 (例如 18+) 故可能兒童不宜嘅內容都照顯示 + 有年齡限制 (例如 18+/兒童不宜)嘅內容都照顯示 呢部影片有年齡限制。 \n -\n如果您想睇,請喺設定度開啟「%1$s」。 +\n如果你想睇,請喺設定度開啟「%1$s」。 呢部影片有年齡限制。 \n鑑於 YouTube 就年齡限制影片嘅新政策,NewPipe 存取唔到條片嘅任何影像串流,所以播放唔到。 [未知] @@ -214,7 +214,7 @@ 抹走咗 reCAPTCHA Cookie 恢復播放 打斷 (例如有電話) 完之後繼續播放 - 記低睇過嘅影片 + 記低晒睇過嘅影片 自動播放 更新 開啟 YouTube 嘅「嚴格篩選模式」 @@ -229,7 +229,7 @@ 外置播放器唔支援呢類型嘅連結 搵唔到影像串流 搵唔到聲音串流 - 檔案搬走咗或刪除咗 + 檔案搬走咗或剷走咗 個檔案唔喺度,又或者欠缺讀寫權限 檔名冇得留空 復原緊播放器錯誤 @@ -238,24 +238,24 @@ 讀取唔到儲存咗嘅分頁,所以用返預設分頁 還原返預設噉樣 發生錯誤:%1$s - 您係咪要還原返做預設嗰個樣? + 你係咪要還原返做預設嗰個樣? 複製執咗格式嘅報告 乜都搵唔到 名稱 接受 - 關閉 + 閂埋佢 下載失敗 - 完成咗 %s 個下載 + 完成咗 %s 嘅下載 產生獨一無二嘅名稱 匯入檔案 匯出緊… 先前嘅匯出 - 惟請注意:呢項操作可能相當消耗網絡數據。 + 請注意:呢項操作可能相當消耗網絡數據。 \n -\n您係咪要繼續? +\n你係咪要繼續? 幾時都唔使 自動 低畫質 (細格啲) @@ -294,9 +294,9 @@ 匯入唔到訂閱 節奏 播放速度控掣 - 系統預設噉樣 + 系統預設 檢查有冇更新 - 個 App 用咩文 + 個 App 用咩語言 睇咗嗰啲剷咗佢 係咪要剷走睇咗嘅影片? 網站 @@ -325,11 +325,11 @@ 刪除咗 1 個項目。 執執佢 搞掂 - NewPipe 專案非常著重您嘅私隱。因此,呢個 app 未得您同意係唔會收集任何資料。 -\nNewPipe 嘅私隱政策,詳述當您傳送彈 app 報告時,有咩資料會傳送同保存。 + NewPipe 專案非常著重你嘅私隱。因此,呢個 app 未得你同意係唔會收集任何資料。 +\nNewPipe 嘅私隱政策會詳述,當你傳送彈 app 報告嗰陣,有咩資料會傳送同保存。 最近播放 最常播放 - 頭版內容 + 頭條新嘢 頭版要擺放邊啲分頁 打橫掃走啲項目去剷走佢 空白頁 @@ -338,13 +338,13 @@ 頭 50 位 最新同大熱 警告:未能匯入晒全部檔案。 - 噉樣做會冚咗您而家嘅設定個囉噃。 - 您想唔想匯入埋啲設定? + 噉樣做會冚咗你而家嘅設定個囉噃。 + 你想唔想匯入埋啲設定? 載入唔到留言 最近新加 剷咗佢 詳細資料 - 唔使靜音 + 唔使噤聲 背景播放器 浮面播放器 幾時都問 @@ -359,8 +359,8 @@ 匯入緊… 無聲嘅時候快轉 重設 - 為符合歐盟嘅《通用數據保障條例》(GDPR) 規範,我哋謹請您注意 NewPipe 嘅私隱政策。請仔細閱讀。 -\n您必須接受先可以傳送錯誤報告畀我哋。 + 為符合歐盟嘅《通用數據保障條例》(GDPR) 規範,我哋謹請你注意 NewPipe 嘅私隱政策。請仔細閱讀。 +\n你必須接受,先可以傳送錯誤報告畀我哋。 拒絕 用流動數據嘅時候限制解像度 更新 @@ -387,53 +387,53 @@ 改過個名 字母同數目字 - 大部份特殊字元 + 大部份嘅特殊字元 下載 課金 匯出唔到訂閱 修改播放器字幕大細同背景款式。要重新開過個 app 先會生效 執好就撳一下「搞掂」 - 靜音 + 噤聲 處理緊… 可能要等等 令播放器閃退 自動輪候 - 係咪要全部剷走晒睇過嘅紀錄? + 係咪要全部剷走晒睇片嘅紀錄? 顯示元資訊 - 關閉去隱藏元資訊窗口,收起有關串流創作者、串流內容或者搜尋請求嘅額外資訊 + 閂埋佢去隱藏元資訊窗口,收起有關串流創作者、串流內容或者搜尋請求嘅額外資訊 顯示「撳住就輪候」提示 - 揀選啱您心水嘅 PeerTube 站 + 揀選啱你心水嘅 PeerTube 站 紀錄與快取 NewPipe 播放器嘅通知 抹除元資料快取 抹除咗元資料快取 - 自動輪候接續落串流 - 排隊播要完嘅時候 (又未設定循環播放) 就追加一條咁上下嘅串流 + 自動輪候接落串流 + 排隊清單嘅片要播完嘅時候 (並未設定循環播放) ,就追加一條相似性質嘅串流片 PeerTube 站 - 去 %s 發掘啱您心水嘅站 + 去 %s 發掘啱你心水嘅站 播放清單 問題報告通知 報告問題嘅通知 - 剷走播放過嘅串流同播放到邊個位嘅紀錄 + 剷走播放過嘅串流同之前啲片睇到邊嘅紀錄 剷走咗睇過嘅紀錄 NewPipe 遇到問題,撳一下去報告 發生問題,詳見通知 - 拖拉執排位 + 拖條片去執好清單排位 轉換服務,而家揀選咗嘅係: 清單檢視模式 - 做噉一半冇咗,因為個檔案刪除咗 - 連線等太耐 + 做做下冇咗,因為個檔案刪除咗 + 等太耐連線 開始晒所有下載 - 下載排隊逐個嚟,唔要一次過 + 下載要排隊逐個嚟 近期 - 帳戶已被終止 + 已終止帳戶 語言 支援 覆寫唔到個檔案 暫停晒所有下載 平板電腦模式 - 個檔案建立唔到 - 您係咪想喺搜尋紀錄度刪除呢個項目? + 建立唔到呢個檔案 + 你係咪想喺搜尋紀錄度剷走呢個項目? 睇下咩問題 有個整緊嘅下載撞名 有個等緊嘅下載撞名 @@ -443,45 +443,45 @@ 年齡限制 您部機冇 app 開到佢 呢部影片係 YouTube Music Premium 會員限定,因此 NewPipe 未能串流或下載。 - 揀選啱您心水嘅夜色主題 — %s + 揀選啱你心水嘅夜色主題 — %s 呢部內容係付費使用者限定,因此 NewPipe 未能串流或下載。 - 您可以喺下面揀選啱您心水嘅夜色主題 - 停用揀選描述入面嘅文字 + 你可以喺下面揀選啱你心水嘅夜色主題 + 停止揀選描述入面嘅文字 一格格 一行行 加入去播放清單 新嘅播放清單 顯示頻道詳情 - 唔見影 + 唔見咗影 揀選一個播放清單 伺服器唔接受多執行緒下載,請改用 @string/msg_threads = 1 再試下啦 連接唔到伺服器 播放清單頁面 撳住就輪候 - 目的地資料夾建立唔到 + 建立唔到呢個目的地資料夾 建立唔到安全連線 喺幕後開始播放 部機冇晒位 頂櫳重試幾多次 - 若然有機會用到流動數據嘅時候,可能會用得著,雖則有啲下載或者冇得暫停 - 輪住下載 + 若然有機會用到流動數據嘅時候,可能會用得著,雖則有啲下載冇得暫停 + 輪住嚟下載 內部 私人 停止 按用量收費嘅網絡就閘住 抹走下載紀錄 - 您想抹走您嘅下載紀錄,定係想剷走晒所有下載咗嘅檔案? + 你想抹走你嘅下載紀錄,定係想剷走晒所有下載咗嘅檔案? 剷走下載咗嘅檔案 - 刪除咗 %1$s 個下載 + 剷走咗 %1$s 個下載 問我要下載去邊 - 排隊尾 + 排隊排隊尾 搵唔到伺服器 - 伺服器冇傳回資料 + 伺服器冇傳返資料嚟 後期處理失敗 - NewPipe 未搞掂個檔案就關閉咗 - 呢個下載恢復唔到 + NewPipe 未搞掂個檔案就閂埋咗 + 呢個下載檔案恢復唔到 同個下載咗嘅檔案撞名 同個現有嘅檔案撞名 @@ -494,7 +494,7 @@ 由 %s 建立 出自 %s 章節 - 呢部內容 NewPipe 仲未支援。 + NewPipe 仲未支援到呢樣。 \n \n希望未來會喺日後嘅版本支援啦。 顯示睇過嘅項目 @@ -503,13 +503,13 @@ \n請安裝一個檔案管理程式,又或者試下喺下載設定度停用「%s」 搵唔到合適嘅檔案總管進行呢個動作。 \n請安裝一個與儲存空間存取框架兼容嘅檔案管理程式 - 呢部內容限區,喺您所在國家未有提供。 - 呢首 (至少喺您所在國家而言) 係 SoundCloud Go+ 單曲,因此 NewPipe 未能串流或下載。 - 呢部內容屬於私人,因此 NewPipe 未能串流或下載。 + 呢部內容限區,喺你所在國家未有提供。 + 呢首 (至少喺你所在國家而言) 係 SoundCloud Go+ 單曲,因此 NewPipe 未能串流或下載。 + 呢部內容係私人嘢,因此 NewPipe 未能串流或下載。 自動 (跟返部機嘅主題色系) 精選 廣播 - 您而家可以揀選喺描述入面嘅文字喇。不過要單聲,喺揀選模式嘅時候,版面可能會有啲眨,同埋啲連結會撳唔到。 + 你而家可以揀選喺描述入面嘅文字喇。不過要單聲先,喺揀選模式嘅時候,版面可能會有啲眨,同埋啲連結可能會撳唔到。 啟用揀選描述入面嘅文字 版權協議 分類 @@ -521,39 +521,39 @@ 置頂留言 創作者畀咗心心 開啟網站 - + 主機 喺影片詳情撳一下「幕後播」或「浮面播」個掣嘅時候顯示提示 紀錄 - 紀錄 - 攝下個等陣播 - 記憶體洩露監測喺傾卸堆疊嘅時候,或者會導致個 app 冇反應 - 閂選單 - 攝咗做下個等陣播 + 歷史紀錄 + 攝咗做下個播 + 記憶體洩露監測喺傾卸堆疊嘢嘅時候,或者會導致個 app 冇反應 + 閂埋選單 + 攝咗做下個播 點做法 影片雜湊進度嘅通知 大笪地 抹走搜尋紀錄 - 刪除搜尋關鍵字嘅紀錄 + 剷走晒搜尋關鍵字嘅紀錄 係咪要全部剷走晒搜尋嘅紀錄? 頻道頁面 揀選一個頻道 排隊播 聲音設定 - 開選單 + 開啟選單 揀做播放清單縮圖 整咗個播放清單 加咗入播放清單 LeakCanary 用唔到 顯示記憶體洩露 - 強制報告喺片段或活動週期棄置後送遞唔到嘅 Rx 例外狀況 + 強制報告喺片段或週期棄置後送遞唔到嘅 Rx 狀況 顯示「令播放器閃退」 用播放器嘅時候顯示一個閃退選項 令個 app 閃退 顯示一則錯誤橫條 - 建立一則錯誤通知 + 建立一則出現錯誤通知 好,包括埋睇過但未睇晒嘅影片 - 礙於 ExoPlayer 所限,快轉長短經已改為 %d 秒 + 礙於 ExoPlayer 所限,快轉長度經已改為 %d 秒 影片雜湊通知 排咗去隊尾 揀定「開啟」動作 @@ -565,47 +565,47 @@ 未有頻道訂閱 轉咗播放清單縮圖。 報告週期完結後嘅錯誤 - 每次下載都會問您要儲存去邊 - 每次下載都會問您要儲存去邊。 -\n如果您想儲存落外置 SD 卡入面,請啟用系統資料夾揀選器 (SAF) + 每次下載都會問你要儲存去邊 + 每次下載都會問你要儲存去邊。 +\n如果你想儲存落外置 SD 卡入面,請啟用系統資料夾揀選器 (SAF) 用系統資料夾揀選器 (SAF) 加入去播放清單之前或之後睇過嘅影片都會剷走個囉喎。 -\n您肯定?剷走咗冇得掹個囉喎! - 「儲存空間存取框架」呢壇嘢,俾您下載落外置 SD 卡嗰度 - Android 10 打上局住要用「儲存空間存取框架」 +\n你肯定?剷走咗冇得掹個囉喎! + 「儲存空間存取框架」係畀你下載落外置 SD 卡嗰度 + Android 10 打上,局住要用「儲存空間存取框架」 ExoPlayer 預設值 外置儲存空間用唔到 - 排隊尾輪候播 - 刪除咗搜尋紀錄 - 冇得下載落外置 SD 卡嗰度。要唔要重設下載資料夾位置? + 排隊尾等待播放 + 剷走晒搜尋紀錄 + 冇得下載落外置 SD 卡嗰度。要唔要重設下載資料夾嘅位置? 喺浮面開始播放 收起播放清單 - 唔再收起 - 係咪要刪除呢個播放清單? + 唔再收埋 + 係咪要剷走呢個播放清單? 播放器通知 調整目前播放緊咩串流嘅通知 訂閱有新加串流嘅通知 載入緊串流詳細資料… - 通知訂閱有新加串流 + 通知訂閱有新嘅串流 檢查頻率 用咩網絡連線 咩網絡都無所謂 收取通知 - 您而家訂閱咗呢個頻道 + 你而家訂閱咗呢個頻道 全部切換 執行檢查有冇新加串流 通知 - 新加串流 + 新加嘅串流 %s 個新加串流 - 新加串流通知 + 新嘅串流通知 係咪要喺磁碟機上面消除晒全部下載咗嘅檔案? 通知已停用 單曲 全部剷走晒播放到邊個位 - 請睇過係咪已經有人喺度講緊您呢次彈 app 嘅狀況。若然重複發表新嘅議題,就會嘥咗我哋可以真正用嚟修復個問題嘅時間㗎喇。 - NewPipe 係由一班熱心人用空閒時間義務開發,為您帶嚟最佳嘅使用體驗。係時候少少無拘,支持返開發者令 NewPipe 更臻完美,同時一顆心意挺佢哋可以嘆返杯咖啡。 + 請睇過係咪已經有人喺度講緊你呢次彈 app 嘅狀況。若然重複發表已有嘅議題,就會嘥咗我哋可以真正用嚟修復其他錯漏嘅時間㗎喇。 + NewPipe 係由一班熱心人用空閒時間義務咁開發㗎,為咗帶畀你最佳嘅使用體驗。係時候慷慨解囊,撐返開發者嘅付出,使 NewPipe 更臻完美,同時畀杯咖啡佢哋嘆下。 站內 聚首 轉 app 嘅時候借過 @@ -618,7 +618,7 @@ 載入緊摘要… 處理緊摘要… 摘要 - 摘要上次更新:%s + 摘要上次更新到:%s 未有載入:%d 摘要隔幾耐要更新 訂閱對上一次更新後,隔幾耐視之為過時 — %s @@ -640,73 +640,74 @@ 下載工具暫未支援嘅串流,就無謂擺出嚟喇 著作者嘅帳戶已經被終止。 \nNewPipe 日後唔會載入到呢個摘要。 -\n您要唔要取消訂閱呢個頻道? - 某啲服務有提供,通常會快趣好多,但項目數量可能有限兼欠奉詳情 (例如片長、項目類型、直播狀態) +\n你要唔要取消訂閱呢個頻道? + 某啲服務有提供,通常會快趣好多,但項目數量可能有限同埋資訊欠奉 (例如片長、項目類型、直播狀態) 剷走播放到邊個位 - 係咪要全部剷走晒播放到邊個位? + 係咪要全部剷走晒之前啲片嘅播放位置嘅紀錄? 百分比 半音 - 問過先至將排隊播清零 - 目前播放器入面嘅排隊播將會清零 + 更改載入播放間隔大細 (目前係 %s)。細啲或者可以等條片快啲開波。更改要重新開過個播放器先至生效 + 問咗先至將排隊列表清走 + 目前播放器嘅排隊列表將會清走 加一個站 請輸入個站嘅 URL 驗證唔到個站 個站已經喺度喇 - 冚過您目前嘅紀錄、訂閱、播放清單,同埋 (有得揀係咪冚埋) 設定 + 冚過你目前嘅紀錄、訂閱、播放清單,同埋 (有得揀係咪冚埋) 設定 匯出紀錄、訂閱、播放清單,同埋設定 新嘅摘要項目 揀選一個站 - 轉換播放器嘅時候,排隊播可能會清零 - NewPipe 係「著佐權」(copyleft) 自由軟件:您可以隨意使用、考究、分享同改進佢。具體而言,您可以依據自由軟件基金會發佈嘅《GNU 通用公眾特許條款》第 3 版或 (按您選擇) 之後任一版本之下嘅條款,重新分發及/或修改呢個軟件。 - 載入斬件大細 + 轉換播放器嘅時候,排隊列表可能會清走 + NewPipe 係「著佐權」(copyleft) 嘅自由軟件:你可以隨意使用、考究、分享同改進佢。具體而言,你可以依據自由軟件基金會發佈嘅《GNU 通用公眾特許條款》第 3 版或 (按您選擇) 之後任一版本之下嘅條款,重新分發及/或修改呢個軟件。 + 載入播放間隔大細 互動頁面 - 預設嘅互動站 - 輸入 URL 或者您嘅 ID 去匯入 SoundCloud 個人檔案: + 預設嘅互動站(Kiosk) + 輸入 URL 或者你嘅 ID 去匯入 SoundCloud 個人檔案: \n \n一、喺網頁瀏覽器啟用「桌面版模式」(個網唔支援手機版) \n二、去呢個網址:%1$s -\n三、叫您就登入 -\n四、複製佢彈返您去個人檔案嗰版個 URL。 - 您個 ID、soundcloud.com/您個id +\n三、叫你登入就去馬 +\n四、複製佢彈返畀你去個人檔案嗰版個 URL。 + 你個 ID、soundcloud.com/你個id 揀選互動站 - 顯示返項目原底話時隔幾耐 + 顯示返項目原本話時隔幾耐 停用多媒體隧道 - 頻道成軍 - 成軍名留空 - 黃袍 - 您係咪要刪除呢個成軍? - 淨係顯示未成軍嘅訂閱 + 頻道成谷 + 成谷名留空 + + 你係咪要刪除呢個谷? + 淨係顯示未成谷嘅訂閱 啲圖都要騷 Picasso 三色碼顯示源頭:紅碼係網絡上高落嚟,藍碼係儲存喺磁碟本地,綠碼係潛伏喺記憶體中 - 服務原底嘅字會騷返喺串流項目上面 + 服務原本嘅字會騷返喺串流項目上面 影像要推三色碼 未夠鐘上畫嘅項目照顯示 若果播片嘅時候窒下窒下或者黑畫面,就停用多媒體隧道啦 點樣用 Google 匯出嚟匯入 YouTube 訂閱: \n \n一、去呢個網址:%1$s -\n二、叫您就登入 +\n二、叫你就登入 \n三、撳一下「包含所有資料」,再撳一下「全部不選」,之後淨係剔返「訂閱」,然後撳「確定」 \n四、撳一下「下一步」然後揀「建立匯出」 \n五、個掣騷出嚟嘅時候就撳一下「下載」 \n六、返返嚟呢度,喺下低撳「匯入檔案」,揀返下載咗嗰個 .zip 檔案 \n七、[個 .zip 匯入唔到點算好] 將個 .csv 檔案解壓縮抽返出嚟 (通常係擺喺「YouTube and YouTube Music/subscriptions/subscriptions.csv」),喺下低撳「匯入檔案」,揀返抽出嚟個 csv 檔案 - 係咪覺得摘要「懸浮於半路太久,可否再快兩步」?可以試下啟用快速載入 (您可以喺設定度更改,又或者撳一下下低個掣)。 + 係咪覺得摘要「懸浮於半路太久,可否再快兩步」?可以試下啟用快速載入 (你可以喺設定度更改,又或者撳一下下低個掣)。 \n \nNewPipe 提供兩種載入摘要嘅方針: \n• 攞晒成個訂閱頻道,慢得嚟志在夠完整。 \n• 用特設嘅服務終端,快得嚟啲料爭少少。 \n -\n兩者嘅分別在於,快趣嗰個通常都係爭噉啲料:譬如話項目嘅片長同類型 (分唔到係直播定上載),同埋攞返嚟數目可能會少啲。 +\n兩者嘅分別在於,快趣嗰個通常都係爭咁啲料:譬如話項目嘅片長同類型 (分唔到係直播定上載),同埋攞返嚟數目可能會少啲。 \n -\nYouTube 就係其中一個服務,有用 RSS 摘要提供呢個快趣嘅門路。 +\nYouTube 就係其中一個有用 RSS 摘要提供呢個快趣門路嘅服務。 \n -\n所以就睇您點揀:想快定要準。 +\n所以就睇你點揀:想快定要準。 收埋睇過嘅項目 未夠鐘上畫嘅項目就收埋 去網站睇下 排序 常見問題 - 若然您用呢個 app 有疑問,然而「亦有些難啟齒」,不妨睇下常見問題集,話唔定會發現「有場舞還未發表」! + 若然你係用緊呢個 app嗰陣有疑問,然而「亦有些難啟齒」,不妨睇下常見問題集,話唔定會發現「有場舞還未發表」! 快速模式 右上角嘅選單有得匯入或匯出訂閱 您已經用緊最新版本嘅 NewPipe @@ -718,13 +719,20 @@ 灰咗嘅播放清單,即係已經有呢個項目。 重複加入咗 %d 次 忽略硬件多媒體掣嘅事件 - 譬如話您個耳機上面啲實體掣軭咗就會有用 + 譬如話你用耳機嗰陣,撳上面啲實體掣就會有用 重複嗰啲剷咗佢 重複咗嗰啲係咪要剷走? - 下列嘅串流騷出嚟 + 下列嘅串流見得光 顯示/隱藏串流 睇晒 未睇晒 未夠鐘上畫 - 您係咪要剷走呢個播放清單入面所有重複咗嘅串流? + 你係咪要剷走呢個播放清單入面所有重複咗嘅串流? + 揀選左手邊播放器螢幕嘅手勢 + 左手邊手勢動作 + 揀選右手邊播放器螢幕嘅手勢 + 右手邊手勢動作 + 亮度 + 聲音 + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 15bf15a0fc6..0623eef8542 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -727,4 +727,11 @@ 即將到來 移除重複的 您想要移除所有在此播放清單中重複的串流? + 左側手勢動作 + 右側手勢動作 + 亮度 + 音量 + 為播放器畫面左側選擇手勢 + 為播放器畫面右側選擇手勢 + \ No newline at end of file diff --git a/fastlane/metadata/android/be/changelogs/65.txt b/fastlane/metadata/android/be/changelogs/65.txt new file mode 100644 index 00000000000..e50dcef7778 --- /dev/null +++ b/fastlane/metadata/android/be/changelogs/65.txt @@ -0,0 +1,26 @@ +### Выпраўлена + +- Выключэнне анімацыі меню атладчыка #1486 +- адмяніць выдаленне усталёўкі #1472 +- Опцыя "Усталяваць у меню падзяліцца #1498 +- Дададзена опцыя падзяліцца да меню доўгага касання #1454 +- Мінімізаваць галоўны прайгравальнік пры выхадзе #1354 +- Абноўлена версія бібліятэкі і выпраўлены бэкап базы дадзеных #1510 +- ExoPlayer 2.8.2 Абнаўленне #1392 + - Reworked the playback speed control dialog to support different step sizes for faster speed change. + - Added a toggle to fast-forward during silences in playback speed control. This should be helpful for audiobooks and certain music genres, and can bring a true seamless experience (and can break a song with lots of silences =\\). + - Refactored media source resolution to allow passing metadata alongside media internally in the player, rather than doing so manually. Now we have a single source of metadata and is directly available when playback starts. + - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened. + - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging +- Use new extractor with refactored architecture for multiservice + +### Fixes + +- Fix #1440 Broken Video Info Layout #1491 +- View history fix #1497 + - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. + - #1475, by registering a view in the database when the user starts a video on external player on detail fragment. +- Fix creen timeout in case of popup mode. #1463 (Fixed #640) +- Main video player fix #1509 + - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background. + - Fixed minimizing player to popup does not destroy player when popup permission is not granted. diff --git a/fastlane/metadata/android/bm/short_description.txt b/fastlane/metadata/android/bm/short_description.txt new file mode 100644 index 00000000000..918d3ef3eab --- /dev/null +++ b/fastlane/metadata/android/bm/short_description.txt @@ -0,0 +1 @@ +ߦߕߎߓߎ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߣߌ߫ ߝߍߡߊ߲ ߢߊߝߘߍ߫ ߜ߲ߘߙߏߌߘ ߞߊ߲߬. diff --git a/fastlane/metadata/android/cs/short_description.txt b/fastlane/metadata/android/cs/short_description.txt index 36dc2a0e67b..597347b24f0 100644 --- a/fastlane/metadata/android/cs/short_description.txt +++ b/fastlane/metadata/android/cs/short_description.txt @@ -1 +1 @@ -Svobodný a nenáročný YouTube přehrávač for Android. +Svobodný a nenáročný YouTube frontend pro Android. diff --git a/fastlane/metadata/android/nqo/changelogs/63.txt b/fastlane/metadata/android/nqo/changelogs/63.txt new file mode 100644 index 00000000000..fd5ca6fd500 --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/63.txt @@ -0,0 +1,8 @@ +### ߟߢߊ߬ߟߌ ߟߎ߬ +- ߟߊ߬ߛߣߍ߬ߟߌ/ߟߊߝߏ߬ߦߟߌ߫ ߢߊߓߐߟߌ ߟߎ߬ #1333 +- ߞߙߍ߬ߢߍ߬ߡߊ߬ߛߊߦߌ ߟߊߘߐ߯ߦߊ (ߘߏߢߊߟߌ ߓߘߊ߫ ߟߊߢߊ߬) #1371 +- ߘߏߝߙߍߕߍ߫ ߘߋ߲ߣߍ߲ ߠߊߢߊ߭ #1375 +- GDPR ߞߏ ߓߍ߯ ߝߊ߬ߙߊ #1420 + +### ߘߐ߬ߓߍ߲߬ߠߌ߲ +- ߟߊ߬ߖߌ߰ߟߊ߲: ߕߌߢߍߟߌ ߘߏ߫ ߓߘߊ߫ ߘߐߓߍ߲߬ ߡߍ߲ ߦߋ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߟߊ߬ߖߌ߰ߟߌ߬ ߓߊ߲ߓߊߟߌ ߟߎ߬ ߖߛߐ ߝߍ߬ ߞߊ߬ ߝߘߊ߫ .giga ߞߐߕߐ߮ ߟߎ߬ ߟߊ߫ #1407 diff --git a/fastlane/metadata/android/nqo/changelogs/64.txt b/fastlane/metadata/android/nqo/changelogs/64.txt new file mode 100644 index 00000000000..cd6ad2b7d57 --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/64.txt @@ -0,0 +1,8 @@ +### ߟߢߊ߬ߟߌ ߟߎ߬ +- ߦߋߡߍ߲ߕߊ߫ ߓߘߍ߬ߦߊ߫ ߘߊ߲߬ߠߊߕߍ߱ ߛߋߞߏߦߊ ߜߋߟߋ߲ߜߋߟߋ߲߫ ߟߐ߲ߕߊ ߟߎ߬ ߟߊߓߊ߯ߙߊ ߘߐ߫ #1339 +- ߞߊ߬ ߞߣߍߦߊ ߟߊߞߎ߲߬ߘߎ߬ ߛߌ߰ߘߐ ߢߍ߫ #1442 +- ߟߊߖߌ߰ߟߌ߫ ߢߣߊ߬ߦߊ ߟߢߊ߬ߟߌ ߟߎ߬ ߦߙߍߞߍߟߊ߲߫ ߖߊߝߏߣߍ߲ ߢߍ߫ #1431 +- ߞߟߋߞߟߋ߫ ߘߌ߯ߘߐ ߟߎ߬ ߞߐߞߘߐߓߌ߲ߓߌ߲ #1433 + +### ߛߊߞߍߟߌ ߟߎ߬ +- ߜߊߛߊ߲ߠߌ߲ ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ ߘߊߦߟߍ߫ ߕߎߡߊ (ߊ߬ ߡߊߟߐ߬ߘߐ߲߬ߕߊ ߦߋ߫ ߓߐߞߏ߫ ߞߐߟߕߊ ߟߎ߫ ߟߋ߬ ߘߐ߫) #1441 diff --git a/fastlane/metadata/android/nqo/changelogs/65.txt b/fastlane/metadata/android/nqo/changelogs/65.txt new file mode 100644 index 00000000000..ad622b38711 --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/65.txt @@ -0,0 +1,26 @@ +### ߟߢߊ߬ߟߌ ߟߎ߬ + +- ߓߙߎߜ߭ߍߙߌ߫ ߢߣߊߠߟߊ ߞߐߖߌߦߊ߫ ߟߊߡߊ߭ ߓߘߊ߫ ߓߐ߫ ߊ߬ ߘߐ߫ #1486 +- ߟߊ߬ߖߌ߰ߟߌ ߟߎ߫ ߖߐ߬ߛߌ ߘߐߛߊ߭ #1472 +- ߟߊ߬ߖߌ߰ߟߌ߫ ߢߣߊߕߊߟߌ ߓߘߊ߫ ߓߊ߫ ߓߌ߬ߟߊ߬ ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߥߟߊ ߘߐ߫ #1498 +- ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߕߊ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ "ߕߐߘߐ߲߫ ߖߊ߲" ߢߣߊߥߟߊ ߟߊ߫ #1454 +- ߞߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߬ ߓߊߖߎ ߡߊߖߌ߰ ߓߐߟߌ߫ ߕߎߡߊ #1354 +- ߟߍߙߘߊ߫ ߓߐߞߏߠߊ߲ ߟߏ߲ߘߐߦߊߟߌ ߣߌ߫ ߟߐ߲ߕߊߓߘߐ ߟߊߞߎ߲߬ߘߎ߫ ߛߊߞߍߟߌ #1510 +- ߍߞߑߛߏߔߌߟߋߦߊ ߂.߈.߂ ߟߏ߲ߘߐߦߊߟߌ #1392 + - ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊߡߊ߬ߙߊ߫ ߘߊߘߐߖߊߥߏ߫ ߞߏ߲ߘߏ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߟߋ߬ ߞߏ߫ ߛߴߊ߬ ߘߌ߫ ߛߋ߫ ߛߋ߲߬ߘߊ ߘߍ߲߬ߘߍ߲߬ ߓߐߣߍ߲ߢߐ߲߰ߡߊ߫ ߟߎ߫ ߕߊ߬ ߟߊ߫߸ ߞߊ߬ ߓߏߙߌ߬ߛߋ߲ ߡߊߝߊ߬ߟߋ߲߬ ߞߊߟߌߦߊ ߘߐ߫. + - ߢߍߕߊ߯ ߞߊߟߌ߲ ߢߣߊߕߊߟߌ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߊ߫ ߡߊ߬ߞߎ߲ ߥߊ߯ߕߌ. ߏ߬ ߢߊ߬ߕߣߐ ߘߍ߫ ߞߍ߫ ߊ߬ ߟߊ߫ ߡߍ߲ߕߊ߫ ߞߝߊ ߟߎ߬ ߘߐ߫ ߊ߬ ߣߌ߫ ߘߐ߲߬ߞߟߌ ߛߎ߯ߦߊ ߘߏ߫ ߟߎ߫߸ ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߊ߬ߙߌ ߘߌߦߊߘߏ߲߬ ߠߴߊ߬ ߢߊ ߖߍ߬ߘߍߖߍ߬ߘߍ ߡߊ߬ (ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߐ߲߬ߞߟߌ ߟߊߛߎ߬ߘߎ߲߬ߧߊ߬ߟߊ߫ ߡߊ߬ߞߎ߲߬ ߛߌߦߊߡߊ߲߫ ߦߋ߫ ߡߍ߲ ߘߐ߫ =\\) + - ߞߟߋߞߟߋ ߟߎ߬ ߓߐߛߎ߲ ߓߍ߲߬ߡߊ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߞߏ߫ ߛߋ߫ ߟߐ߲ߕߓߊ ߟߎ߬ ߣߌ߲߫ ߞߟߋߞߟߋ ߟߎ߬ ߘߌ߫ ߕߊ߬ߡߌ߲߬ ߘߐߛߊߙߌߟߊ߲ ߞߣߐ߫ ߞߋߟߋ߲ߘߌ߫߸ ߖߋߣߌ߲߬ ߊ߬ ߦߋ߫ ߞߍ߫ ߓߟߏ߫ ߟߊ߫. ߡߎ߬ߕߎ߲߬߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߓߐߛߎ߲߫ ߞߋߟߋ߲߫ ߔߋ߫ ߟߋ߬ ߦߴߊ߲ ߓߟߏ߫߸ ߊ߬ߟߎ߫ ߘߏ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌߞߘߐ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߊ߫ ߘߊߡߌ߬ߣߊ߬. + - ߥߎߟߊߟߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ ߟߐ߲ߕߓߊ ߟߎ߬ ߛߊߞߍ߸ ߡߍ߲ ߠߎ߬ ߕߍ߫ ߟߏ߲ߘߏߦߊ߫ ߟߊ߫ ߣߌ߫ ߟߐ߲ߕߓߊ߫ ߞߎߘߊ ߟߎ߬ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ߫ ߞߎ߲ߞߎߘߎ߲ ߘߊߦߟߍ߬ ߕߎߡߊ. + - ߕߣߐ߬ߓߐ߬ߟߊ ߢߊߓߍ߲߫ ߛߊߞߍߟߌ߫ ߛߌߦߊߡߊ߲߫ : #1383߸ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ ߕߏߟߏ߲߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߎ߬ ߦߋ߫ ߜߍߡߊ߲ ߠߋ߬ ߘߌ߫ ߡߎ߬ߕߎ߲߬ ߞߘߊߎ߫߸ ߝߎ߲ߞߊ߲ߡߊ ߘߊߕߎ߲߯ ߣߐ߬ߡߊ߲߫ ߏ߬ ߟߋ ߘߐ߫ ߊ߬ ߘߊߦߟߍ߬ ߝߍ߬. + - ߟߊߝߎߟߋ߲ߟߊ߲߫ ߞߎߘߊ߫ ߘߏ߫ ߟߊߓߊ߯ߙߊ ߊ߬ߣߌ߫ ߛߏ߯ߙߏߢߊ߫ ߟߊߢߊ߬ߣߍ߲ ߗߋߢߊߥߙߍ ߢߍ߫. + +### ߛߊߞߍߟߌ ߟߎ߬ + +- ߛߊߞߍߟߌ #1440 ߦߋߡߍ߲ߕߊ߫ ߟߌ߬ߤߟߊ߬ ߘߐߝߐ߬ߛߐ߲߬ߣߍ߲ ߠߎ߬ ߝߍ߲߬ߛߍ߲߬ߢߊ #1491 +- ߦߋߞߏ ߟߎ߫ ߘߝߐ߬ߦߊ ߛߊߞߍߟߌ #1497 + - #1495߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߟߏ߲ߘߐߦߊ (ߦߋߡߍߕߊ߫ ߞߐߖߌߦߊ߸ ߊ߬ ߞߎ߲߬ߕߐ߮ ߣߴߊ߬ ߖߊ߬ߕߋ) ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߕߏߟߏ߲ߛߙߍߘߍ ߟߊߛߐ߬ߘߐ߲߬. + - #1475߸ ߦߋߟߌ ߘߏ߫ ߟߊߞߎ߲߬ߘߎ ߟߐ߲ߕߊߓߘߐ ߞߣߐ߫ ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߦߋߡߍ߲ߕߊ ߘߏ߫ ߘߊߦߟߍ߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߘߏ߫ ߟߊ߫ ߕߐ߬ߝߍ߬ߦߊ߬ߟߌ߬ ߞߎߘߎ߲ ߘߏ߫ ߞߊ߲߬. +- ߝߢߐߘߊ߫ ߕߎ߬ߡߊ߬ߘߛߍ ߛߊߞߍߟߌ ߝߎ߲ߞߊ߲ߡߊ߫ ߗߏ߯ߦߊ ߘߐ߫. #1463 (ߛߊߞߍߣߍ߲ #640) +- ߦߋߡߍߕߊ߫ ߘߐߛߊߙߌߟߊ߲ ߓߊߖߎ ߛߊߞߍߟߌ #1509 + - ߡߛߊ߬ߦߟߌ߫ ߗߏ߯ߦߊ߫ ߛߊߞߍߟߌ߸ ߡߍ߲ ߦߋ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߓߌ߬ߟߊ߬ ߟߊ߫ ߝߝߝ ߟߊ߫ ߖߡߊ߬ߙߌ߬ ߞߎߘߊ߫ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߞߵߊ߬ ߕߘߍ߬ ߘߐߛߊߙߌߟߊ߲ ߥߊߟߌߘߊ ߦߋ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߘߐ߫. + - ߘߐߛߊߙߌߟߊ߲ ߝߎ߲ߞߊ߲ߡߊ ߡߊߖߌ߱ ߛߊߞߍߟߌ ߡߍ߲ ߕߍ߫ ߘߐߛߊߙߌߟߊ߲ ߥߦߊ߬ ߟߊ߫ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߝߎ߲ߞߊ߲ߡߊ ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߡߊ߫ ߘߌ߫. diff --git a/fastlane/metadata/android/nqo/changelogs/66.txt b/fastlane/metadata/android/nqo/changelogs/66.txt new file mode 100644 index 00000000000..2b9afde7da1 --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/66.txt @@ -0,0 +1,33 @@ +# ߓߐߞߏ߫ ߀.߁߃.߇ ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߫ ߝߐ߰ߓߍ + +### ߛߊߞߍߣߍ߲ ߠߎ߬ +- ߓߐߞߏ߫ ߀.߁߃.߆ ߘߕߐ߬ߡߐ߲߬ߠߌ߲߫ ߛߍ߲ߛߍ߲ߟߊ߲ ߝߙߋߞߋ ߘߏ߫ ߓߘߊ߫ ߛߊߞߍ߫ + +# ߓߐߞߏ߫ ߀.߁߃.߆ ߡߝߊ߬ߟߋ߲߬ߠߌ߲߫ ߠߎ߬ ߛߙߍߘߍ + +### ߟߢߊ߬ߟߌ ߟߎ߬ + +- ߓߙߎߜ߭ߍߙߌ߫ ߢߣߊߠߟߊ ߞߐߖߌߦߊ߫ ߟߊߡߊ߭ ߓߘߊ߫ ߓߐ߫ ߊ߬ ߘߐ߫ #1486 +- ߟߊ߬ߖߌ߰ߟߌ ߟߎ߫ ߖߐ߬ߛߌ ߘߐߛߊ߭ #1472 +- ߟߊ߬ߖߌ߰ߟߌ߫ ߢߣߊߕߊߟߌ ߓߘߊ߫ ߓߊ߫ ߓߌ߬ߟߊ߬ ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߥߟߊ ߘߐ߫ #1498 +- ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߕߊ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ "ߕߐߘߐ߲߫ ߖߊ߲" ߢߣߊߥߟߊ ߟߊ߫ #1454 +- ߞߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߬ ߓߊߖߎ ߡߊߖߌ߰ ߓߐߟߌ߫ ߕߎߡߊ #1354 +- ߟߍߙߘߊ߫ ߓߐߞߏߠߊ߲ ߟߏ߲ߘߐߦߊߟߌ ߣߌ߫ ߟߐ߲ߕߊߓߘߐ ߟߊߞߎ߲߬ߘߎ߫ ߛߊߞߍߟߌ #1510 +- ߍߞߑߛߏߔߌߟߋߦߊ ߂.߈.߂ ߟߏ߲ߘߐߦߊߟߌ #1392 + - ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊߡߊ߬ߙߊ߫ ߘߊߘߐߖߊߥߏ߫ ߞߏ߲ߘߏ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߟߋ߬ ߞߏ߫ ߛߴߊ߬ ߘߌ߫ ߛߋ߫ ߛߋ߲߬ߘߊ ߘߍ߲߬ߘߍ߲߬ ߓߐߣߍ߲ߢߐ߲߰ߡߊ߫ ߟߎ߫ ߕߊ߬ ߟߊ߫߸ ߞߊ߬ ߓߏߙߌ߬ߛߋ߲ ߡߊߝߊ߬ߟߋ߲߬ ߞߊߟߌߦߊ ߘߐ߫. + - ߢߍߕߊ߯ ߞߊߟߌ߲ ߢߣߊߕߊߟߌ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߊ߫ ߡߊ߬ߞߎ߲ ߥߊ߯ߕߌ. ߏ߬ ߢߊ߬ߕߣߐ ߘߍ߫ ߞߍ߫ ߊ߬ ߟߊ߫ ߡߍ߲ߕߊ߫ ߞߝߊ ߟߎ߬ ߘߐ߫ ߊ߬ ߣߌ߫ ߘߐ߲߬ߞߟߌ ߛߎ߯ߦߊ ߘߏ߫ ߟߎ߫߸ ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߊ߬ߙߌ ߘߌߦߊߘߏ߲߬ ߠߴߊ߬ ߢߊ ߖߍ߬ߘߍߖߍ߬ߘߍ ߡߊ߬ (ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߐ߲߬ߞߟߌ ߟߊߛߎ߬ߘߎ߲߬ߧߊ߬ߟߊ߫ ߡߊ߬ߞߎ߲߬ ߛߌߦߊߡߊ߲߫ ߦߋ߫ ߡߍ߲ ߘߐ߫ =\\) + - ߞߟߋߞߟߋ ߟߎ߬ ߓߐߛߎ߲ ߓߍ߲߬ߡߊ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߞߏ߫ ߛߋ߫ ߟߐ߲ߕߓߊ ߟߎ߬ ߣߌ߲߫ ߞߟߋߞߟߋ ߟߎ߬ ߘߌ߫ ߕߊ߬ߡߌ߲߬ ߘߐߛߊߙߌߟߊ߲ ߞߣߐ߫ ߞߋߟߋ߲ߘߌ߫߸ ߖߋߣߌ߲߬ ߊ߬ ߦߋ߫ ߞߍ߫ ߓߟߏ߫ ߟߊ߫. ߡߎ߬ߕߎ߲߬߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߓߐߛߎ߲߫ ߞߋߟߋ߲߫ ߔߋ߫ ߟߋ߬ ߦߴߊ߲ ߓߟߏ߫߸ ߊ߬ߟߎ߫ ߘߏ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌߞߘߐ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߊ߫ ߘߊߡߌ߬ߣߊ߬. + - ߥߎߟߊߟߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ ߟߐ߲ߕߓߊ ߟߎ߬ ߛߊߞߍ߸ ߡߍ߲ ߠߎ߬ ߕߍ߫ ߟߏ߲ߘߏߦߊ߫ ߟߊ߫ ߣߌ߫ ߟߐ߲ߕߓߊ߫ ߞߎߘߊ ߟߎ߬ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ߫ ߞߎ߲ߞߎߘߎ߲ ߘߊߦߟߍ߬ ߕߎߡߊ. + - ߕߣߐ߬ߓߐ߬ߟߊ ߢߊߓߍ߲߫ ߛߊߞߍߟߌ߫ ߛߌߦߊߡߊ߲߫ : #1383߸ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ ߕߏߟߏ߲߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߎ߬ ߦߋ߫ ߜߍߡߊ߲ ߠߋ߬ ߘߌ߫ ߡߎ߬ߕߎ߲߬ ߞߘߊߎ߫߸ ߝߎ߲ߞߊ߲ߡߊ ߘߊߕߎ߲߯ ߣߐ߬ߡߊ߲߫ ߏ߬ ߟߋ ߘߐ߫ ߊ߬ ߘߊߦߟߍ߬ ߝߍ߬. + - ߟߊߝߎߟߋ߲ߟߊ߲߫ ߞߎߘߊ߫ ߘߏ߫ ߟߊߓߊ߯ߙߊ ߊ߬ߣߌ߫ ߛߏ߯ߙߏߢߊ߫ ߟߊߢߊ߬ߣߍ߲ ߗߋߢߊߥߙߍ ߢߍ߫. + +### ߛߊߞߍߟߌ ߟߎ߬ + +- ߛߊߞߍߟߌ #1440 ߦߋߡߍ߲ߕߊ߫ ߟߌ߬ߤߟߊ߬ ߘߐߝߐ߬ߛߐ߲߬ߣߍ߲ ߠߎ߬ ߝߍ߲߬ߛߍ߲߬ߢߊ #1491 +- ߦߋߞߏ ߟߎ߫ ߘߝߐ߬ߦߊ ߛߊߞߍߟߌ #1497 + - #1495߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߟߏ߲ߘߐߦߊ (ߦߋߡߍߕߊ߫ ߞߐߖߌߦߊ߸ ߊ߬ ߞߎ߲߬ߕߐ߮ ߣߴߊ߬ ߖߊ߬ߕߋ) ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߕߏߟߏ߲ߛߙߍߘߍ ߟߊߛߐ߬ߘߐ߲߬. + - #1475߸ ߦߋߟߌ ߘߏ߫ ߟߊߞߎ߲߬ߘߎ ߟߐ߲ߕߊߓߘߐ ߞߣߐ߫ ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߦߋߡߍ߲ߕߊ ߘߏ߫ ߘߊߦߟߍ߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߘߏ߫ ߟߊ߫ ߕߐ߬ߝߍ߬ߦߊ߬ߟߌ߬ ߞߎߘߎ߲ ߘߏ߫ ߞߊ߲߬. +- ߝߢߐߘߊ߫ ߕߎ߬ߡߊ߬ߘߛߍ ߛߊߞߍߟߌ ߝߎ߲ߞߊ߲ߡߊ߫ ߗߏ߯ߦߊ ߘߐ߫. #1463 (ߛߊߞߍߣߍ߲ #640) +- ߦߋߡߍߕߊ߫ ߘߐߛߊߙߌߟߊ߲ ߓߊߖߎ ߛߊߞߍߟߌ #1509 + - ߡߛߊ߬ߦߟߌ߫ ߗߏ߯ߦߊ߫ ߛߊߞߍߟߌ߸ ߡߍ߲ ߦߋ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߓߌ߬ߟߊ߬ ߟߊ߫ ߝߝߝ ߟߊ߫ ߖߡߊ߬ߙߌ߬ ߞߎߘߊ߫ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߞߵߊ߬ ߕߘߍ߬ ߘߐߛߊߙߌߟߊ߲ ߥߊߟߌߘߊ ߦߋ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߘߐ߫. + - ߘߐߛߊߙߌߟߊ߲ ߝߎ߲ߞߊ߲ߡߊ ߡߊߖߌ߱ ߛߊߞߍߟߌ ߡߍ߲ ߕߍ߫ ߘߐߛߊߙߌߟߊ߲ ߥߦߊ߬ ߟߊ߫ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߝߎ߲ߞߊ߲ߡߊ ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߡߊ߫ ߘߌ߫. diff --git a/fastlane/metadata/android/nqo/changelogs/68.txt b/fastlane/metadata/android/nqo/changelogs/68.txt new file mode 100644 index 00000000000..9d12539b043 --- /dev/null +++ b/fastlane/metadata/android/nqo/changelogs/68.txt @@ -0,0 +1,31 @@ +# ߓ߀.߁߄.߁ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬ + +### ߛߊߞߍߟߌ ߟߎ߬ +- ߦߋߡߍ߲ߕߊ߫ ߛߘߌ߬ߜߋ߲߫ ߘߏߝߙߍߕߍߓߐ ߗߌߙߏ߲ #1659 +- ߞߊ߲߬ߛߓߍ߫ ߛߘߌ߬ߜߋ߲ ߕߎ߲߬ ߕߍ߫ ߟߛߊ߬ ߟߴߊ߬ ߢߌ߲߬ߡߊ ߟߊ߫ #1657 + +# ߓ߀.߁߄.߀ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬ + +### ߞߎߘߊ ߟߎ߬ +- ߞߎ߲ߓߍ߲߫ ߞߙߍ߬ߢߍ #1461 +- ߟߊ߬ߛߣߍ߬ߟߌ߬ ߞߐߜߍ߫ ߟߊߖߘߍ߬ߕߦߊ߬ߕߊ #1461 + +### ߟߡߊ߬ߟߌ ߟߎ߬ +- ߡߊ߬ߡߙߊ߬ߟߌ߫ ߖߍ߰ߙߍ߬ߡߊ ߟߎ߬ ߓߘߊ߫ ߘߐߓߊ߯ߙߊ߫ #1604 +- ߘߐߛߊߙߌߟߊ߲߫ ߝߎ߲ߞߊ߲ߡߊ߫ ߘߊߕߎ߲߯ ߢߊ߫ ߞߎߘߊ #1597 + +### ߛߊߞߍߟߌ ߟߎ߬ +- ߝߎ߬ߕߎ߲߬ߕߌ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߖߊ߬ߕߋ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬. ߏ߬ ߘߌ߫ ߘߊߕߎ߲߯ #1649. + - ߏ߬ ߘߐ߫߸ ߊ߬ ߘߴߊ߬ ߦߌ߬ߘߊ߬ ߞߏ߫ "ߡߊ߬ߝߘߎ߬ߓߊ߮ ߖߊ߬ߕߋ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬". +- ߛߊߞߍߟߌ ߓߘߊ߫ ߞߍ߫ NPE ߟߊ߫߸ ߣߌ߫ ߦߕߎߓߎ߫ ߕߏߟߏ߲ߛߙߍߘߍ ߘߏ߫ ߘߐߞߏߟߏ߲ ߦߋ߫ +- ߝߎ߲ߞߎ߲ߟߋ߲ ߠߎ߬ SoundCloud ߞߣߐ߫ +- ߜߊߛߊ߲ߠߌ߲߫ ߘߐߓߊ߯ߙߊ ߣߵߊ߬ ߛߊߞߍߟߌ #1623 +- ߢߌߣߌ߲ߠߌ߲߫ ߞߎ߲߬ߕߊ߰ߡߊ ߟߎ߬ ߞߐߝߟߌ #1562 +- ߢߌߣߌ߲ߠߌ߲߫ ߜߋߟߊ߲ߞߊ ߡߍ߲ ߡߊ߫ ߓߌ߲߬ߟߊ߬ ߞߐߜߍ ߞߊ߬ ߞߵߊ߬ ߜߊߘߊ߲߫ +- ߦߕߎߕߓߎ߫ ߛߙߊ߬ߕߊ ߦߋߡߍ߲ߕߊ ߡߍ߲ ߠߎ߬ ߓߟߏߕߍ߰ ߞߏߢߊ߬ +- ߦߋߡߍ߲ߕߊ ߡߍ߲ ߠߎ߬ ߕߍ߫ ߖߛߐ߫ ߟߊ߫ ߡߎ߰ߡߍ߫ (DASH ߘߐߞߕߌ߫ ߞߏߛߐ߲߬) +- ߛߘߌ߲߬ߜߋ߲ ߡߍ߲ ߠߎ߬ ߦߋ߫ ߦߋߡߍ߲ߕߊ ߟߎ߫ ߞߊ߲߬ߛߓߍ ߘߐ߫ +- ߊ߬ ߘߌ߫ ߖߊ߲߬ߘߐ߬ߓߌ߬ߟߊ߬ߟߌ ߦߌ߬ߘߊ߬ ߣߌ߫ ߡߐ߱ ߘߏ߫ ߞߵߊ߬ ߝߐ߫ ߞߴߊ߬ ߦߋ߫ ߟߊ߬ߖߌ߰ߟߌ ߞߍ߫ ߟߊ߫ ߞߐߞߊ߫ ߦߟߌߕߏߟߊ߲ ߞߊ߲߬ +- ߢߌ߬ߣߊ߬ߓߐ߬ߕߊ "ߝߏ߬ߛߌ߬ ߡߊ߫ ߛߌߝߊ߫" ߡߍ߲ ߘߌ߫ ߘߊ߬ߕߍ߰ߟߌ ߟߊߟߥߌ߬ +- ߞߏ߬ߋߞߏ߬ߋ ߕߍ߫ ߝߍ߲߬ߛߍ߲߬ ߠߊ߫ ߊ߲ߘߙߏߌߘ ߈.߁ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߓߊߖߎ ߞߣߐ߫ [ߊ߬ ߝߟߍ߫ ߦߊ߲߬](https://github.com/TeamNewPipe/NewPipe/issues/943) +- ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߠߌ߲߫ ߟߊߛߣߍߟߊ߲ ߠߊߞߎ߲߬ߘߎ. ߏ߬ ߦߋ߫ ߞߎ߲ߓߍ߲ ߘߊߕߎ߲߯ ߠߊ߫ #1641. diff --git a/fastlane/metadata/android/nqo/full_description.txt b/fastlane/metadata/android/nqo/full_description.txt new file mode 100644 index 00000000000..0041d7a3afb --- /dev/null +++ b/fastlane/metadata/android/nqo/full_description.txt @@ -0,0 +1 @@ +NewPipe ߕߍ߫ ߜ߭ߎߜ߭ߐߟ ߟߊ߫ ߝߊߙߡߑߥߐߙߞ ߟߍߙߘߊ߫ ߛߌ߫ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߥߟߊ߫ ߦߕߎߓߎ߫ ߟߊ߫ API. ߊ߬ ߦߋ߫ ߗߍߦߙߐ ߘߐߛߍ߲߬ߛߍ߲߬ ߠߊ߫ ߟߵߊ߬ ߘߊߞߘߐ߫ ߞߊ߬ ߟߐ߲ߕߊ߫ ߡߊ߬ߞߏ߬ߡߊ ߟߎ߫ ߛߐ߬ߘߐ߲߬. ߏ߬ ߞߏߛߐ߲߬ ߟߥߊߟߌߟߊ߲ ߣߌ߲߬ ߘߌ߫ ߛߋ߫ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫ ߕߙߏߞߏ ߞߊ߲߬ ߤߊߟߌ߬ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߜ߭ߎߜ߭ߐߟ ߗߋߢߊ ߟߎ߬ ߡߊߗߍߣߍ߲߫ ߕߍ߫. ߊ߬ ߣߴߌߞߐ߫߸ ߌ ߡߊ߬ߞߏ߬ ߕߍ߫ ߦߕߎߓߎ߫ ߖߊߕߋߘߊ߫ ߟߊ߫ ߞߊ߬ ߣߌߎߔߌߔ ߟߊߓߊ߯ߙߊ߫. ߊ߬ ߘߏ߲߬ ߝߛߙߌ ߟߋ߬ ߘߌ߫. diff --git a/fastlane/metadata/android/nqo/short_description.txt b/fastlane/metadata/android/nqo/short_description.txt new file mode 100644 index 00000000000..a798a5d851d --- /dev/null +++ b/fastlane/metadata/android/nqo/short_description.txt @@ -0,0 +1 @@ +ߦߕߎߓߎ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߣߌ߫ ߝߍߡߊ߲ ߢߊߝߘߍ߫ ߊ߲ߘߙߏߌߘ ߢߍ߫. From 51ee6f87e0393f07dd41372f197c8c4ddbb1aabe Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 6 May 2023 01:42:18 +0200 Subject: [PATCH 176/645] Remove translations of previously deleted string feed_toggle_hide_played_items --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-ka/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - 44 files changed, 44 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index e3b5245b3a7..9ebda78fa40 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -767,7 +767,6 @@ حجم الفاصل الزمني لتحميل التشغيل عرض العناصر المستقبلية إخفاء العناصر المستقبلية - إخفاء العناصر التي تمت مشاهدتها أسئلة مكررة إذا كنت تواجه مشكلة في استخدام التطبيق ، فتأكد من مراجعة هذه الإجابات للأسئلة الشائعة! مشاهدة على الموقع diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 04201fa52aa..eaacd3fc322 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -714,7 +714,6 @@ Naməlum keyfiyyət Oynatma yükləmə intervalı həcmi Gələcək elementləri göstər - Baxılan elementləri gizlət Gələcək elementləri gizlət Tətbiqi istifadə etməkdə çətinlik çəkirsinizsə, ümumi suallara bu cavabları yoxladığınıza əmin olun! Tez-tez soruşulan suallar diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 808e2b0c54a..ef07948be11 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -504,7 +504,6 @@ Падпіскі не выбраны Апошняе абнаўленне: %s Паказаць прагледжаныя матэрыялы - Схаваць прагледжаныя матэрыялы Аўтаматычна (тэма прылады) Выберыце ўлюбёную начную тэму - %s Дазвол вылучэння тэксту ў апісанні diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 6bfe27af86d..57d6ac5ced0 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -636,7 +636,6 @@ %1$sটি ডাউনলোড মুছা হয়েছে \"চালক বন্ধ করো\" দেখাও - দেখা ভুক্তি লুকাও বিজ্ঞপ্তি নিষ্ক্রিয় ভবিষ্যৎ ভুক্তি লুকাও ত্রুটি বিজ্ঞপ্তি বানাও diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index f6bc2cfa2ed..c979b9843e2 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -727,7 +727,6 @@ Streamy, které zatím nejsou podporovány systémem stahování, nebudou zobrazeny Vyberte kvalitu pro externí přehrávače U externích přehrávačů nejsou k dispozici žádné videostreamy - Skrýt zhlédnuté položky Skrýt nadcházející položky Často kladené dotazy Pokud máte potíže s používáním aplikace, přečtěte si tyto odpovědi na časté otázky! diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 3322590e858..e02101a57c0 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -709,7 +709,6 @@ Du kører den nyeste version af NewPipe På grund af ExoPlayer-begrænsninger blev søgetiden sat til %d sekunder Vis kun ikke-grupperede abonnementer - Skjul sete elementer Side med spillelister Du kan vælge dit foretrukne nattema nedenfor Vælg dit foretrukne nattema - %s diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 77243f37d33..8849a516a9e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -714,7 +714,6 @@ Der ausgewählte Stream wird von externen Playern nicht unterstützt Größe des Ladeintervalls für die Wiedergabe Zukünftige Elemente anzeigen - Angesehene Elemente ausblenden Zukünftige Elemente ausblenden Auf der Webseite ansehen Häufig gestellte Fragen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 091dd25cbdb..15f469166e5 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -714,7 +714,6 @@ Άγνωστη ποιότητα Μέγεθος διαστήματος φόρτωσης αναπαραγωγής Εμφάνιση μελλοντικών αντικειμένων - Απόκρυψη θεαθέντων Απόκρυψη μελλοντικών αντικειμένων Συχνές ερωτήσεις Προβολή στην ιστοσελίδα diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d4087640e69..27f0194d506 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -730,7 +730,6 @@ Calidad desconocida Mostrar elementos futuros Tamaño del intervalo de carga de reproducción - Ocultar los elementos mirados Ocultar elementos futuros Ver en la página web Preguntas frecuentes diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index a2056cba7e9..ddf72dfa4ed 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -715,7 +715,6 @@ Taasesituseks vajalike andmete laadimise samm Näita tulevasi üksuseid Peida tulevased üksused - Peida vaadatud üksused Korduma kippuvad küsimused Kui sul tekib selle rakenduse kasutamisel probleeme, siis esmalt vaata, kas vastus leidub korduma kippuvate küsimuste hulgas! Edasi loe veebisaidist diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 5900031ef4a..e3f2e44e5f8 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -715,7 +715,6 @@ Erakutsi etorkizuneko elementuak Hautatu kanpoko erreproduzigailuen kalitatea Ezkutatu etorkizuneko elementuak - Ezkutatu ikusitako elementuak Grisez idatzitako erreprodukzio-zerrendek jada badute elementu hau. Webgunean ikusi Akatsa arbelera kopiatzean diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 22a7956fab8..b797e2e55b6 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -715,7 +715,6 @@ اندازهٔ دورهٔ بار کردن پخش نمایش موارد آینده نهفتن موارد آینده - نهفتن موارد دیده شده سوالات متداول اگر حین استفاده از اپ مشکلی دارید، حتما پاسخ‌ها به سوالات متداول را بررسی کنید! نمایش در وبسایت diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 742c13c007f..1477c679300 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -729,7 +729,6 @@ Aucun flux vidéo n’est disponible pour les lecteurs externes Taille de l\'intervalle de chargement de la lecture Afficher les éléments à venir - Masquer les éléments visionnés Masquer les éléments à venir Foire aux questions Voir sur le site web diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 20ceff5faca..635ba3b6f08 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -715,7 +715,6 @@ Mostrar elementos próximos Non hai emisións de audio dispoñíbeis para reprodutores externos Ocultar elementos próximos - Ocultalos elementos xa ollados Ver na páxina web Preguntas máis frecuentes Se tes problemas para usala aplicación, asegúrate de consultar estas respostas ás preguntas comúns! diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index f1eee568ed8..367c50559f7 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -740,7 +740,6 @@ תצורה לא מוכרת גודל משך טעינת נגינה הצגת פריטים עתידיים - הסתרת פריטים במעקב הסתרת פריטים עתידיים מיון הצגה באתר diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index f2e97d28b1a..808046eb181 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -663,7 +663,6 @@ ऑन स्वतः बने (कोई अपलोडर नहीं मिला) चैनल समूह - देखे गए आइटम छुपाएं भविष्य आइटम छुपाएं कई बार पूछे प्रश्न वेबसाइट पर देखें diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index fa350501112..720e322e2ec 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -729,5 +729,4 @@ Za ovu radnju nije pronađen odgovrajući upravljač datoteka. \nInstaliraj „Storage Access Framework” kompatibilni upravljač datoteka Sakrij buduće stavke - Sakrij pogledane stavke \ No newline at end of file diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 6327aba2d99..26bddfafa0f 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -720,7 +720,6 @@ Megtekintés a weboldalon Rendezés Ha problémája van az alkalmazás használatával, akkor nézze meg az ezekre a gyakori kérdésekre adott válaszokat! - Megnézett elemek elrejtése Gyors mód Feliratkozások importálása vagy exportálása a 3 pontos menüből Ön a Newpipe legfrissebb verzióját futtatja diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index bffd486a016..ca2f9aceec2 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -701,7 +701,6 @@ Format tidak diketahui Ukuran interval pemuatan playback Tampilkan item mendatang - Sembunyikan item yang telah ditonton Sembunyikan item mendatang Pertanyaan yang sering diajukan Jika Anda mengalami masalah menggunakan aplikasi, pastikan untuk melihat jawaban untuk pertanyaan yang umum! diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 0129ead5bab..63540b9c650 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -581,7 +581,6 @@ Virkja hraðstraumsham Afvirkja hraðstraumsham Sýna spiluð atriði - Fela spiluð atriði NewPipe styður ekki þetta efni. \n \nÞað verður vonandi stutt í framtíðarútgáfu. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 68aca05cb6c..95920f278da 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -727,7 +727,6 @@ Formato sconosciuto Dimensione intervallo di caricamento della riproduzione Mostra elementi futuri - Nascondi elementi visti Nascondi elementi futuri Domande frequenti Se riscontri problemi nell\'utilizzo dell\'app, dai un\'occhiata alle risposte delle domande più comuni! diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index be3874247de..3614cb6e7a6 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -701,7 +701,6 @@ 外部プレイヤーで利用可能な動画ストリームがありません 外部プレイヤーでの品質を選択 次のアイテムを表示する - 再生済みを隠す 次のアイテムを隠す 並び替え ウェブサイトを表示 diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 8574ee3b699..d709e0cefc2 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -541,7 +541,6 @@ ჩართეთ სწრაფი რეჟიმი სწრაფი რეჟიმის გამორთვა ნანახი ნივთების ჩვენება - ნანახი ნივთების დამალვა ეს შინაარსი ჯერ არ არის მხარდაჭერილი NewPipe-ის მიერ. \n \n იმედია, ის იქნება მხარდაჭერილი მომავალ ვერსიაში. diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 20ddac7762e..8133b2a8626 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -702,7 +702,6 @@ 이 기능은 아직 NewPipe에서 지원하지 않습니다. \n \n이후 버전에서 지원될 예정입니다. - 감시한 항목 숨기기 향후 항목 숨기기 앱 사용에 문제가 있는 경우, 일반적인 질문에 대한 다음 답변을 확인하세요! 자주 묻는 질문 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 64026f53c95..3b6a08264a8 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -726,7 +726,6 @@ Pasirinktos transliacijos išoriniai grotuvai nepalaiko Išoriniams grotuvams garso transliacijos nepasiekiamos Pasirinkite kokybę skirtą išoriniams grotuvams - Slėpti peržiūrėtus elementus Pranešimai yra išjungti „ExoPlayer“ numatytasis Nežinoma kokybė diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 42d4d258c29..2f3a52338b9 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -703,7 +703,6 @@ Strømmer som ennå ikke er støttet av nedlasteren, vises ikke Velg kvalitet for eksterne spillere Vis fremtidige elementer - Skjul viste elementer Ingen videostrømmer er tilgjengelige for eksterne spillere Ukjent format Ukjent kvalitet diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index aff8dda8472..fb7afe44681 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -714,7 +714,6 @@ Onbekend formaat Intervalgrootte tijdens afspelen Toon toekomstige objecten - Verberg bekeken objecten Verberg toekomstige objecten Veelgestelde vragen Als u problemen ondervindt bij het gebruik van de app, bekijk dan deze antwoorden op veelgestelde vragen! diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 7fd1f276225..f8452693f5d 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -697,7 +697,6 @@ ଏକ ସଦସ୍ୟତା ପୂର୍ବରୁ ଶେଷ ଅଦ୍ୟତନ ପରେ ସମୟ ପୁରୁଣା ବୋଲି ବିବେଚନା କରାଯାଏ -%s ଫିଡ୍ ଲୋଡ୍ କରିବାରେ ତ୍ରୁଟି ଫାଷ୍ଟ ଫିଡ୍ ମୋଡ୍ ଏହା ଉପରେ ଅଧିକ ସୂଚନା ପ୍ରଦାନ କରେ ନାହିଁ । - ଦେଖାଯାଇଥିବା ଆଇଟମଗୁଡିକ ଲୁଚାନ୍ତୁ ଏହି ବିଷୟବସ୍ତୁ ଏପର୍ଯ୍ୟନ୍ତ NewPipe ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ । \n \nଭବିଷ୍ୟତ ସଂସ୍କରଣରେ ଏହା ସମର୍ଥିତ ହେବ ବୋଲି ଆଶା କରୁଛି । diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 3759b42a09d..8a08a72b770 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -663,7 +663,6 @@ ਤਰੁੱਟੀ ਤੇ ਸਨੈਕਬਾਰ ਵਿਖਾਓ ਕੁਝ ਸੇਵਾਵਾਂ ਵਿੱਚ ਹੀ ਉਪਲੱਬਧ ਇਹ ਤਰੀਕਾ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫੀਡ ਵਿੱਚ ਤੇਜ ਜਾਣਕਾਰੀ ਮੁਹੱਈਆ ਕਰਵਾਉਂਦਾ ਹੈ, ਪਰ ਕੁਝ ਗਿਣਤੀ ਦੀਆਂ ਹੀ ਆਈਟਮ ਪ੍ਰਦਾਨ ਕਰ ਸਕਦਾ ਹੈ ਉਹ ਵੀ ਅਕਸਰ ਬਿਨਾਂ ਪੂਰੀ ਜਾਣਕਾਰੀ( ਜਿਵੇਂ ਅਵਧੀ, ਸਟਰੀਮ ਦੀ ਕਿਸਮ, ਕੋਈ ਸਟਰੀਮ ਲਾਈਵ ਹੈ, ਨਹੀਂ ਦੱਸਦਾ) ਇਹ ਸਾਊਂਡਕਲਾਊਡ ਗੋ-ਪਲੱਸ ਟਰੈਕ ਹੈ, ਤੁਹਾਡੇ ਦੇਸ਼ ਵਿੱਚ ਇਹ ਸਟ੍ਰੀਮ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। - ਵੇਖ ਚੁੱਕੀਆਂ ਆਈਟਮਾਂ ਲੁਕਾਓ ਅਗਿਆਤ ਫਾਰਮੈਟ ਅਗਿਆਤ ਕੁਆਲਿਟੀ ਭਵਿੱਖ-ਪ੍ਰਕਾਸ਼ਤ ਆਈਟਮ ਵਿਖਾਓ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index e46190d446f..78615242964 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -735,7 +735,6 @@ Nieznany format Nieznana jakość Pokaż przyszłe pozycje - Ukryj obejrzane pozycje Ukryj przyszłe pozycje Często zadawane pytania Jeśli masz problemy podczas korzystania z aplikacji, koniecznie sprawdź odpowiedzi na najczęściej pojawiające się pytania! diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index e16fae2b720..056dcbb5b0e 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -728,7 +728,6 @@ Tamanho do intervalo de carregamento da reprodução Mostrar itens futuros Ocultar itens futuros - Ocultar itens assistidos Visualizar no site Se você está com problemas ao usar o aplicativo, confira estas respostas para perguntas comuns! Perguntas frequentes diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 6d85f60fbfa..70d7f7ea257 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -727,7 +727,6 @@ Selecione a qualidade para reprodutores externos Tamanho do intervalo de carregamento da reprodução Mostrar artigos futuros - Ocultar itens reproduzidos Ocultar artigos futuros Perguntas frequentes Se tem problemas a usar a app, veja estas respostas para perguntas frequentes! diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index b04740759fc..70d7eb449de 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -727,7 +727,6 @@ A transmissão selecionada não é suportada por reprodutores externos Mostrar artigos futuros Tamanho do intervalo de carregamento da reprodução - Ocultar itens reproduzidos Ocultar artigos futuros Perguntas frequentes Ver no site diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index d0239a0624a..62798bca769 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -727,7 +727,6 @@ Calitate necunoscută Dimensiunea intervalului de încărcare de redare Afișați elementele din viitor - Ascunde elementele vizionate Ascunde elementele din viitor Vedeți pe website Dacă întâmpinați probleme cu utilizarea aplicației, nu uitați să consultați aceste răspunsuri la întrebări frecvente! diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 43b5c772f5d..b90770e8dfd 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -731,7 +731,6 @@ Неизвестное качество Размер предварительной загрузки Показывать будущие элементы - Скрыть проигранные Скрывать будущие видео Ответы на частые вопросы Если у вас возникли проблемы с использованием приложения, обязательно ознакомьтесь с ответами на распространённые вопросы! diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 544e325208d..583ca65f831 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -714,7 +714,6 @@ Su flussu seletzionadu no est galu suportadu dae letores esternos Mannària de s\'intervallu de carrigamentu de sa riprodutzione Ammustra sos elementos imbenientes - Cua sos elementos pompiados Cua sos elementos imbenientes Preguntas fitianas Si ses tenende problemas impreende s\'aplicatzione assegura·ti de consultare custas rispostas a preguntas fitianas! diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index a21b2dfac35..6e08a20306f 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -727,7 +727,6 @@ Žiadne video streamy nie sú k dispozícií pre externé prehrávače Neznáma kvalita Zobraziť budúce položky - Skryť videné položky Skryť nasledujúce položky Často kladené otázky Pozrieť na webovej stránke diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index ceb87244951..86fa133354a 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -716,7 +716,6 @@ Visa framtida objekt Den valda videoströmmen stöds inte av externa spelare Göm framtida objekt - Göm sedda objekt Om du har problem med att använda appen, kolla in dessa svar på vanligt ställda frågor! Vanligt ställda frågor Visa på webbplats diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index d2cf9b9c241..8bdd03aaadd 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -714,7 +714,6 @@ Oynatma yükleme aralığı boyutu Gelecekteki ögeleri göster Gelecekteki ögeleri gizle - İzlenen ögeleri gizle Sık Sorulan Sorular Web sitesinde görüntüle Uygulamayı kullanırken sorun yaşıyorsanız, sık sorulan sorulara verilen bu yanıtlara göz atmayı unutmayın! diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 913892dc26a..b6a58b6d42c 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -731,7 +731,6 @@ Невідома якість Розмір інтервалу завантаження відтворення Показати наступні елементи - Сховати переглянуті елементи Сховати майбутні елементи Переглянути на сайті Поширені запитання diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index e1e15038b66..bb31e716e21 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -706,7 +706,6 @@ Câu hỏi thường gặp Xem trên website Nếu bạn gặp vấn đề khi sử dụng ứng dụng , hãy chắc chắn rằng bạn đã tìm kiếm các câu hỏi thường thấy ! - Ẩn các video đã xem Nhập hoặc xuất các kênh bạn đăng ký bằng cách nhấn nút 3 chấm ở góc trên màn hình Không thể sao chép vào khay nhớ tạm Đã thêm khoảng thời gian %d trùng lặp (s) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 82ee4b2ff9e..69204d387ba 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -701,7 +701,6 @@ 未知画质 播放加载间隔大小 显示未来项目 - 隐藏看过的项目 隐藏未来项目 常见问题 如果你在使用本应用时遇到问题,请务必查看这些常见问题的答案! diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 100f719385a..db31b24fe9a 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -702,7 +702,6 @@ \nYouTube 就係其中一個有用 RSS 摘要提供呢個快趣門路嘅服務。 \n \n所以就睇你點揀:想快定要準。 - 收埋睇過嘅項目 未夠鐘上畫嘅項目就收埋 去網站睇下 排序 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 0623eef8542..bd843045c79 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -702,7 +702,6 @@ 播放載入間隔大小 顯示未來項目 隱藏未來項目 - 隱藏已觀看的項目 常見問題 在網站上檢視 排序 From f1524b6abafd15ac019b01cf83835fc6536b4eb7 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 6 May 2023 01:45:03 +0200 Subject: [PATCH 177/645] Remove translations of previously deleted string feed_toggle_show_played_items --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-ckb/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-ka/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-ml/strings.xml | 1 - app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-so/strings.xml | 1 - app/src/main/res/values-sq/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - 53 files changed, 53 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 9ebda78fa40..c8b711f7de9 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -675,7 +675,6 @@ إيقاف تشغيل وضع الجهاز اللوحي - إظهار العناصر التي تمت مشاهدتها تم تعطيل التعليقات لا تظهر جودة منخفضة (أصغر) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index eaacd3fc322..3a932032606 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -489,7 +489,6 @@ Müəllifin hesabı bağlanıb. \nNewPipe gələcəkdə bu axını yükləyə bilməyəcək. \nBu kanaldan abunəliyi çıxarmaq istəyirsiniz\? - Baxılan elementləri göstər Seçilmiş Çəkməcəni Bağla Video oynadıcı diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index ef07948be11..e50e0006f1d 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -503,7 +503,6 @@ Падпіскі не выбраны Апошняе абнаўленне: %s - Паказаць прагледжаныя матэрыялы Аўтаматычна (тэма прылады) Выберыце ўлюбёную начную тэму - %s Дазвол вылучэння тэксту ў апісанні diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index d1cb10fd74b..fa700784ce2 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -550,7 +550,6 @@ Показвай цветни Picasso-панделки в горната част на изображенията като индикатор за техния произход (червен – от мрежата, син – от диска и червен – от паметта) Автоматична (тази на устройството) Мащабиране на миниатюрата в известието от 16:9 към 1:1 формат (възможни са изкривявания) - Покажи гледани Избете плейлист Известия Изчистване на бисквитките от reCAPTCHA diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 57d6ac5ced0..ff6ace24f01 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -570,7 +570,6 @@ মনে রাখবে এই ক্রিয়ার নেটওয়ার্ক খরচ বেশি হতে পারে। \n \nচালিয়ে যাবে\? - দেখা ভুক্তি দেখাও ট্যাবলেট অবস্থা বন্ধ চালু diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index a690fe13265..22d973f6bf9 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -624,7 +624,6 @@ Automàtic (tema del dispositiu) %s dóna aquesta raó: Usuari suspes - Mostra contingut visualitzat El compte de l\'autor ha estat esborrat. \nNewPipe no serà capaç de carregar aquest fil en el futur. \nUs voleu desubscriure d\'aquest canal\? diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 239740e5930..52808f5d8b9 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -618,7 +618,6 @@ دواین وێنۆچكه‌كه‌ بۆ پاشبنه‌مای ڕوونماداخراو و پەیامەکان به‌كاردەهێنرێن پیشاندانی وێنۆچكه‌ - تەماشاکراوەکان پیشان بدرێن بۆ دابه‌زاندنی هه‌ر بابه‌تێك پرست پێ ده‌كرێت له‌باره‌ی شوێنی دابه‌زاندنیان ناكاراكردنی تونێلكردنی میدیا ئه‌و بابه‌تانه‌ی نه‌گونجاون بۆ منداڵان پیشان بدرێن كه‌ سنووری ته‌مه‌ن ده‌یانگرێته‌وه‌ (وه‌ك +18) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index c979b9843e2..22aa66f6988 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -645,7 +645,6 @@ Vypnuto Zapnuto Režim tabletu - Zobrazit zhlédnuté položky Nezobrazovat Nízká kvalita (menší) Vysoká kvalita (větší) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index e02101a57c0..c8f171ae256 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -550,7 +550,6 @@ Tid siden sidste opdatering for at et abonnoment bliver forældet - %s Altid opdater Vælg abonnementer - Vis sete elementer Dette indhold er ikke tilgængeligt i dit land. Af %s Videoer, der er blevet set før og efter, at de er blevet tilføjet til spillelisten, vil blive fjernet. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 8849a516a9e..37ef317b4a6 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -642,7 +642,6 @@ An Tablet-Modus Aus - Angesehene Elemente anzeigen Als gesehen markieren Vom Ersteller mit Herz versehen Farbige Picasso-Bänder über den Bildern anzeigen, die deren Quelle angeben: rot für Netzwerk, blau für Festplatte und grün für Speicher diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 15f469166e5..2b4c949113a 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -635,7 +635,6 @@ Ανενεργό Ενεργό Κατάσταση tablet - Εμφάνιση αναπαραχθέντων Τα σχόλια είναι απενεργοποιημένα Απόκρυψη Χαμηλή ποιότητα (μικρότερο) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 27f0194d506..9a984c4f384 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -648,7 +648,6 @@ Apagado Encendido Modo tableta - Mostrar elementos ya vistos No mostrar Baja calidad (más pequeño) Alta calidad (más grande) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index ddf72dfa4ed..531d8cf75a4 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -613,7 +613,6 @@ Saadaval mõnedes teenustes. See on tavaliselt palju kiirem, kuid võib tagastada piiratud koguse elemente ja sageli osalise informatsiooni (nt. puudub kestus, elemendi tüüp, laiv olek) Sa saad nüüd valida kirjelduse tekstist. Pane tähele, et valikurežiimis võib leht vilkuda ja lingid ei pruugi olla klõpsatavd. Autor: %s - Kuva vaadatud üksused Keela kiire režiim Luba kiire režiim Hangi võimalusel spetsiaalsest voost diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index e3f2e44e5f8..6b19f2bf1b5 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -628,7 +628,6 @@ Pribatutasuna %s arrazoi hau ematen du: Kontua ezabatu da - Bistako elementuak erakustea Jario azkarrak ez du honi buruz informazio gehiagorik ematen. Adin muga Miniaturaren URL-a diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index b797e2e55b6..31c81c34dac 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -559,7 +559,6 @@ کیفیت پایین (کوچک‌تر) کیفیت بالا (بزرگ‌تر) نظرها از کار افتاده‌اند - نمایش موارد دیده‌شده خطا در بار کردن خوراک از کار انداختن تونل‌زنی رسانه نمایش جزییات کانال diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index fcd0cb609e8..644e535c4e4 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -629,7 +629,6 @@ Kategoria Salli tekstin valinta kuvauksessa Tili suljettu - Näytä katsotut kohteet Tekijän käyttäjätili on suljettu. \nNewPipe ei pysty lataamaan tätä syötettä tulevaisuudessa. \nHaluatko poistaa kanavan tilauksesta\? diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 1477c679300..705d6c2f7f4 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -642,7 +642,6 @@ Inactif Actif Mode tablette - Afficher les éléments visionnés Le compte de l’auteur a été résilié. \nNewPipe ne sera plus en mesure de charger ce flux à l’avenir. \nSouhaitez-vous vous désabonner de cette chaîne \? diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 635ba3b6f08..d404c5a7873 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -606,7 +606,6 @@ Este contido é privado, polo que non pode ser transmitido nin descarregado polo NewPipe. Non posúe ningunha aplicación para abrir isto Usar miniaturas para a pantalla de bloqueo e para as notificacións - Mostrar elementos vistos Os comentarios están desactivados Mostrar contido potencialmente non apto para menores porque ten unha limitación de idade (como +18) Definir cor da notificación diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 367c50559f7..3a1699ea665 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -655,7 +655,6 @@ כבוי פעיל מצב מחשב לוח - הצגת פריטים שנצפו תגובות מושבתות לא להציג איכות נמוכה (קטן יותר) diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 808046eb181..13087779339 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -622,7 +622,6 @@ ऐप को क्रैश करें श्रेणी आपसे पूछा जाएगा कि प्रत्येक डाउनलोड को कहां सहेजना है - देखे गए आइटम दिखाएं थंमनेल यूआरएल ऑफ़ हमेशा अपडेट करें diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 720e322e2ec..fcf6c68f8c4 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -633,7 +633,6 @@ Onemogući biranje teksta u opisu Omogući biranje teksta u opisu Račun ukinut - Prikaži pogledane stavke Autorov račun je ukinut. \nNewPipe ubuduće neće moći učitavati ovaj feed. \nŽeliš li otkazati pretplatu na ovaj kanal\? diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 26bddfafa0f..66d54bb2b09 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -629,7 +629,6 @@ Tekerősáv bélyegkép-előnézete Magas minőségű (nagyobb) Hiba a lista betöltésekor - Megnézett elemek megjelenítése Nyelv Támogatás Weboldal megnyitása diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index ca2f9aceec2..75ff85f650a 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -625,7 +625,6 @@ Nonaktif Aktif Mode tablet - Tampilkan item yang sudah ditonton Jangan tampilkan Kualitas rendah (lebih kecil) Kualitas tinggi (lebih besar) diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 63540b9c650..a5c8ad0684b 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -580,7 +580,6 @@ Hraðstraumshamurinn veitir ekki frekari upplýsingar um þetta. Virkja hraðstraumsham Afvirkja hraðstraumsham - Sýna spiluð atriði NewPipe styður ekki þetta efni. \n \nÞað verður vonandi stutt í framtíðarútgáfu. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 95920f278da..eb50e2c3908 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -645,7 +645,6 @@ Disattivata Attiva Modalità tablet - Mostra elementi visti Non mostrare Qualità bassa (più piccola) Qualità alta (più grande) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3614cb6e7a6..4244ff4895f 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -625,7 +625,6 @@ オン タブレットモード %s がこの理由を提示: - 視聴したアイテムを表示 表示しない 低品質 (小) 高品質 (大) diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index d709e0cefc2..d7ff105d59d 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -540,7 +540,6 @@ მიიღეთ გამოყოფილი არხიდან, როცა ხელმისაწვდომია ჩართეთ სწრაფი რეჟიმი სწრაფი რეჟიმის გამორთვა - ნანახი ნივთების ჩვენება ეს შინაარსი ჯერ არ არის მხარდაჭერილი NewPipe-ის მიერ. \n \n იმედია, ის იქნება მხარდაჭერილი მომავალ ვერსიაში. diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 8133b2a8626..2c783393909 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -595,7 +595,6 @@ 해결 잠금 화면 배경과 알림 모두에 썸네일 사용 선택한 구독이 없습니다 - 시청 항목 표시 자동 대기열에 추가 %s 다운로드 완료 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 3b6a08264a8..6906840ba11 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -637,7 +637,6 @@ Dabar apraše galite pasirinkti tekstą aprašyme. Atminkite, kad puslapis gali mirgėti, o nuorodos gali būti nespustelėjamos, kai veikia pasirinkimo režimas. %s pateikia šią priežastį: Paskyra anuliuota - Rodyti peržiūrėtus elementus Greito srauto režimas nesuteikia daugiau informacijos apie tai. Autoriaus paskyra anuliuota. \n„NewPipe“ negalės įkelti šio kanalo ateityje. diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index d54d043dbeb..e92f0634449 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -636,7 +636,6 @@ Ieslēgt teksta atlasīšanu video aprakstā Lejupielādes mape vēl nav iestatīta, izvēlieties noklusējuma lejupielādes mapi Pārvelciet objektus, lai tos noņemtu - Rādīt noskatītos video Lokālie meklēšanas ieteikumi Rādīt attēlu indikatorus Augstas kvalitātes (lielāks) diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 286e68bc3da..729a90e4b7f 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -627,7 +627,6 @@ താക്കൾക് ഇപ്പോൾ ഡിസ്ക്രിപ്ഷൻ ബോക്സിലെ ടെക്സ്റ്റ്‌ തിരഞ്ഞെടുക്കാൻ സാധിക്കും. ശ്രെദ്ധിക്കുക സെലെക്ഷൻ മോഡിൽ പേജ് ചിലപ്പോൾ മിന്നുകയും ലിങ്കുകൾ ക്ലിക്ക് ചെയ്യാനാകാതെയും വന്നേക്കാം. ഇതിന്റെ കാരണം %s നൽകും: അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു - കണ്ട ഐറ്റംസ് കാണിക്കുക ഫാസ്റ്റ് ഫീഡ് മോഡ് കൂടുതൽ വിവരങ്ങൾ നൽകില്ല. സൃഷ്ടാവിന്റെ അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു. \nഭാവിയിൽ ഫീഡ് ലോഡ് ചെയ്യാൻ ന്യൂ പൈപ്പിന് സാധിക്കില്ല. diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 2f3a52338b9..f67604d1513 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -613,7 +613,6 @@ Skru på merking av tekst i beskrivelsen %s oppgav denne grunnen: Konto terminert - Vis avspilte elementer Kunne ikke laste inn informasjonskanal for «%s». Kunne ikke laste inn informasjonskanal Fra Android 10 er kun «lagringstilgangsrammeverk» støttet diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index fb7afe44681..175ce506f69 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -626,7 +626,6 @@ Open website %s geeft de volgende reden: Account getermineerd - Toon bekeken items De snelle feed mode levert hierover niet meer informatie. De account van de auteur is getermineerd. \nNewPipe zal niet in staat zijn deze feed in de toekomst te laden. diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index f8452693f5d..ad1b6c3da28 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -589,7 +589,6 @@ ଲେଖକଙ୍କ ଆକାଉଣ୍ଟକୁ ବନ୍ଦ କରିଦିଆଯାଇଛି । \nଭବିଷ୍ୟତରେ NewPipe ଏହି ଫିଡ୍ ଲୋଡ୍ କରିବାକୁ ସମର୍ଥ ହେବ ନାହିଁ । \nଆପଣ ଏହି ଚ୍ୟାନେଲରୁ ସଦସ୍ୟତା ରଦ୍ଦ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? - ଦେଖାଯାଇଥିବା ଆଇଟମଗୁଡିକ ଦେଖାନ୍ତୁ ଅନ୍ତଃସ୍ଥ ଆପଣ ବର୍ତ୍ତମାନ ଏହି ଚ୍ୟାନେଲକୁ ସବସ୍କ୍ରାଇବ କରିଛନ୍ତି ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଵିଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 8a08a72b770..43d8f835e53 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -647,7 +647,6 @@ ਖੋਜ ਦੇ ਸਥਾਨਕ ਸੁਝਾਅ ਖੋਜ ਦੇ ਰਿਮੋਟ ਸੁਝਾਅ ਮੁੱਖ ਪਲੇਅਰ ਪੂਰੀ ਸਕਰੀਨ ਵਿੱਚ ਸ਼ੁਰੂ ਕਰੋ - ਵੇਖ ਚੁੱਕੀਆਂ ਆਈਟਮਾਂ ਵਿਖਾਓ ਪਲੇਅਬੈਕ ਲੋਡ ਦਾ ਅੰਤਰਾਲ ਆਕਾਰ %s ਨਵੀਂ ਸਟਰੀਮ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 78615242964..b7cfc422424 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -647,7 +647,6 @@ Nie ustawiono jeszcze folderu zapisywania, wybierz domyślny teraz Błąd podczas ładowania kanału Niepubliczny - Pokaż obejrzane pozycje Wyłączony Włączony Tryb tabletu diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 056dcbb5b0e..1a1aea03ca8 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -645,7 +645,6 @@ Desligado Ligado Modo tablet - Mostrar itens vistos Não mostrar Baixa qualidade (menor) Alta qualidade (maior) diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 70d7f7ea257..6f42cfe740d 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -637,7 +637,6 @@ Agora pode selecionar o texto na descrição. Note que a página pode cintilar e as ligações podem não ser clicáveis enquanto estiver no modo de seleção. %s fornece este motivo: Conta encerrada - Mostrar itens vistos O modo de feed rápido não fornece mais informações sobre isto. A conta do autor foi encerrada. \nNewPipe não será capaz de carregar este feed no futuro. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 70d7eb449de..1d1110b4cc9 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -618,7 +618,6 @@ Ainda não foi definida uma pasta de descarregamento, escolha agora a pasta de descarregamento padrão %s fornece este motivo: Conta encerrada - Mostrar itens vistos O modo de feed rápido não fornece mais informações sobre isto. A conta do autor foi encerrada. \nNewPipe não será capaz de carregar este feed no futuro. diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 62798bca769..80c70fa7382 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -638,7 +638,6 @@ Acum puteți selecta text în interiorul descrierii. Rețineți că este posibil ca pagina să pâlpâie, iar link-urile să nu poată fi accesate în modul de selecție. %s oferă acest motiv: Contul a fost închis - Afișați elementele vizionate Modul rapid nu furnizează mai multe informații în acest sens. Contul autorului a fost închis. \nNewPipe nu va mai putea încărca acest flux în viitor. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b90770e8dfd..9d11705f35b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -653,7 +653,6 @@ Отключить Включить Режим планшета - Показать проигранные Комментарии отключены Не показывать Низкое качество (меньше) diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 583ca65f831..f59d7987945 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -635,7 +635,6 @@ Istudadu Allutu Modalidade tauledda - Ammustra sos elementos pompiados No ammustres Calidade bassa (prus minore) Calidade arta (prus manna) diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 6e08a20306f..455edc4f255 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -647,7 +647,6 @@ Zapnuté Režim tabletu Obľúbené autorom - Zobrazovať pozreté položky %1$s sťahovanie zmazané %1$s sťahovania zmazané diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index 6a299d48186..c04b1d7fea5 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -622,7 +622,6 @@ Hadda waad dooran kartaa qoraalka ku dhexjira faahfaahinta. Ogow markaad caalamdinayso qoraalka boggu wuu boodboodi karaa tixraacyadana waxay noqon karaan kuwo aan lagu dhufan karin. %s wuxuu sheegayaa sababtan: Akoonka waa lajoojiyay - Tus kuwa ladaawaday Nidaamka dagdaga ah faahfaahin dheeraad ah uma hayo shaygan. Akoonka soosaaraha waa la joojiyay. \nNewPipe ma awoodi doono inuu soo kiciyo bandhiggan mustaqbalka. diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 5fbe1c01288..14fa56a23e4 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -615,7 +615,6 @@ Kjo përmbajtje është private, kështu që nuk mund të luhet apo shkarkohet nga NewPipe. Kjo përmbajtje nuk është e disponueshme në shtetin tuaj. Përdor pamje statike për sfondin e ekranit të kyçur si dhe për njoftimet - Shfaq objektet e para Modaliteti i feed-it të shpejtë nuk mundëson më tepër informacion mbi këtë. Llogaria e autorit është bllokuar. \nNewPipe nuk do mund ta ngarkojë këtë feed në të ardhmen. diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 142f179c913..80528adc1c9 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -644,7 +644,6 @@ искљ укљ Режим таблета - Прикажи пуштано Закажи следеће Заказано је следеће Местни предлози претраге diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 86fa133354a..524716d1287 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -627,7 +627,6 @@ Öppna med Visa miniatyrer Kanalens visningsminiatyr - Visa sedda objekt Det snabba flödesläget ger inte mer information om detta. Fel vid inläsning av flödet Markera som sedd diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 8bdd03aaadd..fd6679e3bbd 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -634,7 +634,6 @@ Kapat Tablet kipi - İzlenen ögeleri göster Konum çubuğu küçük resim ön izlemesi Gösterme Düşük nitelik (küçük) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index b6a58b6d42c..376685cfed7 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -646,7 +646,6 @@ Увімкнути Режим планшета Обліковий запис припинено - Показувати переглянуті обʼєкти Режим швидкої підписки не надає багато інформації щодо цього. Коментарі вимкнено Не показувати diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index bb31e716e21..e03ceb610d3 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -616,7 +616,6 @@ Bây giờ bạn có thể chọn văn bản trong mô tả. Lưu ý rằng trang có thể nhấp nháy và các liên kết có thể không nhấn vào được trong khi ở chế độ chọn. %s cung cấp lý do này: Tài khoản đã bị chấm dứt - Hiện các mục đã xem Chế độ nguồn dữ liệu nhanh không cung cấp thêm thông tin về cái này. Tài khoản của người này đã bị chấm dứt. \nNewPipe sẽ không thể tải nguồn dữ liệu này trong tương lai. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 69204d387ba..e11d0fa2827 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -623,7 +623,6 @@ 你会被问到在哪里保存每个下载 尚未设置下载文件夹,现在选择默认下载文件夹 平板模式 - 显示已观看的项目 关闭 开启 评论功能已停用 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index db31b24fe9a..2063426a804 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -497,7 +497,6 @@ NewPipe 仲未支援到呢樣。 \n \n希望未來會喺日後嘅版本支援啦。 - 顯示睇過嘅項目 %s 話理由如下: 搵唔到合適嘅檔案總管進行呢個動作。 \n請安裝一個檔案管理程式,又或者試下喺下載設定度停用「%s」 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index bd843045c79..df0af45cc7e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -625,7 +625,6 @@ 關閉 開啟 平板電腦模式 - 顯示已檢視的項目 留言已停用 不要顯示 低品質(較小) From e109e8cf1c6040b7d9231cd3232c8d2c32d576dc Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 6 May 2023 01:52:31 +0200 Subject: [PATCH 178/645] Remove translations of previously deleted string volume_gesture_control_title --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-b+ast/strings.xml | 1 - app/src/main/res/values-b+uz+Latn/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-bn-rBD/strings.xml | 1 - app/src/main/res/values-bn-rIN/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 1 - app/src/main/res/values-bs/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-ckb/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-eo/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fil/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-ka/strings.xml | 1 - app/src/main/res/values-kmr/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-ku/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-mk/strings.xml | 1 - app/src/main/res/values-ml/strings.xml | 1 - app/src/main/res/values-ms/strings.xml | 1 - app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-ne/strings.xml | 1 - app/src/main/res/values-nl-rBE/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-pa-rPK/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sl/strings.xml | 1 - app/src/main/res/values-so/strings.xml | 1 - app/src/main/res/values-sq/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-ta/strings.xml | 1 - app/src/main/res/values-te/strings.xml | 1 - app/src/main/res/values-th/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-ur/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - 72 files changed, 72 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index c8b711f7de9..d3c5ea484f8 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -352,7 +352,6 @@ التحديثات تم حذف الملف تنبيه تحديث التطبيق - إيماء التحكم بالصوت الأحداث إشعارات لإصدار NewPipe الجديد وحدة التخزين الخارجية غير متوفرة diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 3a932032606..ef99d8ff4d3 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -64,7 +64,6 @@ Oynadıcı parlaqlığını nizamlamaq üçün jestlər istifadə et Parlaqlıq jesti idarəetməsi Oynadıcı səsini nizamlamaq üçün jestlər istifadə et - Səs səviyyəsi jesti idarəetməsi Avto-növbələ Növbəti Yayımı Avto-növbələ Üst məlumat keşi silindi diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index 15beb49bb08..b800f75597c 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -226,7 +226,6 @@ Cargando\'l conteníu solicitáu Política de privacidá de NewPipe - Control per xestos del volume Control per xestos del brillu El ficheru nun pue crease El sirvidor nun unvia datos diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index a4101a9be38..e13d4aa88d0 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -20,7 +20,6 @@ Player tovushini boshqarish uchun imo-ishoralardan foydalanish Player yorqinligini boshqarish uchun imo-ishoralardan foydalaning Yorqinlik ishoralarini boshqarish - Ovoz balandligini ishoralarni boshqarish Avto-navbat Tegishli stream qo\'shib, ijro etish navbatini tugatishni (takrorlanmaydigan) davom ettirish avtomatik navbat next stream diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index e50e0006f1d..22ba158c947 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -338,7 +338,6 @@ Плэер у акне Адпісацца Абярыце ўкладку - Жэст гучнасці Мяняць гучнасць плэера жэстамі Жэст яркасці Мяняць яркасць плэера жэстамі diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index fa700784ce2..5bc994d5b0d 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -335,7 +335,6 @@ Насили докладването на неизпращаеми Rx изключения извън фрагмента или кръговрата на активност след приключване Откачи (може да предизвика промени) Отписване - Контрол на звука с жестове Използвай жестове за контрол на звука Контрол на яркостта с жестове Използвай жестове за контрол на яркостта diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index f37711eb0ae..ac580a81be7 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -150,7 +150,6 @@ প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো উজ্জ্বলতার নিয়ন্ত্রণ সংকেত প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - ভলিউম সংকেত নিয়ন্ত্রণ সম্পন্ন তালিকা তালিকা আকারে সাজাও diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 53d99fb5fdb..9d122daff9c 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -77,7 +77,6 @@ প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো উজ্জ্বলতার নিয়ন্ত্রণ সংকেত প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - ভলিউম সংকেত নিয়ন্ত্রণ পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index ff6ace24f01..77ec918a085 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -223,7 +223,6 @@ প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো উজ্জ্বলতার নিয়ন্ত্রণ সংকেত প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - ভলিউম সংকেত নিয়ন্ত্রণ পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 8654715a61c..0700e81b294 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -88,7 +88,6 @@ Nijedan medijski prijenosnik nije nađen na vašem uređaju (možete VLC instalisati da bi ste ga pokrenili). Uklonite sve keširane podatke web stranica Automatski sljedeći prijenos u red stavite - Pokretna kontrola zvučne glasnine Nastavite završni (ne-ponavljajući) reprodukcijski red privlakom srodnog prijenosa Automatsko redanje Koristite pokrete za kontrolu jačine zvuka pokretača diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 22d973f6bf9..dc2b9d23a40 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -333,7 +333,6 @@ Pistes Usuaris Trieu una pestanya - Control de volum per gestos Fes servir gestos per controlar el volum del reproductor Control de brillantor per gestos Fes servir gestos per controlar la brillantor del reproductor diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 52808f5d8b9..791e1668efc 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -172,7 +172,6 @@ دەقە بنچینەییەکان لە خزمەتگوزارییەکانەوە لە بابەتی پەخشەکاندا دیار دەبن دابه‌زاندن ژێرنووسەکان - کۆنترۆڵی دەنگ بەجوڵەی پەنجە خستنه‌ نۆبه‌تی-خۆكاری په‌خشی دواتر لێده‌ره‌ دەرەکییەکان پشتگیری ئەم جۆرە بەستەرانە ناکەن کردار ڕەتکرایەوە لەلایەن سیستەمەوە diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 22aa66f6988..03269e80bc7 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -337,7 +337,6 @@ Minimalizovat přehrávač do vyskakovacího okna Přestat odebírat Zvolit panel - Ovládání hlasitosti gesty Používat gesta pro ovládání hlasitosti přehrávače Ovládání jasu gesty Používat gesta pro ovládání jasu přehrávače diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index c8f171ae256..2ed16cf9b92 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -65,7 +65,6 @@ Metadata-cache slettet Føj automatisk næste stream til køen Fortsæt en afspilningskø, der afsluttes (ikke-gentagende), ved at tilføje en lignende stream - Juster lydstyrke ved hjælp af fingerbevægelser Brug fingerbevægelser til at kontrollere afspillerens lydstyrke Styr lysstyrken med fingerbevægelser Brug fingerbevægelser til at justere afspillerens lysstyrke diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 37ef317b4a6..56d234a29c9 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -336,7 +336,6 @@ Benutzer Deabonnieren Tab wählen - Gestensteuerung für Lautstärke Gesten verwenden, um die Lautstärke einzustellen Gestensteuerung für Helligkeit Gesten verwenden, um die Helligkeit einzustellen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 2b4c949113a..8a68d8f7689 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -334,7 +334,6 @@ Ελαχιστοποίηση σε αναδυόμενο παράθυρο Απεγγραφή Επιλογή Καρτέλας - Έλεγχος ήχου με χειρονομιές Χρησιμοποιήστε χειρονομίες για τον έλεγχο της έντασης του ήχου Έλεγχος φωτεινότητας με χειρονομίες Χρησιμοποιήστε χειρονομίες για τον έλεγχο φωτεινότητας diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index b52cfe99f61..5fd9b96a9ae 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -202,7 +202,6 @@ Uzantoj Malaboni Elektu ongleton - Kontrolo de volumena gesto Uzi gestojn por kontroli la volumon Kontrolo de gesto de brilo Uzi gestojn por kontroli la brilon diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 9a984c4f384..c90f1fa0ea7 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -390,7 +390,6 @@ El \'Sistema de Acceso al Almacenamiento\' permite descargar en una tarjeta SD externa Desuscribirse Elija la pestaña - Control de volumen por gestos Usar gestos para controlar el volumen del reproductor Control de brillo por gestos Usar gestos para controlar el brillo del reproductor diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 531d8cf75a4..87adacc0176 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -334,7 +334,6 @@ Jõusta väljaspool fragmenti või elutsüklit olevate kättetoimetamatute Rx erindite raporteerimine nende vabastamise järgselt Lõpeta tellimine Vali vahekaart - Helitugevuse juhtimine viibetega Kasuta viipeid helitugevuse reguleerimiseks Ereduse reguleerimine viibetega Kasuta viipeid heleduse reguleerimiseks diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 6b19f2bf1b5..5ac22af9de3 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -334,7 +334,6 @@ Erabiltzaileak Kendu harpidetza Hautatu fitxa - Keinuen bidezko bolumenaren kontrola Erabili keinuak erreproduzigailuaren bolumena kontrolatzeko Keinuen bidezko distiraren kontrola Erabili keinuak erreproduzigailuaren distira kontrolatzeko diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 31c81c34dac..df37c954366 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -280,7 +280,6 @@ نمایش نکته «برای صف‌گذاری، نگه‌دارید» نمایش راهنما هنگام فشردن پس زمینه یا دکمهٔ تصویر در تصویر در «جزییات:» ویدیو برای در صف قرار دادن، نگه دارید - کنترل اشاره ای صدا از اشارات برای کنترل حجم صدا استفاده شود کنترل روشنایی اشاره ای از اشارات برای کنترل روشنایی استفاده شود diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 644e535c4e4..d41b583a1e0 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -394,7 +394,6 @@ Käytä eleitä ohjataksesi soittimen kirkkautta Kirkkauden eleohjaus Käytä eleitä ohjataksesi soittimen äänenvoimakkuutta - Äänenvoimakkuuden eleohjaus Poista käytöstä piilottaaksesi kommentit Toistokohdat poistettu Poistetaanko kaikki toistokohdat\? diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index 38719e96065..56aff898e7c 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -91,7 +91,6 @@ Kasaysayan ng mga hinanap Gumamit ng gesture para kontrolin ang liwanag ng player Kontrolin ang liwanag gamit gesture - Kontrolin ang volume gamit gesture Linisin ang naka-cache na metadata Nalinis na ang image cache Patayin para itago ang mga komento diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 705d6c2f7f4..6ab748f33a5 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -337,7 +337,6 @@ Réduire vers le lecteur flottant Se désabonner Sélectionner un onglet - Contrôle gestuel du volume Utiliser des gestes pour contrôler le volume du lecteur Contrôle gestuel de la luminosité Utiliser des gestes pour contrôler la luminosité du lecteur diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index d404c5a7873..bfae4054734 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -333,7 +333,6 @@ Minimizar o reprodutor popup Limitado Só son compatibles os URLs HTTPS - Control por xestos do volume Desactiva para agochalos comentarios Retomar a reprodución Páxina das listas de reprodución diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 3a1699ea665..096adadb4a3 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -327,7 +327,6 @@ הקטנה לנגן צף ביטול מינוי בחירת לשונית - מחוות בקרת עצמת שמע שימוש במחוות כדי לשלוט בעצמת השמע של הנגן מחוות בקרת בהירות שימוש במחוות כדי לשלוט בבהירות הנגן diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 13087779339..9c7e18fd739 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -325,7 +325,6 @@ न्यूपाइप एक काॅपीलेफ़्ट फ़्री साॅफ़्टवेर है: इसे आप अपनी इच्छा के अनुसार इस्तेमाल, जाँच, बाँट तथा और बेहतर बना सकते है। खास तौर पर आप इसे फ़्री साॅफ़्टवेर फ़ाउंडेशन के द्वारा जारी जीएनयू जनरल पब्लिक लाइसेंस के तीसरे या उसके बाद आने वाले कोई भी वर्णन के शर्तों के मुताबिक फिर से बाँट या बदल सकते हैं। अनसब्सक्राईब करें टैब चुने - ध्वनि नियंत्रण इशारा कतारबद्ध करें वीडियो प्लेयर की ध्वनि नियंत्रित करने के लिए इशारो का इस्तेमाल करे रोशनी स्तर नियंत्रण के इशारे diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index fcf6c68f8c4..6471f506c0a 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -317,7 +317,6 @@ Metapodaci su izbrisani Automatski dodaj sljedeći stream u popisa izvođenja Nastavi završavati (ne ponavljajući) popis reprodukcija dodavanjem povezanog streama - Kontrola glasnoće pomoću gesti Koristi geste za upravljanje glasnoćom playera Kontrola svjetline pomoću gesti Koristi gesture za upravljanje svjetlinom playera diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 66d54bb2b09..c5db2b72f47 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -335,7 +335,6 @@ Gesztusok használata a fényerő szabályozásához Fényerő gesztus Gesztusok használata a lejátszó hangerejének szabályzásához - Hangerő gesztus Meg fogja kérdezni, hogy hova mentse el az egyes letöltéseket. \nEngedélyezze a rendszermappa-választót (SAF), ha külső SD-kártyára akar letölteni Kérdezze meg, hova töltse le diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 75ff85f650a..c9c2a007009 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -328,7 +328,6 @@ Berhenti Berlanggan Pilih Tab Tema - Kontrol gestur volume Gunakan gestur untuk mengontrol volume pemutar Kontrol gestur kecerahan Gunakan gestur untuk mengontrol kecerahan pemutar diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index a5c8ad0684b..aef8aa82cb5 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -618,7 +618,6 @@ Slökktu á til að fela lýsigagnareiti með viðbótarupplýsingum um straumhöfund, straumefni eða leitarbeiðni Fjarlæga öll síðugögn úr skyndiminni Bæta svipuðum straumum við biðröðina þegar síðasta er spilað og endurspilun er ekki virkjuð - Hljóðstyrksbending Nota bendingar til að stjórna hljóðstyrk spilara Birtustigsbending Nota bendingar til að stjórna birtustig spilara diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index eb50e2c3908..4a1ea56048f 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -337,7 +337,6 @@ Utenti Disiscriviti Scegli scheda - Gesti controllo volume Utilizza i gesti per controllare il volume del lettore multimediale Gesti controllo luminosità Utilizza i gesti per controllare la luminosità del lettore multimediale diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 4244ff4895f..5821c8e71df 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -368,7 +368,6 @@ 停止 最大再試行回数 ダウンロードを中止するまでの最大再試行回数 - 音量のジェスチャー制御 ジェスチャーを使用して、プレイヤーの音量を制御します 明るさのジェスチャー制御 ジェスチャーを使用して、プレイヤーの明るさを制御します diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index d7ff105d59d..762fab2868e 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -116,7 +116,6 @@ მეტა ინფორმაციის ჩვენება სურათის ქეში წაშლილია წაშალეთ ქეშირებული მეტამონაცემები - ხმის ჟესტების კონტროლი სიკაშკაშის ჟესტების კონტროლი გამოიყენეთ ჟესტები მოთამაშის სიკაშკაშის გასაკონტროლებლად შეინახეთ საძიებო მოთხოვნები ადგილობრივად diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index c5c4ee46b21..0a415ce0fc7 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -231,7 +231,6 @@ Tevgerên bikar bînin ku ronahiya lîstikvan kontrol bikin Kontrola tevgera ronahiyê Tevgerên bikar bînin da ku hêjmara lîstikvan kontrol bikin - Kontrola tevgera deng Rêzeya-otomatîkî Bi pêvekirina kanalek pêwendîdar rêza lîstikê ya bidawîkirina (ne-dubare) bidomînin Çemê din ê dixwe-dorê bike diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 2c783393909..efdbd4eb361 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -318,7 +318,6 @@ 모바일 데이터 사용 시 화질 제한 구독 취소 탭 선택 - 제스처 음량 조작 제스처를 사용하여 플레이어의 볼륨 제어 제스처 밝기 조작 제스처를 사용하여 플레이어의 밝기 제어 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 8867256243b..3c48714727c 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -276,7 +276,6 @@ بەکاربەرەکان بەشدارنەبوون هەڵبژاردنی پەڕە - کۆنترۆڵی دەنگ بەجوڵەی پەنجە جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ کۆنترۆڵی ڕووناکی بەجوڵەی پەنجە جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 6906840ba11..aeb770ed898 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -344,7 +344,6 @@ Naudoti gestus ryškumo valdymui Ryškumo gesto valdymas Naudoti gestus garsumo valdymui - Garsumo gesto valdymas Auto eilė Tęsti atkūrimą į eilę pridedant susijusius srautus Automatiškai pridėti sekantį į eilę diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index e92f0634449..2f6baccb1ef 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -506,7 +506,6 @@ Velkot ar pirkstu, mainiet video atskaņošanas spilgtumu Spilgtuma kontrole, atskaņojot video Velkot ar pirkstu, mainiet video atskaņošanas skaļumu - Skaļuma kontrole, atskaņojot video Automātiski atskaņot Turpināt atskaņot videoklipus, automātiski pievienojot līdzīgus videoklipus Automātiski atskaņot nākošo videoklipu diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 4039949c702..3c1a0a93f51 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -330,7 +330,6 @@ Смали го во прозорче Откажете претплата Одбери јазиче - Гест за контрола на гласност Користете гестови за подесување на гласноста Гестови за контрола на осветленост Користете гест за контрола на осветленоста diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 729a90e4b7f..6d1a6dd9b7c 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -328,7 +328,6 @@ ആംഗ്യത്തിലൂടെ പ്ലയറിലെ പ്രകാശം നിയന്ത്രിക്കാം ആംഗ്യത്തിലൂടെ പ്രകാശം നിയന്ത്രിക്കുക ആംഗ്യം ഉപയോഗിച്ച് വോള്യം നിയന്ത്രിക്കാം - ആംഗ്യത്തിലൂടെ വോള്യം നിയന്ത്രിക്കുക തീരാറായ പ്ലേബാക്ക് ക്യൂവിനെ മറ്റൊരു അനുബന്ധ സ്‌ട്രീമുമായി കൂട്ടിച്ചേർത്ത് തുടരുക അടുത്ത സ്ട്രീം ഓട്ടോക്യൂ ചെയ്യുക കാഷെ ആയ മെറ്റാഡേറ്റ തുടച്ചുനീക്കി diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 24dcbfc867c..34a7d346263 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -65,7 +65,6 @@ Cache metadata dihapuskan Automatik beratur strim seterusnya Tambahkan secara automatik strim berkaitan apabila memain strim terakhir dalam giliran tidak berulang. - Kontrol gestur volume Gunakan gestur untuk melaraskan volume pemain Kontrol gestur kecerahan Gunakan gestur untuk melaraskan kecerahan pemain diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index f67604d1513..e341c632f0e 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -334,7 +334,6 @@ Tilbakestill Opphev abonnement Velg fane - Håndvendingskontroll for lydstyrke Bruk håndvendinger for å kontrollere avspillerens lydstyrke Håndvendingskontroll for lysstyrke Bruk håndvendinger for å kontrollere avspillerens lysstyrke diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 28207c58309..2acfaf5db1f 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -66,7 +66,6 @@ मेटाडाटा क्यास सखाप स्वतः लाम अर्को स्ट्रिम अन्त्य (गैर-दोहरो) प्लेब्याक लाम सम्बन्धित धारा स्थिति थप्दै जारी राख्न - आवाज मात्रा नियन्त्रण गर्न इशाराको प्रयोग प्लेयरको आवाज मात्रा नियन्त्रण गर्न इशाराहरू प्रयोग चमक इशारा नियन्त्रण प्लेयरको चमक नियन्त्रण गर्न इशाराहरू प्रयोग diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 4c4b5c95dea..4ad5c31412a 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -334,7 +334,6 @@ Gebruikers Abonnement opzeggen Kiest een tabblad - Veegbesturing voor volume Gebruik gebaren om het volume van de speler aan te passen Veegbesturing voor helderheid Gebruik gebaren om de helderheid van de speler aan te passen diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 175ce506f69..ba23f32ba65 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -334,7 +334,6 @@ Gebruikers Afmelden Kies tabblad - Gebaarbesturing voor volume Gebruik gebaren om het volume van de speler aan te passen Gebaarbesturing voor helderheid Gebruik gebaren om de helderheid van de speler aan te passen diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index ad1b6c3da28..9af33d4d5e0 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -106,7 +106,6 @@ ବର୍ଣ୍ଣନା ଦେଖାନ୍ତୁ ପ୍ରତିଛବି କ୍ୟାଚ୍ ପୋଛି ଦିଆଗଲା ମେଟାଡାଟା କ୍ୟାଚ୍ ପୋଛି ହୋଇଗଲା - ଭଲ୍ୟୁମ୍ ଅଙ୍ଗଭଙ୍ଗୀ ନିୟନ୍ତ୍ରଣ ପ୍ଲେୟାରର ଉଜ୍ଜ୍ୱଳତାକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବ୍ୟବହାର କରନ୍ତୁ ପରାମର୍ଶ ଖୋଜ ସ୍ଥାନୀୟ ସନ୍ଧାନ ପରାମର୍ଶ diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index 0cc27a0596d..4a3baf403d5 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -48,7 +48,6 @@ تصویر دی کیش ہٹا دتی گئی اے کیش وچ سارے ویب‌سائیٹ دے ڈیٹے ہٹاؤ اِکّ نا دہراؤݨ والی کتار نوں، سمبندھت سٹریم جوڑدیاں، مُکاؤندے رہو - آواز اشرہ کنٹرول آواز کنٹرول کرن لئی شواواں دی ورتون کرو ڈاؤن‌لوڈ پہلاں توں ویکھیاں ہوئیاں چیزاں دی لسٹ diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 43d8f835e53..546c12dade0 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -332,7 +332,6 @@ ਯੂਜ਼ਰਸ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ ਟੈਬ ਚੁਣੋ - ਆਵਾਜ਼ ਸ਼ਵਾਵਾਂ ਕੰਟਰੋਲ ਆਵਾਜ਼ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ ਸਕ੍ਰੀਨ ਲਾਈਟ ਸ਼ਵਾਵਾਂ ਕੰਟਰੋਲ ਵੀਡੀਓ ਸਕ੍ਰੀਨ ਦੀ ਚਮਕ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index b7cfc422424..a292e41c1dd 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -340,7 +340,6 @@ Zminimalizuj do odtwarzacza w trybie okienkowym Odsubskrybuj Wybierz kartę - Kontrola głośności gestami Używaj gestów do sterowania głośnością odtwarzacza Kontrola jasności gestami Używaj gestów do sterowania jasnością odtwarzacza diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 1a1aea03ca8..fb7fa59b0c5 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -336,7 +336,6 @@ Usuários Cancelar inscrição Selecionar aba - Gesto para volume Use gestos para mudar volume do player Gesto para brilho Use gestos para mudar brilho do player diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 6f42cfe740d..2d3af764700 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -71,7 +71,6 @@ Não foi possível importar as subscrições Transferências A processar… - Gestos para controlo de volume Este vídeo está restringido a idades. \n \nPara o poder ver, tem que ativar \"%1$s\" nas definições. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 1d1110b4cc9..0f6f5ffb6f6 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -337,7 +337,6 @@ Ativar reprodutor \'popup\' Cancelar subscrição Escolher separador - Gestos para controlo de volume Utilizar gestos para controlar o volume do reprodutor Gestos para controlo de brilho Utilizar gestos para controlar o brilho do reprodutor diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 80c70fa7382..bc167b97aa2 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -277,7 +277,6 @@ Refuzați Dezabonare Alegeți fila - Controlul prin gesturi al volumului Utilizați gesturi pentru a controla volumul Controlul prin gesturi a luminozității Utilizați gesturi pentru a controla luminozitatea diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9d11705f35b..eb4b11643a4 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -362,7 +362,6 @@ Выберите вкладку Отписаться Менять громкость плеера жестом - Жест громкости Обновления Файл удалён Уведомление об обновлении приложения diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index f59d7987945..d36d3b6b92a 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -470,7 +470,6 @@ Imprea sos gestos pro controllare sa luminosidade de su riproduidore Gestos de controllu de sa luminosidade Imprea sos gestos pro controllare su volume de su riproduidore - Gestos de controllu de su volume Sighi a riproduire (chene ripetitziones) annanghende unu vìdeu correladu a sa lista Annanghe in automàticu su flussu imbeniente a sa lista Memòria temporànea de sos metadatos iscarrigada diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 455edc4f255..4366dc3d83b 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -337,7 +337,6 @@ Prehrávať v okne Zrušiť odber Zvoliť panel - Ovládanie hlasitosti gestom Používať gestá pre ovládanie hlasitosti Ovládanie jasu gestom Použivať gestá pre ovládanie jasu diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index d46bd667aa9..16418e6635c 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -437,7 +437,6 @@ Uporabi poteze za nadzor svetlosti predvajalnika Poteza za nadzor svetlosti Uporabi poteze za nadzor glasnosti predvajalnika - Nadzor potez za glasnost Izklopite, če želite skriti opis videa in dodatnih informacij Prikaži opis Prikazujem rezultate za %s diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index c04b1d7fea5..a2dabbe1e27 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -397,7 +397,6 @@ Isticmaal fartaada adigoo shaashada farta dhinac kaga jiidaya si aad u maamusho iftiinka Maamulista iftiinka (farta) Isticmaal fartaada adigoo shaashada farta dhinac kaga jiidaya si aad umaamusho codka - Maamulista codka (farta) Hormada isutalisa Sii wad dhamaystirka (mida aan isku celcelinin) hormada shidan ayadoo lagu sii darayo waxyaabo la xidhiidha shayga daaran Ku xiji hormada shayga xiga diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 14fa56a23e4..55ae7da2244 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -485,7 +485,6 @@ Përdorni gjestet për të kontrolluar ndriçimin e luajtësit Kontrolli i gjesteve të ndriçimit Përdorni gjeste për të kontrolluar volumin e luajtësit - Kontrolli i gjesteve të volumit Vazhdoje radhën e luajtjes së mbarueshme (e papërsëritur) duke shtuar një stream të ngjashëm Auto-radhit stream-in e radhës Depoja e të dhënave meta u boshatis diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 80528adc1c9..e7cb525dbb5 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -500,7 +500,6 @@ Користите покрете за контролу осветљаја Контрола осветљености потезом Користите потезе за контролу јачине звука плејера - Контрола јачине звука потезом Самостално заказивање Наставите да завршавате (не понављајући) ред репродукције додавањем повезаног стрима Самостално закажи следећи ток diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 524716d1287..9bfe0dd1c1e 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -334,7 +334,6 @@ Minimera till popup-spelare Sluta prenumerera Välj flik - Gestkontroll för volym Använd gester för att justera spelarens volym Gestkontroll för ljusstyrka Använd gester för att justera ljusstyrkan diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 3b8bff427ed..5cc87f5cc46 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -157,7 +157,6 @@ ஒரு பிழை நிகழ்ந்தது: %1$s காணொளிக் கோப்புகள் பக்கத்தை தேர்வு செய் - சத்தக் கட்டுப்பாடு செய்கை இயக்கிச் சத்தத்தைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து வெளிச்ச கட்டுப்பாடு செய்கை இயக்கி ஒளிர்வைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index a0e65045e69..e0febaed409 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -214,7 +214,6 @@ కాష్ చేయబడిన మెటాడేటాను తుడిచివేయండి కాష్ చేసిన వెబ్‌పేజీ డేటా మొత్తాన్ని తీసివేయండి మెటాడేటా కాష్ తుడిచివేయబడింది - వాల్యూమ్ సంజ్ఞ నియంత్రణ ప్లేయర్ వాల్యూమ్‌ను నియంత్రించడానికి సంజ్ఞలను ఉపయోగించండి ప్రకాశం సంజ్ఞ నియంత్రణ సూచనలను శోధించండి diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 19297e8f387..d006e9431d6 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -64,7 +64,6 @@ ลบข้อมูลเว็บเพจที่แคชไว้ทั้งหมด คิววีดีโอถัดไปโดยอัตโนมัติ ต่อท้ายวีดีโอที่เกี่ยวข้องโดยอัตโนมัติเมื่อเล่นถึงรายการสุดท้ายในกรณีที่ไม่ได้ตั้งให้เล่นซ้ำ - การควบคุมระดับเสียงด้วยท่าทาง ใช้ท่าทางสัมผัสเพื่อควบคุมระดับเสียงของเครื่องเล่น การควบคุมความสว่างด้วยท่าทาง ใช้ท่าทางสัมผัสเพื่อควบคุมความสว่างของเครื่องเล่น diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index fd6679e3bbd..d48ddb0ada2 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -330,7 +330,6 @@ Kullanıcılar Abonelikten çık Sekmeyi Seçin - Hareketli ses denetimi Oynatıcının sesini denetlemek için hareketleri kullan Hareketli parlaklık denetimi Oynatıcının parlaklığını denetlemek için hareketleri kullan diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 376685cfed7..9f5cc30dc9d 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -345,7 +345,6 @@ Сiтка Відписатися Обрати вкладку - Жест керування гучністю Змінювати гучність звуку жестами Жест керування яскравістю Змінювати яскравість програвача жестами diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index a49d7b301f9..15333cf840f 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -327,7 +327,6 @@ صارفین رکنیت چھوڑیں ٹیب منتخب کریں - صوتی اشارہ کنٹرول پلیئر کی آواز کنٹرول کرنے کے لیے اشاروں کا استعمال کریں چمک کا متحرک کنٹرول پلیئرکی چمک کو کنٹرول کرنے کیلئے اشاروں کا استعمال کریں diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index e03ceb610d3..88ed4e48023 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -329,7 +329,6 @@ Thu nhỏ vào trình phát popup Hủy đăng ký Chọn tab - Điều khiển âm lượng bằng cử chỉ Sử dụng cử chỉ để điều chỉnh âm lượng Điều khiển độ sáng bằng cử chỉ Sử dụng cử chỉ để điều chỉnh độ sáng diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index e11d0fa2827..868c04c8fa6 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -350,7 +350,6 @@ 曲目 用户 选择标签 - 手势控制音量 使用手势控制播放器的音量 手势控制亮度 使用手势控制播放器的亮度 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 2063426a804..2741e62de64 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -169,7 +169,6 @@ 顯示描述 抹除咗影像快取 移除所有網頁嘅快取資料 - 音量手勢控制 用手勢去控制播放器音量 光暗手勢控制 關閉佢去避免載入條片嘅縮圖,慳返啲數據同埋用少啲 RAM。更改會抹走記憶體以及磁碟機上面嘅影像快取 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index df0af45cc7e..f95fc1ec508 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -328,7 +328,6 @@ 使用者 取消訂閱 選擇分頁 - 音量手勢控制 使用手勢控制播放器音量 亮度手勢控制 使用手勢控制播放器亮度 From e83105916275497d33d9b869e388edd870139936 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 6 May 2023 01:55:36 +0200 Subject: [PATCH 179/645] Remove translations of previously deleted string volume_gesture_control_summary --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-b+ast/strings.xml | 1 - app/src/main/res/values-b+uz+Latn/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-bn-rBD/strings.xml | 1 - app/src/main/res/values-bn-rIN/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 1 - app/src/main/res/values-bs/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-ckb/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-eo/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fil/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-jv/strings.xml | 1 - app/src/main/res/values-ka/strings.xml | 1 - app/src/main/res/values-kmr/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-ku/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-mk/strings.xml | 1 - app/src/main/res/values-ml/strings.xml | 1 - app/src/main/res/values-ms/strings.xml | 1 - app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-ne/strings.xml | 1 - app/src/main/res/values-nl-rBE/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-pa-rPK/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sl/strings.xml | 1 - app/src/main/res/values-so/strings.xml | 1 - app/src/main/res/values-sq/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-ta/strings.xml | 1 - app/src/main/res/values-te/strings.xml | 1 - app/src/main/res/values-th/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-ur/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - 73 files changed, 73 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index d3c5ea484f8..ff39bdf35f9 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -346,7 +346,6 @@ المستخدمين إلغاء الاشتراك اختر علامة التبويب - استخدم إيماءات التحكم في صوت المشغّل التحكم بإيماءات السطوع استخدام الإيماءات للتحكم بسطوع المشغّل التحديثات diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index ef99d8ff4d3..de8a47d42f2 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -63,7 +63,6 @@ Axtarış təklifləri Oynadıcı parlaqlığını nizamlamaq üçün jestlər istifadə et Parlaqlıq jesti idarəetməsi - Oynadıcı səsini nizamlamaq üçün jestlər istifadə et Avto-növbələ Növbəti Yayımı Avto-növbələ Üst məlumat keşi silindi diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index b800f75597c..35b2a621cbd 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -150,7 +150,6 @@ Llistes de reproducción Pistes Usuarios - Usa xestos pa controlar el volume del reproductor Usa xestos pa controlar el brillu del reproductor Reafitamientu de valores El númberu de soscriptores nun ta disponible diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index e13d4aa88d0..211f1efe259 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -17,7 +17,6 @@ Hech qanday translatsiya pleyeri topilmadi. VLC o\'rnatilsinmi\? %1$s tomonidan e‘lon qilingan Boshlash uchun \"Izlash\" tugmasini bosing - Player tovushini boshqarish uchun imo-ishoralardan foydalanish Player yorqinligini boshqarish uchun imo-ishoralardan foydalaning Yorqinlik ishoralarini boshqarish Avto-navbat diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 22ba158c947..0f5f6933586 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -338,7 +338,6 @@ Плэер у акне Адпісацца Абярыце ўкладку - Мяняць гучнасць плэера жэстамі Жэст яркасці Мяняць яркасць плэера жэстамі Абнаўленні diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 5bc994d5b0d..4499e26f2e4 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -335,7 +335,6 @@ Насили докладването на неизпращаеми Rx изключения извън фрагмента или кръговрата на активност след приключване Откачи (може да предизвика промени) Отписване - Използвай жестове за контрол на звука Контрол на яркостта с жестове Използвай жестове за контрол на яркостта Файлът е изтрит diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index ac580a81be7..a39b667c777 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -149,7 +149,6 @@ পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করো প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো উজ্জ্বলতার নিয়ন্ত্রণ সংকেত - প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো সম্পন্ন তালিকা তালিকা আকারে সাজাও diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 9d122daff9c..9c72f881200 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -76,7 +76,6 @@ খোজ ইতিহাস প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো উজ্জ্বলতার নিয়ন্ত্রণ সংকেত - প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 77ec918a085..3ae700615f1 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -222,7 +222,6 @@ সার্চ পরামর্শ প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো উজ্জ্বলতার নিয়ন্ত্রণ সংকেত - প্লেয়ারের ভলিউম নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 0700e81b294..0b444a17674 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -90,7 +90,6 @@ Automatski sljedeći prijenos u red stavite Nastavite završni (ne-ponavljajući) reprodukcijski red privlakom srodnog prijenosa Automatsko redanje - Koristite pokrete za kontrolu jačine zvuka pokretača Kontrola osvetljenja sa pokretima Prijedlozi za pretragu Koristite pokrete za kontrolu svjetline pokretača diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index dc2b9d23a40..6ae7a52c3b6 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -333,7 +333,6 @@ Pistes Usuaris Trieu una pestanya - Fes servir gestos per controlar el volum del reproductor Control de brillantor per gestos Fes servir gestos per controlar la brillantor del reproductor Actualitzacions diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 791e1668efc..5411206be58 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -343,7 +343,6 @@ فایل نەدۆزرایەوە چارەسەردەکرێت - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ بابەتی پەڕەی سەرەکی دیار کردنی بەژدارییەکان هاورده‌كردنی فایل diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 03269e80bc7..d28144e6f98 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -337,7 +337,6 @@ Minimalizovat přehrávač do vyskakovacího okna Přestat odebírat Zvolit panel - Používat gesta pro ovládání hlasitosti přehrávače Ovládání jasu gesty Používat gesta pro ovládání jasu přehrávače Aktualizace diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 2ed16cf9b92..2b3eefbe80c 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -65,7 +65,6 @@ Metadata-cache slettet Føj automatisk næste stream til køen Fortsæt en afspilningskø, der afsluttes (ikke-gentagende), ved at tilføje en lignende stream - Brug fingerbevægelser til at kontrollere afspillerens lydstyrke Styr lysstyrken med fingerbevægelser Brug fingerbevægelser til at justere afspillerens lysstyrke Søgeforslag diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 56d234a29c9..2efcc68d882 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -336,7 +336,6 @@ Benutzer Deabonnieren Tab wählen - Gesten verwenden, um die Lautstärke einzustellen Gestensteuerung für Helligkeit Gesten verwenden, um die Helligkeit einzustellen Aktualisierungen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 8a68d8f7689..ad7e87b49f2 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -334,7 +334,6 @@ Ελαχιστοποίηση σε αναδυόμενο παράθυρο Απεγγραφή Επιλογή Καρτέλας - Χρησιμοποιήστε χειρονομίες για τον έλεγχο της έντασης του ήχου Έλεγχος φωτεινότητας με χειρονομίες Χρησιμοποιήστε χειρονομίες για τον έλεγχο φωτεινότητας Ενημερώσεις diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 5fd9b96a9ae..928da506fab 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -202,7 +202,6 @@ Uzantoj Malaboni Elektu ongleton - Uzi gestojn por kontroli la volumon Kontrolo de gesto de brilo Uzi gestojn por kontroli la brilon Ĝisdatigoj diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c90f1fa0ea7..7b29d300869 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -390,7 +390,6 @@ El \'Sistema de Acceso al Almacenamiento\' permite descargar en una tarjeta SD externa Desuscribirse Elija la pestaña - Usar gestos para controlar el volumen del reproductor Control de brillo por gestos Usar gestos para controlar el brillo del reproductor Actualizaciones diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 87adacc0176..fd76a995d75 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -334,7 +334,6 @@ Jõusta väljaspool fragmenti või elutsüklit olevate kättetoimetamatute Rx erindite raporteerimine nende vabastamise järgselt Lõpeta tellimine Vali vahekaart - Kasuta viipeid helitugevuse reguleerimiseks Ereduse reguleerimine viibetega Kasuta viipeid heleduse reguleerimiseks Uuendused diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 5ac22af9de3..c6d4bdde7aa 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -334,7 +334,6 @@ Erabiltzaileak Kendu harpidetza Hautatu fitxa - Erabili keinuak erreproduzigailuaren bolumena kontrolatzeko Keinuen bidezko distiraren kontrola Erabili keinuak erreproduzigailuaren distira kontrolatzeko Eguneraketak diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index df37c954366..33f978be6a3 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -280,7 +280,6 @@ نمایش نکته «برای صف‌گذاری، نگه‌دارید» نمایش راهنما هنگام فشردن پس زمینه یا دکمهٔ تصویر در تصویر در «جزییات:» ویدیو برای در صف قرار دادن، نگه دارید - از اشارات برای کنترل حجم صدا استفاده شود کنترل روشنایی اشاره ای از اشارات برای کنترل روشنایی استفاده شود بازگردانی diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index d41b583a1e0..8894fe1fdac 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -393,7 +393,6 @@ Palvelujen alkuperäiset tekstit näkyvät suoratoistettavassa sisällössä Käytä eleitä ohjataksesi soittimen kirkkautta Kirkkauden eleohjaus - Käytä eleitä ohjataksesi soittimen äänenvoimakkuutta Poista käytöstä piilottaaksesi kommentit Toistokohdat poistettu Poistetaanko kaikki toistokohdat\? diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index 56aff898e7c..18d14f55096 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -78,7 +78,6 @@ Nalinis na ang cache ng metadata Kusang ipila ang susunod na stream Ipagpatuloy na tapusin (di umuulit) ang pila sa pamamagitan ng pagdagdag ng isang katulad na stream - Gumamit ng gesture para kontrolin ang volume ng player Mga mungkahi sa paghahanap Itago ang mga hinanap nang lokal Kasaysayan ng napanood diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6ab748f33a5..ca899844093 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -337,7 +337,6 @@ Réduire vers le lecteur flottant Se désabonner Sélectionner un onglet - Utiliser des gestes pour contrôler le volume du lecteur Contrôle gestuel de la luminosité Utiliser des gestes pour contrôler la luminosité du lecteur Mises à jour diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index bfae4054734..f85c41b6459 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -530,7 +530,6 @@ Posicións nas listas Restaurar a última posición de reprodución Control do xesto de brillo - Use xestos para controlalo volume do reprodutor Ensinalos comentarios Duración da busca rápida cara a adiante / cara atrás Elixir lapela diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 096adadb4a3..b667167ab1a 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -327,7 +327,6 @@ הקטנה לנגן צף ביטול מינוי בחירת לשונית - שימוש במחוות כדי לשלוט בעצמת השמע של הנגן מחוות בקרת בהירות שימוש במחוות כדי לשלוט בבהירות הנגן עדכונים diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 9c7e18fd739..63bfb7a7afb 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -326,7 +326,6 @@ अनसब्सक्राईब करें टैब चुने कतारबद्ध करें - वीडियो प्लेयर की ध्वनि नियंत्रित करने के लिए इशारो का इस्तेमाल करे रोशनी स्तर नियंत्रण के इशारे वीडियो चालक की चमक को नियंत्रित करने के लिए इशारो का इस्तेमाल करें अपडेट diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 6471f506c0a..c1d451341db 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -317,7 +317,6 @@ Metapodaci su izbrisani Automatski dodaj sljedeći stream u popisa izvođenja Nastavi završavati (ne ponavljajući) popis reprodukcija dodavanjem povezanog streama - Koristi geste za upravljanje glasnoćom playera Kontrola svjetline pomoću gesti Koristi gesture za upravljanje svjetlinom playera Zadana zemlja sadržaja diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index c5db2b72f47..7a70da494cd 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -334,7 +334,6 @@ Pozíciók a listákban Gesztusok használata a fényerő szabályozásához Fényerő gesztus - Gesztusok használata a lejátszó hangerejének szabályzásához Meg fogja kérdezni, hogy hova mentse el az egyes letöltéseket. \nEngedélyezze a rendszermappa-választót (SAF), ha külső SD-kártyára akar letölteni Kérdezze meg, hova töltse le diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index c9c2a007009..4747ac9494e 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -328,7 +328,6 @@ Berhenti Berlanggan Pilih Tab Tema - Gunakan gestur untuk mengontrol volume pemutar Kontrol gestur kecerahan Gunakan gestur untuk mengontrol kecerahan pemutar Pembaruan diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index aef8aa82cb5..c868e835ad9 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -618,7 +618,6 @@ Slökktu á til að fela lýsigagnareiti með viðbótarupplýsingum um straumhöfund, straumefni eða leitarbeiðni Fjarlæga öll síðugögn úr skyndiminni Bæta svipuðum straumum við biðröðina þegar síðasta er spilað og endurspilun er ekki virkjuð - Nota bendingar til að stjórna hljóðstyrk spilara Birtustigsbending Nota bendingar til að stjórna birtustig spilara Veldu tillögur til að sýna þegar leitað er diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 4a1ea56048f..87382a7bca0 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -337,7 +337,6 @@ Utenti Disiscriviti Scegli scheda - Utilizza i gesti per controllare il volume del lettore multimediale Gesti controllo luminosità Utilizza i gesti per controllare la luminosità del lettore multimediale Aggiornamenti diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 5821c8e71df..3693ac464b9 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -368,7 +368,6 @@ 停止 最大再試行回数 ダウンロードを中止するまでの最大再試行回数 - ジェスチャーを使用して、プレイヤーの音量を制御します 明るさのジェスチャー制御 ジェスチャーを使用して、プレイヤーの明るさを制御します ファイルを削除しました diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml index 6b518b2e207..0a1e270ce0d 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -8,7 +8,6 @@ Goleki saran Ngontrol kepadhangan ngaggo gesture Kontrol kepadhangan nganggo gestur - Gunake gesture gawe ngontrol volum Pokoke teruske muter suara/video Antri otomatis stream bare Sampah metadata wes dibusak diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 762fab2868e..0580e30f316 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -45,7 +45,6 @@ გამორთეთ ესკიზების ჩატვირთვის თავიდან ასაცილებლად, მონაცემთა დაზოგვისა და მეხსიერების გამოყენების თავიდან ასაცილებლად. იცვლება როგორც მეხსიერებაში, ასევე დისკზე გამოსახულების ქეშის გასუფთავება ძიების შეთავაზებები წაშალეთ ყველა ქეშირებული ვებგვერდის მონაცემები - გამოიყენეთ ჟესტები მოთამაშის ხმის გასაკონტროლებლად შემდეგი ნაკადის ავტომატური შეყვანა გააგრძელეთ დაკვრის რიგის (არაგანმეორებადი) დასრულება შესაბამისი ნაკადის დამატებით მეტამონაცემების ქეში წაშლილია diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index 0a415ce0fc7..607eabfa058 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -230,7 +230,6 @@ Pêşniyarên lêgerînê Tevgerên bikar bînin ku ronahiya lîstikvan kontrol bikin Kontrola tevgera ronahiyê - Tevgerên bikar bînin da ku hêjmara lîstikvan kontrol bikin Rêzeya-otomatîkî Bi pêvekirina kanalek pêwendîdar rêza lîstikê ya bidawîkirina (ne-dubare) bidomînin Çemê din ê dixwe-dorê bike diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index efdbd4eb361..4679251044c 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -318,7 +318,6 @@ 모바일 데이터 사용 시 화질 제한 구독 취소 탭 선택 - 제스처를 사용하여 플레이어의 볼륨 제어 제스처 밝기 조작 제스처를 사용하여 플레이어의 밝기 제어 업데이트 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 3c48714727c..1907b5e6717 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -276,7 +276,6 @@ بەکاربەرەکان بەشدارنەبوون هەڵبژاردنی پەڕە - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی دەنگ کۆنترۆڵی ڕووناکی بەجوڵەی پەنجە جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما زمانی بنەڕەتی ئەپ diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index aeb770ed898..505b0bc8592 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -343,7 +343,6 @@ Vietos sąraše Naudoti gestus ryškumo valdymui Ryškumo gesto valdymas - Naudoti gestus garsumo valdymui Auto eilė Tęsti atkūrimą į eilę pridedant susijusius srautus Automatiškai pridėti sekantį į eilę diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 2f6baccb1ef..8d0a6aceaed 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -505,7 +505,6 @@ Meklēšanas ieteikumi Velkot ar pirkstu, mainiet video atskaņošanas spilgtumu Spilgtuma kontrole, atskaņojot video - Velkot ar pirkstu, mainiet video atskaņošanas skaļumu Automātiski atskaņot Turpināt atskaņot videoklipus, automātiski pievienojot līdzīgus videoklipus Automātiski atskaņot nākošo videoklipu diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 3c1a0a93f51..72ea0fd486e 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -330,7 +330,6 @@ Смали го во прозорче Откажете претплата Одбери јазиче - Користете гестови за подесување на гласноста Гестови за контрола на осветленост Користете гест за контрола на осветленоста Ажурирања diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 6d1a6dd9b7c..1c21151cc10 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -327,7 +327,6 @@ സെർച്ച് നിർദ്ദേശങ്ങൾ ആംഗ്യത്തിലൂടെ പ്ലയറിലെ പ്രകാശം നിയന്ത്രിക്കാം ആംഗ്യത്തിലൂടെ പ്രകാശം നിയന്ത്രിക്കുക - ആംഗ്യം ഉപയോഗിച്ച് വോള്യം നിയന്ത്രിക്കാം തീരാറായ പ്ലേബാക്ക് ക്യൂവിനെ മറ്റൊരു അനുബന്ധ സ്‌ട്രീമുമായി കൂട്ടിച്ചേർത്ത് തുടരുക അടുത്ത സ്ട്രീം ഓട്ടോക്യൂ ചെയ്യുക കാഷെ ആയ മെറ്റാഡേറ്റ തുടച്ചുനീക്കി diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 34a7d346263..fd19745a1f6 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -65,7 +65,6 @@ Cache metadata dihapuskan Automatik beratur strim seterusnya Tambahkan secara automatik strim berkaitan apabila memain strim terakhir dalam giliran tidak berulang. - Gunakan gestur untuk melaraskan volume pemain Kontrol gestur kecerahan Gunakan gestur untuk melaraskan kecerahan pemain Cadangan carian diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index e341c632f0e..d4b979779b9 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -334,7 +334,6 @@ Tilbakestill Opphev abonnement Velg fane - Bruk håndvendinger for å kontrollere avspillerens lydstyrke Håndvendingskontroll for lysstyrke Bruk håndvendinger for å kontrollere avspillerens lysstyrke Oppdateringer diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 2acfaf5db1f..476789b8a7b 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -66,7 +66,6 @@ मेटाडाटा क्यास सखाप स्वतः लाम अर्को स्ट्रिम अन्त्य (गैर-दोहरो) प्लेब्याक लाम सम्बन्धित धारा स्थिति थप्दै जारी राख्न - प्लेयरको आवाज मात्रा नियन्त्रण गर्न इशाराहरू प्रयोग चमक इशारा नियन्त्रण प्लेयरको चमक नियन्त्रण गर्न इशाराहरू प्रयोग खोज सुझावहरू diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 4ad5c31412a..f4aaadf28af 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -334,7 +334,6 @@ Gebruikers Abonnement opzeggen Kiest een tabblad - Gebruik gebaren om het volume van de speler aan te passen Veegbesturing voor helderheid Gebruik gebaren om de helderheid van de speler aan te passen Updates diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ba23f32ba65..d567c6a1983 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -334,7 +334,6 @@ Gebruikers Afmelden Kies tabblad - Gebruik gebaren om het volume van de speler aan te passen Gebaarbesturing voor helderheid Gebruik gebaren om de helderheid van de speler aan te passen Bijwerken diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 9af33d4d5e0..25e83aec710 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -142,7 +142,6 @@ ଶେଷ ପ୍ଲେବେକ୍ ସ୍ଥିତିକୁ ପୁନଃ ସ୍ଥାପନ କରନ୍ତୁ ତାଲିକାରେ ପ୍ଲେବେକ୍ ପୋଜିସନ୍ ସୂଚକ ଦେଖାନ୍ତୁ ସମସ୍ତ କ୍ୟାଚ୍ ହୋଇଥିବା ୱେବପୃଷ୍ଠା ତଥ୍ୟ ଅପସାରଣ କରନ୍ତୁ - ପ୍ଲେୟାର ଭଲ୍ୟୁମକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବ୍ୟବହାର କରନ୍ତୁ ସନ୍ଧାନ କରିବା ସମୟରେ ଦେଖାଇବାକୁ ପରାମର୍ଶଗୁଡିକ ବାଛନ୍ତୁ ବାଧା ପରେ ଖେଳିବା ଜାରି ରଖନ୍ତୁ (ଯଥା ଫୋନକଲ୍) ଭିଡିଓ \"ବିବରଣୀ:\" ରେ ପୃଷ୍ଠଭୂମି କିମ୍ବା ପପ୍ଅପ୍ ବଟନ୍ ଦବାଇବା ସମୟରେ ଟିପ୍ ଦେଖାନ୍ତୁ diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index 4a3baf403d5..534ac790f3f 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -48,7 +48,6 @@ تصویر دی کیش ہٹا دتی گئی اے کیش وچ سارے ویب‌سائیٹ دے ڈیٹے ہٹاؤ اِکّ نا دہراؤݨ والی کتار نوں، سمبندھت سٹریم جوڑدیاں، مُکاؤندے رہو - آواز کنٹرول کرن لئی شواواں دی ورتون کرو ڈاؤن‌لوڈ پہلاں توں ویکھیاں ہوئیاں چیزاں دی لسٹ پلےبیک دوبارہ شروع کرو diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 546c12dade0..7413072eb25 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -332,7 +332,6 @@ ਯੂਜ਼ਰਸ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ ਟੈਬ ਚੁਣੋ - ਆਵਾਜ਼ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ ਸਕ੍ਰੀਨ ਲਾਈਟ ਸ਼ਵਾਵਾਂ ਕੰਟਰੋਲ ਵੀਡੀਓ ਸਕ੍ਰੀਨ ਦੀ ਚਮਕ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ ਮੂਲ ਭਾਸ਼ਾ ਸਮੱਗਰੀ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a292e41c1dd..4d82b79e3b2 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -340,7 +340,6 @@ Zminimalizuj do odtwarzacza w trybie okienkowym Odsubskrybuj Wybierz kartę - Używaj gestów do sterowania głośnością odtwarzacza Kontrola jasności gestami Używaj gestów do sterowania jasnością odtwarzacza Aktualizacje diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index fb7fa59b0c5..5bfe1a9efe1 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -336,7 +336,6 @@ Usuários Cancelar inscrição Selecionar aba - Use gestos para mudar volume do player Gesto para brilho Use gestos para mudar brilho do player Debug diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 2d3af764700..8601d02dee0 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -241,7 +241,6 @@ Remover todo o histórico de pesquisas\? Reportar por e-mail Escolher separador - Utilizar gestos para controlar o volume do reprodutor Grelha Exportado Escolha a pasta para colocar os ficheiros de áudio diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 0f6f5ffb6f6..853791fda6c 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -337,7 +337,6 @@ Ativar reprodutor \'popup\' Cancelar subscrição Escolher separador - Utilizar gestos para controlar o volume do reprodutor Gestos para controlo de brilho Utilizar gestos para controlar o brilho do reprodutor Atualizações diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index bc167b97aa2..8218853fccd 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -277,7 +277,6 @@ Refuzați Dezabonare Alegeți fila - Utilizați gesturi pentru a controla volumul Controlul prin gesturi a luminozității Utilizați gesturi pentru a controla luminozitatea Actualizări diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index eb4b11643a4..7910b1bff2c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -361,7 +361,6 @@ Количество подписчиков недоступно Выберите вкладку Отписаться - Менять громкость плеера жестом Обновления Файл удалён Уведомление об обновлении приложения diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index d36d3b6b92a..bd9751eb2f8 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -469,7 +469,6 @@ Cussìgios de chirca Imprea sos gestos pro controllare sa luminosidade de su riproduidore Gestos de controllu de sa luminosidade - Imprea sos gestos pro controllare su volume de su riproduidore Sighi a riproduire (chene ripetitziones) annanghende unu vìdeu correladu a sa lista Annanghe in automàticu su flussu imbeniente a sa lista Memòria temporànea de sos metadatos iscarrigada diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 4366dc3d83b..25a7249dca5 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -337,7 +337,6 @@ Prehrávať v okne Zrušiť odber Zvoliť panel - Používať gestá pre ovládanie hlasitosti Ovládanie jasu gestom Použivať gestá pre ovládanie jasu Aktualizácie diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 16418e6635c..da08ca40cbe 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -436,7 +436,6 @@ Pokaži indikator položaja predvajalnika na seznamih Uporabi poteze za nadzor svetlosti predvajalnika Poteza za nadzor svetlosti - Uporabi poteze za nadzor glasnosti predvajalnika Izklopite, če želite skriti opis videa in dodatnih informacij Prikaži opis Prikazujem rezultate za %s diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index a2dabbe1e27..076164ce141 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -396,7 +396,6 @@ Soojeedinada raadinta Isticmaal fartaada adigoo shaashada farta dhinac kaga jiidaya si aad u maamusho iftiinka Maamulista iftiinka (farta) - Isticmaal fartaada adigoo shaashada farta dhinac kaga jiidaya si aad umaamusho codka Hormada isutalisa Sii wad dhamaystirka (mida aan isku celcelinin) hormada shidan ayadoo lagu sii darayo waxyaabo la xidhiidha shayga daaran Ku xiji hormada shayga xiga diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 55ae7da2244..19582337838 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -484,7 +484,6 @@ Shfaq sugjerime kur jeni duke kërkuar Përdorni gjestet për të kontrolluar ndriçimin e luajtësit Kontrolli i gjesteve të ndriçimit - Përdorni gjeste për të kontrolluar volumin e luajtësit Vazhdoje radhën e luajtjes së mbarueshme (e papërsëritur) duke shtuar një stream të ngjashëm Auto-radhit stream-in e radhës Depoja e të dhënave meta u boshatis diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index e7cb525dbb5..1fdb2ec1a46 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -499,7 +499,6 @@ Наставак репродукције Користите покрете за контролу осветљаја Контрола осветљености потезом - Користите потезе за контролу јачине звука плејера Самостално заказивање Наставите да завршавате (не понављајући) ред репродукције додавањем повезаног стрима Самостално закажи следећи ток diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 9bfe0dd1c1e..47fc57724d1 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -334,7 +334,6 @@ Minimera till popup-spelare Sluta prenumerera Välj flik - Använd gester för att justera spelarens volym Gestkontroll för ljusstyrka Använd gester för att justera ljusstyrkan Uppdateringar diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 5cc87f5cc46..52b75e33996 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -157,7 +157,6 @@ ஒரு பிழை நிகழ்ந்தது: %1$s காணொளிக் கோப்புகள் பக்கத்தை தேர்வு செய் - இயக்கிச் சத்தத்தைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து வெளிச்ச கட்டுப்பாடு செய்கை இயக்கி ஒளிர்வைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து புதுப்பித்தல்கள் diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index e0febaed409..9890f32a113 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -214,7 +214,6 @@ కాష్ చేయబడిన మెటాడేటాను తుడిచివేయండి కాష్ చేసిన వెబ్‌పేజీ డేటా మొత్తాన్ని తీసివేయండి మెటాడేటా కాష్ తుడిచివేయబడింది - ప్లేయర్ వాల్యూమ్‌ను నియంత్రించడానికి సంజ్ఞలను ఉపయోగించండి ప్రకాశం సంజ్ఞ నియంత్రణ సూచనలను శోధించండి శోధన చరిత్ర diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index d006e9431d6..33955f7e096 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -64,7 +64,6 @@ ลบข้อมูลเว็บเพจที่แคชไว้ทั้งหมด คิววีดีโอถัดไปโดยอัตโนมัติ ต่อท้ายวีดีโอที่เกี่ยวข้องโดยอัตโนมัติเมื่อเล่นถึงรายการสุดท้ายในกรณีที่ไม่ได้ตั้งให้เล่นซ้ำ - ใช้ท่าทางสัมผัสเพื่อควบคุมระดับเสียงของเครื่องเล่น การควบคุมความสว่างด้วยท่าทาง ใช้ท่าทางสัมผัสเพื่อควบคุมความสว่างของเครื่องเล่น คำแนะนำการค้นหา diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index d48ddb0ada2..0822b2463cf 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -330,7 +330,6 @@ Kullanıcılar Abonelikten çık Sekmeyi Seçin - Oynatıcının sesini denetlemek için hareketleri kullan Hareketli parlaklık denetimi Oynatıcının parlaklığını denetlemek için hareketleri kullan Güncellemeler diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 9f5cc30dc9d..77de33629a5 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -345,7 +345,6 @@ Сiтка Відписатися Обрати вкладку - Змінювати гучність звуку жестами Жест керування яскравістю Змінювати яскравість програвача жестами Оновлення diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 15333cf840f..9a558c85cc5 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -327,7 +327,6 @@ صارفین رکنیت چھوڑیں ٹیب منتخب کریں - پلیئر کی آواز کنٹرول کرنے کے لیے اشاروں کا استعمال کریں چمک کا متحرک کنٹرول پلیئرکی چمک کو کنٹرول کرنے کیلئے اشاروں کا استعمال کریں مشمولات کی طےشدہ زبان diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 88ed4e48023..a306e8abd74 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -329,7 +329,6 @@ Thu nhỏ vào trình phát popup Hủy đăng ký Chọn tab - Sử dụng cử chỉ để điều chỉnh âm lượng Điều khiển độ sáng bằng cử chỉ Sử dụng cử chỉ để điều chỉnh độ sáng Cập nhật diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 868c04c8fa6..25b25c1f417 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -350,7 +350,6 @@ 曲目 用户 选择标签 - 使用手势控制播放器的音量 手势控制亮度 使用手势控制播放器的亮度 视频默认语言 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 2741e62de64..7c10e963f5e 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -169,7 +169,6 @@ 顯示描述 抹除咗影像快取 移除所有網頁嘅快取資料 - 用手勢去控制播放器音量 光暗手勢控制 關閉佢去避免載入條片嘅縮圖,慳返啲數據同埋用少啲 RAM。更改會抹走記憶體以及磁碟機上面嘅影像快取 粗略嘅快轉允許播放器比較籠統咁快轉去其他位置。快轉 5、15 或 25 秒就太仔細,做唔到 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f95fc1ec508..9b845339ce7 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -328,7 +328,6 @@ 使用者 取消訂閱 選擇分頁 - 使用手勢控制播放器音量 亮度手勢控制 使用手勢控制播放器亮度 更新 From 2f31ea88647f60d41016280c27094e88f0f68fcb Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 6 May 2023 01:58:33 +0200 Subject: [PATCH 180/645] Remove translations of previously deleted string brightness_gesture_control_title --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-b+ast/strings.xml | 1 - app/src/main/res/values-b+uz+Latn/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-bn-rBD/strings.xml | 1 - app/src/main/res/values-bn-rIN/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 1 - app/src/main/res/values-bs/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-ckb/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-eo/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fil/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-jv/strings.xml | 1 - app/src/main/res/values-ka/strings.xml | 1 - app/src/main/res/values-kmr/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-ku/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-mk/strings.xml | 1 - app/src/main/res/values-ml/strings.xml | 1 - app/src/main/res/values-ms/strings.xml | 1 - app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-ne/strings.xml | 1 - app/src/main/res/values-nl-rBE/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sl/strings.xml | 1 - app/src/main/res/values-so/strings.xml | 1 - app/src/main/res/values-sq/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-ta/strings.xml | 1 - app/src/main/res/values-te/strings.xml | 1 - app/src/main/res/values-th/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-ur/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - 72 files changed, 72 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index ff39bdf35f9..bb70e5833f1 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -346,7 +346,6 @@ المستخدمين إلغاء الاشتراك اختر علامة التبويب - التحكم بإيماءات السطوع استخدام الإيماءات للتحكم بسطوع المشغّل التحديثات تم حذف الملف diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index de8a47d42f2..d9e079ae1f5 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -62,7 +62,6 @@ Axtarış zamanı göstərmək üçün təklifləri seç Axtarış təklifləri Oynadıcı parlaqlığını nizamlamaq üçün jestlər istifadə et - Parlaqlıq jesti idarəetməsi Avto-növbələ Növbəti Yayımı Avto-növbələ Üst məlumat keşi silindi diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index 35b2a621cbd..18dcb00482d 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -225,7 +225,6 @@ Cargando\'l conteníu solicitáu Política de privacidá de NewPipe - Control per xestos del brillu El ficheru nun pue crease El sirvidor nun unvia datos La llingua va camudar namás que se reanicie l\'aplicación. diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index 211f1efe259..202367eaddd 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -18,7 +18,6 @@ %1$s tomonidan e‘lon qilingan Boshlash uchun \"Izlash\" tugmasini bosing Player yorqinligini boshqarish uchun imo-ishoralardan foydalaning - Yorqinlik ishoralarini boshqarish Avto-navbat Tegishli stream qo\'shib, ijro etish navbatini tugatishni (takrorlanmaydigan) davom ettirish avtomatik navbat next stream diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 0f5f6933586..38607ac641a 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -338,7 +338,6 @@ Плэер у акне Адпісацца Абярыце ўкладку - Жэст яркасці Мяняць яркасць плэера жэстамі Абнаўленні Файл выдалены diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 4499e26f2e4..30eb4fbc971 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -335,7 +335,6 @@ Насили докладването на неизпращаеми Rx изключения извън фрагмента или кръговрата на активност след приключване Откачи (може да предизвика промени) Отписване - Контрол на яркостта с жестове Използвай жестове за контрол на яркостта Файлът е изтрит Събития diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index a39b667c777..29b987e25a2 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -148,7 +148,6 @@ মেটাডেটা ক্যাশ মোছা হয়েছে পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করো প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - উজ্জ্বলতার নিয়ন্ত্রণ সংকেত সম্পন্ন তালিকা তালিকা আকারে সাজাও diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 9c72f881200..bfbe9c50b86 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -75,7 +75,6 @@ ইতিহাস খোজ ইতিহাস প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - উজ্জ্বলতার নিয়ন্ত্রণ সংকেত পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 3ae700615f1..dbe51285aa9 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -221,7 +221,6 @@ সার্চ করার সময় দেখানোর জন্য সাজেশন বেছে নিন সার্চ পরামর্শ প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো - উজ্জ্বলতার নিয়ন্ত্রণ সংকেত পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 0b444a17674..8587c443656 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -90,7 +90,6 @@ Automatski sljedeći prijenos u red stavite Nastavite završni (ne-ponavljajući) reprodukcijski red privlakom srodnog prijenosa Automatsko redanje - Kontrola osvetljenja sa pokretima Prijedlozi za pretragu Koristite pokrete za kontrolu svjetline pokretača Odaberite prijedloge koje želite prikazati prilikom pretrage diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 6ae7a52c3b6..e627828a402 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -333,7 +333,6 @@ Pistes Usuaris Trieu una pestanya - Control de brillantor per gestos Fes servir gestos per controlar la brillantor del reproductor Actualitzacions S\'ha eliminat el fitxer diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 5411206be58..ae1f4d21220 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -148,7 +148,6 @@ پیشاندانی کێشە هەرده‌م نوێ بكرێته‌وه‌ ناتوانرێت بەژدارییەکان هاورده‌ بكرێنه‌وه‌ - کۆنترۆڵی ڕووناکی بەجوڵەی پەنجە دیمه‌ن هاوردە كردنی داتابه‌یس مێژووی گه‌ڕان diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index d28144e6f98..603b71aab5f 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -337,7 +337,6 @@ Minimalizovat přehrávač do vyskakovacího okna Přestat odebírat Zvolit panel - Ovládání jasu gesty Používat gesta pro ovládání jasu přehrávače Aktualizace Soubor smazán diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 2b3eefbe80c..07b3956dce6 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -65,7 +65,6 @@ Metadata-cache slettet Føj automatisk næste stream til køen Fortsæt en afspilningskø, der afsluttes (ikke-gentagende), ved at tilføje en lignende stream - Styr lysstyrken med fingerbevægelser Brug fingerbevægelser til at justere afspillerens lysstyrke Søgeforslag Vælg forslagene, der vises, når der søges diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 2efcc68d882..ed8dbd1d963 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -336,7 +336,6 @@ Benutzer Deabonnieren Tab wählen - Gestensteuerung für Helligkeit Gesten verwenden, um die Helligkeit einzustellen Aktualisierungen Wiedergabebenachrichtigung diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index ad7e87b49f2..ddedc31ed5a 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -334,7 +334,6 @@ Ελαχιστοποίηση σε αναδυόμενο παράθυρο Απεγγραφή Επιλογή Καρτέλας - Έλεγχος φωτεινότητας με χειρονομίες Χρησιμοποιήστε χειρονομίες για τον έλεγχο φωτεινότητας Ενημερώσεις Συμβάντα diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 928da506fab..76666606692 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -202,7 +202,6 @@ Uzantoj Malaboni Elektu ongleton - Kontrolo de gesto de brilo Uzi gestojn por kontroli la brilon Ĝisdatigoj Dosiero forviŝita diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 7b29d300869..04a674ac95e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -390,7 +390,6 @@ El \'Sistema de Acceso al Almacenamiento\' permite descargar en una tarjeta SD externa Desuscribirse Elija la pestaña - Control de brillo por gestos Usar gestos para controlar el brillo del reproductor Actualizaciones Eventos diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index fd76a995d75..405b24357d8 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -334,7 +334,6 @@ Jõusta väljaspool fragmenti või elutsüklit olevate kättetoimetamatute Rx erindite raporteerimine nende vabastamise järgselt Lõpeta tellimine Vali vahekaart - Ereduse reguleerimine viibetega Kasuta viipeid heleduse reguleerimiseks Uuendused Sündmused diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index c6d4bdde7aa..431430e8b4f 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -334,7 +334,6 @@ Erabiltzaileak Kendu harpidetza Hautatu fitxa - Keinuen bidezko distiraren kontrola Erabili keinuak erreproduzigailuaren distira kontrolatzeko Eguneraketak Gertaerak diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 33f978be6a3..3cc525b8def 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -280,7 +280,6 @@ نمایش نکته «برای صف‌گذاری، نگه‌دارید» نمایش راهنما هنگام فشردن پس زمینه یا دکمهٔ تصویر در تصویر در «جزییات:» ویدیو برای در صف قرار دادن، نگه دارید - کنترل روشنایی اشاره ای از اشارات برای کنترل روشنایی استفاده شود بازگردانی چی:\\nدرخواست:\\nزبان محتوا:\\nکشور محتوا:\\nزبان اپ:\\nخدمت:\\nزمان GMT\\nپکیج:T:\\nنسخه:\\nنسخه‌اندروید: diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 8894fe1fdac..1320257b433 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -392,7 +392,6 @@ Jatka toistoa Palvelujen alkuperäiset tekstit näkyvät suoratoistettavassa sisällössä Käytä eleitä ohjataksesi soittimen kirkkautta - Kirkkauden eleohjaus Poista käytöstä piilottaaksesi kommentit Toistokohdat poistettu Poistetaanko kaikki toistokohdat\? diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index 18d14f55096..6cc32a9feba 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -89,7 +89,6 @@ Mga posisyon sa listahan Kasaysayan ng mga hinanap Gumamit ng gesture para kontrolin ang liwanag ng player - Kontrolin ang liwanag gamit gesture Linisin ang naka-cache na metadata Nalinis na ang image cache Patayin para itago ang mga komento diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ca899844093..add1ef41f00 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -337,7 +337,6 @@ Réduire vers le lecteur flottant Se désabonner Sélectionner un onglet - Contrôle gestuel de la luminosité Utiliser des gestes pour contrôler la luminosité du lecteur Mises à jour Fichier supprimé diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index f85c41b6459..ee3a849d979 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -529,7 +529,6 @@ Eliminar datos Posicións nas listas Restaurar a última posición de reprodución - Control do xesto de brillo Ensinalos comentarios Duración da busca rápida cara a adiante / cara atrás Elixir lapela diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index b667167ab1a..3b88c8d2a9a 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -327,7 +327,6 @@ הקטנה לנגן צף ביטול מינוי בחירת לשונית - מחוות בקרת בהירות שימוש במחוות כדי לשלוט בבהירות הנגן עדכונים קובץ נמחק diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 63bfb7a7afb..7d84350573c 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -326,7 +326,6 @@ अनसब्सक्राईब करें टैब चुने कतारबद्ध करें - रोशनी स्तर नियंत्रण के इशारे वीडियो चालक की चमक को नियंत्रित करने के लिए इशारो का इस्तेमाल करें अपडेट फाइल मिटा दी गयी diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index c1d451341db..2bb6d28d65f 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -317,7 +317,6 @@ Metapodaci su izbrisani Automatski dodaj sljedeći stream u popisa izvođenja Nastavi završavati (ne ponavljajući) popis reprodukcija dodavanjem povezanog streama - Kontrola svjetline pomoću gesti Koristi gesture za upravljanje svjetlinom playera Zadana zemlja sadržaja Otkrivanje grešaka diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 7a70da494cd..1f333514988 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -333,7 +333,6 @@ Lejátszási pozíciók megjelenítése a listákban Pozíciók a listákban Gesztusok használata a fényerő szabályozásához - Fényerő gesztus Meg fogja kérdezni, hogy hova mentse el az egyes letöltéseket. \nEngedélyezze a rendszermappa-választót (SAF), ha külső SD-kártyára akar letölteni Kérdezze meg, hova töltse le diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 4747ac9494e..0104c7c4411 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -328,7 +328,6 @@ Berhenti Berlanggan Pilih Tab Tema - Kontrol gestur kecerahan Gunakan gestur untuk mengontrol kecerahan pemutar Pembaruan Acara diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index c868e835ad9..f81b9762fec 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -618,7 +618,6 @@ Slökktu á til að fela lýsigagnareiti með viðbótarupplýsingum um straumhöfund, straumefni eða leitarbeiðni Fjarlæga öll síðugögn úr skyndiminni Bæta svipuðum straumum við biðröðina þegar síðasta er spilað og endurspilun er ekki virkjuð - Birtustigsbending Nota bendingar til að stjórna birtustig spilara Veldu tillögur til að sýna þegar leitað er Endurheimta síðustu spilunarstöðu diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 87382a7bca0..f6ec1375b7b 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -337,7 +337,6 @@ Utenti Disiscriviti Scegli scheda - Gesti controllo luminosità Utilizza i gesti per controllare la luminosità del lettore multimediale Aggiornamenti File eliminato diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3693ac464b9..e812a61b096 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -368,7 +368,6 @@ 停止 最大再試行回数 ダウンロードを中止するまでの最大再試行回数 - 明るさのジェスチャー制御 ジェスチャーを使用して、プレイヤーの明るさを制御します ファイルを削除しました アプリの更新通知 diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml index 0a1e270ce0d..fa9b6a17e74 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -7,7 +7,6 @@ Duduhke saran nalika nggoleki Goleki saran Ngontrol kepadhangan ngaggo gesture - Kontrol kepadhangan nganggo gestur Pokoke teruske muter suara/video Antri otomatis stream bare Sampah metadata wes dibusak diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 0580e30f316..c1347586679 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -115,7 +115,6 @@ მეტა ინფორმაციის ჩვენება სურათის ქეში წაშლილია წაშალეთ ქეშირებული მეტამონაცემები - სიკაშკაშის ჟესტების კონტროლი გამოიყენეთ ჟესტები მოთამაშის სიკაშკაშის გასაკონტროლებლად შეინახეთ საძიებო მოთხოვნები ადგილობრივად ნახვის ისტორია diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index 607eabfa058..164c419fd2b 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -229,7 +229,6 @@ Dema ku lêgerînê pêşniyaran nîşan bidin Pêşniyarên lêgerînê Tevgerên bikar bînin ku ronahiya lîstikvan kontrol bikin - Kontrola tevgera ronahiyê Rêzeya-otomatîkî Bi pêvekirina kanalek pêwendîdar rêza lîstikê ya bidawîkirina (ne-dubare) bidomînin Çemê din ê dixwe-dorê bike diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 4679251044c..716866e7978 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -318,7 +318,6 @@ 모바일 데이터 사용 시 화질 제한 구독 취소 탭 선택 - 제스처 밝기 조작 제스처를 사용하여 플레이어의 밝기 제어 업데이트 트랙 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 1907b5e6717..6e8fc57742f 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -276,7 +276,6 @@ بەکاربەرەکان بەشدارنەبوون هەڵبژاردنی پەڕە - کۆنترۆڵی ڕووناکی بەجوڵەی پەنجە جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما زمانی بنەڕەتی ئەپ نوێکارییەکان diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 505b0bc8592..34a72c1785b 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -342,7 +342,6 @@ Sąraše rodyti atkūrimo vietos indikatorių Vietos sąraše Naudoti gestus ryškumo valdymui - Ryškumo gesto valdymas Auto eilė Tęsti atkūrimą į eilę pridedant susijusius srautus Automatiškai pridėti sekantį į eilę diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 8d0a6aceaed..625dc4e430c 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -504,7 +504,6 @@ Izvēlieties, kādus ieteikumus rādīt, rakstot meklēšanas joslā Meklēšanas ieteikumi Velkot ar pirkstu, mainiet video atskaņošanas spilgtumu - Spilgtuma kontrole, atskaņojot video Automātiski atskaņot Turpināt atskaņot videoklipus, automātiski pievienojot līdzīgus videoklipus Automātiski atskaņot nākošo videoklipu diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 72ea0fd486e..b05015ac397 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -330,7 +330,6 @@ Смали го во прозорче Откажете претплата Одбери јазиче - Гестови за контрола на осветленост Користете гест за контрола на осветленоста Ажурирања Дадотеката е избришана diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 1c21151cc10..e6c0acde160 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -326,7 +326,6 @@ സെർച്ച് ചെയ്യുമ്പോൾ നിർദ്ദേശങ്ങൾ തിരഞ്ഞെടുക്കുക സെർച്ച് നിർദ്ദേശങ്ങൾ ആംഗ്യത്തിലൂടെ പ്ലയറിലെ പ്രകാശം നിയന്ത്രിക്കാം - ആംഗ്യത്തിലൂടെ പ്രകാശം നിയന്ത്രിക്കുക തീരാറായ പ്ലേബാക്ക് ക്യൂവിനെ മറ്റൊരു അനുബന്ധ സ്‌ട്രീമുമായി കൂട്ടിച്ചേർത്ത് തുടരുക അടുത്ത സ്ട്രീം ഓട്ടോക്യൂ ചെയ്യുക കാഷെ ആയ മെറ്റാഡേറ്റ തുടച്ചുനീക്കി diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index fd19745a1f6..3417ef5434c 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -65,7 +65,6 @@ Cache metadata dihapuskan Automatik beratur strim seterusnya Tambahkan secara automatik strim berkaitan apabila memain strim terakhir dalam giliran tidak berulang. - Kontrol gestur kecerahan Gunakan gestur untuk melaraskan kecerahan pemain Cadangan carian Tunjukkan cadangan semasa mencari diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index d4b979779b9..3fc842dd481 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -334,7 +334,6 @@ Tilbakestill Opphev abonnement Velg fane - Håndvendingskontroll for lysstyrke Bruk håndvendinger for å kontrollere avspillerens lysstyrke Oppdateringer Hendelser diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 476789b8a7b..8453c568c02 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -66,7 +66,6 @@ मेटाडाटा क्यास सखाप स्वतः लाम अर्को स्ट्रिम अन्त्य (गैर-दोहरो) प्लेब्याक लाम सम्बन्धित धारा स्थिति थप्दै जारी राख्न - चमक इशारा नियन्त्रण प्लेयरको चमक नियन्त्रण गर्न इशाराहरू प्रयोग खोज सुझावहरू खोजी गर्दा सुझावहरू देखाउन diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index f4aaadf28af..348a9952116 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -334,7 +334,6 @@ Gebruikers Abonnement opzeggen Kiest een tabblad - Veegbesturing voor helderheid Gebruik gebaren om de helderheid van de speler aan te passen Updates Gebeurtenissen diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index d567c6a1983..1790a3cd632 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -334,7 +334,6 @@ Gebruikers Afmelden Kies tabblad - Gebaarbesturing voor helderheid Gebruik gebaren om de helderheid van de speler aan te passen Bijwerken Bestand verwijderd diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 25e83aec710..82add3736c1 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -220,7 +220,6 @@ କିଛି ନୁହେଁ ଡିଫଲ୍ଟ ଭିଡିଓ ଫର୍ମାଟ୍ ପପ୍ଅପ୍ ଗୁଣଗୁଡିକ ମନେରଖ - ଉଜ୍ଜ୍ୱଳତା ଅଙ୍ଗଭଙ୍ଗୀ ନିୟନ୍ତ୍ରଣ ପ୍ରକ୍ରିୟାକରଣ… କିଛି ସମୟ ନେଇପାରେ ପ୍ଲେୟାର କ୍ୟାପସନ୍ ଟେକ୍ସଟ୍ ସ୍କେଲ୍ ଏବଂ ପୃଷ୍ଠଭୂମି ଶୈଳୀକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ । କାର୍ଯ୍ୟକାରୀ ହେବାକୁ ଆପ୍ ପୁନଃଆରମ୍ଭ ଆବଶ୍ୟକ କରେ LeakCanary ଉପଲବ୍ଧ ନାହିଁ diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 7413072eb25..33e11ba664c 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -332,7 +332,6 @@ ਯੂਜ਼ਰਸ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ ਟੈਬ ਚੁਣੋ - ਸਕ੍ਰੀਨ ਲਾਈਟ ਸ਼ਵਾਵਾਂ ਕੰਟਰੋਲ ਵੀਡੀਓ ਸਕ੍ਰੀਨ ਦੀ ਚਮਕ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ ਮੂਲ ਭਾਸ਼ਾ ਸਮੱਗਰੀ ਅਪਡੇਟਾਂ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 4d82b79e3b2..041ec180824 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -340,7 +340,6 @@ Zminimalizuj do odtwarzacza w trybie okienkowym Odsubskrybuj Wybierz kartę - Kontrola jasności gestami Używaj gestów do sterowania jasnością odtwarzacza Aktualizacje Usunięto plik diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 5bfe1a9efe1..e4490e8a60f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -336,7 +336,6 @@ Usuários Cancelar inscrição Selecionar aba - Gesto para brilho Use gestos para mudar brilho do player Debug Atualizações diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 8601d02dee0..4ed58311d3b 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -255,7 +255,6 @@ A obter informação… Sugestões de pesquisa Definir como miniatura da lista de reprodução - Gestos para controlo de brilho Abrir menu %s subscritor diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 853791fda6c..c213d3aa478 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -337,7 +337,6 @@ Ativar reprodutor \'popup\' Cancelar subscrição Escolher separador - Gestos para controlo de brilho Utilizar gestos para controlar o brilho do reprodutor Atualizações Ficheiro eliminado diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 8218853fccd..1e6c12649ec 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -277,7 +277,6 @@ Refuzați Dezabonare Alegeți fila - Controlul prin gesturi a luminozității Utilizați gesturi pentru a controla luminozitatea Actualizări Evenimente diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7910b1bff2c..83b16b297bd 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -351,7 +351,6 @@ Сетка Автоматически Менять яркость плеера жестом - Жест яркости Загрузка на SD-карту невозможна. Сбросить расположение папки загрузки\? SD-карта недоступна Вкладки, видимые на главной странице diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index bd9751eb2f8..e50bb922c6f 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -468,7 +468,6 @@ Issèbera sos consìgios de ammustrare in sas chircas Cussìgios de chirca Imprea sos gestos pro controllare sa luminosidade de su riproduidore - Gestos de controllu de sa luminosidade Sighi a riproduire (chene ripetitziones) annanghende unu vìdeu correladu a sa lista Annanghe in automàticu su flussu imbeniente a sa lista Memòria temporànea de sos metadatos iscarrigada diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 25a7249dca5..b0852fff277 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -337,7 +337,6 @@ Prehrávať v okne Zrušiť odber Zvoliť panel - Ovládanie jasu gestom Použivať gestá pre ovládanie jasu Aktualizácie Udalosti diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index da08ca40cbe..465368722d4 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -435,7 +435,6 @@ Samodejno predvajanje Pokaži indikator položaja predvajalnika na seznamih Uporabi poteze za nadzor svetlosti predvajalnika - Poteza za nadzor svetlosti Izklopite, če želite skriti opis videa in dodatnih informacij Prikaži opis Prikazujem rezultate za %s diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index 076164ce141..50a4d373ed3 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -395,7 +395,6 @@ Dooro soojeedinada lasoo bandhigo marka wax la raadinayo Soojeedinada raadinta Isticmaal fartaada adigoo shaashada farta dhinac kaga jiidaya si aad u maamusho iftiinka - Maamulista iftiinka (farta) Hormada isutalisa Sii wad dhamaystirka (mida aan isku celcelinin) hormada shidan ayadoo lagu sii darayo waxyaabo la xidhiidha shayga daaran Ku xiji hormada shayga xiga diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 19582337838..00ffbc5a9ee 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -483,7 +483,6 @@ Historia e kërkimit Shfaq sugjerime kur jeni duke kërkuar Përdorni gjestet për të kontrolluar ndriçimin e luajtësit - Kontrolli i gjesteve të ndriçimit Vazhdoje radhën e luajtjes së mbarueshme (e papërsëritur) duke shtuar një stream të ngjashëm Auto-radhit stream-in e radhës Depoja e të dhënave meta u boshatis diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 1fdb2ec1a46..dc54c783317 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -498,7 +498,6 @@ Вратите последњу позицију репродукције Наставак репродукције Користите покрете за контролу осветљаја - Контрола осветљености потезом Самостално заказивање Наставите да завршавате (не понављајући) ред репродукције додавањем повезаног стрима Самостално закажи следећи ток diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 47fc57724d1..8ff6c3602a9 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -334,7 +334,6 @@ Minimera till popup-spelare Sluta prenumerera Välj flik - Gestkontroll för ljusstyrka Använd gester för att justera ljusstyrkan Uppdateringar Fil raderad diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 52b75e33996..399f843e67b 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -157,7 +157,6 @@ ஒரு பிழை நிகழ்ந்தது: %1$s காணொளிக் கோப்புகள் பக்கத்தை தேர்வு செய் - வெளிச்ச கட்டுப்பாடு செய்கை இயக்கி ஒளிர்வைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து புதுப்பித்தல்கள் கோப்பு அழிக்கப்பட்டது diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 9890f32a113..405239bc2d5 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -214,7 +214,6 @@ కాష్ చేయబడిన మెటాడేటాను తుడిచివేయండి కాష్ చేసిన వెబ్‌పేజీ డేటా మొత్తాన్ని తీసివేయండి మెటాడేటా కాష్ తుడిచివేయబడింది - ప్రకాశం సంజ్ఞ నియంత్రణ సూచనలను శోధించండి శోధన చరిత్ర శోధన ప్రశ్నలను స్థానికంగా నిల్వ చేయండి diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 33955f7e096..f29b304f0fd 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -64,7 +64,6 @@ ลบข้อมูลเว็บเพจที่แคชไว้ทั้งหมด คิววีดีโอถัดไปโดยอัตโนมัติ ต่อท้ายวีดีโอที่เกี่ยวข้องโดยอัตโนมัติเมื่อเล่นถึงรายการสุดท้ายในกรณีที่ไม่ได้ตั้งให้เล่นซ้ำ - การควบคุมความสว่างด้วยท่าทาง ใช้ท่าทางสัมผัสเพื่อควบคุมความสว่างของเครื่องเล่น คำแนะนำการค้นหา แสดงคำแนะนำเมื่อทำการค้นหา diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 0822b2463cf..eafbe31c943 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -330,7 +330,6 @@ Kullanıcılar Abonelikten çık Sekmeyi Seçin - Hareketli parlaklık denetimi Oynatıcının parlaklığını denetlemek için hareketleri kullan Güncellemeler Dosya silindi diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 77de33629a5..7a53ff854e1 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -345,7 +345,6 @@ Сiтка Відписатися Обрати вкладку - Жест керування яскравістю Змінювати яскравість програвача жестами Оновлення Події diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 9a558c85cc5..8218cc21d4c 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -327,7 +327,6 @@ صارفین رکنیت چھوڑیں ٹیب منتخب کریں - چمک کا متحرک کنٹرول پلیئرکی چمک کو کنٹرول کرنے کیلئے اشاروں کا استعمال کریں مشمولات کی طےشدہ زبان تازہ کاریاں diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index a306e8abd74..633772f8a48 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -329,7 +329,6 @@ Thu nhỏ vào trình phát popup Hủy đăng ký Chọn tab - Điều khiển độ sáng bằng cử chỉ Sử dụng cử chỉ để điều chỉnh độ sáng Cập nhật Sự kiện diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 25b25c1f417..c7e1171cd63 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -350,7 +350,6 @@ 曲目 用户 选择标签 - 手势控制亮度 使用手势控制播放器的亮度 视频默认语言 应用更新通知 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 7c10e963f5e..4da9ca17778 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -169,7 +169,6 @@ 顯示描述 抹除咗影像快取 移除所有網頁嘅快取資料 - 光暗手勢控制 關閉佢去避免載入條片嘅縮圖,慳返啲數據同埋用少啲 RAM。更改會抹走記憶體以及磁碟機上面嘅影像快取 粗略嘅快轉允許播放器比較籠統咁快轉去其他位置。快轉 5、15 或 25 秒就太仔細,做唔到 播放器 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 9b845339ce7..a141fb9e591 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -328,7 +328,6 @@ 使用者 取消訂閱 選擇分頁 - 亮度手勢控制 使用手勢控制播放器亮度 更新 已刪除檔案 From 41038f452dbae927c1d63ce9f25e69bfb1a9eb83 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 6 May 2023 02:01:54 +0200 Subject: [PATCH 181/645] Remove translations of previously deleted string brightness_gesture_control_summary --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-az/strings.xml | 1 - app/src/main/res/values-b+ast/strings.xml | 1 - app/src/main/res/values-b+uz+Latn/strings.xml | 1 - app/src/main/res/values-be/strings.xml | 1 - app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-bn-rBD/strings.xml | 1 - app/src/main/res/values-bn-rIN/strings.xml | 1 - app/src/main/res/values-bn/strings.xml | 1 - app/src/main/res/values-bs/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-ckb/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-eo/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fil/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-jv/strings.xml | 1 - app/src/main/res/values-ka/strings.xml | 1 - app/src/main/res/values-kmr/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-ku/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-lv/strings.xml | 1 - app/src/main/res/values-mk/strings.xml | 1 - app/src/main/res/values-ml/strings.xml | 1 - app/src/main/res/values-ms/strings.xml | 1 - app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-ne/strings.xml | 1 - app/src/main/res/values-nl-rBE/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sc/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sl/strings.xml | 1 - app/src/main/res/values-so/strings.xml | 1 - app/src/main/res/values-sq/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-ta/strings.xml | 1 - app/src/main/res/values-te/strings.xml | 1 - app/src/main/res/values-th/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-ur/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - 72 files changed, 72 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index bb70e5833f1..66ca28ea1f5 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -346,7 +346,6 @@ المستخدمين إلغاء الاشتراك اختر علامة التبويب - استخدام الإيماءات للتحكم بسطوع المشغّل التحديثات تم حذف الملف تنبيه تحديث التطبيق diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index d9e079ae1f5..bcd5564dfc8 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -61,7 +61,6 @@ Axtarış tarixçəsi Axtarış zamanı göstərmək üçün təklifləri seç Axtarış təklifləri - Oynadıcı parlaqlığını nizamlamaq üçün jestlər istifadə et Avto-növbələ Növbəti Yayımı Avto-növbələ Üst məlumat keşi silindi diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index 18dcb00482d..f9c6109e6b5 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -150,7 +150,6 @@ Llistes de reproducción Pistes Usuarios - Usa xestos pa controlar el brillu del reproductor Reafitamientu de valores El númberu de soscriptores nun ta disponible Anovamientos diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index 202367eaddd..affa805e6d2 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -17,7 +17,6 @@ Hech qanday translatsiya pleyeri topilmadi. VLC o\'rnatilsinmi\? %1$s tomonidan e‘lon qilingan Boshlash uchun \"Izlash\" tugmasini bosing - Player yorqinligini boshqarish uchun imo-ishoralardan foydalaning Avto-navbat Tegishli stream qo\'shib, ijro etish navbatini tugatishni (takrorlanmaydigan) davom ettirish avtomatik navbat next stream diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 38607ac641a..276c78176d4 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -338,7 +338,6 @@ Плэер у акне Адпісацца Абярыце ўкладку - Мяняць яркасць плэера жэстамі Абнаўленні Файл выдалены Апавяшчэнне аб абнаўленні праграмы diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 30eb4fbc971..75297e9b3bb 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -335,7 +335,6 @@ Насили докладването на неизпращаеми Rx изключения извън фрагмента или кръговрата на активност след приключване Откачи (може да предизвика промени) Отписване - Използвай жестове за контрол на яркостта Файлът е изтрит Събития Показвай коментари diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 29b987e25a2..4e6655e4525 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -147,7 +147,6 @@ ক্যাশ করা মেটাডেটা মোছ মেটাডেটা ক্যাশ মোছা হয়েছে পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করো - প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো সম্পন্ন তালিকা তালিকা আকারে সাজাও diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index bfbe9c50b86..162dfde396a 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -74,7 +74,6 @@ ডাউনলোড ইতিহাস খোজ ইতিহাস - প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index dbe51285aa9..b0887510ee3 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -220,7 +220,6 @@ খোজ ইতিহাস সার্চ করার সময় দেখানোর জন্য সাজেশন বেছে নিন সার্চ পরামর্শ - প্লেয়ারের উজ্জ্বলতা নিয়ন্ত্রণ করতে সংকেত ব্যবহার করো পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 8587c443656..50dcf839cb6 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -91,7 +91,6 @@ Nastavite završni (ne-ponavljajući) reprodukcijski red privlakom srodnog prijenosa Automatsko redanje Prijedlozi za pretragu - Koristite pokrete za kontrolu svjetline pokretača Odaberite prijedloge koje želite prikazati prilikom pretrage Lokalni prijedlozi za pretraživanje Razdaljeni prijedlozi za pretraživanje diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index e627828a402..010823e4333 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -333,7 +333,6 @@ Pistes Usuaris Trieu una pestanya - Fes servir gestos per controlar la brillantor del reproductor Actualitzacions S\'ha eliminat el fitxer L\'emmagatzematge extern no està disponible diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index ae1f4d21220..f761323f9b5 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -327,7 +327,6 @@ ناتوانیت گۆڕانكاری له‌م به‌ژدارییه‌دا بكه‌یت قه‌باره‌ی بنەڕەتی بچووککردنەوە بۆ پەنجەرە - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما گۆرانییەکان دابه‌زاندنی فایلی پەخش شێوازی پیشاندانی خشتە diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 603b71aab5f..6380ffc2a0a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -337,7 +337,6 @@ Minimalizovat přehrávač do vyskakovacího okna Přestat odebírat Zvolit panel - Používat gesta pro ovládání jasu přehrávače Aktualizace Soubor smazán Oznámení o aktualizaci aplikace diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 07b3956dce6..28cf01af065 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -65,7 +65,6 @@ Metadata-cache slettet Føj automatisk næste stream til køen Fortsæt en afspilningskø, der afsluttes (ikke-gentagende), ved at tilføje en lignende stream - Brug fingerbevægelser til at justere afspillerens lysstyrke Søgeforslag Vælg forslagene, der vises, når der søges Søgehistorik diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ed8dbd1d963..735c16fab68 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -336,7 +336,6 @@ Benutzer Deabonnieren Tab wählen - Gesten verwenden, um die Helligkeit einzustellen Aktualisierungen Wiedergabebenachrichtigung Konfiguriert die Benachrichtigung zum aktuell abgespielten Stream diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index ddedc31ed5a..b74d5eb0c7d 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -334,7 +334,6 @@ Ελαχιστοποίηση σε αναδυόμενο παράθυρο Απεγγραφή Επιλογή Καρτέλας - Χρησιμοποιήστε χειρονομίες για τον έλεγχο φωτεινότητας Ενημερώσεις Συμβάντα Το αρχείο διαγράφηκε diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 76666606692..a3a7a6af430 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -202,7 +202,6 @@ Uzantoj Malaboni Elektu ongleton - Uzi gestojn por kontroli la brilon Ĝisdatigoj Dosiero forviŝita Sciigo por ĝisdatigi apon diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 04a674ac95e..eb7584813a5 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -390,7 +390,6 @@ El \'Sistema de Acceso al Almacenamiento\' permite descargar en una tarjeta SD externa Desuscribirse Elija la pestaña - Usar gestos para controlar el brillo del reproductor Actualizaciones Eventos Notificación de actualización de la aplicación diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 405b24357d8..3fe9abd5f24 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -334,7 +334,6 @@ Jõusta väljaspool fragmenti või elutsüklit olevate kättetoimetamatute Rx erindite raporteerimine nende vabastamise järgselt Lõpeta tellimine Vali vahekaart - Kasuta viipeid heleduse reguleerimiseks Uuendused Sündmused Fail kustutati diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 431430e8b4f..ea4af6b0a1f 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -334,7 +334,6 @@ Erabiltzaileak Kendu harpidetza Hautatu fitxa - Erabili keinuak erreproduzigailuaren distira kontrolatzeko Eguneraketak Gertaerak Fitxategia ezabatu da diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 3cc525b8def..fd65ce27d57 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -280,7 +280,6 @@ نمایش نکته «برای صف‌گذاری، نگه‌دارید» نمایش راهنما هنگام فشردن پس زمینه یا دکمهٔ تصویر در تصویر در «جزییات:» ویدیو برای در صف قرار دادن، نگه دارید - از اشارات برای کنترل روشنایی استفاده شود بازگردانی چی:\\nدرخواست:\\nزبان محتوا:\\nکشور محتوا:\\nزبان اپ:\\nخدمت:\\nزمان GMT\\nپکیج:T:\\nنسخه:\\nنسخه‌اندروید: چالش ری‌کپچا diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 1320257b433..8caf6bf0b69 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -391,7 +391,6 @@ Tietojen tyhjennys Jatka toistoa Palvelujen alkuperäiset tekstit näkyvät suoratoistettavassa sisällössä - Käytä eleitä ohjataksesi soittimen kirkkautta Poista käytöstä piilottaaksesi kommentit Toistokohdat poistettu Poistetaanko kaikki toistokohdat\? diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index 6cc32a9feba..4cafaff85bd 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -88,7 +88,6 @@ Ipakita ang pananda ng posisyon ng pag-play sa mga listahan Mga posisyon sa listahan Kasaysayan ng mga hinanap - Gumamit ng gesture para kontrolin ang liwanag ng player Linisin ang naka-cache na metadata Nalinis na ang image cache Patayin para itago ang mga komento diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index add1ef41f00..f9372811fca 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -337,7 +337,6 @@ Réduire vers le lecteur flottant Se désabonner Sélectionner un onglet - Utiliser des gestes pour contrôler la luminosité du lecteur Mises à jour Fichier supprimé Notification de mise à jour de l’application diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index ee3a849d979..3dc0d4794ee 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -453,7 +453,6 @@ A actualización de NewPipe está dispoñible! Automático Mostra os indicadores de posición de reprodución nas listas - Use xestos para controlar o brillo do reprodutor Rede Lista Modo de visualización da lista diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 3b88c8d2a9a..e44cc580aae 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -327,7 +327,6 @@ הקטנה לנגן צף ביטול מינוי בחירת לשונית - שימוש במחוות כדי לשלוט בבהירות הנגן עדכונים קובץ נמחק התראת עדכון יישומון diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 7d84350573c..cb8ddc3b8d4 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -326,7 +326,6 @@ अनसब्सक्राईब करें टैब चुने कतारबद्ध करें - वीडियो चालक की चमक को नियंत्रित करने के लिए इशारो का इस्तेमाल करें अपडेट फाइल मिटा दी गयी ऐप अपडेट अधिसूचना diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 2bb6d28d65f..ed64e5078ed 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -317,7 +317,6 @@ Metapodaci su izbrisani Automatski dodaj sljedeći stream u popisa izvođenja Nastavi završavati (ne ponavljajući) popis reprodukcija dodavanjem povezanog streama - Koristi gesture za upravljanje svjetlinom playera Zadana zemlja sadržaja Otkrivanje grešaka Obavijest o novoj verziji programa diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 1f333514988..6f777991529 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -332,7 +332,6 @@ Adatok törlése Lejátszási pozíciók megjelenítése a listákban Pozíciók a listákban - Gesztusok használata a fényerő szabályozásához Meg fogja kérdezni, hogy hova mentse el az egyes letöltéseket. \nEngedélyezze a rendszermappa-választót (SAF), ha külső SD-kártyára akar letölteni Kérdezze meg, hova töltse le diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 0104c7c4411..f7bba45737f 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -328,7 +328,6 @@ Berhenti Berlanggan Pilih Tab Tema - Gunakan gestur untuk mengontrol kecerahan pemutar Pembaruan Acara Berkas dihapus diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index f81b9762fec..1d6804eaed4 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -618,7 +618,6 @@ Slökktu á til að fela lýsigagnareiti með viðbótarupplýsingum um straumhöfund, straumefni eða leitarbeiðni Fjarlæga öll síðugögn úr skyndiminni Bæta svipuðum straumum við biðröðina þegar síðasta er spilað og endurspilun er ekki virkjuð - Nota bendingar til að stjórna birtustig spilara Veldu tillögur til að sýna þegar leitað er Endurheimta síðustu spilunarstöðu Spilunarstöður í listum diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f6ec1375b7b..fdb28c573a1 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -337,7 +337,6 @@ Utenti Disiscriviti Scegli scheda - Utilizza i gesti per controllare la luminosità del lettore multimediale Aggiornamenti File eliminato Notifiche per aggiornamenti dell\'app diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e812a61b096..e6f7b7b83e5 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -368,7 +368,6 @@ 停止 最大再試行回数 ダウンロードを中止するまでの最大再試行回数 - ジェスチャーを使用して、プレイヤーの明るさを制御します ファイルを削除しました アプリの更新通知 外部 SD カードにダウンロードできません。ダウンロードフォルダーの場所をリセットしますか\? diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml index fa9b6a17e74..2f68f9bc969 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -6,7 +6,6 @@ Riwayatmu biyen cuk Duduhke saran nalika nggoleki Goleki saran - Ngontrol kepadhangan ngaggo gesture Pokoke teruske muter suara/video Antri otomatis stream bare Sampah metadata wes dibusak diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index c1347586679..81aae3ac826 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -115,7 +115,6 @@ მეტა ინფორმაციის ჩვენება სურათის ქეში წაშლილია წაშალეთ ქეშირებული მეტამონაცემები - გამოიყენეთ ჟესტები მოთამაშის სიკაშკაშის გასაკონტროლებლად შეინახეთ საძიებო მოთხოვნები ადგილობრივად ნახვის ისტორია განაახლეთ დაკვრა diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index 164c419fd2b..41f2742ab27 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -228,7 +228,6 @@ Dîroka lêgerînê Dema ku lêgerînê pêşniyaran nîşan bidin Pêşniyarên lêgerînê - Tevgerên bikar bînin ku ronahiya lîstikvan kontrol bikin Rêzeya-otomatîkî Bi pêvekirina kanalek pêwendîdar rêza lîstikê ya bidawîkirina (ne-dubare) bidomînin Çemê din ê dixwe-dorê bike diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 716866e7978..49ea9cf0f6b 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -318,7 +318,6 @@ 모바일 데이터 사용 시 화질 제한 구독 취소 탭 선택 - 제스처를 사용하여 플레이어의 밝기 제어 업데이트 트랙 사용자 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 6e8fc57742f..8d1ffbab84e 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -276,7 +276,6 @@ بەکاربەرەکان بەشدارنەبوون هەڵبژاردنی پەڕە - جوڵەی پەنجەت لەسەر ڕوونما بەکاربهێنە بۆ گۆڕینی ئاستی ڕووناکی ڕوونما زمانی بنەڕەتی ئەپ نوێکارییەکان فایل سڕایەوە diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 34a72c1785b..30fae7787ed 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -341,7 +341,6 @@ Išvalyti duomenis Sąraše rodyti atkūrimo vietos indikatorių Vietos sąraše - Naudoti gestus ryškumo valdymui Auto eilė Tęsti atkūrimą į eilę pridedant susijusius srautus Automatiškai pridėti sekantį į eilę diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 625dc4e430c..bef5ac47830 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -503,7 +503,6 @@ Meklēšanas vēsture Izvēlieties, kādus ieteikumus rādīt, rakstot meklēšanas joslā Meklēšanas ieteikumi - Velkot ar pirkstu, mainiet video atskaņošanas spilgtumu Automātiski atskaņot Turpināt atskaņot videoklipus, automātiski pievienojot līdzīgus videoklipus Automātiski atskaņot nākošo videoklipu diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index b05015ac397..524c82aef81 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -330,7 +330,6 @@ Смали го во прозорче Откажете претплата Одбери јазиче - Користете гест за контрола на осветленоста Ажурирања Дадотеката е избришана Известување за ажурирање на апликација diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index e6c0acde160..d75570d45a4 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -325,7 +325,6 @@ അന്വേഷണ ചരിത്രം സെർച്ച് ചെയ്യുമ്പോൾ നിർദ്ദേശങ്ങൾ തിരഞ്ഞെടുക്കുക സെർച്ച് നിർദ്ദേശങ്ങൾ - ആംഗ്യത്തിലൂടെ പ്ലയറിലെ പ്രകാശം നിയന്ത്രിക്കാം തീരാറായ പ്ലേബാക്ക് ക്യൂവിനെ മറ്റൊരു അനുബന്ധ സ്‌ട്രീമുമായി കൂട്ടിച്ചേർത്ത് തുടരുക അടുത്ത സ്ട്രീം ഓട്ടോക്യൂ ചെയ്യുക കാഷെ ആയ മെറ്റാഡേറ്റ തുടച്ചുനീക്കി diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 3417ef5434c..648849205ab 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -65,7 +65,6 @@ Cache metadata dihapuskan Automatik beratur strim seterusnya Tambahkan secara automatik strim berkaitan apabila memain strim terakhir dalam giliran tidak berulang. - Gunakan gestur untuk melaraskan kecerahan pemain Cadangan carian Tunjukkan cadangan semasa mencari Sejarah carian diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 3fc842dd481..e96008e143e 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -334,7 +334,6 @@ Tilbakestill Opphev abonnement Velg fane - Bruk håndvendinger for å kontrollere avspillerens lysstyrke Oppdateringer Hendelser Fil slettet diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 8453c568c02..05c82808ee7 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -66,7 +66,6 @@ मेटाडाटा क्यास सखाप स्वतः लाम अर्को स्ट्रिम अन्त्य (गैर-दोहरो) प्लेब्याक लाम सम्बन्धित धारा स्थिति थप्दै जारी राख्न - प्लेयरको चमक नियन्त्रण गर्न इशाराहरू प्रयोग खोज सुझावहरू खोजी गर्दा सुझावहरू देखाउन खोज इतिहास diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 348a9952116..bf77f9da317 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -334,7 +334,6 @@ Gebruikers Abonnement opzeggen Kiest een tabblad - Gebruik gebaren om de helderheid van de speler aan te passen Updates Gebeurtenissen Bestand verwijderd diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 1790a3cd632..e65d013d0f7 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -334,7 +334,6 @@ Gebruikers Afmelden Kies tabblad - Gebruik gebaren om de helderheid van de speler aan te passen Bijwerken Bestand verwijderd App update melding diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 82add3736c1..3e3e1fd5cff 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -106,7 +106,6 @@ ବର୍ଣ୍ଣନା ଦେଖାନ୍ତୁ ପ୍ରତିଛବି କ୍ୟାଚ୍ ପୋଛି ଦିଆଗଲା ମେଟାଡାଟା କ୍ୟାଚ୍ ପୋଛି ହୋଇଗଲା - ପ୍ଲେୟାରର ଉଜ୍ଜ୍ୱଳତାକୁ ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବ୍ୟବହାର କରନ୍ତୁ ପରାମର୍ଶ ଖୋଜ ସ୍ଥାନୀୟ ସନ୍ଧାନ ପରାମର୍ଶ ସୁଦୂର ସନ୍ଧାନ ପରାମର୍ଶ diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 33e11ba664c..17e0156096c 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -332,7 +332,6 @@ ਯੂਜ਼ਰਸ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ ਟੈਬ ਚੁਣੋ - ਵੀਡੀਓ ਸਕ੍ਰੀਨ ਦੀ ਚਮਕ ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਸ਼ਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ ਮੂਲ ਭਾਸ਼ਾ ਸਮੱਗਰੀ ਅਪਡੇਟਾਂ ਫਾਈਲ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 041ec180824..79c270ce6bd 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -340,7 +340,6 @@ Zminimalizuj do odtwarzacza w trybie okienkowym Odsubskrybuj Wybierz kartę - Używaj gestów do sterowania jasnością odtwarzacza Aktualizacje Usunięto plik Powiadomienie o aktualizacji aplikacji diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index e4490e8a60f..463d222f605 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -336,7 +336,6 @@ Usuários Cancelar inscrição Selecionar aba - Use gestos para mudar brilho do player Debug Atualizações Eventos diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 4ed58311d3b..d17da454932 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -474,7 +474,6 @@ Escolha uma instância Limpar todos os dados da página web Fechar menu - Utilizar gestos para controlar o brilho do reprodutor Remover visualizados Carácter de substituição Vídeo diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index c213d3aa478..0b3180a1573 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -337,7 +337,6 @@ Ativar reprodutor \'popup\' Cancelar subscrição Escolher separador - Utilizar gestos para controlar o brilho do reprodutor Atualizações Ficheiro eliminado Notificação de nova versão diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 1e6c12649ec..9e8d9b30617 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -277,7 +277,6 @@ Refuzați Dezabonare Alegeți fila - Utilizați gesturi pentru a controla luminozitatea Actualizări Evenimente Fișier șters diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 83b16b297bd..b4ac25bc466 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -350,7 +350,6 @@ Список Сетка Автоматически - Менять яркость плеера жестом Загрузка на SD-карту невозможна. Сбросить расположение папки загрузки\? SD-карта недоступна Вкладки, видимые на главной странице diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index e50bb922c6f..4a2797b7535 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -467,7 +467,6 @@ Cronologia de sas chircas Issèbera sos consìgios de ammustrare in sas chircas Cussìgios de chirca - Imprea sos gestos pro controllare sa luminosidade de su riproduidore Sighi a riproduire (chene ripetitziones) annanghende unu vìdeu correladu a sa lista Annanghe in automàticu su flussu imbeniente a sa lista Memòria temporànea de sos metadatos iscarrigada diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index b0852fff277..282b1869873 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -337,7 +337,6 @@ Prehrávať v okne Zrušiť odber Zvoliť panel - Použivať gestá pre ovládanie jasu Aktualizácie Udalosti Súbor vymazaný diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 465368722d4..7e89a1ed5e6 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -434,7 +434,6 @@ Pokaži nasvet, ko boste pritisnili na ozadje ali pojavno okno v \"Podrobnosti:\" Samodejno predvajanje Pokaži indikator položaja predvajalnika na seznamih - Uporabi poteze za nadzor svetlosti predvajalnika Izklopite, če želite skriti opis videa in dodatnih informacij Prikaži opis Prikazujem rezultate za %s diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index 50a4d373ed3..b2ec76d7757 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -394,7 +394,6 @@ Wixii laraadiyay Dooro soojeedinada lasoo bandhigo marka wax la raadinayo Soojeedinada raadinta - Isticmaal fartaada adigoo shaashada farta dhinac kaga jiidaya si aad u maamusho iftiinka Hormada isutalisa Sii wad dhamaystirka (mida aan isku celcelinin) hormada shidan ayadoo lagu sii darayo waxyaabo la xidhiidha shayga daaran Ku xiji hormada shayga xiga diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 00ffbc5a9ee..75e4daac19f 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -482,7 +482,6 @@ Ruani frazat e kërkuara lokalisht Historia e kërkimit Shfaq sugjerime kur jeni duke kërkuar - Përdorni gjestet për të kontrolluar ndriçimin e luajtësit Vazhdoje radhën e luajtjes së mbarueshme (e papërsëritur) duke shtuar një stream të ngjashëm Auto-radhit stream-in e radhës Depoja e të dhënave meta u boshatis diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index dc54c783317..208b7f6e948 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -497,7 +497,6 @@ Позиције на листама Вратите последњу позицију репродукције Наставак репродукције - Користите покрете за контролу осветљаја Самостално заказивање Наставите да завршавате (не понављајући) ред репродукције додавањем повезаног стрима Самостално закажи следећи ток diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 8ff6c3602a9..b3e0932b079 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -334,7 +334,6 @@ Minimera till popup-spelare Sluta prenumerera Välj flik - Använd gester för att justera ljusstyrkan Uppdateringar Fil raderad Avisering för appuppdatering diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 399f843e67b..0a4f3067067 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -157,7 +157,6 @@ ஒரு பிழை நிகழ்ந்தது: %1$s காணொளிக் கோப்புகள் பக்கத்தை தேர்வு செய் - இயக்கி ஒளிர்வைக் கட்டுப்படுத்த சைகையைப் பயன்படுத்து புதுப்பித்தல்கள் கோப்பு அழிக்கப்பட்டது செயலி புதுப்பித்தல் அறிவிப்பு diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 405239bc2d5..2351be26324 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -186,7 +186,6 @@ పాప్అప్ చివరి పరిమాణం మరియు స్థానాన్ని గుర్తుంచుకోండి వీడియో వివరణ మరియు అదనపు సమాచారాన్ని దాచడాన్ని ఆఫ్ చేయండి స్ట్రీమ్ సృష్టికర్త, స్ట్రీమ్ కంటెంట్ లేదా శోధన అభ్యర్థన గురించి అదనపు సమాచారంతో మెటా సమాచార పెట్టెలను దాచడానికి ఆఫ్ చేయండి - ప్లేయర్ ప్రకాశాన్ని నియంత్రించడానికి సంజ్ఞలను ఉపయోగించండి శోధిస్తున్నప్పుడు చూపాల్సిన సూచనలను ఎంచుకోండి చివరి ప్లేబ్యాక్ స్థానాన్ని పునరుద్ధరించండి మీకు ఇష్టమైన పీర్‌ట్యూబ్ సందర్భాలను ఎంచుకోండి diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index f29b304f0fd..2b31bb98815 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -64,7 +64,6 @@ ลบข้อมูลเว็บเพจที่แคชไว้ทั้งหมด คิววีดีโอถัดไปโดยอัตโนมัติ ต่อท้ายวีดีโอที่เกี่ยวข้องโดยอัตโนมัติเมื่อเล่นถึงรายการสุดท้ายในกรณีที่ไม่ได้ตั้งให้เล่นซ้ำ - ใช้ท่าทางสัมผัสเพื่อควบคุมความสว่างของเครื่องเล่น คำแนะนำการค้นหา แสดงคำแนะนำเมื่อทำการค้นหา ประวัติการค้นหา diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index eafbe31c943..f1e678426e4 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -330,7 +330,6 @@ Kullanıcılar Abonelikten çık Sekmeyi Seçin - Oynatıcının parlaklığını denetlemek için hareketleri kullan Güncellemeler Dosya silindi Uygulama güncelleme bildirimi diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 7a53ff854e1..d5c88ae2ba3 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -345,7 +345,6 @@ Сiтка Відписатися Обрати вкладку - Змінювати яскравість програвача жестами Оновлення Події Файл видалено diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 8218cc21d4c..6d8b538aac2 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -327,7 +327,6 @@ صارفین رکنیت چھوڑیں ٹیب منتخب کریں - پلیئرکی چمک کو کنٹرول کرنے کیلئے اشاروں کا استعمال کریں مشمولات کی طےشدہ زبان تازہ کاریاں فائل حذف ہوگئی diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 633772f8a48..fcb5324352b 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -329,7 +329,6 @@ Thu nhỏ vào trình phát popup Hủy đăng ký Chọn tab - Sử dụng cử chỉ để điều chỉnh độ sáng Cập nhật Sự kiện Đã xóa tập tin diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c7e1171cd63..9dadccfae09 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -350,7 +350,6 @@ 曲目 用户 选择标签 - 使用手势控制播放器的亮度 视频默认语言 应用更新通知 NewPipe 新版本的通知 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 4da9ca17778..49996f06ade 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -138,7 +138,6 @@ 隨機播放 緩衝緊 空寥寥 - 用手勢去控制播放器光暗 本機搜尋建議 遠端搜尋建議 喺本機儲低搵過嘅紀錄 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a141fb9e591..bb887e2496f 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -328,7 +328,6 @@ 使用者 取消訂閱 選擇分頁 - 使用手勢控制播放器亮度 更新 已刪除檔案 應用程式更新通知 From ecbf5d5ead91bf31214d1a879bce8ff7778da5da Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Sun, 7 May 2023 09:57:38 +0530 Subject: [PATCH 182/645] Remove unused resources. --- .../main/res/drawable-hdpi/ic_close_white.png | Bin 342 -> 0 bytes .../res/drawable-hdpi/ic_hourglass_top_white.png | Bin 252 -> 0 bytes .../main/res/drawable-hdpi/ic_replay_white.png | Bin 486 -> 0 bytes .../main/res/drawable-mdpi/ic_close_white.png | Bin 230 -> 0 bytes .../res/drawable-mdpi/ic_hourglass_top_white.png | Bin 220 -> 0 bytes .../main/res/drawable-mdpi/ic_replay_white.png | Bin 327 -> 0 bytes .../drawable-nodpi/newpipe_logo_nude_shadow.png | Bin 3123 -> 0 bytes .../main/res/drawable-xhdpi/ic_close_white.png | Bin 487 -> 0 bytes .../drawable-xhdpi/ic_hourglass_top_white.png | Bin 345 -> 0 bytes .../main/res/drawable-xhdpi/ic_replay_white.png | Bin 646 -> 0 bytes .../main/res/drawable-xxhdpi/ic_close_white.png | Bin 804 -> 0 bytes .../drawable-xxhdpi/ic_hourglass_top_white.png | Bin 485 -> 0 bytes .../main/res/drawable-xxhdpi/ic_replay_white.png | Bin 1075 -> 0 bytes .../main/res/drawable-xxxhdpi/ic_close_white.png | Bin 1676 -> 0 bytes .../drawable-xxxhdpi/ic_hourglass_top_white.png | Bin 687 -> 0 bytes .../res/drawable-xxxhdpi/ic_replay_white.png | Bin 1569 -> 0 bytes app/src/main/res/drawable/ic_fast_forward.xml | 10 ---------- app/src/main/res/drawable/ic_fast_rewind.xml | 10 ---------- app/src/main/res/drawable/ic_history_future.xml | 15 --------------- app/src/main/res/drawable/ic_visibility_off.xml | 10 ---------- app/src/main/res/values-ar/strings.xml | 2 -- app/src/main/res/values-az/strings.xml | 2 -- app/src/main/res/values-be/strings.xml | 2 -- app/src/main/res/values-bn/strings.xml | 2 -- app/src/main/res/values-cs/strings.xml | 2 -- app/src/main/res/values-da/strings.xml | 2 -- app/src/main/res/values-de/strings.xml | 2 -- app/src/main/res/values-el/strings.xml | 2 -- app/src/main/res/values-es/strings.xml | 2 -- app/src/main/res/values-et/strings.xml | 2 -- app/src/main/res/values-eu/strings.xml | 2 -- app/src/main/res/values-fa/strings.xml | 2 -- app/src/main/res/values-fr/strings.xml | 2 -- app/src/main/res/values-gl/strings.xml | 2 -- app/src/main/res/values-he/strings.xml | 2 -- app/src/main/res/values-hi/strings.xml | 2 -- app/src/main/res/values-hr/strings.xml | 2 -- app/src/main/res/values-hu/strings.xml | 2 -- app/src/main/res/values-ia/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 2 -- app/src/main/res/values-is/strings.xml | 2 -- app/src/main/res/values-it/strings.xml | 2 -- app/src/main/res/values-ja/strings.xml | 2 -- app/src/main/res/values-ka/strings.xml | 2 -- app/src/main/res/values-ko/strings.xml | 2 -- app/src/main/res/values-lt/strings.xml | 2 -- app/src/main/res/values-nb-rNO/strings.xml | 2 -- app/src/main/res/values-nl/strings.xml | 2 -- app/src/main/res/values-nn/strings.xml | 2 -- app/src/main/res/values-nqo/strings.xml | 2 -- app/src/main/res/values-or/strings.xml | 2 -- app/src/main/res/values-pa/strings.xml | 2 -- app/src/main/res/values-pl/strings.xml | 2 -- app/src/main/res/values-pt-rBR/strings.xml | 2 -- app/src/main/res/values-pt-rPT/strings.xml | 2 -- app/src/main/res/values-pt/strings.xml | 2 -- app/src/main/res/values-ro/strings.xml | 2 -- app/src/main/res/values-ru/strings.xml | 2 -- app/src/main/res/values-sc/strings.xml | 2 -- app/src/main/res/values-sk/strings.xml | 2 -- app/src/main/res/values-sv/strings.xml | 2 -- app/src/main/res/values-tr/strings.xml | 2 -- app/src/main/res/values-uk/strings.xml | 2 -- app/src/main/res/values-vi/strings.xml | 2 -- app/src/main/res/values-zh-rCN/strings.xml | 2 -- app/src/main/res/values-zh-rHK/strings.xml | 2 -- app/src/main/res/values-zh-rTW/strings.xml | 2 -- app/src/main/res/values/dimens.xml | 5 ----- app/src/main/res/values/donottranslate.xml | 1 - app/src/main/res/values/strings.xml | 2 -- app/src/main/res/xml/provider_paths.xml | 9 --------- 71 files changed, 155 deletions(-) delete mode 100644 app/src/main/res/drawable-hdpi/ic_close_white.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_hourglass_top_white.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_replay_white.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_close_white.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_hourglass_top_white.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_replay_white.png delete mode 100644 app/src/main/res/drawable-nodpi/newpipe_logo_nude_shadow.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_close_white.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_hourglass_top_white.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_replay_white.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_close_white.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_hourglass_top_white.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_replay_white.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_close_white.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_hourglass_top_white.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_replay_white.png delete mode 100644 app/src/main/res/drawable/ic_fast_forward.xml delete mode 100644 app/src/main/res/drawable/ic_fast_rewind.xml delete mode 100644 app/src/main/res/drawable/ic_history_future.xml delete mode 100644 app/src/main/res/drawable/ic_visibility_off.xml delete mode 100644 app/src/main/res/xml/provider_paths.xml diff --git a/app/src/main/res/drawable-hdpi/ic_close_white.png b/app/src/main/res/drawable-hdpi/ic_close_white.png deleted file mode 100644 index 5546fb0ff3d5b5d6f698de9dbc3275b3d45797a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342 zcmV-c0jd6pP)?vvh5(7w>f{xM$=sUHK(EjMZ^5ZYg&4T>8QwUcQt1QVBqKs zdQ<*S^|TaO+IZy*fHxRS!AL7bh*w<*1|w6Q@fyQmf~h2fiKc9WhACsQso3DHi%rD_ zZwJMufs o8uY}5y)$Jscwo&eyYo%^24my`hw~VCk^lez07*qoM6N<$f+r4=5dZ)H diff --git a/app/src/main/res/drawable-hdpi/ic_hourglass_top_white.png b/app/src/main/res/drawable-hdpi/ic_hourglass_top_white.png deleted file mode 100644 index 1f1f9046c8cf0e0ff2110a0a155c5ebf7db62eb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252 zcmV};o6m^D4rW3>5M9IV79+DWArPF(@*M;TT$OdDBY!m8oHg>K> z8hZs-->xY3ni?oSzo!tSCz+QbQR|N4s0l&isNk*@moQnu%_02e;D#d4rnCxrC-H?p z=~1-Hwzm7{va1;F#BGH}h@UlJgG0TjC0zH9Bme*t6S?W(By@KG0000@P)xnQdo z(>bbjg>S#xG?NWxx-~rYhE0%v<~H5Mkn6V~d|tAJB6oEuSmxezsCR5GGW$skS-uR? z$?HWXciRLS2T{`%Opgwg0vqEmKe_h1FBJ3}I2nI=9{dmr`WGCEzuX2&go3JqmGPHT zK`%Fj_|OakBa;2gJ`bdX9&tR$(R<$oP%$M`51jUT{Pk_dfqh;|%Dm|?7@Y96^@$8H zKk--4lU9HW-U<{907*qoM6N<$f|{?`RsaA1 diff --git a/app/src/main/res/drawable-mdpi/ic_close_white.png b/app/src/main/res/drawable-mdpi/ic_close_white.png deleted file mode 100644 index 1037ea613ad4cf04ab3b3d07655d269b89016399..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iwVp1HAr-goPTbAg>>%KBeage0 zD@WYVh&oJUF>!EESK(;doU)U1@$;0{oZfAWaXWThJbQc{i>dNjO}DfM>z;QuyQ-#` z+3{$-sASUS-TpajqQ(I?v(|a$8!pV5euPh?_T7b#Okq*x!3}d$1Vc*xd3&cZb9J5) zIV)7nzp3N9!1s5NEDyiDi_~$bnjXvYGPeAuBZ%?#Z@swa8JSzV-xnFIdT`K(uWaUu cw@x*TAD=(VQ?YYD19Uipr>mdKI;Vst03+O8qyPW_ diff --git a/app/src/main/res/drawable-mdpi/ic_hourglass_top_white.png b/app/src/main/res/drawable-mdpi/ic_hourglass_top_white.png deleted file mode 100644 index 734e8eca3094c8b8dbffb17fc5d63b8f89f4055b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+i#hxyXAr-fh7U=)b{}nIIEpl}2 z!iV-|7Yz28{$S=%PL^SC)M#Vd(ajvwayGW?efA6+woi#`d7F<(DAZ@p4i^fVA|JQm z8#kBrlV)yV)2KrN8t-41q?yfA3z3dnX|gyovH8Ih&Z+YrGm0yT#Vz4F%q7y;!o1DW zd+LlY_PqT*Cv5LsO#Sh(;CoV_OA_bt5{)ho4PFzO-}|{Z<&?EQPMqiZl8a%nRmh3P TJuPQ}&Smg)^>bP0l+XkK$v9A) diff --git a/app/src/main/res/drawable-mdpi/ic_replay_white.png b/app/src/main/res/drawable-mdpi/ic_replay_white.png deleted file mode 100644 index 24558a423017b4b4d8a83d0e2b3b6b26e4fb51b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 327 zcmV-N0l5B&P)p_0;< z`ByYhZNL8toAPC*1G@!3k~ik(~mlQ7h(v ze>kT_o-1uiTuH4deqo)whh3Na2Xpa7EI(P91frf{Q7OM)iOZ#cad?{oTykB1xxff~ zN(FB)GbfmZ$En~XPO8mD)H;h}sbDOA>X8-n_ggR`6|}g4J36EjT|C4^P15W5ircy+ z22-n-2l$k=x6wY~x09wAY_Mt0_=ER`<~WDmt_T3&p9{L>d6`Bd9reO@-#vH8Fb!%d ZivLE6J?$Egq>2Cl002ovPDHLkV1k;*kTL)O diff --git a/app/src/main/res/drawable-nodpi/newpipe_logo_nude_shadow.png b/app/src/main/res/drawable-nodpi/newpipe_logo_nude_shadow.png deleted file mode 100644 index 49c12af83fafffaae317d44c2d62c78ccb96f79f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3123 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 diff --git a/app/src/main/res/drawable-xhdpi/ic_hourglass_top_white.png b/app/src/main/res/drawable-xhdpi/ic_hourglass_top_white.png deleted file mode 100644 index e53c699dbf874ad860ef13408ac0474c24cff23f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345 zcmV-f0jBz&?*WA7T|0^j4?Wq6vO0P;Ntu755L;X zpW$y@U^sJN4$Ofc8)yyHjtk@(Lp1Vnfmo*YomwUi<5)VVyiz$>hViUkCc5)hp))m6 z`$|3ed_PpC@mVA5$C*kj*FvwAi^IE!>{Q@i_n@*9h4-+Kx`3y@-Ft$I)FMnLkvfBi zlSJa=0nSp%^z(ZqxI0>hj<1yGd_c@|uTggvtB(R~4pi_4T$INSb<;#46Dl%=>vTZLE6s^MV4 rs0GLHc0G=bw(N)mwC@CtWH1T}nd33G84VkqPW-4v`7$Z4!|Q>}?zX;2nF|!Dd!pDQ&e} zc}6rTHpS;Iv5hr@@Yv2|sp;^sy>j_;=St6jH|-d{cV|dXT%O~@Dh@Us0PuxN-R@KQ z1_99IBCCZ}%vt_1wW@8L?|(x8x?Nz^aEkpDuecAa<8t)?svR7J!yd|#HJXFX1Tfjw z;b-amWSwkhGXMz>24Qii*+~SeI8p%QwS)w zR&Hza@+9wEF9!M?6GVZXbc2LPqYaUpq9d^i4u#X-PcXz7TDF(o( zE3*{bDF%8RmMXT6NNCtJAX*fLk(MfmZVfAm-k5;oX!2+MJN#kT^#V zAkVhxy8SZqIO z`+UxM);sL)1OLCZoba8w;qljb|6jkJp0zbwV|98z)}ewau<@DMqAI}=4`z$BbO$4Ir>Y&bOurYs z(>C|A-m>{AUcv6-4)Mo#E!((7{@jkFo44QS{(ZeWwR}#g(%**QW4aMnFQ2}5ZkMaD z-?G0&NB6|;+{SzP+%kECb(!AB|L-a@@mv+p!N>V<&ov|t5w0Nz9 z|MjkE8&_=?wtwGV6q|c`nXET+Mn=?G`x0B(;XDD(}t*-n_8V$8Grqn^#Gj*D%ix zy}RR~^o=!)z22!u%EJNLy{zJJ^b)<8_vmtpL+PyK`AH&rJxj)f>KZlNlf2AZKdn#R_4j@eloYlfThFLq`nlUWrz^={^-!X$mO!yowJpMjZvb-NRb>3o=LtA+p6 zw9S1KQ;HSrl51Ugu{+OlLyh9whN0YZu}itG>rfsSdZrZ9$=!zo?&ZalnCiI*Wihh& z`V@F@x?C8QHJy>@6|l3^)(A&vXj|F=UPU7p=ii;4MUk_$GFA(pP&2l&Es_>`XWk`U zQw33W;^}g#Ti!M3Q73$Zj>l^5WgS=H8(isB5)@95f>KZlNz$?){#T z)3ltdjC%FD<$w#gEK2?DG$%i~It8v>cvC0NJ)oM(QUlri#^ItlZ8bPrhH zNbrM>F*2mh$1P~SFzRTWFF4T}ISuW1lELZMqfeXPa;4VGhg@i%hIaXbuIWemxR+Y) z_DXg4aVum+?Dkb569p@3Bj?&mRgj3HX4glWnd}k`p~( zawrV%^-7{ZQ>_;5@EIkcFnr8Q2?BNYPZm z3elB1hSccq7SW23j8&qW^$V#n#{HtlLNXo~-Dgay@3fy1T@#XVjp#XVNp-VZB04D~ z<9N|lUr%v<`k8&AKZIm_Q@eOw_Udc`|J>nL-Q8qt1-=#ls1eu_#_g@1?E zGu2W=>-|#CyyE=Bc0@1awYMtqJ9UWG`L7tHSHD(0>Q_04 zDC;O)+cGZPEQ6@l)4r^a(iZQ*0lx2L^@!?S*v4(l91pA4P_;XJ)|ke7oD$uQ_f?Om z(@?EjObTtI%typX(SG+j%va1aT0fma(AfZEz124z?O_#YsLt))nZiD=%skg?Ox8Bf zy2te{cCJg^;9k$$Dc9)VUSL{`(?&))Tdn+6I5y=?UN66~OpVs7GT--f3u#kgvJ)&- zFS$DN9cFYW6lFf-Y|GVXS+#{u_D-dtkd)}-y?*8*Yc(Zng|q$8J7ZlhFdg(W$yXig tDvwy<0QOqyL034+=S002ovPDHLkV1jB&B(eYi diff --git a/app/src/main/res/drawable-xxxhdpi/ic_close_white.png b/app/src/main/res/drawable-xxxhdpi/ic_close_white.png deleted file mode 100644 index 06854ca49c6da9a6b0a733265df8345eefe6230a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1676 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 diff --git a/app/src/main/res/drawable/ic_fast_forward.xml b/app/src/main/res/drawable/ic_fast_forward.xml deleted file mode 100644 index 4edc96a9b33..00000000000 --- a/app/src/main/res/drawable/ic_fast_forward.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_fast_rewind.xml b/app/src/main/res/drawable/ic_fast_rewind.xml deleted file mode 100644 index 33d9f56ef8b..00000000000 --- a/app/src/main/res/drawable/ic_fast_rewind.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_history_future.xml b/app/src/main/res/drawable/ic_history_future.xml deleted file mode 100644 index db6f2acbf9d..00000000000 --- a/app/src/main/res/drawable/ic_history_future.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_visibility_off.xml b/app/src/main/res/drawable/ic_visibility_off.xml deleted file mode 100644 index f833d5e0622..00000000000 --- a/app/src/main/res/drawable/ic_visibility_off.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 66ca28ea1f5..569701eead1 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -760,8 +760,6 @@ تنسيق غير معروف جودة غير معروفة حجم الفاصل الزمني لتحميل التشغيل - عرض العناصر المستقبلية - إخفاء العناصر المستقبلية أسئلة مكررة إذا كنت تواجه مشكلة في استخدام التطبيق ، فتأكد من مراجعة هذه الإجابات للأسئلة الشائعة! مشاهدة على الموقع diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index bcd5564dfc8..29c32001661 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -708,8 +708,6 @@ Naməlum format Naməlum keyfiyyət Oynatma yükləmə intervalı həcmi - Gələcək elementləri göstər - Gələcək elementləri gizlət Tətbiqi istifadə etməkdə çətinlik çəkirsinizsə, ümumi suallara bu cavabları yoxladığınıza əmin olun! Tez-tez soruşulan suallar Veb Saytında bax diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 276c78176d4..7538ad9db30 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -515,8 +515,6 @@ Выберыце якасць для знешніх плэераў Невядомая якасць Невядомы фармат - Паказаць наступны матэрыял - Схаваць наступныя матэрыялы Сартаваць З-за абмежаванняў ExoPlayer працягласць пошуку была ўсталявана на %d сякундаў Раздзелы diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index b0887510ee3..6c3cca7a1cf 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -632,10 +632,8 @@ \"চালক বন্ধ করো\" দেখাও বিজ্ঞপ্তি নিষ্ক্রিয় - ভবিষ্যৎ ভুক্তি লুকাও ত্রুটি বিজ্ঞপ্তি বানাও ভুক্তি মুছতে ডানে-বামে সরাও সম্প্রচার বিষয়ক তথ্য প্রক্রিয়ারত… - ভবিষ্যৎ ভুক্তি দেখাও প্লেব্যাক লোড বিরতির আকার \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 6380ffc2a0a..7e9125ef6e1 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -718,11 +718,9 @@ U externích přehrávačů nejsou dostupné žádné zvukové streamy Neznámý formát Neznámá kvalita - Zobrazit nadcházející položky Streamy, které zatím nejsou podporovány systémem stahování, nebudou zobrazeny Vyberte kvalitu pro externí přehrávače U externích přehrávačů nejsou k dispozici žádné videostreamy - Skrýt nadcházející položky Často kladené dotazy Pokud máte potíže s používáním aplikace, přečtěte si tyto odpovědi na časté otázky! Zobrazit na webu diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 28cf01af065..0bd7e9875cb 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -674,7 +674,6 @@ URL til miniaturebillede Fra Tablet-tilstand - Skjul fremtidige elementer Denne video er kun tilgængelig for YouTube Music Premium-medlemmer, så den kan ikke streames eller downloades af NewPipe. \"Storage Access Framework\" gør det muligt at downloade til et eksternt SD-kort Fremtving indberetning af ikke-leverbare Rx-undtagelser uden for fragmentets eller aktivitetens livscyklus efter bortskaffelse @@ -717,7 +716,6 @@ Skift alle Ingen lydstreams er tilgængelige for eksterne afspillere Vælg kvalitet til eksterne afspillere - Vis fremtidige elementer Sortér Ignorer hardware medie knapper Brugbart f.eks. hvis du bruger et headset med ødelagte fysiske knapper diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 735c16fab68..0e477f38a40 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -708,8 +708,6 @@ Streams, die der Downloader noch nicht unterstützt, werden nicht angezeigt Der ausgewählte Stream wird von externen Playern nicht unterstützt Größe des Ladeintervalls für die Wiedergabe - Zukünftige Elemente anzeigen - Zukünftige Elemente ausblenden Auf der Webseite ansehen Häufig gestellte Fragen Wenn du Probleme bei der Verwendung der App hast, lies bitte die Antworten auf häufig gestellte Fragen! diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index b74d5eb0c7d..d0d003f98ee 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -708,8 +708,6 @@ Άγνωστος τύπος αρχείου Άγνωστη ποιότητα Μέγεθος διαστήματος φόρτωσης αναπαραγωγής - Εμφάνιση μελλοντικών αντικειμένων - Απόκρυψη μελλοντικών αντικειμένων Συχνές ερωτήσεις Προβολή στην ιστοσελίδα Εάν αντιμετωπίζετε προβλήματα με τη χρήση της εφαρμογής, φροντίστε να ελέγξετε αυτές τις απαντήσεις σε συνήθεις ερωτήσεις! diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index eb7584813a5..552a8f542ff 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -723,9 +723,7 @@ Elija la calidad para reproductores externos Formato desconocido Calidad desconocida - Mostrar elementos futuros Tamaño del intervalo de carga de reproducción - Ocultar elementos futuros Ver en la página web Preguntas frecuentes Si tienes problemas al usar la aplicación, ¡Asegúrate de verificar estas respuestas a preguntas comunes! diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 3fe9abd5f24..5b2e8e125ec 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -708,8 +708,6 @@ Protsent Pooltoon Taasesituseks vajalike andmete laadimise samm - Näita tulevasi üksuseid - Peida tulevased üksused Korduma kippuvad küsimused Kui sul tekib selle rakenduse kasutamisel probleeme, siis esmalt vaata, kas vastus leidub korduma kippuvate küsimuste hulgas! Edasi loe veebisaidist diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index ea4af6b0a1f..c8d16b698da 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -707,9 +707,7 @@ Ez dago kanpoko erreproduzigailu batengatik onartuta dagoen bideo jariorik Formatu ezezaguna Kalitate ezezaguna - Erakutsi etorkizuneko elementuak Hautatu kanpoko erreproduzigailuen kalitatea - Ezkutatu etorkizuneko elementuak Grisez idatzitako erreprodukzio-zerrendek jada badute elementu hau. Webgunean ikusi Akatsa arbelera kopiatzean diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index fd65ce27d57..3d8e8da9b29 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -708,8 +708,6 @@ قالب ناشناخته کیفیت ناشناخته اندازهٔ دورهٔ بار کردن پخش - نمایش موارد آینده - نهفتن موارد آینده سوالات متداول اگر حین استفاده از اپ مشکلی دارید، حتما پاسخ‌ها به سوالات متداول را بررسی کنید! نمایش در وبسایت diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index f9372811fca..5443fe3c891 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -723,8 +723,6 @@ Le flux sélectionné n’est pas pris en charge par les lecteurs externes Aucun flux vidéo n’est disponible pour les lecteurs externes Taille de l\'intervalle de chargement de la lecture - Afficher les éléments à venir - Masquer les éléments à venir Foire aux questions Voir sur le site web Si vous avez des difficultés à utiliser l\'application, consultez les réponses aux questions les plus fréquentes ! diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 3dc0d4794ee..1490a5960e7 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -707,9 +707,7 @@ Tamaño do intervalo de carregamento da reprodución As emisións seleccionadas non son soportadas polos reprodutores externos Non hai emisións de vídeo dispoñíbeis para reprodutores externos - Mostrar elementos próximos Non hai emisións de audio dispoñíbeis para reprodutores externos - Ocultar elementos próximos Ver na páxina web Preguntas máis frecuentes Se tes problemas para usala aplicación, asegúrate de consultar estas respostas ás preguntas comúns! diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index e44cc580aae..eb6a33cdb86 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -734,8 +734,6 @@ בחירת איכות לנגנים חיצוניים תצורה לא מוכרת גודל משך טעינת נגינה - הצגת פריטים עתידיים - הסתרת פריטים עתידיים מיון הצגה באתר תשובות לשאלות נפוצות diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index cb8ddc3b8d4..270a47f064f 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -649,7 +649,6 @@ क्या आप इस समूह को हटाना चाहते हैं\? नया फ़ीड - भविष्य आइटम दिखाएं नई फ़ीड आइटम फ़ीड संसाधित हो रही है … वेबसाइट खोलें @@ -658,7 +657,6 @@ ऑन स्वतः बने (कोई अपलोडर नहीं मिला) चैनल समूह - भविष्य आइटम छुपाएं कई बार पूछे प्रश्न वेबसाइट पर देखें आइटम हटाने के लिए स्वाइप करें diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index ed64e5078ed..11ad99b933b 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -720,8 +720,6 @@ Nijedan stream audiosnimaka nije dostupan za vanjske playere Nijedan video stream nije dostupan za vanjske playere Odaberi kvalitetu za vanjske playere - Prikaži buduće stavke Za ovu radnju nije pronađen odgovrajući upravljač datoteka. \nInstaliraj „Storage Access Framework” kompatibilni upravljač datoteka - Sakrij buduće stavke \ No newline at end of file diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 6f777991529..b8b32005aa0 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -709,8 +709,6 @@ Ismeretlen formátum Ismeretlen minőség Félhang - Jövőbeli elemek megjelenítése - Jövőbeli elemek elrejtése Gyakran ismételt kérdések Megtekintés a weboldalon Rendezés diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index aa847b2a472..d4ae5b45576 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -241,7 +241,6 @@ Private Aperir le sito web Per %s - Monstrar le videos futur Radio Create per %s \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index f7bba45737f..e9bd9d0ebca 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -695,8 +695,6 @@ Pilih kualitas untuk pemain eksternal Format tidak diketahui Ukuran interval pemuatan playback - Tampilkan item mendatang - Sembunyikan item mendatang Pertanyaan yang sering diajukan Jika Anda mengalami masalah menggunakan aplikasi, pastikan untuk melihat jawaban untuk pertanyaan yang umum! Tampilkan di situs web diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 1d6804eaed4..e2721797128 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -608,7 +608,6 @@ Eyða sóttum skrám Viltu hreinsa niðurhalsferilinn eða eyða öllum sóttum skrám\? Engir myndstraumar eru í boði fyrir ytri spilara - Fela framtíðaratriði Eyða vefkökum reCAPTCHA Vefkökum reCAPTCHA eytt Stærð forhleðslu @@ -706,7 +705,6 @@ Valinn straumur er ekki studdur af ytri spilurum Engir hljóðstraumar eru í boði fyrir ytri spilara Veldu gæði fyrir ytri spilara - Sýna framtíðaratriði Ef þú átt í vandræðum með að nota forritið vertu viss um að skoða þessi svör við algengum spurningum! Algengar spurningar Skoða á vefsíðu diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index fdb28c573a1..a653c09ae79 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -721,8 +721,6 @@ Qualità sconosciuta Formato sconosciuto Dimensione intervallo di caricamento della riproduzione - Mostra elementi futuri - Nascondi elementi futuri Domande frequenti Se riscontri problemi nell\'utilizzo dell\'app, dai un\'occhiata alle risposte delle domande più comuni! Ordina diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e6f7b7b83e5..5d7c0922f3f 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -695,8 +695,6 @@ 外部プレイヤーで利用可能な音声ストリームがありません 外部プレイヤーで利用可能な動画ストリームがありません 外部プレイヤーでの品質を選択 - 次のアイテムを表示する - 次のアイテムを隠す 並び替え ウェブサイトを表示 タップして%sをダウンロード diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 81aae3ac826..89c2193da63 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -590,8 +590,6 @@ აირჩიეთ ხარისხი გარე დამკვრელებისთვის უცნობი ფორმატი უცნობი ხარისხი - მომავალი ელემენტების ჩვენება - სამომავლო ნივთების დამალვა დალაგება ეგეთი უკვე არსებობს ინსტანციის დადასტურება ვერ მოხერხდა diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 49ea9cf0f6b..de9731a9ac3 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -658,7 +658,6 @@ 자동 (장치 테마) 고정된 댓글 추천 - 향후 항목 표시하기 알 수 없는 형식 외부 플레이어의 품질 선택 외부 플레이어에 사용할 수 있는 비디오 스트림이 없음 @@ -697,7 +696,6 @@ 이 기능은 아직 NewPipe에서 지원하지 않습니다. \n \n이후 버전에서 지원될 예정입니다. - 향후 항목 숨기기 앱 사용에 문제가 있는 경우, 일반적인 질문에 대한 다음 답변을 확인하세요! 자주 묻는 질문 웹사이트에서 보기 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 30fae7787ed..1f4922a08b5 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -702,11 +702,9 @@ Gaukite pranešimą Dabar užsiprenumeravote šį kanalą - Rodyti būsimus elementus Reikalingas tinklo ryšys Transliacijos, kurių dar nepalaiko atsisiuntimo programa, nerodomos Nežinomas formatas - Slėpti būsimus elementus Bet koks tinklas Ištrinti visus atsisiųstus failus iš disko\? Grotuvo pranešimas diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index e96008e143e..da6193e9003 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -697,11 +697,9 @@ Du abonnerer nå på denne kanalen Strømmer som ennå ikke er støttet av nedlasteren, vises ikke Velg kvalitet for eksterne spillere - Vis fremtidige elementer Ingen videostrømmer er tilgjengelige for eksterne spillere Ukjent format Ukjent kvalitet - Skjul fremtidige elementer Ofte stilte spørsmål Vis på nettsiden Start sjekk etter nye strømmer diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index e65d013d0f7..254a90c411e 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -708,8 +708,6 @@ Selecteer kwaliteit voor externe spelers Onbekend formaat Intervalgrootte tijdens afspelen - Toon toekomstige objecten - Verberg toekomstige objecten Veelgestelde vragen Als u problemen ondervindt bij het gebruik van de app, bekijk dan deze antwoorden op veelgestelde vragen! Bekijk op de website diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index f7d4eec86ae..5f34c0ccf3a 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -54,8 +54,6 @@ Ingen ljodstraumar er tilgjengelege for ytre spelarar Ingen videostraumar er tilgjengelege for ytre spelarar Vel kvalitet for ytre spelarar - Vis framtidige ting - Skjul framtidige ting Skil ut Opna nettstaden Du fylgjer no denne kanalen diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml index 16c6e6e225f..5cceb93a4e5 100644 --- a/app/src/main/res/values-nqo/strings.xml +++ b/app/src/main/res/values-nqo/strings.xml @@ -727,6 +727,4 @@ ߞߣߐߘߐ ߣߌ߲߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌ ߟߊ߫ ߖߡߊ߬ߣߊ ߞߣߐ߫. ߢߣߊߕߊ ߣߌ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߫ ߠߋ߬ ߘߐߙߐ߲߫ ߣߌ߫ %s ߛߎߥߊ߲ߘߌߣߍ߲߫ ߛߊߛߊ ߢߍ߫ ߌ ߘߌ߫ ߛߋ߫ ߞߟߏߜߍ ߓߊߕߐߡߐ߲߫ ߠߊ߫ ߞߊ߲߬ߛߓߍ ߘߐ߫ ߡߎ߬ߕߎ߲߬. ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߞߐߜߍ߫ ߘߌ߫ ߛߋ߫ ߡߣߍߡߣߍ߫ ߟߊ߫ ߊ߬ߣߌ߫ ߛߘߌ߬ߜߋ߲ ߠߎ߬ ߝߊߣߊ߲߫ ߘߌ߫ ߛߋ߫ ߟߊߝߏߦߊ߫ ߟߴߊ߬ ߘߐ߫. - ߞߊ߬ ߝߌ߬ߛߌ߫ ߣߊ߬ߕߐ ߟߎ߫ ߦߌ߬ߘߊ߬ - ߞߊ߬ ߝߌ߬ߛߌ߫ ߣߊ߬ߕߐ ߟߎ߬ ߢߡߊߘߏ߲߰ \ No newline at end of file diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 3e3e1fd5cff..f329fc44e45 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -498,7 +498,6 @@ ExoPlayer ଡିଫଲ୍ଟ ବୟସ ସୀମା ଅଜ୍ଞାତ ଗୁଣବତ୍ତା - ଭବିଷ୍ୟତ ଆଇଟମ୍ ଗୁଡିକ ଦେଖାନ୍ତୁ ଏହି ଭିଡିଓ ବୟସ ସୀମିତ ଅଟେ । \n \nଯଦି ଆପଣ ଏହାକୁ ଦେଖିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସେଟିଂସମୂହରେ \"%1$s\" ଟର୍ନ୍ ଅନ୍ କରନ୍ତୁ । @@ -614,7 +613,6 @@ ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଅଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ ବହିଃ-ଚାଳକ ପାଇଁ ଗୁଣବତ୍ତା ଚୟନ କରନ୍ତୁ ପିନ୍ ହୋଇଥିବା ମନ୍ତବ୍ୟ - ଭବିଷ୍ୟତର ଆଇଟମ୍ ଲୁଚାନ୍ତୁ ୱେବସାଇଟ୍ ଖୋଲନ୍ତୁ ହଜାର ସୂଚନା ପାଇବା… diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 17e0156096c..82082f875e0 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -660,8 +660,6 @@ ਇਹ ਸਾਊਂਡਕਲਾਊਡ ਗੋ-ਪਲੱਸ ਟਰੈਕ ਹੈ, ਤੁਹਾਡੇ ਦੇਸ਼ ਵਿੱਚ ਇਹ ਸਟ੍ਰੀਮ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਅਗਿਆਤ ਫਾਰਮੈਟ ਅਗਿਆਤ ਕੁਆਲਿਟੀ - ਭਵਿੱਖ-ਪ੍ਰਕਾਸ਼ਤ ਆਈਟਮ ਵਿਖਾਓ - ਭਵਿੱਖ-ਪ੍ਰਕਾਸ਼ਤ ਆਈਟਮ ਲੁਕਾਓ ਆਮ ਸਵਾਲ ਵੈੱਬਸਾਈਟ \'ਤੇ ਵੇਖੋ ਸਟਰੀਮ ਲੋਡ ਹੋ ਰਹੀ ਹੈ… diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 79c270ce6bd..ecb3322f788 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -729,8 +729,6 @@ Wybierz jakość dla zewnętrznych odtwarzaczy Nieznany format Nieznana jakość - Pokaż przyszłe pozycje - Ukryj przyszłe pozycje Często zadawane pytania Jeśli masz problemy podczas korzystania z aplikacji, koniecznie sprawdź odpowiedzi na najczęściej pojawiające się pytania! Zobacz na stronie internetowej diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 463d222f605..558fe1b3ebc 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -721,8 +721,6 @@ Formato desconhecido Qualidade desconhecida Tamanho do intervalo de carregamento da reprodução - Mostrar itens futuros - Ocultar itens futuros Visualizar no site Se você está com problemas ao usar o aplicativo, confira estas respostas para perguntas comuns! Perguntas frequentes diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index d17da454932..de0bed0a43a 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -721,8 +721,6 @@ Qualidade desconhecida Selecione a qualidade para reprodutores externos Tamanho do intervalo de carregamento da reprodução - Mostrar artigos futuros - Ocultar artigos futuros Perguntas frequentes Se tem problemas a usar a app, veja estas respostas para perguntas frequentes! Ver no sítio web diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 0b3180a1573..1fb73e4d6b4 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -720,9 +720,7 @@ Formato desconhecido Qualidade desconhecida A transmissão selecionada não é suportada por reprodutores externos - Mostrar artigos futuros Tamanho do intervalo de carregamento da reprodução - Ocultar artigos futuros Perguntas frequentes Ver no site Se está a ter problemas a usar a aplicação, veja estas respostas para perguntas mais comuns! diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 9e8d9b30617..dff39cce479 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -721,8 +721,6 @@ Format necunoscut Calitate necunoscută Dimensiunea intervalului de încărcare de redare - Afișați elementele din viitor - Ascunde elementele din viitor Vedeți pe website Dacă întâmpinați probleme cu utilizarea aplicației, nu uitați să consultați aceste răspunsuri la întrebări frecvente! Întrebări frecvente diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b4ac25bc466..6028b1adaa4 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -725,8 +725,6 @@ Выберите качество для внешних плееров Неизвестное качество Размер предварительной загрузки - Показывать будущие элементы - Скрывать будущие видео Ответы на частые вопросы Если у вас возникли проблемы с использованием приложения, обязательно ознакомьтесь с ответами на распространённые вопросы! Посмотреть на веб-сайте diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 4a2797b7535..2119ddc21e7 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -708,8 +708,6 @@ Calidade disconnota Su flussu seletzionadu no est galu suportadu dae letores esternos Mannària de s\'intervallu de carrigamentu de sa riprodutzione - Ammustra sos elementos imbenientes - Cua sos elementos imbenientes Preguntas fitianas Si ses tenende problemas impreende s\'aplicatzione assegura·ti de consultare custas rispostas a preguntas fitianas! Pòmpia in su situ web diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 282b1869873..9c497c7857d 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -721,8 +721,6 @@ Streamy nepodporované sťahovačom sa nezobrazujú Žiadne video streamy nie sú k dispozícií pre externé prehrávače Neznáma kvalita - Zobraziť budúce položky - Skryť nasledujúce položky Často kladené otázky Pozrieť na webovej stránke Usporiadať diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index b3e0932b079..3d9dc6ee15d 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -708,9 +708,7 @@ Videoströmmar som ännu inte stöds av nedladdaren visas inte Inläsningsintervalls storlek Välj kvalitet för externa spelare - Visa framtida objekt Den valda videoströmmen stöds inte av externa spelare - Göm framtida objekt Om du har problem med att använda appen, kolla in dessa svar på vanligt ställda frågor! Vanligt ställda frågor Visa på webbplats diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index f1e678426e4..97ff192cde1 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -707,8 +707,6 @@ Bilinmeyen biçim Bilinmeyen nitelik Oynatma yükleme aralığı boyutu - Gelecekteki ögeleri göster - Gelecekteki ögeleri gizle Sık Sorulan Sorular Web sitesinde görüntüle Uygulamayı kullanırken sorun yaşıyorsanız, sık sorulan sorulara verilen bu yanıtlara göz atmayı unutmayın! diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index d5c88ae2ba3..253160568d2 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -725,8 +725,6 @@ Виберіть якість для зовнішніх програвачів Невідома якість Розмір інтервалу завантаження відтворення - Показати наступні елементи - Сховати майбутні елементи Переглянути на сайті Поширені запитання Якщо у вас виникли проблеми з використанням застосунку, обов\'язково ознайомтеся з відповідями на поширені запитання! diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index fcb5324352b..2d722700144 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -695,8 +695,6 @@ Định dạng không xác định (:P) Độ phân giải không xác định Kích thước khoảng thời gian tải - Hiện video đề xuất - Ẩn video đề xuất Thể loại Câu hỏi thường gặp Xem trên website diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9dadccfae09..2293599213f 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -695,8 +695,6 @@ 不显示下载器尚不支持的串流 未知画质 播放加载间隔大小 - 显示未来项目 - 隐藏未来项目 常见问题 如果你在使用本应用时遇到问题,请务必查看这些常见问题的答案! 在网站上查看 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 49996f06ade..960954ca758 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -675,7 +675,6 @@ 啲圖都要騷 Picasso 三色碼顯示源頭:紅碼係網絡上高落嚟,藍碼係儲存喺磁碟本地,綠碼係潛伏喺記憶體中 服務原本嘅字會騷返喺串流項目上面 影像要推三色碼 - 未夠鐘上畫嘅項目照顯示 若果播片嘅時候窒下窒下或者黑畫面,就停用多媒體隧道啦 點樣用 Google 匯出嚟匯入 YouTube 訂閱: \n @@ -697,7 +696,6 @@ \nYouTube 就係其中一個有用 RSS 摘要提供呢個快趣門路嘅服務。 \n \n所以就睇你點揀:想快定要準。 - 未夠鐘上畫嘅項目就收埋 去網站睇下 排序 常見問題 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index bb887e2496f..86bd7620d64 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -695,8 +695,6 @@ 沒有可用於外部播放程式的視訊串流 選取外部播放程式的畫質 播放載入間隔大小 - 顯示未來項目 - 隱藏未來項目 常見問題 在網站上檢視 排序 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e35b3c2e531..e47b72c9aa6 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -3,9 +3,7 @@ 16dp 8dp - 32dp 12dp - 8dp 4dp 2dp @@ -134,9 +132,6 @@ 12sp - 12dp - 6dp - 4dp 16sp diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index b595a8f2cab..528542ce7d8 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -24,7 +24,6 @@ https://newpipe.net/FAQ/ %1$s/%2$s YouTube - SoundCloud @string/app_name LeakCanary %1$s-%2$s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d2104526ad2..eb774f33893 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -776,8 +776,6 @@ Unknown format Unknown quality Unknown - Show future items - Hide future items Fully watched Partially watched Upcoming diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml deleted file mode 100644 index a7cd061b86d..00000000000 --- a/app/src/main/res/xml/provider_paths.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - From 0ab99619080bd5c93d1edb0431835013f7130313 Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Fri, 12 May 2023 01:09:08 -0400 Subject: [PATCH 183/645] Organize the proguard file --- app/proguard-rules.pro | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 5e10d3916ab..d21f33e1f11 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,32 +1,18 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /home/the-scrabi/bin/Android/Sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} +# https://developer.android.com/build/shrink-code +## Helps debug release versions -dontobfuscate --keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; } +## Rules for NewPipeExtractor +-keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; } -keep class org.mozilla.javascript.** { *; } - -keep class org.mozilla.classfile.ClassFileWriter --keep class com.google.android.exoplayer2.** { *; } - -dontwarn org.mozilla.javascript.tools.** -# Rules for icepick. Copy paste from https://github.com/frankiesardo/icepick +## Rules for ExoPlayer +-keep class com.google.android.exoplayer2.** { *; } + +## Rules for Icepick. Copy pasted from https://github.com/frankiesardo/icepick -dontwarn icepick.** -keep class icepick.** { *; } -keep class **$$Icepick { *; } @@ -35,11 +21,11 @@ } -keepnames class * { @icepick.State *;} -## Rules for OkHttp. Copy paste from https://github.com/square/okhttp +## Rules for OkHttp. Copy pasted from https://github.com/square/okhttp -dontwarn okhttp3.** -dontwarn okio.** -## +## See https://github.com/TeamNewPipe/NewPipe/pull/1441 -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; !static !transient ; @@ -47,5 +33,5 @@ private void readObject(java.io.ObjectInputStream); } -# for some reason NotificationModeConfigFragment wasn't kept (only referenced in a preference xml) +## For some reason NotificationModeConfigFragment wasn't kept (only referenced in a preference xml) -keep class org.schabi.newpipe.settings.notifications.** { *; } From fe82029dc7ad4ae78406edae56d9dd0ba6d09dff Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Fri, 12 May 2023 01:12:12 -0400 Subject: [PATCH 184/645] Fix unresolved extractor --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 8b9659c1fa5..e0bbca63646 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -201,7 +201,7 @@ dependencies { // name and the commit hash with the commit hash of the (pushed) commit you want to test // This works thanks to JitPack: https://jitpack.io/ implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.22.6' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:8495ad619e' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ From 677bb4070f5958f076b38fc9ab667f4465ec0671 Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 26 May 2023 10:29:10 +0200 Subject: [PATCH 185/645] Add rewrite announcement to readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f184b536078..e3261eb9443 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -### Please do **not** open pull requests for *new features* now, as we are planning to rewrite large chunks of the code. Only bugfix PRs will be accepted. More details will be announced soon! +

      We are planning to rewrite large chunks of the codebase, to bring about a new, modern and stable NewPipe!

      +

      Please do not open pull requests for new features now, only bugfix PRs will be accepted.

      NewPipe

      From c8e8915c2ec6906309491896318fd079b6c51a21 Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 26 May 2023 11:05:32 +0200 Subject: [PATCH 186/645] Move questions to Discussions --- .github/{ISSUE_TEMPLATE => DISCUSSION_TEMPLATE}/question.yml | 0 .github/ISSUE_TEMPLATE/config.yml | 3 +++ 2 files changed, 3 insertions(+) rename .github/{ISSUE_TEMPLATE => DISCUSSION_TEMPLATE}/question.yml (100%) diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/DISCUSSION_TEMPLATE/question.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/question.yml rename to .github/DISCUSSION_TEMPLATE/question.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b0fdb56db70..4721637bf6e 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,8 @@ blank_issues_enabled: false contact_links: + - name: ❓ Question + url: https://github.com/TeamNewPipe/NewPipe/discussions/new?category=questions + about: Ask about anything NewPipe-related - name: 💬 IRC url: https://web.libera.chat/#newpipe about: Chat with us via IRC for quick Q/A From 577301c4eb288ac656c1ac3df881b5b178ff3f2a Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 26 May 2023 11:52:06 +0200 Subject: [PATCH 187/645] Proper filename for questions discussion template --- .github/DISCUSSION_TEMPLATE/{question.yml => questions.yml} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename .github/DISCUSSION_TEMPLATE/{question.yml => questions.yml} (81%) diff --git a/.github/DISCUSSION_TEMPLATE/question.yml b/.github/DISCUSSION_TEMPLATE/questions.yml similarity index 81% rename from .github/DISCUSSION_TEMPLATE/question.yml rename to .github/DISCUSSION_TEMPLATE/questions.yml index 134f171f767..befb6280e74 100644 --- a/.github/DISCUSSION_TEMPLATE/question.yml +++ b/.github/DISCUSSION_TEMPLATE/questions.yml @@ -1,11 +1,11 @@ name: Question description: Ask about anything NewPipe-related -labels: [question, needs triage] +labels: [question] body: - type: markdown attributes: value: | - Thanks for taking the time to fill out this issue! :hugs: + Thanks for taking the time to fill out this form! :hugs: Note that you can also ask questions on our [IRC channel](https://web.libera.chat/#newpipe). @@ -14,7 +14,7 @@ body: attributes: label: "Checklist" options: - - label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." + - label: "I made sure that there are *no existing issues or discussions* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." required: true - label: "I have read the [FAQ](https://newpipe.net/FAQ/) and my question isn't listed." required: true From 4e3bf3c2f93be962ffe4da838df043a477ff0f6d Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Tue, 30 May 2023 12:22:05 -0400 Subject: [PATCH 188/645] Update some libraries --- app/build.gradle | 21 ++++++++++----------- build.gradle | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e0bbca63646..c2e8a95b16d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ plugins { id "kotlin-kapt" id "kotlin-parcelize" id "checkstyle" - id "org.sonarqube" version "3.5.0.2730" + id "org.sonarqube" version "4.0.0.2929" } android { @@ -107,14 +107,14 @@ android { } ext { - checkstyleVersion = '10.3.1' + checkstyleVersion = '10.11.0' androidxLifecycleVersion = '2.5.1' androidxRoomVersion = '2.4.3' androidxWorkVersion = '2.7.1' icepickVersion = '3.2.0' - exoPlayerVersion = '2.18.5' + exoPlayerVersion = '2.18.7' googleAutoServiceVersion = '1.0.1' groupieVersion = '2.10.1' markwonVersion = '4.6.2' @@ -122,7 +122,6 @@ ext { leakCanaryVersion = '2.9.1' stethoVersion = '1.6.0' mockitoVersion = '4.0.0' - assertJVersion = '3.23.1' } configurations { @@ -193,7 +192,7 @@ sonar { dependencies { /** Desugaring **/ - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.2' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' /** NewPipe libraries **/ // You can use a local version by uncommenting a few lines in settings.gradle @@ -241,10 +240,10 @@ dependencies { kapt "frankiesardo:icepick-processor:${icepickVersion}" // HTML parser - implementation "org.jsoup:jsoup:1.15.3" + implementation "org.jsoup:jsoup:1.16.1" // HTTP client - implementation "com.squareup.okhttp3:okhttp:4.10.0" + implementation "com.squareup.okhttp3:okhttp:4.11.0" // Media player implementation "com.google.android.exoplayer:exoplayer-core:${exoPlayerVersion}" @@ -279,7 +278,7 @@ dependencies { implementation 'com.jakewharton:process-phoenix:2.1.2' // Reactive extensions for Java VM - implementation "io.reactivex.rxjava3:rxjava:3.1.5" + implementation "io.reactivex.rxjava3:rxjava:3.1.6" implementation "io.reactivex.rxjava3:rxandroid:3.0.2" // RxJava binding APIs for Android UI widgets implementation "com.jakewharton.rxbinding4:rxbinding:4.0.0" @@ -301,10 +300,10 @@ dependencies { testImplementation "org.mockito:mockito-core:${mockitoVersion}" testImplementation "org.mockito:mockito-inline:${mockitoVersion}" - androidTestImplementation "androidx.test.ext:junit:1.1.3" - androidTestImplementation "androidx.test:runner:1.4.0" + androidTestImplementation "androidx.test.ext:junit:1.1.5" + androidTestImplementation "androidx.test:runner:1.5.2" androidTestImplementation "androidx.room:room-testing:${androidxRoomVersion}" - androidTestImplementation "org.assertj:assertj-core:${assertJVersion}" + androidTestImplementation "org.assertj:assertj-core:3.23.1" } static String getGitWorkingBranch() { diff --git a/build.gradle b/build.gradle index f5033c64864..24a28bd6eb7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.8.20' + ext.kotlin_version = '1.8.21' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.0.1' + classpath 'com.android.tools.build:gradle:8.0.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8196ca1994f..2c3425d49ec 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=a62c5f99585dd9e1f95dab7b9415a0e698fa9dd1e6c38537faa81ac078f4d23e -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip +distributionSha256Sum=e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 6bcc8691fa66884668c118053165e807ce46813b Mon Sep 17 00:00:00 2001 From: Romain Date: Mon, 5 Jun 2023 20:34:55 +0200 Subject: [PATCH 189/645] =?UTF-8?q?handle=20links=20to=20the=20PeerTube=20?= =?UTF-8?q?instance=20=E2=80=9Cpeertube.stream=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit also sort the lines, because it will quickly become a mess otherwise --- app/src/main/AndroidManifest.xml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9d86dde6df6..1127c55a4b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -357,15 +357,16 @@ + - + + + - - - + From 3622438a9de2dd965848aaa607fc479ee384a4c2 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 14 Jun 2023 12:01:36 +0200 Subject: [PATCH 190/645] Translated using Weblate (Arabic) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 55.4% (41 of 74 strings) Translated using Weblate (Greek) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Malayalam) Currently translated at 83.7% (572 of 683 strings) Translated using Weblate (Lithuanian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Italian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (French) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Tigrinya) Currently translated at 2.1% (15 of 683 strings) Translated using Weblate (Tigrinya) Currently translated at 4.0% (3 of 74 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 22.2% (152 of 683 strings) Translated using Weblate (Turkish) Currently translated at 98.8% (675 of 683 strings) Added translation using Weblate (Tigrinya) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (683 of 683 strings) Added translation using Weblate (Kannada) Translated using Weblate (Norwegian Nynorsk) Currently translated at 13.4% (92 of 683 strings) Translated using Weblate (Czech) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Korean) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Korean) Currently translated at 12.1% (9 of 74 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (683 of 683 strings) Added translation using Weblate (English (Middle)) Added translation using Weblate (English (Old)) Added translation using Weblate (Sicilian) Added translation using Weblate (Aymara) Added translation using Weblate (Arabic (Najdi)) Added translation using Weblate (Kashmiri) Added translation using Weblate (German (Low)) Translated using Weblate (Korean) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Latvian) Currently translated at 93.7% (640 of 683 strings) Translated using Weblate (Dutch) Currently translated at 64.8% (48 of 74 strings) Translated using Weblate (Azerbaijani) Currently translated at 95.9% (71 of 74 strings) Translated using Weblate (German) Currently translated at 74.3% (55 of 74 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Chinese (Traditional, Hong Kong)) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Korean) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (683 of 683 strings) Deleted translation using Weblate (Kashmiri) Deleted translation using Weblate (Arabic (Najdi)) Deleted translation using Weblate (Aymara) Deleted translation using Weblate (Sicilian) Deleted translation using Weblate (English (Old)) Deleted translation using Weblate (English (Middle)) Deleted translation using Weblate (German (Low)) Translated using Weblate (Belarusian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Italian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Russian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Slovak) Currently translated at 17.5% (13 of 74 strings) Translated using Weblate (French) Currently translated at 90.5% (67 of 74 strings) Translated using Weblate (Sardinian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Hebrew) Currently translated at 99.2% (678 of 683 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Polish) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Czech) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Greek) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Italian) Currently translated at 97.2% (664 of 683 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (French) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (German) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (German) Currently translated at 100.0% (683 of 683 strings) Co-authored-by: Agnieszka C Co-authored-by: AhHyeon An Co-authored-by: Ajeje Brazorf Co-authored-by: Alex25820 Co-authored-by: Alexthegib Co-authored-by: Arnis Jaundzeikars Co-authored-by: AudricV Co-authored-by: Balázs Meskó Co-authored-by: Domokun Co-authored-by: Emin Tufan Çetin Co-authored-by: Eric Co-authored-by: Fjuro Co-authored-by: Hoseok Seo Co-authored-by: Hosted Weblate Co-authored-by: Ihor Hordiichuk Co-authored-by: Jeff Huang Co-authored-by: Linerly Co-authored-by: Marian Hanzel Co-authored-by: Nidi Co-authored-by: Olivia Ng Co-authored-by: Priit Jõerüüt Co-authored-by: Rex_sa Co-authored-by: SC Co-authored-by: Surfoo Co-authored-by: TobiGr Co-authored-by: Vasilis K Co-authored-by: VfBFan Co-authored-by: Weblate Co-authored-by: Yaron Shahrabani Co-authored-by: ai Co-authored-by: atilluF <110931720+atilluF@users.noreply.github.com> Co-authored-by: ctntt Co-authored-by: gallegonovato Co-authored-by: gbpu Co-authored-by: gymka Co-authored-by: jeffin-v Co-authored-by: nautilusx Co-authored-by: pjammo Co-authored-by: random r Co-authored-by: thami simo Co-authored-by: tryvseu Co-authored-by: Макар Разин Co-authored-by: 이정희 Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/az/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ko/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ti/ Translation: NewPipe/Metadata Translated using Weblate (Hungarian) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Czech) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Hindi) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Punjabi) Currently translated at 100.0% (683 of 683 strings) Translated using Weblate (Galician) Currently translated at 99.7% (681 of 683 strings) Translated using Weblate (Hungarian) Currently translated at 17.5% (13 of 74 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hu/ Translated using Weblate (Hindi) Currently translated at 100.0% (74 of 74 strings) Translation: NewPipe/Metadata Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hi/ Translated using Weblate (N’Ko) Currently translated at 98.5% (673 of 683 strings) Translated using Weblate (Czech) Currently translated at 100.0% (683 of 683 strings) --- app/src/main/res/values-ar/strings.xml | 34 ++++- app/src/main/res/values-az/strings.xml | 104 +++++++++------ app/src/main/res/values-be/strings.xml | 23 +++- app/src/main/res/values-cs/strings.xml | 32 ++++- app/src/main/res/values-de/strings.xml | 22 ++++ app/src/main/res/values-el/strings.xml | 22 ++++ app/src/main/res/values-es/strings.xml | 22 ++++ app/src/main/res/values-et/strings.xml | 22 ++++ app/src/main/res/values-fr/strings.xml | 24 +++- app/src/main/res/values-gl/strings.xml | 28 ++++- app/src/main/res/values-he/strings.xml | 22 ++++ app/src/main/res/values-hi/strings.xml | 23 +++- app/src/main/res/values-hu/strings.xml | 52 +++++++- app/src/main/res/values-in/strings.xml | 22 ++++ app/src/main/res/values-it/strings.xml | 22 ++++ app/src/main/res/values-kn/strings.xml | 2 + app/src/main/res/values-ko/strings.xml | 36 +++++- app/src/main/res/values-lt/strings.xml | 48 ++++++- app/src/main/res/values-lv/strings.xml | 87 +++++++++---- app/src/main/res/values-ml/strings.xml | 2 + app/src/main/res/values-nl/strings.xml | 32 ++++- app/src/main/res/values-nn/strings.xml | 119 +++++++++++++++--- app/src/main/res/values-nqo/strings.xml | 11 +- app/src/main/res/values-pa/strings.xml | 23 +++- app/src/main/res/values-pl/strings.xml | 22 ++++ app/src/main/res/values-pt-rBR/strings.xml | 34 ++++- app/src/main/res/values-pt-rPT/strings.xml | 116 ++++++++++------- app/src/main/res/values-pt/strings.xml | 32 ++++- app/src/main/res/values-ru/strings.xml | 24 +++- app/src/main/res/values-sc/strings.xml | 22 ++++ app/src/main/res/values-sk/strings.xml | 41 +++++- app/src/main/res/values-sv/strings.xml | 23 +++- app/src/main/res/values-ti/strings.xml | 19 +++ app/src/main/res/values-tr/strings.xml | 15 +++ app/src/main/res/values-uk/strings.xml | 22 ++++ app/src/main/res/values-zh-rCN/strings.xml | 22 ++++ app/src/main/res/values-zh-rHK/strings.xml | 31 ++++- app/src/main/res/values-zh-rTW/strings.xml | 22 ++++ .../metadata/android/ar/changelogs/65.txt | 28 +++++ .../metadata/android/ar/changelogs/66.txt | 35 ++++++ .../metadata/android/ar/changelogs/780.txt | 12 ++ .../metadata/android/ar/changelogs/790.txt | 14 +++ .../metadata/android/az/full_description.txt | 2 +- .../metadata/android/de/changelogs/993.txt | 12 ++ .../metadata/android/fr/short_description.txt | 2 +- .../metadata/android/hi/changelogs/993.txt | 12 ++ .../metadata/android/hu/changelogs/63.txt | 2 +- .../metadata/android/hu/changelogs/65.txt | 30 ++--- .../metadata/android/hu/changelogs/68.txt | 31 +++++ .../metadata/android/hu/changelogs/974.txt | 5 + .../metadata/android/hu/changelogs/978.txt | 1 + .../metadata/android/hu/changelogs/979.txt | 2 + .../metadata/android/hu/changelogs/991.txt | 2 +- .../metadata/android/hu/changelogs/993.txt | 12 ++ .../metadata/android/hu/full_description.txt | 2 +- .../metadata/android/ko/changelogs/952.txt | 7 ++ .../metadata/android/nl/changelogs/953.txt | 2 +- .../metadata/android/sk/changelogs/65.txt | 26 ++++ .../metadata/android/sk/changelogs/66.txt | 33 +++++ .../metadata/android/sk/changelogs/989.txt | 3 + .../metadata/android/sk/changelogs/990.txt | 15 +++ .../metadata/android/sk/changelogs/992.txt | 17 +++ .../metadata/android/sk/changelogs/993.txt | 12 ++ .../metadata/android/ti/changelogs/850.txt | 1 + .../metadata/android/ti/full_description.txt | 1 + .../metadata/android/ti/short_description.txt | 1 + 66 files changed, 1403 insertions(+), 198 deletions(-) create mode 100644 app/src/main/res/values-kn/strings.xml create mode 100644 app/src/main/res/values-ti/strings.xml create mode 100644 fastlane/metadata/android/ar/changelogs/65.txt create mode 100644 fastlane/metadata/android/ar/changelogs/66.txt create mode 100644 fastlane/metadata/android/ar/changelogs/780.txt create mode 100644 fastlane/metadata/android/ar/changelogs/790.txt create mode 100644 fastlane/metadata/android/de/changelogs/993.txt create mode 100644 fastlane/metadata/android/hi/changelogs/993.txt create mode 100644 fastlane/metadata/android/hu/changelogs/68.txt create mode 100644 fastlane/metadata/android/hu/changelogs/974.txt create mode 100644 fastlane/metadata/android/hu/changelogs/978.txt create mode 100644 fastlane/metadata/android/hu/changelogs/979.txt create mode 100644 fastlane/metadata/android/hu/changelogs/993.txt create mode 100644 fastlane/metadata/android/ko/changelogs/952.txt create mode 100644 fastlane/metadata/android/sk/changelogs/65.txt create mode 100644 fastlane/metadata/android/sk/changelogs/66.txt create mode 100644 fastlane/metadata/android/sk/changelogs/989.txt create mode 100644 fastlane/metadata/android/sk/changelogs/990.txt create mode 100644 fastlane/metadata/android/sk/changelogs/992.txt create mode 100644 fastlane/metadata/android/sk/changelogs/993.txt create mode 100644 fastlane/metadata/android/ti/changelogs/850.txt create mode 100644 fastlane/metadata/android/ti/full_description.txt create mode 100644 fastlane/metadata/android/ti/short_description.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 569701eead1..0bf017961ef 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -23,7 +23,7 @@ فاتح خطأ في الشبكة لم يتم العثور على مشغل بث. تثبيت VLC؟ - فتح في متصفح الويب + فتح في المتصفح الصوت تشغيل بواسطة كودي البحث @@ -91,7 +91,7 @@ محتوى مقيد للبالغين بث مباشر تقرير عن المشكلة - متوقف + معطل تنظيف أفضل دقة تراجع @@ -133,7 +133,7 @@ لاتوجد فيديوهات ابدأ إيقاف مؤقت - حذف + احذف التوقيع حسناً اسم الملف @@ -158,9 +158,9 @@ ساهم إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل! عرض على GitHub - تبرع + تبرَّع يتم تطوير NewPipe من قبل متطوعين يقضون وقت فراغهم لتقديم أفضل تجربة لك. حان الوقت لرد المساعدة مع المطورين وجعل NewPipe أكثر و أفضل بينما يستمتعون بفنجان من القهوة. - تبرع + رد الجميل موقع الويب قم بزيارة موقع NewPipe لمزيد من المعلومات والمستجدات. تراخيص NewPipe @@ -174,7 +174,7 @@ الشائعة أفضل ٥٠ جديد وساخن - حذف + أحذف التفاصيل إعدادات الصوت بدأ التشغيل في نافذة منبثقة @@ -791,4 +791,26 @@ اختر إيماءة للنصف الأيسر من شاشة المشغل اختر إيماءة للنصف الأيمن من شاشة المشغل مستوى الصوت + قم بتغيير حجم الفاصل الزمني للتحميل على المحتويات التدريجية (حاليا %s). قد تؤدي القيمة المنخفضة إلى تسريع التحميل الأولي + تفضل الصوت الوصفي + الصوت : %s + المسار الصوتي + يجب أن يكون هناك مسار صوتي موجود بالفعل في هذا البث + حدد مسار الصوت للمشغلات الخارجية + غير معروف + إعدادات ExoPlayer + إدارة بعض إعدادات ExoPlayer. تتطلب هذه التغييرات إعادة تشغيل المشغل لتصبح سارية المفعول + استخدم دائمًا الحل البديل لإعداد سطح إخراج فيديو ExoPlayer + %s %s + الافتراضي + مدبلجة + وصفي + حدد المسار الصوتي الأصلي بغض النظر عن اللغة + تفضيل الصوت الأصلي + حدد مسارًا صوتيًا يحتوي على أوصاف للأشخاص ضعاف البصر إذا كان ذلك متاحًا + استخدم ميزة فك ترميز وحدة فك التشفير الاحتياطية في ExoPlayer + قم بتمكين هذا الخيار إذا كانت لديك مشكلات في تهيئة وحدة فك التشفير ، والتي تعود إلى أجهزة فك التشفير ذات الأولوية الأقل إذا فشلت تهيئة وحدات فك التشفير الأولية. قد ينتج عن ذلك أداء تشغيل ضعيف مقارنة باستخدام وحدات فك التشفير الأساسية + يقوم هذا الحل البديل بتحرير وإعادة إنشاء نماذج برامج ترميز الفيديو عند حدوث تغيير في السطح، بدلا من تعيين السطح إلى برنامج الترميز مباشرة. تم استخدام هذا الإعداد بالفعل بواسطة ExoPlayer على بعض الأجهزة التي تعاني من هذه المشكلة ، وهذا الإعداد له تأثير فقط على Android 6 والإصدارات الأحدث +\n +\nقد يؤدي تمكين هذا الخيار إلى منع أخطاء التشغيل عند تبديل مشغل الفيديو الحالي أو التبديل إلى وضع ملء الشاشة \ No newline at end of file diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 29c32001661..0072f818748 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -4,35 +4,35 @@ %1$s tarixində yayımlanıb Yayım oynadıcı tapılmadı. \"VLC\" quraşdırılsın\? Yayım oynadıcı tapılmadı (Oynatmaq üçün VLC quraşdıra bilərsiniz). - Yüklə + Quraşdır Ləğv et Brauzerdə aç Paylaş - Endir - Yayım faylını endir + Yüklə + Yayım faylın yüklə Axtarış Tənzimləmələr - Bunu demək istəyirdiniz: \"%1$s\"\? + \"%1$s\" nəzərdə tuturdunuz\? ilə paylaş Xarici video oynadıcı istifadə et - Bəzi ayırdetmələrdə səsi silir + Bəzi formatlarda səsi silir Xarici səs oynadıcı istifadə et Abunə Ol Abunə olundu Kanal abunəliyi ləğv edildi Məlumat göstər - Abunələr - Əlfəcinlənmiş Pleylistlər + Abunəliklər + Əlfəcinlənmiş Oynatma Siyahıları Yeniliklər Fon - Video endirmə qovluğu - Endirilmiş video fayllar burada saxlanılır - Video fayllar üçün endirmə qovluğu seç - Səs endirmə qovluğu - Endirilmiş səs faylları burada saxlanılır - Səs faylları üçün endirmə qovluğu seç - Standart ayırdetmə - Daha böyük ayırdetmələr göstər + Video yükləmə qovluğu + Yüklənilmiş video fayllar burada saxlanılır + Video fayllar üçün yükləmə qovluğu seç + Səs yükləmə qovluğu + Yüklənilmiş səs faylları burada saxlanılır + Səs faylları üçün yükləmə qovluğu seç + Standart format + Daha böyük formatlar göstər \"Kodi\" ilə Oynat Çatışmayan \"Kore\" tətbiqi yüklənilsin\? \"Kodi ilə Oynat\" seçimini göstər @@ -85,13 +85,13 @@ İkinci fəaliyyət düyməsi Birinci fəaliyyət düyməsi Yalnız bəzi cihazlar 2K/4K videoları oynada bilir - Standart ani görüntü ayırdetməsi + Standart ani görüntü formatı Əlavə Et Ani Görüntü Paneli Seç Abunəliyi yeniləmək alınmadı Abunəliyi dəyişmək alınmadı - Nəticələr göstərilir: %s + %s üçün nəticələr göstərilir Kanallar %s tərəfindən YouTube\'un \"Məhdud Rejimi\"ni aç @@ -425,21 +425,21 @@ Həm kilid ekranı fonu, həm də bildirişlər üçün miniatür istifadə et Ən Yeni Bu məzmun ölkənizdə mövcud deyil. - Bu məzmun yalnız ödəniş etmiş istifadəçilər üçün əlçatandır, ona görə də NewPipe tərəfindən yayımlana və ya endirilə bilməz. + Bu məzmun yalnız ödəniş etmiş istifadəçilər üçün əlçatandır, beləliklə, NewPipe tərəfindən yayımlana və ya yüklənilə bilməz. Avtomatik (cihaz teması) Sevimli gecə temanızı seçin — %s - Sabitlənmiş şərh - Bildirişlər deaktiv edilib + Sancaqlanmış şərh + Bildirişlər qeyri-aktivdir Bildiriş al Artıq bu kanala abunə oldunuz , - Hamısını dəyişdir + Hamısın dəyişdir Fayl adı Həll et Abunəlikləri ixrac etmək mümkün olmadı - %s izləyici - %s izləyici + %s baxıcı + %s baxıcı Yeni versiyaları əl ilə yoxla @@ -485,7 +485,7 @@ Müəllifin hesabı bağlanıb. \nNewPipe gələcəkdə bu axını yükləyə bilməyəcək. \nBu kanaldan abunəliyi çıxarmaq istəyirsiniz\? - Seçilmiş + Seçilən Çəkməcəni Bağla Video oynadıcı Video fayl xülasəsi prosesi üçün bildirişlər @@ -518,8 +518,8 @@ Eyni vaxtda ancaq bir endirmə həyata keçiriləcək Hesab ləğv edildi %s bu səbəbi təmin edir: - Endirmə başladı - Açıqlamadakı mətni seçməyi deaktiv et + Yükləmə başladı + Açıqlamadakı mətni seçməyi qeyri-aktiv et Kateqoriya Daxili Açıqlamadakı mətni seçməyi aktivləşdir @@ -544,7 +544,7 @@ Endirmə tamamlandı %s endirmə tamamlandı - Standart ExoPlayer + ExoPlayer standartı Mövcud olduqda xüsusi axından al Baxılmış videolar silinsin\? İzləniləni sil @@ -616,7 +616,7 @@ Bura ixrac et Faylı idxal et Abunəlikləri idxal etmək mümkün olmadı - Avropa Ümumi Məlumat Mühafizəsi Qaydasına (GDPR) riayət etmək üçün diqqətinizi NewPipe məxfilik siyasətinə cəlb edirik. Zəhmət olmasa, diqqətlə oxuyun. Xəta hesabatın bizə göndərmək üçün qəbul etməlisiniz. + Avropa Ümumi Məlumat Mühafizəsi Qaydasına (GDPR) riayət etmək üçün diqqətinizi NewPipe məxfilik siyasətinə cəlb edirik. Zəhmət olmasa, diqqətlə oxuyun. Xəta məlumatın bizə göndərmək üçün qəbul etməlisiniz. Bu adda fayl artıq mövcuddur Bu adla gözlənilən bir endirmə var Təyinat qovluğu yaradıla bilməz @@ -667,16 +667,16 @@ Yayım təfərrüatları yüklənir… Media tunelini deaktiv et Tətbiq çökdü - YouTube abunəliklərini Google takeout\'dan -\nidxal edin: + YouTube abunəliklərin Google Takeout-dan +\nidxal et: \n -\n1. Bu URL\'ə keçin: %1$s -\n2. Soruşulduqda daxil olun -\n3.\"Bütün Məlumatlar Daxildir\",sonra \"Heçbirini Seçmə\", yalnız \"abunəliklər\"i seçin və \"Oldu\" kliklə -\n4. \"Növbəti addım\"üzərinə klikləyin, sonra isə \"İxrac Yarat\" üzərinə klikləyin -\n5. Görünəndən sonra \"Endir\"düyməsini basın -\n6. Aşağıdakı FAYLI İDXAL ET düyməsinə klikləyin və endirilmiş .zip faylını seçin -\n7. [Əgər .zip faylı idxalı uğursuz olsa] .csv faylını çıxarın(adətən\"YouTubevəYouTubeMusic/subscriptions/subscriptions.csv\" altında),aşağıda İDXAL EDİLƏN FAYL-ı klikləyin və çıxarılmış csv faylını seçin +\n1. %1$s URL\'ə keçin: +\n2. Soruşulduqda daxil ol +\n3. \"Bütün Məlumatlar Daxildir\",sonra \"Hamısın Seçmə\", yalnız \"abunəlikləri\" seç və \"Oldu\" kliklə +\n4. \"Növbəti addım\"üzərinə kliklə, sonra isə \"İxrac Yarat\" üzərinə kliklə +\n5. Görünəndən sonra, \"Endirin\"düyməsin bas +\n6. Aşağıda FAYLI İDXAL ET düyməsin kliklə və yüklənilmiş (.zip) faylın seç +\n7. [Əgər .zip faylı idxalı uğursuz olsa] .csv faylın çıxar(adətən\"YouTubeandYouTubeMusic/subscriptions/subscriptions.csv\" altında),aşağıda FAYLI İDXAL ET-ə kliklə və çıxarılan csv faylın seç Oynatma Sürəti Nizamlamaları Ayır (pozuntuya səbəb ola bilər) Xətanı göstər @@ -696,14 +696,14 @@ Bu əməliyyat üçün uyğun fayl meneceri tapılmadı. \nZəhmət olmasa ,Yaddaş Giriş Çərçivəsinə uyğun fayl menecerini quraşdırın Bu video yalnız YouTube Music Premium üzvləri üçün əlçatandır, ona görə də NewPipe tərəfindən yayımlamaq və ya endirmək mümkün deyil. - İndi açıqlamadakı mətni seçə bilərsiniz. Nəzərə alın ki, seçim rejimində səhifə titrəyə və keçidlər kliklənməyə bilər. + İndi açıqlamadakı mətni seçə bilərsiniz. Nəzərə alın ki, seçim rejimində səhifə titrəyə və linklər kliklənməyə bilər. Bildirişdə göstərilən video miniatürünü 16:9-dan 1:1 görünüş nisbətinə qədər kəs Aşağıdakı hər bir bildiriş fəaliyyətini üzərinə toxunaraq redaktə et. Sağdakı təsdiq qutularından istifadə edərək yığcam bildirişdə göstərmək üçün onların üçünü seç Belə fayl/məzmun mənbəyi yoxdur - Seçilmiş yayım xarici oynadıcılar tərəfindən dəstəklənmir + Seçilən yayım xarici oynadıcılar tərəfindən dəstəklənmir Yükləyici tərəfindən hələ dəstəklənməyən yayımlar göstərilmir - Xarici oynadıcılar üçün heç bir səs yayımı yoxdur - Xarici oynadıcılar üçün heç bir video yayımı yoxdur + Xarici oynadıcılar üçün mövcud səs yayımı yoxdur + Xarici oynadıcılar üçün mövcud video yayımı yoxdur Xarici oynadıcılar üçün keyfiyyət seç Naməlum format Naməlum keyfiyyət @@ -739,4 +739,26 @@ Səs səviyyəsi Heç biri Oynadıcı ekranının sol yarısı üçün jest seç + Orijinal səsə üstünlük ver + Dildən asılı olmayaraq orijinal səs axını seç + Təsviri səsə üstünlük ver + Varsa, görmə qabiliyyəti zəifləyən insanlar üçün təsviri olan səs axını seçin + Səs: %s + Səs axını + Səs axını bu yayımda olmalıdır + Xarici oynadıcılar üçün səs axını seç + Naməlum + ExoPlayer tənzimləmələri + Bəzi ExoPlayer tənzimləmələrin idarə et. Bu dəyişiklikləri təsirli etmək üçün oynadıcını yenidən başlatmaq tələb olunur + ExoPlayer-in çözücü xüsusiyyətin istifadə et + Əsas çözücüləri işlətmə uğursuz olarsa, çözücü işlətmək probleminiz varsa (daha aşağı prioritetli çözücülərə düşür), bu seçimi aktiv edin. Bu, əsas çözücülərdən istifadə ilə müqayisədə zəif oynatma performansı ilə nəticələnə bilər + Bu həll yolu səthi kodlayıcıya birbaşa tənzimləmək əvəzinə, səth dəyişikliyi olarsa video kodlayıcıları buraxır və yenidən işlədir. Artıq ExoPlayer tərəfindən bu problemi olan bəzi cihazlarda istifadə olunur, bu tənzimləmənin təsiri yalnız Android 6 və daha yüksəkdə var. +\n +\nBu seçimi aktivləşdirmə cari video oynadıcı dəyişdiriləndə və ya tam ekrana keçəndə oynatma xətalarının qarşısını ala bilər + %s %s + orijinal + dublyaj edilib + təsviri + Həmişə ExoPlayer-in video çıxış səthi tənzimləməsin istifadə et + Qabaqcıl məzmunda yükləmə aralığı həcmin dəyişdir (hazırda %s). Daha aşağı dəyər onların ilkin yüklənilməsin sürətləndirə bilər \ No newline at end of file diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 7538ad9db30..0a007ab9dad 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -584,7 +584,7 @@ %d хвілінаў %d хвілінаў - Змяніць памер інтэрвалу загрузкі (зараз %s). Меншае значэнне можа паскорыць пачатковую загрузку відэа. Змены патрабуюць перазапуск плэера + Змяніць памер інтэрвалу загрузкі прагрэсіўнага змесціва (у цяперашні час %s). Меншае значэнне можа паскорыць іх першапачатковую загрузку Выключыце, каб схаваць апісанне відэа і дадатковую інфармацыю Прапановы лакальнага пошуку Наладзіць апавяшчэнне аб бягучым прайграванні патоку @@ -764,4 +764,25 @@ Выбраць жэст для левай часткі экрана прайгравання Гук Выбраць жэст для правай часткі экрана прайгравання + Выбіраць зыходную гукавую дарожку незалежна ад мовы + Аддаць перавагу арыгінальнаму гуку + Аддаць перавагу апісальнаму гуку + Выберыце гукавую дарожку з апісаннем для людзей са слабым зрокам, калі яна ёсць + Аўдыё: %s + Гукавая дарожка + Выберыце гукавую дарожку для знешніх прайгравальнікаў + Невядомая + Налады ExoPlayer + Выкарыстоўваць функцыю рэзервовага дэкодэра ExoPlayer + Заўсёды выкарыстоўваць спосаб абыходу налад паверхні відэавываду ExoPlayer + %s %s + арыгінальны + дубляваны + апісальны + Гукавая дарожка ўжо павінна прысутнічаць у гэтай плыні + Уключыце гэту опцыю, калі ў вас ёсць праблемы з ініцыялізацыяй дэкодэра, якая вяртаецца да дэкодэраў з больш нізкім прыярытэтам, калі ініцыялізацыя асноўных дэкодэраў не ўдаецца. Гэта можа прывесці да нізкай прадукцыйнасці прайгравання, чым пры выкарыстанні асноўных дэкодэраў + Кіраванне некаторымі наладамі ExoPlayer. Каб гэтыя змены ўступілі ў сілу, патрабуецца перазапуск гульца + Гэты абыходны шлях вызваляе і паўторна стварае відэакодэкі, калі адбываецца змяненне паверхні, замест таго, каб усталёўваць паверхню непасрэдна для кодэка. ExoPlayer ужо выкарыстоўваецца на некаторых прыладах з гэтай праблемай, гэты параметр мае ўплыў толькі на прыладах з Android 6 і вышэй +\n +\nУключэнне гэтай опцыі можа прадухіліць памылкі прайгравання пры пераключэнні бягучага відэаплэера або пераключэнні ў поўнаэкранны рэжым \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 7e9125ef6e1..72a780e9b75 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -117,7 +117,7 @@ Chování Historie a mezipaměť Přehrávání v okně - Vypnuto + Zakázáno Vyčistit Nejlepší rozlišení Vrátit @@ -153,7 +153,7 @@ O NewPipe Licence třetích stran © %1$s od %2$s pod %3$s - O aplikaci a ČKD + O aplikaci a FAQ Licence Svobodné a nenáročné streamování v Androidu. Zobraz na GitHubu @@ -356,8 +356,8 @@ Mřížka Automaticky Aktualizace NewPipe je k dispozici! - Hotovo - Vyčkávání + Dokončeno + Čekání Pozastaveno ve frontě zpracování @@ -366,7 +366,7 @@ Stahování se nezdařilo Vytvořit jedinečný název Přepsat - Stažený soubor s tímto názvem již existuje + Soubor s tímto názvem již existuje Stažený soubor s tímto názvem již existuje Stahování s tímto názvem již probíhá Zobrazit chybu @@ -752,4 +752,26 @@ Vyberte gesto pro levou polovinu obrazovky přehrávače Jas Vyberte gesto pro pravou polovinu obrazovky přehrávače + Změna velikosti intervalu načítání progresivního obsahu (aktuálně %s). Nižší hodnota může urychlit jejich počáteční načítání + Upřednostňovat původní zvuk + Vybrat původní zvukovou stopu bez ohledu na jazyk + Upřednostňovat popisný zvuk + Vybrat zvukovou stopu s popisem pro zrakově postižené, pokud je k dispozici + Neznámá + Nastavení přehrávače ExoPlayer + Správa některých nastavení přehrávače ExoPlayer. Tyto změny vyžadují restartování přehrávače, aby se projevily + Použít funkci náhradního dekodéru přehrávače ExoPlayer + Tuto možnost povolte, pokud máte problémy s inicializací dekodéru. V případě selhání inicializace primárních dekodérů se přehrávač vrátí zpět k dekodérům s nižší prioritou. To může mít za následek nižší výkon přehrávání než při použití primárních dekodérů + Vždy použít nastavení povrchu výstupu videa v přehrávači ExoPlayer + %s %s + původní + dabovaná + popisná + Zvuková stopa + V tomto streamu by již měla být přítomna zvuková stopa + Vyberte zvukovou stopu pro externí přehrávače + Toto obejití uvolní a znovu nainstaluje kodeky videa, když dojde ke změně povrchu, místo aby se povrch nastavil přímo na kodek. Toto nastavení, které již bylo použito v přehrávači ExoPlayer na některých zařízeních s tímto problémem, má vliv pouze na Android 6 a vyšší. +\n +\nPovolení této možnosti může zabránit chybám při přehrávání při přepnutí aktuálního přehrávače videa nebo při přepnutí na celou obrazovku + Zvuk: %s \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 0e477f38a40..17dbb3f97f8 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -739,4 +739,26 @@ Linke Gestenaktion Helligkeit Lautstärke + Ändere die Größe des Ladeintervalls für progressive Inhalte (derzeit %s). Ein niedrigerer Wert kann das anfängliche Laden der Inhalte beschleunigen. + Originalton bevorzugen + Wähle die Originaltonspur unabhängig von der Sprache + Beschreibendes Audio bevorzugen + Wähle eine Audiospur mit Beschreibungen für sehbehinderte Menschen, falls verfügbar + Audio: %s + Audiospur + Verwalte einige ExoPlayer-Einstellungen. Diese Änderungen erfordern einen Neustart des Players, um wirksam zu werden + Verwende die Decoder-Fallback-Funktion von ExoPlayer + Verwende immer die ExoPlayer-Einstellung für die Videoausgangsoberfläche als Umgehung + Dieser Workaround gibt die Video-Codecs frei und instanziiert sie neu, wenn sich die Oberfläche ändert, anstatt die Oberfläche direkt auf den Codec zu setzen. Diese Einstellung wird bereits von ExoPlayer auf einigen Geräten mit diesem Problem verwendet und hat nur Auswirkungen auf Android 6 und höher +\n +\nDas Aktivieren dieser Option kann Wiedergabefehler beim Wechsel des aktuellen Videoplayers oder beim Wechsel zum Vollbildmodus verhindern + Original + Synchronisiert + Beschreibend + Audiospur für externe Player auswählen + In diesem Stream sollte bereits eine Audiospur vorhanden sein + Aktiviere diese Option, wenn du Probleme mit der Decoderinitialisierung hast, die auf Decoder mit niedrigerer Priorität zurückgreift, wenn die Initialisierung des primären Decoders fehlschlägt. Dies kann zu einer schlechteren Wiedergabeleistung führen als bei der Verwendung von Primärdecodern + Unbekannt + ExoPlayer-Einstellungen + %s %s \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index d0d003f98ee..6f45645e2d7 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -739,4 +739,26 @@ Φωτεινότητα Ένταση Καμία + Προτίμηση πρωτότυπου ήχου + Επιλογή του πρωτότυπου κομματιού ήχου ανεξάρτητα από τη γλώσσα + Προτίμηση του περιγραφικού ήχου + Ήχος: %s + Κομμάτι ήχου + Ένα κομμάτι ήχου θα πρέπει να υπάρχει ήδη σε αυτήν τη ροή + Επιλογή ήχου για εξωτερικές συσκευές αναπαραγωγής + Άγνωστο + Ρυθμίσεις ExoPlayer + Διαχειριστείτε ορισμένες ρυθμίσεις του ExoPlayer. Αυτές οι αλλαγές απαιτούν επανεκκίνηση του προγράμματος αναπαραγωγής για να τεθεί σε ισχύ + Χρησιμοποιήστε την δυνατότητα εναλλακτικού αποκωδικοποιητή του ExoPlayer + Ενεργοποιήστε αυτήν την επιλογή εάν αντιμετωπίζετε προβλήματα με την προετοιμασία του αποκωδικοποιητή, η οποία επιστρέφει σε αποκωδικοποιητές χαμηλότερης προτεραιότητας εάν αποτύχει η προετοιμασία του πρωτεύοντος αποκωδικοποιητή. Αυτό μπορεί να έχει ως αποτέλεσμα κακή απόδοση αναπαραγωγής από ότι όταν χρησιμοποιείτε κύριους αποκωδικοποιητές + Χρησιμοποιείτε πάντα τον εναλλακτικό τρόπο ρύθμισης της επιφάνειας εξόδου βίντεο του ExoPlayer + Αυτή η λύση απελευθερώνει και επαναφέρει τους κωδικοποιητές βίντεο όταν συμβαίνει μια αλλαγή επιφάνειας, αντί να ρυθμίζει την επιφάνεια απευθείας στον κωδικοποιητή. Χρησιμοποιείται ήδη από το ExoPlayer σε ορισμένες συσκευές με αυτό το πρόβλημα, αυτή η ρύθμιση έχει επίδραση μόνο σε Android 6 και νεότερη έκδοση. +\n +\nΗ ενεργοποίηση αυτής της επιλογής μπορεί να αποτρέψει σφάλματα αναπαραγωγής κατά την εναλλαγή του τρέχοντος προγράμματος αναπαραγωγής βίντεο ή τη μετάβαση σε πλήρη οθόνη + %s %s + αρχικό + μεταγλωττισμένο + περιγραφικό + Αλλάξτε το μέγεθος του διαστήματος φόρτωσης σε προοδευτικά περιεχόμενα (προς το παρόν %s). Μια χαμηλότερη τιμή μπορεί να επιταχύνει την αρχική τους φόρτωση + Επιλογή ήχου με περιγραφές για άτομα με προβλήματα όρασης, εάν είναι διαθέσιμος \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 552a8f542ff..0b74955f206 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -755,4 +755,26 @@ Ninguno Elige un gesto para la mitad izquierda de la pantalla del reproductor Elige un gesto para la mitad derecha de la pantalla del reproductor + Prefiero el audio original + Selecciona la pista de audio original independientemente del idioma + Prefiero un audio descriptivo + Selecciona una pista de audio con descripciones para personas con discapacidad visual, si está disponible + Audio: %s + Pista de audio + Ya debería existir una pista de audio en esta transmisión + Selecciona una pista de audio para reproductores externos + Desconocido + Utilice la función de respaldo del decodificador de ExoPlayer + Utiliza siempre la configuración de ExoPlayer para la interfaz de salida del video como una solución alternativa + %s %s + original + doblado + descriptivo + Cambia el tamaño del intervalo de carga en contenidos progresivos (actualmente %s). Un valor más bajo puede acelerar la carga inicial + Ajustes para ExoPlayer + Gestiona algunos ajustes de ExoPlayer. Estos cambios requieren reiniciar el reproductor para que surtan efecto + Habilite esta opción si tiene problemas con la inicialización del decodificador recurriendo a decodificadores de menor prioridad si el decodificador principal no se inicializa. Esto puede dar como resultado un rendimiento de reproducción más bajo que cuando se usan decodificadores primarios + Esta solución alternativa libera los códecs de video y los vuelve a instanciar cuando cambia la máscara, en lugar de configurar la máscara directamente en el códec. ExoPlayer ya usa esta configuración en algunos dispositivos con este problema y solo afecta a Android 6 y versiones posteriores +\n +\nHabilitar esta opción puede evitar errores de reproducción al cambiar el reproductor de video actual o cambiar al modo de pantalla completa \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 5b2e8e125ec..91916855298 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -739,4 +739,26 @@ Eredus Vali viibe meediamängija ekraani parema poole jaoks Toiming viipel paremal poolel + Muuda video laadimise välpa (hetkel %s). Väiksemast väärtusest võib abi olla, kui tahad et video esitamine algaks varem + Eelista algset heliriba + Sõltumata keelevalikutest eelista esmaseks määratud heliriba + Eelista kirjeldavat heliriba + Eelista nägemispuudega inimeste jaoks koostatud heliriba, kui selline on olemas + Heli: %s + Selles meediavoos peaks heliriba juba olemas olema + Kasuta ExoPlayer\'i alternatiivset dekooderit + Kasuta alati ExoPlayer\'i video väljundpinna seadistamise lahendust + %s %s + algne + dubleeritud + kirjeldav + Heliriba + Vali heliriba väliste meediamängijate jaoks + Teadmata + ExoPlayer\'i seadistused + Järgnevas saad hallata mõningaid ExoPlayer\'i seadistusi. Need muudatused vajavad jõustumiseks meediamängija uuesti käivitamist + Kasuta seda võimalust, kui põhidekooder ei käivitu korralikult. Selle asemel laaditakse alternatiivne dekooder, kuid tulemuseks võib olla kehvem taasesituse kvaliteet + Video väljundpinna muutumisel see alternatiivne lahendus eemaldab videokodekid kasutusest ja laadib nad uuesti ega ürita videokodeke uue väljundpinnaga sobitada. See seadistus toimib vaid Android 6 ja uuemates versioonides ning mõne seadme puhul on juba automaatselt kasutusel +\n +\nSelle valiku kasutamine hoiab ära mõned vea, mis tekivad ekraani pööramisel ja täisekraanivaate kasutamisel \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5443fe3c891..8ce9b8737f0 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -672,7 +672,7 @@ Traitement en cours… Veuillez patienter Vérifier manuellement de nouvelles versions Vérification des mises à jour… - Vérifier les mises à jours + Vérifier les mises à jour Nouveaux éléments du flux Faire planter le lecteur Afficher « Faire planter le lecteur » @@ -754,4 +754,26 @@ Aucune Action du geste vers la droite Luminosité + Modifie la taille de l\'intervalle de chargement (actuellement %s). Une valeur plus faible peut accélérer le chargement initial des vidéos + Préférence pour l\'audio original + Sélectionner la piste audio originale quelle que soit la langue + Préférer l\'audio descriptif + Audio : %s + Piste audio + Une piste audio doit déjà être présente dans ce flux + Inconnue + Paramètres d’ExoPlayer + Gérez certains paramètres d\'ExoPlayer. Ces modifications nécessitent un redémarrage du lecteur pour être prises en compte + Utiliser la fonctionnalité de repli du décodeur d\'ExoPlayer + Toujours utiliser la solution de contournement de définition de surface de sortie vidéo d\'ExoPlayer + %s %s + original + doublée + descriptif + Cette solution de contournement libère et ré-instancie les codecs vidéo lorsqu\'un changement de surface se produit, au lieu de définir la surface du codec directement. Déjà utilisé par ExoPlayer sur certains appareils présentant ce problème, ce paramètre n\'a d\'effet que sur Android 6 et les versions ultérieures. +\n +\nL\'activation de cette option peut éviter les erreurs de lecture lors du changement de lecteur vidéo ou du passage en mode plein écran + Sélectionner une piste audio avec des descriptions pour les personnes malvoyantes si disponible + Sélectionner la piste audio pour les lecteurs externes + Activez cette option si vous rencontrez des problèmes d\'initialisation des décodeurs, ce qui permet de revenir à des décodeurs moins prioritaires si l\'initialisation des décodeurs primaires échoue. Les performances de lecture peuvent être moins bonnes que lors de l\'utilisation des décodeurs primaires \ No newline at end of file diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 1490a5960e7..7292206896a 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -41,7 +41,7 @@ Mostrar resolucións máis altas Só algúns dispositivos poden reproducir vídeos en 2K/4K Reproducir co Kodi - Quere instalar o aplicativo Kode que falta\? + Quere instalar o aplicativo Kore que falta\? Mostrar a opción «Reproducir co Kodi» Mostrar unha opción para reproducir o vídeo co Kodi Media Center Audio @@ -732,4 +732,30 @@ Completamente visto Parcialmente visto Proximamente + Escolla o xesto para a metade dereita da pantalla do reprodutor + Acción do xesto para a dereita + Acción do xesto na esquerda + Brillo + Volume + Ningún + Audio: %s + Faixa de audio + Xa debe existir unha faixa de audio nesta emisión + Selecione a faixa de áudio para reprodutores externos + Descoñecida + Configuracións ExoPlayer + Xestione algunhas configuracións de ExoPlayer. É necesario reiniciar o reprodutor para aplicar os cambios + Use a función fallback do decodificador do ExoPlayer + Habilite esta opción se ten problemas na inciciación do decodificador. Usaranse decodificadores de menor prioridade se os primarios fallan. Isto pode resultar nun menor rendemento comparado co dos primarios + Usar sempre Explayer como alternativa de saída de vídeo + %s %s + orixinal + dobrado + descritivo + Altera o tamaño do intervalo de carregamento progresivo (o actual é %s). Un valor menor pode acelerar o carregamento inicial do vídeo + Preferir o audio orixinal + Seleccionar o audio orixinal independentemente do idioma + Seleciona o audio con descrición para persoas con dificuldades de visión, se estar dispoñíbel + Prefirir o audio descritivo + Escolla o xesto para a metade esquerda da pantalla do reprodutor \ No newline at end of file diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index eb6a33cdb86..e3ff17deb55 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -765,4 +765,26 @@ נצפו במלואם להציג את השידורים הבאים להציג/להסתיר שידורים + להעדיף שמע מקורי + לבחור את רצועת השמע המקורית ללא תלות בשפה + להעדיף שמע מפורט + לבחור רצועת שמע עם תיאורים לכבדי ראייה אם ניתן + שמע: %s + רצועת שמע + רצועת שמע כבר אמורה להיות כחלק מהתזרים + לא ידועה + הגדרות ExoPlayer + להשתמש ביכולת הגיבוי של המפענח של ExoPlayer + מקורי + מדובב + בחירת רצועת שמע לנגנים חיצוניים + מפורט + ניהול חלק מהגדרות של ה־ExoPlayer שלך. השינויים האלו דורשים את הפעלת הנגן מחדש כדי להיכנס לתוקף + שינוי גודל מרווח הטעינה (כרגע %s). ערך נמוך יותר עשוי להאיץ את טעינת הווידאו הראשונית + יש להפעיל את האפשרות הזאת אם נתקלת בבעיות עם אתחול מפענח, מה שגורם להנחתה למפענחים עם עדיפות נמוכה יותר אם אתחול המפענחים העיקריים נכשל. עלול לגרום לביצועי נגינה נחותים לעומת מפענחים ראשיים + %s %s + תמיד להשתמש במעקף הגדרות משטח פלט הווידאו של ExoPlayer + המעקף הזה משחרר ומקים מחדש את מפענחי הווידאו כשמשתנה שינוי במשטח, במקום להגדיר את המשטח למפענח ישירות. כבר נעשה בזה שימוש על ידי ExoPlayer בחלק מהמכשירים עם התקלה הזאת, הגדרה זו משפיעה על Android 6 ומעלה בלבד +\n +\nהפעלת האפשרות עשויה למנוע שגיאות נגינה בעת חזרה לנגן הווידאו הנוכחית או במעבר למסך מלא \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 270a47f064f..369eaf4f7e7 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -668,7 +668,7 @@ लाइसेंस यदि आपको ऐप का उपयोग करने में परेशानी हो रही है, तो सामान्य प्रश्नों के इन उत्तरों को देखना सुनिश्चित करें! कतार में आगे जोड़ें - लोड अंतराल आकार बदलें (वर्तमान में %s)। एक कम मान आरंभिक वीडियो लोडिंग को गति दे सकता है। परिवर्तन के लिए प्लेयर को पुनः आरंभ करने की आवश्यकता होती है + प्रगतिशील सामग्री पर लोड अंतराल आकार बदलें (वर्तमान में %s)। एक कम मान उनकी आरंभिक लोडिंग को गति दे सकता है लीककैनरी उपलब्ध नहीं है एक त्रुटी हुई है, अधिसूचना देखें यदि आप काली स्क्रीन या वीडियो प्लेबैक खड़खड़ाते हुए चलने का अनुभव करते हैं तो मीडिया टनलिंग को अक्षम करें @@ -740,4 +740,25 @@ प्लेयर स्क्रीन के बाएँ आधे हिस्से के लिए जेस्चर चुनें प्लेयर स्क्रीन के दाहिने आधे हिस्से के लिए जेस्चर चुनें दाएँ इशारा क्रिया + मूल ऑडियो को प्राथमिकता दें + यदि उपलब्ध हो तो दृष्टिबाधित लोगों के लिए विवरण के साथ एक ऑडियो ट्रैक का चयन करें + वर्णनात्मक ऑडियो को प्राथमिकता दें + भाषा की परवाह किए बिना मूल ऑडियो ट्रैक का चयन करें + ऑडियो: %s + ऑडियो ट्रैक + बाहरी प्लेयर्स के लिए ऑडियो ट्रैक का चयन करें + अज्ञात + ExoPlayer सेटिंग्स + एक्सोप्लेयर के डिकोडर फॉलबैक फीचर का उपयोग करें + हमेशा ExoPlayer के वीडियो आउटपुट सतह सेटिंग वर्कअराउंड का उपयोग करें + %s %s + मूल + डब + वर्णनात्मक + एक ऑडियो ट्रैक पहले से ही इस स्ट्रीम में मौजूद होना चाहिए + इस विकल्प को सक्षम करें यदि आपके पास डिकोडर आरंभीकरण समस्याएं हैं, जो प्राथमिक डिकोडर आरंभ करने में विफल होने पर कम प्राथमिकता वाले डिकोडर पर वापस आ जाती हैं। प्राथमिक डिकोडर का उपयोग करते समय इसके परिणामस्वरूप खराब प्लेबैक प्रदर्शन हो सकता है + कुछ ExoPlayer सेटिंग्स प्रबंधित करें। इन परिवर्तनों को प्रभावी बनाने के लिए किसी प्लेयर को पुनरारंभ करने की आवश्यकता होती है + सतह को सीधे कोडेक पर सेट करने के बजाय, सतह परिवर्तन होने पर यह वर्कअराउंड वीडियो कोडेक्स को जारी और पुन: चालू करता है। इस समस्या के साथ कुछ उपकरणों पर ExoPlayer द्वारा पहले से ही उपयोग किया जाता है, इस सेटिंग का केवल Android 6 और उच्चतर पर प्रभाव पड़ता है +\n +\nइस विकल्प को सक्षम करने से वर्तमान वीडियो प्लेयर स्विच करते समय या फुलस्क्रीन पर स्विच करते समय प्लेबैक त्रुटियों को रोका जा सकता है \ No newline at end of file diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index b8b32005aa0..0048f786203 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -51,9 +51,9 @@ Ez történt: Az Ön megjegyzése (angolul): Részletek: - Elnézet, valami balul sült el. + Elnézést, valami balul sült el. Elnézést, ennek nem kellett volna megtörténnie. - Hiba bejelentése e-mailben + Jelentés e-mailben Nem sikerült a letöltési menü beállítása Nem sikerült a videó URL aláírásának feloldása Újra @@ -620,7 +620,7 @@ Lista feldolgozása… Egyes szolgáltatásoknál érhető el, általában sokkal gyorsabb, és korlátozott számú elemet adhat vissza, gyakran hiányos információkkal (például nincs hossz, elemtípus, vagy élő videó állapot) Fiók eltávolítva - Megjelölés megtekintettként + Megjelölés megnézettként Még nincs letöltési mappa beállítva, válassza ki az alapértelmezett letöltési mappát most Tekerősáv bélyegkép-előnézete Magas minőségű (nagyobb) @@ -676,7 +676,7 @@ Rögzített megjegyzés LeakCanary nem elérhető Lejátszó értesítés - Módosítsa a betöltési intervallum méretét (jelenleg %s). Az alacsonyabb érték felgyorsíthatja a videó kezdeti betöltését. A változtatásokhoz a lejátszó újraindítása szükséges + Módosítsa a progresszív tartalmak betöltési intervallumának méretét (jelenleg %s). Az alacsonyabb érték felgyorsíthatja a kezdeti betöltésüket. Az aktuális lejátszás konfigurálása értesítés Értesítések Új élő közvetítések @@ -717,4 +717,48 @@ Feliratkozások importálása vagy exportálása a 3 pontos menüből Ön a Newpipe legfrissebb verzióját futtatja Nyomjon a %s letöltéséhez + Bal gesztus művelete + Jobb gesztus művelete + Fényerő + Hangerő + Egyik sem + A kiszürkített lejátszólisták már tartalmazzák ezt az elemet. + Állandó bélyegkép feloldása + Ismétlődések eltávolítása + Végignézve + Részben megnézve + Kártya + Ez a beállítás csak a(z) %s téma esetén érhető el + Hardveresmédiagomb-események figyelmen kívül hagyása + A következő közvetítések megjelenítése + Az eredeti hangsáv választása, a nyelvtől függetlenül + A látássérülteknek szóló leírást tartalmazó hangsáv választása, ha van ilyen + Válasszon gesztust a lejátszóképernyő bal feléhez + Nem sikerült a vágólapra másolás + Ismételt elem %d alkalommal hozzáadva + Közvetítések be/ki + Egy hangsáv már jelen van ebben a közvetítésben + Hangsáv kiválasztása a külső lejátszók számára + Ismeretlen + Közelgő + ExoPlayer beállítások + Az ExoPlayer néhány beállításának kezelése. A változások életbe lépéséhez újra kell indítani a lejátszót. + Az ExoPlayer dekódoló tartalék funkciójának használata + Engedélyezze ezt a beállítást, ha dekóder előkészítési problémái vannak, ami alacsonyabb prioritású dekóderekre váltást okoz, ha az elsődleges dekóderek előkészítése sikertelen. Ez rosszabb lejátszási teljesítményt eredményezhet, mint az elsődleges dekóderek használata. + Kerülőmegoldás: mindig az ExoPlayer videokimeneti felületének használata + Ez a kerülőmegoldás elengedi és újból előkészíti a videokodekeket, ha felületváltozás történik, ahelyett, hogy közvetlenül a kodeknél állítaná be a felületet. Ez már alapból használatban van egyes, az ezzel a problémával érintett eszközöknél, a beállításnak Android 6 vagy újabb esetén van hatása. +\n +\nA beállítás bekapcsolása megakadályozhatja a lejátszási hibákat, ha átváltja a jelenlegi videolejátszót, vagy teljes képernyőre vált. + %s %s + szinkronizált + leíró + Hasznos, ha olyan fülhallgatót használ, melyen meghibásodtak a fizikai gombok + Eredeti hang előnyben részesítése + Leíró hanganyag előnyben részesítése + Válasszon gesztust a lejátszóképernyő jobb feléhez + Hang: %s + Hangsáv + Eltávolítja az ismétlődéseket\? + Eltávolítja az összes ismétlődő közvetítést ebből a lejátszólistáról\? + eredeti \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index e9bd9d0ebca..a505467b9d8 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -726,4 +726,26 @@ Tindakan gestur kanan Kecerahan Volume + Kelola beberapa pengaturan ExoPlayer. Perubahan ini mengharuskan pemain memulai ulang agar diterapkan + Aktifkan opsi ini jika Anda mengalami masalah inisialisasi dekoder, yang akan kembali ke dekoder dengan prioritas lebih rendah jika inisialisasi dekoder primer gagal. Hal ini dapat mengakibatkan performa pemutaran yang buruk dibandingkan saat menggunakan dekoder primer + Solusi ini melepaskan dan memasang kembali codec video ketika terjadi perubahan permukaan, alih-alih mengatur permukaan ke codec secara langsung. Sudah digunakan oleh ExoPlayer pada beberapa perangkat dengan masalah ini, pengaturan ini hanya berpengaruh pada Android 6 dan yang lebih tinggi +\n +\nMengaktifkan opsi ini dapat mencegah kesalahan pemutaran saat mengganti pemutar video saat ini atau beralih ke layar penuh + Ubah ukuran interval pemuatan pada konten progresif (saat ini %s). Nilai yang lebih rendah dapat mempercepat pemuatan awalnya + Lebih suka audio asli + Pilih trek audio asli apa pun bahasanya + Lebih suka audio deskriptif + Pilih trek audio dengan deskripsi untuk orang tunanetra jika tersedia + Suara: %s + Trek audio + Trek audio harus sudah ada dalam aliran ini + Pilih trek audio untuk pemutar eksternal + Tidak diketahui + Pengaturan ExoPlayer + Gunakan fitur fallback dekoder ExoPlayer + Selalu gunakan solusi pengaturan permukaan keluaran video ExoPlayer + %s %s + asli + disulih suara + deskriptif \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a653c09ae79..19898de4bed 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -752,4 +752,26 @@ Scegli il gesto per la metà sinistra del riproduttore Nessuno Scegli il gesto per la metà destra del riproduttore + Modifica la dimensione dell\'intervallo da caricare (attualmente %s). Un valore basso può velocizzare il caricamento iniziale del video + Preferisci audio originale + Seleziona la traccia audio originale indipendentemente dalla lingua + Preferisci audio descrittivo + Se disponibile, seleziona una traccia audio con descrizioni per ipovedenti + Audio: %s + Traccia audio + Seleziona traccia audio per lettori esterni + Gestisci alcune impostazioni di ExoPlayer. È necessario riavviare il riproduttore per applicarle + Sconosciuta + Impostazioni ExoPlayer + Usa la funzione di fallback del decoder di ExoPlayer + Usa sempre la soluzione alternativa per impostare la superficie di uscita video di ExoPlayer + %s %s + originale + doppiato + descrittivo + Per questo elemento dovrebbe già essere presente una traccia audio + Attivare questa opzione in caso di problemi di inizializzazione del decodificatore. Verranno usati decodificatori di priorità inferiore se l\'inizializzazione di quelli primari fallisce. Le prestazioni di riproduzione potrebbero essere inferiori rispetto all\'uso di quelli primari + Questa soluzione alternativa rilascia e re-istanzia i codec video quando si verifica una modifica della superficie, invece di impostare direttamente la superficie sul codec. Già usata da ExoPlayer su alcuni dispositivi con questo problema, questa impostazione ha effetto solo su Android 6 e versioni successive +\n +\nL\'attivazione di questa opzione potrebbe impedire errori di riproduzione passando al lettore video attuale o passando a schermo intero \ No newline at end of file diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml new file mode 100644 index 00000000000..a6b3daec935 --- /dev/null +++ b/app/src/main/res/values-kn/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index de9731a9ac3..f54da399005 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -16,7 +16,7 @@ 비디오 파일이 다운로드 될 폴더를 선택하세요 기본 해상도 Kodi로 재생 - 누락된 한국어 앱을 설치하시겠습니까\? + 누락된 Kore 앱을 설치하겠습니까\? \"Kodi로 재생\" 옵션 표시 비디오를 Kodi 미디어 센터를 사용해 재생하는 옵션을 표시합니다 오디오 @@ -335,7 +335,7 @@ 팝업 플레이어로 최소화 단계 초기화 - 저장된 탭을 읽을 수 없으므로, 기본 탭을 사용합니다 + 저장된 탭을 불러올 수 없었으므로, 기본 탭을 사용합니다 초기화 초기 설정으로 복원하시겠습니까\? 구독자 수를 가져올 수 없습니다 @@ -662,7 +662,7 @@ 외부 플레이어의 품질 선택 외부 플레이어에 사용할 수 있는 비디오 스트림이 없음 스트림 작성자, 스트림 콘텐츠 또는 검색 요청에 대한 추가 정보가 있는 메타 정보 상자를 숨기려면 끄세요 - 불러오기 간격 크기를 변경합니다 (현재 %s). 값이 낮을수록 초기 비디오 로딩 속도가 빨라질 수 있습니다. 변경하려면 플레이어를 다시 시작해야 합니다 + 프로그레시브 콘텐츠의 불러오기 간격 크기를 변경합니다 (현재 %s). 값이 낮을수록 초기 로딩 속도가 빨라질 수 있음 충돌에 대해 논의하는 문제가 이미 존재하는지 확인하세요. 중복 티켓을 생성할 때 실제 버그를 수정하는 데 시간을 할애할 수 있습니다. 오류 알림 생성 구독 선택 @@ -705,7 +705,7 @@ 최신 버전의 NewPipe를 실행 중입니다 %s를 다운로드하려면 탭하세요. 영구 썸네일 설정 해제 - 이 옵션은 테마로 %s을 선택한 경우에만 사용할 수 있습니다 + 이 옵션은 %s가 테마로 선택되었을 경우에만 사용할 수 있습니다 중복 추가 %d 번 회색으로 표시된 재생 목록에 이미 이 항목이 포함되어 있습니다. 카드 @@ -720,4 +720,32 @@ 하드웨어 미디어 버튼 이벤트 무시 예를 들어, 물리적 버튼이 망가진 헤드셋을 사용하는 경우 유용합니다 스트림 보이기/숨기기 + 플레이어 화면 왼쪽 절반에 대한 제스처 선택 + 원본 오디오 선호 + 언어에 관계없이 원본 오디오 트랙 선택 + 가능한 경우 시각 장애인을 위한 설명이 포함된 오디오 트랙 선택 + 설명이 포함된 오디오 선호 + 플레이어 화면 오른쪽 절반에 대한 제스처 선택 + 오른쪽 제스처 동작 + 밝기 + 왼쪽 제스처 동작 + 볼륨 + 없음 + 오디오: %s + 오디오 트랙 + 이 스트림에 오디오 트랙이 이미 존재해야 함 + 외부 플레이어용 오디오 트랙 선택 + 알 수 없음 + ExoPlayer 설정 + ExoPlayer 설정을 관리합니다. 이러한 변경 사항을 적용하려면 플레이어를 다시 시작해야 함 + ExoPlayer의 디코더 폴백 기능 사용 + 항상 ExoPlayer의 비디오 출력 표면 설정 해결 방법 사용 + %s %s + 원본 + 더빙됨 + 설명 + 디코더 초기화 문제가 있는 경우 이 옵션을 활성화하면 기본 디코더 초기화에 실패할 경우 우선순위가 낮은 디코더로 되돌아갑니다. 이 경우 기본 디코더를 사용할 때보다 재생 성능이 저하될 수 있음 + 이 해결 방법은 인터페이스가 변경될 때 인터페이스를 코덱으로 직접 설정하는 대신 비디오 코덱을 해제하고 다시 인스턴스화합니다. 이 문제가 있는 일부 기기에서 ExoPlayer가 이미 사용 중인 이 설정은 안드로이드 6 이상에서만 적용 +\n +\n이 옵션을 활성화하면 현재 동영상 플레이어를 전환하거나 전체 화면으로 전환할 때 재생 오류를 방지할 수 있음 \ No newline at end of file diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 1f4922a08b5..9a45545a419 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -70,7 +70,7 @@ Negalima sutvarkyti atsisiuntimų meniu Programėlė/ vartotojo sąsaja nulūžo Atsiprašome, taip neturėjo įvykti. - Pranešti apie šią klaidą el. paštu + Pranešti el. paštu Atsiprašome, kažkas ne taip. Ataskaita Informacija: @@ -711,7 +711,7 @@ Pranešimai apie naujas transliacijas prenumeratoms Naujos transliacijos Įkeliama išsami transliacijos informacija… - Pakeiskite pakrovimo intervalo dydį (šiuo metu %s). Mažesnė vertė gali pagreitinti pradinį vaizdo įrašo įkėlimą. Dėl pakeitimų reikia iš naujo paleisti grotuvą + Pakeiskite pakrovimo intervalo dydį progresiniam turiniui (šiuo metu %s). Mažesnė vertė gali pagreitinti pradinį įkėlimą Procentai Pustonis Atkūrimo pakrovimo intervalo dydis @@ -730,4 +730,48 @@ Greitasis režimas Naudojate naujausią „NewPipe“ versiją Bakstelėkite, kad atsisiųstumėte %s + Ar norite pašalinti visus pasikartojančius srautus iš šio grojaraščio\? + Būsimas + Grojaraščiai jau turintys šį elementą išaktyvuoti. + Kartojasi pridėta %d kartus + Atjungti nuolatinę peržiūrą + Nepaisyti aparatinės įrangos media mygtukų įvykių + Naudinga naudojant ausines su sugedusiais fiziniais mygtukais + Pilnai peržiūrėta + Pageidaujama originalus garso takelis + Pasirinkti originalų audio takelį nepaisant kalbos nustatymo + Pageidaujama pasirinktinis garso takelis + Jei įmanoma, pasirinkti garso takelį su aprašymu žmonėms su klausos negalia + Pasirinkti gęstą kairei grotuvo ekrano pusei + Kairio gesto veiksmas + Pasirinkite gestą dešiniai grotuvo ekrano pusej + Garsas: %s + Audio takelis + Kortelė + Pašalinti besikartojančius + Pašalinti besikartojančius\? + Rodyti šiuos srautus + Iš dalies peržiūrėta + \"ExoPlayer\" nustatymai + Tvarkykite kai kuriuos \"ExoPlayer\" nustatymus. Kad šie pakeitimai įsigaliotų, grotuvą reikia paleisti iš naujo + Naudokite „ExoPlayer“ dekoderio atsarginę funkciją + Visada naudokite \"ExoPlayer\" vaizdo išvesties paviršiaus nustatymų apėjimą + %s %s + Nepavyko nukopijuoti į iškarpinę + originalus + Dešinio gesto veiksmas + Ryškumas + Garsas + Nieko + Rodyti / slėpti srautus + Ši parinktis galima tik tada, kai %s pasirinkta kaip tema + Šiame sraute jau turėtų būti garso takelis + Pasirinkite garso takelį išoriniams grotuvams + Nežinomas + Šis apeinamasis sprendimas atlaisvina ir iš naujo nustato vaizdo kodekus, kai pasikeičia paviršius, užuot tiesiogiai nustatęs paviršių kodekui. Šis nustatymas jau naudojamas \"ExoPlayer\" kai kuriuose įrenginiuose, kuriuose buvo ši problema, šis nustatymas turi poveikį tik \"Android 6\" ir naujesniuose įrenginiuose. +\n +\nĮjungus šią parinktį gali būti išvengta atkūrimo klaidų, kai perjungiamas dabartinis vaizdo grotuvas arba pereinama į visą ekraną + dubliuotas + Įjunkite šią parinktį, jei kyla dekoderio inicializavimo problemų, o nepavykus inicializuoti pagrindinių dekoderių, grįžtama prie žemesnio prioriteto dekoderių. Dėl to atkūrimo našumas gali būti prastesnis nei naudojant pirminius dekoderius + aprašomasis \ No newline at end of file diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index bef5ac47830..c8d3221eba2 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -68,7 +68,7 @@ Atbalstiet Libre, viegla atskaņošana uz Android. Licences - Par + Par un BUJ Trešo pušu Licences Par NewPipe Lielākā daļa īpašo rakstzīmju @@ -155,8 +155,8 @@ Detaļas: Jūsu komentārs (Angliski): Kas:\\nRequest:\\nContent Valoda:\\nContent Valsts:\\nApp Valoda:\\nService:\\nGMT Laiks:\\nPackage:\\nVersion:\\nOS versija: - Notifikācijas video apstrādes progresam - Video haša notifikācija + Paziņojumi video apstrādes progresam + Video haša paziņojums Atcerēties pēdējo popup izmēru un pozīciju Atcerēties popup īpašības Noklusējuma popup izšķirtspēja @@ -169,7 +169,7 @@ Lūdzu, pārbaudiet, vai neviens cits jau nav iesniedzis jūsu kļūdu. Veidojot dublētas biļetes, jūs aizņemat laiku, ko mēs varētu izmantot, labojot citas kļūmes. Ziņot izmantojot GitHub Kopēt formatētu ziņojumu - Ziņojiet par šo kļūdu pa e-pastu + Ziņojiet pa e-pastu Piedotiet, tam nevajadzēja notikt. Dot atļauju rādīt pāri citām aplikācijām Vai jūs vēlaties atjaunot noklusējumus\? @@ -221,10 +221,10 @@ Pārslēgt uz Popup Pārslēgt uz Fonu [Nezināms] - Notifikācijas NewPipe versijām - Aplikācijas atjauninājuma notifikācija - Notifikācijas priekš NewPipe atskaņotāja - NewPipe Notifikācija + Paziņojumi par jaunām NewPipe versijām + Aplikācijas atjauninājuma paziņojums + Paziņojumi priekš NewPipe atskaņotāja + NewPipe paziņojums Fails Tikai Vienreiz Vienmēr @@ -243,7 +243,7 @@ Videoklipi Atskaņošanas saraksts Kanāli - Viss + Visi Kļūdas ziņojums Lejupielādes Lejupielādes @@ -306,7 +306,7 @@ Plūsmas atjaunināšanas biežuma slieksnis Straume Rādīt tikai nesagrupētus abonementus - Jauns + Jauna Vai vēlaties izdzēst šo grupu\? Tukšs grupas nosaukums @@ -441,7 +441,7 @@ Tendences © %1$s no %2$s zem %3$s Lejupielāde neizdevās - Rinda + Pievienot rindai Pausēts Gaida Pabeigts @@ -532,7 +532,7 @@ Noklusējuma video formāts Noklusējuma audio formāts Audio - Ļaujiet Android pielāgot notifikācijas krāsu atbilstoši galvenajai krāsai video attēlā (ņemiet vērā, ka tas nav pieejams visās ierīcēs) + Ļaujiet Android pielāgot paziņojuma krāsu atbilstoši galvenajai krāsai video attēlā (ņemiet vērā, ka tas nav pieejams visās ierīcēs) Kopīgot Atvērt ar Atvērt pārlūkprogrammā @@ -542,20 +542,20 @@ Netika atrasts video atskaņotājs. Instalēt VLC\? Publicēts %1$s Nospiediet uz meklēšanas ikonas, lai sāktu. - Iekrāsot notifikāciju + Iekrāsot paziņojumu Nekas Ielādējas Sajaukt Atkārtot - Jūs varat izvēlēties tikai 3 darbības, kuras rādīs kompaktajā notifikācijā! - Rediģējiet katru notifikācijas darbību, pieskaroties tai. Izvēlieties trīs darbības, kuras rādīs kompaktā notifikācijā, izmantojot rūtiņas labajā pusē + Jūs varat izvēlēties tikai 3 darbības, kuras rādīs kompaktajā paziņojumā! + Rediģējiet katru paziņojuma darbību, pieskaroties tai. Izvēlieties trīs darbības, kuras rādīs kompaktā paziņojumā, izmantojot rūtiņas labajā pusē Piektā darbības poga Ceturtā darbības poga Trešā darbības poga Otrā darbības poga Pirmā darbības poga - Piemērot video attēlu, kuru rāda notifikācijā, no 16:9 uz 1:1 proporciju (iespējams, attēls būs izstiepts) - Piemērot video attēlu 1:1 proporcijai + Apgriezt video attēlu, kuru rāda paziņojumā, no 16:9 uz 1:1 proporciju (iespējams, attēls būs izstiepts) + Apgriezt video attēlu uz 1:1 proporciju Rādīt opciju atskaņot video ar Kodi mediju centru Rādīt \"Atskaņot ar Kodi\" opciju Instalēt trūkstošo Kode aplikāciju\? @@ -572,7 +572,7 @@ Pievienot Fons Izvēlieties Cilni - Saglabātie atskaņošanas saraksti + Saglabātie saraksti Abonementi Rādīt informāciju Nevarēja atjaunināt abonementu @@ -671,10 +671,10 @@ Lejupielādes pabeigtas Tagad varat atlasīt tekstu video aprakstā. - Notifikācijas + Paziņojumi Avarēt atskaņotāju - Pielāgojiet pašlaik atskaņotās plūsmas notifikāciju - Atskaņotāja notifikācija + Pielāgojiet pašlaik atskaņotās plūsmas paziņojumu + Atskaņotāja paziņojums Jaunās tiešraides Radās kļūda, detalizētāku informāciju skatiet paziņojumā @@ -688,4 +688,49 @@ Kļūdas ziņojuma paziņojums Atskaņošanas ielādēšanas intervāla lielums NewPipe radās kļūdu, pieskarieties, lai ziņotu + Kreisā žesta darbība + Neizdevās kopēt starpliktuvē + Noņemt pastāvīgo sīktēlu + Pārbaudīt, vai nav jaunas tiešraides + Rāda avarēšanas iespēju, kad lietojat atskaņotāju + Dzēst dublikātus + Rādīt sekojošās tiešraides + Saraksti, kas atzīmēti pelēkā, jau satur šo objektu. + LeakCanary nav pieejams + Izveidot kļūdas paziņojumu + Jebkurš tīkls + Jums ir jaunākā NewPipe versija + Noderīgi, piemēram, lietojot austiņas ar bojātām pogām + Izvēlēties skaņu celiņu ar audio aprakstu cilvēkiem ar redzes traucējumiem, ja tāds ir pieejams + Ignorēt ierīces multimēdiju pogas + Izdzēst visus lejupielādētos failus\? + Jaunumi kanālā + Dot priekšroku oriģinālajai skaņai + Izvēlēties oriģinālo skaņu celiņu, neatkarīgi no valodas + Dot priekšroku skaņu celiņam ar audio aprakstu + Izvēlēties žestu kreisajai atskaņotāja ekrāna pusei + Izvēlēties žestu labajai atskaņotāja ekrāna pusei + Labējā žesta darbība + Spilgtums + Skaļums + Nekā + Importējiet vai eksportējiet abonementus 3-punktu izvēlnē + Ja Jums rodas problēmas ar lietotni, noteikti apskatiet šīs atbildes bieži uzdotiem jautājumiem! + Skatīt tīkla vietnē + Skaņa: %s + Skaņu celiņš + Ielādē straumes informāciju… + Dublikāts pievienots %d reizi(-es) + Rādīt \"avarēt atskaņotāju\" + Karte + Spiediet, lai lejupielādētu %s + Dzēst dublikātus\? + Vai vēlaties dzēst visus tiešraižu dublikātus šajā sarakstā\? + Rādīt/slēpt tiešraides + Ātrais režīms + Paziņot par jaunām tiešraidēm no abonementiem + Procenti + Pustonis + Paziņojumi par jaunām tiešraidēm + Pārbaužu biežums \ No newline at end of file diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index d75570d45a4..29769acae37 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -649,4 +649,6 @@ പ്ലേയർ അറിയിപ്പ് പുതിയ സ്ട്രീമുകൾ പ്ലേയർ തകർക്കുക + യഥാർത്ഥ ശബ്ദത്തിന് പരിഗണന കൊടുക്കുക + ഭാഷ ഏതായാലും യഥാർത്ഥ ശബ്ദം തിരഞ്ഞെടുക്കുക \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 254a90c411e..bf43f47da91 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -16,7 +16,7 @@ Voer de downloadlocatie in voor video\'s Standaardresolutie Afspelen met Kodi - Kore-app niet gevonden. Deze installeren\? + Ontbrekende Kore-app installeren\? \"Afspelen met Kodi\"-optie tonen Toon een optie om een video af te spelen via Kodi media center Audio @@ -725,18 +725,40 @@ Linker gebaaractie Rechter gebaaractie Geen - Verwijder duplicaten - Verwijder duplicaten\? + Verwijder dubbelen + Verwijder dubbelen\? Wil je alle dubbele streams in deze afspeellijst verwijderen\? Streams weergeven/verbergen Volledig bekeken Gedeeltelijk bekeken Aanstaande Kies een gebaar voor de rechterhelft van het spelersscherm - Negeer hardware-mediaknopgebeurtenissen + Fysieke knoppen voor mediabediening negeren Helderheid Volume - Handig als je bijvoorbeeld een headset gebruikt met kapotte fysieke knoppen + Handig, als je bijvoorbeeld een headset gebruikt met fysieke knoppen die stuk zijn Kies een gebaar voor de linkerhelft van het spelersscherm Laat de volgende streams zien + Selecteer een audiotrack met beschrijvingen voor slechtzienden, indien beschikbaar + Deze tijdelijke oplossing geeft videocodecs vrij en activeert ze opnieuw wanneer er een oppervlakteverandering optreedt, in plaats van de oppervlakte rechtstreeks op de codec in te stellen. Dit wordt al gebruikt door ExoPlayer op sommige apparaten met dit probleem; deze instelling heeft alleen effect op Android 6 en hoger +\n +\nAls je deze optie inschakelt, voorkom je mogelijk afspeelfouten bij het wisselen van de huidige videospeler of het overschakelen naar volledig scherm + Wijzig de grootte van het laadinterval voor progressieve inhoud (momenteel %s). Een lagere waarde kan het initiële laden versnellen + Geef de voorkeur aan originele audio + Selecteer de originele audiotrack, ongeacht de taal + Geef de voorkeur aan beschrijvende audio + Audio: %s + Audiotrack + Er zou al een audiotrack in deze stream aanwezig moeten zijn + Selecteer audiotrack voor externe spelers + Onbekend + ExoPlayer-instellingen + Beheer enkele ExoPlayer-instellingen. Deze wijzigingen vereisen een herstart van de speler om van kracht te worden + Gebruik de terugvalfunctie van de ExoPlayer-decoder + Schakel deze optie in als je problemen hebt met de initialisatie van de decoder, die terugvalt op decoders met een lagere prioriteit als de initialisatie van de primaire decoder mislukt. Dit kan leiden tot slechtere afspeelprestaties dan bij gebruik van primaire decoders + Gebruik altijd de tijdelijke oplossing voor het instellen van het video-uitvoeroppervlak van ExoPlayer + %s %s + origineel + nagesynchroniseerd + beschrijvend \ No newline at end of file diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index 5f34c0ccf3a..55c3cdc6212 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -2,29 +2,29 @@ Trykk på aukeglaset for å byrja. Gjeve ut den %1$s - Fann ingen straumspelar. Legg inn VLC\? - Ingen straumavspelar funne (du kan leggja inn VLC for å spela av straumen). + Fann ingen straumavspelarar. Legg inn VLC\? + Fann ingen straumavspelarar (du kan leggja inn VLC for å spela av straumen). Legg inn Avbryt Greitt - Opna i ein nettlesar + Opn i ein nettlesar Merk som sett Sprett opp i eit vindauga - Opna med + Opn med Del Søk Innstillingar Meinte du «%1$s»\? Del med - Nytta ytre videospelar + Nytt ytre videospelar Tek bort ljod ved somme oppløysingar - Nytta ein ytre ljodavspelar + Nytt ein ytre ljodavspelar Fylg Fylgjer Stogg å fylgja - Gjeve opp å fylgja kanalen + Stogga å fylgja kanalen Vis opplysingar - Fylgingar + Fylgde Gøymde spelelister Vel fane Sprett opp @@ -34,30 +34,30 @@ Vis høgare oppløysingar Berre somme einingar kan spela av 2K-/4K-videoar Spel av med Kodi - Syna \"Spela av med Kodi\"-val + Vis \"Spela av med Kodi\"-val Hent Hent straumfil Gøymer henta videofiler her Bakgrunn Videohentingsmappe - Henta ljodfiler vert gøymt her + Henta ljodfiler vert gøymde her Vel hentemappe for ljodfiler Legg inn saknande Kore-app\? Viser svar for: %s - Kunne ikkje brigde fylging - Nettbrettmodus + Greidde ikkje å brigde fylginga + Nettbrettvising Av Merknader er slått av , Slå av/på alle - Ingen ljodstraumar er tilgjengelege for ytre spelarar - Ingen videostraumar er tilgjengelege for ytre spelarar - Vel kvalitet for ytre spelarar + Ingen ljodstraumar er tilgjengelege for ytre avspelarar + Ingen videostraumar er tilgjengelege for ytre avspelarar + Vel kvalitet for ytre avspelarar Skil ut - Opna nettstaden + Opn nettstaden Du fylgjer no denne kanalen - Vald straum er ikkje stødd av ytre spelarar + Vald straum er ikkje stødd av ytre avspelarar Straumar som ikkje enno er stødde av hentaren, er ikkje synlege Ukjend kvalitet Ukjend format @@ -68,4 +68,89 @@ Skjer videosmåbiletet som vert vist i varselet, ifrå storleikshøvet 16:9 til 1:1 Fyrste gjerdknapp Andre gjerdknapp + Ingenting + Ljod + Tredje gjerdknapp + Fjerde gjerdknapp + Femte gjerdknapp + Du kan berre velja opp til tre gjerder til å verta viste i det tette varselet. + Gjenta + Bland + Lét varsla + La Android velja léten til varsla ut ifrå hovudléten i småbiletet (merk at dette ikkje er tilgjengeleg på alle einingar) + Forvalt ljodformat + Forvalt videoformat + Ham + Nattham + Ljos + Mørk + Svart + Hugs oppsprettseigenskapar + Hugs den siste storleiken og staden til oppsprettsvindauga + Stadfest radtømming + Byte ifrå ein avspelar til ein annan kan skifta ut rada di + Den noverande avspelingsrada vil verta skift ut + Hent fram småbilete + Sjå bort ifrå mediaknappetrykk + Nyttig om du til dømes nyttar høyretelefonar med skadde knappar + Ingen + Søkjeframlegg + Søkjeframlegg på eininga + Søkjeframlegg på nettet + Vis søkjeframlegg ved søk + Visingshistorikk + Spel av der du slapp + Kjente ikkje att nettadressa. Opn med ein annan app\? + Forvalt innhaldsland + Avspelar + Krasj avspelaren + Trykk på ei varselgjerd under for å byta ho ut. Vel opptil tre av dei til å verta viste i det samantrengde varselet ved å merkja dei av på høgre side + Nytt kvikk slurvne spoling + Hopplengd (framover/bakover) + Slurvne spoling lar avspelaren spole kvikkare, men slurvnare. 5, 15 og 25-sekundshopping verkar ikkje med dette + Tøm data + Ustødd nettadresse + Vis «Hald for å rade»-råd + Vis «Neste» og «Liknande» videoar + Vis utsegner + Slå av for å skjula utsegner + Vis utgreiingar + Slå av for å skjula videoutgreiingar og ytterlegare opplysingar + Vis metadata + Slå av for å skjula medadataområde med tilleggsopplysingar om straumskaparen, strauminnhaldet eller eit søk + Vel det opphavlege ljodsporet utan omsyn til tungemålet + Helst utgreiande ljod + Sjølvverkande rad neste straum + Hald fram ei ugjentakande avspelingsrad ved å leggja til ein liknande straum + Rad sjølvverkande + Venstre handvendingsgjerd + Vel ei handvending for den høgre sida av avspelingsskjermen + Søkjehistorikk + Spar søk på eininga + Hald fram straumar der du sist slapp + Vis listeframgang + Vis avspelingsstadteikn i lister + Lag ei liste over avspelte straumar + Hald fram avspeling + Hald fram med å spela av etter avbrot (t.d. telefonsamtaler) + Hent + Byrj hovudavspelaren i fullskjerm + Om sjølvverkande snuing er slegen av, byrj videoar i fullskjerm i staden for i småavspelaren. Du kan framleis nytte småavspelaren ved å gå ut av fullskjermsvisinga + Spel av sjølvverkande + Vis eit råd ved trykk på «Bakgrunn» eller «Sprett opp»-knappane i videodetaljane + Forvalt tungemål for innhald + Stør berre HTTPS-nettadresser + Åtferd + Video og ljod + Utsjånaden + Avspelingsvarsel + Spelar av i bakgrunnen + Hopp over togner + Helst opphavleg ljod + Om tilgjengeleg, vel eit ljodspor med utgreiingar for blinde + Vel ei handvending for den venstre sida av avspelingsskjermen + Høgre handvendingsgjerd + Ljosstyrke + Ljodstyrke + Oppdateringar \ No newline at end of file diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml index 5cceb93a4e5..e177035b2f6 100644 --- a/app/src/main/res/values-nqo/strings.xml +++ b/app/src/main/res/values-nqo/strings.xml @@ -62,7 +62,7 @@ ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߫ ߞߟߐ߬ߡߊ ߞߊ߬ ߊ߲ߘߙߏߌߘ ߟߐ߬ ߛߐ߬ߓߌ߲߬ߘߐ߬ߓߏ߲ ߞ߬ߟߐ ߟߊߖߘߍ߬ߕߦߊ߬ ߟߊ߫ ߞߵߊ߬ ߓߍ߲߬ ߞߏ߬ߋߞߏ߬ߋ߫ ߞߐ߬ߟߐ ߓߊߖߎ ߡߊ߬ (ߦߴߊ߬ ߟߐ߲߫ ߞߴߏ߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߕߙߏߞߏ ߓߍ߯ ߟߊ߫) ߔߙߏ߬ߔߙߏ߬ ߢߌߣߌ߲ߠߌ߲߫ ߠߵߊ߬ ߞߍ߫ ߟߊ߫ ߕߏߟߏ߲ߟߊ߲ ߘߌ߫ ߘߌ߲߬ߞߌߙߊ ߟߎ߬ ߢߌߣߌ߲߫ ߞߊߟߌߦߊߓߟߏ ߡߊ߬ ߞߏ߬ߣߵߊ߬ ߕߋߟߋ߲ߣߍ߲߫ ߕߍ߫ ߖߋߞߎ߫. ߞߊ߬ ߢߌߣߌ߲ߠߌ߲ ߞߍ߫ ߝߌ߬ߟߊ߲߬ ߅، ߁߅، ߥߟߊ߫ ߂߅ ߞߘߐ߫߸ ߊ߬ ߣߴߏ߬ ߕߍ߫ ߛߋ߫ ߓߍ߲߬ ߠߊ߫ - ߞߊ߬ ߖߛߐߟߌ ߕߍߟߊ߫ ߘߍ߲߬ߘߍ߲ ߡߊߝߊ߬ߟߋ߲߬ (ߕߋ߲߭ߕߋ߲߬ %s). ߡߐ߬ߟߐ߲߬ ߘߋ߲߬ߣߍ߲ ߘߌ߫ ߛߋ߫ ߦߋߡߍ߲ߕߊ߫ ߘߊߦߟߍ ߟߞߊߟߌߦߊ߫ ߟߊ߫. ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߡߊ߬ߞߏ߫ ߦߋ߫ ߡߍߣߍ߲ߡߊߛߊߦߌ ߟߊ߫ + ߞߊ߬ ߖߛߐߟߌ ߕߍߟߊ߫ ߘߍ߲߬ߘߍ߲ ߡߊߝߊ߬ߟߋ߲߬ ߞߣߐߘߐ߫ ߢߍߕߊ߯ߡߊ ߞߊ߲߬ (ߕߋ߲߭ߕߋ߲߬ %s). ߡߐ߬ߟߐ߲߬ ߘߋ߲߬ߣߍ߲ ߘߌ߫ ߛߋ߫ ߊ߬ ߖߛߐߟߌ߫ ߝߟߐ ߟߞߊߟߌߦߊ߫ ߟߊ߫ ߞߊ߬ ߟߊ߬ߛߙߋ߬ߦߊ߬ߟߌ ߡߊ߬ߣߌ߲߬ߞߊ߬ ߕߎ߲߰ߠߌ߲ ߘߏ߫ ߝߌߘߊ߲߫ ߕߐ߫ ߞߊ߬ ߓߐ߫ ߕߏߟߏ߲ߟߊ߲ ߘߏ߫ ߟߊ ߞߊ߬ ߥߊ߫ ߘߏ߫ ߜߘߍ߫ ߟߊ߫߸ ߏ߬ ߘߌ߫ ߛߋߴߌ ߟߊ߫ ߕߎ߲߰ߠߌ߲ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ ߟߊ߫ ߡߊ߬ߛߊߦߌ @@ -727,4 +727,13 @@ ߞߣߐߘߐ ߣߌ߲߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌ ߟߊ߫ ߖߡߊ߬ߣߊ ߞߣߐ߫. ߢߣߊߕߊ ߣߌ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߫ ߠߋ߬ ߘߐߙߐ߲߫ ߣߌ߫ %s ߛߎߥߊ߲ߘߌߣߍ߲߫ ߛߊߛߊ ߢߍ߫ ߌ ߘߌ߫ ߛߋ߫ ߞߟߏߜߍ ߓߊߕߐߡߐ߲߫ ߠߊ߫ ߞߊ߲߬ߛߓߍ ߘߐ߫ ߡߎ߬ߕߎ߲߬. ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߞߐߜߍ߫ ߘߌ߫ ߛߋ߫ ߡߣߍߡߣߍ߫ ߟߊ߫ ߊ߬ߣߌ߫ ߛߘߌ߬ߜߋ߲ ߠߎ߬ ߝߊߣߊ߲߫ ߘߌ߫ ߛߋ߫ ߟߊߝߏߦߊ߫ ߟߴߊ߬ ߘߐ߫. + ߡߍ߲ߕߊ߫ ߞߊ߲߬ߛߓߍ߬ߡߊ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ ߢߟߊߝߌ߲ߓߊ߯ߕߐ ߟߎ߬ ߢߌ߫߸ ߣߴߏ߬ ߘߐ߫ ߞߍ߫ ߘߊ߫ ߦߋ߲߬ + ߡߍ߲ߘߊ: %s + ߡߍ߲ߕߊ߫ ߜߙߋ + ߡߍ߲ߕߊ߫ ߜߙߋ ߘߏ߫ ߞߊߞߊ߲߫ ߞߊ߬ ߞߍ߫ ߥߏ߬ߦߏ ߣߌ߲߬ ߞߣߐ߫ ߞߘߐ߬ߡߊ߲߫ + ߡߍ߲ߕߊ߫ ߜߙߋ ߛߎߥߊ߲ߘߌ߫ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫ + Exoplayer ߢߊߓߐߟߌ ߟߎ߬ + ߡߍ߲ߕߊ߫ ߜߙߋ ߛߎ߲ߞߎ߲ߡߊ ߛߎ߲ߥߊ߲ߘߌ߫߸ ߊ߬ ߞߍߘߊ߫ ߞߊ߲ ߛߎ߯-ߛߎ߯ ߘߌ߫ + ߡߍ߲ߕߊ߫ ߞߊ߲߬ߛߓߍ߬ߡߊ ߟߊߝߌ߬ߛߊ߬ߦߊ߫ + ߡߊߟߐ߲ߓߊߟߌ \ No newline at end of file diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 82082f875e0..69dad642b08 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -639,7 +639,7 @@ ਸੀਕਬਾਰ ਥੰਮਨੇਲ ਦੀ ਝਲਕ ਸਮਾਂ-ਅਵਧੀ ਜਦ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫੀਡ ਦੁਬਾਰਾ ਅੱਪਡੇਟ ਕੀਤੀ ਜਾ ਸਕੇ — %s ਰਚਨਾਕਾਰ ਨੇ ਦਿਲੋਂ ਪਸੰਦ ਕੀਤਾ - ਲੋਡ ਅੰਤਰਾਲ ਆਕਾਰ ਬਦਲੋ (ਮੌਜੂਦਾ %s ਤੇ)। ਛੋਟੀ ਸੰਖਿਆ ਵੀਡੀਓ ਜਲਦੀ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਮੱਦਦ ਦੇ ਸਕਦੀ ਹੈ। ਬਦਲਾਅ ਪਲੇਅਰ ਦੁਬਾਰਾ ਚਲਾਉਣ ਤੇ ਹੀ ਹੋਣਗੇ + ਪ੍ਰਗਤੀਸ਼ੀਲ ਸਮੱਗਰੀ ਉੱਤੇ ਲੋਡ ਅੰਤਰਾਲ ਆਕਾਰ ਬਦਲੋ (ਮੌਜੂਦਾ %s ਤੇ)। ਛੋਟੀ ਸੰਖਿਆ ਉਸਨੂੰ ਜਲਦੀ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਮੱਦਦ ਦੇ ਸਕਦੀ ਹੈ ਖੋਜ ਦੇ ਸਥਾਨਕ ਸੁਝਾਅ ਖੋਜ ਦੇ ਰਿਮੋਟ ਸੁਝਾਅ ਮੁੱਖ ਪਲੇਅਰ ਪੂਰੀ ਸਕਰੀਨ ਵਿੱਚ ਸ਼ੁਰੂ ਕਰੋ @@ -740,4 +740,25 @@ ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਖੱਬੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਸੱਜੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ ਆਵਾਜ਼ + ਇਹ ਚੋਣ ਯੋਗ ਕਰੋ, ਜੇ ਤੁਹਾਨੂੰ ਡੀਕੋਡਰ ਸ਼ੁਰੂ ਕਰਨ ਸਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹਨ, ਜੋ ਕਿ ਘੱਟ-ਤਰਜੀਹ ਵਾਲੇ ਡੀਕੋਡਰਾਂ \'ਤੇ ਵਾਪਸ ਆ ਜਾਂਦੀਆਂ ਹਨ, ਜੇਕਰ ਪ੍ਰਾਇਮਰੀ ਡੀਕੋਡਰ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਹੋ ਜਾਂਦੇ ਹਨ। ਇਸ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਪ੍ਰਾਇਮਰੀ ਡੀਕੋਡਰਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਨਾਲੋਂ ਮਾੜੀ ਪਲੇਬੈਕ ਕਾਰਗੁਜ਼ਾਰੀ ਹੋ ਸਕਦੀ ਹੈ + ਇਹ ਵਰਕਅਰਾਊਂਡ ਸਤਹ ਨੂੰ ਸਿੱਧਾ ਕੋਡੇਕ ਤੇ ਸੈੱਟ ਕਰਨ ਦੀ ਬਜਾਏ, ਜਦੋਂ ਸਤਹ ਵਿੱਚ ਤਬਦੀਲੀ ਹੁੰਦੀ ਹੈ ਤਾਂ ਵੀਡੀਓ ਕੋਡੈਕਸ ਨੂੰ ਰਿਲੀਜ਼ ਕਰਦਾ ਹੈ ਅਤੇ ਮੁੜ-ਇੰਸਟੈਂਟ ਕਰਦਾ ਹੈ। ਇਸ ਸਮੱਸਿਆ ਵਾਲੇ ਕੁਝ ਡਿਵਾਈਸਾਂ \'ਤੇ ਐਕਸੋਪਲੇਅਰ ਪਹਿਲਾਂ ਹੀ ਵਰਤਿਆ ਜਾ ਚੁੱਕਾ ਹੈ, ਇਸ ਸੈਟਿੰਗ ਦਾ ਸਿਰਫ਼ ਐਂਡਰੌਇਡ 6 ਅਤੇ ਉਸ ਤੋਂ ਵੱਧ \'ਤੇ ਪ੍ਰਭਾਵ ਹੈ +\n +\nਇਸ ਵਿਕਲਪ ਨੂੰ ਸਮਰੱਥ ਕਰਨ ਨਾਲ ਵਰਤਮਾਨ ਵੀਡੀਓ ਪਲੇਅਰ ਦੀ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਜਾਂ ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਵੇਲੇ ਪਲੇਬੈਕ ਤਰੁੱਟੀਆਂ ਨੂੰ ਰੋਕਿਆ ਜਾ ਸਕਦਾ ਹੈ + ਅਸਲੀ ਆਡੀਓ ਨੂੰ ਤਰਜੀਹ ਦਿਓ + ਭਾਸ਼ਾ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ ਅਸਲੀ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ + ਵਰਣਨਾਤਮਕ ਆਡੀਓ ਨੂੰ ਤਰਜੀਹ ਦਿਓ + ਜੇ ਉਪਲਬਧ ਹੋਵੇ ਤਾਂ ਦ੍ਰਿਸ਼ਟੀ ਤੋਂ ਅਪੰਗ ਲੋਕਾਂ ਵਾਸਤੇ ਵਰਣਨਾਂ ਵਾਲਾ ਕੋਈ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ + ਆਡੀਓ: %s + ਆਡੀਓ ਟਰੈਕ + ਇੱਕ ਆਡੀਓ ਟਰੈਕ ਇਸ ਸਟਰੀਮ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ + ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ + ਅਗਿਆਤ + ਐਕਸੋਪਲੇਅਰ ਸੈਟਿੰਗ + ਕੁਝ ਐਕਸੋਪਲੇਅਰ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ। ਇਹਨਾਂ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਪਲੇਅਰ ਦੁਬਾਰਾ ਚਲਾਉਣ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ + ਐਕਸੋਪਲੇਅਰ ਦੀ ਡੀਕੋਡਰ ਫਾਲਬੈਕ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੋ + ਹਮੇਸ਼ਾ ਐਕਸੋਪਲੇਅਰ ਦੀ ਵਿਡੀਓ ਆਉਟਪੁੱਟ ਸਤਹ ਸੈਟਿੰਗ ਵਰਕਰਾਊਂਡ ਦੀ ਵਰਤੋਂ ਕਰੋ + %s %s + ਅਸਲੀ + ਡੱਬ ਕੀਤਾ + ਵਰਣਨਾਤਮਕ \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index ecb3322f788..7cb787bccc0 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -760,4 +760,26 @@ Głośność Brak Akcja gestu z prawej + Zmień rozmiar interwału ładowania zawartości progresywnych (aktualnie %s). Niższa wartość może przyspieszyć ich początkowe ładowanie + Preferuj oryginalny dźwięk + Wybieraj oryginalną ścieżkę dźwiękową niezależnie od języka + Preferuj audiodeskrypcję + Dźwięk: %s + Ścieżka dźwiękowa + Ścieżka dźwiękowa powinna już się znajdować w tym strumieniu + Wybierz ścieżkę dźwiękową dla zewnętrznych odtwarzaczy + Nieznana + Ustawienia ExoPlayera + Zarządzaj niektórymi ustawieniami ExoPlayera. Zmiany te wymagają ponownego uruchomienia odtwarzacza, aby zostały uwzględnione + Używaj funkcji zapasowego dekodera ExoPlayera + Włącz tę opcję, jeśli masz problemy z inicjalizacją dekodera. Przywraca dekodery o niższym priorytecie, jeśli inicjalizacja podstawowych dekoderów się nie powiedzie. Może to spowodować słabszą wydajność odtwarzania niż podczas korzystania z podstawowych dekoderów + Zawsze używaj obejścia ustawienia powierzchni wyjścia wideo ExoPlayera + %s %s + oryginalna + dubbing + audiodeskrypcja + Wybieraj ścieżkę dźwiękową z opisami dla osób niedowidzących, jeśli jest dostępna + To obejście zwalnia i ponownie tworzy instancje kodeków wideo, gdy nastąpi zmiana powierzchni, zamiast bezpośrednio ustawiać powierzchnię dla kodeka. Używane już przez ExoPlayera na niektórych urządzeniach z tym problemem, ustawienie to ma wpływ tylko na Androida 6 i nowsze. +\n +\nWłączenie tej opcji może zapobiec błędom odtwarzania podczas przełączania obecnego odtwarzacza wideo lub przechodzenia na pełny ekran \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 558fe1b3ebc..048485d9614 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -79,8 +79,8 @@ Reproduzir com Kodi Pesquisar Mostra uma opção para ver vídeo pelo media center do Kodi - Usar player de áudio externo - Usar player de vídeo externo + Usar reprodutor de áudio externo + Usar reprodutor de vídeo externo Mostrar opção \"Reproduzir com Kodi\" O que aconteceu:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo:\\nIdioma do app:\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nVersão do Sistema Operacional: Abrir no modo popup @@ -247,7 +247,7 @@ Reportar erros de out-of-lifecycle Forçar entrega de relatórios de erros Rx fora de um fragmento ou atividade de lifecycle após o descarte Usar busca de posição rápida (inexata) - A busca inexata permite que o player ache posições mais rápido com a precisão reduzida. Não funciona para voltar ou avançar 5, 15 ou 25 segundos + A busca inexata permite que o reprodutor de vídeo ache posições mais rápido com a precisão reduzida. Não funciona para voltar ou avançar 5, 15 ou 25 segundos Pôr próximo vídeo na fila automaticamente Continua a reprodução da fila (sem repetição) adicionando mais vídeos similares Arquivo @@ -550,7 +550,7 @@ Não foi possível reconhecer a URL. Abrir com outro aplicativo\? Pôr na fila automaticamente A fila do player ativo será substituída - Mudar de um player para outro pode substituir sua fila + Mudar de um reprodutor de vídeo para outro pode substituir sua fila Pedir confirmação antes de limpar uma fila Aleatório Carregando @@ -671,7 +671,7 @@ Procurar por atualizações Procurar manualmente por novas versões Procurando por atualizações… - Travar o player + Travar o reprodutor de vídeo Mostrar \"Travar o player\" Mostra uma opção de travamento ao usar o player Novos itens do feed @@ -714,7 +714,7 @@ Por cento Semitom A transmissão selecionada não é compatível com players externos - Nenhum áudio de transmissão está disponível para players externos + Nenhum transmissão de áudio está disponível para players externos Transmissões que ainda não são suportadas pelo downloader não são exibidos Nenhum vídeo de transmissão está disponível para players externos Selecione a qualidade para players externos @@ -752,4 +752,26 @@ Volume Nenhum Ação do gesto direito + Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo + Dar preferência ao áudio original + Selecionar o áudio original e independentemente do idioma + Dar preferência ao áudio descritivo + Selecionar um áudio com descrição para pessoas com dificuldades de visão, se disponível + Áudio: %s + Faixa de áudio + Seleciona faixa de áudio para players externo + Desconhecido + Configurações de ExoPlayer + Gerenciar algumas configurações de ExoPlayer. É necessário reiniciar o player para aplicar as mudanças + %s %s + original + dublado + descritivo + Esta solução alternativa libera os codificadores de vídeo quando ocorre uma alteração de superfície, em vez de definir a superfície para o codec diretamente. Já usado pelo ExoPlayer em alguns dispositivos com esse problema, essa configuração só tem efeito no Android 6 e superior +\n +\nAtivar esta opção pode evitar erros de reprodução ao alternar o reprodutor de vídeo atual ou alternar para tela cheia + Uma faixa de áudio já deve estar presente neste stream + Utilizar a função de fallback do decodificador do ExoPlayer + Sempre utilizar o configuração de saída de vídeo alternativa do ExoPlayer + Habilite essa opção se você tiver problemas de inicialização do decodificador, que retorna codificadores de baixa prioridade se o decodificador primário falhar. Isso pode resultar em pior desempenho de reprodução \ No newline at end of file diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index de0bed0a43a..f05ce58a9b0 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -44,8 +44,8 @@ Histórico de visualizações %s visualização - %s visualizações - %s visualizações + %s subscritores + %s subscritores Deseja limpar o histórico de descargas ou remover todos os ficheiros descarregados\? Histórico e cache @@ -115,9 +115,9 @@ %d segundos - %d selecionada - %d selecionadas - %d selecionadas + %d selecionado + %d selecionados + %d selecionados Partilhar Ver política de privacidade @@ -156,10 +156,10 @@ Limpar Cancelar subscrição Conteúdo - Os textos originais dos serviços serão visíveis nos itens de fluxo + Os textos originais dos serviços serão visíveis nos itens do vídeo Publicado em %1$s Avanço rápido durante silêncio - Não foram encontradas emissões de áudio + Não foram encontrados áudios NewPipe foi fechado enquanto trabalhava no ficheiro Nova lista de reprodução © %1$s de %2$s nos termos da %3$s @@ -168,7 +168,7 @@ Miniatura da lista de reprodução alterada. Não foi possível carregar os comentários País padrão para conteúdo - Aplicação livre de reprodução de emissões para Android. + Aplicação livre de reprodução de transmissões para Android. Idioma padrão para conteúdo Importar subscrições do YouTube do Google Takeout: \n @@ -204,7 +204,7 @@ Gerar nome único Ação a executar ao trocar para outra aplicação a partir do menu principal - %s Utilizar reprodutor de vídeo externo - O quê:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo\\nIdioma da app\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nVersão do SO: + O quê:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo\\nIdioma da aplicação\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nSO Versão: Se tem ideias para: tradução, alterações de desenho, limpeza de código, ou alterações significativas no código fonte - todas as ajudas são bem-vindas. Quanto mais se faz, melhor ficará! Limpar dados Apenas uma vez @@ -292,7 +292,7 @@ Terminada Histórico de vídeos apagado - Não tem um reprodutor de vídeo. Instalar VLC\? + Não tem um reprodutor de vídeo. Instalar o VLC\? Desative para ocultar comentários Limitar resolução se em dados móveis Separadores mostrados na página principal @@ -348,14 +348,14 @@ Desafio reCAPTCHA Importar de 1 item eliminado. - Não foram encontradas emissões de vídeo + Não foram encontrados vídeos Página \'kiosk\' %d hora %d horas %d horas - Enfileirar o próximo stream automaticamente + Adicionar o próximo vídeo à fila automaticamente Defina as suas instâncias favoritas PeerTube Exportar histórico, subscrições, listas de reprodução e definições Melhor resolução @@ -380,7 +380,7 @@ Detalhes Erro de rede Histórico de pesquisa - Alternar serviço, agora selecionado: + Alternar serviço atualmente selecionado: Remover Comentários (em inglês): Reprodutor de vídeo @@ -463,7 +463,7 @@ Mostrar informação Limpar histórico de visualizações Não é possível guardar no cartão SD. Repor pasta de descargas\? - Checksum + Soma de controlo Restaurar última posição de reprodução Ativar reprodutor \'popup\' Se possível, obter de uma fonte dedicada @@ -482,7 +482,7 @@ Vídeos Meta-dados em cache limpos Mostrar dica ao premir em segundo plano ou no botão \"Detalhes:\" da janela popup - Não foi encontrado um reprodutor (pode instalar VLC para reproduzir). + Não foi encontrado um reprodutor (pode instalar o VLC para reproduzir). Ser-lhe-á perguntado onde guardar cada transferência. \nAtive o seletor de pastas do sistema (SAF) se quiser transferir para um cartão SD externo Mostrar opção \"Reproduzir no Kodi\" @@ -563,7 +563,7 @@ Terceiro botão de ação Segundo botão de ação Primeiro botão de ação - Cortar a miniatura de vídeo mostrada na notificação de 16:9 a 1:1 + Ajustar miniatura de vídeo mostrada na notificação de 16:9 para 1:1 (pode introduzir distorções) Cortar miniatura na proporção 1:1 Mostrar \'leaks\' de memória Colocado na fila @@ -598,7 +598,7 @@ Esta é uma faixa de SoundCloud Go+, pelo menos no seu país, pelo que não pode ser transmitida ou descarregada por NewPipe. Este conteúdo não está disponível no seu país. Este vídeo tem uma restrição de idade. -\nDevido às novas políticas do YouTube com vídeos com restrição de idade, o NewPipe não pode acessar nenhum dos seus fluxos de vídeo, portanto, é incapaz de reproduzi-lo. +\nDevido às novas políticas do YouTube quanto a vídeos com restrição de idade, o NewPipe não pode aceder as estes vídeos, por isso não consegue reproduzi-lo. Rádio Destaques Resolver @@ -653,27 +653,27 @@ Sugestões de pesquisa remotas Sugestões de pesquisa locais - %1$s descarga apagada - %1$s descargas apagadas - %1$s descargas apagadas + Transferência %1$s eliminada + Transferências %1$s eliminadas + Transferências %1$s eliminadas - Descarga concluída - %s descargas concluídas - %s descargas concluídas + Download concluído + %s Transferências concluídas + %s Transferências concluídas Deslizar itens para removê-los Não iniciar vídeos no reprodutor mini, mas ir diretamente ao ecrã completo se a rotação automática estiver bloqueada. Ainda pode aceder o reprodutor mini se sair do modo de ecrã completo Iniciar reprodutor principal em ecrã completo Enfileirado o próximo - Enfileirar o próximo + Pôr na fila o próximo A processar… Pode demorar um momento Procurar atualizações Verificar manualmente se existe uma nova versão A procurar atualizações… Novos itens Travar o reprodutor - Mostrar \"travar o reprodutor\" + Mostrar \"Travar o reprodutor\" Mostra uma opção de travamento ao usar o reprodutor Notificação de relatório de erros Notificações para reportar erros @@ -689,28 +689,28 @@ LeakCanary não está disponível Predefinido do ExoPlayer Notificações - A carregar detalhes do fluxo… - Verificar se há novos fluxos - Notificações sobre novos fluxos + A carregar detalhes do vídeo… + Verificar se há novos vídeos + Notificações sobre novos vídeos Frequência da verificação Apagar todos os ficheiros descarregados do disco\? Notificações são desativadas - %s fluxo novo - %s fluxos novos - %s fluxos novos + %s vídeo novo + %s vídeos novos + %s vídeos novos - Notificar sobre novos fluxos de assinaturas + Notificar sobre novos vídeos nas assinaturas Conexão de rede necessária Qualquer rede Alternar tudo - Notificações sobre novos fluxos para assinaturas + Notificações sobre novos vídeos para assinaturas Notificação do reprodutor - Configurar a notificação da reprodução do fluxo atual + Configurar a notificação da reprodução do vídeo atual Seja notificado Agora assinou este canal , - Novos fluxos + Novos vídeos Por cento Semitom Não estão disponíveis transmissões de vídeo a reprodutores externos @@ -722,34 +722,56 @@ Selecione a qualidade para reprodutores externos Tamanho do intervalo de carregamento da reprodução Perguntas frequentes - Se tem problemas a usar a app, veja estas respostas para perguntas frequentes! - Ver no sítio web + Se está a ter problemas a usar a aplicação, veja estas respostas para perguntas mais comuns! + Ver no site Modo rápido Importar ou exportar subscrições do menu de 3 pontos Já está a executar a versão mais recente do NewPipe Toque para descarregar %s Ordenação - Esta opção só está disponível se %s for selecionado como tema + Esta opção só está disponível se estiver selecionado %s para o tema Desativar miniatura permanente Não foi possível copiar para a área de transferência Cartão As listas de reprodução acinzentadas já contêm este item. Duplicar adicionado %d vez(es) Ignorar eventos com botões físicos - Útil, por exemplo, se estiver a utilizar um auscultador com botões físicos defeitos + Útil por exemplo se estiver a utilizar auscultadores com botões físicos danificados Remover duplicados - Mostrar os seguintes fluxos - Mostrar/ocultar fluxos + Mostrar os seguintes vídeos + Mostrar/ocultar vídeos Completamente visto Parcialmente visto Proximamente Remover duplicados\? - Quer remover todos os fluxos duplicados nesta lista de reprodução\? - Ação de gesto de esquerda - Ação do gesto correto - Luminosidade + Quer remover todos os vídeos duplicados nesta lista de reprodução\? + Ação do gesto para a esquerda + Ação do gesto para a direita + Brilho Volume Nenhum - Escolher gesto para metade esquerda do ecrã do reprodutor - Escolher gesto para metade direita do ecrã do reprodutor + Escolha o gesto para a metade esquerda do ecrã do reprodutor + Escolha o gesto para a metade direita do ecrã do reprodutor + Áudio: %s + Faixa de áudio + Ative esta opção se tiver problemas de inicialização do descodificador, que retorna codificadores de baixa prioridade se o descodificador primário falhar. Isto pode resultar num desempenho inferior de reprodução + Usar sempre a configuração de saída alternativa de vídeo do ExoPlayer + Esta solução alternativa liberta e re-instancia os codificadores de vídeo quando ocorre uma alteração da superfície, em vez de definir diretamente a superfície para o codificador. Já utilizada pelo ExoPlayer em alguns dispositivos com este problema, esta configuração só tem efeito no Android 6 e superior +\n +\nA activação desta opção pode evitar erros de reprodução ao mudar o leitor de vídeo atual ou ao mudar para ecrã inteiro + original + dobrado + descritivo + Altera o tamanho do intervalo de carregamento progressivo (o atual é %s). Um valor menor pode acelerar o carregamento inicial do vídeo + Dar preferência ao áudio original + Selecionar o áudio original independentemente do idioma + Dar preferência ao áudio descritivo + Seleciona o áudio com descrição para pessoas com dificuldades de visão, se disponível + Já deve existir uma faixa de áudio nesta transmissão + Selecionar faixa de áudio para reprodutores externos + Desconhecida + Configurações ExoPlayer + Gere algumas configurações de ExoPlayer. É necessário reiniciar o reprodutor para aplicar as alterações + Utilizar a função de fallback do descodificador do ExoPlayer + %s %s \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 1fb73e4d6b4..ab8ab57036d 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -745,11 +745,33 @@ Completamente visto Mostrar os seguintes vídeos Parcialmente visto - Ação de gesto de esquerda - Ação do gesto correto - Luminosidade + Ação do gesto para a esquerda + Ação do gesto para a direita + Brilho Volume Nenhum - Escolher gesto para metade esquerda do ecrã do reprodutor - Escolher gesto para metade direita do ecrã do reprodutor + Escolha o gesto para a metade esquerda do ecrã do reprodutor + Escolha o gesto para a metade direita do ecrã do reprodutor + Seleciona o áudio com descrição para pessoas com dificuldades de visão, se disponível + Esta solução alternativa liberta e re-instancia os codificadores de vídeo quando ocorre uma alteração da superfície, em vez de definir diretamente a superfície para o codificador. Já utilizada pelo ExoPlayer em alguns dispositivos com este problema, esta configuração só tem efeito no Android 6 e superior +\n +\nA activação desta opção pode evitar erros de reprodução ao mudar o leitor de vídeo atual ou ao mudar para ecrã inteiro + Altera o tamanho do intervalo de carregamento progressivo (o atual é %s). Um valor menor pode acelerar o carregamento inicial do vídeo + Dar preferência ao áudio original + Selecionar o áudio original independentemente do idioma + Dar preferência ao áudio descritivo + Áudio: %s + Faixa de áudio + Já deve existir uma faixa de áudio nesta transmissão + Selecionar faixa de áudio para reprodutores externos + Desconhecida + Configurações ExoPlayer + Gere algumas configurações de ExoPlayer. É necessário reiniciar o reprodutor para aplicar as alterações + Utilizar a função de fallback do descodificador do ExoPlayer + Ative esta opção se tiver problemas de inicialização do descodificador, que retorna codificadores de baixa prioridade se o descodificador primário falhar. Isto pode resultar num desempenho inferior de reprodução + Usar sempre a configuração de saída alternativa de vídeo do ExoPlayer + %s %s + original + dobrado + descritivo \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 6028b1adaa4..7c6463d741c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -756,4 +756,26 @@ Яркость Громкость Ничего - + Изменить интервал загрузки (сейчас %s). Меньшее значение может ускорить запуск видео. Нужен перезапуск плеера + Отдать предпочтение описательному звуку + Аудио: %s + Звуковая дорожка + Неизвестная + Настройки ExoPlayer + Управление некоторыми настройками ExoPlayer. Эти изменения требуют перезапуска плеера, чтобы они вступили в силу + Использовать резервную функцию декодера ExoPlayer + Всегда использовать обходной путь настройки поверхности видеовыхода ExoPlayer + %s %s + оригинальный + дублированный + описательный + Отдать предпочтение оригинальному звуку + Выбирать исходную звуковую дорожку независимо от языка + Выбирать звуковую дорожку с описаниями для слабовидящих, если они доступны + Звуковая дорожка уже должна присутствовать в этом потоке + Выберите звуковую дорожку для внешних проигрывателей + Включите этот параметр, если у вас есть проблемы с инициализацией декодера, который возвращается к декодерам с более низким приоритетом в случае сбоя инициализации основных декодеров. Это может привести к ухудшению качества воспроизведения по сравнению с использованием первичных декодеров + Этот обходной путь освобождает и повторно создаёт видеокодеки при изменении поверхности вместо того, чтобы напрямую устанавливать поверхность для кодека. Уже используется ExoPlayer на некоторых устройствах с этой проблемой, этот параметр влияет только на устройства с Android 6 и выше +\n +\nВключение этого параметра может предотвратить ошибки воспроизведения при переключении текущего видеоплеера или переключении в полноэкранный режим + \ No newline at end of file diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 2119ddc21e7..4d7e99fb64b 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -739,4 +739,26 @@ Issèbera unu gestu pro sa metade de destra de s\'ischermu de su riproduidore Luminosidade Perunu + Modìfica sa mannària de s\'intervallu de càrriga de cuntenutos consecutivos (como %s). Unu valore prus bassu diat pòdere allestrare su carrigamentu initziale issoro + Preferi s\'àudio originale + Preferi un\'àudio descritivu + Seletziona una rasta àudio cun descritziones pro persones cun problemas de vista, si bi nd\'at a disponimentu + Àudio: %s + Rasta àudio + Disconnotu + Manìgia unas cantas impostatziones de ExoPlayer. Custas modìficas tenent bisòngiu de torrare a allùghere su riproduidore pro chi tèngiant efetu + Imprea sa funtzionalidade de riserva de su decodificadore de ExoPlayer + %s %s + originale + dopiadu + descritivu + Imprea semper sa solutzione alternativa de s\'impostatzione de superfìtzie de s\'essida vìdeu de ExoPlayer + Custa solutzione alternativa lìberat e torrat a istantziare sos codificadores de vìdeu cando acontesset unu càmbiu de superfìtzie, in càmbiu de impostare sa superfìtzie e su codificadore in manera direta. Giai impreada dae ExoPlayer in unos cantos dispositivos cun custu problema, custa impostatziones tenet un\'efetu petzi in Android 6 e versiones prus noas. +\n +\nS\'abilitatzione de custa optzione diat pòdere prevènnere faddinas de riprodutzione cando si càmbiat su riproduidore vìdeu atuale o si colat a s\'ischermu intreu + Seletziona una rasta àudio pro riproduidores esternos + Seletziona sa rasta sonora originale in manera indipendente dae sa limba + Una rasta àudio diat dèpere èssere giai presente in custu flussu + Impostatziones pro ExoPlayer + Abìlita custa optzione si tenes problemas de initzializatzione de su decodificadore, chi colat a decodificadores a prioridade prus bassa si s\'initzializatzione de sos decodificadores primàrios fallit. Custu diat pòdere causare unu rendimentu de riprodutzione bassu cunfronta a s\'impreu de decodificadores primàrios \ No newline at end of file diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 9c497c7857d..a09a7638e91 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -52,7 +52,7 @@ Naživo Nemožno nastaviť menu preberania Pardon, toto sa nemalo stať. - Nahlásiť túto chybu mejlom + Nahlásiť cez e-mail Pardon, niečo sa pokazilo. Správa Info: @@ -735,4 +735,43 @@ Táto možnosť je dostupná len pre motív %s Rýchly režim Import alebo export odberov z 3-bodkovej ponuky + Akcia gesta vľavo + Akcia pre gesto v pravej polovici obrazovky + Akcia gesta vpravo + Akcia pre gesto v ľavej polovici obrazovky + Jas + Hlasitosť + Nič + Odstrániť duplikáty + Odstrániť duplikáty\? + Rozpozerané + Dopozerané + Toto sa môže hodiť v prípade, že máte pokazené tlačidlo na slúchadlách + Ignorovať fyzické tlačidlá + Zmena veľkosti intervalu načítania pri progresívnom obsahu (v súčasnosti %s). Nižšia hodnota môže urýchliť ich počiatočné načítanie + Preferovať pôvodné audio + Vyberať pôvodnú zvukový stopu bez ohľadu na nastavený jazyk + Preferovať prehrávanie popisu + Zvuk: %s + Zvuková stopa + Chcete odstrániť všetky duplikátne streamy z tohoto zoznamu\? + Zobrazovať nasledovné streamy + V tomto streame by už mala byť prítomná zvuková stopa + Výber zvukovej stopy pre externé prehrávače + Neznáma + Nadchádzajúce + Úprava nastavení prehrávača ExoPlayer. Pre aplikovanie týchto zmien je nutné reštartovať ExoPlayer + Túto možnosť povoľte, ak máte problémy s inicializáciou dekodéra, ktorý sa v prípade zlyhania inicializácie primárnych dekodérov vráti k dekodérom s nižšou prioritou. To môže mať za následok nižší výkon prehrávania ako pri použití primárnych dekodérov + Používať funkciu záložného dekodéra prehrávača ExoPlayer + Vždy použiť nastavenia výstupu videa ExoPlayera + %s %s + povodná + dabovaná + Vyberať zvukovú stopu s popisom pre zrakovo postihnutých ak je k dispozicií + Zobrazovať/Skrývať streamy + Nastavenia ExoPlayer + Toto riešenie spôsobí to, že pri zmene textúry sa aktuálne používaný kodek uvoľní a potom znova použije, miesto toho aby sa textúra rovno použila na kodek. Toto nastavenie, ktoré už ExoPlayer používa na niektorých zariadeniach s týmto problémom, má vplyv len na Android 6 a vyšší +\n +\nPovolenie tejto možnosti môže zabrániť chybám pri prehrávaní pri prepínaní aktuálneho prehrávača videa alebo prepínaní na celú obrazovku + popisná \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 3d9dc6ee15d..d6491cb7463 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -676,7 +676,7 @@ Fäst kommentar LeakCanary är inte tillgänglig ExoPlayer standard - Ändra inläsningsintervallets storlek (för närvarande %s). Ett lägre värde kan påskynda den första videoinläsningen. Ändringar kräver att spelaren startas om + Ändra storleken på laddningsintervallet för progressivt innehåll (för närvarande %s). Ett lägre värde kan påskynda den första laddningen Uppdateringsintervall Nödvändig nätverksanslutning Alla nätverk @@ -740,4 +740,25 @@ Vänster gest åtgärd Välj en gest för den högra halvan av spelarskärmen Höger gest åtgärd + Ljud: %s + Ljudspår + Ett ljudspår bör redan finnas i denna ström + Välj ljudspår för externa spelare + Okänt + ExoPlayer inställningar + Hantera vissa ExoPlayer inställningar. Dessa ändringar kräver en omstart av spelaren för att träda i kraft + Använd alltid ExoPlayers lösning för inställning av videoutgångsyta + Föredra originalljud + Välj originalljudspåret oavsett språk + Föredra beskrivande ljud + Välj ett ljudspår med beskrivningar för synskadade personer om det finns tillgängligt + Använd ExoPlayers reservfunktion för avkodare + Aktivera det här alternativet om du har problem med initiering av avkodare, vilket faller tillbaka på avkodare med lägre prioritet om initieringen av primära avkodare misslyckas. Detta kan leda till sämre uppspelningsprestanda än vid användning av primära avkodare + Denna lösning frigör och återinstansierar videokodeker när en ytförändring inträffar, istället för att ställa in ytan direkt till kodeken. Används redan av ExoPlayer på vissa enheter med detta problem, denna inställning har endast effekt på Android 6 och senare +\n +\nOm du aktiverar det här alternativet kan det förhindra uppspelningsfel när du byter aktuell videospelare eller växlar till fullskärm + %s %s + original + beskrivande + dubbad \ No newline at end of file diff --git a/app/src/main/res/values-ti/strings.xml b/app/src/main/res/values-ti/strings.xml new file mode 100644 index 00000000000..dcd5df884ea --- /dev/null +++ b/app/src/main/res/values-ti/strings.xml @@ -0,0 +1,19 @@ + + + ሰረዝ + ኣብ ብሮውዘር ክፉት + ውጽኢት ምርኣዩ ን፦%s + መጀመርታ ምእንቲ ኽትጅምር ነቲ ዜጕልሕ መረጼን ጠውቆ። + ኣብ %1$s እተሓትመ + ዋላ ሓደ ወሓይዝ ዚጻወት ሰብ ኣይተረኽበን። VLC + ሐራይ + ምድላው + \"%1$s\" ማለቱ ድዩ፧ + ዚተሪየ ጋባራ + ክፉቴ ምሲ + ፋይል ውሕጅ ኣራግፍ + ድለ + ኣካፍሎም + ኣራግፍ + ኣካፍሎም ምሲ + \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 97ff192cde1..ecc17ccf1d9 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -736,4 +736,19 @@ Ses düzeyi Hiçbiri Parmağınızı ekranın sol yarısında kaydırırken ne yapılacağını seçin + Varsa, görsel engelli kişiler için betimlemeli ses parçasını seç + Bilinmeyen + ExoPlayer ayarları + Kimi ExoPlayer ayarlarını yönet. Bu değişiklikler oynatıcının yeniden başlatılmasını gerektirir + özgün + dublaj + betimlemeli + %s %s + Dış oynatıcılar için ses parçası seç + Dil ne olursa olsun özgün ses parçasını seç + Ses: %s + Özgün sesi yeğle + Betimlemeli sesi yeğle + Ses parçası + Bu akışta halihazırda bir ses parçası bulunmalıdır \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 253160568d2..b8d8349df21 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -756,4 +756,26 @@ Виберіть жест для правої половини екрана програвача Дія жесту праворуч Гучність + Змінити розмір інтервалу завантаження прогресивного вмісту (наразі %s). Нижче значення може прискорити його початкове завантаження + Надавати перевагу оригінальному аудіо + Вибирати оригінальну звукову доріжку незалежно від мови + Надавати перевагу описовому аудіо + Вибирати звукову доріжку з описом для людей із вадами зору, якщо вона є + Аудіо: %s + Звукова доріжка + Вибір звукової доріжки для зовнішніх програвачів + Невідомо + Налаштування ExoPlayer + Керування деякими налаштуваннями ExoPlayer. Щоб ці зміни набули чинності, потрібно перезапустити програвач + Використовувати запасну функцію декодера ExoPlayer + Завжди використовувати обхідний шлях налаштування поверхні відеовиходу ExoPlayer + %s %s + оригінальна + дубльована + описова + У цій трансляції вже має бути звукова доріжка + Увімкніть цю опцію, якщо у вас є проблеми з ініціалізацією декодерів, які повертаються до декодерів нижчого пріоритету, якщо не вдається ініціалізувати первинні декодери. Це може призвести до погіршення якості відтворення порівняно з використанням первинних декодерів + Цей обхідний шлях вивільняє і повторно встановлює відеокодеки, коли відбувається зміна поверхні, замість того, щоб налаштовувати поверхню на кодек безпосередньо. Це налаштування вже використовується ExoPlayer на деяких пристроях з цією проблемою, але воно працює лише на Android 6 і новіших версіях +\n +\nУвімкнення цієї опції може запобігти помилкам відтворення під час перемикання поточного відеопрогравача або переходу до повноекранного режиму \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 2293599213f..0b07ca4a335 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -726,4 +726,26 @@ 选择播放器屏幕左半边手势 选择播放器屏幕右半边手势 + 更改渐进式内容的加载间隔大小(当前为 %s)。较低的值可加快初始加载 + 偏好描述性音频 + 如果可用,为视障人群选择带描述的音轨 + 音频:%s + 此串流中应该已经有音轨 + 选择外部播放器音轨 + 未知 + 管理一些 ExoPlayer 设置。这些更改需要重启播放器才能生效 + 使用 ExoPlayer 的编码器回退功能 + 始终使用 ExoPlayer 的视频输出界面设置变通方法 + 此变通方法在发生界面更改时会释放并重新初始化视频编解码器,而不是直接将编解码器设置到新界面。在某些有这个问题的设备上,Exoplayer 已经在使用这个方法。此设置仅适用于 Android 6 及更高的系统版本 +\n +\n启用此选项可防止切换当前视频播放器或切换到全屏播放时出现播放错误 + %s %s + 原始 + 配音 + 描述 + 偏好原始音频 + 不管何种语言都选择原始音轨 + 音轨 + ExoPlayer 设置 + 如遇解码器初始化方面的问题可开启此选项。启用后,如主解码器初始化失败,ExoPlayer 将使用较低优先级的解码器进行播放。请注意,这可能导致播放性能下降 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 960954ca758..4be2a20f7ac 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -437,7 +437,7 @@ 喺鎖定畫面背景同埋通知都擺放縮圖 開始咗下載 年齡限制 - 您部機冇 app 開到佢 + 你部機冇 app 開到佢 呢部影片係 YouTube Music Premium 會員限定,因此 NewPipe 未能串流或下載。 揀選啱你心水嘅夜色主題 — %s 呢部內容係付費使用者限定,因此 NewPipe 未能串流或下載。 @@ -596,7 +596,7 @@ 新嘅串流通知 係咪要喺磁碟機上面消除晒全部下載咗嘅檔案? - 通知已停用 + 已停用通知 單曲 全部剷走晒播放到邊個位 請睇過係咪已經有人喺度講緊你呢次彈 app 嘅狀況。若然重複發表已有嘅議題,就會嘥咗我哋可以真正用嚟修復其他錯漏嘅時間㗎喇。 @@ -641,7 +641,7 @@ 係咪要全部剷走晒之前啲片嘅播放位置嘅紀錄? 百分比 半音 - 更改載入播放間隔大細 (目前係 %s)。細啲或者可以等條片快啲開波。更改要重新開過個播放器先至生效 + 更改載入播放間隔大細 (目前係 %s)。細啲或者可以等條片快啲開波 問咗先至將排隊列表清走 目前播放器嘅排隊列表將會清走 加一個站 @@ -653,7 +653,7 @@ 新嘅摘要項目 揀選一個站 轉換播放器嘅時候,排隊列表可能會清走 - NewPipe 係「著佐權」(copyleft) 嘅自由軟件:你可以隨意使用、考究、分享同改進佢。具體而言,你可以依據自由軟件基金會發佈嘅《GNU 通用公眾特許條款》第 3 版或 (按您選擇) 之後任一版本之下嘅條款,重新分發及/或修改呢個軟件。 + NewPipe 係「著佐權」(copyleft) 嘅自由軟件:你可以隨意使用、考究、分享同改進佢。具體而言,你可以依據自由軟件基金會發佈嘅《GNU 通用公眾特許條款》第 3 版或 (按你選擇) 之後任一版本之下嘅條款,重新分發及/或修改呢個軟件。 載入播放間隔大細 互動頁面 預設嘅互動站(Kiosk) @@ -702,7 +702,7 @@ 若然你係用緊呢個 app嗰陣有疑問,然而「亦有些難啟齒」,不妨睇下常見問題集,話唔定會發現「有場舞還未發表」! 快速模式 右上角嘅選單有得匯入或匯出訂閱 - 您已經用緊最新版本嘅 NewPipe + 你已經用緊最新版本嘅 NewPipe 撳一下去下載 %s 唔再揀定封面縮圖 色系揀做%s 嘅時候至有得揀 @@ -727,4 +727,25 @@ 亮度 聲音 + 首選嘅原始聲音 + 首選嘅敘述性聲音 + 如果可以用嘅話,會為視障人士揀敘述性音軌 + 無論語言係咩,都揀選原始音軌 + 聲音: %s + 音軌 + 未知 + 呢個串流已經有音軌喇 + Exoplayer 設定 + 管理一啲 ExoPlayer 設定。呢啲變更需要重新啟動播放程式先會生效 + 用 ExoPlayer 嘅解碼器汰退功能 + 如果遇到解碼器初始化問題,請啟用呢個選項,如果主解碼器初始化失敗,就會用優先順序較低的解碼器。咁樣可能會導致播放性能比使用主解碼器嗰陣差 + 幾時都用 Exoplayer嘅浮面影片輸出設定解決方法 + %s %s + 原始嘅 + 配音嘅 + 敘述性 + 為外面嘅播放器揀選音軌 + 呢個解決方法係喺發生表面變動嗰陣釋放同埋重新確認視訊編解碼器,而非直接將表面設定做編解碼器。ExoPlayer 已經喺部份有問題嘅裝置上使用了呢個設定,呢個設定僅係對 Android 6 或以上嘅更新版本有效。 +\n +\n啟用呢個選項可以避免喺切換現有視訊播放程式或切換到全螢幕時出現播放錯誤 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 86bd7620d64..db8ecfb121b 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -726,4 +726,26 @@ 為播放器畫面左側選擇手勢 為播放器畫面右側選擇手勢 + 偏好原始音訊 + 音訊:%s + 音訊軌道 + 此串流應已存在音訊軌道 + 為外部播放程式選取音訊軌道 + 未知 + ExoPlayer 設定 + 使用 ExoPlayer 的解碼器汰退功能 + 一律使用 ExoPlayer 的視訊輸出表面設定解決方法 + %s %s + 原始 + 配音 + 描述性 + 變更漸進式內容的載入間隔大小(目前為 %s)。較低的值可能會加速初始載入速度 + 偏好描述性的音訊 + 若可用,為視障人士選取帶有描述的音訊軌道 + 無論語言都選取原始音訊軌道 + 管理一些 ExoPlayer 設定。這些變更需要重新啟動播放程式才會生效 + 若您有解碼器初始化的問題,請啟用此選項,若主要的解碼器初始化失敗,其將會汰退至較低優先度的解碼器。這可能會導致播放效能比使用主要解碼器時差 + 此解決方法是在發生表面變動時釋放並重新確認視訊編解碼器,而非直接將表面設定為編解碼器。ExoPlayer 已在部份有問題的裝置上使用了此設定,此設定僅對 Android 6 或更新版本有效。 +\n +\n啟用此選項可以避免在切換目前視訊播放程式或切換到全螢幕時出現播放錯誤 \ No newline at end of file diff --git a/fastlane/metadata/android/ar/changelogs/65.txt b/fastlane/metadata/android/ar/changelogs/65.txt new file mode 100644 index 00000000000..15a3af72a55 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/65.txt @@ -0,0 +1,28 @@ +### تحسينات + +- تعطيل الرسوم المتحركة لرمز قائمة برجر#1486 +- التراجع عن حذف التنزيلات #1472 +- خيار التنزيل في قائمة المشاركة #1498 +- تمت إضافة خيار المشاركة إلى قائمة النقر الطويلة #1454 +- تصغير المشغل الرئيسي عند الخروج #1354 +- تحديث إصدار المكتبة وإصلاح النسخ الاحتياطي لقاعدة البيانات #1510 +- ExoPlayer 2.8.2 تحديث #1392 + - تمت إعادة صياغة مربع حوار التحكم في سرعة التشغيل لدعم أحجام الخطوات المختلفة لتغيير السرعة بشكل أسرع. + - تمت إضافة مفتاح تبديل للتقديم السريع أثناء فترات الصمت في التحكم في سرعة التشغيل. يجب أن يكون هذا مفيدًا للكتب الصوتية وأنواع موسيقية معينة ، ويمكن أن يجلب تجربة +سلسة حقيقية (ويمكن كسر أغنية مع الكثير من الصمت =\\). + -دقة مصدر الوسائط المعاد تشكيلها للسماح بتمرير البيانات الوصفية إلى جانب الوسائط داخليًا في المشغل ، بدلاً من القيام بذلك يدويًا. الآن لدينا مصدر واحد للبيانات الوصفية + وهو متاح مباشرة عند بدء التشغيل. + -عدم تحديث البيانات الوصفية لقائمة التشغيل عن بُعد الثابتة عند توفر بيانات وصفية جديدة عند فتح جزء من قائمة التشغيل. + - إصلاحات مختلفة لواجهة المستخدم: #1383, أصبحت عناصر التحكم في إشعارات مشغل الخلفية بيضاء دائمًا ، مما يسهل إيقاف تشغيل مشغل النوافذ المنبثقة من خلال قذفه +- استخدم مستخرجًا جديدًا بهندسة مُعاد تصنيعها للخدمات المتعددة + +### إصلاحات + +- يصلح #1440 تخطيط معلومات الفيديو المكسور #1491 +- عرض تاريخ الإصلاح #1497 + - #1495, عن طريق تحديث البيانات الوصفية (الصورة المصغرة والعنوان وعدد مقاطع الفيديو) بمجرد وصول المستخدم إلى قائمة التشغيل. + - #1475, من خلال تسجيل طريقة عرض في قاعدة البيانات عندما يبدأ المستخدم مقطع فيديو على مشغل خارجي على جزء التفاصيل. +- إصلاح مهلة الشاشة في حالة ظهور النافذة المنبثقة. #1463 (ثابت #640) +- إصلاح مشغل الفيديو الرئيسي #1509 + - [#1412] تم إصلاح وضع التكرار الذي يتسبب في ظهور NPE للاعب عند تلقي نية جديدة أثناء وجود نشاط اللاعب في الخلفية. + - لا يؤدي تصغير المشغل الثابت إلى النافذة المنبثقة إلى تدمير اللاعب عند عدم منح إذن منبثق. diff --git a/fastlane/metadata/android/ar/changelogs/66.txt b/fastlane/metadata/android/ar/changelogs/66.txt new file mode 100644 index 00000000000..1261963079d --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/66.txt @@ -0,0 +1,35 @@ +# التغيير منv0.13.7 + +### ثابت +- إصلاح مشكلات عامل التصفية من v0.13.6 + +# التغيير من v0.13.6 + +### تحسينات + +- تعطيل الرسوم المتحركة لرمز قائمة برجر #1486 +- التراجع عن حذف التنزيلات #1472 +- خيار التنزيل في قائمة المشاركة #1498 +- تمت إضافة خيار المشاركة إلى قائمة النقر الطويلة #1454 +- تصغير المشغل الرئيسي عند الخروج #1354 +- تحديث إصدار المكتبة وإصلاح النسخ الاحتياطي لقاعدة البيانات #1510 +- ExoPlayer 2.8.2 تحديث #1392 + - تمت إعادة صياغة مربع حوار التحكم في سرعة التشغيل لدعم أحجام الخطوات المختلفة لتغيير السرعة بشكل أسرع. + - تمت إضافة مفتاح تبديل للتقديم السريع أثناء فترات الصمت في التحكم في سرعة التشغيل. يجب أن يكون هذا مفيدًا للكتب الصوتية وأنواع موسيقية معينة ، ويمكن أن يجلب تجربة سلسة حقيقية (ويمكن كسر أغنية مع الكثير من الصمت +=\\). + - دقة مصدر الوسائط المعاد تشكيلها للسماح بتمرير البيانات الوصفية إلى جانب الوسائط داخليًا في المشغل ، بدلاً من القيام بذلك يدويًا. الآن لدينا مصدر واحد للبيانات الوصفية و + متاح مباشرة عند بدء التشغيل. + - عدم تحديث البيانات الوصفية لقائمة التشغيل عن بُعد الثابتة عند توفر بيانات وصفية جديدة عند فتح جزء من قائمة التشغيل. + - إصلاحات مختلفة لواجهة المستخدم: #1383, أصبحت عناصر التحكم في إشعارات مشغل الخلفية بيضاء دائمًا ، مما يسهل إيقاف تشغيل مشغل النوافذ المنبثقة من خلال قذفه +- استخدم مستخرجًا جديدًا بهندسة مُعاد تصنيعها للخدمات المتعددة + +### إصلاحات + +- الإصلاح #1440 تخطيط معلومات الفيديو المكسور#1491 +- عرض تاريخ الإصلاح #1497 + - #1495, عن طريق تحديث البيانات الوصفية (الصورة المصغرة والعنوان وعدد مقاطع الفيديو) بمجرد وصول المستخدم إلى قائمة التشغيل. + - #1475, من خلال تسجيل طريقة عرض في قاعدة البيانات عندما يبدأ المستخدم مقطع فيديو على مشغل خارجي على جزء التفاصيل. +- إصلاح مهلة الشاشة في حالة ظهور النافذة المنبثقة. #1463 (ثابت #640) +- إصلاح مشغل الفيديو الرئيسي #1509 + - [#1412] تم إصلاح وضع التكرار الذي يتسبب في ظهور NPE للاعب عند تلقي نية جديدة أثناء وجود نشاط اللاعب في الخلفية. + - لا يؤدي تصغير المشغل الثابت إلى النافذة المنبثقة إلى تدمير اللاعب عند عدم منح إذن منبثق. diff --git a/fastlane/metadata/android/ar/changelogs/780.txt b/fastlane/metadata/android/ar/changelogs/780.txt new file mode 100644 index 00000000000..4932a5d8047 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/780.txt @@ -0,0 +1,12 @@ +تغييرات في 0.17.3 + +محسّن +• تمت إضافة خيار لمسح حالات التشغيل #2550 +• إظهار الدلائل المخفية في منتقي الملفات #2591 +• دعم عناوين URL من مثيلات "invidio.us" ليتم فتحها باستخدام NewPipe #2488 +• أضف دعمًا لـ `music.youtube.com` URLs TeamNewPipe/NewPipeمستخرج#194 + +ثابت +• [موقع YouTube] ثابت 'java.lang.IllegalArgumentException #192 +• [YouTube] البث المباشر الثابت لا يعمل TeamNewPipe/NewPipeExtractor#195 +• تم إصلاح مشكلة الأداء في أندرويد عند تنزيل البث #2592 diff --git a/fastlane/metadata/android/ar/changelogs/790.txt b/fastlane/metadata/android/ar/changelogs/790.txt new file mode 100644 index 00000000000..4e6aed24c9e --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/790.txt @@ -0,0 +1,14 @@ +محسّن +• أضف المزيد من العناوين لتحسين إمكانية الوصول للمكفوفين #2655 +• اجعل لغة إعداد مجلد التنزيل أكثر اتساقًا وأقل غموضًا #2637 + +ثابت +• تحقق مما إذا تم تنزيل آخر بايت في الكتلة #2646 +• التمرير الثابت في جزء تفاصيل الفيديو #2672 +• إزالة الرسوم المتحركة مربع مسح البحث المزدوج إلى واحد #2695 +• [SoundCloud] إصلاح استخراج client_id #2745 + +تطوير +• أضف التبعيات المفقودة الموروثة من NewPipeExtractor إلى NewPipe #2535 +• الانتقال إلى AndroidX #2685 +• تحديث ل ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/az/full_description.txt b/fastlane/metadata/android/az/full_description.txt index 2843f8abeee..50efa3929db 100644 --- a/fastlane/metadata/android/az/full_description.txt +++ b/fastlane/metadata/android/az/full_description.txt @@ -1 +1 @@ -Newpipe hər hansı Google çərçivə kitabxanası və ya Youtube API-si istifadə etmir. O sadəcə zəruri məlumatları toplamaq məqsədilə veb-saytı təhlil edir. Buna görə də bu tətbiqetmə Google Xidmətləri quraşdırılmamış cihazlarda istifadə edilə bilər. Həmçinin NewPipe istifadə etməyiniz üçün YouTube hesabına ehtiyacınız yoxdur və o, azad və açıq qaynaqlı tətbiqdir. +NewPipe hər hansı Google quruluş kitabxanası və ya Youtube API istifadə etmir. O yalnız ehtiyac olan məlumatları toplamaq üçün veb-saytı təhlil edir. Bu səbəbdən, bu tətbiq Google Xidmətləri quraşdırılmamış cihazlarda istifadə edilə biləndir. Həmçinin NewPipe istifadə etmək üçün YouTube hesabına ehtiyacınız yoxdur və o, azad və açıq qaynaqlı tətbiqdir. diff --git a/fastlane/metadata/android/de/changelogs/993.txt b/fastlane/metadata/android/de/changelogs/993.txt new file mode 100644 index 00000000000..54b04faa7c9 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/993.txt @@ -0,0 +1,12 @@ +Neu +• Warnung bei Erstellung von Duplikaten in Wiedergabelisten und neue Schaltfläche um Duplikate zu entfernen +• Möglichkeit, Hardware Tasten zu ignorieren +• Möglichkeit, teilweise gesehene Videos im Feed auszublenden + +Verbessert +• Mehr Rasterspalten auf großen Displays +• Fortschrittsbalken sind jetzt konsistent mit Einstellungen + +Behoben +• Das Öffnen von Browser-URLs, Downloads und externen Videoplayern auf Android 11+ +• Fullscreen-Bedingung benötigte zweimaliges Drücken auf MIUI diff --git a/fastlane/metadata/android/fr/short_description.txt b/fastlane/metadata/android/fr/short_description.txt index 70048c15a31..d0a541cd3b9 100644 --- a/fastlane/metadata/android/fr/short_description.txt +++ b/fastlane/metadata/android/fr/short_description.txt @@ -1 +1 @@ -Une interface pour YouTube libre et légère sur Android. +Une interface libre et légère pour YouTube sur Android. diff --git a/fastlane/metadata/android/hi/changelogs/993.txt b/fastlane/metadata/android/hi/changelogs/993.txt new file mode 100644 index 00000000000..57b6fe8be3b --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/993.txt @@ -0,0 +1,12 @@ +नया +• प्लेलिस्ट डुप्लिकेट जोड़ते समय चेतावनी जोड़ें और उन्हें हटाने के लिए बटन जोड़ें +• हार्डवेयर बटन को अनदेखा करने की अनुमति दें +• फ़ीड में आंशिक रूप से देखे गए वीडियो को छिपाने की अनुमति दें + +बेहतर +• बड़ी स्क्रीन पर अधिक ग्रिड कॉलम का उपयोग करें +• प्रगति संकेतक सेटिंग्स के अनुरूप बनाएं + +फिक्स +• एंड्रॉइड 11+ पर ब्राउज़र यूआरएल, डाउनलोड और बाहरी खिलाड़ियों को खोलने को ठीक करें +• एमआईयूआई पर दो टैप की आवश्यकता वाले फुलस्क्रीन के साथ इंटरेक्टि करना ठीक करें diff --git a/fastlane/metadata/android/hu/changelogs/63.txt b/fastlane/metadata/android/hu/changelogs/63.txt index e9b4b461c11..8a08f438cf1 100644 --- a/fastlane/metadata/android/hu/changelogs/63.txt +++ b/fastlane/metadata/android/hu/changelogs/63.txt @@ -5,4 +5,4 @@ - GDPR információk hozzáadása #1420 ### Javítva -- Letöltés: A befejezetlen .giga fájlokból történő betöltés közbeni összeomlás javítása #1407 +- Letöltő: A befejezetlen .giga fájl letöltések betöltése közbeni összeomlás javítása #1407 diff --git a/fastlane/metadata/android/hu/changelogs/65.txt b/fastlane/metadata/android/hu/changelogs/65.txt index c3ee63eccdb..e1180478a0a 100644 --- a/fastlane/metadata/android/hu/changelogs/65.txt +++ b/fastlane/metadata/android/hu/changelogs/65.txt @@ -1,26 +1,26 @@ ### Fejlesztések -- A burgermenu ikon animációjának letiltása #1486 +- A burgermenü ikonanimációjának letiltása #1486 - a letöltések törlésének visszavonása #1472 -- Letöltési lehetőség a #1498 megosztás menüben +- Letöltési lehetőség a megosztás menüben #1498 - Megosztási lehetőség hozzáadva a hosszú érintéssel #1454 -- A fő játékos minimalizálása a 1354-es kijáratnál +- A fő lejátszó minimalizálása a kilépésnél #1354 - A könyvtár verziójának frissítése és az adatbázis biztonsági mentésének javítása #1510 - ExoPlayer 2.8.2 frissítés #1392 - - Átdolgoztuk a lejátszási sebesség-vezérlő párbeszédpanelt, hogy támogassa a különböző lépésméreteket a gyorsabb sebességváltás érdekében. - - Hozzáadott egy kapcsolót a gyors előretekeréshez a lejátszási sebesség szabályozásában a csendek alatt. Ez hasznos lehet hangoskönyvek és bizonyos zenei műfajok esetében, és valódi zökkenőmentes élményt nyújthat (és megszakíthat egy dalt sok csenddel =\\). - - Átdolgozott médiaforrás felbontás, amely lehetővé teszi a metaadatok továbbítását a média mellett a lejátszón belül, nem pedig manuálisan. Most már egyetlen metaadatforrásunk van, és közvetlenül elérhető a lejátszás megkezdésekor. - - Javítva a távoli lejátszási lista metaadatai, amelyek nem frissülnek, amikor új metaadatok állnak rendelkezésre a lejátszási lista töredékének megnyitásakor. - - Különféle felhasználói felület-javítások: #1383, a háttérben lévő lejátszó értesítési vezérlői mostantól mindig fehérek, a felugró lejátszót egyszerűbben le lehet állítani dobással -- Használjon új kivonatot refaktorált architektúrával a többszolgáltatáshoz + - Átdolgoztuk a lejátszásisebesség-vezérlő párbeszédpanelt, hogy támogassa a különböző lépésmértéket a gyorsabb sebességváltás érdekében. + - Hozzáadott kapcsoló a gyors előre- hátratekeréshez a lejátszásisebesség-vezérlőben a csendek alatt. Ez hasznos lehet hangoskönyvek és bizonyos zenei műfajok esetében és valódi zökkenőmentes élményt nyújthat (és megtörhet egy dalt sok csenddel =\\). + - Átdolgozott médiaforrás felbontás, amely lehetővé teszi a metaadatok továbbítását a média mellett a lejátszón belül, manuális helyett. Most már egyetlen metaadatforrásunk van és közvetlenül elérhető a lejátszás megkezdésekor. + - Javítva a távoli lejátszási lista metaadatai nem frissülnek, amikor új metaadatok állnak rendelkezésre a lejátszási lista töredékének megnyitásakor. + - Különféle felhasználóifelület-javítások: #1383, a háttérlejátszó értesítési vezérlői mostantól mindig fehérek, a felugró lejátszót egyszerűbben le lehet állítani eldobással +- Újraírt extractor használata több szolgáltatáshoz ### Javítások -- Javítás: #1440 Sérült videó információs elrendezés #1491 -- Előzmények megtekintése #1497. javítás +- a #1440 Sérült videó információs elrendezés #1491 +- Előzmények megtekintése #1497 - #1495, a metaadatok (bélyegkép, cím és videószám) frissítésével, amint a felhasználó hozzáfér a lejátszási listához. - #1475, egy nézet regisztrálásával az adatbázisban, amikor a felhasználó elindít egy videót a külső lejátszón a részletrészleten. -- Javítsa ki a képernyő időtúllépését felugró mód esetén. #1463 (fix #640) -- Fő videólejátszó javítás #1509 - - [#1412] Javítva az ismétlési mód, ami a játékos NPE-jét okozza, ha új szándék érkezik, miközben a játékos tevékenysége a háttérben van. - - Javítva, hogy a lejátszó előugró ablakra minimalizálja, nem semmisíti meg a lejátszót ha a popup engedélyt nem adják meg. +- a képernyő időtúllépése felugró mód esetén. #1463 (javítva #640) +- Fő videólejátszó #1509 + - [#1412] az ismétlés mód, ami a lejátszó NPE-t okozza, ha új szándék érkezik, miközben a lejátszó a háttérben fut. + - a lejátszó felugró ablakra minimalizálása nem semmisíti meg a lejátszót, ha a felugró ablak nem engedélyezett. diff --git a/fastlane/metadata/android/hu/changelogs/68.txt b/fastlane/metadata/android/hu/changelogs/68.txt new file mode 100644 index 00000000000..d292749fd32 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/68.txt @@ -0,0 +1,31 @@ +# Változások v0.14.1 + +### Javítva +- a nem sikerül visszafejteni a videó URL-t #1659 +- a leíró link nem jól kibontható #1657 + +# Változások v0.14.0 + +### Új +- fiókkialakítás #1461 +- testreszabható címlap #1461 + +### Fejlesztések +- Átdolgozott gesztusvezérlők #1604 +- Új módja a felugrólejátszó bezárásának #1597 + +### Javítva +- a feliratkozók száma nem érhető el hibája. Bezárva a #1649. +- Ezekben az esetekben „A feliratkozók száma nem érhető el” megjelenítése +- az NPE, ha egy YouTube lejátszási lista üres +- Gyors javítás a SoundCloud kioszkjaihoz +- Refaktor és hibajavítás #1623 + - a ciklikus keresési eredmény #1562 + - a keresősáv nincs statikusan elrendezve + - az YT Prémium videó nincs megfelelően blokkolva + - a videók néha nem töltődnek be (a DASH elemzés miatt) + - a linkek a videó leírásában + - Figyelmeztetés megjelenítése, ha valaki külső SD-kártyára próbál letölteni + - a semmi sem jelenik meg kivétel jelentést vált ki + - A bélyegkép nem jelenik meg az Android 8.1 háttérlejátszóban [lásd itt](https://github.com/TeamNewPipe/NewPipe/issues/943) +- a műsorszóró vevőregisztrációja. Bezárva a #1641. diff --git a/fastlane/metadata/android/hu/changelogs/974.txt b/fastlane/metadata/android/hu/changelogs/974.txt new file mode 100644 index 00000000000..f932a89c35c --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/974.txt @@ -0,0 +1,5 @@ +Gyorsjavítás +• Javítva a YouTube szabályozás által okozott pufferelési problémák +• Javítva a YouTube megjegyzések kinyerése átal okozott összeomlás, letiltott megjegyzéseknél +• Javítva a YouTube zenei keresés +• Javítva a PeerTube élő közvetítések diff --git a/fastlane/metadata/android/hu/changelogs/978.txt b/fastlane/metadata/android/hu/changelogs/978.txt new file mode 100644 index 00000000000..68cae7c9de2 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/978.txt @@ -0,0 +1 @@ +Kijavítva az új NewPipe-verzió ellenőrzésének végrehajtása. Ez az ellenőrzés néha túl korán lett végregajtva, és ez az alkalmazás összeomlásához vezetett. Ezt most meg lett oldva. diff --git a/fastlane/metadata/android/hu/changelogs/979.txt b/fastlane/metadata/android/hu/changelogs/979.txt new file mode 100644 index 00000000000..d7733434dd5 --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/979.txt @@ -0,0 +1,2 @@ +- Javítva a lejátszásfolytatás +- Fejlesztések annak biztosítására, hogy az a szolgáltatás, amely meghatározza, hogy a NewPipe új verzióellenőrzéseket keres-e, ne induljon el a háttérben diff --git a/fastlane/metadata/android/hu/changelogs/991.txt b/fastlane/metadata/android/hu/changelogs/991.txt index 386cded5aa0..cd4640f8c99 100644 --- a/fastlane/metadata/android/hu/changelogs/991.txt +++ b/fastlane/metadata/android/hu/changelogs/991.txt @@ -10,4 +10,4 @@ Javítások Hibajavítások • Többféle összeomlás lett javítva -• [YouTube] Javítva lett a csatornák betöltése, a nem dedikált feed és néhány ország visszajátszási gondjait megkerültük +• [YouTube] Javítva lett a csatornák betöltése, a nem elkülönített feed, és néhány ország lejátszási gondjait megkerültük diff --git a/fastlane/metadata/android/hu/changelogs/993.txt b/fastlane/metadata/android/hu/changelogs/993.txt new file mode 100644 index 00000000000..81b8e9a1dec --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/993.txt @@ -0,0 +1,12 @@ +Új +• Figyelmeztetés hozzáadása lejátszási lista ismétlődéseinek hozzáadásakor, és gomb hozzáadása ezek eltávolításához +• Engedélyezve a hardvergombok figyelmen kívül hagyása +• A hírfolyamban részben megtekintett videók elrejtésének engedélyezése + +Fejlesztés +• Több rácsoszlop használata a nagy képernyőkön +• A folyamatjelzők összhangban állítása a beállításokkal + +Javítva +• A böngésző nyitó URL-címeinek, letöltéseinek és külső lejátszóinak javítása Android 11+ rendszeren +• A MIUI két érintést igénylő teljes képernyős kölcsönhatásának javítása diff --git a/fastlane/metadata/android/hu/full_description.txt b/fastlane/metadata/android/hu/full_description.txt index 772992ee41e..6ea92d55ad9 100644 --- a/fastlane/metadata/android/hu/full_description.txt +++ b/fastlane/metadata/android/hu/full_description.txt @@ -1 +1 @@ -A NewPipe nem használ semmilyen Google keretrendszer programkönyvtárat, sem a YouTube API-t. Csupán a weboldalt dolgozza fel, hogy kinyerje a szükséges információkat. Így ez az alkalmazás a Google Szolgáltatások nélkül futó eszközökön is használható. Továbbá a NewPipe használatához nincs szükség YouTube-fiókra sem. A NewPipe szabad és nyílt forráskódú szoftver. +A NewPipe nem használ semmilyen Google keretrendszer programkönyvtárat, sem a YouTube API-t. Csupán a weboldalt dolgozza fel, hogy kinyerje a szükséges információkat. Így ez az alkalmazás a Google Szolgáltatások nélküli eszközökön is használható. Továbbá a NewPipe használatához nincs szükség YouTube fiókra és ez szabad és nyílt forráskódú szoftver (FLOSS). diff --git a/fastlane/metadata/android/ko/changelogs/952.txt b/fastlane/metadata/android/ko/changelogs/952.txt new file mode 100644 index 00000000000..4fa66285c82 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/952.txt @@ -0,0 +1,7 @@ +개선된 사항 +• 유튜브에서만 가능했던 자동재생 기능이 이제 모든 서비스에서 사용가능합니다 + +고쳐진점 +• 유튜브의 새로운 컨티뉴어스를 지원하여 관련된 스트림과 연관된 문제를 고쳤습니다 +• 연령제한된 유튜브 비디오 기능을 고쳤습니다 +• [안드로이드 TV] 오래 지속되는 포커스 하이라이트 오버레이를 고쳤습니다 diff --git a/fastlane/metadata/android/nl/changelogs/953.txt b/fastlane/metadata/android/nl/changelogs/953.txt index ca4000ebd8b..8f7f8b89a36 100644 --- a/fastlane/metadata/android/nl/changelogs/953.txt +++ b/fastlane/metadata/android/nl/changelogs/953.txt @@ -1 +1 @@ -Hersteld: extractie van de decoderingsfunctie van YouTube. +Herstel de extractie van de decoderingsfunctie van YouTube. diff --git a/fastlane/metadata/android/sk/changelogs/65.txt b/fastlane/metadata/android/sk/changelogs/65.txt new file mode 100644 index 00000000000..c7cac262691 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/65.txt @@ -0,0 +1,26 @@ +### Zlepšenia + +- Zakázanie animácie ikony burgermenu #1486 +- Zrušenie odstránenia stiahnutých súborov #1472 +- Možnosť sťahovania v ponuke zdieľania #1498 +- Pridaná možnosť zdieľania do ponuky dlhého ťuknutia #1454 +- Minimalizácia hlavného prehrávača pri ukončení #1354 +- Aktualizácia verzie knižnice a oprava zálohovania databázy #1510 +- Aktualizácia ExoPlayer 2.8.2 #1392 + - Prepracované dialógové okno na ovládanie rýchlosti prehrávania tak, aby podporovalo rôzne veľkosti krokov pre rýchlejšiu zmenu rýchlosti. + - Pridaný prepínač na rýchle prevíjanie dopredu počas ticha v ovládaní rýchlosti prehrávania. Toto by malo byť užitočné pre audioknihy a niektoré hudobné žánre a môže priniesť skutočne plynulý zážitok (a môže prerušiť skladbu s množstvom ticha =\). + - Prepracované rozlíšenie zdrojov médií, aby bolo možné odovzdávať metadáta spolu s médiami interne v prehrávači, namiesto toho, aby sa to robilo ručne. Teraz máme jediný zdroj metadát a je priamo k dispozícii pri spustení prehrávania. + - Opravené neaktualizovanie metadát vzdialeného zoznamu skladieb, keď sú k dispozícii nové metadáta pri otvorení fragmentu zoznamu skladieb. + - Rôzne opravy používateľského rozhrania: #1383, ovládacie prvky oznámenia prehrávača na pozadí sú teraz vždy biele, jednoduchšie vypnutie vyskakovacieho prehrávača prostredníctvom hodenia +- Použitie nového extraktora s preformulovanou architektúrou pre multiservis + +### Opravy + +- Oprava #1440 Nefunkčné rozloženie informácií o videu #1491 +- Oprava histórie zobrazenia #1497 + - #1495 aktualizáciou metadát (miniatúry, názov a počet videí) hneď, ako používateľ vstúpi do zoznamu skladieb. + - #1475, zaregistrovaním zobrazenia v databáze, keď používateľ spustí video v externom prehrávači na detailnom fragmente. +- Oprava časového limitu creen v prípade popup režimu. #1463 (Opravené #640) +- Oprava hlavného prehrávača videa č. 1509 + - #1412] Opravený režim opakovania spôsobujúci NPE prehrávača, keď je prijatý nový zámer, zatiaľ čo je činnosť prehrávača na pozadí. + - Opravené minimalizovanie prehrávača na vyskakovacie okno nezničí prehrávač, keď nie je udelené povolenie na vyskakovanie. diff --git a/fastlane/metadata/android/sk/changelogs/66.txt b/fastlane/metadata/android/sk/changelogs/66.txt new file mode 100644 index 00000000000..ba9808cba6a --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/66.txt @@ -0,0 +1,33 @@ +# Zoznam zmien verzie v0.13.7 + +### Opravené +- Oprava problémov s triediacim filtrom vo verzii v0.13.6 + +# Zoznam zmien verzie v0.13.6 + +### Vylepšenia + +- Zakázanie animácie ikony burgermenu #1486 +- Zrušenie odstránenia stiahnutých súborov #1472 +- Možnosť sťahovania v ponuke zdieľania #1498 +- Pridaná možnosť zdieľania do ponuky dlhého ťuknutia #1454 +- Minimalizácia hlavného prehrávača pri ukončení #1354 +- Aktualizácia verzie knižnice a oprava zálohovania databázy #1510 +- Aktualizácia ExoPlayer 2.8.2 #1392 + - Prepracované dialógové okno na ovládanie rýchlosti prehrávania tak, aby podporovalo rôzne veľkosti krokov pre rýchlejšiu zmenu rýchlosti. + - Pridaný prepínač na rýchle prevíjanie dopredu počas ticha v ovládaní rýchlosti prehrávania. Toto by malo byť užitočné pre audioknihy a niektoré hudobné žánre a môže priniesť skutočne plynulý zážitok (a môže prerušiť skladbu s množstvom ticha =\). + - Prepracované rozlíšenie zdrojov médií, aby bolo možné odovzdávať metadáta spolu s médiami interne v prehrávači, namiesto toho, aby sa to robilo ručne. Teraz máme jediný zdroj metadát a je priamo k dispozícii pri spustení prehrávania. + - Opravené neaktualizovanie metadát vzdialeného zoznamu skladieb, keď sú k dispozícii nové metadáta pri otvorení fragmentu zoznamu skladieb. + - Rôzne opravy používateľského rozhrania: #1383, ovládacie prvky oznámenia prehrávača na pozadí sú teraz vždy biele, jednoduchšie vypnutie vyskakovacieho prehrávača prostredníctvom hodenia +- Použitie nového extraktora s preformulovanou architektúrou pre multiservis + +### Opravy + +- Oprava #1440 Nefunkčné rozloženie informácií o videu #1491 +- Oprava histórie zobrazenia #1497 + - #1495 aktualizáciou metadát (miniatúry, názov a počet videí) hneď, ako používateľ vstúpi do zoznamu skladieb. + - #1475, zaregistrovaním zobrazenia v databáze, keď používateľ spustí video v externom prehrávači na detailnom fragmente. +- Oprava časového limitu creen v prípade popup režimu. #1463 (Opravené #640) +- Oprava hlavného prehrávača videa č. 1509 + - #1412] Opravený režim opakovania spôsobujúci NPE prehrávača, keď je prijatý nový zámer, zatiaľ čo je činnosť prehrávača na pozadí. + - Opravené minimalizovanie prehrávača na vyskakovacie okno nezničí prehrávač, keď nie je udelené povolenie na vyskakovanie. diff --git a/fastlane/metadata/android/sk/changelogs/989.txt b/fastlane/metadata/android/sk/changelogs/989.txt new file mode 100644 index 00000000000..ff412ff7dcd --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/989.txt @@ -0,0 +1,3 @@ +- [YouTube] Oprava nekonečného načítavania pri pokuse o prehrávanie akéhokoľvek videa +- [YouTube] Oprava obmedzovania výkonu pri niektorých videách +- Aktualizácia knižnice jep na verziu 1.15.3, ktorá obsahuje opravu zabezpečenia diff --git a/fastlane/metadata/android/sk/changelogs/990.txt b/fastlane/metadata/android/sk/changelogs/990.txt new file mode 100644 index 00000000000..3a073d72029 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/990.txt @@ -0,0 +1,15 @@ +V tejto verzii sa ruší podpora systému Android 4.4 KitKat, teraz je minimálna verzia Android 5 Lollipop! + +Novinky +- Stiahnutie z ponuky dlhého stlačenia +- Skrytie budúcich videí v kanáli +- Zdieľanie miestnych zoznamov skladieb + +Vylepšenia +- Prepracovanie kódu prehrávača do malých komponentov: menej použitej pamäte RAM, menej chýb +- Vylepšenie režimu zmenšovania miniatúr +- Vektorizácia zástupných znakov obrázkov + +Opravy +- Oprava rôznych problémov s oznámením prehrávača: neaktuálne/chýbajúce informácie o médiách, skreslené miniatúry +- Oprava zobrazenia na celú obrazovku pomocou 1/4 obrazovky diff --git a/fastlane/metadata/android/sk/changelogs/992.txt b/fastlane/metadata/android/sk/changelogs/992.txt new file mode 100644 index 00000000000..0ae2b2e9fe7 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/992.txt @@ -0,0 +1,17 @@ +Nové +- Počet odberateľov v detailoch videa +- Stiahnutie z frontu +- Trvalé nastavenie miniatúry zoznamu skladieb +- Dlhé stlačenie hashtagov a odkazov +- Režim zobrazenia kariet + +Vylepšená stránka +- Väčšie tlačidlo na zatvorenie miniprehrávača +- Hladšie zmenšovanie miniatúr +- Cieľový systém Android 13 (API 33) +- Vyhľadávanie už nepozastavuje prehrávač + +Opravená stránka +- Oprava prekrytia na DeX/myši +- Povolenie prehrávača na pozadí bez samostatných zvukových tokov +- Rôzne opravy YouTube a ďalšie… diff --git a/fastlane/metadata/android/sk/changelogs/993.txt b/fastlane/metadata/android/sk/changelogs/993.txt new file mode 100644 index 00000000000..9db62cc8cc9 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/993.txt @@ -0,0 +1,12 @@ +Nové +- Pridanie upozornenia pri pridávaní duplikátov do zoznamu skladieb a pridanie tlačidla na ich odstránenie +- Umožniť ignorovanie hardvérových tlačidiel +- Umožniť skrývanie čiastočne sledovaných videí v kanáli + +Vylepšená stránka +- Použitie väčšieho počtu stĺpcov mriežky na veľkých obrazovkách +- Zosúladiť ukazovatele priebehu s nastaveniami + +Opravená stránka +- Oprava otvárania adries URL prehliadača, sťahovania a externých prehrávačov v systéme Android 11+ +- Oprava interakcie s celou obrazovkou vyžadujúcou dve ťuknutia na MIUI diff --git a/fastlane/metadata/android/ti/changelogs/850.txt b/fastlane/metadata/android/ti/changelogs/850.txt new file mode 100644 index 00000000000..7d7d9fe5aed --- /dev/null +++ b/fastlane/metadata/android/ti/changelogs/850.txt @@ -0,0 +1 @@ +እዚ ሕታም እዚ እቲ ወብ ሳይት ዩቱብ ዘዳለዎ ሕታም እዋናዊ እዩ ነይሩ። እቲ ናይ ቀደም ወብ ሳይት ሕታም ኣብ መጋቢት ስለ ዚቋረጽ ነቲ ሓድሽ ፓይፕ ከተመሓይሾ ኣሎካ። diff --git a/fastlane/metadata/android/ti/full_description.txt b/fastlane/metadata/android/ti/full_description.txt new file mode 100644 index 00000000000..f0afa90abc1 --- /dev/null +++ b/fastlane/metadata/android/ti/full_description.txt @@ -0,0 +1 @@ +ኒውፓይፕ ዝዀነ ይኹን ናይ ጎልጋል ቤተ-መጻሕፍቲ ወይ ናይ ዩቱብ ኤፒኢ ኣይጥቀምን ኢዩ። ነቲ ወብ ሳይት ዜድልዮ ሓበሬታ ንምርካብ ጥራይ እዩ ዚምርምሮ ። ስለዚ እዚ ኣፕሊኬሽን እዚ ብዘይ ናይ ጎልጋል ሰርቪስ ኣብ ኤለክትሮኒካዊ መሳርሒታት ክትጥቀመሉ ትኽእል ኢኻ ። ኒውፓይፕ ንምጥቃም እውን ናይ ዩቱብ ሕሳብ ኣየድልየካን ኢዩ እዚ ኸኣ FLOSS ኢዩ። diff --git a/fastlane/metadata/android/ti/short_description.txt b/fastlane/metadata/android/ti/short_description.txt new file mode 100644 index 00000000000..f7f2099a19d --- /dev/null +++ b/fastlane/metadata/android/ti/short_description.txt @@ -0,0 +1 @@ +ብናጻ ፈኲስ ናይ ዩቱብ ግንባር ንኣንድሮይድ ። From 8bdeed8f287dd94210e4d981d231d22e1265e5fe Mon Sep 17 00:00:00 2001 From: TobiGr Date: Thu, 15 Jun 2023 15:51:56 +0200 Subject: [PATCH 191/645] Add support for new GitHub assetes URLs in image minimizer workflow --- .github/workflows/image-minimizer.js | 103 ++++++++++++++------------- 1 file changed, 54 insertions(+), 49 deletions(-) diff --git a/.github/workflows/image-minimizer.js b/.github/workflows/image-minimizer.js index df1a30f9b14..5fbd1f3b8ad 100644 --- a/.github/workflows/image-minimizer.js +++ b/.github/workflows/image-minimizer.js @@ -30,10 +30,12 @@ module.exports = async ({github, context}) => { } // Regex for finding images (simple variant) ![ALT_TEXT](https://*.githubusercontent.com//.) - const REGEX_IMAGE_LOOKUP = /\!\[(.*)\]\((https:\/\/[-a-z0-9]+\.githubusercontent\.com\/\d+\/[-0-9a-f]{32,512}\.(jpg|gif|png))\)/gm; + const REGEX_USER_CONTENT_IMAGE_LOOKUP = /\!\[(.*)\]\((https:\/\/[-a-z0-9]+\.githubusercontent\.com\/\d+\/[-0-9a-f]{32,512}\.(jpg|gif|png))\)/gm; + const REGEX_ASSETS_IMAGE_LOCKUP = /\!\[(.*)\]\((https:\/\/github\.com\/[-\w\d]+\/[-\w\d]+\/assets\/\d+\/[\-0-9a-f]{32,512})\)/gm; // Check if we found something - let foundSimpleImages = REGEX_IMAGE_LOOKUP.test(initialBody); + let foundSimpleImages = REGEX_USER_CONTENT_IMAGE_LOOKUP.test(initialBody) + || REGEX_ASSETS_IMAGE_LOCKUP.test(initialBody); if (!foundSimpleImages) { console.log('Found no simple images to process'); return; @@ -47,53 +49,8 @@ module.exports = async ({github, context}) => { var wasMatchModified = false; // Try to find and replace the images with minimized ones - let newBody = await replaceAsync(initialBody, REGEX_IMAGE_LOOKUP, async (match, g1, g2) => { - console.log(`Found match '${match}'`); - - if (g1.endsWith(IGNORE_ALT_NAME_END)) { - console.log(`Ignoring match '${match}': IGNORE_ALT_NAME_END`); - return match; - } - - let probeAspectRatio = 0; - let shouldModify = false; - try { - console.log(`Probing ${g2}`); - let probeResult = await probe(g2); - if (probeResult == null) { - throw 'No probeResult'; - } - if (probeResult.hUnits != 'px') { - throw `Unexpected probeResult.hUnits (expected px but got ${probeResult.hUnits})`; - } - if (probeResult.height <= 0) { - throw `Unexpected probeResult.height (height is invalid: ${probeResult.height})`; - } - if (probeResult.wUnits != 'px') { - throw `Unexpected probeResult.wUnits (expected px but got ${probeResult.wUnits})`; - } - if (probeResult.width <= 0) { - throw `Unexpected probeResult.width (width is invalid: ${probeResult.width})`; - } - console.log(`Probing resulted in ${probeResult.width}x${probeResult.height}px`); - - probeAspectRatio = probeResult.width / probeResult.height; - shouldModify = probeResult.height > IMG_MAX_HEIGHT_PX && probeAspectRatio < MIN_ASPECT_RATIO; - } catch(e) { - console.log('Probing failed:', e); - // Immediately abort - return match; - } - - if (shouldModify) { - wasMatchModified = true; - console.log(`Modifying match '${match}'`); - return `${g1}`; - } - - console.log(`Match '${match}' is ok/will not be modified`); - return match; - }); + let newBody = await replaceAsync(initialBody, REGEX_USER_CONTENT_IMAGE_LOOKUP, minimizeAsync); + newBody = await replaceAsync(newBody, REGEX_ASSETS_IMAGE_LOCKUP, minimizeAsync); if (!wasMatchModified) { console.log('Nothing was modified. Skipping update'); @@ -129,4 +86,52 @@ module.exports = async ({github, context}) => { const data = await Promise.all(promises); return str.replace(regex, () => data.shift()); } + + async function minimizeAsync(match, g1, g2) { + console.log(`Found match '${match}'`); + + if (g1.endsWith(IGNORE_ALT_NAME_END)) { + console.log(`Ignoring match '${match}': IGNORE_ALT_NAME_END`); + return match; + } + + let probeAspectRatio = 0; + let shouldModify = false; + try { + console.log(`Probing ${g2}`); + let probeResult = await probe(g2); + if (probeResult == null) { + throw 'No probeResult'; + } + if (probeResult.hUnits != 'px') { + throw `Unexpected probeResult.hUnits (expected px but got ${probeResult.hUnits})`; + } + if (probeResult.height <= 0) { + throw `Unexpected probeResult.height (height is invalid: ${probeResult.height})`; + } + if (probeResult.wUnits != 'px') { + throw `Unexpected probeResult.wUnits (expected px but got ${probeResult.wUnits})`; + } + if (probeResult.width <= 0) { + throw `Unexpected probeResult.width (width is invalid: ${probeResult.width})`; + } + console.log(`Probing resulted in ${probeResult.width}x${probeResult.height}px`); + + probeAspectRatio = probeResult.width / probeResult.height; + shouldModify = probeResult.height > IMG_MAX_HEIGHT_PX && probeAspectRatio < MIN_ASPECT_RATIO; + } catch(e) { + console.log('Probing failed:', e); + // Immediately abort + return match; + } + + if (shouldModify) { + wasMatchModified = true; + console.log(`Modifying match '${match}'`); + return `${g1}`; + } + + console.log(`Match '${match}' is ok/will not be modified`); + return match; + } } From 1a2fbd812269a322ff4da4cb65089d6ede0eb7a1 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 1 Jul 2023 13:29:39 +0200 Subject: [PATCH 192/645] Update acra and checkstyle fixing vulnerability in dependency com.google.guava See https://app.snyk.io/org/thescrabi/project/27dc214e-7f4f-47bb-a77c-443201491254 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c2e8a95b16d..fdb5ed651ee 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -107,7 +107,7 @@ android { } ext { - checkstyleVersion = '10.11.0' + checkstyleVersion = '10.12.1' androidxLifecycleVersion = '2.5.1' androidxRoomVersion = '2.4.3' @@ -272,7 +272,7 @@ dependencies { implementation "io.noties.markwon:linkify:${markwonVersion}" // Crash reporting - implementation "ch.acra:acra-core:5.9.7" + implementation "ch.acra:acra-core:5.10.1" // Properly restarting implementation 'com.jakewharton:process-phoenix:2.1.2' From 5716d51112e4e6e9454c9e682dce1cc852f6e80b Mon Sep 17 00:00:00 2001 From: Stypox Date: Thu, 6 Jul 2023 20:06:08 +0200 Subject: [PATCH 193/645] Update screenshots --- .../en-US/images/phoneScreenshots/00.png | Bin 0 -> 611172 bytes .../en-US/images/phoneScreenshots/01.png | Bin 0 -> 550800 bytes .../en-US/images/phoneScreenshots/02.png | Bin 0 -> 770038 bytes .../en-US/images/phoneScreenshots/03.png | Bin 0 -> 268316 bytes .../en-US/images/phoneScreenshots/04.png | Bin 0 -> 81032 bytes .../en-US/images/phoneScreenshots/05.png | Bin 0 -> 444604 bytes .../en-US/images/phoneScreenshots/06.png | Bin 0 -> 505906 bytes .../en-US/images/phoneScreenshots/07.png | Bin 0 -> 116448 bytes .../en-US/images/phoneScreenshots/08.png | Bin 0 -> 749492 bytes .../en-US/images/phoneScreenshots/shot_01.png | Bin 65454 -> 0 bytes .../en-US/images/phoneScreenshots/shot_02.png | Bin 60988 -> 0 bytes .../en-US/images/phoneScreenshots/shot_03.png | Bin 108678 -> 0 bytes .../en-US/images/phoneScreenshots/shot_04.png | Bin 91545 -> 0 bytes .../en-US/images/phoneScreenshots/shot_05.png | Bin 180488 -> 0 bytes .../en-US/images/phoneScreenshots/shot_06.png | Bin 151860 -> 0 bytes .../en-US/images/phoneScreenshots/shot_07.png | Bin 271556 -> 0 bytes .../en-US/images/phoneScreenshots/shot_08.png | Bin 140160 -> 0 bytes .../en-US/images/phoneScreenshots/shot_09.png | Bin 47980 -> 0 bytes .../en-US/images/phoneScreenshots/shot_10.png | Bin 102904 -> 0 bytes .../en-US/images/tenInchScreenshots/09.png | Bin 0 -> 1928609 bytes .../en-US/images/tenInchScreenshots/10.png | Bin 0 -> 2451781 bytes .../images/tenInchScreenshots/shot_11.png | Bin 426133 -> 0 bytes .../images/tenInchScreenshots/shot_12.png | Bin 392356 -> 0 bytes 23 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/00.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/01.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/02.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/03.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/04.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/05.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/06.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/07.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/08.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png create mode 100644 fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png create mode 100644 fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png delete mode 100644 fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png delete mode 100644 fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png new file mode 100644 index 0000000000000000000000000000000000000000..3a74f5a5b927c446deab57b0bd4496cbda0e288a GIT binary patch literal 611172 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%0A_uW@%_$+(Tu^gb>NBDrT`W&U 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