Merge pull request #5246 from TeamNewPipe/release_0.20.7

Release 0.20.7
This commit is contained in:
Tobias Groza 2020-12-25 20:25:01 +01:00 committed by GitHub
commit d403a83a24
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
132 changed files with 3251 additions and 2125 deletions

30
.github/workflows/ci.yml vendored Normal file
View file

@ -0,0 +1,30 @@
name: CI
on: [push, pull_request]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: set up JDK 1.8
uses: actions/setup-java@v1.4.3
with:
java-version: 1.8
- name: Cache Gradle dependencies
uses: actions/cache@v2
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
restore-keys: ${{ runner.os }}-gradle
- name: Build debug APK and run Tests
run: ./gradlew assembleDebug lintDebug testDebugUnitTest --stacktrace
- name: Upload APK
uses: actions/upload-artifact@v2
with:
name: app
path: app/build/outputs/apk/debug/*.apk

View file

@ -1,18 +0,0 @@
language: android
jdk:
- oraclejdk8
android:
components:
# The BuildTools version used by NewPipe
- tools
- build-tools-29.0.3
# The SDK version used to compile NewPipe
- android-29
before_install:
- yes | sdkmanager "platforms;android-29"
script: ./gradlew -Dorg.gradle.jvmargs=-Xmx1536m assembleDebug lintDebug testDebugUnitTest
licenses:
- '.+'

View file

@ -1,4 +1,4 @@
<p align="center"><a href="https://newpipe.schabi.org"><img src="assets/new_pipe_icon_5.png" width="150"></a></p>
<p align="center"><a href="https://newpipe.net"><img src="assets/new_pipe_icon_5.png" width="150"></a></p>
<h2 align="center"><b>NewPipe</b></h2>
<h4 align="center">A libre lightweight streaming frontend for Android.</h4>
<p align="center"><a href="https://f-droid.org/packages/org.schabi.newpipe/"><img src="https://f-droid.org/wiki/images/0/06/F-Droid-button_get-it-on.png"></a></p>
@ -13,7 +13,7 @@
</p>
<hr>
<p align="center"><a href="#screenshots">Screenshots</a> &bull; <a href="#description">Description</a> &bull; <a href="#features">Features</a> &bull; <a href="#updates">Updates</a> &bull; <a href="#contribution">Contribution</a> &bull; <a href="#donate">Donate</a> &bull; <a href="#license">License</a></p>
<p align="center"><a href="https://newpipe.schabi.org">Website</a> &bull; <a href="https://newpipe.schabi.org/blog/">Blog</a> &bull; <a href="https://newpipe.schabi.org/FAQ/">FAQ</a> &bull; <a href="https://newpipe.schabi.org/press/">Press</a></p>
<p align="center"><a href="https://newpipe.net">Website</a> &bull; <a href="https://newpipe.net/blog/">Blog</a> &bull; <a href="https://newpipe.net/FAQ/">FAQ</a> &bull; <a href="https://newpipe.net/press/">Press</a></p>
<hr>
*Read this in other languages: [English](README.md), [한국어](README.ko.md).*
@ -86,7 +86,7 @@ NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로
1. 직접 디버그 APK를 생성할 수 있습니다. 이 방법은 당신의 기기에서 새로운 기능을 얻을 수 있는 가장 빠른 방법이지만, 꽤 많이 복잡합니다.
따라서 우리는 다른 방법들 중 하나를 사용하는 것을 추천합니다.
2. 우리의 커스텀 저장소를 F-Droid에 추가하고 우리가 릴리즈를 게시하는 대로 저곳에서 릴리즈를 설치할 수 있습니다.
이에 대한 설명서는 이곳에서 확인할 수 있습니다: https://newpipe.schabi.org/FAQ/tutorials/install-add-fdroid-repo/
이에 대한 설명서는 이곳에서 확인할 수 있습니다: 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를 생성하고, 이것에 서명하고, 사용자들에서 업데이트를 전달해야만 하기 때문에,
이것은 업데이트를 받는 가장 느린 방법입니다.
@ -111,7 +111,7 @@ NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로
</a>
## Donate
만약 NewPipe가 마음에 들었다면, 우리는 기부에 대해 기꺼이 환영합니다. bitcoin을 보내거나, Bountysource 또는 Liberapay를 통해 기부할 수 있습니다. NewPipe에 기부하는 것에 대한 자세한 정보를 원한다면, 우리의 [웹사이트](https://newpipe.schabi.org/donate)를 방문하여 주십시오.
만약 NewPipe가 마음에 들었다면, 우리는 기부에 대해 기꺼이 환영합니다. bitcoin을 보내거나, Bountysource 또는 Liberapay를 통해 기부할 수 있습니다. NewPipe에 기부하는 것에 대한 자세한 정보를 원한다면, 우리의 [웹사이트](https://newpipe.net/donate)를 방문하여 주십시오.
<table>
<tr>
@ -134,7 +134,7 @@ NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로
## Privacy Policy
NewPipe 프로젝트는 미디어 웹 서비스를 사용하는 것에 대한 사적의, 익명의 경험을 제공하는 것을 목표로 하고 있습니다.
그러므로, 앱은 당신의 동의 없이 어떤 데이터도 수집하지 않습니다. NewPipe의 개인정보보호정책은 당신이 충돌 리포트를 보내거나, 또는 우리의 블로그에 글을 남길 때 어떤 데이터가 보내지고 저장되는지에 대해 상세히 설명합니다. 이 문서는 [여기](https://newpipe.schabi.org/legal/privacy/)에서 확인할 수 있습니다.
그러므로, 앱은 당신의 동의 없이 어떤 데이터도 수집하지 않습니다. NewPipe의 개인정보보호정책은 당신이 충돌 리포트를 보내거나, 또는 우리의 블로그에 글을 남길 때 어떤 데이터가 보내지고 저장되는지에 대해 상세히 설명합니다. 이 문서는 [여기](https://newpipe.net/legal/privacy/)에서 확인할 수 있습니다.
## License
[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](http://www.gnu.org/licenses/gpl-3.0.en.html)

View file

@ -1,4 +1,4 @@
<p align="center"><a href="https://newpipe.schabi.org"><img src="assets/new_pipe_icon_5.png" width="150"></a></p>
<p align="center"><a href="https://newpipe.net"><img src="assets/new_pipe_icon_5.png" width="150"></a></p>
<h2 align="center"><b>NewPipe</b></h2>
<h4 align="center">A libre lightweight streaming frontend for Android.</h4>
<p align="center"><a href="https://f-droid.org/packages/org.schabi.newpipe/"><img src="https://f-droid.org/wiki/images/0/06/F-Droid-button_get-it-on.png"></a></p>
@ -13,7 +13,7 @@
</p>
<hr>
<p align="center"><a href="#screenshots">Screenshots</a> &bull; <a href="#description">Description</a> &bull; <a href="#features">Features</a> &bull; <a href="#updates">Updates</a> &bull; <a href="#contribution">Contribution</a> &bull; <a href="#donate">Donate</a> &bull; <a href="#license">License</a></p>
<p align="center"><a href="https://newpipe.schabi.org">Website</a> &bull; <a href="https://newpipe.schabi.org/blog/">Blog</a> &bull; <a href="https://newpipe.schabi.org/FAQ/">FAQ</a> &bull; <a href="https://newpipe.schabi.org/press/">Press</a></p>
<p align="center"><a href="https://newpipe.net">Website</a> &bull; <a href="https://newpipe.net/blog/">Blog</a> &bull; <a href="https://newpipe.net/FAQ/">FAQ</a> &bull; <a href="https://newpipe.net/press/">Press</a></p>
<hr>
*Read this in other languages: [English](README.md), [한국어](README.ko.md).*
@ -83,7 +83,7 @@ NewPipe supports multiple services. Our [docs](https://teamnewpipe.github.io/doc
## Updates
When a change to the NewPipe code occurs (due to either adding features or bug fixing), eventually a release will occur. These are in the format x.xx.x . In order to get this new version, you can:
1. Build a debug APK yourself. This is the fastest way to get new features on your device, but is much more complicated, so we recommend using one of the other methods.
2. Add our custom repo to F-Droid and install it from there as soon as we publish a release. The instructions are here: https://newpipe.schabi.org/FAQ/tutorials/install-add-fdroid-repo/
2. Add our custom repo to F-Droid and install it from there as soon as we publish a release. The instructions are here: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/
3. Download the APK from [Github Releases](https://github.com/TeamNewPipe/NewPipe/releases) and install it as soon as we publish a release.
4. Update via F-droid. This is the slowest method of getting updates, as F-Droid must recognize changes, build the APK itself, sign it, then push the update to users.
@ -106,7 +106,7 @@ If you'd like to get involved, check our [contribution notes](.github/CONTRIBUTI
</a>
## Donate
If you like NewPipe we'd be happy about a donation. You can either send bitcoin or donate via Bountysource or Liberapay. For further info on donating to NewPipe, please visit our [website](https://newpipe.schabi.org/donate).
If you like NewPipe we'd be happy about a donation. You can either send bitcoin or donate via Bountysource or Liberapay. For further info on donating to NewPipe, please visit our [website](https://newpipe.net/donate).
<table>
<tr>
@ -129,7 +129,7 @@ If you like NewPipe we'd be happy about a donation. You can either send bitcoin
## Privacy Policy
The NewPipe project aims to provide a private, anonymous experience for using media web services.
Therefore, the app does not collect any data without your consent. NewPipe's privacy policy explains in detail what data is sent and stored when you send a crash report, or comment in our blog. You can find the document [here](https://newpipe.schabi.org/legal/privacy/).
Therefore, the app does not collect any data without your consent. NewPipe's privacy policy explains in detail what data is sent and stored when you send a crash report, or comment in our blog. You can find the document [here](https://newpipe.net/legal/privacy/).
## License
[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](http://www.gnu.org/licenses/gpl-3.0.en.html)

View file

@ -13,8 +13,8 @@ android {
resValue "string", "app_name", "NewPipe"
minSdkVersion 19
targetSdkVersion 29
versionCode 960
versionName "0.20.6"
versionCode 961
versionName "0.20.7"
multiDexEnabled true
@ -85,11 +85,15 @@ android {
sourceSets {
androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
}
buildFeatures {
viewBinding true
}
}
ext {
icepickVersion = '3.2.0'
checkstyleVersion = '8.37'
checkstyleVersion = '8.38'
stethoVersion = '1.5.1'
leakCanaryVersion = '2.5'
exoPlayerVersion = '2.11.8'
@ -162,7 +166,7 @@ dependencies {
kapt "frankiesardo:icepick-processor:${icepickVersion}"
checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}"
ktlint "com.pinterest:ktlint:0.39.0"
ktlint "com.pinterest:ktlint:0.40.0"
debugImplementation "com.facebook.stetho:stetho:${stethoVersion}"
debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoVersion}"
@ -175,7 +179,7 @@ dependencies {
// NewPipe dependencies
// You can use a local version by uncommenting a few lines in settings.gradle
implementation 'com.github.TeamNewPipe:NewPipeExtractor:b3835bd616ab28b861c83dcefd56e1754c6d20be'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:b2837698f55296e00aeca5cb1847755dd1174af4'
implementation "com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751"
implementation "org.jsoup:jsoup:1.13.1"
@ -199,6 +203,7 @@ dependencies {
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.documentfile:documentfile:1.0.1'
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
implementation 'androidx.webkit:webkit:1.4.0'
implementation "androidx.lifecycle:lifecycle-livedata:${androidxLifecycleVersion}"
implementation "androidx.lifecycle:lifecycle-viewmodel:${androidxLifecycleVersion}"

View file

@ -227,20 +227,18 @@
<data android:host="invidio.us" />
<data android:host="dev.invidio.us" />
<data android:host="www.invidio.us" />
<data android:host="vid.encryptionin.space" />
<data android:host="invidious.snopyta.org" />
<data android:host="fi.invidious.snopyta.org" />
<data android:host="yewtu.be" />
<data android:host="invidious.ggc-project.de" />
<data android:host="yt.maisputain.ovh" />
<data android:host="invidious.13ad.de" />
<data android:host="invidious.toot.koeln" />
<data android:host="tube.connect.cafe" />
<data android:host="invidious.zapashcanon.fr" />
<data android:host="invidious.kavin.rocks" />
<data android:host="invidious.tube" />
<data android:host="invidious.site" />
<data android:host="invidious.xyz" />
<data android:host="vid.mint.lgbt" />
<data android:host="invidiou.site" />
<data android:host="invidious.fdn.fr" />
<data android:host="watch.nettohikari.com" />
<data android:host="invidious.snwmds.net" />
<data android:host="invidious.snwmds.org" />
<data android:host="invidious.snwmds.com" />
<data android:host="invidious.sunsetravens.com" />
<data android:host="invidious.gachirangers.com" />
<data android:pathPrefix="/" />
</intent-filter>
@ -268,7 +266,7 @@
<data android:mimeType="text/plain" />
</intent-filter>
<!-- MediaCCC filter -->
<!-- media.ccc.de filter -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />

View file

@ -242,8 +242,9 @@ public class App extends MultiDexApplication {
String name = getString(R.string.notification_channel_name);
String description = getString(R.string.notification_channel_description);
// Keep this below DEFAULT to avoid making noise on every notification update
final int importance = NotificationManager.IMPORTANCE_LOW;
// Keep this below DEFAULT to avoid making noise on every notification update for the main
// and update channels
int importance = NotificationManager.IMPORTANCE_LOW;
final NotificationChannel mainChannel = new NotificationChannel(id, name, importance);
mainChannel.setDescription(description);
@ -255,9 +256,17 @@ public class App extends MultiDexApplication {
final NotificationChannel appUpdateChannel = new NotificationChannel(id, name, importance);
appUpdateChannel.setDescription(description);
id = getString(R.string.hash_channel_id);
name = getString(R.string.hash_channel_name);
description = getString(R.string.hash_channel_description);
importance = NotificationManager.IMPORTANCE_HIGH;
final NotificationChannel hashChannel = new NotificationChannel(id, name, importance);
hashChannel.setDescription(description);
final NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannels(Arrays.asList(mainChannel,
appUpdateChannel));
appUpdateChannel, hashChannel));
}
protected boolean isDisposedRxExceptionsReported() {

View file

@ -48,7 +48,7 @@ public final class CheckForNewAppVersion {
private static final String GITHUB_APK_SHA1
= "B0:2E:90:7C:1C:D6:FC:57:C3:35:F0:88:D0:8F:50:5F:94:E4:D2:15";
private static final String NEWPIPE_API_URL = "https://newpipe.schabi.org/api/data.json";
private static final String NEWPIPE_API_URL = "https://newpipe.net/api/data.json";
/**
* Method to get the APK's SHA1 key. See https://stackoverflow.com/questions/9293019/#22506133.

View file

@ -39,17 +39,14 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
@ -57,8 +54,12 @@ import androidx.fragment.app.FragmentManager;
import androidx.preference.PreferenceManager;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.navigation.NavigationView;
import org.schabi.newpipe.databinding.ActivityMainBinding;
import org.schabi.newpipe.databinding.DrawerHeaderBinding;
import org.schabi.newpipe.databinding.DrawerLayoutBinding;
import org.schabi.newpipe.databinding.InstanceSpinnerLayoutBinding;
import org.schabi.newpipe.databinding.ToolbarLayoutBinding;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
@ -96,15 +97,14 @@ public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
public static final boolean DEBUG = !BuildConfig.BUILD_TYPE.equals("release");
private ActivityMainBinding mainBinding;
private DrawerHeaderBinding drawerHeaderBinding;
private DrawerLayoutBinding drawerLayoutBinding;
private ToolbarLayoutBinding toolbarLayoutBinding;
private ActionBarDrawerToggle toggle;
private DrawerLayout drawer;
private NavigationView drawerItems;
private ImageView headerServiceIcon;
private TextView headerServiceView;
private Button toggleServiceButton;
private boolean servicesShown = false;
private ImageView serviceArrow;
private BroadcastReceiver broadcastReceiver;
@ -129,7 +129,7 @@ public class MainActivity extends AppCompatActivity {
+ "savedInstanceState = [" + savedInstanceState + "]");
}
// enable TLS1.1/1.2 for kitkat devices, to fix download and play for mediaCCC sources
// enable TLS1.1/1.2 for kitkat devices, to fix download and play for media.ccc.de sources
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
TLSSocketFactoryCompat.setAsDefault();
}
@ -137,13 +137,19 @@ public class MainActivity extends AppCompatActivity {
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainBinding = ActivityMainBinding.inflate(getLayoutInflater());
drawerLayoutBinding = mainBinding.drawerLayout;
drawerHeaderBinding = DrawerHeaderBinding.bind(drawerLayoutBinding.navigation
.getHeaderView(0));
toolbarLayoutBinding = mainBinding.toolbarLayout;
setContentView(mainBinding.getRoot());
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
initFragments();
}
setSupportActionBar(findViewById(R.id.toolbar));
setSupportActionBar(toolbarLayoutBinding.toolbar);
try {
setupDrawer();
} catch (final Exception e) {
@ -157,10 +163,6 @@ public class MainActivity extends AppCompatActivity {
}
private void setupDrawer() throws Exception {
final Toolbar toolbar = findViewById(R.id.toolbar);
drawer = findViewById(R.id.drawer_layout);
drawerItems = findViewById(R.id.navigation);
//Tabs
final int currentServiceId = ServiceHelper.getSelectedServiceId(this);
final StreamingService service = NewPipe.getService(currentServiceId);
@ -168,43 +170,43 @@ public class MainActivity extends AppCompatActivity {
int kioskId = 0;
for (final String ks : service.getKioskList().getAvailableKiosks()) {
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_tabs_group, kioskId, 0, KioskTranslator
.getTranslatedKioskName(ks, this))
.setIcon(KioskTranslator.getKioskIcon(ks, this));
kioskId++;
}
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_tabs_group, ITEM_ID_SUBSCRIPTIONS, ORDER,
R.string.tab_subscriptions)
.setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_channel));
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_tabs_group, ITEM_ID_FEED, ORDER, R.string.fragment_feed_title)
.setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_rss));
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_tabs_group, ITEM_ID_BOOKMARKS, ORDER, R.string.tab_bookmarks)
.setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_bookmark));
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_tabs_group, ITEM_ID_DOWNLOADS, ORDER, R.string.downloads)
.setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_file_download));
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_tabs_group, ITEM_ID_HISTORY, ORDER, R.string.action_history)
.setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_history));
//Settings and About
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_options_about_group, ITEM_ID_SETTINGS, ORDER, R.string.settings)
.setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_settings));
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_options_about_group, ITEM_ID_ABOUT, ORDER, R.string.tab_about)
.setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_info_outline));
toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.drawer_open,
R.string.drawer_close);
toggle = new ActionBarDrawerToggle(this, mainBinding.getRoot(),
toolbarLayoutBinding.toolbar, R.string.drawer_open, R.string.drawer_close);
toggle.syncState();
drawer.addDrawerListener(toggle);
drawer.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {
mainBinding.getRoot().addDrawerListener(toggle);
mainBinding.getRoot().addDrawerListener(new DrawerLayout.SimpleDrawerListener() {
private int lastService;
@Override
@ -218,12 +220,12 @@ public class MainActivity extends AppCompatActivity {
toggleServices();
}
if (lastService != ServiceHelper.getSelectedServiceId(MainActivity.this)) {
new Handler(Looper.getMainLooper()).post(MainActivity.this::recreate);
ActivityCompat.recreate(MainActivity.this);
}
}
});
drawerItems.setNavigationItemSelectedListener(this::drawerItemSelected);
drawerLayoutBinding.navigation.setNavigationItemSelectedListener(this::drawerItemSelected);
setupDrawerHeader();
}
@ -246,15 +248,17 @@ public class MainActivity extends AppCompatActivity {
return false;
}
drawer.closeDrawers();
mainBinding.getRoot().closeDrawers();
return true;
}
private void changeService(final MenuItem item) {
drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this))
drawerLayoutBinding.navigation.getMenu()
.getItem(ServiceHelper.getSelectedServiceId(this))
.setChecked(false);
ServiceHelper.setSelectedServiceId(this, item.getItemId());
drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this))
drawerLayoutBinding.navigation.getMenu()
.getItem(ServiceHelper.getSelectedServiceId(this))
.setChecked(true);
}
@ -306,26 +310,19 @@ public class MainActivity extends AppCompatActivity {
}
private void setupDrawerHeader() {
final NavigationView navigationView = findViewById(R.id.navigation);
final View hView = navigationView.getHeaderView(0);
serviceArrow = hView.findViewById(R.id.drawer_arrow);
headerServiceIcon = hView.findViewById(R.id.drawer_header_service_icon);
headerServiceView = hView.findViewById(R.id.drawer_header_service_view);
toggleServiceButton = hView.findViewById(R.id.drawer_header_action_button);
toggleServiceButton.setOnClickListener(view -> toggleServices());
drawerHeaderBinding.drawerHeaderActionButton.setOnClickListener(view -> toggleServices());
// If the current app name is bigger than the default "NewPipe" (7 chars),
// let the text view grow a little more as well.
if (getString(R.string.app_name).length() > "NewPipe".length()) {
final TextView headerTitle = hView.findViewById(R.id.drawer_header_newpipe_title);
final ViewGroup.LayoutParams layoutParams = headerTitle.getLayoutParams();
final ViewGroup.LayoutParams layoutParams =
drawerHeaderBinding.drawerHeaderNewpipeTitle.getLayoutParams();
layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
headerTitle.setLayoutParams(layoutParams);
headerTitle.setMaxLines(2);
headerTitle.setMinWidth(getResources()
drawerHeaderBinding.drawerHeaderNewpipeTitle.setLayoutParams(layoutParams);
drawerHeaderBinding.drawerHeaderNewpipeTitle.setMaxLines(2);
drawerHeaderBinding.drawerHeaderNewpipeTitle.setMinWidth(getResources()
.getDimensionPixelSize(R.dimen.drawer_header_newpipe_title_default_width));
headerTitle.setMaxWidth(getResources()
drawerHeaderBinding.drawerHeaderNewpipeTitle.setMaxWidth(getResources()
.getDimensionPixelSize(R.dimen.drawer_header_newpipe_title_max_width));
}
}
@ -333,9 +330,9 @@ public class MainActivity extends AppCompatActivity {
private void toggleServices() {
servicesShown = !servicesShown;
drawerItems.getMenu().removeGroup(R.id.menu_services_group);
drawerItems.getMenu().removeGroup(R.id.menu_tabs_group);
drawerItems.getMenu().removeGroup(R.id.menu_options_about_group);
drawerLayoutBinding.navigation.getMenu().removeGroup(R.id.menu_services_group);
drawerLayoutBinding.navigation.getMenu().removeGroup(R.id.menu_tabs_group);
drawerLayoutBinding.navigation.getMenu().removeGroup(R.id.menu_options_about_group);
if (servicesShown) {
showServices();
@ -349,13 +346,13 @@ public class MainActivity extends AppCompatActivity {
}
private void showServices() {
serviceArrow.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp);
drawerHeaderBinding.drawerArrow.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp);
for (final StreamingService s : NewPipe.getServices()) {
final String title = s.getServiceInfo().getName()
+ (ServiceHelper.isBeta(s) ? " (beta)" : "");
final MenuItem menuItem = drawerItems.getMenu()
final MenuItem menuItem = drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_services_group, s.getServiceId(), ORDER, title)
.setIcon(ServiceHelper.getIcon(s.getServiceId()));
@ -364,21 +361,22 @@ public class MainActivity extends AppCompatActivity {
enhancePeertubeMenu(s, menuItem);
}
}
drawerItems.getMenu().getItem(ServiceHelper.getSelectedServiceId(this))
drawerLayoutBinding.navigation.getMenu()
.getItem(ServiceHelper.getSelectedServiceId(this))
.setChecked(true);
}
private void enhancePeertubeMenu(final StreamingService s, final MenuItem menuItem) {
final PeertubeInstance currentInstace = PeertubeHelper.getCurrentInstance();
menuItem.setTitle(currentInstace.getName() + (ServiceHelper.isBeta(s) ? " (beta)" : ""));
final Spinner spinner = (Spinner) LayoutInflater.from(this)
.inflate(R.layout.instance_spinner_layout, null);
final PeertubeInstance currentInstance = PeertubeHelper.getCurrentInstance();
menuItem.setTitle(currentInstance.getName() + (ServiceHelper.isBeta(s) ? " (beta)" : ""));
final Spinner spinner = InstanceSpinnerLayoutBinding.inflate(LayoutInflater.from(this))
.getRoot();
final List<PeertubeInstance> instances = PeertubeHelper.getInstanceList(this);
final List<String> items = new ArrayList<>();
int defaultSelect = 0;
for (final PeertubeInstance instance : instances) {
items.add(instance.getName());
if (instance.getUrl().equals(currentInstace.getUrl())) {
if (instance.getUrl().equals(currentInstance.getUrl())) {
defaultSelect = items.size() - 1;
}
}
@ -397,7 +395,7 @@ public class MainActivity extends AppCompatActivity {
}
PeertubeHelper.selectInstance(newInstance, getApplicationContext());
changeService(menuItem);
drawer.closeDrawers();
mainBinding.getRoot().closeDrawers();
new Handler(Looper.getMainLooper()).postDelayed(() -> {
getSupportFragmentManager().popBackStack(null,
FragmentManager.POP_BACK_STACK_INCLUSIVE);
@ -414,7 +412,7 @@ public class MainActivity extends AppCompatActivity {
}
private void showTabs() throws ExtractionException {
serviceArrow.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp);
drawerHeaderBinding.drawerArrow.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp);
//Tabs
final int currentServiceId = ServiceHelper.getSelectedServiceId(this);
@ -423,34 +421,34 @@ public class MainActivity extends AppCompatActivity {
int kioskId = 0;
for (final String ks : service.getKioskList().getAvailableKiosks()) {
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_tabs_group, kioskId, ORDER,
KioskTranslator.getTranslatedKioskName(ks, this))
.setIcon(KioskTranslator.getKioskIcon(ks, this));
kioskId++;
}
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_tabs_group, ITEM_ID_SUBSCRIPTIONS, ORDER, R.string.tab_subscriptions)
.setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_channel));
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_tabs_group, ITEM_ID_FEED, ORDER, R.string.fragment_feed_title)
.setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_rss));
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_tabs_group, ITEM_ID_BOOKMARKS, ORDER, R.string.tab_bookmarks)
.setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_bookmark));
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_tabs_group, ITEM_ID_DOWNLOADS, ORDER, R.string.downloads)
.setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_file_download));
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_tabs_group, ITEM_ID_HISTORY, ORDER, R.string.action_history)
.setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_history));
//Settings and About
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_options_about_group, ITEM_ID_SETTINGS, ORDER, R.string.settings)
.setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_settings));
drawerItems.getMenu()
drawerLayoutBinding.navigation.getMenu()
.add(R.id.menu_options_about_group, ITEM_ID_ABOUT, ORDER, R.string.tab_about)
.setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_info_outline));
}
@ -475,16 +473,18 @@ public class MainActivity extends AppCompatActivity {
// Close drawer on return, and don't show animation,
// so it looks like the drawer isn't open when the user returns to MainActivity
drawer.closeDrawer(GravityCompat.START, false);
mainBinding.getRoot().closeDrawer(GravityCompat.START, false);
try {
final int selectedServiceId = ServiceHelper.getSelectedServiceId(this);
final String selectedServiceName = NewPipe.getService(selectedServiceId)
.getServiceInfo().getName();
headerServiceView.setText(selectedServiceName);
headerServiceIcon.setImageResource(ServiceHelper.getIcon(selectedServiceId));
drawerHeaderBinding.drawerHeaderServiceView.setText(selectedServiceName);
drawerHeaderBinding.drawerHeaderServiceIcon.setImageResource(ServiceHelper
.getIcon(selectedServiceId));
headerServiceView.post(() -> headerServiceView.setSelected(true));
toggleServiceButton.setContentDescription(
drawerHeaderBinding.drawerHeaderServiceView.post(() -> drawerHeaderBinding
.drawerHeaderServiceView.setSelected(true));
drawerHeaderBinding.drawerHeaderActionButton.setContentDescription(
getString(R.string.drawer_header_description) + selectedServiceName);
} catch (final Exception e) {
ErrorActivity.reportUiError(this, e);
@ -497,10 +497,7 @@ public class MainActivity extends AppCompatActivity {
Log.d(TAG, "Theme has changed, recreating activity...");
}
sharedPreferences.edit().putBoolean(Constants.KEY_THEME_CHANGE, false).apply();
// https://stackoverflow.com/questions/10844112/
// Briefly, let the activity resume
// properly posting the recreate call to end of the message queue
new Handler(Looper.getMainLooper()).post(MainActivity.this::recreate);
ActivityCompat.recreate(this);
}
if (sharedPreferences.getBoolean(Constants.KEY_MAIN_PAGE_CHANGE, false)) {
@ -513,7 +510,8 @@ public class MainActivity extends AppCompatActivity {
final boolean isHistoryEnabled = sharedPreferences.getBoolean(
getString(R.string.enable_watch_history_key), true);
drawerItems.getMenu().findItem(ITEM_ID_HISTORY).setVisible(isHistoryEnabled);
drawerLayoutBinding.navigation.getMenu().findItem(ITEM_ID_HISTORY)
.setVisible(isHistoryEnabled);
}
@Override
@ -557,9 +555,8 @@ public class MainActivity extends AppCompatActivity {
}
if (DeviceUtils.isTv(this)) {
final View drawerPanel = findViewById(R.id.navigation);
if (drawer.isDrawerOpen(drawerPanel)) {
drawer.closeDrawers();
if (mainBinding.getRoot().isDrawerOpen(drawerLayoutBinding.navigation)) {
mainBinding.getRoot().closeDrawers();
return;
}
}
@ -585,9 +582,7 @@ public class MainActivity extends AppCompatActivity {
// delegate the back press to it
if (fragmentPlayer instanceof BackPressable) {
if (!((BackPressable) fragmentPlayer).onBackPressed()) {
final FrameLayout bottomSheetLayout =
findViewById(R.id.fragment_player_holder);
BottomSheetBehavior.from(bottomSheetLayout)
BottomSheetBehavior.from(mainBinding.fragmentPlayerHolder)
.setState(BottomSheetBehavior.STATE_COLLAPSED);
}
return;
@ -670,8 +665,7 @@ public class MainActivity extends AppCompatActivity {
final Fragment fragment
= getSupportFragmentManager().findFragmentById(R.id.fragment_holder);
if (!(fragment instanceof SearchFragment)) {
findViewById(R.id.toolbar).findViewById(R.id.toolbar_search_container)
.setVisibility(View.GONE);
toolbarLayoutBinding.toolbarSearchContainer.getRoot().setVisibility(View.GONE);
}
final ActionBar actionBar = getSupportActionBar();
@ -732,21 +726,20 @@ public class MainActivity extends AppCompatActivity {
return;
}
final Toolbar toolbar = findViewById(R.id.toolbar);
final Fragment fragment = getSupportFragmentManager()
.findFragmentById(R.id.fragment_holder);
if (fragment instanceof MainFragment) {
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
if (toggle != null) {
toggle.syncState();
toolbar.setNavigationOnClickListener(v -> drawer.openDrawer(GravityCompat.START));
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNDEFINED);
toolbarLayoutBinding.toolbar.setNavigationOnClickListener(v -> mainBinding.getRoot()
.openDrawer(GravityCompat.START));
mainBinding.getRoot().setDrawerLockMode(DrawerLayout.LOCK_MODE_UNDEFINED);
}
} else {
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
mainBinding.getRoot().setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(v -> onHomeButtonPressed());
toolbarLayoutBinding.toolbar.setNavigationOnClickListener(v -> onHomeButtonPressed());
}
}
@ -854,9 +847,8 @@ public class MainActivity extends AppCompatActivity {
}
private boolean bottomSheetHiddenOrCollapsed() {
final FrameLayout bottomSheetLayout = findViewById(R.id.fragment_player_holder);
final BottomSheetBehavior<FrameLayout> bottomSheetBehavior =
BottomSheetBehavior.from(bottomSheetLayout);
BottomSheetBehavior.from(mainBinding.fragmentPlayerHolder);
final int sheetState = bottomSheetBehavior.getState();
return sheetState == BottomSheetBehavior.STATE_HIDDEN

View file

@ -8,20 +8,18 @@ import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.CookieManager;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.NavUtils;
import androidx.preference.PreferenceManager;
import androidx.webkit.WebViewClientCompat;
import org.schabi.newpipe.databinding.ActivityRecaptchaBinding;
import org.schabi.newpipe.util.ThemeHelper;
import java.io.UnsupportedEncodingException;
@ -53,46 +51,37 @@ public class ReCaptchaActivity extends AppCompatActivity {
public static final String YT_URL = "https://www.youtube.com";
public static final String RECAPTCHA_COOKIES_KEY = "recaptcha_cookies";
private WebView webView;
public static String sanitizeRecaptchaUrl(@Nullable final String url) {
if (url == null || url.trim().isEmpty()) {
return YT_URL; // YouTube is the most likely service to have thrown a recaptcha
} else {
// remove "pbj=1" parameter from YouYube urls, as it makes the page JSON and not HTML
return url.replace("&pbj=1", "").replace("pbj=1&", "").replace("?pbj=1", "");
}
}
private ActivityRecaptchaBinding recaptchaBinding;
private String foundCookies = "";
@Override
protected void onCreate(final Bundle savedInstanceState) {
ThemeHelper.setTheme(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recaptcha);
final Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
String url = getIntent().getStringExtra(RECAPTCHA_URL_EXTRA);
if (url == null || url.isEmpty()) {
url = YT_URL;
}
recaptchaBinding = ActivityRecaptchaBinding.inflate(getLayoutInflater());
setContentView(recaptchaBinding.getRoot());
setSupportActionBar(recaptchaBinding.toolbar);
final String url = sanitizeRecaptchaUrl(getIntent().getStringExtra(RECAPTCHA_URL_EXTRA));
// set return to Cancel by default
setResult(RESULT_CANCELED);
webView = findViewById(R.id.reCaptchaWebView);
// enable Javascript
final WebSettings webSettings = webView.getSettings();
final WebSettings webSettings = recaptchaBinding.reCaptchaWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setUserAgentString(DownloaderImpl.USER_AGENT);
webView.setWebViewClient(new WebViewClient() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean shouldOverrideUrlLoading(final WebView view,
final WebResourceRequest request) {
final String url = request.getUrl().toString();
if (MainActivity.DEBUG) {
Log.d(TAG, "shouldOverrideUrlLoading: request.url=" + url);
}
handleCookiesFromUrl(url);
return false;
}
recaptchaBinding.reCaptchaWebView.setWebViewClient(new WebViewClientCompat() {
@Override
public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
if (MainActivity.DEBUG) {
@ -111,17 +100,16 @@ public class ReCaptchaActivity extends AppCompatActivity {
});
// cleaning cache, history and cookies from webView
webView.clearCache(true);
webView.clearHistory();
final android.webkit.CookieManager cookieManager = CookieManager.getInstance();
recaptchaBinding.reCaptchaWebView.clearCache(true);
recaptchaBinding.reCaptchaWebView.clearHistory();
final CookieManager cookieManager = CookieManager.getInstance();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.removeAllCookies(aBoolean -> {
});
cookieManager.removeAllCookies(value -> { });
} else {
cookieManager.removeAllCookie();
}
webView.loadUrl(url);
recaptchaBinding.reCaptchaWebView.loadUrl(url);
}
@Override
@ -145,18 +133,16 @@ public class ReCaptchaActivity extends AppCompatActivity {
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
final int id = item.getItemId();
switch (id) {
case R.id.menu_item_done:
saveCookiesAndFinish();
return true;
default:
return false;
if (item.getItemId() == R.id.menu_item_done) {
saveCookiesAndFinish();
return true;
}
return false;
}
private void saveCookiesAndFinish() {
handleCookiesFromUrl(webView.getUrl()); // try to get cookies of unclosed page
// try to get cookies of unclosed page
handleCookiesFromUrl(recaptchaBinding.reCaptchaWebView.getUrl());
if (MainActivity.DEBUG) {
Log.d(TAG, "saveCookiesAndFinish: foundCookies=" + foundCookies);
}

View file

@ -14,7 +14,6 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
@ -26,10 +25,13 @@ import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.core.app.NotificationCompat;
import androidx.core.app.ServiceCompat;
import androidx.core.widget.TextViewCompat;
import androidx.fragment.app.FragmentManager;
import androidx.preference.PreferenceManager;
import org.schabi.newpipe.databinding.ListRadioIconItemBinding;
import org.schabi.newpipe.databinding.SingleChoiceDialogViewBinding;
import org.schabi.newpipe.download.DownloadDialog;
import org.schabi.newpipe.extractor.Info;
import org.schabi.newpipe.extractor.NewPipe;
@ -267,9 +269,8 @@ public class RouterActivity extends AppCompatActivity {
final Context themeWrapperContext = getThemeWrapperContext();
final LayoutInflater inflater = LayoutInflater.from(themeWrapperContext);
final LinearLayout rootLayout = (LinearLayout) inflater.inflate(
R.layout.single_choice_dialog_view, null, false);
final RadioGroup radioGroup = rootLayout.findViewById(android.R.id.list);
final RadioGroup radioGroup = SingleChoiceDialogViewBinding.inflate(getLayoutInflater())
.list;
final DialogInterface.OnClickListener dialogButtonsClickListener = (dialog, which) -> {
final int indexOfChild = radioGroup.indexOfChild(
@ -322,8 +323,7 @@ public class RouterActivity extends AppCompatActivity {
int id = 12345;
for (final AdapterChoiceItem item : choices) {
final RadioButton radioButton
= (RadioButton) inflater.inflate(R.layout.list_radio_icon_item, null);
final RadioButton radioButton = ListRadioIconItemBinding.inflate(inflater).getRoot();
radioButton.setText(item.description);
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(radioButton,
AppCompatResources.getDrawable(getApplicationContext(), item.icon),
@ -696,7 +696,7 @@ public class RouterActivity extends AppCompatActivity {
@Override
public void onDestroy() {
super.onDestroy();
stopForeground(true);
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE);
if (fetcher != null) {
fetcher.dispose();
}

View file

@ -6,22 +6,19 @@ import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import org.schabi.newpipe.BuildConfig;
import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.ActivityAboutBinding;
import org.schabi.newpipe.databinding.FragmentAboutBinding;
import org.schabi.newpipe.util.ThemeHelper;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
@ -68,40 +65,27 @@ public class AboutActivity extends AppCompatActivity {
private static final int POS_ABOUT = 0;
private static final int POS_LICENSE = 1;
private static final int TOTAL_COUNT = 2;
/**
* The {@link RecyclerView.Adapter} that will provide
* fragments for each of the sections. We use a
* {@link FragmentStateAdapter} derivative, which will keep every
* loaded fragment in memory.
*/
private SectionsPagerAdapter mSectionsPagerAdapter;
/**
* The {@link ViewPager2} that will host the section contents.
*/
private ViewPager2 mViewPager;
@Override
protected void onCreate(final Bundle savedInstanceState) {
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this);
this.setTitle(getString(R.string.title_activity_about));
setTitle(getString(R.string.title_activity_about));
setContentView(R.layout.activity_about);
final ActivityAboutBinding aboutBinding = ActivityAboutBinding.inflate(getLayoutInflater());
setContentView(aboutBinding.getRoot());
final Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
setSupportActionBar(aboutBinding.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(this);
final SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(this);
// Set up the ViewPager with the sections adapter.
mViewPager = findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
aboutBinding.container.setAdapter(mSectionsPagerAdapter);
final TabLayout tabLayout = findViewById(R.id.tabs);
new TabLayoutMediator(tabLayout, mViewPager, (tab, position) -> {
new TabLayoutMediator(aboutBinding.tabs, aboutBinding.container, (tab, position) -> {
switch (position) {
default:
case POS_ABOUT:
@ -143,33 +127,28 @@ public class AboutActivity extends AppCompatActivity {
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container,
final Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.fragment_about, container, false);
final Context context = this.getContext();
final FragmentAboutBinding aboutBinding =
FragmentAboutBinding.inflate(inflater, container, false);
final Context context = getContext();
final TextView version = rootView.findViewById(R.id.app_version);
version.setText(BuildConfig.VERSION_NAME);
aboutBinding.appVersion.setText(BuildConfig.VERSION_NAME);
final View githubLink = rootView.findViewById(R.id.github_link);
githubLink.setOnClickListener(nv ->
aboutBinding.githubLink.setOnClickListener(nv ->
openUrlInBrowser(context, context.getString(R.string.github_url)));
final View donationLink = rootView.findViewById(R.id.donation_link);
donationLink.setOnClickListener(v ->
aboutBinding.donationLink.setOnClickListener(v ->
openUrlInBrowser(context, context.getString(R.string.donation_url)));
final View websiteLink = rootView.findViewById(R.id.website_link);
websiteLink.setOnClickListener(nv ->
aboutBinding.websiteLink.setOnClickListener(nv ->
openUrlInBrowser(context, context.getString(R.string.website_url)));
final View privacyPolicyLink = rootView.findViewById(R.id.privacy_policy_link);
privacyPolicyLink.setOnClickListener(v ->
aboutBinding.privacyPolicyLink.setOnClickListener(v ->
openUrlInBrowser(context, context.getString(R.string.privacy_policy_url)));
return rootView;
return aboutBinding.getRoot();
}
}
/**

View file

@ -9,7 +9,7 @@ import org.schabi.newpipe.database.stream.model.StreamStateEntity
import org.schabi.newpipe.extractor.stream.StreamInfoItem
import kotlin.jvm.Throws
class PlaylistStreamEntry(
data class PlaylistStreamEntry(
@Embedded
val streamEntity: StreamEntity,

View file

@ -9,10 +9,10 @@ import android.view.ViewTreeObserver;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.FragmentTransaction;
import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.ActivityDownloaderBinding;
import org.schabi.newpipe.util.DeviceUtils;
import org.schabi.newpipe.util.ThemeHelper;
import org.schabi.newpipe.views.FocusOverlayView;
@ -35,11 +35,14 @@ public class DownloadActivity extends AppCompatActivity {
assureCorrectAppLanguage(this);
ThemeHelper.setTheme(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_downloader);
final Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
super.onCreate(savedInstanceState);
final ActivityDownloaderBinding downloaderBinding =
ActivityDownloaderBinding.inflate(getLayoutInflater());
setContentView(downloaderBinding.getRoot());
setSupportActionBar(downloaderBinding.toolbarLayout.toolbar);
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {

View file

@ -3,7 +3,6 @@ package org.schabi.newpipe.fragments;
import android.content.Context;
import android.content.res.ColorStateList;
import android.os.Bundle;
import androidx.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@ -19,6 +18,7 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
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;

View file

@ -16,7 +16,6 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import android.text.TextUtils;
import android.text.util.Linkify;
import android.util.DisplayMetrics;
import android.util.Log;
@ -122,12 +121,14 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import static android.text.TextUtils.isEmpty;
import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.COMMENTS;
import static org.schabi.newpipe.extractor.stream.StreamExtractor.NO_AGE_LIMIT;
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.AnimationUtils.animateView;
import static org.schabi.newpipe.util.ExtractorHelper.showMetaInfoInTextView;
public final class VideoDetailFragment
extends BaseStateFragment<StreamInfo>
@ -218,6 +219,9 @@ public final class VideoDetailFragment
private TextView detailDurationView;
private TextView detailPositionView;
private View detailMetaInfoSeparator;
private TextView detailMetaInfoTextView;
private LinearLayout videoDescriptionRootLayout;
private TextView videoUploadDateView;
private TextView videoDescriptionView;
@ -508,8 +512,8 @@ public final class VideoDetailFragment
}
break;
case R.id.detail_uploader_root_layout:
if (TextUtils.isEmpty(currentInfo.getSubChannelUrl())) {
if (!TextUtils.isEmpty(currentInfo.getUploaderUrl())) {
if (isEmpty(currentInfo.getSubChannelUrl())) {
if (!isEmpty(currentInfo.getUploaderUrl())) {
openChannel(currentInfo.getUploaderUrl(), currentInfo.getUploaderName());
}
@ -583,7 +587,7 @@ public final class VideoDetailFragment
}
break;
case R.id.detail_uploader_root_layout:
if (TextUtils.isEmpty(currentInfo.getSubChannelUrl())) {
if (isEmpty(currentInfo.getSubChannelUrl())) {
Log.w(TAG,
"Can't open parent channel because we got no parent channel URL");
} else {
@ -644,6 +648,9 @@ public final class VideoDetailFragment
detailDurationView = rootView.findViewById(R.id.detail_duration_view);
detailPositionView = rootView.findViewById(R.id.detail_position_view);
detailMetaInfoSeparator = rootView.findViewById(R.id.detail_meta_info_separator);
detailMetaInfoTextView = rootView.findViewById(R.id.detail_meta_info_text_view);
videoDescriptionRootLayout = rootView.findViewById(R.id.detail_description_root_layout);
videoUploadDateView = rootView.findViewById(R.id.detail_upload_date_view);
videoDescriptionView = rootView.findViewById(R.id.detail_description_view);
@ -748,7 +755,7 @@ public final class VideoDetailFragment
private void initThumbnailViews(@NonNull final StreamInfo info) {
thumbnailImageView.setImageResource(R.drawable.dummy_thumbnail_dark);
if (!TextUtils.isEmpty(info.getThumbnailUrl())) {
if (!isEmpty(info.getThumbnailUrl())) {
final String infoServiceName = NewPipe.getNameOfService(info.getServiceId());
final ImageLoadingListener onFailListener = new SimpleImageLoadingListener() {
@Override
@ -763,12 +770,12 @@ public final class VideoDetailFragment
ImageDisplayConstants.DISPLAY_THUMBNAIL_OPTIONS, onFailListener);
}
if (!TextUtils.isEmpty(info.getSubChannelAvatarUrl())) {
if (!isEmpty(info.getSubChannelAvatarUrl())) {
IMAGE_LOADER.displayImage(info.getSubChannelAvatarUrl(), subChannelThumb,
ImageDisplayConstants.DISPLAY_AVATAR_OPTIONS);
}
if (!TextUtils.isEmpty(info.getUploaderAvatarUrl())) {
if (!isEmpty(info.getUploaderAvatarUrl())) {
IMAGE_LOADER.displayImage(info.getUploaderAvatarUrl(), uploaderThumb,
ImageDisplayConstants.DISPLAY_AVATAR_OPTIONS);
}
@ -1217,7 +1224,7 @@ public final class VideoDetailFragment
}
private void prepareDescription(final Description description) {
if (description == null || TextUtils.isEmpty(description.getContent())
if (description == null || isEmpty(description.getContent())
|| description == Description.emptyDescription) {
return;
}
@ -1462,9 +1469,9 @@ public final class VideoDetailFragment
animateView(thumbnailPlayButton, true, 200);
videoTitleTextView.setText(title);
if (!TextUtils.isEmpty(info.getSubChannelName())) {
if (!isEmpty(info.getSubChannelName())) {
displayBothUploaderAndSubChannel(info);
} else if (!TextUtils.isEmpty(info.getUploaderName())) {
} else if (!isEmpty(info.getUploaderName())) {
displayUploaderAsSubChannel(info);
} else {
uploaderTextView.setVisibility(View.GONE);
@ -1559,6 +1566,8 @@ public final class VideoDetailFragment
prepareDescription(info.getDescription());
updateProgressInfo(info);
initThumbnailViews(info);
showMetaInfoInTextView(info.getMetaInfo(), detailMetaInfoTextView, detailMetaInfoSeparator);
if (player == null || player.isPlayerStopped()) {
updateOverlayData(info.getName(), info.getUploaderName(), info.getThumbnailUrl());
@ -1610,7 +1619,7 @@ public final class VideoDetailFragment
subChannelThumb.setVisibility(View.VISIBLE);
if (!TextUtils.isEmpty(info.getUploaderName())) {
if (!isEmpty(info.getUploaderName())) {
uploaderTextView.setText(
String.format(getString(R.string.video_detail_by), info.getUploaderName()));
uploaderTextView.setVisibility(View.VISIBLE);
@ -2305,10 +2314,10 @@ public final class VideoDetailFragment
private void updateOverlayData(@Nullable final String overlayTitle,
@Nullable final String uploader,
@Nullable final String thumbnailUrl) {
overlayTitleTextView.setText(TextUtils.isEmpty(overlayTitle) ? "" : overlayTitle);
overlayChannelTextView.setText(TextUtils.isEmpty(uploader) ? "" : uploader);
overlayTitleTextView.setText(isEmpty(title) ? "" : title);
overlayChannelTextView.setText(isEmpty(uploader) ? "" : uploader);
overlayThumbnailImageView.setImageResource(R.drawable.dummy_thumbnail_dark);
if (!TextUtils.isEmpty(thumbnailUrl)) {
if (!isEmpty(thumbnailUrl)) {
IMAGE_LOADER.displayImage(thumbnailUrl, overlayThumbnailImageView,
ImageDisplayConstants.DISPLAY_THUMBNAIL_OPTIONS, null);
}

View file

@ -11,12 +11,12 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.content.res.AppCompatResources;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
@ -26,8 +26,10 @@ import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.ListExtractor;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.ServiceList;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper;
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
import org.schabi.newpipe.extractor.stream.StreamType;
import org.schabi.newpipe.fragments.list.BaseListInfoFragment;
@ -44,13 +46,13 @@ import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.ShareUtils;
import org.schabi.newpipe.util.StreamDialogEntry;
import org.schabi.newpipe.util.ThemeHelper;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import de.hdodenhof.circleimageview.CircleImageView;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Flowable;
import io.reactivex.rxjava3.core.Single;
@ -58,6 +60,7 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable;
import static org.schabi.newpipe.util.AnimationUtils.animateView;
import static org.schabi.newpipe.util.ThemeHelper.resolveResourceIdFromAttr;
public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
private CompositeDisposable disposables;
@ -74,7 +77,7 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
private TextView headerTitleView;
private View headerUploaderLayout;
private TextView headerUploaderName;
private ImageView headerUploaderAvatar;
private CircleImageView headerUploaderAvatar;
private TextView headerStreamCount;
private View playlistCtrl;
@ -301,8 +304,22 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
playlistCtrl.setVisibility(View.VISIBLE);
IMAGE_LOADER.displayImage(result.getUploaderAvatarUrl(), headerUploaderAvatar,
ImageDisplayConstants.DISPLAY_AVATAR_OPTIONS);
final String avatarUrl = result.getUploaderAvatarUrl();
if (result.getServiceId() == ServiceList.YouTube.getServiceId()
&& (YoutubeParsingHelper.isYoutubeMixId(result.getId())
|| YoutubeParsingHelper.isYoutubeMusicMixId(result.getId()))) {
// this is an auto-generated playlist (e.g. Youtube mix), so a radio is shown
headerUploaderAvatar.setDisableCircularTransformation(true);
headerUploaderAvatar.setBorderColor(
getResources().getColor(R.color.transparent_background_color));
headerUploaderAvatar.setImageDrawable(AppCompatResources.getDrawable(requireContext(),
resolveResourceIdFromAttr(requireContext(), R.attr.ic_radio)));
} else {
IMAGE_LOADER.displayImage(avatarUrl, headerUploaderAvatar,
ImageDisplayConstants.DISPLAY_AVATAR_OPTIONS);
}
headerStreamCount.setText(Localization
.localizeStreamCount(getContext(), result.getStreamCount()));
@ -476,7 +493,7 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
final int titleRes = playlistEntity == null
? R.string.bookmark_playlist : R.string.unbookmark_playlist;
playlistBookmarkButton.setIcon(ThemeHelper.resolveResourceIdFromAttr(activity, iconAttr));
playlistBookmarkButton.setIcon(resolveResourceIdFromAttr(activity, iconAttr));
playlistBookmarkButton.setTitle(titleRes);
}
}

View file

@ -39,6 +39,7 @@ import org.schabi.newpipe.ReCaptchaActivity;
import org.schabi.newpipe.database.history.model.SearchHistoryEntry;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.ListExtractor;
import org.schabi.newpipe.extractor.MetaInfo;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.Page;
import org.schabi.newpipe.extractor.StreamingService;
@ -79,6 +80,7 @@ import io.reactivex.rxjava3.subjects.PublishSubject;
import static androidx.recyclerview.widget.ItemTouchHelper.Callback.makeMovementFlags;
import static java.util.Arrays.asList;
import static org.schabi.newpipe.util.AnimationUtils.animateView;
import static org.schabi.newpipe.util.ExtractorHelper.showMetaInfoInTextView;
public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.InfoItemsPage<?>>
implements BackPressable {
@ -129,6 +131,9 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
@State
boolean isCorrectedSearch;
@State
MetaInfo[] metaInfo;
@State
boolean wasSearchFocused = false;
@ -153,6 +158,8 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
private View searchClear;
private TextView correctSuggestion;
private TextView metaInfoTextView;
private View metaInfoSeparator;
private View suggestionsPanel;
private boolean suggestionsPanelVisible = false;
@ -269,6 +276,9 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
handleSearchSuggestion();
showMetaInfoInTextView(metaInfo == null ? null : Arrays.asList(metaInfo),
metaInfoTextView, metaInfoSeparator);
if (suggestionDisposable == null || suggestionDisposable.isDisposed()) {
initSuggestionObserver();
}
@ -353,6 +363,8 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
searchClear = searchToolbarContainer.findViewById(R.id.toolbar_search_clear);
correctSuggestion = rootView.findViewById(R.id.correct_suggestion);
metaInfoTextView = rootView.findViewById(R.id.search_meta_info_text_view);
metaInfoSeparator = rootView.findViewById(R.id.search_meta_info_separator);
}
/*//////////////////////////////////////////////////////////////////////////
@ -973,8 +985,14 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
searchSuggestion = result.getSearchSuggestion();
isCorrectedSearch = result.isCorrectedSearch();
// List<MetaInfo> cannot be bundled without creating some containers
metaInfo = new MetaInfo[result.getMetaInfo().size()];
metaInfo = result.getMetaInfo().toArray(metaInfo);
handleSearchSuggestion();
showMetaInfoInTextView(result.getMetaInfo(), metaInfoTextView, metaInfoSeparator);
lastSearchedString = searchString;
nextPage = result.getNextPage();

View file

@ -30,6 +30,7 @@ import android.os.IBinder
import android.util.Log
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.app.ServiceCompat
import androidx.preference.PreferenceManager
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Flowable
@ -147,7 +148,7 @@ class FeedLoadService : Service() {
private fun stopService() {
disposeAll()
stopForeground(true)
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE)
notificationManager.cancel(NOTIFICATION_ID)
stopSelf()
}

View file

@ -31,6 +31,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.core.app.ServiceCompat;
import org.reactivestreams.Publisher;
import org.schabi.newpipe.R;
@ -162,7 +163,7 @@ public abstract class BaseImportExportService extends Service {
protected void postErrorResult(final String title, final String text) {
disposeAll();
stopForeground(true);
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE);
stopSelf();
if (title == null) {

View file

@ -15,6 +15,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.core.app.ServiceCompat;
import androidx.core.content.ContextCompat;
import org.schabi.newpipe.MainActivity;
@ -188,7 +189,7 @@ public final class NotificationUtil {
}
void cancelNotificationAndStopForeground(final Service service) {
service.stopForeground(true);
ServiceCompat.stopForeground(service, ServiceCompat.STOP_FOREGROUND_REMOVE);
if (notificationManager != null) {
notificationManager.cancel(NOTIFICATION_ID);

View file

@ -1,6 +1,7 @@
package org.schabi.newpipe.player;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
@ -11,15 +12,11 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.PopupMenu;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@ -28,6 +25,7 @@ import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player;
import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.ActivityPlayerQueueControlBinding;
import org.schabi.newpipe.extractor.stream.StreamInfo;
import org.schabi.newpipe.fragments.OnScrollBelowItemsListener;
import org.schabi.newpipe.local.dialog.PlaylistAppendDialog;
@ -69,30 +67,10 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
// Views
////////////////////////////////////////////////////////////////////////////
private View rootView;
private ActivityPlayerQueueControlBinding queueControlBinding;
private RecyclerView itemsList;
private ItemTouchHelper itemTouchHelper;
private LinearLayout metadata;
private TextView metadataTitle;
private TextView metadataArtist;
private SeekBar progressSeekBar;
private TextView progressCurrentTime;
private TextView progressEndTime;
private TextView progressLiveSync;
private TextView seekDisplay;
private ImageButton repeatButton;
private ImageButton backwardButton;
private ImageButton fastRewindButton;
private ImageButton playPauseButton;
private ImageButton fastForwardButton;
private ImageButton forwardButton;
private ImageButton shuffleButton;
private ProgressBar progressBar;
private Menu menu;
////////////////////////////////////////////////////////////////////////////
@ -122,11 +100,11 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this);
setContentView(R.layout.activity_player_queue_control);
rootView = findViewById(R.id.main_content);
final Toolbar toolbar = rootView.findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
queueControlBinding = ActivityPlayerQueueControlBinding.inflate(getLayoutInflater());
setContentView(queueControlBinding.getRoot());
setSupportActionBar(queueControlBinding.toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(getSupportActionTitle());
@ -140,7 +118,7 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
protected void onResume() {
super.onResume();
if (redraw) {
recreate();
ActivityCompat.recreate(this);
redraw = false;
}
}
@ -229,14 +207,11 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
if (player != null && player.getPlayQueueAdapter() != null) {
player.getPlayQueueAdapter().unsetSelectedListener();
}
if (itemsList != null) {
itemsList.setAdapter(null);
}
queueControlBinding.playQueue.setAdapter(null);
if (itemTouchHelper != null) {
itemTouchHelper.attachToRecyclerView(null);
}
itemsList = null;
itemTouchHelper = null;
player = null;
}
@ -283,58 +258,38 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
}
private void buildQueue() {
itemsList = findViewById(R.id.play_queue);
itemsList.setLayoutManager(new LinearLayoutManager(this));
itemsList.setAdapter(player.getPlayQueueAdapter());
itemsList.setClickable(true);
itemsList.setLongClickable(true);
itemsList.clearOnScrollListeners();
itemsList.addOnScrollListener(getQueueScrollListener());
queueControlBinding.playQueue.setLayoutManager(new LinearLayoutManager(this));
queueControlBinding.playQueue.setAdapter(player.getPlayQueueAdapter());
queueControlBinding.playQueue.setClickable(true);
queueControlBinding.playQueue.setLongClickable(true);
queueControlBinding.playQueue.clearOnScrollListeners();
queueControlBinding.playQueue.addOnScrollListener(getQueueScrollListener());
itemTouchHelper = new ItemTouchHelper(getItemTouchCallback());
itemTouchHelper.attachToRecyclerView(itemsList);
itemTouchHelper.attachToRecyclerView(queueControlBinding.playQueue);
player.getPlayQueueAdapter().setSelectedListener(getOnSelectedListener());
}
private void buildMetadata() {
metadata = rootView.findViewById(R.id.metadata);
metadataTitle = rootView.findViewById(R.id.song_name);
metadataArtist = rootView.findViewById(R.id.artist_name);
metadata.setOnClickListener(this);
metadataTitle.setSelected(true);
metadataArtist.setSelected(true);
queueControlBinding.metadata.setOnClickListener(this);
queueControlBinding.songName.setSelected(true);
queueControlBinding.artistName.setSelected(true);
}
private void buildSeekBar() {
progressCurrentTime = rootView.findViewById(R.id.current_time);
progressSeekBar = rootView.findViewById(R.id.seek_bar);
progressEndTime = rootView.findViewById(R.id.end_time);
progressLiveSync = rootView.findViewById(R.id.live_sync);
seekDisplay = rootView.findViewById(R.id.seek_display);
progressSeekBar.setOnSeekBarChangeListener(this);
progressLiveSync.setOnClickListener(this);
queueControlBinding.seekBar.setOnSeekBarChangeListener(this);
queueControlBinding.liveSync.setOnClickListener(this);
}
private void buildControls() {
repeatButton = rootView.findViewById(R.id.control_repeat);
backwardButton = rootView.findViewById(R.id.control_backward);
fastRewindButton = rootView.findViewById(R.id.control_fast_rewind);
playPauseButton = rootView.findViewById(R.id.control_play_pause);
fastForwardButton = rootView.findViewById(R.id.control_fast_forward);
forwardButton = rootView.findViewById(R.id.control_forward);
shuffleButton = rootView.findViewById(R.id.control_shuffle);
progressBar = rootView.findViewById(R.id.control_progress_bar);
repeatButton.setOnClickListener(this);
backwardButton.setOnClickListener(this);
fastRewindButton.setOnClickListener(this);
playPauseButton.setOnClickListener(this);
fastForwardButton.setOnClickListener(this);
forwardButton.setOnClickListener(this);
shuffleButton.setOnClickListener(this);
queueControlBinding.controlRepeat.setOnClickListener(this);
queueControlBinding.controlBackward.setOnClickListener(this);
queueControlBinding.controlFastRewind.setOnClickListener(this);
queueControlBinding.controlPlayPause.setOnClickListener(this);
queueControlBinding.controlFastForward.setOnClickListener(this);
queueControlBinding.controlForward.setOnClickListener(this);
queueControlBinding.controlShuffle.setOnClickListener(this);
}
private void buildItemPopupMenu(final PlayQueueItem item, final View view) {
@ -390,8 +345,8 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
if (player != null && player.getPlayQueue() != null
&& !player.getPlayQueue().isComplete()) {
player.getPlayQueue().fetch();
} else if (itemsList != null) {
itemsList.clearOnScrollListeners();
} else {
queueControlBinding.playQueue.clearOnScrollListeners();
}
}
};
@ -452,8 +407,9 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
final int currentPlayingIndex = player.getPlayQueue().getIndex();
final int currentVisibleIndex;
if (itemsList.getLayoutManager() instanceof LinearLayoutManager) {
final LinearLayoutManager layout = ((LinearLayoutManager) itemsList.getLayoutManager());
if (queueControlBinding.playQueue.getLayoutManager() instanceof LinearLayoutManager) {
final LinearLayoutManager layout =
(LinearLayoutManager) queueControlBinding.playQueue.getLayoutManager();
currentVisibleIndex = layout.findFirstVisibleItemPosition();
} else {
currentVisibleIndex = 0;
@ -461,9 +417,9 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
final int distance = Math.abs(currentPlayingIndex - currentVisibleIndex);
if (distance < SMOOTH_SCROLL_MAXIMUM_DISTANCE) {
itemsList.smoothScrollToPosition(currentPlayingIndex);
queueControlBinding.playQueue.smoothScrollToPosition(currentPlayingIndex);
} else {
itemsList.scrollToPosition(currentPlayingIndex);
queueControlBinding.playQueue.scrollToPosition(currentPlayingIndex);
}
}
@ -477,23 +433,23 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
return;
}
if (view.getId() == repeatButton.getId()) {
if (view.getId() == queueControlBinding.controlRepeat.getId()) {
player.onRepeatClicked();
} else if (view.getId() == backwardButton.getId()) {
} else if (view.getId() == queueControlBinding.controlBackward.getId()) {
player.onPlayPrevious();
} else if (view.getId() == fastRewindButton.getId()) {
} else if (view.getId() == queueControlBinding.controlFastRewind.getId()) {
player.onFastRewind();
} else if (view.getId() == playPauseButton.getId()) {
} else if (view.getId() == queueControlBinding.controlPlayPause.getId()) {
player.onPlayPause();
} else if (view.getId() == fastForwardButton.getId()) {
} else if (view.getId() == queueControlBinding.controlFastForward.getId()) {
player.onFastForward();
} else if (view.getId() == forwardButton.getId()) {
} else if (view.getId() == queueControlBinding.controlForward.getId()) {
player.onPlayNext();
} else if (view.getId() == shuffleButton.getId()) {
} else if (view.getId() == queueControlBinding.controlShuffle.getId()) {
player.onShuffleClicked();
} else if (view.getId() == metadata.getId()) {
} else if (view.getId() == queueControlBinding.metadata.getId()) {
scrollToSelected();
} else if (view.getId() == progressLiveSync.getId()) {
} else if (view.getId() == queueControlBinding.liveSync.getId()) {
player.seekToDefault();
}
}
@ -527,15 +483,15 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
final boolean fromUser) {
if (fromUser) {
final String seekTime = Localization.getDurationString(progress / 1000);
progressCurrentTime.setText(seekTime);
seekDisplay.setText(seekTime);
queueControlBinding.currentTime.setText(seekTime);
queueControlBinding.seekDisplay.setText(seekTime);
}
}
@Override
public void onStartTrackingTouch(final SeekBar seekBar) {
seeking = true;
seekDisplay.setVisibility(View.VISIBLE);
queueControlBinding.seekDisplay.setVisibility(View.VISIBLE);
}
@Override
@ -543,7 +499,7 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
if (player != null) {
player.seekTo(seekBar.getProgress());
}
seekDisplay.setVisibility(View.GONE);
queueControlBinding.seekDisplay.setVisibility(View.GONE);
seeking = false;
}
@ -601,45 +557,46 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
public void onProgressUpdate(final int currentProgress, final int duration,
final int bufferPercent) {
// Set buffer progress
progressSeekBar.setSecondaryProgress((int) (progressSeekBar.getMax()
queueControlBinding.seekBar.setSecondaryProgress((int) (queueControlBinding.seekBar.getMax()
* ((float) bufferPercent / 100)));
// Set Duration
progressSeekBar.setMax(duration);
progressEndTime.setText(Localization.getDurationString(duration / 1000));
queueControlBinding.seekBar.setMax(duration);
queueControlBinding.endTime.setText(Localization.getDurationString(duration / 1000));
// Set current time if not seeking
if (!seeking) {
progressSeekBar.setProgress(currentProgress);
progressCurrentTime.setText(Localization.getDurationString(currentProgress / 1000));
queueControlBinding.seekBar.setProgress(currentProgress);
queueControlBinding.currentTime.setText(Localization
.getDurationString(currentProgress / 1000));
}
if (player != null) {
progressLiveSync.setClickable(!player.isLiveEdge());
queueControlBinding.liveSync.setClickable(!player.isLiveEdge());
}
// this will make sure progressCurrentTime has the same width as progressEndTime
final ViewGroup.LayoutParams endTimeParams = progressEndTime.getLayoutParams();
final ViewGroup.LayoutParams currentTimeParams = progressCurrentTime.getLayoutParams();
currentTimeParams.width = progressEndTime.getWidth();
progressCurrentTime.setLayoutParams(currentTimeParams);
final ViewGroup.LayoutParams currentTimeParams =
queueControlBinding.currentTime.getLayoutParams();
currentTimeParams.width = queueControlBinding.endTime.getWidth();
queueControlBinding.currentTime.setLayoutParams(currentTimeParams);
}
@Override
public void onMetadataUpdate(final StreamInfo info, final PlayQueue queue) {
if (info != null) {
metadataTitle.setText(info.getName());
metadataArtist.setText(info.getUploaderName());
queueControlBinding.songName.setText(info.getName());
queueControlBinding.artistName.setText(info.getUploaderName());
progressEndTime.setVisibility(View.GONE);
progressLiveSync.setVisibility(View.GONE);
queueControlBinding.endTime.setVisibility(View.GONE);
queueControlBinding.liveSync.setVisibility(View.GONE);
switch (info.getStreamType()) {
case LIVE_STREAM:
case AUDIO_LIVE_STREAM:
progressLiveSync.setVisibility(View.VISIBLE);
queueControlBinding.liveSync.setVisibility(View.VISIBLE);
break;
default:
progressEndTime.setVisibility(View.VISIBLE);
queueControlBinding.endTime.setVisibility(View.VISIBLE);
break;
}
@ -660,13 +617,16 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
private void onStateChanged(final int state) {
switch (state) {
case BasePlayer.STATE_PAUSED:
playPauseButton.setImageResource(R.drawable.ic_play_arrow_white_24dp);
queueControlBinding.controlPlayPause
.setImageResource(R.drawable.ic_play_arrow_white_24dp);
break;
case BasePlayer.STATE_PLAYING:
playPauseButton.setImageResource(R.drawable.ic_pause_white_24dp);
queueControlBinding.controlPlayPause
.setImageResource(R.drawable.ic_pause_white_24dp);
break;
case BasePlayer.STATE_COMPLETED:
playPauseButton.setImageResource(R.drawable.ic_replay_white_24dp);
queueControlBinding.controlPlayPause
.setImageResource(R.drawable.ic_replay_white_24dp);
break;
default:
break;
@ -676,14 +636,14 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
case BasePlayer.STATE_PAUSED:
case BasePlayer.STATE_PLAYING:
case BasePlayer.STATE_COMPLETED:
playPauseButton.setClickable(true);
playPauseButton.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
queueControlBinding.controlPlayPause.setClickable(true);
queueControlBinding.controlPlayPause.setVisibility(View.VISIBLE);
queueControlBinding.controlProgressBar.setVisibility(View.GONE);
break;
default:
playPauseButton.setClickable(false);
playPauseButton.setVisibility(View.INVISIBLE);
progressBar.setVisibility(View.VISIBLE);
queueControlBinding.controlPlayPause.setClickable(false);
queueControlBinding.controlPlayPause.setVisibility(View.INVISIBLE);
queueControlBinding.controlProgressBar.setVisibility(View.VISIBLE);
break;
}
}
@ -691,18 +651,21 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
private void onPlayModeChanged(final int repeatMode, final boolean shuffled) {
switch (repeatMode) {
case Player.REPEAT_MODE_OFF:
repeatButton.setImageResource(R.drawable.exo_controls_repeat_off);
queueControlBinding.controlRepeat
.setImageResource(R.drawable.exo_controls_repeat_off);
break;
case Player.REPEAT_MODE_ONE:
repeatButton.setImageResource(R.drawable.exo_controls_repeat_one);
queueControlBinding.controlRepeat
.setImageResource(R.drawable.exo_controls_repeat_one);
break;
case Player.REPEAT_MODE_ALL:
repeatButton.setImageResource(R.drawable.exo_controls_repeat_all);
queueControlBinding.controlRepeat
.setImageResource(R.drawable.exo_controls_repeat_all);
break;
}
final int shuffleAlpha = shuffled ? 255 : 77;
shuffleButton.setImageAlpha(shuffleAlpha);
queueControlBinding.controlShuffle.setImageAlpha(shuffleAlpha);
}
private void onPlaybackParameterChanged(final PlaybackParameters parameters) {
@ -715,12 +678,13 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
}
private void onMaybePlaybackAdapterChanged() {
if (itemsList == null || player == null) {
if (player == null) {
return;
}
final PlayQueueAdapter maybeNewAdapter = player.getPlayQueueAdapter();
if (maybeNewAdapter != null && itemsList.getAdapter() != maybeNewAdapter) {
itemsList.setAdapter(maybeNewAdapter);
if (maybeNewAdapter != null
&& queueControlBinding.playQueue.getAdapter() != maybeNewAdapter) {
queueControlBinding.playQueue.setAdapter(maybeNewAdapter);
}
}
@ -734,7 +698,8 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
//2) Icon change accordingly to current App Theme
// using rootView.getContext() because getApplicationContext() didn't work
item.setIcon(ThemeHelper.resolveResourceIdFromAttr(rootView.getContext(),
final Context context = queueControlBinding.getRoot().getContext();
item.setIcon(ThemeHelper.resolveResourceIdFromAttr(context,
player.isMuted()
? R.attr.ic_volume_off
: R.attr.ic_volume_up));

View file

@ -103,6 +103,7 @@ import org.schabi.newpipe.util.ShareUtils;
import java.util.List;
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
import static org.schabi.newpipe.player.MainPlayer.ACTION_CLOSE;
import static org.schabi.newpipe.player.MainPlayer.ACTION_FAST_FORWARD;
import static org.schabi.newpipe.player.MainPlayer.ACTION_FAST_REWIND;
@ -889,10 +890,17 @@ public class VideoPlayerImpl extends VideoPlayer
private void onShareClicked() {
// share video at the current time (youtube.com/watch?v=ID&t=SECONDS)
// Timestamp doesn't make sense in a live stream so drop it
final String ts = isLive() ? "" : ("&t=" + (getPlaybackSeekBar().getProgress() / 1000));
final int ts = getPlaybackSeekBar().getProgress() / 1000;
final MediaSourceTag metadata = getCurrentMetadata();
String videoUrl = getVideoUrl();
if (!isLive() && ts >= 0 && metadata != null
&& metadata.getMetadata().getServiceId() == YouTube.getServiceId()) {
videoUrl += ("&t=" + ts);
}
ShareUtils.shareUrl(service,
getVideoTitle(),
getVideoUrl() + ts);
videoUrl);
}
private void onPlayWithKodiClicked() {

View file

@ -14,15 +14,11 @@ import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.NavUtils;
import com.google.android.material.snackbar.Snackbar;
@ -34,6 +30,7 @@ import org.schabi.newpipe.ActivityCommunicator;
import org.schabi.newpipe.BuildConfig;
import org.schabi.newpipe.MainActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.ActivityErrorBinding;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.ShareUtils;
import org.schabi.newpipe.util.ThemeHelper;
@ -87,7 +84,8 @@ public class ErrorActivity extends AppCompatActivity {
private ErrorInfo errorInfo;
private Class returnActivity;
private String currentTimeStamp;
private EditText userCommentBox;
private ActivityErrorBinding activityErrorBinding;
public static void reportUiError(final AppCompatActivity activity, final Throwable el) {
reportError(activity, el, activity.getClass(), null, ErrorInfo.make(UserAction.UI_ERROR,
@ -181,12 +179,13 @@ public class ErrorActivity extends AppCompatActivity {
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this);
setContentView(R.layout.activity_error);
activityErrorBinding = ActivityErrorBinding.inflate(getLayoutInflater());
setContentView(activityErrorBinding.getRoot());
final Intent intent = getIntent();
final Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
setSupportActionBar(activityErrorBinding.toolbarLayout.toolbar);
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
@ -195,15 +194,6 @@ public class ErrorActivity extends AppCompatActivity {
actionBar.setDisplayShowTitleEnabled(true);
}
final Button reportEmailButton = findViewById(R.id.errorReportEmailButton);
final Button copyButton = findViewById(R.id.errorReportCopyButton);
final Button reportGithubButton = findViewById(R.id.errorReportGitHubButton);
userCommentBox = findViewById(R.id.errorCommentBox);
final TextView errorView = findViewById(R.id.errorView);
final TextView infoView = findViewById(R.id.errorInfosView);
final TextView errorMessageView = findViewById(R.id.errorMessageView);
final ActivityCommunicator ac = ActivityCommunicator.getCommunicator();
returnActivity = ac.getReturnActivity();
errorInfo = intent.getParcelableExtra(ERROR_INFO);
@ -213,28 +203,27 @@ public class ErrorActivity extends AppCompatActivity {
addGuruMeditation();
currentTimeStamp = getCurrentTimeStamp();
reportEmailButton.setOnClickListener(v ->
activityErrorBinding.errorReportEmailButton.setOnClickListener(v ->
openPrivacyPolicyDialog(this, "EMAIL"));
copyButton.setOnClickListener(v -> {
activityErrorBinding.errorReportCopyButton.setOnClickListener(v -> {
ShareUtils.copyToClipboard(this, buildMarkdown());
Toast.makeText(this, R.string.msg_copied, Toast.LENGTH_SHORT).show();
});
reportGithubButton.setOnClickListener(v ->
activityErrorBinding.errorReportGitHubButton.setOnClickListener(v ->
openPrivacyPolicyDialog(this, "GITHUB"));
// normal bugreport
buildInfo(errorInfo);
if (errorInfo.getMessage() != 0) {
errorMessageView.setText(errorInfo.getMessage());
activityErrorBinding.errorMessageView.setText(errorInfo.getMessage());
} else {
errorMessageView.setVisibility(View.GONE);
findViewById(R.id.messageWhatHappenedView).setVisibility(View.GONE);
activityErrorBinding.errorMessageView.setVisibility(View.GONE);
activityErrorBinding.messageWhatHappenedView.setVisibility(View.GONE);
}
errorView.setText(formErrorText(errorList));
activityErrorBinding.errorView.setText(formErrorText(errorList));
// print stack trace once again for debugging:
for (final String e : errorList) {
@ -339,11 +328,10 @@ public class ErrorActivity extends AppCompatActivity {
}
private void buildInfo(final ErrorInfo info) {
final TextView infoLabelView = findViewById(R.id.errorInfoLabelsView);
final TextView infoView = findViewById(R.id.errorInfosView);
String text = "";
infoLabelView.setText(getString(R.string.info_labels).replace("\\n", "\n"));
activityErrorBinding.errorInfoLabelsView.setText(getString(R.string.info_labels)
.replace("\\n", "\n"));
text += getUserActionString(info.getUserAction()) + "\n"
+ info.getRequest() + "\n"
@ -356,7 +344,7 @@ public class ErrorActivity extends AppCompatActivity {
+ BuildConfig.VERSION_NAME + "\n"
+ getOsString();
infoView.setText(text);
activityErrorBinding.errorInfosView.setText(text);
}
private String buildJson() {
@ -374,7 +362,8 @@ public class ErrorActivity extends AppCompatActivity {
.value("os", getOsString())
.value("time", currentTimeStamp)
.array("exceptions", Arrays.asList(errorList))
.value("user_comment", userCommentBox.getText().toString())
.value("user_comment", activityErrorBinding.errorCommentBox.getText()
.toString())
.end()
.done();
} catch (final Throwable e) {
@ -389,7 +378,7 @@ public class ErrorActivity extends AppCompatActivity {
try {
final StringBuilder htmlErrorReport = new StringBuilder();
final String userComment = userCommentBox.getText().toString();
final String userComment = activityErrorBinding.errorCommentBox.getText().toString();
if (!userComment.isEmpty()) {
htmlErrorReport.append(userComment).append("\n");
}
@ -473,10 +462,9 @@ public class ErrorActivity extends AppCompatActivity {
private void addGuruMeditation() {
//just an easter egg
final TextView sorryView = findViewById(R.id.errorSorryView);
String text = sorryView.getText().toString();
String text = activityErrorBinding.errorSorryView.getText().toString();
text += "\n" + getString(R.string.guru_meditation);
sorryView.setText(text);
activityErrorBinding.errorSorryView.setText(text);
}
@Override

View file

@ -8,6 +8,7 @@ import android.provider.Settings;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.preference.Preference;
import org.schabi.newpipe.R;
@ -31,7 +32,7 @@ public class AppearanceSettingsFragment extends BasePreferenceFragment {
if (!newValue.equals(startThemeKey) && getActivity() != null) {
// If it's not the current theme
getActivity().recreate();
ActivityCompat.recreate(requireActivity());
}
return false;

View file

@ -11,6 +11,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
@ -30,19 +31,15 @@ import org.schabi.newpipe.report.UserAction;
import org.schabi.newpipe.util.FilePickerActivityHelper;
import org.schabi.newpipe.util.ZipHelper;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
@ -50,6 +47,8 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
private static final int REQUEST_IMPORT_PATH = 8945;
private static final int REQUEST_EXPORT_PATH = 30945;
private ContentSettingsManager manager;
private File databasesDir;
private File newpipeDb;
private File newpipeDbJournal;
@ -120,17 +119,18 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
@Override
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
final File homeDir = ContextCompat.getDataDir(requireContext());
databasesDir = new File(homeDir, "/databases");
newpipeDb = new File(homeDir, "/databases/newpipe.db");
newpipeDbJournal = new File(homeDir, "/databases/newpipe.db-journal");
newpipeDbShm = new File(homeDir, "/databases/newpipe.db-shm");
newpipeDbWal = new File(homeDir, "/databases/newpipe.db-wal");
final String homeDir = getActivity().getApplicationInfo().dataDir;
databasesDir = new File(homeDir + "/databases");
newpipeDb = new File(homeDir + "/databases/newpipe.db");
newpipeDbJournal = new File(homeDir + "/databases/newpipe.db-journal");
newpipeDbShm = new File(homeDir + "/databases/newpipe.db-shm");
newpipeDbWal = new File(homeDir + "/databases/newpipe.db-wal");
newpipeSettings = new File(homeDir + "/databases/newpipe.settings");
newpipeSettings = new File(homeDir, "/databases/newpipe.settings");
newpipeSettings.delete();
manager = new ContentSettingsManager(homeDir);
addPreferencesFromResource(R.xml.content_settings);
final Preference importDataPreference = findPreference(getString(R.string.import_data));
@ -212,33 +212,16 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
//checkpoint before export
NewPipeDatabase.checkpoint();
try (ZipOutputStream outZip = new ZipOutputStream(new BufferedOutputStream(
new FileOutputStream(path)))) {
ZipHelper.addFileToZip(outZip, newpipeDb.getPath(), "newpipe.db");
final SharedPreferences preferences = PreferenceManager
.getDefaultSharedPreferences(requireContext());
manager.exportDatabase(preferences, path);
saveSharedPreferencesToFile(newpipeSettings);
ZipHelper.addFileToZip(outZip, newpipeSettings.getPath(),
"newpipe.settings");
}
Toast.makeText(getContext(), R.string.export_complete_toast, Toast.LENGTH_SHORT)
.show();
Toast.makeText(getContext(), R.string.export_complete_toast, Toast.LENGTH_SHORT).show();
} catch (final Exception e) {
onError(e);
}
}
private void saveSharedPreferencesToFile(final File dst) {
try (ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(dst))) {
final SharedPreferences pref
= PreferenceManager.getDefaultSharedPreferences(requireContext());
output.writeObject(pref.getAll());
output.flush();
} catch (final IOException e) {
e.printStackTrace();
}
}
private void importDatabase(final String filePath) {
// check if file is supported
try (ZipFile zipFile = new ZipFile(filePath)) {

View file

@ -0,0 +1,45 @@
package org.schabi.newpipe.settings
import android.content.SharedPreferences
import org.schabi.newpipe.util.ZipHelper
import java.io.BufferedOutputStream
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.io.ObjectOutputStream
import java.lang.Exception
import java.util.zip.ZipOutputStream
class ContentSettingsManager(
private val newpipeDb: File,
private val newpipeSettings: File
) {
constructor(homeDir: File) : this(
File(homeDir, "databases/newpipe.db"),
File(homeDir, "databases/newpipe.settings")
)
/**
* Exports given [SharedPreferences] to the file in given outputPath.
* It also creates the file.
*/
@Throws(Exception::class)
fun exportDatabase(preferences: SharedPreferences, outputPath: String) {
ZipOutputStream(BufferedOutputStream(FileOutputStream(outputPath)))
.use { outZip ->
ZipHelper.addFileToZip(outZip, newpipeDb.path, "newpipe.db")
try {
ObjectOutputStream(FileOutputStream(newpipeSettings)).use { output ->
output.writeObject(preferences.all)
output.flush()
}
} catch (e: IOException) {
e.printStackTrace()
}
ZipHelper.addFileToZip(outZip, newpipeSettings.path, "newpipe.settings")
}
}
}

View file

@ -7,12 +7,12 @@ import android.view.MenuItem;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.SettingsLayoutBinding;
import org.schabi.newpipe.util.DeviceUtils;
import org.schabi.newpipe.util.ThemeHelper;
import org.schabi.newpipe.views.FocusOverlayView;
@ -51,10 +51,12 @@ public class SettingsActivity extends AppCompatActivity
setTheme(ThemeHelper.getSettingsThemeStyle(this));
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceBundle);
setContentView(R.layout.settings_layout);
final Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final SettingsLayoutBinding settingsLayoutBinding =
SettingsLayoutBinding.inflate(getLayoutInflater());
setContentView(settingsLayoutBinding.getRoot());
setSupportActionBar(settingsLayoutBinding.toolbarLayout.toolbar);
if (savedInstanceBundle == null) {
getSupportFragmentManager().beginTransaction()

View file

@ -483,7 +483,7 @@ public class Mp4FromDashWriter {
// stsc_table_entry = [first_chunk, samples_per_chunk, sample_description_index]
tables.stscBEntries = new int[tables.stsc * 3];
tables.stco = remainChunkOffset + 1; // total entrys in chunk offset box
tables.stco = remainChunkOffset + 1; // total entries in chunk offset box
tables.stscBEntries[index++] = 1;
tables.stscBEntries[index++] = firstCount;

View file

@ -22,9 +22,16 @@ package org.schabi.newpipe.util;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.core.text.HtmlCompat;
import androidx.preference.PreferenceManager;
import org.schabi.newpipe.MainActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.ReCaptchaActivity;
@ -32,6 +39,7 @@ import org.schabi.newpipe.extractor.Info;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.ListExtractor.InfoItemsPage;
import org.schabi.newpipe.extractor.ListInfo;
import org.schabi.newpipe.extractor.MetaInfo;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.Page;
import org.schabi.newpipe.extractor.StreamingService;
@ -60,6 +68,8 @@ import java.util.List;
import io.reactivex.rxjava3.core.Maybe;
import io.reactivex.rxjava3.core.Single;
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
public final class ExtractorHelper {
private static final String TAG = ExtractorHelper.class.getSimpleName();
private static final InfoCache CACHE = InfoCache.getInstance();
@ -306,4 +316,73 @@ public final class ExtractorHelper {
}
});
}
/**
* Formats the text contained in the meta info list as HTML and puts it into the text view,
* while also making the separator visible. If the list is null or empty, or the user chose not
* to see meta information, both the text view and the separator are hidden
* @param metaInfos a list of meta information, can be null or empty
* @param metaInfoTextView the text view in which to show the formatted HTML
* @param metaInfoSeparator another view to be shown or hidden accordingly to the text view
*/
public static void showMetaInfoInTextView(@Nullable final List<MetaInfo> metaInfos,
final TextView metaInfoTextView,
final View metaInfoSeparator) {
final Context context = metaInfoTextView.getContext();
final boolean showMetaInfo = PreferenceManager.getDefaultSharedPreferences(context)
.getBoolean(context.getString(R.string.show_meta_info_key), true);
if (!showMetaInfo || metaInfos == null || metaInfos.isEmpty()) {
metaInfoTextView.setVisibility(View.GONE);
metaInfoSeparator.setVisibility(View.GONE);
} else {
final StringBuilder stringBuilder = new StringBuilder();
for (final MetaInfo metaInfo : metaInfos) {
if (!isNullOrEmpty(metaInfo.getTitle())) {
stringBuilder.append("<b>").append(metaInfo.getTitle()).append("</b>")
.append(Localization.DOT_SEPARATOR);
}
String content = metaInfo.getContent().getContent().trim();
if (content.endsWith(".")) {
content = content.substring(0, content.length() - 1); // remove . at end
}
stringBuilder.append(content);
for (int i = 0; i < metaInfo.getUrls().size(); i++) {
if (i == 0) {
stringBuilder.append(Localization.DOT_SEPARATOR);
} else {
stringBuilder.append("<br/><br/>");
}
stringBuilder
.append("<a href=\"").append(metaInfo.getUrls().get(i)).append("\">")
.append(capitalizeIfAllUppercase(metaInfo.getUrlTexts().get(i).trim()))
.append("</a>");
}
}
metaInfoTextView.setText(HtmlCompat.fromHtml(stringBuilder.toString(),
HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING));
metaInfoTextView.setMovementMethod(LinkMovementMethod.getInstance());
metaInfoTextView.setVisibility(View.VISIBLE);
metaInfoSeparator.setVisibility(View.VISIBLE);
}
}
private static String capitalizeIfAllUppercase(final String text) {
for (int i = 0; i < text.length(); i++) {
if (Character.isLowerCase(text.charAt(i))) {
return text; // there is at least a lowercase letter -> not all uppercase
}
}
if (text.isEmpty()) {
return text;
} else {
return text.substring(0, 1).toUpperCase() + text.substring(1).toLowerCase();
}
}
}

View file

@ -57,7 +57,7 @@ import java.util.Locale;
public final class Localization {
private static final String DOT_SEPARATOR = "";
public static final String DOT_SEPARATOR = "";
private static PrettyTime prettyTime;
private Localization() { }

View file

@ -25,6 +25,7 @@ import android.os.IBinder;
import android.os.Message;
import android.os.Parcelable;
import androidx.core.app.ServiceCompat;
import androidx.core.content.ContextCompat;
import androidx.preference.PreferenceManager;
import android.util.Log;
@ -235,7 +236,7 @@ public class DownloadManagerService extends Service {
Log.d(TAG, "Destroying");
}
stopForeground(true);
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE);
if (mNotificationManager != null && downloadDoneNotification != null) {
downloadDoneNotification.setDeleteIntent(null);// prevent NewPipe running when is killed, cleared from recent, etc
@ -363,7 +364,7 @@ public class DownloadManagerService extends Service {
if (state) {
startForeground(FOREGROUND_NOTIFICATION_ID, mNotification);
} else {
stopForeground(true);
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE);
}
manageLock(state);

View file

@ -1,7 +1,7 @@
package us.shandian.giga.ui.adapter;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
@ -26,6 +26,8 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.NotificationCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.DiffUtil;
@ -91,6 +93,7 @@ public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callb
private static final String DEFAULT_MIME_TYPE = "*/*";
private static final String UNDEFINED_ETA = "--:--";
private static final int HASH_NOTIFICATION_ID = 123790;
static {
ALGORITHMS.put(R.id.md5, "MD5");
@ -678,28 +681,28 @@ public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callb
return true;
case R.id.md5:
case R.id.sha1:
ProgressDialog progressDialog = null;
if (mContext != null) {
// Create dialog
progressDialog = new ProgressDialog(mContext);
progressDialog.setCancelable(false);
progressDialog.setMessage(mContext.getString(R.string.msg_wait));
progressDialog.show();
}
final ProgressDialog finalProgressDialog = progressDialog;
final NotificationManager notificationManager
= ContextCompat.getSystemService(mContext, NotificationManager.class);
final NotificationCompat.Builder progressNotificationBuilder
= new NotificationCompat.Builder(mContext,
mContext.getString(R.string.hash_channel_id))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setSmallIcon(R.drawable.ic_newpipe_triangle_white)
.setContentTitle(mContext.getString(R.string.msg_calculating_hash))
.setContentText(mContext.getString(R.string.msg_wait))
.setProgress(0, 0, true)
.setOngoing(true);
notificationManager.notify(HASH_NOTIFICATION_ID, progressNotificationBuilder
.build());
final StoredFileHelper storage = h.item.mission.storage;
compositeDisposable.add(
Observable.fromCallable(() -> Utility.checksum(storage, ALGORITHMS.get(id)))
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> {
if (finalProgressDialog != null) {
Utility.copyToClipboard(finalProgressDialog.getContext(),
result);
if (mContext != null) {
finalProgressDialog.dismiss();
}
}
Utility.copyToClipboard(mContext, result);
notificationManager.cancel(HASH_NOTIFICATION_ID);
})
);
return true;

View file

@ -2,12 +2,12 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/video_item_detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/windowBackground">
<LinearLayout
android:id="@+id/video_item_detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
@ -506,6 +506,23 @@
</LinearLayout>
<View
android:id="@+id/detail_meta_info_separator"
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:background="?attr/separator_color" />
<TextView
android:id="@+id/detail_meta_info_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="12dp"
android:textSize="@dimen/video_item_detail_description_text_size"
tools:text="Stream meta info with link" />
<View
android:layout_width="match_parent"
android:layout_height="1px"

View file

@ -3,7 +3,9 @@
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/toolbar_layout" />
<include
layout="@layout/toolbar_layout"
android:id="@+id/toolbar_layout" />
<FrameLayout
android:id="@+id/frame"

View file

@ -5,7 +5,9 @@
android:layout_height="match_parent"
tools:context=".report.ErrorActivity">
<include layout="@layout/toolbar_layout" />
<include
layout="@layout/toolbar_layout"
android:id="@+id/toolbar_layout"/>
<ScrollView
android:id="@+id/scrollView"

View file

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<org.schabi.newpipe.views.FocusAwareDrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -15,7 +14,9 @@
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize" />
<include layout="@layout/toolbar_layout" />
<include
layout="@layout/toolbar_layout"
android:id="@+id/toolbar_layout"/>
<FrameLayout
android:id="@+id/fragment_player_holder"
@ -28,6 +29,8 @@
</org.schabi.newpipe.views.FocusAwareCoordinator>
<include layout="@layout/drawer_layout" />
<include
layout="@layout/drawer_layout"
android:id="@+id/drawer_layout" />
</org.schabi.newpipe.views.FocusAwareDrawerLayout>

View file

@ -11,15 +11,34 @@
android:layout_height="wrap_content"
android:layout_alignTop="@id/error_panel"
android:background="?attr/selectableItemBackground"
android:padding="10dp"
android:padding="12dp"
android:textSize="@dimen/search_suggestion_text_size"
tools:text="Showing results for lorem ipsum dolor sit amet consectetur adipisci elit" />
<TextView
android:id="@+id/search_meta_info_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/correct_suggestion"
android:gravity="center"
android:padding="12dp"
android:textSize="@dimen/video_item_detail_description_text_size"
tools:text="Get the latest information from the WHO about coronavirus." />
<View
android:id="@+id/search_meta_info_separator"
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_below="@id/search_meta_info_text_view"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:background="?attr/separator_color" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/items_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/correct_suggestion"
android:layout_below="@+id/search_meta_info_separator"
android:scrollbars="vertical"
app:layoutManager="LinearLayoutManager"
tools:listitem="@layout/list_stream_item" />

View file

@ -491,6 +491,23 @@
</LinearLayout>
<View
android:id="@+id/detail_meta_info_separator"
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:background="?attr/separator_color" />
<TextView
android:id="@+id/detail_meta_info_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="12dp"
android:textSize="@dimen/video_item_detail_description_text_size"
tools:text="Stream meta info with link" />
<View
android:layout_width="match_parent"
android:layout_height="1px"

View file

@ -35,8 +35,8 @@
android:id="@+id/anchorLeft"
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/playlist_ctrl_seperator_margin"
android:layout_marginBottom="@dimen/playlist_ctrl_seperator_margin"
android:layout_marginTop="@dimen/playlist_ctrl_separator_margin"
android:layout_marginBottom="@dimen/playlist_ctrl_separator_margin"
android:background="?attr/colorAccent"
android:clickable="false" />
@ -63,8 +63,8 @@
android:id="@+id/anchorRight"
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/playlist_ctrl_seperator_margin"
android:layout_marginBottom="@dimen/playlist_ctrl_seperator_margin"
android:layout_marginTop="@dimen/playlist_ctrl_separator_margin"
android:layout_marginBottom="@dimen/playlist_ctrl_separator_margin"
android:background="?attr/colorAccent"
android:clickable="false" />

View file

@ -12,6 +12,8 @@
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize" />
<include layout="@layout/toolbar_layout" />
<include
layout="@layout/toolbar_layout"
android:id="@+id/toolbar_layout"/>
</RelativeLayout>

View file

@ -47,13 +47,13 @@
<string name="unsupported_url">رابط غير مدعوم</string>
<string name="use_external_audio_player_title">استخدام مشغل صوت خارجي</string>
<string name="use_external_video_player_title">استخدام مشغل فيديو خارجي</string>
<string name="use_tor_summary">(إختبارية) إجراء التنزيلات من خلال استخدام بروكسي Tor لزيادة الخصوصية ( تشغيل الفيديو المباشر غير مدعوم حتى الأن ).</string>
<string name="use_tor_summary">(إختبارية) إجراء التنزيلات من خلال استخدام بروكسي Tor لزيادة الخصوصية (تشغيل الفيديو المباشر غير مدعوم حتى الأن).</string>
<string name="use_tor_title">استخدام تور</string>
<string name="view_count_text">%1$s مشاهدة</string>
<string name="content_not_available">محتوى غير متوفر</string>
<string name="could_not_load_thumbnails">تعذرت عملية تحميل كافة صور المعاينة</string>
<string name="could_not_load_thumbnails">تعذر تحميل كافة الصور المصغرة</string>
<string name="general_error">خطأ</string>
<string name="parsing_error">تعذرت عملية تحليل الموقع</string>
<string name="parsing_error">تعذر تحليل الموقع</string>
<string name="youtube_signature_deobfuscation_error">تعذر فك تشفير توقيع رابط الفيديو</string>
<string name="main_bg_subtitle">اضغط على \"بحث\" للبدء
\n</string>
@ -102,7 +102,7 @@
<string name="resume_on_audio_focus_gain_title">استئناف التشغيل</string>
<string name="resume_on_audio_focus_gain_summary">متابعة التشغيل بعد المقاطعات (مثل المكالمات الهاتفية)</string>
<string name="show_hold_to_append_title">إظهار التلميحات \"اضغط للتجاهل\"</string>
<string name="show_hold_to_append_summary">عرض تلميح عند الضغط على الخلفية أو الزر المنبثق في الفيديو \"التفاصيل:\"</string>
<string name="show_hold_to_append_summary">عرض تلميح على صفحة التفاصيل عند استخدام وضع مشغل الخلفية أو النافذة المنبثقة</string>
<string name="settings_category_player_title">المشغل</string>
<string name="settings_category_player_behavior_title">السلوك</string>
<string name="settings_category_popup_title">الوضع المنبثق</string>
@ -127,10 +127,10 @@
<string name="notification_channel_description">تنبيهات مشغل NewPipe للخلفية والنوافذ المنبثقة</string>
<string name="unknown_content">[غير معروف]</string>
<string name="light_parsing_error">لا يمكن تحليل الموقع بشكل كلي</string>
<string name="could_not_setup_download_menu">تعذرت عملية إعداد قائمة التنزيل</string>
<string name="live_streams_not_supported">البث المباشر غير مدعوم حتى الآن</string>
<string name="could_not_setup_download_menu">تعذر إعداد قائمة التنزيل</string>
<string name="live_streams_not_supported">البثوث المباشرة ليست مدعومةً بعد</string>
<string name="could_not_get_stream">تعذر الحصول على أي بث</string>
<string name="could_not_load_image">تعذرت عملية تحميل الصورة</string>
<string name="could_not_load_image">تعذر تحميل الصورة</string>
<string name="app_ui_crash">تعطل التطبيق / واجهة المستخدم</string>
<string name="player_stream_failure">لا يمكن تشغيل هذا البث</string>
<string name="player_unrecoverable_failure">حدث خطأ للمشغل غير قابل للاسترداد</string>
@ -223,11 +223,11 @@
<string name="select_a_channel">اختر قناة</string>
<string name="no_channel_subscribed_yet">لم يتم الاشتراك في أي قناة بعد</string>
<string name="trending">الشائعة</string>
<string name="top_50">أفضل 50</string>
<string name="top_50">أفضل ٥٠</string>
<string name="new_and_hot">جديد وساخن</string>
<string name="play_queue_remove">حذف</string>
<string name="play_queue_stream_detail">التفاصيل</string>
<string name="play_queue_audio_settings">الإعدادات الصوتية</string>
<string name="play_queue_audio_settings">إعدادات الصوت</string>
<string name="start_here_on_main">تشغيل هنا</string>
<string name="start_here_on_popup">بدأ التشغيل في نافذة منبثقة</string>
<string name="title_activity_recaptcha">تحدي الكابتشا</string>
@ -282,19 +282,19 @@
<string name="dismiss">إلغاء</string>
<string name="rename">إعادة التسمية</string>
<string name="export_complete_toast">تمت عملية التصدير</string>
<string name="import_complete_toast">إكتَملَت عملية الإستيراد</string>
<string name="could_not_import_all_files">تنبيه : تعذرت عملية استيراد كافة الملفات.</string>
<string name="import_complete_toast">تمَّت عملية الإستيراد</string>
<string name="could_not_import_all_files">تنبيه: تعذر استيراد كافة الملفات.</string>
<string name="drawer_header_action_paceholder_text">سوف يظهر شيء هنا قريبا ;D</string>
<string name="video_player">مشغل الفيديو</string>
<string name="always_ask_open_action">السؤال دائماً</string>
<string name="preferred_player_fetcher_notification_title">الحصول على المعلومات </string>
<string name="preferred_player_fetcher_notification_title">الحصول على المعلومات…</string>
<string name="preferred_player_fetcher_notification_message">تحميل المحتوى المطلوب</string>
<string name="create_playlist">إنشاء قائمة تشغيل جديدة</string>
<string name="delete_playlist">حذف قائمة التشغيل</string>
<string name="rename_playlist">إعادة تسمية</string>
<string name="name">التسمية</string>
<string name="append_playlist">إضافة إلى قائمة تشغيل</string>
<string name="delete_playlist_prompt">هل تريد حذف قائمة التشغيل هذه ؟</string>
<string name="delete_playlist_prompt">هل تريد حذف قائمة التشغيل هذه؟</string>
<string name="playlist_creation_success">تم إنشاء قائمة التشغيل</string>
<string name="playlist_add_stream_success">تمت إضافتها إلى قائمة التشغيل</string>
<string name="playlist_delete_failure">لا يمكن حذف قائمة التشغيل.</string>
@ -308,7 +308,7 @@
<string name="thumbnail_cache_wipe_complete_notice">تم إفراغ مساحة ذاكرة التخزين المؤقتة الخاصة بالصور</string>
<string name="file">الملف</string>
<string name="invalid_directory">لا يوجد مثل هذا المجلد</string>
<string name="file_name_empty_error">لا يمكن أن يكون اسم الملف فارغا</string>
<string name="file_name_empty_error">لا يمكن أن يكون اسم الملف فارغًا</string>
<string name="error_occurred_detail">طرأ هناك خطأ: %1$s</string>
<string name="no_valid_zip_file">ملف مضغوط ZIP غير صالح</string>
<string name="unbookmark_playlist">إزالة الفواصل المرجعية</string>
@ -327,7 +327,7 @@
<string name="metadata_cache_wipe_summary">إزالة جميع بيانات صفحات الويب المخزنة مؤقتًا</string>
<string name="metadata_cache_wipe_complete_notice">تم محو ذاكرة التخزين المؤقت للبيانات الوصفية</string>
<string name="auto_queue_title">وضع البث القادم تلقائيا في قائمة الإنتظار</string>
<string name="auto_queue_summary">استمر في إنهاء قائمة انتظار التشغيل (الغير المتكررة) من خلال إلحاق بث ذي صلة</string>
<string name="auto_queue_summary">استمر في إنهاء قائمة انتظار التشغيل (الغير المتكررة) من خلال إلحاق التدفق المرتبط</string>
<string name="set_as_playlist_thumbnail">إضافة صورة مصغرة إلى قائمة التشغيل</string>
<string name="bookmark_playlist">تفضيل قائمة التشغيل</string>
<string name="playlist_thumbnail_change_success">تم تغيير الصورة المصغرة لقائمة التشغيل.</string>
@ -338,12 +338,12 @@
<string name="enable_disposed_exceptions_title">تقرير الأخطاء خارج دورة الحياة</string>
<string name="enable_disposed_exceptions_summary">فرض الإبلاغ عن استثناءات Rx غير القابلة للتسليم خارج دورة حياة الجزء أو النشاط بعد التخلص منها</string>
<string name="clear_views_history_title">محو سجل المشاهدة</string>
<string name="clear_views_history_summary">حذف محفوظات التدفقات التي تم تشغيلها ومواقف التشغيل</string>
<string name="delete_view_history_alert">حذف سجل المشاهدة بالكامل\?</string>
<string name="clear_views_history_summary">حذف محفوظات البثوث التي تم تشغيلها ومواقف التشغيل</string>
<string name="delete_view_history_alert">حذف سجل المشاهدة بالكامل؟</string>
<string name="watch_history_deleted">تم حذف سجل المشاهدة.</string>
<string name="clear_search_history_title">محو سجل البحث</string>
<string name="clear_search_history_summary">يحذف تاريخ البحث عن الكلمات الرئيسية</string>
<string name="delete_search_history_alert">حذف سِجل البحث بالكامل\?</string>
<string name="delete_search_history_alert">حذف سِجل البحث بالكامل؟</string>
<string name="search_history_deleted">تم حذف سجل البحث.</string>
<string name="external_player_unsupported_link_type">المشغل الخارجي لا يدعم هذه الأنواع من الروابط</string>
<string name="invalid_source">لا يوجد مثل هذا الملف/مصدر المحتوى</string>
@ -460,15 +460,15 @@
<string name="error_ssl_exception">فشل الاتصال الآمن</string>
<string name="error_unknown_host">تعذر العثور على الخادم</string>
<string name="error_connect_host">لا يمكن الاتصال بالخادم</string>
<string name="error_http_no_content">الخادم لايقوم بإرسال البيانات</string>
<string name="error_http_no_content">الخادم لا يقوم بإرسال البيانات</string>
<string name="error_http_unsupported_range">الخادم لا يقبل التنزيل المتعدد، إعادة المحاولة مع @string/msg_threads = 1</string>
<string name="error_http_not_found">غير موجود</string>
<string name="error_postprocessing_failed">فشلت المعالجة الاولية</string>
<string name="stop">توقف</string>
<string name="max_retry_msg">أقصى عدد للمحاولات</string>
<string name="max_retry_desc">الحد الأقصى لعدد محاولات قبل إلغاء التحميل</string>
<string name="max_retry_msg">عدد المحاولات الأقصى</string>
<string name="max_retry_desc">الحد الأقصى لعدد المحاولات قبل إلغاء التحميل</string>
<string name="pause_downloads_on_mobile">المقاطعة على الشبكات المقيسة</string>
<string name="pause_downloads_on_mobile_desc">مفيد عند التبديل إلى بيانات الجوال ، على الرغم من أنه لا يمكن تعليق بعض التنزيلات</string>
<string name="pause_downloads_on_mobile_desc">مفيد عند التبديل إلى بيانات الجوال، ولكن لا يمكن تعليق بعض التنزيلات</string>
<string name="show_comments_title">إظهار التعليقات</string>
<string name="show_comments_summary">عطّله لإخفاء التعليقات</string>
<string name="autoplay_title">تشغيل تلقائي</string>
@ -498,7 +498,7 @@
<string name="downloads_storage_ask_summary">سيُطلب منك مكان حفظ كل تنزيل</string>
<string name="downloads_storage_ask_summary_kitkat">سيطلب منك مكان حفظ كل تنزيل.
\nاختر SAF إذا كنت تريد التنزيل على بطاقة SD خارجية</string>
<string name="downloads_storage_use_saf_title">استخدام آمن</string>
<string name="downloads_storage_use_saf_title">استخدام SAF</string>
<string name="downloads_storage_use_saf_summary">يسمح \"إطار الوصول إلى التخزين\" بالتنزيل على بطاقة SD خارجية.
\nبعض الأجهزة غير متوافقة</string>
<string name="clear_playback_states_title">حذف مواقف التشغيل</string>
@ -535,16 +535,16 @@
<string name="peertube_instance_add_https_only">يتم دعم عناوين URL HTTPS فقط</string>
<string name="peertube_instance_add_exists">مثيل الخادم موجود بالفعل</string>
<string name="local">محلي</string>
<string name="recently_added">أضيف مؤخرا</string>
<string name="most_liked">الأكثر إعجابا</string>
<string name="recently_added">أُضيف مؤخرًا</string>
<string name="most_liked">الأكثر إعجابًا</string>
<string name="playlist_no_uploader">تم إنشاؤه-تلقائيًا (لم يتم العثور على برنامج تحميل)</string>
<string name="recovering">استرد</string>
<string name="error_download_resource_gone">لا يمكن استرداد هذا التنزيل</string>
<string name="choose_instance_prompt">اختيار مثيل</string>
<string name="peertube_instance_url_help">ابحث عن مثيلات الخوادم التي تناسبك على %s</string>
<string name="clear_download_history">تنظيف تاريخ التحميل</string>
<string name="delete_downloaded_files">حذف الملفات التي تم تنزيلها</string>
<string name="deleted_downloads">التنزيلات %1$d المحذوفة</string>
<string name="delete_downloaded_files">حذف الملفات المحملة</string>
<string name="deleted_downloads">تم حذف %1$d من التحميلات</string>
<string name="permission_display_over_apps">إعطاء إذن لعرضه على التطبيقات الأخرى</string>
<string name="app_language_title">لغة التطبيق</string>
<string name="systems_language">النظام الافتراضي</string>
@ -572,14 +572,14 @@
\nلذا فإن الاختيار يتلخص في ما تفضله: السرعة أو المعلومات الدقيقة.</string>
<string name="feed_use_dedicated_fetch_method_disable_button">تعطيل الوضع السريع</string>
<string name="feed_use_dedicated_fetch_method_enable_button">تمكين الوضع السريع</string>
<string name="feed_use_dedicated_fetch_method_summary">متوفر في بعض الخدمات ، وعادة ما يكون أسرع بكثير ولكن قد يُرجع كمية محدودة من العناصر وغالبًا معلومات غير مكتملة (على سبيل المثال ، بدون مدة أو نوع عنصر أو حالة مباشرة).</string>
<string name="feed_use_dedicated_fetch_method_summary">متوفر في بعض الخدمات، وعادةً ما يكون أسرع بكثير ولكن قد يُرجع كمية محدودة من العناصر وغالبًا ما تكون معلومات غير مكتملة (مثلًا بدون مدة أو نوع عنصر أو حالة مباشرة).</string>
<string name="feed_use_dedicated_fetch_method_title">جلب من تغذية مخصصة عندما تكون متاحة</string>
<string name="feed_update_threshold_option_always_update">تحديث دائما</string>
<string name="feed_update_threshold_option_always_update">تحديث دائمًا</string>
<string name="feed_update_threshold_summary">الوقت بعد التحديث الأخير قبل اعتبار الاشتراك قديمًا — %s</string>
<string name="feed_update_threshold_title">عتبة تحديث التغذية</string>
<string name="settings_category_feed_title">تغذية</string>
<string name="feed_create_new_group_button_title">جديد</string>
<string name="feed_group_dialog_delete_message">هل تريد حذف هذه المجموعة\?</string>
<string name="feed_group_dialog_delete_message">هل تريد حذف هذه المجموعة؟</string>
<string name="feed_group_dialog_empty_name">اسم المجموعة فارغ</string>
<plurals name="feed_group_dialog_selection_count">
<item quantity="zero">%d تحديد</item>
@ -637,9 +637,9 @@
\nقم بتشغيل \"%1$s\" في الإعدادات إذا كنت تريد رؤيته.</string>
<string name="remove_watched_popup_yes_and_partially_watched_videos">نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا</string>
<string name="remove_watched_popup_warning">ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل.
\nهل أنت واثق؟ هذا لا يمكن التراجع عنها!</string>
\nهل أنت واثق؟ لا يمكن التراجع عن هذا!</string>
<string name="remove_watched_popup_title">إزالة مقاطع الفيديو التي تمت مشاهدتها؟</string>
<string name="remove_watched">إزالة ماتمت مشاهدته</string>
<string name="remove_watched">إزالة ما تمت مشاهدته</string>
<string name="show_original_time_ago_summary">ستكون النصوص الأصلية من الخدمات مرئية في عناصر البث</string>
<string name="show_original_time_ago_title">عرض الوقت الأصلي على العناصر</string>
<string name="youtube_restricted_mode_enabled_title">شغيل \"وضع تقييد المحتوى\" في يوتيوب</string>
@ -649,7 +649,7 @@
<string name="playlist_page_summary">صفحة قائمة التشغيل</string>
<string name="feed_group_show_only_ungrouped_subscriptions">إظهار الاشتراكات غير المجمعة فقط</string>
<string name="no_playlist_bookmarked_yet">لا توجد إشارات مرجعية لقائمة التشغيل حتى الآن</string>
<string name="select_a_playlist">حدد قائمة تشغيل</string>
<string name="select_a_playlist">اختر قائمة تشغيل</string>
<string name="error_report_open_github_notice">يرجى التحقق مما إذا كانت هناك مشكلة في مناقشة تعطلك بالفعل. عند إنشاء تذاكر مكررة ، ستأخذ وقتًا منا يمكن أن نقضيه في إصلاح الخطأ الفعلي.</string>
<string name="error_report_open_issue_button_text">تقرير على جيثب</string>
<string name="copy_for_github">نسخ تقرير منسق</string>

View file

@ -5,7 +5,7 @@
<string name="view_count_text">%1$s 次观看</string>
<string name="upload_date_text">发布于 %1$s</string>
<string name="open_in_browser">在浏览器中打开</string>
<string name="open_in_popup_mode">在悬浮窗模式下打开</string>
<string name="open_in_popup_mode">在悬浮窗打开</string>
<string name="did_you_mean">您是不是要找:%1$s</string>
<string name="no_player_found_toast">找不到串流播放器 (您可以安装 VLC 进行播放)。</string>
<string name="controls_download_desc">下载串流文件</string>
@ -18,16 +18,16 @@
<string name="share_dialog_title">分享给...</string>
<string name="choose_browser">选择浏览器</string>
<string name="download_path_title">视频下载路径</string>
<string name="download_path_summary">已下载的视频存储在这里</string>
<string name="download_path_summary">已下载的视频将存储于此</string>
<string name="download_path_dialog_title">请选择下载视频的保存位置</string>
<string name="download_path_audio_summary">已下载的音频存储在这里</string>
<string name="download_path_audio_summary">已下载的音频将存储于此</string>
<string name="download_path_audio_dialog_title">选择下载音频的储存位置</string>
<string name="autoplay_by_calling_app_title">自动播放</string>
<string name="play_with_kodi_title">使用Kodi播放</string>
<string name="theme_title">主题</string>
<string name="light_theme_title">浅色</string>
<string name="dark_theme_title">暗黑</string>
<string name="black_theme_title"></string>
<string name="dark_theme_title">深色</string>
<string name="black_theme_title"></string>
<string name="download_dialog_title">下载</string>
<string name="unsupported_url">不支持的 URL</string>
<string name="settings_category_appearance_title">外观</string>
@ -38,16 +38,17 @@
<string name="later">稍后</string>
<string name="network_error">网络错误</string>
<plurals name="videos">
<item quantity="other">%s 视频</item>
<item quantity="one">%s 部视频</item>
<item quantity="other"/>
</plurals>
<string name="disabled">禁用</string>
<string name="controls_background_title">后台播放</string>
<string name="filter">过滤器</string>
<string name="refresh">刷新</string>
<string name="show_search_suggestions_title">搜索建议</string>
<string name="show_search_suggestions_title">显示搜索建议</string>
<string name="subscribe_button_title">订阅</string>
<string name="subscribed_button_title">已订阅</string>
<string name="enable_watch_history_title">观看历史</string>
<string name="enable_watch_history_title">观看记录</string>
<string name="settings_category_player_title">播放器</string>
<string name="settings_category_history_title">历史记录与缓存</string>
<string name="playlist">播放列表</string>
@ -57,11 +58,11 @@
<string name="just_once">仅一次</string>
<string name="controls_add_to_playlist_title">添加至</string>
<string name="file">文件</string>
<string name="download_thumbnail_title">加载缩略图</string>
<string name="clear_views_history_title">观看记录</string>
<string name="download_thumbnail_title">加载封面</string>
<string name="clear_views_history_title">观看记录</string>
<string name="minimize_on_exit_none_description"></string>
<string name="minimize_on_exit_background_description">最小化后台播放</string>
<string name="minimize_on_exit_popup_description">最小化悬浮窗播放</string>
<string name="minimize_on_exit_background_description">最小化后台播放</string>
<string name="minimize_on_exit_popup_description">最小化悬浮窗播放</string>
<string name="channels">频道</string>
<string name="playlists">播放列表</string>
<string name="unsubscribe">取消订阅</string>
@ -72,22 +73,22 @@
<string name="updates_setting_description">发布新版本时,通知我升级应用</string>
<string name="grid">网格</string>
<string name="app_update_notification_content_title">NewPipe可更新</string>
<string name="error_http_unsupported_range">服务器不接受 接收 multi-threaded 下载, 以 @string/msg_threads = 1 重试</string>
<string name="autoplay_title">自动播放</string>
<string name="settings_category_clear_data_title">数据</string>
<string name="error_http_unsupported_range">服务器不接受多线程下载, 使用 @string/msg_threads = 1 重试</string>
<string name="autoplay_title">自动恢复上次播放</string>
<string name="settings_category_clear_data_title">数据</string>
<string name="watch_history_deleted">观看记录已删除</string>
<string name="detail_likes_img_view_description">喜欢</string>
<string name="detail_dislikes_img_view_description">不喜欢</string>
<string name="use_tor_title">使用Tor</string>
<string name="use_tor_summary">(实验性)通过 Tor 强制播放来增强隐私(暂不支持串流视频)。</string>
<string name="report_error">报告错误</string>
<string name="user_report">用户报告</string>
<string name="report_error">反馈错误</string>
<string name="user_report">用户反馈</string>
<string name="err_dir_create">无法创建下载目录\"%1$s\"</string>
<string name="info_dir_created">已成功创建下载目录「%1$s」</string>
<string name="video">视频</string>
<string name="audio">音频</string>
<string name="retry">重试</string>
<string name="storage_permission_denied">存储访问权限已被拒绝</string>
<string name="storage_permission_denied">访问存储权限已被拒绝</string>
<plurals name="views">
<item quantity="other">%s 次观看</item>
</plurals>
@ -113,7 +114,7 @@
<string name="action_settings">设置</string>
<string name="action_about">关于</string>
<string name="title_licenses">第三方许可</string>
<string name="copyright" formatted="true">© %1$s :作者 %2$s (使用 %3$s )</string>
<string name="copyright" formatted="true">© %1$s :开发者 %2$s (使用 %3$s 许可证)</string>
<string name="error_unable_to_load_license">无法加载许可证</string>
<string name="action_open_website">打开网站</string>
<string name="tab_about">关于</string>
@ -121,34 +122,34 @@
<string name="tab_licenses">许可证</string>
<string name="settings_category_downloads_title">下载</string>
<string name="settings_file_charset_title">文件名中允许的字符</string>
<string name="settings_file_replacement_character_summary">无效字符将会被替换为</string>
<string name="settings_file_replacement_character_summary">无效字符将会被替换为该字符</string>
<string name="charset_letters_and_digits">字母和数字</string>
<string name="charset_most_special_characters">特殊字符</string>
<string name="charset_most_special_characters">特殊字符</string>
<string name="search_no_results">没有结果</string>
<string name="no_subscribers">没有订阅者</string>
<string name="no_subscribers">订阅者</string>
<plurals name="subscribers">
<item quantity="other">%s 位订阅者</item>
</plurals>
<string name="no_videos">没有视频</string>
<string name="no_videos">视频</string>
<string name="detail_drag_description">拖动以重新排序</string>
<string name="create"></string>
<string name="delete_one">仅删除一</string>
<string name="delete_all">全部删除</string>
<string name="dismiss">解除</string>
<string name="create"></string>
<string name="delete_one">仅删除一</string>
<string name="delete_all">删除全部</string>
<string name="dismiss">退出</string>
<string name="rename">重命名</string>
<string name="toast_no_player">未安装可播放此文件的应用程序</string>
<string name="one_item_deleted">已删除1个项目</string>
<string name="main_page_content_summary">哪些标签需要在主页上展示</string>
<string name="one_item_deleted">已删除一项</string>
<string name="main_page_content_summary">自定义主页显示的标签页</string>
<string name="list_view_mode">列表视图模式</string>
<string name="missions_header_finished">已完成</string>
<string name="missions_header_pending">等待中…</string>
<string name="paused">已暂停</string>
<string name="queued">排队中</string>
<string name="queued">已加入队列</string>
<string name="enqueue">加入队列</string>
<string name="permission_denied">操作已被系统拒绝</string>
<string name="download_failed">下载失败</string>
<string name="download_finished">下载完成</string>
<string name="download_finished_more">%s 下载已完成</string>
<string name="download_finished_more">%s 下载已完成</string>
<string name="no_comments">没有评论</string>
<string name="drawer_header_description">切换服务,当前选择:</string>
<string name="no_player_found">找不到串流播放器。您想安装 VLC 吗?</string>
@ -158,20 +159,21 @@
<string name="download_path_audio_title">音频下载文件夹</string>
<string name="autoplay_by_calling_app_summary">从其他应用调用 NewPipe 时播放视频</string>
<string name="default_resolution_title">默认分辨率</string>
<string name="kore_not_found">找不到Kore。是否安装</string>
<string name="show_play_with_kodi_title">显示“用Kodi播放”选项</string>
<string name="kore_not_found">找不到Kore
\n是否安装Kore</string>
<string name="show_play_with_kodi_title">显示“使用Kodi播放”选项</string>
<string name="show_play_with_kodi_summary">显示“通过Kodi media center播放视频”的选项</string>
<string name="play_audio">音频</string>
<string name="default_audio_format_title">默认音频格式</string>
<string name="show_next_and_similar_title">显示“下一个”和“相似”视频</string>
<string name="show_next_and_similar_title">显示“接下来”和“类似视频”</string>
<string name="settings_category_video_audio_title">视频和音频</string>
<string name="background_player_playing_toast">后台播放</string>
<string name="background_player_playing_toast">后台播放</string>
<string name="content">内容</string>
<string name="show_age_restricted_content_title">示年龄限制的内容</string>
<string name="show_age_restricted_content_title">示年龄限制的内容</string>
<string name="duration_live">直播</string>
<string name="downloads">下载</string>
<string name="downloads_title">下载</string>
<string name="error_report_title">错误报告</string>
<string name="error_report_title">反馈错误</string>
<string name="general_error">错误</string>
<string name="could_not_load_thumbnails">无法加载所有缩略图</string>
<string name="youtube_signature_deobfuscation_error">无法解密视频的 URL 签名</string>
@ -182,46 +184,46 @@
<string name="live_streams_not_supported">暂时不支持观看直播</string>
<string name="could_not_get_stream">无法获得任何串流</string>
<string name="could_not_load_image">无法加载图像</string>
<string name="app_ui_crash">App UI 崩溃</string>
<string name="sorry_string">抱歉,这本不该发生。</string>
<string name="error_report_button_text">使用电子邮件报告错误</string>
<string name="app_ui_crash">App/UI 崩溃</string>
<string name="sorry_string">抱歉,这本不该发生。</string>
<string name="error_report_button_text">使用电子邮件反馈错误</string>
<string name="error_snackbar_message">抱歉,发生了一些错误。</string>
<string name="error_snackbar_action">报告</string>
<string name="error_snackbar_action">反馈</string>
<string name="what_device_headline">信息:</string>
<string name="what_happened_headline">发生了什么:</string>
<string name="info_labels">详情:\\n请求\\n内容语言\\n内容国家\\n客户端语言\\n服务\\nGMT时间\\n包名\\n版本\\n操作系统版本</string>
<string name="your_comment">您的附说明(请用英文):</string>
<string name="your_comment">您的附说明(请用英文):</string>
<string name="error_details_headline">详细信息:</string>
<string name="list_thumbnail_view_description">视频预览缩略图</string>
<string name="detail_thumbnail_view_description">播放视频时长:</string>
<string name="detail_thumbnail_view_description">播放视频,时长:</string>
<string name="detail_uploader_thumbnail_view_description">视频上传者的头像缩略图</string>
<string name="short_billion">字节</string>
<string name="short_billion">十亿</string>
<string name="msg_url_malform">错误的 URL 或未联网</string>
<string name="msg_running">NewPipe下载中</string>
<string name="msg_running">NewPipe正在下载文件</string>
<string name="no_available_dir">请稍后在设置中设定下载目录</string>
<string name="msg_popup_permission">用悬浮窗模式
\n需要权限</string>
<string name="msg_popup_permission">使用悬浮窗模式
\n需要权限</string>
<string name="title_activity_recaptcha">reCAPTCHA验证</string>
<string name="recaptcha_request_toast">请求新的CAPTCHA验证</string>
<string name="recaptcha_request_toast">请求新的CAPTCHA验证</string>
<string name="popup_mode_share_menu_title">NewPipe 悬浮窗模式</string>
<string name="popup_playing_toast">在悬浮窗中播放</string>
<string name="default_popup_resolution_title">默认悬浮窗分辨率</string>
<string name="default_popup_resolution_title">默认分辨率(悬浮窗模式)</string>
<string name="show_higher_resolutions_title">使用更高的分辨率</string>
<string name="show_higher_resolutions_summary">仅某些设备支持播放2K / 4K视频</string>
<string name="clear">清除</string>
<string name="popup_remember_size_pos_title">记住悬浮窗属性</string>
<string name="popup_remember_size_pos_summary">记住最后一次使用悬浮窗的大小和位置</string>
<string name="popup_remember_size_pos_summary">记住一次使用悬浮窗的大小和位置</string>
<string name="settings_category_popup_title">悬浮窗</string>
<string name="popup_resizing_indicator_title">调整大小</string>
<string name="use_external_video_player_summary">隐藏部分没有音频的分辨率</string>
<string name="player_gesture_controls_title">播放器手势控制</string>
<string name="use_external_video_player_summary">在部分分辨率下将没有音频</string>
<string name="player_gesture_controls_title">手势控制播放器</string>
<string name="player_gesture_controls_summary">允许使用手势控制亮度和音量</string>
<string name="show_search_suggestions_summary">显示搜索建议</string>
<string name="show_search_suggestions_summary">搜索时显示搜索建议</string>
<string name="best_resolution">最佳分辨率</string>
<string name="app_description">开源小巧的Android媒体播放器。</string>
<string name="app_description">开源小巧的Android媒体播放器。</string>
<string name="view_on_github">在GitHub上查看</string>
<string name="app_license_title">NewPipe开源许可证</string>
<string name="contribution_encouragement">你是否有想:翻译、设计、清理或重构代码更改 ——我们始终欢迎你来贡献!</string>
<string name="contribution_encouragement">你是否想过要翻译、设计、清理或重构代码 ——我们始终欢迎你来贡献!</string>
<string name="read_full_license">阅读许可证</string>
<string name="contribution_title">贡献</string>
<string name="settings_file_replacement_character_title">替换字符</string>
@ -231,31 +233,31 @@
<string name="tab_main">主页</string>
<string name="tab_subscriptions">订阅</string>
<string name="fragment_feed_title">最新</string>
<string name="resume_on_audio_focus_gain_title">恢复前台焦点</string>
<string name="resume_on_audio_focus_gain_summary">中断后继续播放(例如突然来电后)</string>
<string name="enable_search_history_title">搜索历史记录</string>
<string name="enable_search_history_summary">在本地存储搜索查询记录</string>
<string name="enable_watch_history_summary">记录已观看视频</string>
<string name="title_activity_history">历史</string>
<string name="resume_on_audio_focus_gain_title">自动恢复播放</string>
<string name="resume_on_audio_focus_gain_summary">在播放被打断(例如突然来电)后恢复播放</string>
<string name="enable_search_history_title">搜索记录</string>
<string name="enable_search_history_summary">存储本地搜索记录</string>
<string name="enable_watch_history_summary">保留观看记录</string>
<string name="title_activity_history">历史记录</string>
<string name="title_history_search">已搜索</string>
<string name="title_history_view">已观看</string>
<string name="history_disabled">历史记录功能已关闭</string>
<string name="action_history">历史</string>
<string name="history_empty">历史记录为空</string>
<string name="history_cleared">清除历史记录</string>
<string name="action_history">历史记录</string>
<string name="history_empty">尚无历史记录</string>
<string name="history_cleared">历史记录已清空</string>
<string name="notification_channel_name">NewPipe 通知</string>
<string name="notification_channel_description">NewPipe 后台播放和悬浮窗播放的通知</string>
<string name="notification_channel_description">NewPipe 在后台播放和悬浮窗播放时在通知栏中显示通知</string>
<string name="default_video_format_title">默认视频格式</string>
<string name="settings_category_player_behavior_title">行为</string>
<string name="empty_subscription_feed_subtitle">空空如也...</string>
<string name="no_views">0次观看</string>
<string name="no_views">无人观看过</string>
<string name="item_deleted">项目已删除</string>
<string name="delete_item_search_history">是否要从搜索历史记录中删除此项目</string>
<string name="main_page_content">显示在主页面内容</string>
<string name="delete_item_search_history">是否删除此条搜索记录</string>
<string name="main_page_content">主页面的显示内容</string>
<string name="blank_page_summary">空白页</string>
<string name="kiosk_page_summary">『时下流行』页-自定义</string>
<string name="subscription_page_summary">订阅页</string>
<string name="feed_page_summary">Feed 页</string>
<string name="feed_page_summary">Feed 页</string>
<string name="channel_page_summary">频道页</string>
<string name="select_a_channel">选择一个频道</string>
<string name="no_channel_subscribed_yet">尚未订阅频道</string>
@ -265,16 +267,16 @@
<string name="top_50">前50</string>
<string name="new_and_hot">最新与热门</string>
<string name="show_hold_to_append_title">显示 \"长按添加\" 说明</string>
<string name="show_hold_to_append_summary">在视频详情页中,按背景播放或悬浮窗播放按钮时显示提示</string>
<string name="show_hold_to_append_summary">在视频详情页中,按背景播放或悬浮窗播放按钮时显示提示</string>
<string name="background_player_append">已加入后台播放播放列表</string>
<string name="popup_playing_append">已加入悬浮窗播放列表</string>
<string name="player_stream_failure">无法播放此串流</string>
<string name="player_unrecoverable_failure">发生无法恢复播放器错误</string>
<string name="player_recoverable_failure">恢复播放器错误</string>
<string name="player_unrecoverable_failure">发生无法处理的播放器错误</string>
<string name="player_recoverable_failure">播放器错误 自动恢复</string>
<string name="play_queue_remove">移除</string>
<string name="play_queue_stream_detail">详情</string>
<string name="play_queue_audio_settings">音频设置</string>
<string name="hold_to_append">长按队列</string>
<string name="hold_to_append">长按加入播放列表</string>
<string name="unknown_content">[未知]</string>
<string name="start_here_on_main">开始在此处开始播放</string>
<string name="start_here_on_background">开始后台播放</string>
@ -282,11 +284,11 @@
<string name="donation_title">捐赠</string>
<string name="donation_encouragement">NewPipe是由志愿者开发的他们利用自己的空闲时间为您带来最佳的用户体验。在开发者享受一杯咖啡的时候回报他们帮助他们让NewPipe变得更好。</string>
<string name="give_back">反馈</string>
<string name="website_title"></string>
<string name="website_title"></string>
<string name="website_encouragement">请访问 NewPipe 网站了解更多信息和讯息。</string>
<string name="default_content_country_title">默认国家/地区</string>
<string name="default_content_country_title">视频默认国家/地区</string>
<string name="toggle_orientation">切换方向</string>
<string name="switch_to_background">切换到背景播放</string>
<string name="switch_to_background">切换到后台播放</string>
<string name="switch_to_popup">切换到悬浮窗播放</string>
<string name="switch_to_main">切换到主页面</string>
<string name="service_title">服务</string>
@ -303,7 +305,7 @@
<string name="preferred_player_fetcher_notification_message">正在加载请求的内容</string>
<string name="import_data_title">导入数据库</string>
<string name="export_data_title">导出数据库</string>
<string name="import_data_summary">覆盖您的当前播放历史、订阅、播放列表和(可选)设置</string>
<string name="import_data_summary">覆盖您的当前播放历史、订阅、播放列表和设置(可选)</string>
<string name="export_data_summary">导出历史记录、订阅、播放列表和设置</string>
<string name="export_complete_toast">导出成功</string>
<string name="import_complete_toast">导入成功</string>
@ -311,94 +313,95 @@
<string name="could_not_import_all_files">警告:无法导入所有文件。</string>
<string name="override_current_data">此操作会<b>覆盖当前设置</b></string>
<string name="show_info">显示信息</string>
<string name="tab_bookmarks">书签</string>
<string name="delete_stream_history_prompt">确定要从观看历史记录中删除该项吗?</string>
<string name="delete_all_history_prompt">是否确实要从历史记录中删除所有项目</string>
<string name="title_last_played">后播放</string>
<string name="title_most_played">播放最多</string>
<string name="always_ask_open_action">总是询问</string>
<string name="tab_bookmarks">收藏</string>
<string name="delete_stream_history_prompt">是否删除该条搜索记录吗?</string>
<string name="delete_all_history_prompt">是否确定删除所有历史记录</string>
<string name="title_last_played">近观看</string>
<string name="title_most_played">最多观看</string>
<string name="always_ask_open_action">每次询问</string>
<string name="create_playlist">新建播放列表</string>
<string name="delete_playlist">删除</string>
<string name="rename_playlist">重命名</string>
<string name="name">名称</string>
<string name="append_playlist">添加到播放列表</string>
<string name="set_as_playlist_thumbnail">设为播放列表缩略图</string>
<string name="set_as_playlist_thumbnail">设为播放列表封面</string>
<string name="bookmark_playlist">收藏播放列表</string>
<string name="unbookmark_playlist">删除收藏</string>
<string name="delete_playlist_prompt">删除此播放列表?</string>
<string name="delete_playlist_prompt">是否删除此播放列表?</string>
<string name="playlist_creation_success">新建播放列表成功</string>
<string name="playlist_add_stream_success">加入播放列表成功</string>
<string name="playlist_thumbnail_change_success">播放列表缩略图更改成功。</string>
<string name="playlist_thumbnail_change_success">播放列表封面更改成功。</string>
<string name="playlist_delete_failure">无法删除播放列表</string>
<string name="caption_none">无字幕</string>
<string name="resize_fit">适应屏幕</string>
<string name="resize_fill">填充屏幕</string>
<string name="resize_zoom">缩放</string>
<string name="resize_zoom">缩放画面</string>
<string name="drawer_header_action_paceholder_text">敬请期待</string>
<string name="settings_category_debug_title">调试</string>
<string name="caption_auto_generated">自动生成</string>
<string name="enable_leak_canary_summary">『内存泄漏监视』可能导致应用在『核心转储』时无响应</string>
<string name="enable_disposed_exceptions_title">报告『提前结束Android生命周期』错误</string>
<string name="enable_disposed_exceptions_summary">强制报告处理后的未送达的Activity或Fragment生命周期之外的Rx异常</string>
<string name="use_inexact_seek_title">使用快速不精确搜索</string>
<string name="use_inexact_seek_summary">粗略定位播放允许播放器以略低的精确度为代价换取更快的定位速度。此功能不适用于每隔5、15或25秒定位.</string>
<string name="auto_queue_title">自动播放下一个</string>
<string name="auto_queue_summary">当播放完非循环列表中的最后一个视频时,自动加入一个相关视频到播放列表</string>
<string name="invalid_directory">没有文件夹</string>
<string name="use_inexact_seek_title">使用快速寻址(不精确)</string>
<string name="use_inexact_seek_summary">快速寻址定位允许播放器以较低精确度为代价换取更快的寻址定位速度。此功能不适用于以5、15或25秒为隔的寻址定位.</string>
<string name="auto_queue_title">自动将“接下来”视频加入播放列表</string>
<string name="auto_queue_summary">播放完(非循环)列表中的最后一个视频后,自动将一个相关视频添加到当前播放列表</string>
<string name="invalid_directory">没有文件夹</string>
<string name="invalid_source">无相似文件/内容源</string>
<string name="invalid_file">该文件不存在 或 缺少读写文件权限</string>
<string name="invalid_file">该文件不存在 或 缺少读写文件权限</string>
<string name="file_name_empty_error">文件名不能为空</string>
<string name="error_occurred_detail">发生错误: %1$s</string>
<string name="import_export_title">导入/导出</string>
<string name="import_title">导入</string>
<string name="import_from">从...导入</string>
<string name="import_from">导入自…</string>
<string name="export_to">导出到...</string>
<string name="import_ongoing">正在导入…</string>
<string name="export_ongoing">正在导出…</string>
<string name="import_file_title">导入文件</string>
<string name="previous_export">前的导出</string>
<string name="previous_export">前的导出</string>
<string name="subscriptions_import_unsuccessful">无法导入订阅</string>
<string name="subscriptions_export_unsuccessful">无法导出订阅</string>
<string name="import_youtube_instructions">从 Google takeout 导入YouTube 订阅:
\n
\n1. 转到这个URL%1$s
\n2. 登录谷歌账
\n3. 点击“所有包含的数据”,然后点击“取消选择全部”,然后只选择“订阅”,然后点击“确定”
\n4. 点击“下一步”然后点击“创建导出”
\n5. 在“下载”按钮出现后,点击它
\n6. 从下载的takeout压缩包提取.json文件 (通常能够位于\"YouTube and YouTube Music/subscriptions/subscriptions.json\"并在此导入它</string>
\n1. 打开这个网页:%1$s;
\n2. 登录谷歌账号;
\n3.选择“YouTube 和 YouTube Music” 然后点击“已包含所有YouTube数据”然后取消全选仅选择“订阅内容”,然后点击“确定”
\n4. 点击“下一步”,可以保持默认,然后点击“创建导出作业”;
\n5. 通过所指定的方式下载takeout数据;
\n6. 从下载的takeout压缩包提取.json文件 (通常位于\"YouTube and YouTube Music/subscriptions/subscriptions.json\"然后在此导入</string>
<string name="import_soundcloud_instructions">通过输入网址或你的 ID 导入 SoundCloud 配置文件:
\n
\n1. 在浏览器中启用\"电脑模式\"(该网站不适用于移动设备)
\n2. 转到此 URL %1$s
\n3. 登录(如果需要)
\n4. 复制重定向的配置文件下载地址。</string>
<string name="import_soundcloud_instructions_hint">你的 IDsoundcloud.com/你的ID</string>
\n1. 在浏览器中启用\"电脑模式\"(该网站未适配移动设备);
\n2. 打开该网站: %1$s;
\n3. 登录(如果需要);
\n4. 复制得到的配置文件下载地址。</string>
<string name="import_soundcloud_instructions_hint">你的 ID:soundcloud.com/你的ID</string>
<string name="import_network_expensive_warning">该操作消耗大量流量,
\n
\n你想继续吗</string>
<string name="download_thumbnail_summary">关闭可防止加载缩略图,节已省数据和内存使用。(若现在更改会清除内存和储存中缓存)</string>
<string name="download_thumbnail_summary">关闭可禁止加载封面,节省流量和内存使用。(现在更改该选项将清除内存与储存中全部缓存)</string>
<string name="thumbnail_cache_wipe_complete_notice">清空图像缓存成功</string>
<string name="metadata_cache_wipe_title">清空已缓存元数据</string>
<string name="metadata_cache_wipe_summary">清空已缓存的网页数据</string>
<string name="metadata_cache_wipe_complete_notice">清空元数据缓存成功</string>
<string name="playback_speed_control">播放速度</string>
<string name="playback_speed_control">播放速度控制</string>
<string name="playback_tempo">节奏</string>
<string name="playback_pitch">音调</string>
<string name="unhook_checkbox">解除挂钩(可能导致失真)</string>
<string name="unhook_checkbox">解除音视挂钩(可能导致失真)</string>
<string name="preferred_open_action_settings_title">首选“打开”操作</string>
<string name="preferred_open_action_settings_summary">打开内容时默认操作 = %s</string>
<string name="no_streams_available_download">无可下载的串流内容</string>
<string name="preferred_open_action_settings_summary">打开内容时默认操作:- %s</string>
<string name="no_streams_available_download">无可下载的串流</string>
<string name="caption_setting_title">字幕</string>
<string name="caption_setting_description">修改播放器字幕比例和背景样式。需要重新启动应用程序才能生效。</string>
<string name="clear_views_history_summary">删除串流的播放历史和播放位置</string>
<string name="delete_view_history_alert">删除全部观看历史记录?</string>
<string name="clear_search_history_title">除搜索历史记录</string>
<string name="clear_search_history_summary">除搜索关键词的历史记录</string>
<string name="delete_search_history_alert">是否删除全部搜索历史记录?</string>
<string name="search_history_deleted">搜索历史记录已删除。</string>
<string name="caption_setting_description">修改播放器字幕比例和背景样式,重启应用生效。</string>
<string name="clear_views_history_summary">删除串流播放记录和播放位置记录</string>
<string name="delete_view_history_alert">删除全部观看记录?</string>
<string name="clear_search_history_title">空搜索记录</string>
<string name="clear_search_history_summary">空搜索记录关键词</string>
<string name="delete_search_history_alert">是否删除全部搜索记录?</string>
<string name="search_history_deleted">搜索记录已删除。</string>
<string name="app_license">NewPipe 是版权自由软件:您可以随时使用、研究共享和改进它。您可以根据自由软件基金会发布的 GNU 通用公共许可证GPLv3或由您选择的任何更高版本的许可证重新分发或修改该许可证。</string>
<string name="import_settings">是否要同时导入设置?</string>
<string name="privacy_policy_title">NewPipe隐私政策</string>
<string name="import_settings">是否要导入设置?</string>
<string name="privacy_policy_title">NewPipe 隐私政策</string>
<string name="privacy_policy_encouragement">NewPipe 项目非常重视您的隐私。因此,未经您的同意,应用程序不会收集任何数据。
\nNewPipe 的隐私政策详细解释了在发送崩溃报告时发送和存储的数据。</string>
<string name="read_privacy_policy">阅读隐私政策</string>
@ -407,25 +410,25 @@
<string name="accept">接受</string>
<string name="decline">拒绝</string>
<string name="limit_data_usage_none_description">无限制</string>
<string name="limit_mobile_data_usage_title">使用移动数据时限制分辨率</string>
<string name="limit_mobile_data_usage_title">使用移动数据播放时降低分辨率</string>
<string name="minimize_on_exit_title">退出应用时最小化</string>
<string name="minimize_on_exit_summary">从主播放器切换到其他应用时的操作 - %s</string>
<string name="skip_silence_checkbox">静音时快进</string>
<string name="playback_step">滑块[比例尺]</string>
<string name="playback_reset"> </string>
<string name="playback_step">比例调整</string>
<string name="playback_reset">重置</string>
<string name="tracks">曲目</string>
<string name="users">用户</string>
<string name="tab_choose">选择标签</string>
<string name="volume_gesture_control_title">音量手势控制</string>
<string name="volume_gesture_control_title">手势控制音量</string>
<string name="volume_gesture_control_summary">使用手势控制播放器的音量</string>
<string name="brightness_gesture_control_title">亮度手势控制</string>
<string name="brightness_gesture_control_title">手势控制亮度</string>
<string name="brightness_gesture_control_summary">使用手势控制播放器的亮度</string>
<string name="content_language_title">视频默认语言</string>
<string name="app_update_notification_channel_name">应用更新通知</string>
<string name="app_update_notification_channel_description">NewPipe有新版本的通知</string>
<string name="download_to_sdcard_error_title">外置存储不可用</string>
<string name="download_to_sdcard_error_message">无法下载到外部 SD 卡。重置下载文件夹位置?</string>
<string name="saved_tabs_invalid_json">读取已保存标签时发生错误,因此使用默认标签</string>
<string name="download_to_sdcard_error_message">无法下载到外部 SD 卡,修改下载文件夹位置?</string>
<string name="saved_tabs_invalid_json">读取已保存标签时发生错误,因此使用默认标签</string>
<string name="restore_defaults">恢复默认</string>
<string name="restore_defaults_confirmation">是否恢复默认值?</string>
<string name="selection">选择</string>
@ -434,52 +437,52 @@
<string name="auto">自动</string>
<string name="switch_view">切换视图</string>
<string name="app_update_notification_content_text">点击下载</string>
<string name="post_processing">后期处理</string>
<string name="post_processing">处理</string>
<string name="generate_unique_name">生成唯一名称</string>
<string name="overwrite">覆盖</string>
<string name="download_already_running">正在使用此名称进行下载</string>
<string name="download_already_running">已存在一进行中并使用该名称的下载任务</string>
<string name="show_error">显示错误</string>
<string name="label_code">代码</string>
<string name="error_path_creation">无法创建目标文件夹</string>
<string name="error_file_creation">无法创建文件</string>
<string name="error_permission_denied">权限被系统拒绝</string>
<string name="error_ssl_exception">安全连接失败</string>
<string name="error_ssl_exception">建立安全连接失败</string>
<string name="error_unknown_host">找不到服务器</string>
<string name="error_connect_host">无法连接服务器</string>
<string name="error_connect_host">无法连接服务器</string>
<string name="error_http_no_content">服务器未发送数据</string>
<string name="error_http_not_found">找不到 NOT FOUND</string>
<string name="error_postprocessing_failed">后期处理失败</string>
<string name="stop">停止</string>
<string name="max_retry_msg">最大重试次数</string>
<string name="max_retry_desc">取消下载前的最多重试次数</string>
<string name="pause_downloads_on_mobile">在切换到移动流量网络时中断播放</string>
<string name="pause_downloads_on_mobile_desc">切换至移动数据时可能有用,尽管一些下载无法被暂停</string>
<string name="pause_downloads_on_mobile">切换到移动流量网络后中断播放</string>
<string name="pause_downloads_on_mobile_desc">切换至移动数据时可能有用,虽然部分下载无法被暂停</string>
<string name="events">事件</string>
<string name="conferences">近期大会</string>
<string name="conferences">会议大会</string>
<string name="show_comments_title">显示评论</string>
<string name="show_comments_summary">禁用,以停止显示评论</string>
<string name="show_comments_summary">是否隐藏评论</string>
<string name="error_unable_to_load_comments">无法加载评论</string>
<string name="close">关闭</string>
<string name="enable_playback_resume_title">恢复播放</string>
<string name="enable_playback_resume_summary">恢复上次播放位置</string>
<string name="enable_playback_state_lists_title">列表中的位置</string>
<string name="enable_playback_state_lists_summary">在列表中,显示视频最后一次播放时的播放位置</string>
<string name="enable_playback_resume_summary">自动定位到上次播放时位置</string>
<string name="enable_playback_state_lists_title">显示最后一次播放位置</string>
<string name="enable_playback_state_lists_summary">在列表中,使用底端进度条显示某一视频上次播放时的播放位置</string>
<string name="watch_history_states_deleted">已删除播放位置记录。</string>
<string name="missing_file">文件已移动或删除</string>
<string name="missing_file">文件已移动或删除</string>
<string name="overwrite_unrelated_warning">该名称的文件已经存在</string>
<string name="overwrite_finished_warning">命名冲突,已存在具有此名称文件</string>
<string name="overwrite_finished_warning">命名冲突,已存在具有该名称的文件</string>
<string name="overwrite_failed">无法覆盖文件</string>
<string name="download_already_pending">有此名称的已暂停下载</string>
<string name="error_postprocessing_stopped">NewPipe 在处理文件时被关闭</string>
<string name="error_insufficient_storage">设备上没有剩余储存空间</string>
<string name="error_progress_lost">进度丢失,文件已被删除</string>
<string name="error_timeout">连接超时</string>
<string name="confirm_prompt">是否要清除下载历史记录或删除所有下载的文件?</string>
<string name="enable_queue_limit">最大下载队列</string>
<string name="enable_queue_limit_desc">时只允许一个下载进行</string>
<string name="confirm_prompt">是否清空下载记录或删除所有下载的文件?</string>
<string name="enable_queue_limit">限制下载并发数</string>
<string name="enable_queue_limit_desc">一时间内只允许进行一个下载任务</string>
<string name="start_downloads">开始下载</string>
<string name="pause_downloads">暂停下载</string>
<string name="downloads_storage_ask_title">询问下载位置</string>
<string name="downloads_storage_ask_title">总是询问下载位置</string>
<string name="downloads_storage_ask_summary">系统将询问您将每次下载的保存位置</string>
<string name="downloads_storage_ask_summary_kitkat">系统将询问您将每次下载的保存位置。
\n如果要下载到外部 SD 卡,请选择 SAF</string>
@ -488,8 +491,8 @@
\n一些设备不兼容SAF</string>
<string name="clear_playback_states_title">删除播放位置记录</string>
<string name="clear_playback_states_summary">删除所有播放位置记录</string>
<string name="delete_playback_states_alert">删除所有播放位置记录?</string>
<string name="download_choose_new_path">更改下载目录让内容生效</string>
<string name="delete_playback_states_alert">是否删除全部播放位置记录?</string>
<string name="download_choose_new_path">更改下载目录生效</string>
<string name="default_kiosk_page_summary">『时下流行』页-默认</string>
<string name="no_one_watching">没有人在观看</string>
<plurals name="watching">
@ -497,28 +500,28 @@
</plurals>
<string name="no_one_listening">没有人在听</string>
<plurals name="listening">
<item quantity="one">%s 人在听</item>
<item quantity="one">%s 位听众</item>
<item quantity="other"/>
</plurals>
<string name="localization_changes_requires_app_restart">重新启动应用后,语言将更改</string>
<string name="localization_changes_requires_app_restart">语言更改将在重启应用后生效</string>
<string name="peertube_instance_url_title">PeerTube 服务器</string>
<string name="peertube_instance_url_summary">设置自己喜欢的PeerTube服务器</string>
<string name="peertube_instance_url_help">查找最适合你的服务器%s</string>
<string name="peertube_instance_url_summary">设置自定义PeerTube服务器</string>
<string name="peertube_instance_url_help">查找你需要的服务器%s</string>
<string name="peertube_instance_add_title">添加服务器</string>
<string name="peertube_instance_add_help">输入服务器网址(URL)</string>
<string name="peertube_instance_add_fail">无法验证服务器</string>
<string name="peertube_instance_add_https_only">仅支持 HTTPSURL</string>
<string name="peertube_instance_add_https_only">仅支持 HTTPS URL</string>
<string name="peertube_instance_add_exists">该服务器已存在</string>
<string name="local">本地</string>
<string name="recently_added">最近添加</string>
<string name="most_liked">喜欢的</string>
<string name="playlist_no_uploader">自动生成的(找到上传者)</string>
<string name="most_liked">受欢迎</string>
<string name="playlist_no_uploader">自动生成的(找到上传者)</string>
<string name="recovering">正在恢复</string>
<string name="error_download_resource_gone">无法恢复此下载</string>
<string name="choose_instance_prompt">选择一个服务器</string>
<string name="seek_duration_title">快进 / 快退的单位时间</string>
<string name="clear_download_history">除下载历史记录</string>
<string name="delete_downloaded_files">删除下载文件</string>
<string name="seek_duration_title">快进 / 快退的寻址定位时间间隔</string>
<string name="clear_download_history">空下载记录</string>
<string name="delete_downloaded_files">删除下载文件</string>
<string name="deleted_downloads">已删除 %1$d 下载</string>
<string name="permission_display_over_apps">授予在其他应用上层显示的权限</string>
<string name="app_language_title">Newpipe应用语言</string>
@ -529,7 +532,7 @@
<plurals name="seconds">
<item quantity="other">%d秒</item>
</plurals>
<string name="new_seek_duration_toast">由于ExoPlayer的限制寻间隔置为%d秒</string>
<string name="new_seek_duration_toast">由于ExoPlayer的限制间隔置为%d秒</string>
<string name="mute">静音</string>
<string name="unmute">取消静音</string>
<string name="help">帮助</string>
@ -548,37 +551,38 @@
<string name="feed_notification_loading">正在加载feed…</string>
<string name="feed_processing_message">正在处理feed…</string>
<string name="feed_group_dialog_select_subscriptions">选择订阅</string>
<string name="feed_group_dialog_empty_selection">未选中订阅</string>
<string name="feed_group_dialog_empty_selection">未选中任何订阅</string>
<plurals name="feed_group_dialog_selection_count">
<item quantity="other">已选中%d</item>
</plurals>
<string name="feed_group_dialog_empty_name">组名为空</string>
<string name="feed_group_dialog_empty_name">清空组名</string>
<string name="feed_group_dialog_delete_message">您要删除该组吗?</string>
<string name="feed_create_new_group_button_title">新建</string>
<string name="settings_category_feed_title">订阅</string>
<string name="settings_category_feed_title">Feed</string>
<string name="feed_update_threshold_title">Feed更新阈值</string>
<string name="feed_update_threshold_summary">上次更新后,订阅被视为过的时间-%s</string>
<string name="feed_update_threshold_summary">上次更新后,订阅被视为过的时间-%s</string>
<string name="feed_update_threshold_option_always_update">始终更新</string>
<string name="feed_use_dedicated_fetch_method_title">可用时专用feed获取</string>
<string name="feed_use_dedicated_fetch_method_summary">在某些服务中可用,通常速度要快得多,但可能返回的条目数量有限,而且信息通常不完整(例如,没有持续时间,条目类型,没有实时状态)。</string>
<string name="feed_use_dedicated_fetch_method_title">可用时使用专用feed获取</string>
<string name="feed_use_dedicated_fetch_method_summary">仅在某些服务中可用,通常速度更快,但返回的视频数量可能有限,而且信息通常不完整(如,无视频持续时间、类型与没有直播状态)。</string>
<string name="feed_use_dedicated_fetch_method_enable_button">启用快速模式</string>
<string name="feed_use_dedicated_fetch_method_disable_button">禁用快速模式</string>
<string name="feed_use_dedicated_fetch_method_help_text">您是否认为Feed加载太慢如果是这样请尝试启用快速加载您可以在设置中更改它也可以按下面的按钮更改它)。
<string name="feed_use_dedicated_fetch_method_help_text">您是否觉得Feed加载太慢如果是这样请尝试启用快速加载可在设置中修改也可使用下面的按钮修改)。
\n
\nNewPipe提供两种feed加载策略:
\n•获取整个订阅频道很慢但是很完整。
\n•使用专用的服务端点这样会比较快但通常不完整。
\n•获取整个订阅频道很慢但是很完整。
\n•使用专用的服务端点比较快但通常不完整。
\n
\n两者之间的区别在于后者通常缺少一些信息例如条目的持续时间或类型(无法区分直播视频和普通视频),并且可能返回更少的条目。
\n两者之间的区别在于后者通常缺少一些信息如视频的持续时间或类型(无法区分直播视频和普通视频),并且可能返回更少的视频条目。
\n
\nYouTube是一个通过其RSS feed提供这种快速方法的服务示例。
\nYouTube是一个通过其RSS feed提供快速方法的服务示例。
\n
\n因此选择哪种方式取决于您更看重什么是速度还是精确的信息。</string>
\n因此选择哪种方式取决于您的偏好
\n加载速度还是信息准确。</string>
<string name="content_not_supported">NewPipe尚不支持该内容。
\n
\n
\n也许未来版本会支持它。</string>
<string name="infinite_videos">∞ 视频</string>
<string name="infinite_videos">视频</string>
<string name="more_than_100_videos">100+部视频</string>
<string name="artists">艺术家</string>
<string name="albums">专辑</string>
@ -590,54 +594,57 @@
<string name="channel_created_by">由%s创建</string>
<string name="detail_sub_channel_thumbnail_view_description">频道的头像缩略图</string>
<string name="remove_watched_popup_yes_and_partially_watched_videos">是的,包括没看完的视频</string>
<string name="remove_watched_popup_warning">已经看过且在之后被加入播放列表的视频将被除。
\n您确定吗不能被撤消!</string>
<string name="remove_watched_popup_warning">已经看过且在之后被加入播放列表的视频将被除。
\n您确定吗操作不能被撤消!</string>
<string name="remove_watched_popup_title">移除看过的视频?</string>
<string name="remove_watched">移除看过的视频</string>
<string name="show_original_time_ago_summary">来自服务的原始文本将在流项目中可见</string>
<string name="show_original_time_ago_title">在项目上显示原始时间</string>
<string name="show_original_time_ago_summary">来自服务的原始文本将在流项目中可见</string>
<string name="show_original_time_ago_title">显示原始时间</string>
<string name="youtube_restricted_mode_enabled_title">打开YouTube\"受限模式\"</string>
<string name="feed_group_show_only_ungrouped_subscriptions">仅显示未分组订阅</string>
<string name="playlist_page_summary">播放列表页</string>
<string name="no_playlist_bookmarked_yet">尚无播放列表书签</string>
<string name="no_playlist_bookmarked_yet">尚无收藏</string>
<string name="select_a_playlist">选择播放列表</string>
<string name="error_report_open_github_notice">请检查您的问题是否已经存在。创建重复票证时您需要从我们那里花些时间来让我们修复真正的bug。</string>
<string name="error_report_open_issue_button_text">在GitHub上反馈</string>
<string name="copy_for_github">复制格式报告</string>
<string name="copy_for_github">复制已整理的报告</string>
<string name="search_showing_result_for">显示结果为:%s</string>
<string name="never"></string>
<string name="never"></string>
<string name="wifi_only">仅在Wi-Fi下</string>
<string name="autoplay_summary">自动开始回放 — %s</string>
<string name="title_activity_play_queue">播放</string>
<string name="unsupported_url_dialog_message">无法识别该url。用另一个应用程序打开它\?</string>
<string name="auto_queue_toggle">自动排队</string>
<string name="clear_queue_confirmation_description">来自活跃播放器的队列将被替换</string>
<string name="clear_queue_confirmation_summary">从一个播放器切换到另一个播放器后,你的队列可能会被替换</string>
<string name="clear_queue_confirmation_title">除队列之前请求确认</string>
<string name="autoplay_summary">视频开始播放后,自动定位到上次播放时的位置 — %s</string>
<string name="title_activity_play_queue">播放列</string>
<string name="unsupported_url_dialog_message">无法识别该URL用其他应用打开\?</string>
<string name="auto_queue_toggle">自动加入播放列表</string>
<string name="clear_queue_confirmation_description">活跃播放列将被替换</string>
<string name="clear_queue_confirmation_summary">从一个播放器切换到另一个播放器后,你的播放列表可能会被替换</string>
<string name="clear_queue_confirmation_title">空播放列表前再次确认</string>
<string name="notification_action_nothing"></string>
<string name="notification_action_buffering">缓冲</string>
<string name="notification_action_shuffle">随机播放</string>
<string name="notification_action_repeat">重复</string>
<string name="notification_actions_at_most_three">您最多可以选择三个操作显示在紧凑通知中!</string>
<string name="notification_actions_summary">点击来编辑下面的每个通知动作。通过使用右边的复选框,选择其中最多三个显示在紧凑通知中</string>
<string name="notification_actions_at_most_three">您最多可以选择显示在紧凑通知中的三个操作选项!</string>
<string name="notification_actions_summary">点击编辑下面的每个通知动作。使用右方的复选框,选择显示在紧凑通知中的动作,最多三个</string>
<string name="notification_action_4_title">第五操作按钮</string>
<string name="notification_action_3_title">第四操作按钮</string>
<string name="notification_action_2_title">第三操作按钮</string>
<string name="notification_action_1_title">第二操作按钮</string>
<string name="notification_action_0_title">首选操作按钮</string>
<string name="notification_scale_to_square_image_summary">将通知中显示的视频缩略图长宽比从16:9缩放到1:1(可能导致失真)</string>
<string name="notification_scale_to_square_image_title">缩放缩略图到1:1的长宽比</string>
<string name="notification_action_0_title">第一操作按钮</string>
<string name="notification_scale_to_square_image_summary">将通知中视频缩略图长宽比从16:9强制缩放到1:1(可能导致失真)</string>
<string name="notification_scale_to_square_image_title">强制缩放缩略图至1:1比例</string>
<string name="settings_category_notification_title">通知</string>
<string name="show_memory_leaks">显示内存泄漏</string>
<string name="enqueued">已加入队列</string>
<string name="enqueue_stream">加入队列</string>
<string name="clear_cookie_summary">理你在解决验证码时 NewPipe 存储的cookies</string>
<string name="recaptcha_cookies_cleared">reCAPTCHA cookies 已被清</string>
<string name="clear_cookie_title"> reCAPTCHA cookies</string>
<string name="youtube_restricted_mode_enabled_summary">YouTube提供了一个“受限模式”,会隐藏潜在的成人内容</string>
<string name="clear_cookie_summary">空本地存储的reCAPTCHA验证码相关cookies</string>
<string name="recaptcha_cookies_cleared">reCAPTCHA cookies 已被清</string>
<string name="clear_cookie_title"> reCAPTCHA cookies</string>
<string name="youtube_restricted_mode_enabled_summary">YouTube提供了“受限模式”,将隐藏潜在的成人内容</string>
<string name="show_age_restricted_content_summary">展示可能不适合儿童观看的内容,因为有年龄限制(比如18岁以上)</string>
<string name="notification_colorize_summary">安卓系统根据视频缩略图的主色彩自定义通知的颜色(注意,该特性并非在所有设备上都可用)</string>
<string name="notification_colorize_title">对通知着色</string>
<string name="show_thumbnail_summary">在锁定屏幕上显示缩略图为背景和内部通知</string>
<string name="notification_colorize_summary">Android系统根据视频缩略图的主色彩自主决定通知颜色注意该特性仅在部分设备上可用)</string>
<string name="notification_colorize_title">自动着色通知</string>
<string name="show_thumbnail_summary">锁屏背景和通知中使用缩略图</string>
<string name="show_thumbnail_title">显示缩略图</string>
<string name="hash_channel_name">视频哈希值计算通知</string>
<string name="hash_channel_description">视频正在哈希值计算时显示的通知</string>
<string name="msg_calculating_hash">计算哈希值中</string>
</resources>

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="main_bg_subtitle">Націсніце \"Пошук\", каб пачаць</string>
<string name="main_bg_subtitle">Націсніце \"Пошук\", каб пачаць
\n</string>
<string name="view_count_text">%1$s праглядаў</string>
<string name="upload_date_text">Апублікавана %1$s</string>
<string name="no_player_found">Патокавы плэер не знойдзены. Усталяваць VLC?</string>
@ -36,11 +37,11 @@
<string name="controls_popup_title">У акне</string>
<string name="controls_add_to_playlist_title">Дадаць да</string>
<string name="download_path_title">Каталог для спампаванага відэа</string>
<string name="download_path_summary">Папка для захоўвання загружаных відэа</string>
<string name="download_path_dialog_title">Увядзіце шлях да папкі для загрузкі відэа</string>
<string name="download_path_summary">Папка для спампаванга відэа</string>
<string name="download_path_dialog_title">Увядзіце шлях да папкі для спампавання відэа</string>
<string name="download_path_audio_title">Тэчка загрузкі аўдыё</string>
<string name="download_path_audio_summary">Сюды захоўваецца загружанае аўдыё</string>
<string name="download_path_audio_dialog_title">Увядзіце шлях да папкі для загрузкі аўдыё</string>
<string name="download_path_audio_summary">Папка для спампаванага аўдыя</string>
<string name="download_path_audio_dialog_title">Увядзіце шлях да папкі для спампавання аўдыя</string>
<string name="autoplay_by_calling_app_title">Аўтапрайграванне</string>
<string name="autoplay_by_calling_app_summary">Прайграваць відэа пры выкліку NewPipe з іншага прыкладання</string>
<string name="default_resolution_title">Разрознянне па змаўчанні</string>
@ -61,7 +62,7 @@
<string name="popup_remember_size_pos_title">Аднавіць акно</string>
<string name="popup_remember_size_pos_summary">Запамінаць памер і становішча ўсплываючага акна</string>
<string name="use_inexact_seek_title">Хуткі пошук пазіцыі</string>
<string name="use_inexact_seek_summary">Недакладны пошук дазваляе плэеру шукаць пазіцыю хутчэй, але менш дакладна</string>
<string name="use_inexact_seek_summary">Недакладны пошук дазваляе плэеру шукаць пазіцыю хутчэй, але менш дакладна. Не працуе для перамоткі на 5, 15 ці 25 секунд</string>
<string name="download_thumbnail_title">Загружаць мініяцюры</string>
<string name="download_thumbnail_summary">Адключыце, каб не загружаць мініяцюры і зэканоміць трафік і памяць. Змена налады ачысьціць кэш малюнкаў</string>
<string name="thumbnail_cache_wipe_complete_notice">Кэш малюнкаў ачышчаны</string>
@ -556,4 +557,7 @@
<string name="notification_action_repeat">Паўтор</string>
<string name="notification_action_4_title">Кнопка пятага дзеяння</string>
<string name="settings_category_notification_title">Паведамленні</string>
<string name="notification_colorize_summary">Афарбоўваць апавяшчэнне асноўным колерам мініяцюры. Падтрымваецца не ўсімі прыладамі</string>
<string name="notification_actions_at_most_three">У кампактным апавяшчэнні дасяжна не больш за тры дзеянні!</string>
<string name="notification_actions_summary">Дзеянні можна змяніць, націснуўшы на іх. Адзначце не больш за трох для адлюстравання ў кампактным апавяшчэнні</string>
</resources>

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="main_bg_subtitle">Докоснете търсачката, за да започнете</string>
<string name="main_bg_subtitle">Докоснете търсачката, за да започнете
\n</string>
<string name="view_count_text">%1$s гледания</string>
<string name="upload_date_text">Публикувано на %1$s</string>
<string name="no_player_found">Не е намерен стрийм плейър. Желаете ли да инсталирате VLC?</string>
@ -12,12 +13,12 @@
<string name="download">Изтегли</string>
<string name="search">Търси</string>
<string name="settings">Настройки</string>
<string name="did_you_mean">Може би имахте в предвид: %1$s\?</string>
<string name="did_you_mean">Може би имахте предвид %1$s\?</string>
<string name="share_dialog_title">Сподели с</string>
<string name="choose_browser">Избери браузър</string>
<string name="screen_rotation">ориентация</string>
<string name="use_external_video_player_title">Използвай външен видео плейър</string>
<string name="use_external_video_player_summary">Премахва аудио при НЯКОИ резолюции</string>
<string name="use_external_video_player_summary">Премахва аудиото при някои резолюции</string>
<string name="use_external_audio_player_title">Използвай външен аудио плейър</string>
<string name="popup_mode_share_menu_title">NewPipe в прозорец</string>
<string name="subscribe_button_title">Абониране</string>
@ -34,13 +35,13 @@
<string name="download_path_dialog_title">Въведете път за съхранение на изтеглените видеота</string>
<string name="download_path_audio_title">Директория за изтегляне на аудио</string>
<string name="download_path_audio_summary">Папка за съхранение на изтеглено аудио</string>
<string name="download_path_audio_dialog_title">Въведете път за съхранение на изтеглено аудио</string>
<string name="download_path_audio_dialog_title">Въведете папка за изтегляния на аудио файлове</string>
<string name="autoplay_by_calling_app_title">Автоматично възпроизвеждане</string>
<string name="autoplay_by_calling_app_summary">Въпроизвежда видео, когато NewPipe е повикан от друго приложение</string>
<string name="default_resolution_title">Резолюция по подразбиране</string>
<string name="default_popup_resolution_title">Резолюция по подразбиране на прозореца</string>
<string name="show_higher_resolutions_title">Покажи по-високи резолюции</string>
<string name="show_higher_resolutions_summary">Само някои устройства поддържат възпроизвеждане на 2K/4K клипове</string>
<string name="show_higher_resolutions_summary">Само някои устройства могат да възпроизвеждат 2K/4K видео</string>
<string name="play_with_kodi_title">Въпроизвеждане с Kodi</string>
<string name="kore_not_found">Приложението „Kore“ не е намерено. Желаете ли да го инсталирате?</string>
<string name="show_play_with_kodi_title">Покажи „Възпроизвеждане с Kodi“</string>
@ -408,4 +409,16 @@
<string name="enable_playback_resume_title">Продължи възпроизвеждане</string>
<string name="settings_category_clear_data_title">Изтрии данни</string>
<string name="search_showing_result_for">Показване на резултати за: %s</string>
<string name="no_comments">Няма коментари</string>
<plurals name="listening">
<item quantity="one">%s слушател</item>
<item quantity="other">%s слушатели</item>
</plurals>
<string name="no_one_listening">Няма слушатели</string>
<plurals name="watching">
<item quantity="one">%s зрител</item>
<item quantity="other">%s зрители</item>
</plurals>
<string name="no_one_watching">Няма зрители</string>
<string name="clear_playback_states_summary">Изтрива всички позиции на възпроизвеждане</string>
</resources>

View file

@ -437,7 +437,7 @@
<string name="import_file_title">ফাইল আমদানি করো</string>
<string name="export_to">রপ্তানি করো</string>
<string name="import_from">আমদানি করো</string>
<string name="bookmark_playlist">বুকমার্ক প্লেলিস্ট</string>
<string name="bookmark_playlist">প্লেলিস্ট বুকমার্ক করো</string>
<string name="preferred_player_fetcher_notification_title">তথ্য আনা হচ্ছে…</string>
<string name="popup_player">পপআপ প্লেয়ার</string>
<string name="background_player">পটভূমি প্লেয়ার</string>
@ -476,4 +476,17 @@
<string name="systems_language">সিস্টেম ডিফল্ট</string>
<string name="downloads_storage_use_saf_title">সাফ ব্যবহার করো</string>
<string name="notification_colorize_title">বিজ্ঞপ্তি রঙিন করো</string>
<plurals name="days">
<item quantity="one">%d দিন</item>
<item quantity="other">%d দিন</item>
</plurals>
<plurals name="hours">
<item quantity="one">%d ঘন্টা</item>
<item quantity="other">%d ঘন্টা</item>
</plurals>
<plurals name="minutes">
<item quantity="one">%d মিনিট</item>
<item quantity="other">%d মিনিট</item>
</plurals>
<string name="max_retry_msg">সর্বোচ্চ চেয্টা</string>
</resources>

View file

@ -657,6 +657,6 @@
<string name="show_age_restricted_content_summary">Zobrazit obsah, i když je patrně nevhodný pro děti, protože odkazuje na věkové omezení (např. 18+)</string>
<string name="notification_colorize_summary">Nechte Android přizpůsobit barvu oznámení podle hlavní barvy v miniatuře (není k dispozici na všech zařízeních)</string>
<string name="notification_colorize_title">Barevné notifikace</string>
<string name="show_thumbnail_summary">Zobrazit miniaturu na zamknuté obrazovce jako pozadí a v oznámeních</string>
<string name="show_thumbnail_summary">Použít miniaturu pro pozadí zamknuté obrazovky a oznámení</string>
<string name="show_thumbnail_title">Zobrazit miniaturu</string>
</resources>

View file

@ -105,7 +105,7 @@
<string name="msg_server_unsupported">Nicht unterstützter Server</string>
<string name="could_not_load_image">Konnte Bild nicht laden</string>
<string name="app_ui_crash">App/UI abgestürzt</string>
<string name="msg_threads">Threads</string>
<string name="msg_threads">Themen</string>
<string name="msg_running">NewPipe lädt herunter</string>
<string name="msg_running_detail">Für Details antippen</string>
<string name="msg_url_malform">Ungültige URL oder Internet nicht verfügbar</string>
@ -317,7 +317,7 @@
\nMöchtest du fortfahren\?</string>
<string name="download_thumbnail_title">Vorschaubilder laden</string>
<string name="thumbnail_cache_wipe_complete_notice">Bilder-Cache gelöscht</string>
<string name="metadata_cache_wipe_title">Zwischengespeicherte Metadaten löschen</string>
<string name="metadata_cache_wipe_title">Zwischengespeicherte (Metadaten) löschen</string>
<string name="metadata_cache_wipe_summary">Alle zwischengespeicherten Website-Daten entfernen</string>
<string name="metadata_cache_wipe_complete_notice">Metadatencache gelöscht</string>
<string name="settings_category_debug_title">Debug</string>
@ -636,7 +636,7 @@
<string name="auto_queue_toggle">Automatische Warteschlange</string>
<string name="clear_queue_confirmation_summary">Den Player zu wechseln könnte deine Warteschlange überschreiben</string>
<string name="clear_queue_confirmation_title">Bestätige das Leeren der Warteschlange</string>
<string name="clear_queue_confirmation_description">Die aktive Wiedergabeliste wird ersetzt werden</string>
<string name="clear_queue_confirmation_description">Die aktive Player-Warteschlange wird ersetzt</string>
<string name="enqueued">Eingereiht</string>
<string name="youtube_restricted_mode_enabled_summary">YouTube bietet einen „Eingeschränkten Modus“, der potenzielle Inhalte für Erwachsene ausblendet</string>
<string name="show_memory_leaks">Speicherlecks anzeigen</string>
@ -644,9 +644,12 @@
<string name="recaptcha_cookies_cleared">reCAPTCHA-Cookies wurden gelöscht</string>
<string name="clear_cookie_title">reCAPTCHA-Cookies löschen</string>
<string name="show_age_restricted_content_summary">Zeige altersbeschränkte Inhalte (bspw. 18+), welche möglicherweise unpassend für Kinder sein könnten</string>
<string name="enqueue_stream">Wiedergabe einreihen</string>
<string name="enqueue_stream">In Wiedergabe einreihen</string>
<string name="notification_colorize_summary">Android kann die Farbe der Benachrichtigung entsprechend der Hauptfarbe in der Miniaturansicht anpassen (beachte, dass dies nicht auf allen Geräten verfügbar ist)</string>
<string name="notification_colorize_title">Benachrichtigung farblich anpassen</string>
<string name="show_thumbnail_summary">Vorschaubild auf dem Sperrbildschirm als Hintergrund und innerhalb von Benachrichtigungen anzeigen</string>
<string name="show_thumbnail_summary">Vorschaubild für Sperrbildschirmhintergrund und Benachrichtigungen verwenden</string>
<string name="show_thumbnail_title">Vorschaubild anzeigen</string>
<string name="msg_calculating_hash">Hash wird berechnet</string>
<string name="hash_channel_description">Benachrichtigungen für den Video-hashing Fortschritt</string>
<string name="hash_channel_name">Video Hash Benachrichtigung</string>
</resources>

View file

@ -108,7 +108,7 @@
<string name="default_popup_resolution_title">Προεπιλεγμένη ανάλυση αναδυόμενου παραθύρου</string>
<string name="show_higher_resolutions_title">Εμφάνιση υψηλότερων αναλύσεων</string>
<string name="default_video_format_title">Προεπιλεγμένη μορφή βίντεο</string>
<string name="popup_remember_size_pos_title">Ενθύμιση τις ιδιότητες του αναδυόμενου παραθύρου</string>
<string name="popup_remember_size_pos_title">Ενθύμιση ιδιοτήτωναναδυόμενου παραθύρου</string>
<string name="popup_remember_size_pos_summary">Ενθύμιση του τελευταίου μεγέθους και θέσης του παραθύρου</string>
<string name="use_inexact_seek_title">Χρήση γρήγορης ανακριβούς αναζήτησης</string>
<string name="use_inexact_seek_summary">Η μην ακριβής αναζήτηση επιτρέπει στην εφαρμογή να αναζητεί θέσεις στο βίντεο γρηγορότερα με μειωμένη ακρίβεια. Δε λειτουργεί για διαστήματα των 5, 15 ή 25 δευτερολέπτων.</string>
@ -168,8 +168,8 @@
<string name="switch_to_main">Αλλαγή σε Κύριο</string>
<string name="import_data_title">Εισαγωγή βάσης δεδομένων</string>
<string name="export_data_title">Εξαγωγή βάσης δεδομένων</string>
<string name="import_data_summary">Παρακάμπτει το τρέχον ιστορικό και τις εγγραφές σας</string>
<string name="export_data_summary">Εξαγωγή ιστορικού, εγγραφών και λιστών αναπαραγωγής</string>
<string name="import_data_summary">Παρακάμπτει το τρέχον ιστορικό, εγγραφές, λίστες αναπαραγωγής και (προαιρετικά) σας</string>
<string name="export_data_summary">Εξαγωγή ιστορικού, εγγραφών, λιστών αναπαραγωγής και</string>
<string name="clear_views_history_title">Εκκαθάριση ιστορικού προβολής</string>
<string name="clear_views_history_summary">Διαγράφει το ιστορικό των αναπαραχθέντων ροών και των θέσεων αναπαραγωγής</string>
<string name="delete_view_history_alert">Διαγραφή ολόκληρου του ιστορικού προβολής;</string>
@ -592,7 +592,7 @@
<item quantity="other">%d επιλέχθηκαν</item>
</plurals>
<string name="feed_subscription_not_loaded_count">Δεν φορτώθηκε: %d</string>
<string name="feed_groups_header_title">Οι ομάδες του καναλιού</string>
<string name="feed_groups_header_title">Ομάδες καναλιών</string>
<plurals name="days">
<item quantity="one">%d ημέρα</item>
<item quantity="other">%d ημέρες</item>
@ -645,6 +645,9 @@
<string name="peertube_instance_url_title">PeerTube instances</string>
<string name="notification_colorize_title">Χρωματισμός ειδοποιήσεων</string>
<string name="notification_colorize_summary">Επιτρέπει στο Android να τροποποιήσει το χρώμα της ειδοποίησης, σύμφωνα με το κύριο χρώμα του εικονιδίου (δεν διατίθεται σε όλες τις συσκευές)</string>
<string name="show_thumbnail_summary">Εμφάνιση των εικονιδίων στην οθόνη κλειδώματος, ως φόντο και στις ειδοποιήσεις</string>
<string name="show_thumbnail_summary">Χρήση των εικονιδίων στην οθόνη κλειδώματοςως φόντο και στις ειδοποιήσεις</string>
<string name="show_thumbnail_title">Εμφάνιση</string>
<string name="msg_calculating_hash">Υπολογισμός hash</string>
<string name="hash_channel_description">Ειδοποιήσεις για πρόοδο βίντεο hashing</string>
<string name="hash_channel_name">Ειδοποίηση βίντεο hash</string>
</resources>

View file

@ -650,6 +650,6 @@
<string name="youtube_restricted_mode_enabled_summary">YouTube provee un «Modo restringido», el cual oculta contenido potencialmente sólo apto para adultos</string>
<string name="notification_colorize_title">Ajustar color de notificación</string>
<string name="notification_colorize_summary">Permitir a Android personalizar el color de la notificación con el color principal de la imagen (ten en cuenta que esta opción no funciona en todos los dispositivos)</string>
<string name="show_thumbnail_summary">Mostrar miniatura como fondo de pantalla de bloqueo y dentro de notificaciones</string>
<string name="show_thumbnail_summary">Usar miniatura como fondo de pantalla de bloqueo y notificaciones</string>
<string name="show_thumbnail_title">Mostrar vista previa</string>
</resources>

View file

@ -278,8 +278,8 @@
<string name="file">Fitxategia</string>
<string name="import_data_title">Inportatu datu-basea</string>
<string name="export_data_title">Esportatu datu-basea</string>
<string name="import_data_summary">Zure uneko historiala eta harpidetzak gainidazten ditu</string>
<string name="export_data_summary">Esportatu historiala, harpidetzak eta erreprodukzio-zerrendak</string>
<string name="import_data_summary">Zure uneko historiala, harpidetzak eta (aukeran) ezarpenak gainidazten ditu</string>
<string name="export_data_summary">Esportatu historiala, harpidetzak, erreprodukzio-zerrendak eta ezarpenak</string>
<string name="clear_views_history_title">Garbitu ikusitakoaren historiala</string>
<string name="clear_views_history_summary">Jotako jarioen historiala eta erreprodukzio puntuak ezabatzen ditu</string>
<string name="delete_view_history_alert">Ezabatu ikusitakoaren historia osoa\?</string>
@ -647,6 +647,9 @@
<string name="notification_actions_summary">Editatu beheko jakinarazpen ekintza bakoitza gainean sakatuz. Hautatu horietako hiru gehienez jakinarazpen trinkoan erakusteko eskuineko kontrol laukiak erabiliz.</string>
<string name="notification_colorize_summary">Androidek miniaturako kolore nagusiaren arabera jakinarazpenaren kolorea pertsonalizatzea baimendu (kontuan izan ez dagoela gailu guztietan erabilgarri)</string>
<string name="notification_colorize_title">Koloreztatu jakinarazpena</string>
<string name="show_thumbnail_summary">Erakutsi miniatura blokeo pantailan atzeko planoko eta barruko jakinarazpen bezala</string>
<string name="show_thumbnail_summary">Erabili miniatura blokeo pantaila eta jakinarazpenentzako</string>
<string name="show_thumbnail_title">Erakutsi miniatura</string>
<string name="hash_channel_description">Jakinarazpenak bideoen hashing egoerarako</string>
<string name="hash_channel_name">Bideo hash jakinarazpena</string>
<string name="msg_calculating_hash">Hash-a kalkulatzen</string>
</resources>

View file

@ -156,7 +156,7 @@
<string name="pause">Tauota</string>
<string name="view">Toista</string>
<string name="delete">Poista</string>
<string name="checksum">Tarkistus-suma</string>
<string name="checksum">Tarkistussumma</string>
<string name="add">Uusi tehtävä</string>
<string name="finish">OK</string>
<string name="msg_name">Tiedostonimi</string>
@ -272,8 +272,8 @@
<string name="switch_to_main">Vaihda normaalitoistoon</string>
<string name="import_data_title">Tuo tietokanta</string>
<string name="export_data_title">Vie tietokanta</string>
<string name="import_data_summary">Kirjoittaa yli tämänhetkisen historian ja tilaukset</string>
<string name="export_data_summary">Vie historia, tilaukset tai soittolistat</string>
<string name="import_data_summary">Ylikirjoittaa tämänhetkisen historian, tilaukset, soittolistat ja (vaihtoehtoisesti) asetukset</string>
<string name="export_data_summary">Vie historia, tilaukset, soittolistat ja asetukset</string>
<string name="clear_views_history_title">Poista katseluhistoria</string>
<string name="clear_views_history_summary">Poistaa toistohistorian ja toistokohdat</string>
<string name="delete_view_history_alert">Poista koko katseluhistoria\?</string>
@ -647,4 +647,7 @@
<string name="show_age_restricted_content_summary">Näytä mahdollisesti lapsille sopimaton sisältö, jolla on ikäraja (esim. 18+)</string>
<string name="notification_colorize_summary">Anna Androidin muokata ilmoituksen väriä esikatselukuvan päävärin mukaan (tämä ei ole mahdollista kaikilla laitteilla)</string>
<string name="notification_colorize_title">Käytä värejä ilmoituksessa</string>
<string name="show_thumbnail_summary">Käytä esikatselukuvaa lukitusruudun ja ilmoitusten taustakuvana</string>
<string name="show_thumbnail_title">Näytä esikatselukuva</string>
<string name="msg_calculating_hash">Lasketaan</string>
</resources>

View file

@ -650,5 +650,5 @@
<string name="notification_colorize_title">Notification colorée</string>
<string name="notification_colorize_summary">Demander à Android de personnaliser la couleur de la notification en fonction de la couleur principale de la miniature (noter que cela nest pas disponible sur tous les appareils)</string>
<string name="show_thumbnail_title">Afficher la miniature</string>
<string name="show_thumbnail_summary">Afficher la miniature en arrière-plan de lécran de verrouillage et dans les notifications</string>
<string name="show_thumbnail_summary">Utiliser la miniature pour l\'arrière-plan de lécran de verrouillage et les notifications</string>
</resources>

View file

@ -667,6 +667,9 @@
<string name="show_age_restricted_content_summary">הצגת תוכן שעלול להיות בלתי הולם לילדים עקב מגבלת גיל (כגון 18+)</string>
<string name="notification_colorize_summary">לאפשר ל־Android להתאים את צבע ההתראה בהתאם לצבע העיקרי של התמונה הממוזערת (לא זמין בכל המכשירים)</string>
<string name="notification_colorize_title">צביעת ההתראה</string>
<string name="show_thumbnail_summary">הצגת תמונה ממוזערת על מסך הנעילה כרקע ובתוך ההתראות</string>
<string name="show_thumbnail_summary">להשתמש בתמונה ממוזערת גם כרקע מסך הנעילה וגם בהתראות</string>
<string name="show_thumbnail_title">הצגת תמונה ממוזערת</string>
<string name="msg_calculating_hash">הגיבוב</string>
<string name="hash_channel_description">התראות על תהליכי גיבוב</string>
<string name="hash_channel_name">התראת גיבוב סרטון</string>
</resources>

View file

@ -148,7 +148,7 @@
<string name="msg_running_detail">Dodirni za detalje</string>
<string name="msg_wait">Molimo pričekajte…</string>
<string name="msg_copied">Kopirano u međuspremnik</string>
<string name="no_available_dir">Kasnije odredite mapu za preuzimanje u postavkama</string>
<string name="no_available_dir">Molimo kasnije u postavkama odaberite mapu za preuzimanje</string>
<string name="msg_popup_permission">Ova dozvola je potrebna za
\notvaranje skočnog prozora</string>
<string name="title_activity_recaptcha">reCAPTCHA zadatak</string>
@ -335,11 +335,14 @@
<string name="previous_export">Prethodni izvozi</string>
<string name="subscriptions_import_unsuccessful">Nije moguće uvesti pretplatnike</string>
<string name="subscriptions_export_unsuccessful">Nije moguće izvesti pretplatnike</string>
<string name="import_youtube_instructions">Uvezite YouTube pretplatnike preuzimanjem izvozne datoteke:
<string name="import_youtube_instructions">Uvezite YouTube pretplatnike preuzimanjem izvozne datoteke Google-a:
\n
\n1. Idite na ovaj URL: %1$s
\n2. Ulogirajte se
\n3. Preuzimanje bi trebalo početi (to je izvozna datoteka)</string>
\n2. Prijavite se
\n3. Kliknite \"Uključeni svi podaci\", zatim \"Poništi odabir svih\", a zatim odaberite samo \"pretplate\" i kliknite \"U redu\"
\n4. Kliknite na \"Nastavi\", a zatim \"Stvori izvoz\"
\n5. Kliknite na \"Preuzmi\"
\n6. Preuzmite zip datoteku i izvucite json datoteku (pod \"YouTube and YouTube Music/subscriptions/subscriptions.json\") pa uvezite je ovdje</string>
<string name="import_soundcloud_instructions_hint">vašID, soundcloud.com/vašID</string>
<string name="import_network_expensive_warning">Uzmite u obzir da ova operacija može uzrokovat veliku potrošnju prometa.
\n
@ -487,7 +490,7 @@
<string name="peertube_instance_add_https_only">Podržani su samo HTTP URL-ovi</string>
<string name="local">Lokalno</string>
<string name="recently_added">Nedavno dodano</string>
<string name="playlist_no_uploader">Automatski generirana (nije pronađen nijedan autor)</string>
<string name="playlist_no_uploader">Autogenerirano (prenositelj nedefiniran)</string>
<string name="clear_download_history">Očisti povijest preuzimanja</string>
<string name="delete_downloaded_files">Izbriši preuzete datoteke</string>
<string name="deleted_downloads">Obrisano %1$d preuzimanja</string>
@ -552,7 +555,7 @@
<string name="download_choose_new_path">Promijenite mape za preuzimanje kako bi stupile na snagu</string>
<string name="search_showing_result_for">Prikazuju se rezultati za: %s</string>
<string name="unsupported_url_dialog_message">Nije moguće prepoznati URL. Želite li otvoriti u drugoj aplikaciji\?</string>
<string name="notification_scale_to_square_image_title">Promijeni omjer minijature na 1:1</string>
<string name="notification_scale_to_square_image_title">Smanjiti omjer minijatura na 1:1</string>
<string name="notification_action_buffering">Učitavanje u predmemoriju</string>
<string name="enable_queue_limit_desc">Istovremeno se pokreće jedno preuzimanje</string>
<string name="enqueued">Dodano u popis izvođenja</string>
@ -645,4 +648,18 @@
\nNeki uređaji nisu kompatibilni</string>
<string name="show_original_time_ago_summary">Izvorni tekstovi usluga bit će vidljivi u elementima prijenosa</string>
<string name="feed_use_dedicated_fetch_method_summary">Dostupno je u nekim uslugama. Obično je puno brže, ali može vratiti ograničenu količinu predmeta i često nepotpune podatke (npr. bez trajanja, vrste predmeta, bez stanja uživo).</string>
<string name="feed_use_dedicated_fetch_method_help_text">Mislite li da je učitavanje feeda prespor\? Ako je to slučaj, pokušajte omogućiti brzo učitavanje (možete ga promijeniti u postavkama ili pritiskom na donji gumb).
\n
\nNewPipe nudi dvije strategije ulaganja feeda:
\n• Dohvaćanje cijelog pretplatničkog kanala, koji je spor, ali cjelovit.
\n• Korištenje namjenske krajnje točke usluge, koja je brza, ali obično nije potpuna.
\n
\nRazlika je u tome što brzom obično nedostaju neke informacije, poput trajanja ili vrste stavke (ne može razlikovati videozapise uživo od uobičajenih), a možda će vratiti i manje predmeta.
\n
\nYouTube je primjer usluge koja nudi ovaj brzi način sa svojim RSS feedom.
\n
\nDakle, izbor se svodi na ono što više volite: brzinu ili precizne informacije.</string>
<string name="msg_calculating_hash">Izračunavanje šifriranja</string>
<string name="hash_channel_name">Obavijest šifriranja videa</string>
<string name="hash_channel_description">Obavijesti o napretku šifriranja videa</string>
</resources>

View file

@ -637,6 +637,7 @@
<string name="show_age_restricted_content_summary">Menampilkan konten yang mungkin tidak cocok untuk anak-anak karena memiliki batasan umur (seperti 18+)</string>
<string name="notification_colorize_summary">Minta Android menyesuaikan warna notifikasi sesuai dengan warna utama di thumbnail (perhatikan bahwa ini tidak tersedia di semua perangkat)</string>
<string name="notification_colorize_title">Warnai notifikasi</string>
<string name="show_thumbnail_summary">Tampilkan thumbnail pada layar penguncian sebagai latar dan di dalam notifikasi</string>
<string name="show_thumbnail_summary">Gunakan thumbnail untuk latar layar penguncian dan notifikasi</string>
<string name="show_thumbnail_title">Tampilkan thumbnail</string>
<string name="msg_calculating_hash">Mengkalkulasi hash</string>
</resources>

View file

@ -162,9 +162,9 @@
<string name="subscription_update_failed">Impossibile aggiornare l\'iscrizione</string>
<string name="tab_subscriptions">Iscrizioni</string>
<string name="fragment_feed_title">Novità</string>
<string name="enable_search_history_title">Cronologia ricerche</string>
<string name="enable_search_history_title">Cronologia delle ricerche</string>
<string name="enable_search_history_summary">Salva le ricerche localmente</string>
<string name="enable_watch_history_title">Cronologia visualizzazioni</string>
<string name="enable_watch_history_title">Cronologia delle visualizzazioni</string>
<string name="enable_watch_history_summary">Salva la cronologia degli elementi visualizzati</string>
<string name="resume_on_audio_focus_gain_title">Riprendi la riproduzione</string>
<string name="resume_on_audio_focus_gain_summary">Continua a riprodurre dopo le interruzioni (es. telefonate)</string>
@ -350,7 +350,7 @@
<string name="download_thumbnail_title">Carica copertine</string>
<string name="download_thumbnail_summary">Disabilita per prevenire il caricamento delle copertine, risparmiando dati e memoria. La modifica di questa opzione cancellerà la cache delle immagini in memoria e sul disco.</string>
<string name="thumbnail_cache_wipe_complete_notice">Cache immagini svuotata</string>
<string name="metadata_cache_wipe_title">Pulisci Cache Metadati</string>
<string name="metadata_cache_wipe_title">Svuota la cache dei metadati</string>
<string name="metadata_cache_wipe_summary">Elimina i dati delle pagine web memorizzati nella cache</string>
<string name="metadata_cache_wipe_complete_notice">Cache metadati svuotata</string>
<string name="playback_speed_control">Controlli della velocità di riproduzione</string>
@ -363,14 +363,14 @@
<string name="caption_setting_title">Sottotitoli</string>
<string name="caption_setting_description">Modifica dimensione e stile dei sottotitoli. Riavviare per applicare le modifiche.</string>
<string name="toast_no_player">Nessuna app installata per riprodurre questo file</string>
<string name="clear_views_history_title">Pulisci cronologia visualizzazioni</string>
<string name="clear_views_history_title">Elimina la cronologia delle visualizzazioni</string>
<string name="clear_views_history_summary">Elimina la cronologia degli elementi riprodotti e le posizioni di riproduzione</string>
<string name="delete_view_history_alert">Eliminare la cronologia delle visualizzazioni\?</string>
<string name="watch_history_deleted">Cronologia visualizzazioni eliminata.</string>
<string name="clear_search_history_title">Pulisci cronologia ricerche</string>
<string name="watch_history_deleted">Cronologia delle visualizzazioni eliminata.</string>
<string name="clear_search_history_title">Elimina la cronologia delle ricerche</string>
<string name="clear_search_history_summary">Elimina la cronologia dei termini di ricerca</string>
<string name="delete_search_history_alert">Eliminare la cronologia delle ricerche\?</string>
<string name="search_history_deleted">Cronologia ricerche eliminata.</string>
<string name="search_history_deleted">Cronologia delle ricerche eliminata.</string>
<string name="one_item_deleted">1 elemento eliminato.</string>
<string name="app_license">NewPipe è un software libero con licenza copyleft: si può utilizzare, studiare, condividere e migliorare a proprio piacimento. In particolare, è possibile ridistribuirlo e/o modificarlo secondo i termini della GNU General Public License (Free Software Foundation), nella versione 3 o successiva, a propria discrezione.</string>
<string name="import_settings">Vuoi anche importare le impostazioni?</string>
@ -399,7 +399,7 @@
<string name="unsubscribe">Disiscriviti</string>
<string name="tab_new">Nuova scheda</string>
<string name="tab_choose">Scegli scheda</string>
<string name="volume_gesture_control_title">Gesti Controllo Volume</string>
<string name="volume_gesture_control_title">Gesti controllo volume</string>
<string name="volume_gesture_control_summary">Utilizza i gesti per controllare il volume del lettore multimediale</string>
<string name="brightness_gesture_control_title">Gesti controllo luminosità</string>
<string name="brightness_gesture_control_summary">Utilizza i gesti per controllare la luminosità del lettore multimediale</string>
@ -468,7 +468,7 @@
<string name="enable_playback_resume_summary">Recupera l\'ultima posizione di riproduzione</string>
<string name="enable_playback_state_lists_title">Posizioni nelle liste</string>
<string name="enable_playback_state_lists_summary">Mostra gli indicatori della posizione di riproduzione nelle liste</string>
<string name="settings_category_clear_data_title">Pulisci dati</string>
<string name="settings_category_clear_data_title">Elimina dati</string>
<string name="watch_history_states_deleted">Posizione di riproduzione eliminata.</string>
<string name="missing_file">File spostato o cancellato</string>
<string name="overwrite_unrelated_warning">Esiste già un file con questo nome</string>
@ -477,7 +477,7 @@
<string name="error_postprocessing_stopped">NewPipe è stato chiuso mentre lavorava sul file</string>
<string name="error_insufficient_storage">Spazio insufficiente sul dispositivo</string>
<string name="error_progress_lost">Progresso perso poiché il file è stato eliminato</string>
<string name="confirm_prompt">Pulire la cronologia dei download o eliminare tutti i file scaricati\?</string>
<string name="confirm_prompt">Cancellare la cronologia dei download o eliminare tutti i file scaricati\?</string>
<string name="enable_queue_limit_desc">Sarà avviato un solo dowload per volta</string>
<string name="start_downloads">Avvia i download</string>
<string name="pause_downloads">Sospendi i download</string>
@ -489,7 +489,7 @@
\nScegli SAF se vuoi scaricare su una scheda SD esterna</string>
<string name="downloads_storage_use_saf_summary">Lo Storage Access Framework consente di salvare file su una memoria esterna.
\nAlcuni dispositivi non sono compatibili</string>
<string name="clear_playback_states_title">Elimina posizioni di riproduzione</string>
<string name="clear_playback_states_title">Elimina le posizioni di riproduzione</string>
<string name="clear_playback_states_summary">Elimina tutte le posizioni di riproduzione</string>
<string name="delete_playback_states_alert">Eliminare tutte le posizioni di riproduzione\?</string>
<string name="download_choose_new_path">Modifica le cartelle di download per renderle effettive</string>
@ -522,7 +522,7 @@
<string name="recovering">recupero</string>
<string name="error_download_resource_gone">Impossibile recuperare questo download</string>
<string name="choose_instance_prompt">Scegli un\'istanza</string>
<string name="clear_download_history">Pulisci cronologia download</string>
<string name="clear_download_history">Elimina la cronologia dei download</string>
<string name="delete_downloaded_files">Elimina file scaricati</string>
<string name="deleted_downloads">%1$d download eliminati</string>
<string name="permission_display_over_apps">Consentire la visualizzazione sopra altre applicazioni</string>
@ -600,7 +600,7 @@
\nSei sicuro\? L\'azione è irreversibile!</string>
<string name="remove_watched_popup_title">Rimuovere i video già visti\?</string>
<string name="remove_watched">Rimuovi elementi visti</string>
<string name="youtube_restricted_mode_enabled_title">Attiva la «Modalità con restrizioni» di YouTube</string>
<string name="youtube_restricted_mode_enabled_title">Attiva la \"Modalità con restrizioni\" di YouTube</string>
<string name="show_original_time_ago_summary">I testi originali dei servizi saranno visibili negli elementi video</string>
<string name="show_original_time_ago_title">Mostra i tempi originali degli elementi</string>
<string name="detail_sub_channel_thumbnail_view_description">Immagine del canale</string>
@ -641,12 +641,15 @@
<string name="enqueued">Aggiunto alla coda</string>
<string name="enqueue_stream">Accoda</string>
<string name="clear_cookie_summary">Cancella i cookie che NewPipe memorizza quando si risolve un reCAPTCHA</string>
<string name="recaptcha_cookies_cleared">Cookie reCAPTCHA puliti</string>
<string name="clear_cookie_title">Pulisci cookie reCAPTCHA</string>
<string name="youtube_restricted_mode_enabled_summary">Consente di usufruire della «Modalità con restrizioni» di YouTube, che esclude contenuti potenzialmente inappropriati per i minori</string>
<string name="recaptcha_cookies_cleared">Cookie reCAPTCHA eliminati</string>
<string name="clear_cookie_title">Elimina cookie reCAPTCHA</string>
<string name="youtube_restricted_mode_enabled_summary">Consente di usufruire della \"Modalità con restrizioni\" di YouTube, che esclude contenuti potenzialmente inappropriati per i minori</string>
<string name="show_age_restricted_content_summary">Mostra contenuti che hanno un limite di età (es. 18+). Potrebbero essere inadatti ai bambini</string>
<string name="notification_colorize_summary">Lascia che Android modifichi il colore della notifica, secondo il colore principale della copertina (funzione non disponibile per tutti i dispositivi)</string>
<string name="notification_colorize_title">Colora notifica</string>
<string name="show_thumbnail_summary">Mostra le copertine come sfondo della schermata di blocco e all\'interno delle notifiche</string>
<string name="show_thumbnail_summary">Utilizza le copertine come sfondo della schermata di blocco e per le notifiche</string>
<string name="show_thumbnail_title">Mostra copertina</string>
<string name="msg_calculating_hash">Calcolo dell\'hash</string>
<string name="hash_channel_name">Notifica Hash Video</string>
<string name="hash_channel_description">Notifiche per lo stato di avanzamento dell\'hashing video</string>
</resources>

View file

@ -495,7 +495,7 @@
</plurals>
<string name="no_one_listening">誰も聴いていません</string>
<plurals name="listening">
<item quantity="other">%s リスナー</item>
<item quantity="other">%s が聴取中</item>
</plurals>
<string name="localization_changes_requires_app_restart">アプリを再起動すると、言語が変更されます。</string>
<string name="seek_duration_title">高速早送り/巻き戻し時間</string>

View file

@ -649,4 +649,7 @@
<string name="notification_colorize_title">Fargelegg merknad</string>
<string name="show_thumbnail_summary">Vis miniatyrbilde på låseskjerm som bakgrunn og i merknader</string>
<string name="show_thumbnail_title">Vis miniatyrbilde</string>
<string name="msg_calculating_hash">Regner ut sjekksum</string>
<string name="hash_channel_description">Merknad for videosjekksummeringsframdrift</string>
<string name="hash_channel_name">Videosjekksumsmerknad</string>
</resources>

View file

@ -264,8 +264,8 @@
<string name="preferred_player_fetcher_notification_message">Bezig met laden van gevraagde inhoud</string>
<string name="import_data_title">Databank importeren</string>
<string name="export_data_title">Databank exporteren</string>
<string name="import_data_summary">Dit overschrijft je huidige geschiedenis en abonnementen</string>
<string name="export_data_summary">Exporteer geschiedenis, abonnementen en afspeellijsten</string>
<string name="import_data_summary">Dit overschrijft je huidige geschiedenis, abonnementen, afspeellijsten en (optionele) settings</string>
<string name="export_data_summary">Exporteer geschiedenis, abonnementen, afspeellijsten en settings</string>
<string name="export_complete_toast">Geëxporteerd</string>
<string name="import_complete_toast">Geïmporteerd</string>
<string name="no_valid_zip_file">Geen geldig ZIP-bestand</string>
@ -647,4 +647,6 @@
<string name="show_age_restricted_content_summary">Toon inhoud die mogelijk niet geschikt is voor kinderen omwille van een leeftijdslimiet (zoals 18+)</string>
<string name="notification_colorize_summary">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)</string>
<string name="notification_colorize_title">Notificatie kleur aanpassen</string>
<string name="show_thumbnail_summary">Toon miniatuurafbeelding op het vergrendelscherm als achtergrond en binnen meldingen</string>
<string name="show_thumbnail_title">Toon miniatuurafbeelding</string>
</resources>

View file

@ -657,6 +657,6 @@
<string name="show_age_restricted_content_summary">Pokaż treści nieodpowiednie dla dzieci, ponieważ mają ograniczenia wiekowe (np. 18+)</string>
<string name="notification_colorize_summary">Niech Android dostosuje kolor powiadomienia zgodnie z głównym kolorem na miniaturze (nie jest to dostępne na wszystkich urządzeniach)</string>
<string name="notification_colorize_title">Pokolorowanie powiadomienia</string>
<string name="show_thumbnail_summary">Pokazuj miniaturkę na ekranie blokady jako tło oraz wewnątrz powiadomień</string>
<string name="show_thumbnail_title">Pokaż miniaturkę</string>
<string name="show_thumbnail_summary">Używaj miniatury zarówno jako tła ekranu blokady, jak i powiadomień</string>
<string name="show_thumbnail_title">Pokazuj miniaturę</string>
</resources>

View file

@ -647,6 +647,9 @@
<string name="show_age_restricted_content_summary">Mostrar conteúdo possivelmente inadequado para crianças porque tem um limite de idade (como +18)</string>
<string name="notification_colorize_summary">Permite o Android personalizar a cor da notificação de acordo com a cor principal da miniatura (note que isso não está disponível em todos os dispositivos)</string>
<string name="notification_colorize_title">Colorir notificação</string>
<string name="show_thumbnail_summary">Mostrar miniaturas como fundo da tela de bloqueio e nas notificações</string>
<string name="show_thumbnail_summary">Usar miniatura para o plano de fundo da tela de bloqueio e as notificações</string>
<string name="show_thumbnail_title">Mostrar miniatura</string>
<string name="msg_calculating_hash">Calculando hash</string>
<string name="hash_channel_description">Notificações para o progresso do hash do vídeo</string>
<string name="hash_channel_name">Notificação de Hash do Vídeo</string>
</resources>

View file

@ -647,6 +647,9 @@
<string name="show_age_restricted_content_summary">Mostrar conteúdo possivelmente impróprio para crianças porque tem um limite de idade (como 18+)</string>
<string name="notification_colorize_summary">Fazer com que o Android personalize a cor da notificação de acordo com a cor principal na miniatura (esta opção não está disponível em todos os dispositivos)</string>
<string name="notification_colorize_title">Colorir notificação</string>
<string name="show_thumbnail_summary">Mostrar miniaturas no ecrã de bloqueio como fundo e como notificação</string>
<string name="show_thumbnail_summary">Usar miniaturas no fundo do ecrã de bloqueio e em notificações</string>
<string name="show_thumbnail_title">Mostrar miniatura</string>
<string name="msg_calculating_hash">A calcular \'hash\'</string>
<string name="hash_channel_description">Notificar sobre o progresso das \'hash\' de vídeos</string>
<string name="hash_channel_name">Notificação \'hash\' do vídeo</string>
</resources>

View file

@ -83,7 +83,7 @@
<string name="live_streams_not_supported">Трансляции пока не поддерживаются</string>
<string name="could_not_load_image">Не удалось загрузить изображение</string>
<string name="app_ui_crash">Приложение/UI завершило работу</string>
<string name="sorry_string">Простите, это не должно было произойти.</string>
<string name="sorry_string">Никогда такого не было, и вот опять.</string>
<string name="error_report_button_text">Отправить отчёт по e-mail</string>
<string name="error_snackbar_message">Извините, что-то пошло не так.</string>
<string name="error_snackbar_action">Отчёт</string>
@ -592,7 +592,7 @@
\n
\nВыбор за вами: скорость или точность.</string>
<string name="feed_use_dedicated_fetch_method_title">Обновление по RSS, если доступно</string>
<string name="feed_use_dedicated_fetch_method_summary">Доступно для некоторых сервисов, быстрое, но может возвращать не всё содержимое канала и не содержать часть сведений (длительность, статус трансляции)</string>
<string name="feed_use_dedicated_fetch_method_summary">Доступно для некоторых сервисов, быстрое, может возвращать не всё содержимое канала и не содержать часть сведений (длительность, статус трансляции)</string>
<string name="feed_update_threshold_summary">Период актуальности подписок после обновления — %s</string>
<string name="restricted_video">Это видео имеет возрастное ограничение.
\n
@ -658,6 +658,9 @@
<string name="clear_cookie_summary">Удалить сохранённые при решении reCAPTCHA куки</string>
<string name="notification_colorize_summary">Окрашивать уведомление основным цветом миниатюры. Поддерживается не всеми устройствами</string>
<string name="notification_colorize_title">Цветное уведомление</string>
<string name="show_thumbnail_summary">Отображать миниатюру в уведомлении и на экране блокировки</string>
<string name="show_thumbnail_summary">Использовать миниатюру для фона уведомлений и экрана блокировки</string>
<string name="show_thumbnail_title">Показать миниатюру</string>
<string name="hash_channel_description">Показать уведомление при хэшировании видео</string>
<string name="hash_channel_name">Уведомление о хэшировании</string>
<string name="msg_calculating_hash">Вычисляется хэш</string>
</resources>

View file

@ -40,4 +40,5 @@
<string name="controls_popup_title">ᱯᱳᱯᱟᱹᱯ</string>
<string name="controls_background_title">ᱵᱮᱠᱜᱨᱟᱩᱸᱰ</string>
<string name="tab_choose">ᱴᱮᱵᱽ ᱪᱚᱭᱚᱱ ᱢᱮᱸ</string>
<string name="download_path_summary">ᱰᱟᱩᱱᱞᱳᱰ ᱠᱟᱱ ᱣᱤᱰᱤᱭᱚ ᱨᱮᱫ ᱱᱚᱰᱮ ᱫᱚᱦᱚᱜᱼᱟ</string>
</resources>

View file

@ -647,6 +647,9 @@
<string name="notification_colorize_summary">Pedi a Android de personalizare su colore de sa notìfica sighende su colore printzipale de sa miniadura (ammenta·ti chi custu no est a disponimentu pro totu sos dispositivos)</string>
<string name="notification_colorize_title">Colora sas notìficas</string>
<string name="popup_remember_size_pos_summary">Ammenta s\'ùrtima mannària e sa positzione in sa ventanedda</string>
<string name="show_thumbnail_summary">Ammustra sa miniatura in s\'ischermada de blocu e in intro de sas notìficas</string>
<string name="show_thumbnail_summary">Imprea sa miniatura siat comente isfundu de s\'ischermada de blocu e siat in sas notìficas</string>
<string name="show_thumbnail_title">Ammustra sa miniatura</string>
<string name="msg_calculating_hash">Carculende s\'hash</string>
<string name="hash_channel_description">Notìficas pro su protzessu de hashàgiu de su vìdeu</string>
<string name="hash_channel_name">Notìfica de hash de su vìdeu</string>
</resources>

View file

@ -658,5 +658,8 @@
<string name="notification_colorize_summary">Nechajte Android, aby prispôsobil farbu upozornenia podľa hlavnej farby v miniatúre (nemusí to fungovať na všetkých zariadeniach)</string>
<string name="notification_colorize_title">Farby upozornení</string>
<string name="show_thumbnail_title">Zobrazovať miniatúru</string>
<string name="show_thumbnail_summary">Zobrazovať miniatúru pri uzamknutej obrazovke a v upozorneniach</string>
<string name="show_thumbnail_summary">Používať miniatúru ako pozadie pri uzamknutej obrazovke a v upozorneniach</string>
<string name="msg_calculating_hash">Počítanie hash</string>
<string name="hash_channel_description">Upozornenie pri generovaní hash z názu videa</string>
<string name="hash_channel_name">Oznámenie o hashovaní videa</string>
</resources>

View file

@ -0,0 +1,496 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="use_inexact_seek_title">Isticmaal dhaa-dhaafinta dagdaga ah (100% sax ma aha)</string>
<string name="popup_remember_size_pos_summary">Xusuusnow meeshii iyo cabirkii u dambeeyay ee</string>
<string name="popup_remember_size_pos_title">Xusuusnow fadhiga daaqada</string>
<string name="dark_theme_title">Madow</string>
<string name="theme_title">Nashqada</string>
<string name="default_video_format_title">Nooca muuqaalka joogtada loo isticmaali doono</string>
<string name="default_audio_format_title">Nooca codka joogtada loo isticmaali doono</string>
<string name="notification_colorize_summary">Android-ka haku badalo midabka ogaysiiska midabka galka waxa daaran (aaladahoo dhan looma wada heli karo nidaamkan)</string>
<string name="notification_colorize_title">idabbee ogaysiiska</string>
<string name="notification_action_buffering">Soo Kucinay</string>
<string name="notification_action_shuffle">Isku</string>
<string name="notification_action_repeat">Ku</string>
<string name="notification_actions_at_most_three">Ugu badnaan waxad dooran kartaa sadex wax iney ka muuqdaan ogaysiiska yar!</string>
<string name="notification_actions_summary">Wax ka badal ficilka ogaysiiska hoose oo walba adigoo dushiisa ku dhufanaya. Dooro ilaa sadex kamida si ay uga muuqdaan ogaysiiska yar adigoo taabanaya santuuqa dhanka midgta ku yaala.</string>
<string name="notification_action_4_title">batoonka ficilka koowaad</string>
<string name="notification_action_3_title">batoonka ficilka koowaad</string>
<string name="notification_action_2_title">batoonka ficilka sadexaad</string>
<string name="notification_action_1_title">batoonka ficilka</string>
<string name="notification_action_0_title">batoonka ficilka koowaad</string>
<string name="notification_scale_to_square_image_summary">La ekaysii galka muuqaalka xaga ogaysiisyada ka muuqda cabirka 1:1 adoo kasoo badalaya 16:9 (wuxuu keeni karaa shucaac)</string>
<string name="notification_scale_to_square_image_title">Galka la ekaysii cabirka 1:1</string>
<string name="show_play_with_kodi_summary">Soo bandhig istikhyaar ah in muuqaal lagu furo xarunta madadaalada</string>
<string name="show_play_with_kodi_title">Soo bandhig istikhyaarka \"Kufur Kodi\"</string>
<string name="kore_not_found">Kushub app-ka maqan ee Kore\?</string>
<string name="play_with_kodi_title">Kufur</string>
<string name="show_higher_resolutions_summary">Aaladaha qaar kaliya ayaa furi kara muuqaalada 2K/4K ga</string>
<string name="show_higher_resolutions_title">Tus cabirada muuqaalka ee sare</string>
<string name="default_popup_resolution_title">Cabirka muuqaalka daaqada marwalba</string>
<string name="default_resolution_title">Cabirka Muuqaalka ee</string>
<string name="autoplay_by_calling_app_summary">Wuxuu daaraa muuqaal marka NewPipe laga soo furo app</string>
<string name="download_choose_new_path">Badal meelaha waxa lasoo dajiyay galaan si uu u hirgalo waxaad badashay</string>
<string name="download_path_audio_dialog_title">Dooro meesha dhagaysiga lasoo dajiyay galaan</string>
<string name="download_path_dialog_title">Dooro meesha muuqaalada lasoo dajiyay galaan</string>
<string name="download_path_audio_summary">Dhagaysiga lasoo dajiyay halkan ayaa lagu kaydiyaa</string>
<string name="download_path_summary">Muuqaalada lasoo dajiyay halkan ayaa lagu kaydiyaa</string>
<string name="download_path_audio_title">Meesha oodajinta dhagaysiga</string>
<string name="download_path_title">Meesha soodajintu</string>
<string name="controls_add_to_playlist_title">Ku Dar</string>
<string name="controls_popup_title">Si</string>
<string name="controls_background_title">Xaga Dambe</string>
<string name="tab_choose">Dooro Daaqada</string>
<string name="tab_new">Daaqad Cusub</string>
<string name="tab_bookmarks">Xulalka la</string>
<string name="tab_subscriptions">Rukunka</string>
<string name="tab_main">Guud</string>
<string name="show_info">Tus xogta</string>
<string name="subscription_update_failed">Lama cusbooneysiin karo rukunka</string>
<string name="subscription_change_failed">Lama badali karo rukunka</string>
<string name="channel_unsubscribed">Kanaalka waad iskajoojisay</string>
<string name="unsubscribe">Iskajooji Rukumashada</string>
<string name="subscribed_button_title">Rukuntay</string>
<string name="subscribe_button_title">Rukumo</string>
<string name="popup_mode_share_menu_title">Si</string>
<string name="use_external_audio_player_title">Isticmaal dhagaysi daare dibada</string>
<string name="use_external_video_player_summary">Codka ayuu ka saaraa cabirrada muuqaalkaqaar</string>
<string name="use_external_video_player_title">Isticmaal muuqaal daare dibada</string>
<string name="choose_browser">Dooro</string>
<string name="share_dialog_title">La Wadaag</string>
<string name="search_showing_result_for">Soobandhigaya natiijada: %s</string>
<string name="did_you_mean">Ma waxaad ka waday \"%1$s\"\?</string>
<string name="settings">Fadhiga</string>
<string name="controls_download_desc">Daji midka socda</string>
<string name="share">La</string>
<string name="open_in_popup_mode">Kufur daaqad yar</string>
<string name="open_in_browser">Kufur browser</string>
<string name="cancel">Ka</string>
<string name="install">Ku</string>
<string name="no_player_found_toast">Wax fura lama helin. (waxad Ku shuban kartaa VLC si aad u furto).</string>
<string name="view_count_text">la furay %1$s jeer</string>
<string name="no_player_found">Wax fura lama helin. Ku shubo VLC\?</string>
<string name="upload_date_text">Lasoo galiyay %1$s</string>
<string name="main_bg_subtitle">ku dhufo \"Raadi\" si aad u bilawdo
\n</string>
<string name="overwrite_unrelated_warning">Shay magacan leh ayaa horay u</string>
<string name="overwrite">Ku</string>
<string name="generate_unique_name">Usamee magac gaar</string>
<string name="download_finished_more">%s soodajin ayaa dhamaatay</string>
<string name="download_finished">Dajintii wuu dhamaatay</string>
<string name="download_failed">Dajintii ma guulaysto</string>
<string name="permission_denied">Waxaa diiday</string>
<string name="recovering">Kasoo</string>
<string name="queued">La</string>
<string name="paused">La</string>
<string name="missions_header_pending">Hawsha Kujira</string>
<string name="missions_header_finished">La</string>
<string name="app_update_notification_content_text">Ku dhufo si aad u dajiso</string>
<string name="app_update_notification_content_title">Nooc cusub oo NewPipe ah ayaa diyaar ah!</string>
<string name="switch_view">Baddal</string>
<string name="list_view_mode">Qaabka</string>
<string name="never">Marna</string>
<string name="wifi_only">Kaliya marka WiFi la isticmaal</string>
<string name="minimize_on_exit_title">Yaree marka app kale loo</string>
<string name="updates_setting_title">Cusboonaysiinta</string>
<string name="limit_data_usage_none_description">Xad</string>
<string name="playback_reset">Dib</string>
<string name="skip_silence_checkbox">Horay u dhaafi meelaha</string>
<string name="playback_speed_control">Maamulista Xawaaraha Waxa</string>
<string name="import_soundcloud_instructions_hint">yourID, soundcloud.com/yourid</string>
<string name="subscriptions_export_unsuccessful">Rukunka lama gudbin</string>
<string name="subscriptions_import_unsuccessful">Lama soo galin karo</string>
<string name="previous_export">Gudbintii</string>
<string name="import_file_title">Soo gali</string>
<string name="export_ongoing">Gudbinaya…</string>
<string name="import_ongoing">Soo galinaya…</string>
<string name="export_to">U</string>
<string name="import_from">Kasoo</string>
<string name="import_title">Soo</string>
<string name="import_export_title">Soo gali/</string>
<string name="show_original_time_ago_summary">"Qoraaladii asal ahaan adeegyada la socday way ka muuqan doonaan waxyaabaha"</string>
<string name="show_original_time_ago_title">Soo bandhig wakhtigii asalka ahaa ee kasoo wareegay (shayyada)</string>
<string name="enable_disposed_exceptions_summary">Ku khasab warinta kareebitaanada aan la fulin karin ee Rx ka ee dibada qayb ama wakhtiga hawsha kadib marka la iska</string>
<string name="enable_disposed_exceptions_title">Wari khaladaadka wakhtigoo</string>
<string name="show_memory_leaks">Tus ciladaha</string>
<string name="enable_leak_canary_summary">Dabagalka cilada kaydka waxay sababi kartaa inuu app-ku istaago marka \'heap dump\'</string>
<string name="caption_setting_description">Waxkabadal cabirka qoraalka qoral-hooseedka iyo midabka xaga dambe. App-ka waa in dib loo furaa si ay u hirgasho.</string>
<string name="resize_zoom">So</string>
<string name="resize_fill">Ku</string>
<string name="caption_none">Qoral-Hoosaas majiro</string>
<string name="playlist_no_uploader">Isasoo-bilaabay (Soo-galiye lama helin)</string>
<string name="playlist_delete_failure">Xulka lama saari karo.</string>
<string name="playlist_thumbnail_change_success">Galkii xulka waa la badalay.</string>
<string name="playlist_add_stream_success">La</string>
<string name="playlist_creation_success">Xulka waa la</string>
<string name="delete_playlist_prompt">Saar xulkan\?</string>
<string name="unbookmark_playlist">Ka saar alaamadinta</string>
<string name="bookmark_playlist">Calaamadi</string>
<string name="set_as_playlist_thumbnail">Ku Fadhiisi Galka Xulka</string>
<string name="unmute">adalsii</string>
<string name="append_playlist">Ku dar</string>
<string name="rename_playlist">Magaca kabadal</string>
<string name="delete_playlist">Tirtir</string>
<string name="create_playlist">Xul</string>
<string name="preferred_player_fetcher_notification_message">Sookicinaya shayga la</string>
<string name="preferred_player_fetcher_notification_title">Helaya</string>
<string name="always_ask_open_action">Waydii</string>
<string name="background_player">Gadaal ku</string>
<string name="video_player">Muuqaal</string>
<string name="preferred_open_action_settings_summary">Ficilka la doorbiday maeka shay la furayo —</string>
<string name="preferred_open_action_settings_title">Ficilka \'fur\' loo doorbiday</string>
<string name="drawer_header_action_paceholder_text">Wax baa halkan kasoo muuqan dhawaan ;</string>
<string name="drawer_close">Xidh</string>
<string name="drawer_open">Fur</string>
<string name="start_here_on_popup">Bilaw inaad daaqad ku</string>
<string name="start_here_on_main">Ka bilow daarista</string>
<string name="start_here_on_background">Bilaw inaad xaga dambe ka</string>
<string name="enqueued">La</string>
<string name="hold_to_append">Xaji si loo</string>
<string name="play_queue_audio_settings">Fadhiga</string>
<string name="play_queue_stream_detail">Faahfaahin</string>
<string name="play_queue_remove">Ka</string>
<string name="title_activity_play_queue">Daar</string>
<string name="most_liked">Inta loogu jecelyahay</string>
<string name="recently_added">Dhawaan lagu soo</string>
<string name="trending">Shiddan</string>
<string name="new_and_hot">Cusub oo</string>
<string name="top_50">50ka ugu</string>
<string name="kiosk">Bandhig</string>
<string name="localization_changes_requires_app_restart">Luuqadu waxay isbadali doontaa marka barnaamijka dib loo soo kiciyo.</string>
<string name="error_unable_to_load_comments">Faalooyinka lama soo dhigi</string>
<string name="import_settings">Inaad sidoo kale fadhiga soo galiso ma rabtaa\?</string>
<string name="override_current_data">Tani waxay badali fadhigaaga hadda.</string>
<string name="could_not_import_all_files">Digniin: Lama soowada galin karo shayyada oo</string>
<string name="no_valid_zip_file">Shay ZIP ah oo sax ah</string>
<string name="import_complete_toast">Lasoo</string>
<string name="export_complete_toast">La</string>
<string name="select_a_kiosk">Dooro</string>
<string name="no_playlist_bookmarked_yet">Wax xul ah wali lama</string>
<string name="select_a_playlist">Dooro</string>
<string name="no_channel_subscribed_yet">Wax kanaal ah wali lama</string>
<string name="select_a_channel">Dooro</string>
<string name="channel_page_summary">Boga</string>
<string name="feed_page_summary">Boga</string>
<string name="subscription_page_summary">Boga</string>
<string name="default_kiosk_page_summary">Bandhiga siduu</string>
<string name="kiosk_page_summary">Boga</string>
<string name="blank_page_summary">Bog</string>
<string name="main_page_content_summary">Daaqadaha la soobandhigo boga</string>
<string name="main_page_content">Boga guud waxa ka</string>
<string name="title_most_played">Badanaa la</string>
<string name="title_last_played">Kii udambeeyay ee la</string>
<string name="delete_all_history_prompt">Ma hubtaa inaad ka saari rabto shaygan kaydka taariikhda\?</string>
<string name="delete_stream_history_prompt">Ma rabtaa inaad ka saarto shaygan kaydka wixii la daawaday\?</string>
<string name="delete_item_search_history">Ma rabtaa inaad ka saarto shaygan kaydka wixii la raadiyay\?</string>
<string name="item_deleted">Waa la</string>
<string name="history_cleared">Taariikhdii waa la nadiifiyay</string>
<string name="history_empty">Kaydka taariikhda wuu madhan</string>
<string name="action_history">Taariikh</string>
<string name="history_disabled">Kaydinta taariikhda way</string>
<string name="title_history_view">La</string>
<string name="title_history_search">La</string>
<string name="read_full_license">Akhri</string>
<string name="app_license">NewPipe waa barnaamij bilaash ah oon lahayn xuquuqda daabacaada: Waad isticmaali kartaa, wadaagi kartaa waadna hormarin kartaa hadaad rabto. Gaar ahaan waad sii daabici kartaa ama wax baad ka badali kartaa adigoo raacaya shuruudaha sharciga guud ee GNU sida ay soosaareen Ururka Barnaamijyada Bilaashka ah, soosaarista 3aad ee laysinka, ama (hadaad doonto) nooc walba oo kasii dambeeyay kii 3aad.</string>
<string name="privacy_policy_title">Siyaasada Sir-Dhawrka NewPipe</string>
<string name="app_license_title">Laysanka NewPipe</string>
<string name="read_privacy_policy">Akhri siyaasada sir-dhawrka</string>
<string name="privacy_policy_encouragement">Mashruuca NewPipe sir dhawrkaaga aad ayuu u daneeyaa. Sidaas darteed, App-ku wax xogtaada ah ma uruuriyo fasax la\'aan.
\nSiyaasada sir-dhawrka NewPipe ayaa si faahfaahsan u sharaxda wixii xog ah ee la diro lana kaydiyo markaad cilad farsamo wariso.</string>
<string name="website_encouragement">Booqo website-ka NewPipe xog intaas dheer iyo warar.</string>
<string name="website_title">Website-ka</string>
<string name="give_back">U fidi caawin</string>
<string name="donation_encouragement">NewPipe waxaa sameeyay dad iskood isku xilqaamay oo wakhtiga ay xorta yihiin ku kharash gareeya inay kuu keenaan wax markaad isticmaalayso aad ku qanacdo. U fidi taageero sameeyaasha appka si ay NewPipe xataa sidan oga sii fiicneeyaan.</string>
<string name="donation_title">Ugu Deeq</string>
<string name="view_on_github">Xaga GitHub fur</string>
<string name="contribution_encouragement">Hadaad hayso fikarodo; rogid, qaab badal, nafiinta \'code\', ama \'code-ka\' ood si wayn wax oga badashaa—caawinta marwalba waa lasoo dhawayn. Waxbadan hadii la qabto waxbadan ayaa fiicnaan!</string>
<string name="contribution_title">Kusoo kordhin</string>
<string name="app_description">Waa app fudud oo bilaash wax loogu daawado Android-ka.</string>
<string name="tab_licenses">Laysimada</string>
<string name="tab_contributors">Waxaa wax kusoo kordhiyay</string>
<string name="tab_about">Ku saabsan</string>
<string name="action_open_website">Fur website-ka</string>
<string name="error_unable_to_load_license">Laysanka lama soo kicin karo</string>
<string name="copyright">© %1$s sameeyay %2$s asagoo raacaya %3$s</string>
<string name="title_licenses">Laysinada gacanta sadexaad</string>
<string name="action_about">Xog</string>
<string name="action_settings">Fadhiga</string>
<string name="title_activity_about">Ku saabsan NewPipe</string>
<string name="toast_no_player">Barnaamij shaygan fura kuma jiro</string>
<string name="charset_most_special_characters">Xarfaha gaarka ah kuwa ugu badan</string>
<string name="charset_letters_and_digits">Xarfaha iyo Godadka</string>
<string name="settings_file_replacement_character_title">Xarafka lagu badali</string>
<string name="settings_file_replacement_character_summary">Xarfaha aan la taageerin waxaa lagu badali midkan</string>
<string name="settings_file_charset_title">Xarafyada magaca shayga loo ogol yahay</string>
<string name="settings_category_downloads_title">Daji</string>
<string name="recaptcha_done_button">Waan dhameeyay</string>
<string name="recaptcha_request_toast">Tijaabada reCAPTCHA ayaa la codsaday</string>
<string name="subtitle_activity_recaptcha">Taabo \"Waan dhameeyay\" markaad xaliso</string>
<string name="title_activity_recaptcha">Tijaabada reCAPTCHA</string>
<string name="one_item_deleted">1 shay ayaa la saaray.</string>
<string name="msg_popup_permission">Ogolaanshahan ayaa loo baahan yahay si
\nloogu furo qaabka daaqada</string>
<string name="no_available_dir">Fadlan meesha wax lagu dajin doono hadhawto xaga fadhiga ka dooro</string>
<string name="msg_copied">Dhakada ayaa lagu qabtay</string>
<string name="msg_wait">Fadlan sug…</string>
<string name="msg_calculating_hash">Xisaabinaya waxa isbadalay</string>
<string name="msg_running_detail">Fahfahinta kusii dhufo</string>
<string name="msg_running">NewPipe Wuu Dajinayaa</string>
<string name="msg_url_malform">Tixraac khaldan ama khad baan jirin</string>
<string name="msg_exists">Shaygan horay ayuu ujiray</string>
<string name="msg_server_unsupported">Martigaliye aan la taageerin</string>
<string name="msg_error">Khalad</string>
<string name="msg_threads">Maqaallo</string>
<string name="msg_name">Magaca shayga</string>
<string name="finish">Hagaag</string>
<string name="add">Hawl cusub</string>
<string name="rename">Magaca kabadal</string>
<string name="dismiss">Iska dhaaf</string>
<string name="checksum">Xaqiijiyaha</string>
<string name="delete_all">Dhammaan tirtir</string>
<string name="delete_one">Hal Xabo Tirtir</string>
<string name="delete">Tirtir</string>
<string name="create">Samee</string>
<string name="view">Daar</string>
<string name="pause">Qabo</string>
<string name="start">Bilaw</string>
<string name="no_comments">Faalooyin ma jiraan</string>
<plurals name="videos">
<item quantity="one">%s muuqaal</item>
<item quantity="other">%s muuqaalo</item>
</plurals>
<string name="infinite_videos">∞ muuqaalo</string>
<string name="more_than_100_videos">100+ muuqaal</string>
<string name="no_videos">Muuqaalo ma jiraan</string>
<plurals name="listening">
<item quantity="one">%s dhagayste</item>
<item quantity="other"></item>
</plurals>
<string name="no_one_listening">Cidna ma dhagaysanayso</string>
<plurals name="watching">
<item quantity="one">%s ayaa daawanaya</item>
<item quantity="other">%s ayaa daawanaysa</item>
</plurals>
<string name="no_one_watching">Cidna ma daawanayso</string>
<plurals name="views">
<item quantity="one">%s ayaa furtay</item>
<item quantity="other">%s ayaa furatay</item>
</plurals>
<string name="no_views">Lama furin</string>
<string name="subscribers_count_not_available">inta rukumatay lama heli karo</string>
<plurals name="subscribers">
<item quantity="one">%s ayaa rukuntay</item>
<item quantity="other">%s ayaa rukumatay</item>
</plurals>
<string name="no_subscribers">Dad rukuntay ma jiraan</string>
<string name="drawer_header_description">Furo adeega, hada waxaa dooran:</string>
<string name="short_billion">B</string>
<string name="short_thousand">K</string>
<string name="short_million">M</string>
<string name="storage_permission_denied">App-ka u ogolow kaydka aaalada marka hore</string>
<string name="retry">Markale isku day</string>
<string name="audio">Cod</string>
<string name="video">Muuqaal</string>
<string name="info_dir_created">Waa la sameeyay galka soodajinta ee \'%1$s\'</string>
<string name="err_dir_create">Lama samayn karo galka soodajinta ee \'%1$s\'</string>
<string name="detail_drag_description">Jiid si aad ukala hormariso</string>
<string name="empty_subscription_feed_subtitle">Meel madhan</string>
<string name="search_no_results">Natiijo lama helin</string>
<string name="user_report">Isticmaal warka</string>
<string name="report_error">Wari khalad</string>
<string name="use_tor_summary">(Waa tijaabo) Ku khasab in soodajinta la dhexmariyo Tor si aad sirtaada u ilaashato (Muuqaalada tooska ah looma heli karo hadda).</string>
<string name="detail_dislikes_img_view_description">Intaan ka helin</string>
<string name="use_tor_title">Isticmaal Tor</string>
<string name="detail_likes_img_view_description">Inta ka heshay</string>
<string name="detail_uploader_thumbnail_view_description">Sawirka soosaarha muuqaalka</string>
<string name="detail_thumbnail_view_description">Daar muuqaalka, intuu socdo:</string>
<string name="info_labels">Waxa:\\nCodsi:\\nShayga Luuqada:\\nWadanka Shayga:\\nApp-ka Luuqada:\\nAdeega:\\nGMT Wakhtiga:\\Xidhmada:\\nNooca:\\nNooca barnaamijka:</string>
<string name="list_thumbnail_view_description">Galka muuqaal tusaha</string>
<string name="error_details_headline">Faahfaahin:</string>
<string name="your_comment">Faaladaada (oo Ingiriis ah):</string>
<string name="what_happened_headline">Waxa dhacay:</string>
<string name="what_device_headline">Xog:</string>
<string name="error_snackbar_action">Wari</string>
<string name="error_snackbar_message">Waan ka xunahay, waxbaa khaldamay.</string>
<string name="error_report_open_github_notice">Fadlan hubi in arin ciladdaada ka hadlaya horay loo wariyay. Marka wax horay u jiray la wariyo markale, wakhti ayaad naga qaadaysaa kaasoo aan cilada ku sixi la hayn.</string>
<string name="error_report_open_issue_button_text">Ku wari GitHub-ka</string>
<string name="copy_for_github">Koobiyee warka oo diyaarsan</string>
<string name="error_report_button_text">Khaladkan email ahaan ku warceli</string>
<string name="sorry_string">Wan ka xunahay, sidaa inay dhacdo ma ahayn.</string>
<string name="permission_display_over_apps">U ogolow app-ka inuu dul fuulo applicationada kale</string>
<string name="restore_defaults_confirmation">Ma rabtaa inaad sidii hore ku celiso\?</string>
<string name="restore_defaults">Dib ugu fadhiisi sidii hore</string>
<string name="saved_tabs_invalid_json">Lama akhrin karo daaqadihii la kaydiyay, ...isticmaalaya kuwii app-ku kusoo baxay</string>
<string name="no_streams_available_download">Wax la dajiyo lama heli karo</string>
<string name="error_occurred_detail">Khalad ayaa ka dhacay:</string>
<string name="file_name_empty_error">Magaca shayga ma madhnaan karo</string>
<string name="invalid_file">Shaygani ma jiro ama ogolaansho looma haysto in wax laga badalo</string>
<string name="invalid_source">Shaygan ma jiro/tixraacan</string>
<string name="invalid_directory">Galkan ma jiro</string>
<string name="missing_file">Shaygan waa la guuriyay ama waa la tirtiray</string>
<string name="audio_streams_empty">Codad la dhagaysto lama helin</string>
<string name="video_streams_empty">Muuqaalo la daawado lama helin</string>
<string name="invalid_url_toast">Tixraac khaldan</string>
<string name="external_player_unsupported_link_type">Muuqaal daarayaasha dibada ah linkiyda noocan ah ma furaan</string>
<string name="player_recoverable_failure">Kasoo kabashadii muuqaal daaraha khalad ayaa ka dhacay</string>
<string name="player_unrecoverable_failure">Khalad aan laga soo kaban karin ayaa dhacay</string>
<string name="player_stream_failure">Muuqaalkan lama daari karo</string>
<string name="app_ui_crash">App-ka/UI-ga ayaa khalkhalay</string>
<string name="could_not_load_image">Sawirka lama soo kicin karo</string>
<string name="could_not_get_stream">Wax la daawado lama heli karo</string>
<string name="live_streams_not_supported">Muuqaalada tooska ah wali lama taageerin</string>
<string name="could_not_setup_download_menu">Lama soo kicin karo meeshii soodajinta</string>
<string name="content_not_available">Shaygan lama heli karo</string>
<string name="light_parsing_error">Website-ka si buuxda looma furi karo</string>
<string name="parsing_error">Lama furi karo website-ka</string>
<string name="youtube_signature_deobfuscation_error">Lama badali karo sixiixa tixraaca muuqaalka</string>
<string name="could_not_load_thumbnails">Lama kicin karo galalka</string>
<string name="network_error">Khalad xaga khadka ah</string>
<string name="download_to_sdcard_error_message">Ku dajinta kaydka dibadda ee SD-ga suurtogal ma aha. Dib u fadhiisi meesha wax lagu dajiyo\?</string>
<string name="download_to_sdcard_error_title">Kaydka dibadda lama heli karo</string>
<string name="general_error">Khalad</string>
<string name="help">Caawin</string>
<string name="search_history_deleted">Wixii la raadiyay waa la tirtiray.</string>
<string name="delete_search_history_alert">Tirtir dhamaan wixii la raadiyay\?</string>
<string name="clear_search_history_summary">Wuxuu tirtiraa kaydka wixii la raadiyay</string>
<string name="watch_history_states_deleted">Meelihii ay marayeen waa la tirtiray.</string>
<string name="clear_search_history_title">Tir</string>
<string name="delete_playback_states_alert">Tirtir dhamaan meelaha ay marayaan\?</string>
<string name="clear_playback_states_summary">Wuxuu tirtiraa meelihii ay kuu marayeen</string>
<string name="clear_playback_states_title">Tirtir meelaha ay marayaan waxa la daaray</string>
<string name="file">Shay</string>
<string name="popup_resizing_indicator_title">Dib-Ucabirida</string>
<string name="clear">Nadiifi</string>
<string name="artists">Fanaan</string>
<string name="albums">Albumo</string>
<string name="songs">Heeso</string>
<string name="tracks">Qaybo</string>
<string name="playlists">Xulal</string>
<string name="playlist">Xul</string>
<string name="channels">Kanaalo</string>
<string name="channel">Kanaal</string>
<string name="downloads_title">Soodajinta</string>
<string name="downloads">Soodajinta</string>
<string name="duration_live">Toos</string>
<string name="undo">Ka noqo</string>
<string name="refresh">Cusboonaysii</string>
<string name="filter">Kala shaandhee</string>
<string name="disabled">Xidhan</string>
<string name="yes">Haa</string>
<string name="users">Isticmaal</string>
<string name="videos_string">Muuqaal</string>
<string name="all">Dhamaan</string>
<string name="watch_history_deleted">Kaydka wixii ladaawaday waa la tirtiray.</string>
<string name="delete_view_history_alert">Tirtir gabi ahaan kaydka wixii ladaawaday\?</string>
<string name="clear_views_history_summary">Wuxuu tirtiraa kaydka wixii la daawaday iyo meelihii ay kuu</string>
<string name="clear_views_history_title">Nadiifi kaydka wixii ladaawaday</string>
<string name="clear_cookie_summary">Nadiifi kaydka uu NewPipe kaydiyo markaad xaliso reCAPTCHA</string>
<string name="export_data_summary">Dibadda u gudbi kaydka wixii la daawaday, rukunka, xulalka iyo</string>
<string name="import_data_summary">Wuxuu badalaa kaydka waxaad daawatay, rukunka, xulalka iyo (hadaad doonto)</string>
<string name="recaptcha_cookies_cleared">Kaydkii reCAPTCHA waa la</string>
<string name="clear_cookie_title">Nadiifi kaydka reCAPTCHA</string>
<string name="export_data_title">Gudbi</string>
<string name="import_data_title">Soo gali xog kaydsan</string>
<string name="switch_to_main">U badal</string>
<string name="switch_to_popup">U baddal</string>
<string name="switch_to_background">U baddal xaga dambe</string>
<string name="toggle_orientation">Dhinaca</string>
<string name="unknown_content">[Garanwaa]</string>
<string name="hash_channel_name">Ogaysiiska adalida Muuqaalka</string>
<string name="hash_channel_description">Ogaysiisyada heerka uu marayo badalida muuqaalka</string>
<string name="app_update_notification_channel_description">Ogaysiisyada nooca cusub ee</string>
<string name="app_update_notification_channel_name">Ogaysiiska Cusbonaysiinta NewPipe</string>
<string name="notification_channel_description">Ogaysiisyada NewPipe markuu gadaal ka shidan yahay</string>
<string name="notification_channel_name">Ogaysiisyada NewPipe</string>
<string name="just_once">Hal</string>
<string name="always">Mar</string>
<string name="play_all">Daar</string>
<string name="file_deleted">Waa la saaray</string>
<string name="best_resolution">Tayada</string>
<string name="later">Hadhow</string>
<string name="events">Dhacdooyin</string>
<string name="error_report_title">Faahfaahinta</string>
<string name="restricted_video">Muuqaalkan da\'da ayuu ku xidhan yahay
\n
\nXaga fadhiga ka fur \"%1$s\" hadaad rabto inaad furto.</string>
<string name="youtube_restricted_mode_enabled_summary">YouTube-ku wuxuu leeyahay \"Qaabka Xadidan\" kaasoo qariya waxyaabo laga yaabo ineysa haboonayn</string>
<string name="youtube_restricted_mode_enabled_title">Fur nidaamka YouTube-ka \"Qaabka Xadidan\"</string>
<string name="show_age_restricted_content_summary">Soo bandhig muuqaalada laga yaabo inaysa ku haboonayn caruurta sababtoo ah waxay ku xidhan yihiin da\'da (sida 18+)</string>
<string name="show_age_restricted_content_title">Tus muuqaalada da\'da ubaahan</string>
<string name="content">shay-ga</string>
<string name="popup_playing_append">Waxaa lagu horay daaqada</string>
<string name="background_player_append">Waxaa lagu horay xaga dambe</string>
<string name="popup_playing_toast">Ku daaraya daaqada</string>
<string name="background_player_playing_toast">Ka daaraya xaga dambe</string>
<string name="settings_category_notification_title">Ogaysiisyada</string>
<string name="settings_category_updates_title">Cusboonaysiinta</string>
<string name="settings_category_debug_title">Cilad-bixinta</string>
<string name="settings_category_other_title">Waxyaabo kale</string>
<string name="settings_category_appearance_title">Muuqaalka</string>
<string name="settings_category_popup_title">Daaqada</string>
<string name="settings_category_history_title">Taariikhdka &amp; kaydka kumeelgadhka</string>
<string name="settings_category_video_audio_title">Muuqaalka iyo codka</string>
<string name="settings_category_player_title">Muuqaal daareha</string>
<string name="settings_category_player_behavior_title">Dabeecada</string>
<string name="peertube_instance_add_exists">Qaybtan horay ayay ujirtay</string>
<string name="peertube_instance_add_https_only">Kaliya waxaa la furi karaa URL-lada HTTPS ka ah</string>
<string name="peertube_instance_add_fail">Lama ansixin karo qaybtan</string>
<string name="peertube_instance_add_help">Gali URL-ka qaybta</string>
<string name="peertube_instance_add_title">Ku dar qaybta</string>
<string name="peertube_instance_url_help">%s ka hel qaybaha aad jeceshahay</string>
<string name="peertube_instance_url_summary">Dooro qaybaha aad jeceshahay ee PeerTube-ka</string>
<string name="peertube_instance_url_title">Qaybaha PeerTube</string>
<string name="content_language_title">Luuqada muuqaalada</string>
<string name="service_title">Adeeg</string>
<string name="default_content_country_title">Wadanka muuqaalada</string>
<string name="unsupported_url_dialog_message">Lama garan karo URL-kan. Ku fur app kale\?</string>
<string name="unsupported_url">URL aan la furi karin</string>
<string name="show_hold_to_append_summary">Tus sharaxaada marka la riixayo batoonka gadaal ama midka daaqada ee ku yaala \"Faahfaahinta:\" muuqaalka</string>
<string name="show_hold_to_append_title">Tus sharaxaha \"Farta ku hay si aad iskugu darto\"</string>
<string name="show_next_and_similar_title">Soo dhig muuqaalada \"Ka xiga\" iyo \"Kuwa lamidka h\"</string>
<string name="autoplay_title">Isdaarida</string>
<string name="download_dialog_title">Daji</string>
<string name="resume_on_audio_focus_gain_summary">Sii wad wixii daarada marka la dhabqiyo kadib (tus. wicitaanada)</string>
<string name="resume_on_audio_focus_gain_title">Sii wad</string>
<string name="enable_watch_history_summary">La soco muuqaalada ladaawaday</string>
<string name="settings_category_clear_data_title">Tirtir xogta</string>
<string name="enable_playback_state_lists_summary">Kusoo bandhig meelaha laga daarayo liis-tada</string>
<string name="enable_playback_state_lists_title">Meelaha liis-tada ku jira</string>
<string name="enable_playback_resume_summary">Kasii wad meeshii hore</string>
<string name="enable_playback_resume_title">Siiwad wixii hore</string>
<string name="enable_watch_history_title">Wixii horay looraadiyay</string>
<string name="enable_search_history_summary">Kaydi wixii la raadiyay (aalada)</string>
<string name="enable_search_history_title">Wixii laraadiyay</string>
<string name="show_search_suggestions_summary">Tus soojeedino marka wax la raadinayo</string>
<string name="show_search_suggestions_title">Soojeedinta Raadinta</string>
<string name="player_gesture_controls_summary">Isticmaal fartaada si aad umaamusho iftiinka iyo codka</string>
<string name="player_gesture_controls_title">Maamulista daaraha (farta)</string>
<string name="brightness_gesture_control_summary">Isticmaal fartaada si aad u maamusho iftiinka</string>
<string name="brightness_gesture_control_title">Maamulista iftiinka (farta)</string>
<string name="volume_gesture_control_summary">Isticmaal fartaada si aad umaamusho codka</string>
<string name="volume_gesture_control_title">Maamulista codka ee farta</string>
<string name="auto_queue_toggle">Hormada-isutalisa</string>
<string name="auto_queue_summary">Sii wad dhamaynta (mida aan isku celcelinin) hormada shidan ayadoo lagu darayo waxyaabo la xidhiidha</string>
<string name="auto_queue_title">Ku xiji hormada la daari doono</string>
<string name="metadata_cache_wipe_complete_notice">Waa la tirtiray yaryarkii</string>
<string name="metadata_cache_wipe_summary">Tirtir waxyaabaha kumeelgaadhka ah</string>
<string name="metadata_cache_wipe_title">Tirtir waxyaabaha yaryar</string>
<string name="thumbnail_cache_wipe_complete_notice">kaydkii kumeelgaadhka ahaa ee sawirka waa la tirtiray</string>
<string name="download_thumbnail_summary">Xidh si aad u joojiso soobandhiga galalka muuqaalada, adigoo yaraynaya isticmalka khadka iyo maskaxda. Waxkabadalkan wuxuu nafiifin waxa kaydka hore iyo ka caadiga ah kumeelgaadh ahan ugu jira.</string>
<string name="show_comments_summary">Xidh si aad u qariso aragtiyada</string>
<string name="show_comments_title">Tus aragtitada</string>
<string name="download_thumbnail_title">Soosaar galka muuqaalka</string>
<string name="clear_queue_confirmation_description">Hormada muuqaal daaraha hada wax shidaya waa la badali doonaa</string>
<string name="clear_queue_confirmation_summary">Kalabadalka muuqaal daaraha waxay badali kartaa hormada</string>
<string name="clear_queue_confirmation_title">Waydii in la xaqiijiyo intan hormada la tirtirin</string>
<string name="seek_duration_title">Horay-udhaafinta/-dibucelinta wakhtigeeda</string>
<string name="use_inexact_seek_summary">Dhaaf-dhaafinta waxa daaran ee aan boqolkiiba boqol saxda ahayn waxay u sahashaa muuqaal daaraha inuu u dhaaf dhaafiyo si dagdag ah. Nidaamkan 5, 15 ama 25 ilbiriqsi wax looma dhaafdhaafin karo.</string>
<string name="black_theme_title">Madow</string>
<string name="light_theme_title">Caddaan</string>
<string name="play_audio">Cod</string>
<string name="notification_action_nothing">Waxba</string>
<string name="autoplay_by_calling_app_title">Isdaar</string>
<string name="screen_rotation">gaddinta</string>
<string name="search">Raadi</string>
<string name="download">Daji</string>
</resources>

View file

@ -2,7 +2,7 @@
<resources>
<string name="view_count_text">%1$s приказа</string>
<string name="upload_date_text">Објављен %1$s</string>
<string name="no_player_found">Нема плејера токова. Инсталирати ВЛЦ\?</string>
<string name="no_player_found">Нема плејера токова. Желите ли да инсталирате ВЛЦ\?</string>
<string name="install">Инсталирај</string>
<string name="cancel">Одустани</string>
<string name="open_in_browser">Отвори у прегледачу</string>

View file

@ -645,8 +645,11 @@
<string name="clear_cookie_title">reCAPTCHA çerezlerini temizle</string>
<string name="youtube_restricted_mode_enabled_summary">YouTube, olası yetişkin içeriği gizleyen \"Kısıtlı Kip\" sağlamaktadır</string>
<string name="show_age_restricted_content_summary">Yaş kısıtı (18+ gibi) nedeniyle çocuklara uygun olmayabilecek içeriği göster</string>
<string name="show_thumbnail_summary">Küçük resmi kilit ekranında arka plan olarak ve bildirimlerin içinde göster</string>
<string name="show_thumbnail_summary">Hem kilit ekranı arka planı hem de bildirimler için küçük resmi kullan</string>
<string name="show_thumbnail_title">Küçük resmi göster</string>
<string name="notification_colorize_summary">Android\'in bildirim rengini küçük resimdeki ana renge göre özelleştirmesini sağlayın (bunun tüm aygıtlarda kullanılamadığını unutmayın)</string>
<string name="notification_colorize_title">Bildirimi renklendir</string>
<string name="msg_calculating_hash">Dosya özeti hesaplanıyor</string>
<string name="hash_channel_description">Video dosya özetleme süreci için bildirimler</string>
<string name="hash_channel_name">Video Dosya Özeti Bildirimi</string>
</resources>

View file

@ -12,6 +12,7 @@
<style name="BlackTheme.YouTube" parent="BlackTheme">
<item name="colorPrimaryDark">@color/dark_youtube_statusbar_color</item>
</style>
<!-- SoundCloud -->
<style name="LightTheme.SoundCloud" parent="LightTheme">
<item name="colorPrimary">@color/light_soundcloud_primary_color</item>
@ -50,20 +51,20 @@
<item name="colorAccent">@color/dark_peertube_accent_color</item>
</style>
<!-- Media.ccc -->
<style name="LightTheme.MediaCCC" parent="LightTheme">
<!-- media.ccc.de -->
<style name="LightTheme.media.ccc.de" parent="LightTheme">
<item name="colorPrimary">@color/light_media_ccc_primary_color</item>
<item name="colorPrimaryDark">@color/light_media_ccc_statusbar_color</item>
<item name="colorAccent">@color/light_media_ccc_accent_color</item>
</style>
<style name="DarkTheme.MediaCCC" parent="DarkTheme">
<style name="DarkTheme.media.ccc.de" parent="DarkTheme">
<item name="colorPrimary">@color/dark_media_ccc_primary_color</item>
<item name="colorPrimaryDark">@color/dark_media_ccc_statusbar_color</item>
<item name="colorAccent">@color/dark_media_ccc_accent_color</item>
</style>
<style name="BlackTheme.MediaCCC" parent="BlackTheme">
<style name="BlackTheme.media.ccc.de" parent="BlackTheme">
<item name="colorPrimary">@color/dark_media_ccc_primary_color</item>
<item name="colorPrimaryDark">@color/dark_media_ccc_statusbar_color</item>
<item name="colorAccent">@color/dark_media_ccc_accent_color</item>

View file

@ -93,7 +93,7 @@
<string name="light_parsing_error">無法完全解析網站</string>
<string name="content_not_available">內容無法使用</string>
<string name="could_not_setup_download_menu">無法設定下載選單</string>
<string name="live_streams_not_supported">尚未支援現場串流</string>
<string name="live_streams_not_supported">尚未支援直播串流</string>
<string name="could_not_get_stream">無法取得串流</string>
<string name="could_not_load_image">無法載入圖片</string>
<string name="app_ui_crash">應用程式或界面已停止運作</string>
@ -121,9 +121,9 @@
<string name="delete">刪除</string>
<string name="checksum">檢查碼</string>
<string name="add">新任務</string>
<string name="finish"></string>
<string name="finish">確定</string>
<string name="msg_name">檔案名稱</string>
<string name="msg_threads">連線數</string>
<string name="msg_threads">執行緒數目</string>
<string name="msg_error">錯誤</string>
<string name="msg_server_unsupported">不支援的伺服器</string>
<string name="msg_exists">檔案已存在</string>
@ -149,7 +149,7 @@
<string name="fragment_feed_title">新鮮事</string>
<string name="enable_search_history_title">搜尋紀錄</string>
<string name="enable_search_history_summary">在本機儲存搜尋紀錄</string>
<string name="enable_watch_history_title">檢視歷史</string>
<string name="enable_watch_history_title">觀看紀錄</string>
<string name="enable_watch_history_summary">記錄觀看過的影片</string>
<string name="resume_on_audio_focus_gain_title">恢復播放</string>
<string name="resume_on_audio_focus_gain_summary">在干擾結束後繼續播放(例如有來電)</string>
@ -329,7 +329,7 @@
\n2. 當被提示時登入帳號
\n3. 點擊「包含所有資料」,然後「取消選取全部」,然後僅選取「訂閱」並點擊「確定」
\n4. 點擊「下一步」然後「建立匯出」
\n5. 在「下載」按鈕出現後點擊它然後
\n5. 在「下載」按鈕出現後點擊它然後
\n6. 從已下載的 takeout zip 解壓縮 .json 檔通常會在「YouTube 與 YouTube Music/subscriptions/subscriptions.json」然後匯入它。</string>
<string name="import_soundcloud_instructions_hint">yourID, soundcloud.com/yourid</string>
<string name="import_network_expensive_warning">請記住,此操作可造成昂貴網路花費。
@ -388,7 +388,7 @@
<string name="playback_reset">重設</string>
<string name="channels">頻道</string>
<string name="playlists">播放清單</string>
<string name="tracks"></string>
<string name="tracks">曲目</string>
<string name="users">使用者</string>
<string name="unsubscribe">取消訂閱</string>
<string name="tab_new">新分頁</string>
@ -418,25 +418,25 @@
<string name="switch_view">切換檢視</string>
<string name="app_update_notification_content_title">有可用的 NewPipe 更新!</string>
<string name="app_update_notification_content_text">輕觸以下載</string>
<string name="missions_header_finished">結束</string>
<string name="missions_header_pending">有待</string>
<string name="missions_header_finished">已完成</string>
<string name="missions_header_pending">有待處理</string>
<string name="paused">已暫停</string>
<string name="queued">已排入佇列</string>
<string name="post_processing">正在後處理</string>
<string name="enqueue">佇列</string>
<string name="permission_denied">動作被系統拒絕</string>
<string name="download_failed">下載失敗</string>
<string name="download_finished">下載已結束</string>
<string name="download_finished_more">%s 個下載已結束</string>
<string name="download_finished">下載已完成</string>
<string name="download_finished_more">%s 個下載已完成</string>
<string name="generate_unique_name">生成獨特的名稱</string>
<string name="overwrite">覆寫</string>
<string name="overwrite_finished_warning">已有此名稱的已下載檔案</string>
<string name="download_already_running">已有此名稱的當案的下載正在進行</string>
<string name="download_already_running">已有進行中的下載與此同名</string>
<string name="show_error">顯示錯誤</string>
<string name="label_code">代碼</string>
<string name="error_file_creation">無法建立檔案</string>
<string name="error_path_creation">無法建立目的地資料夾</string>
<string name="error_permission_denied">被系統拒絕的權限</string>
<string name="error_permission_denied">權限被系統拒絕</string>
<string name="error_ssl_exception">無法建立安全連線</string>
<string name="error_unknown_host">找不到伺服器</string>
<string name="error_connect_host">無法連線到伺服器</string>
@ -451,7 +451,7 @@
<string name="pause_downloads_on_mobile_desc">在切換到行動數據時很有用(雖然某些下載無法暫停)</string>
<string name="events">事件</string>
<string name="conferences">會議</string>
<string name="error_timeout">接超</string>
<string name="error_timeout">線已逾</string>
<string name="show_comments_title">顯示留言</string>
<string name="show_comments_summary">關閉以隱藏留言</string>
<string name="autoplay_title">自動播放</string>
@ -467,17 +467,17 @@
<string name="missing_file">檔案已移動或已刪除</string>
<string name="overwrite_unrelated_warning">與此同名的檔案已存在</string>
<string name="overwrite_failed">無法覆寫檔案</string>
<string name="download_already_pending">同名的擱置中下載</string>
<string name="download_already_pending">有擱置中下載與此同名</string>
<string name="error_postprocessing_stopped">NewPipe 在處理檔案時被關閉</string>
<string name="error_insufficient_storage">裝置上沒有剩餘的空間</string>
<string name="error_progress_lost">進度遺失,因為檔案已被刪除</string>
<string name="confirm_prompt">您想要清除您的下載歷史紀錄或刪除所有已下載的檔案嗎</string>
<string name="confirm_prompt">您想要清除您的下載歷史紀錄,還是刪除所有已下載的檔案</string>
<string name="enable_queue_limit">限制下載佇列</string>
<string name="enable_queue_limit_desc">一次執行一個下載</string>
<string name="start_downloads">開始下載</string>
<string name="pause_downloads">暫停下載</string>
<string name="downloads_storage_ask_title">詢問要下載到哪裡</string>
<string name="downloads_storage_ask_summary">每次下載您都會被詢問要下載到哪裡</string>
<string name="downloads_storage_ask_summary">每次下載詢問要下載到哪裡</string>
<string name="downloads_storage_ask_summary_kitkat">每次下載您都會被詢問要下載到哪裡。
\n如果您想要下載到外部的 SD 卡的話,請選擇 SAF</string>
<string name="downloads_storage_use_saf_title">使用 SAF</string>
@ -489,7 +489,7 @@
<string name="download_choose_new_path">變更下載資料夾以使其生效</string>
<string name="drawer_header_description">切換服務,目前已選取:</string>
<plurals name="videos">
<item quantity="other">%s 影片</item>
<item quantity="other">%s 影片</item>
</plurals>
<string name="default_kiosk_page_summary">預設 Kiosk</string>
<string name="no_one_watching">沒有人在看</string>
@ -515,7 +515,7 @@
<string name="most_liked">最喜歡</string>
<string name="playlist_no_uploader">自動生成(未找到上傳者)</string>
<string name="recovering">正在恢復</string>
<string name="error_download_resource_gone">無法復此下載</string>
<string name="error_download_resource_gone">無法復此下載</string>
<string name="choose_instance_prompt">選擇一個站臺</string>
<string name="clear_download_history">清除下載歷史紀錄</string>
<string name="delete_downloaded_files">刪除已下載的檔案</string>
@ -582,11 +582,11 @@
<string name="artists">藝術家</string>
<string name="albums">專輯</string>
<string name="songs">歌曲</string>
<string name="restricted_video">此影片有年鈴限制。
<string name="restricted_video">此影片設有年齡限制。
\n
\n如果您想要觀看請在設定中開啟「%1$s」。</string>
<string name="remove_watched_popup_yes_and_partially_watched_videos">是的,以及部份觀看的影片</string>
<string name="remove_watched_popup_warning">在新增到播放清單前的影片將被移除。
<string name="remove_watched_popup_yes_and_partially_watched_videos">是的,包括已部份觀看的影片</string>
<string name="remove_watched_popup_warning">在新增到播放清單前和後已觀看的影片將被移除。
\n您確定嗎此動作無法復原</string>
<string name="remove_watched_popup_title">移除已觀看的影片?</string>
<string name="remove_watched">移除已觀看</string>
@ -637,6 +637,9 @@
<string name="show_age_restricted_content_summary">顯示可能不適於兒童的內容因為其有年齡限制如18歲以上等</string>
<string name="notification_colorize_summary">讓 Android 根據縮圖中的主要色彩來自訂通知的顏色(請注意,此功能不是在所有裝置上都能正常運作)</string>
<string name="notification_colorize_title">彩色通知</string>
<string name="show_thumbnail_summary">在鎖定畫面上顯示縮圖作為背景與內部通知</string>
<string name="show_thumbnail_summary">於鎖定畫面背景與通知使用縮圖</string>
<string name="show_thumbnail_title">顯示縮圖</string>
<string name="msg_calculating_hash">正在計算雜湊</string>
<string name="hash_channel_description">影片雜湊流程通知</string>
<string name="hash_channel_name">影片雜湊通知</string>
</resources>

View file

@ -33,7 +33,7 @@
<color name="dark_peertube_accent_color">#FFFFFF</color>
<color name="dark_peertube_statusbar_color">#ff6f00</color>
<!-- Media.CCC -->
<!-- media.ccc.de -->
<color name="light_media_ccc_primary_color">#9e9e9e</color>
<color name="light_media_ccc_dark_color">#616161</color>
<color name="light_media_ccc_accent_color">#000000</color>

View file

@ -100,7 +100,7 @@
<!-- Playlist View Dimensions-->
<dimen name="playlist_item_thumbnail_stream_count_width">60dp</dimen>
<dimen name="playlist_ctrl_height">50dp</dimen>
<dimen name="playlist_ctrl_seperator_margin">10dp</dimen>
<dimen name="playlist_ctrl_separator_margin">10dp</dimen>
<!-- Text Size -->
<dimen name="playlist_item_title_text_size">14sp</dimen>
<dimen name="playlist_detail_title_text_size">16sp</dimen>

View file

@ -197,6 +197,7 @@
<string name="show_play_with_kodi_key" translatable="false">show_play_with_kodi</string>
<string name="show_next_video_key" translatable="false">show_next_video</string>
<string name="show_comments_key" translatable="false">show_comments</string>
<string name="show_meta_info_key" translatable="false">show_meta_info</string>
<string name="stream_info_selected_tab_key" translatable="false">stream_info_selected_tab</string>
<string name="show_hold_to_append_key" translatable="false">show_hold_to_append</string>
<string name="content_language_key" translatable="false">content_language</string>
@ -1066,6 +1067,7 @@
<item>sc</item>
<item>sk</item>
<item>sl</item>
<item>so</item>
<item>sq</item>
<item>sr</item>
<item>sv</item>
@ -1143,6 +1145,7 @@
<item>sardu</item>
<item>Slovenčina</item>
<item>Slovenščina</item>
<item>Af Soomaali</item>
<item>Shqip</item>
<item>Српски</item>
<item>Svenska</item>

View file

@ -93,6 +93,8 @@
<string name="show_comments_title">Show comments</string>
<string name="show_comments_summary">Turn off to hide comments</string>
<string name="download_thumbnail_summary">Turn off to prevent loading thumbnails, saving data and memory usage. Changes clear both in-memory and on-disk image cache.</string>
<string name="show_meta_info_title">Show meta info</string>
<string name="show_meta_info_summary">Turn off to hide meta info boxes with additional information about the stream creator, stream content or a search request.</string>
<string name="thumbnail_cache_wipe_complete_notice">Image cache wiped</string>
<string name="metadata_cache_wipe_title">Wipe cached metadata</string>
<string name="metadata_cache_wipe_summary">Remove all cached webpage data</string>
@ -195,6 +197,9 @@
<string name="app_update_notification_channel_id" translatable="false">newpipeAppUpdate</string>
<string name="app_update_notification_channel_name">App Update Notification</string>
<string name="app_update_notification_channel_description">Notifications for new NewPipe version</string>
<string name="hash_channel_id" translatable="false">newpipeHash</string>
<string name="hash_channel_name">Video Hash Notification</string>
<string name="hash_channel_description">Notifications for video hashing progress</string>
<string name="unknown_content">[Unknown]</string>
<string name="toggle_orientation">Toggle Orientation</string>
<string name="switch_to_background">Switch to Background</string>
@ -347,6 +352,7 @@
<string name="msg_url_malform">Malformed URL or Internet not available</string>
<string name="msg_running">NewPipe Downloading</string>
<string name="msg_running_detail">Tap for details</string>
<string name="msg_calculating_hash">Calculating hash</string>
<string name="msg_wait">Please wait…</string>
<string name="msg_copied">Copied to clipboard</string>
<string name="no_available_dir">Please define a download folder later in settings</string>
@ -387,14 +393,14 @@
<string name="view_on_github">View on GitHub</string>
<string name="donation_title">Donate</string>
<string name="donation_encouragement">NewPipe is developed by volunteers spending their free time bringing you the best user experience. Give back to help developers make NewPipe even better while they enjoy a cup of coffee.</string>
<string name="donation_url" translatable="false">https://newpipe.schabi.org/donate</string>
<string name="donation_url" translatable="false">https://newpipe.net/donate</string>
<string name="give_back">Give back</string>
<string name="website_title">Website</string>
<string name="website_encouragement">Visit the NewPipe Website for more info and news.</string>
<string name="website_url" translatable="false">https://newpipe.schabi.org/</string>
<string name="website_url" translatable="false">https://newpipe.net/</string>
<string name="privacy_policy_title">NewPipe\'s Privacy Policy</string>
<string name="privacy_policy_encouragement">The NewPipe project takes your privacy very seriously. Therefore, the app does not collect any data without your consent.\nNewPipe\'s privacy policy explains in detail what data is sent and stored when you send a crash report.</string>
<string name="privacy_policy_url" translatable="false">https://newpipe.schabi.org/legal/privacy/</string>
<string name="privacy_policy_url" translatable="false">https://newpipe.net/legal/privacy/</string>
<string name="read_privacy_policy">Read privacy policy</string>
<string name="app_license_title">NewPipe\'s License</string>
<string name="app_license">NewPipe is copyleft libre software: You can use, study share and improve it at will. Specifically you can redistribute and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</string>
@ -684,5 +690,5 @@
<string name="video_detail_by">By %s</string>
<string name="playlist_page_summary">Playlist page</string>
<string name="show_thumbnail_title">Show thumbnail</string>
<string name="show_thumbnail_summary">Show thumbnail on lock screen as background and inside notifications</string>
<string name="show_thumbnail_summary">Use thumbnail for both lock screen background and notifications</string>
</resources>

View file

@ -51,20 +51,20 @@
<item name="colorAccent">@color/dark_peertube_accent_color</item>
</style>
<!-- Media.ccc -->
<style name="LightTheme.MediaCCC" parent="LightTheme">
<!-- media.ccc.de -->
<style name="LightTheme.media.ccc.de" parent="LightTheme">
<item name="colorPrimary">@color/light_media_ccc_primary_color</item>
<item name="colorPrimaryDark">@color/light_media_ccc_statusbar_color</item>
<item name="colorAccent">@color/light_media_ccc_accent_color</item>
</style>
<style name="DarkTheme.MediaCCC" parent="DarkTheme">
<style name="DarkTheme.media.ccc.de" parent="DarkTheme">
<item name="colorPrimary">@color/dark_media_ccc_primary_color</item>
<item name="colorPrimaryDark">@color/dark_media_ccc_statusbar_color</item>
<item name="colorAccent">@color/dark_media_ccc_accent_color</item>
</style>
<style name="BlackTheme.MediaCCC" parent="BlackTheme">
<style name="BlackTheme.media.ccc.de" parent="BlackTheme">
<item name="colorPrimary">@color/dark_media_ccc_primary_color</item>
<item name="colorPrimaryDark">@color/dark_media_ccc_statusbar_color</item>
<item name="colorAccent">@color/dark_media_ccc_accent_color</item>

View file

@ -85,6 +85,13 @@
android:title="@string/show_comments_title"
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="@string/show_meta_info_key"
android:summary="@string/show_meta_info_summary"
android:title="@string/show_meta_info_title"
app:iconSpaceReserved="false" />
<Preference
android:key="@string/import_data"
android:summary="@string/import_data_summary"

View file

@ -0,0 +1,27 @@
package org.schabi.newpipe
import org.junit.Assert.assertEquals
import org.junit.Test
import org.schabi.newpipe.ReCaptchaActivity.YT_URL
class ReCaptchaActivityTest {
private fun assertSanitized(expected: String, actual: String?) {
assertEquals(expected, ReCaptchaActivity.sanitizeRecaptchaUrl(actual))
}
@Test fun `null, empty or blank url is sanitized correctly`() {
assertSanitized(YT_URL, null)
assertSanitized(YT_URL, "")
assertSanitized(YT_URL, " \n \t ")
}
@Test fun `YouTube url containing pbj=1 is sanitized correctly`() {
val sanitizedUrl = "https://m.youtube.com/results?search_query=test"
assertSanitized(sanitizedUrl, "https://m.youtube.com/results?search_query=test")
assertSanitized(sanitizedUrl, "https://m.youtube.com/results?search_query=test&pbj=1&pbj=1")
assertSanitized(sanitizedUrl, "https://m.youtube.com/results?pbj=1&search_query=test")
assertSanitized("pbj://pbj.pbj.pbj/pbj", "pbj://pbj.pbj.pbj/pbj?pbj=1")
assertSanitized("http://www.host.com/b?p1=7&p2=9", "http://www.host.com/b?p1=7&pbj=1&p2=9")
assertSanitized("http://www.host.com/a?pbj=0", "http://www.host.com/a?pbj=0")
}
}

View file

@ -4,7 +4,6 @@ import org.junit.Assert.assertEquals
import org.junit.Test
import java.time.LocalDate
import java.time.OffsetDateTime
import java.time.ZoneId
import java.time.ZoneOffset
import java.util.Calendar
import java.util.TimeZone
@ -13,7 +12,7 @@ class OffsetDateTimeToCalendarTest {
@Test
fun testRelativeTimeWithCurrentOffsetDateTime() {
val calendar = LocalDate.of(2020, 1, 1).atStartOfDay().atOffset(ZoneOffset.UTC)
.toCalendar()
.toCalendar()
assertEquals(2020, calendar[Calendar.YEAR])
assertEquals(0, calendar[Calendar.MONTH])

View file

@ -0,0 +1,76 @@
package org.schabi.newpipe.settings
import android.content.SharedPreferences
import org.junit.Assert
import org.junit.Assume
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Suite
import org.mockito.Mockito
import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnitRunner
import org.schabi.newpipe.settings.ContentSettingsManagerTest.ExportTest
import java.io.File
import java.io.ObjectInputStream
import java.util.zip.ZipFile
@RunWith(Suite::class)
@Suite.SuiteClasses(ExportTest::class)
class ContentSettingsManagerTest {
@RunWith(MockitoJUnitRunner::class)
class ExportTest {
companion object {
private lateinit var newpipeDb: File
private lateinit var newpipeSettings: File
@JvmStatic
@BeforeClass
fun setupFiles() {
val dbPath = ExportTest::class.java.classLoader?.getResource("settings/newpipe.db")?.file
val settingsPath = ExportTest::class.java.classLoader?.getResource("settings/newpipe.settings")?.path
Assume.assumeNotNull(dbPath)
Assume.assumeNotNull(settingsPath)
newpipeDb = File(dbPath!!)
newpipeSettings = File(settingsPath!!)
}
}
private lateinit var preferences: SharedPreferences
@Before
fun setupMocks() {
preferences = Mockito.mock(SharedPreferences::class.java, Mockito.withSettings().stubOnly())
}
@Test
fun `The settings must be exported successfully in the correct format`() {
val expectedPreferences = mapOf("such pref" to "much wow")
`when`(preferences.all).thenReturn(expectedPreferences)
val manager = ContentSettingsManager(newpipeDb, newpipeSettings)
val output = File.createTempFile("newpipe_", "")
manager.exportDatabase(preferences, output.absolutePath)
val zipFile = ZipFile(output.absoluteFile)
val entries = zipFile.entries().toList()
Assert.assertEquals(2, entries.size)
zipFile.getInputStream(entries.first { it.name == "newpipe.db" }).use { actual ->
newpipeDb.inputStream().use { expected ->
Assert.assertEquals(expected.reader().readText(), actual.reader().readText())
}
}
zipFile.getInputStream(entries.first { it.name == "newpipe.settings" }).use { actual ->
val actualPreferences = ObjectInputStream(actual).readObject()
Assert.assertEquals(expectedPreferences, actualPreferences)
}
}
}
}

View file

@ -0,0 +1 @@
such db much wow

View file

@ -17,7 +17,7 @@
<suppress checks="EmptyBlock"
files="ContentSettingsFragment.java"
lines="244,245"/>
lines="227,245"/>
<!-- org.schabi.newpipe.streams -->
<suppress checks="LineLength"

View file

@ -0,0 +1 @@
Regex für Entschlüsselungsfunktionsname, das YouTube unverwendbar macht, reapariert.

View file

@ -0,0 +1 @@
Aktualisierung der SoundCloud client ID zur behebung von SoundCloud Problemen.

View file

@ -0,0 +1 @@
In dieser Veröffentlichung wurde die Version der Youtube Internetseite aktualisiert. Die alte Version der Internetseite wird im März abgeschaltet und darum ist es nötig NewPipe zu aktualisieren.

View file

@ -0,0 +1,2 @@
Dies ist eine Hotfix-Version, die es NewPipe erneut erlaubt, SoundCloud ohne gröbere Probleme zu nutzen.
Der Extraktor nutzt nun die v2 API von SoundCloud und die Detektion ungültiger Client-IDs wurde verbessert.

View file

@ -0,0 +1,7 @@
Verbesserungen:
• Autoplay ist nun für alle Services verfügbar (nicht nur für YouTube)
Reparaturen:
• Verwandte Streams wurden behoben, indem die neuen Streamfortsetzungen von YouTube unterstützt werden
• Altersbeschränkte Videos repariert
• [Android TV] Überlagerung von Fokus-Hervorhebungen behoben

View file

@ -0,0 +1,4 @@
• Verbesserte Beschreibung der Option "Datenbank exportieren" in den Einstellungen.
• Das Parsen von YouTube-Kommentaren wurde behoben.
• Anzeige des Namens des Dienstes media.ccc.de korrigiert.
• Aktualisierte Übersetzungen.

View file

@ -0,0 +1,12 @@
• [YouTube] Mix-Unterstützung
• [YouTube] Anzeige von Infos zu öffentlich-rechtlichen Sendern und Covid-19
• [media.ccc.de] Neue Videos hinzugefügt
• Somali-Übersetzung hinzugefügt
• Viele interne Verbesserungen
• Fehler beim Teilen von Videos aus dem Player heraus behoben
• Leere ReCaptcha-Webansicht behoben
• Absturz behoben, der beim Entfernen eines Streams aus einer Liste auftrat
• [PeerTube] Verwandte Streams korrigiert
• [YouTube] Fehler bei YouTube-Musiksuche behoben

View file

@ -1 +1 @@
Eine freie, leichtgewichtige YouTube App für Android.
Eine freie, leichtgewichtige YouTube-App für Android.

View file

@ -1 +1 @@
Ένα δωρεάν ελαφρύ εμπρόσθιο τμήμα του YouTube για συσκευές Android.
Μία δωρεάν ελαφριά διέπαφη YouTube για συσκευές Android.

View file

@ -0,0 +1,12 @@
• [YouTube] Mix support
• [YouTube] Display info about public broadcasters and Covid-19
• [media.ccc.de] Added recent videos
• Added Somali translation
• Many internal improvements
• Fixed sharing videos from within the player
• Fixed blank ReCaptcha webview
• Fixed crash which occurred when removing a stream from a list
• [PeerTube] Fixed related streams
• [YouTube] Fixed YouTube Music search

View file

@ -0,0 +1,4 @@
• Ezarpenetan esportatu datu-basea aukeraren deskribapena hobetu da.
• YouTube iruzkinen analisia konpondu da.
• media.ccc.de zerbitzuaren bistaratzeko izena konpondu da.
• Itzulpenak eguneratuta.

View file

@ -0,0 +1,10 @@
• Yhdistetty tietyt jonotoiminnot
• Kahden sormen ele soittimen sulkemiseksi
• Valinta reCAPTCHA-evästeiden tyhjentämiseksi
• Ilmoitusvärin muokkaus
• Korjattu videon tietojen avaaminen, buginen käyttäytyminen NewPipeen jaettaessa ja muita epäjohdonmukaisuuksia
• Nopeutettu YouTube-videoita ja korjattu ikärajoitettuja
• Korjattu kaatuminen eteen-/taaksekelattaessa
• Ei uudelleenjärjestä listoja raahaatessa esikatselukuvia
• Ponnahdusikkunan ominaisuudet muistetaan aina
• Lisätty santalin kieli

View file

@ -0,0 +1 @@
Hindi gumagamit ang NewPipe ng kahit anong Google framework libraries o ang YouTube API. Pinaparse niya lang ang website upang makakalap ng impormasyong kinakailangan nito. Samakatuwid ang app na ito ay puwedeng gamitin sa mga device na walang naka install na Google Services. Hindi mo rin kailangan ng YouTube account upang magamit ang NewPipe at saka ito ay FLOSS.

View file

@ -0,0 +1 @@
Isang magaan at libreng YouTube para sa Android.

View file

@ -0,0 +1,13 @@
• [YouTube] Support des Mix
• [YouTube] Affichage des informations à propos du Covid et des chaines de service public
• [media.ccc.de] Support des vidéos récentes
• Traduction en Somalien
• Beaucoup d'améliorations internes
Corrections :
• Partager des vidéos depuis le lecteur
• Page ReCaptcha blanche
• Crash lors de la suppression d'un élément d'une liste
• [PeerTube] Vidéos liées
• [YouTube] Moteur de recherche YouTube Music

View file

@ -0,0 +1,12 @@
• [YouTube] תמיכה בערבול
• [YouTube] הצגת מידע על משדרים ציבוריים וקורונה
• [media.ccc.de] נוספו סרטונים אחרונים
• נוסף תרגום לסומלית
• מגוון שיפורים פנימיים
• תוקן שיתוף סרטונים מתוך הנגן
• תוקנה תצוגת ReCaptcha (מבחן טיורינג) ריקה
• תוקנה קריסה שנגרמה בעת הסרת תזרים מרשימה
• [PeerTube] תוקנו תזרימים קשורים
• [YouTube] תוקן החיפוש ב־YouTube Music

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