1
0
mirror of https://github.com/TeamNewPipe/NewPipe synced 2026-01-14 10:42:40 +00:00

Compare commits

..

165 Commits

Author SHA1 Message Date
Tobi
7faa107547 Merge pull request #5564 from B0pol/hotfix
Release 0.20.9
2021-02-12 22:42:02 +01:00
bopol
85ccc2384f Release 0.20.9 (963) 2021-02-12 22:33:03 +01:00
TobiGr
7153506ddb Update extractor 2020-12-27 17:09:09 +01:00
TobiGr
0483d3ff32 add live stream support to changelog 2020-12-27 15:06:03 +01:00
TobiGr
7e784ce9a7 Merge remote-tracking branch 'Weblate/dev' into dev 2020-12-27 14:56:18 +01:00
TobiGr
8343d9cc18 Release 0.20.8 (962) 2020-12-27 14:55:57 +01:00
TobiGr
db0ecd92ca Merge branch 'master' into dev 2020-12-27 14:53:15 +01:00
Tobias Groza
b5140cfecd Merge pull request #5286 from TeamNewPipe/media.ccc.de_live
[media.ccc.de] Add "live" kiosk
2020-12-27 14:47:31 +01:00
TobiGr
36aea35a92 [media.ccc.de] Add live stream kiosk 2020-12-27 13:26:49 +01:00
TobiGr
1984436b41 [media.ccc.de] Add "recent" kiosk 2020-12-27 01:30:29 +01:00
chr56
8ba2f5f964 Translated using Weblate (Chinese (Simplified))
Currently translated at 71.4% (30 of 42 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hans/
2020-12-27 00:59:48 +01:00
Gontzal Manuel Pujana Onaindia
c923d35a1f Translated using Weblate (Basque)
Currently translated at 28.5% (12 of 42 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/eu/
2020-12-27 00:59:47 +01:00
bopol
90d3c9ced0 Merge pull request #5266 from mhmdanas/remove-gitmodules
Remove .gitmodules
2020-12-26 11:00:23 +01:00
bopol
43cbc09f1f Merge pull request #5278 from XiangRongLin/readme-ci-badge
Replace travic ci badge with github actions one for dev branch pushes
2020-12-26 10:59:00 +01:00
XiangRongLin
feea084c60 Replace travic ci badge with github actions one for dev branch pushes 2020-12-26 10:10:20 +01:00
Tobias Groza
d403a83a24 Merge pull request #5246 from TeamNewPipe/release_0.20.7
Release 0.20.7
2020-12-25 20:25:01 +01:00
TobiGr
35fc27cfb0 update version 2020-12-25 19:00:55 +01:00
TobiGr
81742565a4 Update NewPipe Extractor to v0.20.7 2020-12-25 19:00:28 +01:00
TobiGr
923d0b7c80 Merge remote-tracking branch 'Weblate/dev' into dev 2020-12-25 18:53:26 +01:00
Bopol
d416465371 Translated using Weblate (French)
Currently translated at 69.0% (29 of 42 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/
2020-12-25 18:52:41 +01:00
Yaron Shahrabani
2586c543d3 Translated using Weblate (Hebrew)
Currently translated at 30.9% (13 of 42 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/he/
2020-12-25 18:52:40 +01:00
。れ
c32bc26328 Translated using Weblate (Filipino)
Currently translated at 0.0% (0 of 42 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fil/
2020-12-25 18:52:39 +01:00
nautilusx
4074c71b6a Translated using Weblate (German)
Currently translated at 42.8% (18 of 42 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/
2020-12-25 18:52:38 +01:00
mhmdanas
a7493d1039 Remove .gitmodules
It's empty anyway.
2020-12-24 19:33:03 +03:00
bopol
d7cab6a8d8 Merge pull request #5258 from TeamNewPipe/media.ccc.de_serviceColor
[media.ccc.de] Fix service color
2020-12-23 20:02:25 +01:00
TobiGr
eddc12693a [media.ccc.de] Fix service color
Caused by changing service name in TeamNewPipe/NewPipeExtractor#472
2020-12-23 19:58:09 +01:00
TobiGr
ced3898499 Add Somali (Af Soomaali)[so] to app language chooser 2020-12-23 16:47:36 +01:00
Tobias Groza
318a5df109 Merge pull request #5259 from Isira-Seneviratne/Fix_queue_display
Fix queue display in ServicePlayerActivity.
2020-12-23 16:13:47 +01:00
Isira Seneviratne
b2e9981313 Fix queue display in ServicePlayerActivity. 2020-12-23 20:06:02 +05:30
TobiGr
74f43639ad Added changelog for 0.20.7 (961) 2020-12-23 14:56:25 +01:00
TobiGr
fc342bd458 Fix typo in "playlist_ctrl_seperator_margin"
Rename to "playlist_ctrl_separator_margin"
2020-12-23 12:36:41 +01:00
TobiGr
adfbf5b49f Fix line breaks 2020-12-23 12:36:41 +01:00
TobiGr
2cb7bb84f7 Update translation from Weblate
Added translation using Weblate (Somali)

Translated using Weblate (Chinese (Traditional))

Currently translated at 99.8% (608 of 609 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (French)

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Serbian)

Currently translated at 41.0% (250 of 609 strings)

Translated using Weblate (English)

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Japanese)

Currently translated at 99.6% (607 of 609 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Basque)

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Arabic)

Currently translated at 99.8% (608 of 609 strings)

Translated using Weblate (Arabic)

Currently translated at 99.8% (608 of 609 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.8% (608 of 609 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Finnish)

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Belarusian)

Currently translated at 85.2% (519 of 609 strings)

Translated using Weblate (Bengali)

Currently translated at 79.1% (482 of 609 strings)

Translated using Weblate (German)

Currently translated at 29.2% (12 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/

Translated using Weblate (Basque)

Currently translated at 26.8% (11 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/eu/

Translated using Weblate (Chinese (Traditional))

Currently translated at 56.0% (23 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/

Translated using Weblate (Santali)

Currently translated at 10.6% (65 of 609 strings)

Translated using Weblate (Somali)

Currently translated at 15.9% (97 of 609 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (609 of 609 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.5% (610 of 613 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (German)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Basque)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Greek)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Greek)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Arabic)

Currently translated at 97.0% (595 of 613 strings)

Translated using Weblate (Indonesian)

Currently translated at 99.6% (611 of 613 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Finnish)

Currently translated at 99.6% (611 of 613 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 93.4% (573 of 613 strings)

Translated using Weblate (Sardinian)

Currently translated at 99.5% (610 of 613 strings)

Translated using Weblate (German)

Currently translated at 41.4% (17 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/

Translated using Weblate (Turkish)

Currently translated at 19.5% (8 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/tr/

Translated using Weblate (Greek)

Currently translated at 34.1% (14 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/el/

Translated using Weblate (Portuguese)

Currently translated at 63.4% (26 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt/

Translated using Weblate (Italian)

Currently translated at 43.9% (18 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/

Translated using Weblate (Chinese (Traditional))

Currently translated at 80.4% (33 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 70.7% (29 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hans/

Translated using Weblate (Somali)

Currently translated at 81.4% (499 of 613 strings)

Translated using Weblate (Somali)

Currently translated at 4.8% (2 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/so/

Translated using Weblate (Bulgarian)

Currently translated at 62.1% (381 of 613 strings)

Translated using Weblate (Bulgarian)

Currently translated at 62.1% (381 of 613 strings)
2020-12-23 12:36:41 +01:00
Tobias Groza
84d1792e7f Merge pull request #4754 from TeamNewPipe/meta_info
Display meta info about search query, stream creator or topic
2020-12-23 11:34:48 +01:00
TobiGr
531859ac60 [Security] Update ktlint to 0.40.0 2020-12-23 00:34:55 +01:00
Tobias Groza
bf071d65d7 Merge pull request #5236 from TiA4f8R/change-domain-readme
Change website domain of NewPipe in readmes
2020-12-20 18:59:28 +01:00
TiA4f8R
e4aa7a90c7 Change NewPipe's domain in Korean ReadMe 2020-12-20 18:36:01 +01:00
TiA4f8R
6d4e3c5633 Change NewPipe's domain in original ReadMe 2020-12-20 18:31:51 +01:00
Stypox
19f9b4f502 Improve meta info layout and merge duplicate code 2020-12-20 15:10:18 +01:00
bopol
f3dbb19364 Merge pull request #5229 from TeamNewPipe/dependency
Fix security vulnerability in checkstyle / guava
2020-12-20 13:41:10 +01:00
TobiGr
0a831ec84e Display meta info about search query, stream creator or topic
Closes #4614
2020-12-20 11:56:22 +01:00
Tobias Groza
0c656abb8e Merge pull request #5228 from B0pol/share_ts
Remove timestamp from share url for all services except youtube
2020-12-20 11:20:34 +01:00
bopol
7a7a90bf79 remove timestamp from share url for all services except youtube
It produces not found error for PeerTube, media.ccc.de, SoundCloud
2020-12-20 10:53:22 +01:00
TobiGr
908dff3931 Fix security vulnerability in checkstyle / guava 2020-12-20 01:18:46 +01:00
TheAssassin
a786cff036 Merge pull request #5132 from StuffNoOneCaresAbout/github-actions-ci
Use GitHub actions as a CI instead of Travis.
2020-12-19 23:22:50 +01:00
Stypox
28802805f8 Merge pull request #5204 from XiangRongLin/fix_before_all
Use @BeforeClass for ContentSettingsManagerTest.beforeClass
2020-12-19 14:33:37 +01:00
Stypox
f59099395f Merge pull request #5218 from Isira-Seneviratne/Use_ServiceCompat_stopForeground
Use ServiceCompat.stopForeground().
2020-12-19 14:05:44 +01:00
Isira Seneviratne
0fe3fe7594 Use ServiceCompat.stopForeground(). 2020-12-19 16:52:17 +05:30
Tobias Groza
467dacd35a Merge pull request #5217 from Isira-Seneviratne/Use_WebViewClientCompat
Use WebViewClientCompat.
2020-12-19 11:03:55 +01:00
Isira Seneviratne
173150591d Use WebViewClientCompat in ReCaptchaActivity. 2020-12-19 13:21:57 +05:30
Isira Seneviratne
e4d94b1a4e Add AndroidX Webkit. 2020-12-19 13:21:57 +05:30
Stypox
75e34a5a8e Merge pull request #4762 from Isira-Seneviratne/Use_view_binding_in_activities
Use view binding in activities.
2020-12-19 08:09:51 +01:00
Isira Seneviratne
d6121c8e21 Use view binding in SettingsActivity. 2020-12-19 04:22:01 +05:30
Isira Seneviratne
b4d77df1be Use view binding in ErrorActivity. 2020-12-19 04:21:59 +05:30
Isira Seneviratne
e6021465f6 Use view binding in ServicePlayerActivity. 2020-12-19 04:21:59 +05:30
Isira Seneviratne
22ec70e94d Use view binding in RouterActivity. 2020-12-19 04:21:58 +05:30
Isira Seneviratne
a1a70a94a8 Use view binding in ReCaptchaActivity. 2020-12-19 04:21:55 +05:30
Isira Seneviratne
a65ed7e914 Use view binding in DownloadActivity. 2020-12-19 04:19:59 +05:30
Isira Seneviratne
4545b8e92d Use view binding in AboutActivity. 2020-12-19 04:19:58 +05:30
Isira Seneviratne
ba0c0fb109 Use view binding in MainActivity. 2020-12-19 04:19:57 +05:30
Isira Seneviratne
18d530021c Fix view binding issue. 2020-12-19 04:19:56 +05:30
Isira Seneviratne
31bb70e333 Enable view binding. 2020-12-19 04:19:56 +05:30
Tobias Groza
a919a039e5 Merge pull request #5215 from Stypox/recaptcha-user-agent
Use user agent of DownloaderImpl also in ReCapthaActivity
2020-12-18 19:43:55 +01:00
Stypox
aacb1f46a8 Use user agent of DownloaderImpl also in ReCapthaActivity
Does not contain device info and should also fix some issues about recaptchas not showing up
2020-12-18 18:40:09 +01:00
Stypox
96862cbcb3 Merge pull request #5208 from Stypox/recaptcha-pbj
Remove pbj=1 parameter from YouYube urls in recaptcha activity
2020-12-18 18:28:44 +01:00
Stypox
10f79e1307 Remove pbj=1 parameter from YouYube urls in recaptcha activity 2020-12-17 21:02:13 +01:00
XiangRongLin
e0ee3dce40 Use @BeforeClass for ContentSettingsManagerTest.beforeClass 2020-12-17 09:40:04 +01:00
Tobias Groza
13e7d2e7ac Merge pull request #5186 from XiangRongLin/fix_compile_error
Fix compile error caused by auto merging
2020-12-15 21:42:09 +01:00
XiangRongLin
a7723373a0 Fix compile error caused by auto merging
#5176 changed `homeDir` from type `String` to `File`. #5059 was based on `homeDir` being a `String`. It was incorrectly auto-resolved by git.
2020-12-15 20:26:38 +01:00
Tobias Groza
7e469ead45 Merge pull request #5184 from TiA4f8R/update-newpipe-website-urls
Update NewPipe's website domain name in the app
2020-12-15 19:31:26 +01:00
TiA4f8R
5397a4e410 Update NewPipe website URL strings 2020-12-15 19:01:33 +01:00
TiA4f8R
99b59f0126 Update NewPipe's API url for new app's version check 2020-12-15 18:57:36 +01:00
Stypox
d46c7eb8fe Merge pull request #5059 from XiangRongLin/content_settings_manager
Extract export database logic into own class
2020-12-15 10:34:32 +01:00
Stypox
e4a1fc9d95 Merge pull request #5116 from hlloreda/fix-crash-deleting-video-refreshing
Fix crash deleting video refreshing
2020-12-15 09:52:17 +01:00
Stypox
276f50a944 Merge pull request #5178 from Isira-Seneviratne/Use_ActivityCompat_recreate
Use ActivityCompat.recreate().
2020-12-15 09:49:14 +01:00
Stypox
40fcd93312 Merge pull request #5142 from Isira-Seneviratne/Use_notification_instead_of_ProgressDialog
Use a notification instead of a ProgressDialog in MissionAdapter.
2020-12-15 09:33:19 +01:00
Isira Seneviratne
807e4d4af9 Use ActivityCompat.recreate(). 2020-12-15 13:55:05 +05:30
Stypox
480348f11a Merge pull request #5176 from Isira-Seneviratne/Use_ContextCompat_getDataDir
Use ContextCompat.getDataDir().
2020-12-15 09:05:35 +01:00
Isira Seneviratne
30613b7064 Use ContextCompat.getDataDir(). 2020-12-15 08:02:25 +05:30
Stypox
79189dcc83 Merge pull request #3243 from Stypox/100+items-playlist
Show radio icon as uploader avatar in Youtube mixes
2020-12-14 19:29:12 +01:00
Stypox
c2210330b6 Show radio instead of Youtube logo in mixes
YouTube mixes have YouTube as a creator, though YouTube's logo is not safe to use as it is a trademark (better safe than sorry)
2020-12-14 19:22:00 +01:00
Isira Seneviratne
917f459569 Use a notification instead of a ProgressDialog in MissionAdapter. 2020-12-13 05:21:38 +05:30
Tobias Groza
0ced9ba799 Merge pull request #5112 from mhmdanas/fix-typos
Fix some typos
2020-12-12 13:13:06 +01:00
Tobias Groza
5e95277d7c Merge pull request #4859 from TeamNewPipe/update_invidious_URLs
Update Invidious URL list in the manifest
2020-12-12 13:06:37 +01:00
Allan Nordhøy
efb417dba7 Translated using Weblate (Norwegian Bokmål)
Currently translated at 17.0% (7 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nb_NO/
2020-12-10 21:26:17 +01:00
Terry Louwers
5c2d4c4d9d Translated using Weblate (Dutch)
Currently translated at 100.0% (609 of 609 strings)
2020-12-10 21:26:17 +01:00
Ajeje Brazorf
e8bd9920fd Translated using Weblate (Sardinian)
Currently translated at 14.6% (6 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sc/
2020-12-10 21:26:17 +01:00
Stefan Br
69ed531a5c Translated using Weblate (German)
Currently translated at 100.0% (609 of 609 strings)
2020-12-10 21:26:17 +01:00
Terry Louwers
b967d7c148 Translated using Weblate (Dutch)
Currently translated at 17.0% (7 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nl/
2020-12-10 21:26:17 +01:00
Yaron Shahrabani
90150c42ed Translated using Weblate (Hebrew)
Currently translated at 29.2% (12 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/he/
2020-12-10 21:26:17 +01:00
David Braz
8e2fd9ccce Translated using Weblate (Portuguese (Brazil))
Currently translated at 26.8% (11 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_BR/
2020-12-10 21:26:17 +01:00
Oğuz Ersen
567ffad41d Translated using Weblate (Turkish)
Currently translated at 19.5% (8 of 41 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/tr/
2020-12-10 21:26:17 +01:00
Tobias Groza
3c306a0971 Merge pull request #5067 from Isira-Seneviratne/Add_workaround_for_null_offset_ID
Add a workaround for a possible null offset ID.
2020-12-10 11:37:18 +01:00
Isira Seneviratne
c0d6c8aeb3 Add a workaround for a possible null offset ID. 2020-12-10 15:23:30 +05:30
TobiGr
b27b49e4f3 Update NewPipe Extractor to 0.20.6 2020-12-09 23:46:55 +01:00
TobiGr
7ed0dbcf1a Release 0.20.6 (960) 2020-12-09 23:43:02 +01:00
TobiGr
8a23de6b20 Version code 960, not 970... 2020-12-09 23:40:54 +01:00
TobiGr
6cc3089204 Add changelog for 0.20.6 2020-12-09 23:37:26 +01:00
TobiGr
093e95c078 Merge remote-tracking branch 'Weblate/dev' into dev 2020-12-09 23:33:43 +01:00
Milo Ivir
7c8ac04e35 Translated using Weblate (Croatian)
Currently translated at 99.6% (607 of 609 strings)
2020-12-09 23:32:24 +01:00
Enol P
dc88f8b172 Translated using Weblate (Asturian)
Currently translated at 100.0% (609 of 609 strings)
2020-12-09 23:31:35 +01:00
FireMasterK
a00ac6b9ca Migrate to GitHub actions from Travis. 2020-12-09 12:25:57 +05:30
Igor Nedoboy
c94f0ded27 Translated using Weblate (Russian)
Currently translated at 7.5% (3 of 40 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ru/
2020-12-08 15:29:10 +01:00
David Braz
b553aa2159 Translated using Weblate (Portuguese (Brazil))
Currently translated at 25.0% (10 of 40 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_BR/
2020-12-08 15:29:09 +01:00
Deleted User
a7bd2666f0 Translated using Weblate (Malay)
Currently translated at 67.3% (410 of 609 strings)
2020-12-08 15:29:08 +01:00
David Braz
fe2fc60581 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (609 of 609 strings)
2020-12-08 15:29:08 +01:00
simo
ce59c05d5b Translated using Weblate (Arabic)
Currently translated at 100.0% (609 of 609 strings)
2020-12-08 15:29:08 +01:00
zeritti
a4858bc702 Translated using Weblate (Czech)
Currently translated at 100.0% (609 of 609 strings)
2020-12-08 15:29:07 +01:00
pjammo
a2bb58a991 Translated using Weblate (Italian)
Currently translated at 100.0% (609 of 609 strings)
2020-12-08 15:29:07 +01:00
Francesco Saltori
f7b41227d2 Translated using Weblate (Italian)
Currently translated at 100.0% (609 of 609 strings)
2020-12-08 15:29:07 +01:00
Igor Nedoboy
5b1a6831d5 Translated using Weblate (Russian)
Currently translated at 100.0% (609 of 609 strings)
2020-12-08 15:29:06 +01:00
nautilusx
42b1bbe414 Translated using Weblate (German)
Currently translated at 100.0% (609 of 609 strings)
2020-12-08 15:29:06 +01:00
mhmdanas
ac86fe80c8 Fix typos 2020-12-07 13:35:37 +03:00
Tobias Groza
db9f20a22f Merge pull request #4961 from TeamNewPipe/lint
Fix some Lint errors
2020-12-07 11:19:01 +01:00
hlloreda
b30e025bda [FIX] - Use of a Data class instead of overriding equals method 2020-12-07 10:53:33 +01:00
hlloreda
5f3eb4871a [IMPORT] - import got deleted 2020-12-07 00:06:56 +01:00
hlloreda
9a223532c5 [FIX] - Crash while deleting a video from a playlist while refreshing 2020-12-06 23:40:38 +01:00
nautilusx
cf67b592da Translated using Weblate (German)
Currently translated at 100.0% (609 of 609 strings)
2020-12-06 19:08:14 +01:00
domifi
e867bfbc82 Translated using Weblate (German)
Currently translated at 100.0% (609 of 609 strings)
2020-12-06 19:08:14 +01:00
Igor Nedoboy
9a671851df Translated using Weblate (Russian)
Currently translated at 100.0% (609 of 609 strings)
2020-12-05 12:08:13 +01:00
Igor Nedoboy
4b92f78cc8 Translated using Weblate (Russian)
Currently translated at 100.0% (609 of 609 strings)
2020-12-05 11:43:29 +01:00
Allan Nordhøy
c585982557 Translated using Weblate (Norwegian Bokmål)
Currently translated at 12.5% (5 of 40 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nb_NO/
2020-12-05 11:29:08 +01:00
Michal L
6bf22e7ad0 Translated using Weblate (Polish)
Currently translated at 47.5% (19 of 40 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/
2020-12-05 11:29:08 +01:00
Sérgio Marques
2f8dccf7f6 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (609 of 609 strings)
2020-12-05 11:29:07 +01:00
Allan Nordhøy
027768d97d Translated using Weblate (Norwegian Bokmål)
Currently translated at 93.5% (570 of 609 strings)
2020-12-05 11:29:07 +01:00
Jeff Huang
085f63b8c5 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (609 of 609 strings)
2020-12-05 11:29:07 +01:00
Eric
6f7c337e00 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (609 of 609 strings)
2020-12-05 11:29:06 +01:00
Michal L
16a968f3bb Translated using Weblate (Polish)
Currently translated at 100.0% (609 of 609 strings)
2020-12-05 11:29:06 +01:00
zmni
d7e0167fed Translated using Weblate (Indonesian)
Currently translated at 100.0% (609 of 609 strings)
2020-12-05 11:29:06 +01:00
simo
41c4f515cf Translated using Weblate (Arabic)
Currently translated at 99.8% (608 of 609 strings)
2020-12-05 11:29:06 +01:00
Sérgio Marques
d9a8218372 Translated using Weblate (Portuguese)
Currently translated at 100.0% (609 of 609 strings)
2020-12-05 11:29:05 +01:00
Francesco Saltori
dd9bd4da8b Translated using Weblate (Italian)
Currently translated at 100.0% (609 of 609 strings)
2020-12-05 11:29:05 +01:00
pitachips
cf98500b7f Translated using Weblate (Korean)
Currently translated at 85.2% (519 of 609 strings)
2020-12-05 11:29:05 +01:00
2-Seol
2ce8facc05 Translated using Weblate (Korean)
Currently translated at 85.2% (519 of 609 strings)
2020-12-05 11:29:05 +01:00
Kaede
d1b117d07c Translated using Weblate (Japanese)
Currently translated at 99.8% (608 of 609 strings)
2020-12-05 11:29:04 +01:00
xxkfqz
c0377c7ebf Translated using Weblate (Russian)
Currently translated at 100.0% (609 of 609 strings)
2020-12-05 11:29:04 +01:00
Ács Zoltán
a2490a5730 Translated using Weblate (Hungarian)
Currently translated at 68.6% (418 of 609 strings)
2020-12-05 11:29:04 +01:00
JoC
177334ba62 Translated using Weblate (Spanish)
Currently translated at 100.0% (609 of 609 strings)
2020-12-05 11:29:03 +01:00
XiangRongLin
f7f00293cc Extract export database logic into own class
- Separate it from the UI.
- Add happy path unit test.
2020-12-04 18:30:29 +01:00
Kaede
7bce588767 Translated using Weblate (Japanese)
Currently translated at 99.8% (608 of 609 strings)
2020-12-04 03:26:00 +01:00
hdringanioooboo
4bb67c634f Translated using Weblate (Japanese)
Currently translated at 99.8% (608 of 609 strings)
2020-12-04 03:26:00 +01:00
ssantos
3653afbcc4 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (609 of 609 strings)
2020-12-03 11:04:03 +01:00
Sérgio Marques
1f4a4ea09f Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (609 of 609 strings)
2020-12-03 11:04:03 +01:00
ssantos
3d38add4b4 Translated using Weblate (Portuguese)
Currently translated at 100.0% (609 of 609 strings)
2020-12-03 11:01:38 +01:00
Sérgio Marques
124b7eefb5 Translated using Weblate (Portuguese)
Currently translated at 100.0% (609 of 609 strings)
2020-12-03 11:01:38 +01:00
x
b52924048c Translated using Weblate (Italian)
Currently translated at 42.5% (17 of 40 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/
2020-12-01 23:52:13 +01:00
Ajeje Brazorf
93393f5dff Translated using Weblate (Sardinian)
Currently translated at 100.0% (609 of 609 strings)
2020-12-01 23:52:12 +01:00
Yaron Shahrabani
275a75ebaa Translated using Weblate (Hebrew)
Currently translated at 100.0% (609 of 609 strings)
2020-12-01 23:52:12 +01:00
Oğuz Ersen
3e4a7a19cc Translated using Weblate (Turkish)
Currently translated at 100.0% (609 of 609 strings)
2020-12-01 23:52:12 +01:00
Marian Hanzel
734af457f3 Translated using Weblate (Slovak)
Currently translated at 100.0% (609 of 609 strings)
2020-12-01 23:52:11 +01:00
x
55bdb1f47a Translated using Weblate (Italian)
Currently translated at 100.0% (609 of 609 strings)
2020-12-01 23:52:11 +01:00
Ldm Public
adff0d199d Translated using Weblate (French)
Currently translated at 100.0% (609 of 609 strings)
2020-12-01 23:52:11 +01:00
Hosted Weblate
f95b3262a0 Merge branch 'origin/dev' into Weblate. 2020-12-01 20:59:26 +01:00
Óscar Fernández Díaz
794a14e76c Translated using Weblate (Spanish)
Currently translated at 27.5% (11 of 40 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/es/
2020-12-01 20:59:26 +01:00
Gontzal Manuel Pujana Onaindia
ba857b5ef7 Translated using Weblate (Basque)
Currently translated at 25.0% (10 of 40 strings)

Translation: NewPipe/Metadata
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/eu/
2020-12-01 20:59:25 +01:00
minsk21
2aed04a8c2 Translated using Weblate (Belarusian)
Currently translated at 83.7% (510 of 609 strings)
2020-12-01 20:59:25 +01:00
Stypox
5f9e6b51da Merge pull request #5043 from mhmdanas/improve-database-summaries
Improve export database summary
2020-12-01 20:43:57 +01:00
mhmdanas
e7b5c99ed6 Remove Oxford comma 2020-12-01 22:04:14 +03:00
mhmdanas
9c0b3d35be State what is exported or imported explicitly 2020-12-01 18:09:36 +03:00
mhmdanas
4277b6e262 Fix unescaped quote 2020-11-30 19:52:38 +03:00
mhmdanas
506c4ce701 Improve "import database" summary 2020-11-30 19:49:55 +03:00
mhmdanas
d251e58984 Improve export database summary 2020-11-30 15:45:51 +03:00
TobiGr
7a8dab2d58 Fix typos 2020-11-22 10:39:00 +01:00
TobiGr
6f3dfad550 Fix Lint: Inconsistent line separators 2020-11-22 10:16:27 +01:00
opusforlife2
b822c5a039 Update Invidious URL list in the manifest 2020-11-11 15:20:42 +00:00
186 changed files with 5145 additions and 3402 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>
@@ -6,14 +6,14 @@
<p align="center">
<a href="https://github.com/TeamNewPipe/NewPipe/releases" alt="GitHub release"><img src="https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg" ></a>
<a href="https://www.gnu.org/licenses/gpl-3.0" alt="License: GPLv3"><img src="https://img.shields.io/badge/License-GPL%20v3-blue.svg"></a>
<a href="https://travis-ci.org/TeamNewPipe/NewPipe" alt="Build Status"><img src="https://travis-ci.org/TeamNewPipe/NewPipe.svg"></a>
<a href="https://github.com/TeamNewPipe/NewPipe/actions" alt="Build Status"><img src="https://github.com/TeamNewPipe/NewPipe/workflows/CI/badge.svg?branch=dev&event=push"></a>
<a href="https://hosted.weblate.org/engage/newpipe/" alt="Translation Status"><img src="https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg"></a>
<a href="http://webchat.freenode.net/?channels=%23newpipe" alt="IRC channel: #newpipe"><img src="https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg"></a>
<a href="https://www.bountysource.com/teams/newpipe" alt="Bountysource bounties"><img src="https://img.shields.io/bountysource/team/newpipe/activity.svg?colorB=cd201f"></a>
</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>
@@ -6,14 +6,14 @@
<p align="center">
<a href="https://github.com/TeamNewPipe/NewPipe/releases" alt="GitHub release"><img src="https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg" ></a>
<a href="https://www.gnu.org/licenses/gpl-3.0" alt="License: GPLv3"><img src="https://img.shields.io/badge/License-GPL%20v3-blue.svg"></a>
<a href="https://travis-ci.org/TeamNewPipe/NewPipe" alt="Build Status"><img src="https://travis-ci.org/TeamNewPipe/NewPipe.svg"></a>
<a href="https://github.com/TeamNewPipe/NewPipe/actions" alt="Build Status"><img src="https://github.com/TeamNewPipe/NewPipe/workflows/CI/badge.svg?branch=dev&event=push"></a>
<a href="https://hosted.weblate.org/engage/newpipe/" alt="Translation Status"><img src="https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg"></a>
<a href="http://webchat.freenode.net/?channels=%23newpipe" alt="IRC channel: #newpipe"><img src="https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg"></a>
<a href="https://www.bountysource.com/teams/newpipe" alt="Bountysource bounties"><img src="https://img.shields.io/bountysource/team/newpipe/activity.svg?colorB=cd201f"></a>
</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 959
versionName "0.20.5"
versionCode 963
versionName "0.20.9"
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:175df679e05b24b6094570d719cc11f8dfc17c68'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.20.9'
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,13 +48,13 @@ 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.
* Method to get the APK's SHA1 key. See https://stackoverflow.com/questions/9293019/#22506133.
*
* @param application The application
* @return String with the apk's SHA1 fingeprint in hexadecimal
* @return String with the APK's SHA1 fingerprint in hexadecimal
*/
@NonNull
private static String getCertificateSHA1Fingerprint(@NonNull final Application application) {

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

@@ -70,7 +70,8 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder {
} else {
itemProgressView.setVisibility(View.GONE);
}
} else if (item.getStreamType() == StreamType.LIVE_STREAM) {
} else if (item.getStreamType() == StreamType.LIVE_STREAM
|| item.getStreamType() == StreamType.AUDIO_LIVE_STREAM) {
itemDurationView.setText(R.string.duration_live);
itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(),
R.color.live_duration_background_color));

View File

@@ -1,10 +1,29 @@
package org.schabi.newpipe.ktx
import java.time.OffsetDateTime
import java.time.ZoneId
import java.time.ZoneOffset
import java.time.temporal.ChronoField
import java.util.Calendar
import java.util.Date
import java.util.GregorianCalendar
import java.util.TimeZone
fun OffsetDateTime.toCalendar(zoneId: ZoneId = ZoneId.systemDefault()): Calendar {
return GregorianCalendar.from(if (zoneId != offset) atZoneSameInstant(zoneId) else toZonedDateTime())
// This method is a modified version of GregorianCalendar.from(ZonedDateTime).
// Math.addExact() and Math.multiplyExact() are desugared even though lint displays a warning.
@SuppressWarnings("NewApi")
fun OffsetDateTime.toCalendar(): Calendar {
val cal = GregorianCalendar(TimeZone.getTimeZone("UTC"))
val offsetDateTimeUTC = withOffsetSameInstant(ZoneOffset.UTC)
cal.gregorianChange = Date(Long.MIN_VALUE)
cal.firstDayOfWeek = Calendar.MONDAY
cal.minimalDaysInFirstWeek = 4
try {
cal.timeInMillis = Math.addExact(
Math.multiplyExact(offsetDateTimeUTC.toEpochSecond(), 1000),
offsetDateTimeUTC[ChronoField.MILLI_OF_SECOND].toLong()
)
} catch (ex: ArithmeticException) {
throw IllegalArgumentException(ex)
}
return cal
}

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

@@ -9,7 +9,7 @@ public interface ImportExportEventListener {
void onSizeReceived(int size);
/**
* Called everytime an item has been parsed/resolved.
* Called every time an item has been parsed/resolved.
*
* @param itemName the name of the subscription item
*/

View File

@@ -684,7 +684,7 @@ public abstract class BasePlayer implements
public void onMuteUnmuteButtonClicked() {
if (DEBUG) {
Log.d(TAG, "onMuteUnmuteButtonClicled() called");
Log.d(TAG, "onMuteUnmuteButtonClicked() called");
}
simpleExoPlayer.setVolume(isMuted() ? 1 : 0);
}

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 shure 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);
// this will make sure progressCurrentTime has the same width as progressEndTime
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

@@ -26,12 +26,12 @@ public class LoadController implements LoadControl {
}
private LoadController(final int initialPlaybackBufferMs,
final int minimumPlaybackbufferMs,
final int minimumPlaybackBufferMs,
final int optimalPlaybackBufferMs) {
this.initialPlaybackBufferUs = initialPlaybackBufferMs * 1000;
final DefaultLoadControl.Builder builder = new DefaultLoadControl.Builder();
builder.setBufferDurationsMs(minimumPlaybackbufferMs, optimalPlaybackBufferMs,
builder.setBufferDurationsMs(minimumPlaybackBufferMs, optimalPlaybackBufferMs,
initialPlaybackBufferMs, initialPlaybackBufferMs);
internalLoadControl = builder.createDefaultLoadControl();
}

View File

@@ -128,9 +128,9 @@ abstract class AbstractInfoPlayQueue<T extends ListInfo, U extends InfoItem> ext
fetchReactor = null;
}
private static List<PlayQueueItem> extractListItems(final List<StreamInfoItem> infos) {
private static List<PlayQueueItem> extractListItems(final List<StreamInfoItem> infoItems) {
final List<PlayQueueItem> result = new ArrayList<>();
for (final InfoItem stream : infos) {
for (final InfoItem stream : infoItems) {
if (stream instanceof StreamInfoItem) {
result.add(new PlayQueueItem((StreamInfoItem) stream));
}

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

@@ -1,416 +1,416 @@
package org.schabi.newpipe.streams;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.schabi.newpipe.streams.WebMReader.Cluster;
import org.schabi.newpipe.streams.WebMReader.Segment;
import org.schabi.newpipe.streams.WebMReader.SimpleBlock;
import org.schabi.newpipe.streams.WebMReader.WebMTrack;
import org.schabi.newpipe.streams.io.SharpStream;
import java.io.Closeable;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
* @author kapodamy
*/
public class OggFromWebMWriter implements Closeable {
private static final byte FLAG_UNSET = 0x00;
//private static final byte FLAG_CONTINUED = 0x01;
private static final byte FLAG_FIRST = 0x02;
private static final byte FLAG_LAST = 0x04;
private static final byte HEADER_CHECKSUM_OFFSET = 22;
private static final byte HEADER_SIZE = 27;
private static final int TIME_SCALE_NS = 1000000000;
private boolean done = false;
private boolean parsed = false;
private final SharpStream source;
private final SharpStream output;
private int sequenceCount = 0;
private final int streamId;
private byte packetFlag = FLAG_FIRST;
private WebMReader webm = null;
private WebMTrack webmTrack = null;
private Segment webmSegment = null;
private Cluster webmCluster = null;
private SimpleBlock webmBlock = null;
private long webmBlockLastTimecode = 0;
private long webmBlockNearDuration = 0;
private short segmentTableSize = 0;
private final byte[] segmentTable = new byte[255];
private long segmentTableNextTimestamp = TIME_SCALE_NS;
private final int[] crc32Table = new int[256];
public OggFromWebMWriter(@NonNull final SharpStream source, @NonNull final SharpStream target) {
if (!source.canRead() || !source.canRewind()) {
throw new IllegalArgumentException("source stream must be readable and allows seeking");
}
if (!target.canWrite() || !target.canRewind()) {
throw new IllegalArgumentException("output stream must be writable and allows seeking");
}
this.source = source;
this.output = target;
this.streamId = (int) System.currentTimeMillis();
populateCrc32Table();
}
public boolean isDone() {
return done;
}
public boolean isParsed() {
return parsed;
}
public WebMTrack[] getTracksFromSource() throws IllegalStateException {
if (!parsed) {
throw new IllegalStateException("source must be parsed first");
}
return webm.getAvailableTracks();
}
public void parseSource() throws IOException, IllegalStateException {
if (done) {
throw new IllegalStateException("already done");
}
if (parsed) {
throw new IllegalStateException("already parsed");
}
try {
webm = new WebMReader(source);
webm.parse();
webmSegment = webm.getNextSegment();
} finally {
parsed = true;
}
}
public void selectTrack(final int trackIndex) throws IOException {
if (!parsed) {
throw new IllegalStateException("source must be parsed first");
}
if (done) {
throw new IOException("already done");
}
if (webmTrack != null) {
throw new IOException("tracks already selected");
}
switch (webm.getAvailableTracks()[trackIndex].kind) {
case Audio:
case Video:
break;
default:
throw new UnsupportedOperationException("the track must an audio or video stream");
}
try {
webmTrack = webm.selectTrack(trackIndex);
} finally {
parsed = true;
}
}
@Override
public void close() throws IOException {
done = true;
parsed = true;
webmTrack = null;
webm = null;
if (!output.isClosed()) {
output.flush();
}
source.close();
output.close();
}
public void build() throws IOException {
final float resolution;
SimpleBlock bloq;
final ByteBuffer header = ByteBuffer.allocate(27 + (255 * 255));
final ByteBuffer page = ByteBuffer.allocate(64 * 1024);
header.order(ByteOrder.LITTLE_ENDIAN);
/* step 1: get the amount of frames per seconds */
switch (webmTrack.kind) {
case Audio:
resolution = getSampleFrequencyFromTrack(webmTrack.bMetadata);
if (resolution == 0f) {
throw new RuntimeException("cannot get the audio sample rate");
}
break;
case Video:
// WARNING: untested
if (webmTrack.defaultDuration == 0) {
throw new RuntimeException("missing default frame time");
}
resolution = 1000f / ((float) webmTrack.defaultDuration
/ webmSegment.info.timecodeScale);
break;
default:
throw new RuntimeException("not implemented");
}
/* step 2: create packet with code init data */
if (webmTrack.codecPrivate != null) {
addPacketSegment(webmTrack.codecPrivate.length);
makePacketheader(0x00, header, webmTrack.codecPrivate);
write(header);
output.write(webmTrack.codecPrivate);
}
/* step 3: create packet with metadata */
final byte[] buffer = makeMetadata();
if (buffer != null) {
addPacketSegment(buffer.length);
makePacketheader(0x00, header, buffer);
write(header);
output.write(buffer);
}
/* step 4: calculate amount of packets */
while (webmSegment != null) {
bloq = getNextBlock();
if (bloq != null && addPacketSegment(bloq)) {
final int pos = page.position();
//noinspection ResultOfMethodCallIgnored
bloq.data.read(page.array(), pos, bloq.dataSize);
page.position(pos + bloq.dataSize);
continue;
}
// calculate the current packet duration using the next block
double elapsedNs = webmTrack.codecDelay;
if (bloq == null) {
packetFlag = FLAG_LAST; // note: if the flag is FLAG_CONTINUED, is changed
elapsedNs += webmBlockLastTimecode;
if (webmTrack.defaultDuration > 0) {
elapsedNs += webmTrack.defaultDuration;
} else {
// hardcoded way, guess the sample duration
elapsedNs += webmBlockNearDuration;
}
} else {
elapsedNs += bloq.absoluteTimeCodeNs;
}
// get the sample count in the page
elapsedNs = elapsedNs / TIME_SCALE_NS;
elapsedNs = Math.ceil(elapsedNs * resolution);
// create header and calculate page checksum
int checksum = makePacketheader((long) elapsedNs, header, null);
checksum = calcCrc32(checksum, page.array(), page.position());
header.putInt(HEADER_CHECKSUM_OFFSET, checksum);
// dump data
write(header);
write(page);
webmBlock = bloq;
}
}
private int makePacketheader(final long granPos, @NonNull final ByteBuffer buffer,
final byte[] immediatePage) {
short length = HEADER_SIZE;
buffer.putInt(0x5367674f); // "OggS" binary string in little-endian
buffer.put((byte) 0x00); // version
buffer.put(packetFlag); // type
buffer.putLong(granPos); // granulate position
buffer.putInt(streamId); // bitstream serial number
buffer.putInt(sequenceCount++); // page sequence number
buffer.putInt(0x00); // page checksum
buffer.put((byte) segmentTableSize); // segment table
buffer.put(segmentTable, 0, segmentTableSize); // segment size
length += segmentTableSize;
clearSegmentTable(); // clear segment table for next header
int checksumCrc32 = calcCrc32(0x00, buffer.array(), length);
if (immediatePage != null) {
checksumCrc32 = calcCrc32(checksumCrc32, immediatePage, immediatePage.length);
buffer.putInt(HEADER_CHECKSUM_OFFSET, checksumCrc32);
segmentTableNextTimestamp -= TIME_SCALE_NS;
}
return checksumCrc32;
}
@Nullable
private byte[] makeMetadata() {
if ("A_OPUS".equals(webmTrack.codecId)) {
return new byte[]{
0x4F, 0x70, 0x75, 0x73, 0x54, 0x61, 0x67, 0x73, // "OpusTags" binary string
0x00, 0x00, 0x00, 0x00, // writing application string size (not present)
0x00, 0x00, 0x00, 0x00 // additional tags count (zero means no tags)
};
} else if ("A_VORBIS".equals(webmTrack.codecId)) {
return new byte[]{
0x03, // ¿¿¿???
0x76, 0x6f, 0x72, 0x62, 0x69, 0x73, // "vorbis" binary string
0x00, 0x00, 0x00, 0x00, // writing application string size (not present)
0x00, 0x00, 0x00, 0x00 // additional tags count (zero means no tags)
};
}
// not implemented for the desired codec
return null;
}
private void write(final ByteBuffer buffer) throws IOException {
output.write(buffer.array(), 0, buffer.position());
buffer.position(0);
}
@Nullable
private SimpleBlock getNextBlock() throws IOException {
SimpleBlock res;
if (webmBlock != null) {
res = webmBlock;
webmBlock = null;
return res;
}
if (webmSegment == null) {
webmSegment = webm.getNextSegment();
if (webmSegment == null) {
return null; // no more blocks in the selected track
}
}
if (webmCluster == null) {
webmCluster = webmSegment.getNextCluster();
if (webmCluster == null) {
webmSegment = null;
return getNextBlock();
}
}
res = webmCluster.getNextSimpleBlock();
if (res == null) {
webmCluster = null;
return getNextBlock();
}
webmBlockNearDuration = res.absoluteTimeCodeNs - webmBlockLastTimecode;
webmBlockLastTimecode = res.absoluteTimeCodeNs;
return res;
}
private float getSampleFrequencyFromTrack(final byte[] bMetadata) {
// hardcoded way
final ByteBuffer buffer = ByteBuffer.wrap(bMetadata);
while (buffer.remaining() >= 6) {
final int id = buffer.getShort() & 0xFFFF;
if (id == 0x0000B584) {
return buffer.getFloat();
}
}
return 0.0f;
}
private void clearSegmentTable() {
segmentTableNextTimestamp += TIME_SCALE_NS;
packetFlag = FLAG_UNSET;
segmentTableSize = 0;
}
private boolean addPacketSegment(final SimpleBlock block) {
final long timestamp = block.absoluteTimeCodeNs + webmTrack.codecDelay;
if (timestamp >= segmentTableNextTimestamp) {
return false;
}
return addPacketSegment(block.dataSize);
}
private boolean addPacketSegment(final int size) {
if (size > 65025) {
throw new UnsupportedOperationException("page size cannot be larger than 65025");
}
int available = (segmentTable.length - segmentTableSize) * 255;
final boolean extra = (size % 255) == 0;
if (extra) {
// add a zero byte entry in the table
// required to indicate the sample size is multiple of 255
available -= 255;
}
// check if possible add the segment, without overflow the table
if (available < size) {
return false; // not enough space on the page
}
for (int seg = size; seg > 0; seg -= 255) {
segmentTable[segmentTableSize++] = (byte) Math.min(seg, 255);
}
if (extra) {
segmentTable[segmentTableSize++] = 0x00;
}
return true;
}
private void populateCrc32Table() {
for (int i = 0; i < 0x100; i++) {
int crc = i << 24;
for (int j = 0; j < 8; j++) {
final long b = crc >>> 31;
crc <<= 1;
crc ^= (int) (0x100000000L - b) & 0x04c11db7;
}
crc32Table[i] = crc;
}
}
private int calcCrc32(final int initialCrc, final byte[] buffer, final int size) {
int crc = initialCrc;
for (int i = 0; i < size; i++) {
final int reg = (crc >>> 24) & 0xff;
crc = (crc << 8) ^ crc32Table[reg ^ (buffer[i] & 0xff)];
}
return crc;
}
}
package org.schabi.newpipe.streams;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.schabi.newpipe.streams.WebMReader.Cluster;
import org.schabi.newpipe.streams.WebMReader.Segment;
import org.schabi.newpipe.streams.WebMReader.SimpleBlock;
import org.schabi.newpipe.streams.WebMReader.WebMTrack;
import org.schabi.newpipe.streams.io.SharpStream;
import java.io.Closeable;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
* @author kapodamy
*/
public class OggFromWebMWriter implements Closeable {
private static final byte FLAG_UNSET = 0x00;
//private static final byte FLAG_CONTINUED = 0x01;
private static final byte FLAG_FIRST = 0x02;
private static final byte FLAG_LAST = 0x04;
private static final byte HEADER_CHECKSUM_OFFSET = 22;
private static final byte HEADER_SIZE = 27;
private static final int TIME_SCALE_NS = 1000000000;
private boolean done = false;
private boolean parsed = false;
private final SharpStream source;
private final SharpStream output;
private int sequenceCount = 0;
private final int streamId;
private byte packetFlag = FLAG_FIRST;
private WebMReader webm = null;
private WebMTrack webmTrack = null;
private Segment webmSegment = null;
private Cluster webmCluster = null;
private SimpleBlock webmBlock = null;
private long webmBlockLastTimecode = 0;
private long webmBlockNearDuration = 0;
private short segmentTableSize = 0;
private final byte[] segmentTable = new byte[255];
private long segmentTableNextTimestamp = TIME_SCALE_NS;
private final int[] crc32Table = new int[256];
public OggFromWebMWriter(@NonNull final SharpStream source, @NonNull final SharpStream target) {
if (!source.canRead() || !source.canRewind()) {
throw new IllegalArgumentException("source stream must be readable and allows seeking");
}
if (!target.canWrite() || !target.canRewind()) {
throw new IllegalArgumentException("output stream must be writable and allows seeking");
}
this.source = source;
this.output = target;
this.streamId = (int) System.currentTimeMillis();
populateCrc32Table();
}
public boolean isDone() {
return done;
}
public boolean isParsed() {
return parsed;
}
public WebMTrack[] getTracksFromSource() throws IllegalStateException {
if (!parsed) {
throw new IllegalStateException("source must be parsed first");
}
return webm.getAvailableTracks();
}
public void parseSource() throws IOException, IllegalStateException {
if (done) {
throw new IllegalStateException("already done");
}
if (parsed) {
throw new IllegalStateException("already parsed");
}
try {
webm = new WebMReader(source);
webm.parse();
webmSegment = webm.getNextSegment();
} finally {
parsed = true;
}
}
public void selectTrack(final int trackIndex) throws IOException {
if (!parsed) {
throw new IllegalStateException("source must be parsed first");
}
if (done) {
throw new IOException("already done");
}
if (webmTrack != null) {
throw new IOException("tracks already selected");
}
switch (webm.getAvailableTracks()[trackIndex].kind) {
case Audio:
case Video:
break;
default:
throw new UnsupportedOperationException("the track must an audio or video stream");
}
try {
webmTrack = webm.selectTrack(trackIndex);
} finally {
parsed = true;
}
}
@Override
public void close() throws IOException {
done = true;
parsed = true;
webmTrack = null;
webm = null;
if (!output.isClosed()) {
output.flush();
}
source.close();
output.close();
}
public void build() throws IOException {
final float resolution;
SimpleBlock bloq;
final ByteBuffer header = ByteBuffer.allocate(27 + (255 * 255));
final ByteBuffer page = ByteBuffer.allocate(64 * 1024);
header.order(ByteOrder.LITTLE_ENDIAN);
/* step 1: get the amount of frames per seconds */
switch (webmTrack.kind) {
case Audio:
resolution = getSampleFrequencyFromTrack(webmTrack.bMetadata);
if (resolution == 0f) {
throw new RuntimeException("cannot get the audio sample rate");
}
break;
case Video:
// WARNING: untested
if (webmTrack.defaultDuration == 0) {
throw new RuntimeException("missing default frame time");
}
resolution = 1000f / ((float) webmTrack.defaultDuration
/ webmSegment.info.timecodeScale);
break;
default:
throw new RuntimeException("not implemented");
}
/* step 2: create packet with code init data */
if (webmTrack.codecPrivate != null) {
addPacketSegment(webmTrack.codecPrivate.length);
makePacketheader(0x00, header, webmTrack.codecPrivate);
write(header);
output.write(webmTrack.codecPrivate);
}
/* step 3: create packet with metadata */
final byte[] buffer = makeMetadata();
if (buffer != null) {
addPacketSegment(buffer.length);
makePacketheader(0x00, header, buffer);
write(header);
output.write(buffer);
}
/* step 4: calculate amount of packets */
while (webmSegment != null) {
bloq = getNextBlock();
if (bloq != null && addPacketSegment(bloq)) {
final int pos = page.position();
//noinspection ResultOfMethodCallIgnored
bloq.data.read(page.array(), pos, bloq.dataSize);
page.position(pos + bloq.dataSize);
continue;
}
// calculate the current packet duration using the next block
double elapsedNs = webmTrack.codecDelay;
if (bloq == null) {
packetFlag = FLAG_LAST; // note: if the flag is FLAG_CONTINUED, is changed
elapsedNs += webmBlockLastTimecode;
if (webmTrack.defaultDuration > 0) {
elapsedNs += webmTrack.defaultDuration;
} else {
// hardcoded way, guess the sample duration
elapsedNs += webmBlockNearDuration;
}
} else {
elapsedNs += bloq.absoluteTimeCodeNs;
}
// get the sample count in the page
elapsedNs = elapsedNs / TIME_SCALE_NS;
elapsedNs = Math.ceil(elapsedNs * resolution);
// create header and calculate page checksum
int checksum = makePacketheader((long) elapsedNs, header, null);
checksum = calcCrc32(checksum, page.array(), page.position());
header.putInt(HEADER_CHECKSUM_OFFSET, checksum);
// dump data
write(header);
write(page);
webmBlock = bloq;
}
}
private int makePacketheader(final long granPos, @NonNull final ByteBuffer buffer,
final byte[] immediatePage) {
short length = HEADER_SIZE;
buffer.putInt(0x5367674f); // "OggS" binary string in little-endian
buffer.put((byte) 0x00); // version
buffer.put(packetFlag); // type
buffer.putLong(granPos); // granulate position
buffer.putInt(streamId); // bitstream serial number
buffer.putInt(sequenceCount++); // page sequence number
buffer.putInt(0x00); // page checksum
buffer.put((byte) segmentTableSize); // segment table
buffer.put(segmentTable, 0, segmentTableSize); // segment size
length += segmentTableSize;
clearSegmentTable(); // clear segment table for next header
int checksumCrc32 = calcCrc32(0x00, buffer.array(), length);
if (immediatePage != null) {
checksumCrc32 = calcCrc32(checksumCrc32, immediatePage, immediatePage.length);
buffer.putInt(HEADER_CHECKSUM_OFFSET, checksumCrc32);
segmentTableNextTimestamp -= TIME_SCALE_NS;
}
return checksumCrc32;
}
@Nullable
private byte[] makeMetadata() {
if ("A_OPUS".equals(webmTrack.codecId)) {
return new byte[]{
0x4F, 0x70, 0x75, 0x73, 0x54, 0x61, 0x67, 0x73, // "OpusTags" binary string
0x00, 0x00, 0x00, 0x00, // writing application string size (not present)
0x00, 0x00, 0x00, 0x00 // additional tags count (zero means no tags)
};
} else if ("A_VORBIS".equals(webmTrack.codecId)) {
return new byte[]{
0x03, // ¿¿¿???
0x76, 0x6f, 0x72, 0x62, 0x69, 0x73, // "vorbis" binary string
0x00, 0x00, 0x00, 0x00, // writing application string size (not present)
0x00, 0x00, 0x00, 0x00 // additional tags count (zero means no tags)
};
}
// not implemented for the desired codec
return null;
}
private void write(final ByteBuffer buffer) throws IOException {
output.write(buffer.array(), 0, buffer.position());
buffer.position(0);
}
@Nullable
private SimpleBlock getNextBlock() throws IOException {
SimpleBlock res;
if (webmBlock != null) {
res = webmBlock;
webmBlock = null;
return res;
}
if (webmSegment == null) {
webmSegment = webm.getNextSegment();
if (webmSegment == null) {
return null; // no more blocks in the selected track
}
}
if (webmCluster == null) {
webmCluster = webmSegment.getNextCluster();
if (webmCluster == null) {
webmSegment = null;
return getNextBlock();
}
}
res = webmCluster.getNextSimpleBlock();
if (res == null) {
webmCluster = null;
return getNextBlock();
}
webmBlockNearDuration = res.absoluteTimeCodeNs - webmBlockLastTimecode;
webmBlockLastTimecode = res.absoluteTimeCodeNs;
return res;
}
private float getSampleFrequencyFromTrack(final byte[] bMetadata) {
// hardcoded way
final ByteBuffer buffer = ByteBuffer.wrap(bMetadata);
while (buffer.remaining() >= 6) {
final int id = buffer.getShort() & 0xFFFF;
if (id == 0x0000B584) {
return buffer.getFloat();
}
}
return 0.0f;
}
private void clearSegmentTable() {
segmentTableNextTimestamp += TIME_SCALE_NS;
packetFlag = FLAG_UNSET;
segmentTableSize = 0;
}
private boolean addPacketSegment(final SimpleBlock block) {
final long timestamp = block.absoluteTimeCodeNs + webmTrack.codecDelay;
if (timestamp >= segmentTableNextTimestamp) {
return false;
}
return addPacketSegment(block.dataSize);
}
private boolean addPacketSegment(final int size) {
if (size > 65025) {
throw new UnsupportedOperationException("page size cannot be larger than 65025");
}
int available = (segmentTable.length - segmentTableSize) * 255;
final boolean extra = (size % 255) == 0;
if (extra) {
// add a zero byte entry in the table
// required to indicate the sample size is multiple of 255
available -= 255;
}
// check if possible add the segment, without overflow the table
if (available < size) {
return false; // not enough space on the page
}
for (int seg = size; seg > 0; seg -= 255) {
segmentTable[segmentTableSize++] = (byte) Math.min(seg, 255);
}
if (extra) {
segmentTable[segmentTableSize++] = 0x00;
}
return true;
}
private void populateCrc32Table() {
for (int i = 0; i < 0x100; i++) {
int crc = i << 24;
for (int j = 0; j < 8; j++) {
final long b = crc >>> 31;
crc <<= 1;
crc ^= (int) (0x100000000L - b) & 0x04c11db7;
}
crc32Table[i] = crc;
}
}
private int calcCrc32(final int initialCrc, final byte[] buffer, final int size) {
int crc = initialCrc;
for (int i = 0; i < size; i++) {
final int reg = (crc >>> 24) & 0xff;
crc = (crc << 8) ^ crc32Table[reg ^ (buffer[i] & 0xff)];
}
return crc;
}
}

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

@@ -5,7 +5,7 @@ import android.content.Context;
import org.schabi.newpipe.R;
/**
* Created by Chrsitian Schabesberger on 28.09.17.
* Created by Christian Schabesberger on 28.09.17.
* KioskTranslator.java is part of NewPipe.
* <p>
* NewPipe is free software: you can redistribute it and/or modify
@@ -44,6 +44,10 @@ public final class KioskTranslator {
return c.getString(R.string.most_liked);
case "conferences":
return c.getString(R.string.conferences);
case "recent":
return c.getString(R.string.recent);
case "live":
return c.getString(R.string.duration_live);
default:
return kioskId;
}
@@ -59,9 +63,12 @@ public final class KioskTranslator {
case "Local":
return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_kiosk_local);
case "Recently added":
case "recent":
return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_kiosk_recent);
case "Most liked":
return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_thumb_up);
case "live":
return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_live_tv);
default:
return 0;
}

View File

@@ -141,7 +141,7 @@ public final class ListHelper {
final SharedPreferences preferences
= PreferenceManager.getDefaultSharedPreferences(context);
// Load the prefered resolution otherwise the best available
// Load the preferred resolution otherwise the best available
String resolution = preferences != null
? preferences.getString(context.getString(key), context.getString(value))
: context.getString(R.string.best_resolution_key);
@@ -161,7 +161,7 @@ public final class ListHelper {
*
* @param defaultResolution the default resolution to look for
* @param bestResolutionKey key of the best resolution
* @param defaultFormat the default fomat to look for
* @param defaultFormat the default format to look for
* @param videoStreams list of the video streams to check
* @return index of the default resolution&format
*/
@@ -351,7 +351,7 @@ public final class ListHelper {
* @param targetResolution the resolution to look for
* @param targetFormat the format to look for
* @param videoStreams the available video streams
* @return the index of the prefered video stream
* @return the index of the preferred video stream
*/
static int getVideoStreamIndex(final String targetResolution, final MediaFormat targetFormat,
final List<VideoStream> videoStreams) {
@@ -413,7 +413,7 @@ public final class ListHelper {
* @param context Android app context
* @param defaultResolution the default resolution
* @param videoStreams the list of video streams to check
* @return the index of the prefered video stream
* @return the index of the preferred video stream
*/
private static int getDefaultResolutionWithDefaultFormat(final Context context,
final String defaultResolution,

View File

@@ -20,6 +20,7 @@ import org.ocpsoft.prettytime.units.Decade;
import org.schabi.newpipe.R;
import org.schabi.newpipe.extractor.ListExtractor;
import org.schabi.newpipe.extractor.localization.ContentCountry;
import org.schabi.newpipe.ktx.OffsetDateTimeKt;
import java.math.BigDecimal;
import java.math.RoundingMode;
@@ -30,7 +31,6 @@ import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;
@@ -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() { }
@@ -314,7 +314,7 @@ public final class Localization {
}
public static String relativeTime(final OffsetDateTime offsetDateTime) {
return relativeTime(GregorianCalendar.from(offsetDateTime.toZonedDateTime()));
return relativeTime(OffsetDateTimeKt.toCalendar(offsetDateTime));
}
public static String relativeTime(final Calendar calendarTime) {

View File

@@ -1,313 +1,313 @@
package us.shandian.giga.get;
import android.util.Log;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
import org.schabi.newpipe.extractor.stream.AudioStream;
import org.schabi.newpipe.extractor.stream.StreamExtractor;
import org.schabi.newpipe.extractor.stream.SubtitlesStream;
import org.schabi.newpipe.extractor.stream.VideoStream;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.HttpURLConnection;
import java.nio.channels.ClosedByInterruptException;
import java.util.List;
import us.shandian.giga.get.DownloadMission.HttpError;
import static us.shandian.giga.get.DownloadMission.ERROR_RESOURCE_GONE;
public class DownloadMissionRecover extends Thread {
private static final String TAG = "DownloadMissionRecover";
static final int mID = -3;
private final DownloadMission mMission;
private final boolean mNotInitialized;
private final int mErrCode;
private HttpURLConnection mConn;
private MissionRecoveryInfo mRecovery;
private StreamExtractor mExtractor;
DownloadMissionRecover(DownloadMission mission, int errCode) {
mMission = mission;
mNotInitialized = mission.blocks == null && mission.current == 0;
mErrCode = errCode;
}
@Override
public void run() {
if (mMission.source == null) {
mMission.notifyError(mErrCode, null);
return;
}
Exception err = null;
int attempt = 0;
while (attempt++ < mMission.maxRetry) {
try {
tryRecover();
return;
} catch (InterruptedIOException | ClosedByInterruptException e) {
return;
} catch (Exception e) {
if (!mMission.running || super.isInterrupted()) return;
err = e;
}
}
// give up
mMission.notifyError(mErrCode, err);
}
private void tryRecover() throws ExtractionException, IOException, HttpError {
if (mExtractor == null) {
try {
StreamingService svr = NewPipe.getServiceByUrl(mMission.source);
mExtractor = svr.getStreamExtractor(mMission.source);
mExtractor.fetchPage();
} catch (ExtractionException e) {
mExtractor = null;
throw e;
}
}
// maybe the following check is redundant
if (!mMission.running || super.isInterrupted()) return;
if (!mNotInitialized) {
// set the current download url to null in case if the recovery
// process is canceled. Next time start() method is called the
// recovery will be executed, saving time
mMission.urls[mMission.current] = null;
mRecovery = mMission.recoveryInfo[mMission.current];
resolveStream();
return;
}
Log.w(TAG, "mission is not fully initialized, this will take a while");
try {
for (; mMission.current < mMission.urls.length; mMission.current++) {
mRecovery = mMission.recoveryInfo[mMission.current];
if (test()) continue;
if (!mMission.running) return;
resolveStream();
if (!mMission.running) return;
// before continue, check if the current stream was resolved
if (mMission.urls[mMission.current] == null) {
break;
}
}
} finally {
mMission.current = 0;
}
mMission.writeThisToFile();
if (!mMission.running || super.isInterrupted()) return;
mMission.running = false;
mMission.start();
}
private void resolveStream() throws IOException, ExtractionException, HttpError {
// FIXME: this getErrorMessage() always returns "video is unavailable"
/*if (mExtractor.getErrorMessage() != null) {
mMission.notifyError(mErrCode, new ExtractionException(mExtractor.getErrorMessage()));
return;
}*/
String url = null;
switch (mRecovery.getKind()) {
case 'a':
for (AudioStream audio : mExtractor.getAudioStreams()) {
if (audio.average_bitrate == mRecovery.getDesiredBitrate() && audio.getFormat() == mRecovery.getFormat()) {
url = audio.getUrl();
break;
}
}
break;
case 'v':
List<VideoStream> videoStreams;
if (mRecovery.isDesired2())
videoStreams = mExtractor.getVideoOnlyStreams();
else
videoStreams = mExtractor.getVideoStreams();
for (VideoStream video : videoStreams) {
if (video.resolution.equals(mRecovery.getDesired()) && video.getFormat() == mRecovery.getFormat()) {
url = video.getUrl();
break;
}
}
break;
case 's':
for (SubtitlesStream subtitles : mExtractor.getSubtitles(mRecovery.getFormat())) {
String tag = subtitles.getLanguageTag();
if (tag.equals(mRecovery.getDesired()) && subtitles.isAutoGenerated() == mRecovery.isDesired2()) {
url = subtitles.getUrl();
break;
}
}
break;
default:
throw new RuntimeException("Unknown stream type");
}
resolve(url);
}
private void resolve(String url) throws IOException, HttpError {
if (mRecovery.getValidateCondition() == null) {
Log.w(TAG, "validation condition not defined, the resource can be stale");
}
if (mMission.unknownLength || mRecovery.getValidateCondition() == null) {
recover(url, false);
return;
}
///////////////////////////////////////////////////////////////////////
////// Validate the http resource doing a range request
/////////////////////
try {
mConn = mMission.openConnection(url, true, mMission.length - 10, mMission.length);
mConn.setRequestProperty("If-Range", mRecovery.getValidateCondition());
mMission.establishConnection(mID, mConn);
int code = mConn.getResponseCode();
switch (code) {
case 200:
case 413:
// stale
recover(url, true);
return;
case 206:
// in case of validation using the Last-Modified date, check the resource length
long[] contentRange = parseContentRange(mConn.getHeaderField("Content-Range"));
boolean lengthMismatch = contentRange[2] != -1 && contentRange[2] != mMission.length;
recover(url, lengthMismatch);
return;
}
throw new HttpError(code);
} finally {
disconnect();
}
}
private void recover(String url, boolean stale) {
Log.i(TAG,
String.format("recover() name=%s isStale=%s url=%s", mMission.storage.getName(), stale, url)
);
mMission.urls[mMission.current] = url;
if (url == null) {
mMission.urls = new String[0];
mMission.notifyError(ERROR_RESOURCE_GONE, null);
return;
}
if (mNotInitialized) return;
if (stale) {
mMission.resetState(false, false, DownloadMission.ERROR_NOTHING);
}
mMission.writeThisToFile();
if (!mMission.running || super.isInterrupted()) return;
mMission.running = false;
mMission.start();
}
private long[] parseContentRange(String value) {
long[] range = new long[3];
if (value == null) {
// this never should happen
return range;
}
try {
value = value.trim();
if (!value.startsWith("bytes")) {
return range;// unknown range type
}
int space = value.lastIndexOf(' ') + 1;
int dash = value.indexOf('-', space) + 1;
int bar = value.indexOf('/', dash);
// start
range[0] = Long.parseLong(value.substring(space, dash - 1));
// end
range[1] = Long.parseLong(value.substring(dash, bar));
// resource length
value = value.substring(bar + 1);
if (value.equals("*")) {
range[2] = -1;// unknown length received from the server but should be valid
} else {
range[2] = Long.parseLong(value);
}
} catch (Exception e) {
// nothing to do
}
return range;
}
private boolean test() {
if (mMission.urls[mMission.current] == null) return false;
try {
mConn = mMission.openConnection(mMission.urls[mMission.current], true, -1, -1);
mMission.establishConnection(mID, mConn);
if (mConn.getResponseCode() == 200) return true;
} catch (Exception e) {
// nothing to do
} finally {
disconnect();
}
return false;
}
private void disconnect() {
try {
try {
mConn.getInputStream().close();
} finally {
mConn.disconnect();
}
} catch (Exception e) {
// nothing to do
} finally {
mConn = null;
}
}
@Override
public void interrupt() {
super.interrupt();
if (mConn != null) disconnect();
}
}
package us.shandian.giga.get;
import android.util.Log;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
import org.schabi.newpipe.extractor.stream.AudioStream;
import org.schabi.newpipe.extractor.stream.StreamExtractor;
import org.schabi.newpipe.extractor.stream.SubtitlesStream;
import org.schabi.newpipe.extractor.stream.VideoStream;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.HttpURLConnection;
import java.nio.channels.ClosedByInterruptException;
import java.util.List;
import us.shandian.giga.get.DownloadMission.HttpError;
import static us.shandian.giga.get.DownloadMission.ERROR_RESOURCE_GONE;
public class DownloadMissionRecover extends Thread {
private static final String TAG = "DownloadMissionRecover";
static final int mID = -3;
private final DownloadMission mMission;
private final boolean mNotInitialized;
private final int mErrCode;
private HttpURLConnection mConn;
private MissionRecoveryInfo mRecovery;
private StreamExtractor mExtractor;
DownloadMissionRecover(DownloadMission mission, int errCode) {
mMission = mission;
mNotInitialized = mission.blocks == null && mission.current == 0;
mErrCode = errCode;
}
@Override
public void run() {
if (mMission.source == null) {
mMission.notifyError(mErrCode, null);
return;
}
Exception err = null;
int attempt = 0;
while (attempt++ < mMission.maxRetry) {
try {
tryRecover();
return;
} catch (InterruptedIOException | ClosedByInterruptException e) {
return;
} catch (Exception e) {
if (!mMission.running || super.isInterrupted()) return;
err = e;
}
}
// give up
mMission.notifyError(mErrCode, err);
}
private void tryRecover() throws ExtractionException, IOException, HttpError {
if (mExtractor == null) {
try {
StreamingService svr = NewPipe.getServiceByUrl(mMission.source);
mExtractor = svr.getStreamExtractor(mMission.source);
mExtractor.fetchPage();
} catch (ExtractionException e) {
mExtractor = null;
throw e;
}
}
// maybe the following check is redundant
if (!mMission.running || super.isInterrupted()) return;
if (!mNotInitialized) {
// set the current download url to null in case if the recovery
// process is canceled. Next time start() method is called the
// recovery will be executed, saving time
mMission.urls[mMission.current] = null;
mRecovery = mMission.recoveryInfo[mMission.current];
resolveStream();
return;
}
Log.w(TAG, "mission is not fully initialized, this will take a while");
try {
for (; mMission.current < mMission.urls.length; mMission.current++) {
mRecovery = mMission.recoveryInfo[mMission.current];
if (test()) continue;
if (!mMission.running) return;
resolveStream();
if (!mMission.running) return;
// before continue, check if the current stream was resolved
if (mMission.urls[mMission.current] == null) {
break;
}
}
} finally {
mMission.current = 0;
}
mMission.writeThisToFile();
if (!mMission.running || super.isInterrupted()) return;
mMission.running = false;
mMission.start();
}
private void resolveStream() throws IOException, ExtractionException, HttpError {
// FIXME: this getErrorMessage() always returns "video is unavailable"
/*if (mExtractor.getErrorMessage() != null) {
mMission.notifyError(mErrCode, new ExtractionException(mExtractor.getErrorMessage()));
return;
}*/
String url = null;
switch (mRecovery.getKind()) {
case 'a':
for (AudioStream audio : mExtractor.getAudioStreams()) {
if (audio.average_bitrate == mRecovery.getDesiredBitrate() && audio.getFormat() == mRecovery.getFormat()) {
url = audio.getUrl();
break;
}
}
break;
case 'v':
List<VideoStream> videoStreams;
if (mRecovery.isDesired2())
videoStreams = mExtractor.getVideoOnlyStreams();
else
videoStreams = mExtractor.getVideoStreams();
for (VideoStream video : videoStreams) {
if (video.resolution.equals(mRecovery.getDesired()) && video.getFormat() == mRecovery.getFormat()) {
url = video.getUrl();
break;
}
}
break;
case 's':
for (SubtitlesStream subtitles : mExtractor.getSubtitles(mRecovery.getFormat())) {
String tag = subtitles.getLanguageTag();
if (tag.equals(mRecovery.getDesired()) && subtitles.isAutoGenerated() == mRecovery.isDesired2()) {
url = subtitles.getUrl();
break;
}
}
break;
default:
throw new RuntimeException("Unknown stream type");
}
resolve(url);
}
private void resolve(String url) throws IOException, HttpError {
if (mRecovery.getValidateCondition() == null) {
Log.w(TAG, "validation condition not defined, the resource can be stale");
}
if (mMission.unknownLength || mRecovery.getValidateCondition() == null) {
recover(url, false);
return;
}
///////////////////////////////////////////////////////////////////////
////// Validate the http resource doing a range request
/////////////////////
try {
mConn = mMission.openConnection(url, true, mMission.length - 10, mMission.length);
mConn.setRequestProperty("If-Range", mRecovery.getValidateCondition());
mMission.establishConnection(mID, mConn);
int code = mConn.getResponseCode();
switch (code) {
case 200:
case 413:
// stale
recover(url, true);
return;
case 206:
// in case of validation using the Last-Modified date, check the resource length
long[] contentRange = parseContentRange(mConn.getHeaderField("Content-Range"));
boolean lengthMismatch = contentRange[2] != -1 && contentRange[2] != mMission.length;
recover(url, lengthMismatch);
return;
}
throw new HttpError(code);
} finally {
disconnect();
}
}
private void recover(String url, boolean stale) {
Log.i(TAG,
String.format("recover() name=%s isStale=%s url=%s", mMission.storage.getName(), stale, url)
);
mMission.urls[mMission.current] = url;
if (url == null) {
mMission.urls = new String[0];
mMission.notifyError(ERROR_RESOURCE_GONE, null);
return;
}
if (mNotInitialized) return;
if (stale) {
mMission.resetState(false, false, DownloadMission.ERROR_NOTHING);
}
mMission.writeThisToFile();
if (!mMission.running || super.isInterrupted()) return;
mMission.running = false;
mMission.start();
}
private long[] parseContentRange(String value) {
long[] range = new long[3];
if (value == null) {
// this never should happen
return range;
}
try {
value = value.trim();
if (!value.startsWith("bytes")) {
return range;// unknown range type
}
int space = value.lastIndexOf(' ') + 1;
int dash = value.indexOf('-', space) + 1;
int bar = value.indexOf('/', dash);
// start
range[0] = Long.parseLong(value.substring(space, dash - 1));
// end
range[1] = Long.parseLong(value.substring(dash, bar));
// resource length
value = value.substring(bar + 1);
if (value.equals("*")) {
range[2] = -1;// unknown length received from the server but should be valid
} else {
range[2] = Long.parseLong(value);
}
} catch (Exception e) {
// nothing to do
}
return range;
}
private boolean test() {
if (mMission.urls[mMission.current] == null) return false;
try {
mConn = mMission.openConnection(mMission.urls[mMission.current], true, -1, -1);
mMission.establishConnection(mID, mConn);
if (mConn.getResponseCode() == 200) return true;
} catch (Exception e) {
// nothing to do
} finally {
disconnect();
}
return false;
}
private void disconnect() {
try {
try {
mConn.getInputStream().close();
} finally {
mConn.disconnect();
}
} catch (Exception e) {
// nothing to do
} finally {
mConn = null;
}
}
@Override
public void interrupt() {
super.interrupt();
if (mConn != null) disconnect();
}
}

View File

@@ -21,7 +21,7 @@ import static us.shandian.giga.get.DownloadMission.ERROR_HTTP_FORBIDDEN;
* Single-threaded fallback mode
*/
public class DownloadRunnableFallback extends Thread {
private static final String TAG = "DownloadRunnableFallbac";
private static final String TAG = "DownloadRunnableFallback";
private final DownloadMission mMission;

View File

@@ -1,18 +1,18 @@
package us.shandian.giga.get;
import androidx.annotation.NonNull;
public class FinishedMission extends Mission {
public FinishedMission() {
}
public FinishedMission(@NonNull DownloadMission mission) {
source = mission.source;
length = mission.length;
timestamp = mission.timestamp;
kind = mission.kind;
storage = mission.storage;
}
}
package us.shandian.giga.get;
import androidx.annotation.NonNull;
public class FinishedMission extends Mission {
public FinishedMission() {
}
public FinishedMission(@NonNull DownloadMission mission) {
source = mission.source;
length = mission.length;
timestamp = mission.timestamp;
kind = mission.kind;
storage = mission.storage;
}
}

View File

@@ -1,64 +1,64 @@
package us.shandian.giga.get;
import androidx.annotation.NonNull;
import java.io.Serializable;
import java.util.Calendar;
import us.shandian.giga.io.StoredFileHelper;
public abstract class Mission implements Serializable {
private static final long serialVersionUID = 1L;// last bump: 27 march 2019
/**
* Source url of the resource
*/
public String source;
/**
* Length of the current resource
*/
public long length;
/**
* creation timestamp (and maybe unique identifier)
*/
public long timestamp;
/**
* pre-defined content type
*/
public char kind;
/**
* The downloaded file
*/
public StoredFileHelper storage;
public long getTimestamp() {
return timestamp;
}
/**
* Delete the downloaded file
*
* @return {@code true] if and only if the file is successfully deleted, otherwise, {@code false}
*/
public boolean delete() {
if (storage != null) return storage.delete();
return true;
}
/**
* Indicate if this mission is deleted whatever is stored
*/
public transient boolean deleted = false;
@NonNull
@Override
public String toString() {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timestamp);
return "[" + calendar.getTime().toString() + "] " + (storage.isInvalid() ? storage.getName() : storage.getUri());
}
}
package us.shandian.giga.get;
import androidx.annotation.NonNull;
import java.io.Serializable;
import java.util.Calendar;
import us.shandian.giga.io.StoredFileHelper;
public abstract class Mission implements Serializable {
private static final long serialVersionUID = 1L;// last bump: 27 march 2019
/**
* Source url of the resource
*/
public String source;
/**
* Length of the current resource
*/
public long length;
/**
* creation timestamp (and maybe unique identifier)
*/
public long timestamp;
/**
* pre-defined content type
*/
public char kind;
/**
* The downloaded file
*/
public StoredFileHelper storage;
public long getTimestamp() {
return timestamp;
}
/**
* Delete the downloaded file
*
* @return {@code true] if and only if the file is successfully deleted, otherwise, {@code false}
*/
public boolean delete() {
if (storage != null) return storage.delete();
return true;
}
/**
* Indicate if this mission is deleted whatever is stored
*/
public transient boolean deleted = false;
@NonNull
@Override
public String toString() {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timestamp);
return "[" + calendar.getTime().toString() + "] " + (storage.isInvalid() ? storage.getName() : storage.getUri());
}
}

View File

@@ -1,11 +1,11 @@
package us.shandian.giga.io;
public interface ProgressReport {
/**
* Report the size of the new file
*
* @param progress the new size
*/
void report(long progress);
package us.shandian.giga.io;
public interface ProgressReport {
/**
* Report the size of the new file
*
* @param progress the new size
*/
void report(long progress);
}

View File

@@ -1,44 +1,44 @@
package us.shandian.giga.postprocessing;
import androidx.annotation.NonNull;
import org.schabi.newpipe.streams.OggFromWebMWriter;
import org.schabi.newpipe.streams.io.SharpStream;
import java.io.IOException;
import java.nio.ByteBuffer;
class OggFromWebmDemuxer extends Postprocessing {
OggFromWebmDemuxer() {
super(true, true, ALGORITHM_OGG_FROM_WEBM_DEMUXER);
}
@Override
boolean test(SharpStream... sources) throws IOException {
ByteBuffer buffer = ByteBuffer.allocate(4);
sources[0].read(buffer.array());
// youtube uses WebM as container, but the file extension (format suffix) is "*.opus"
// check if the file is a webm/mkv file before proceed
switch (buffer.getInt()) {
case 0x1a45dfa3:
return true;// webm/mkv
case 0x4F676753:
return false;// ogg
}
throw new UnsupportedOperationException("file not recognized, failed to demux the audio stream");
}
@Override
int process(SharpStream out, @NonNull SharpStream... sources) throws IOException {
OggFromWebMWriter demuxer = new OggFromWebMWriter(sources[0], out);
demuxer.parseSource();
demuxer.selectTrack(0);
demuxer.build();
return OK_RESULT;
}
}
package us.shandian.giga.postprocessing;
import androidx.annotation.NonNull;
import org.schabi.newpipe.streams.OggFromWebMWriter;
import org.schabi.newpipe.streams.io.SharpStream;
import java.io.IOException;
import java.nio.ByteBuffer;
class OggFromWebmDemuxer extends Postprocessing {
OggFromWebmDemuxer() {
super(true, true, ALGORITHM_OGG_FROM_WEBM_DEMUXER);
}
@Override
boolean test(SharpStream... sources) throws IOException {
ByteBuffer buffer = ByteBuffer.allocate(4);
sources[0].read(buffer.array());
// youtube uses WebM as container, but the file extension (format suffix) is "*.opus"
// check if the file is a webm/mkv file before proceed
switch (buffer.getInt()) {
case 0x1a45dfa3:
return true;// webm/mkv
case 0x4F676753:
return false;// ogg
}
throw new UnsupportedOperationException("file not recognized, failed to demux the audio stream");
}
@Override
int process(SharpStream out, @NonNull SharpStream... sources) throws IOException {
OggFromWebMWriter demuxer = new OggFromWebMWriter(sources[0], out);
demuxer.parseSource();
demuxer.selectTrack(0);
demuxer.build();
return OK_RESULT;
}
}

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

@@ -1,138 +1,138 @@
package us.shandian.giga.ui.common;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Handler;
import android.view.View;
import com.google.android.material.snackbar.Snackbar;
import org.schabi.newpipe.R;
import java.util.ArrayList;
import us.shandian.giga.get.FinishedMission;
import us.shandian.giga.get.Mission;
import us.shandian.giga.service.DownloadManager;
import us.shandian.giga.service.DownloadManager.MissionIterator;
import us.shandian.giga.ui.adapter.MissionAdapter;
public class Deleter {
private static final int TIMEOUT = 5000;// ms
private static final int DELAY = 350;// ms
private static final int DELAY_RESUME = 400;// ms
private Snackbar snackbar;
private ArrayList<Mission> items;
private boolean running = true;
private final Context mContext;
private final MissionAdapter mAdapter;
private final DownloadManager mDownloadManager;
private final MissionIterator mIterator;
private final Handler mHandler;
private final View mView;
private final Runnable rShow;
private final Runnable rNext;
private final Runnable rCommit;
public Deleter(View v, Context c, MissionAdapter a, DownloadManager d, MissionIterator i, Handler h) {
mView = v;
mContext = c;
mAdapter = a;
mDownloadManager = d;
mIterator = i;
mHandler = h;
// use variables to know the reference of the lambdas
rShow = this::show;
rNext = this::next;
rCommit = this::commit;
items = new ArrayList<>(2);
}
public void append(Mission item) {
mIterator.hide(item);
items.add(0, item);
show();
}
private void forget() {
mIterator.unHide(items.remove(0));
mAdapter.applyChanges();
show();
}
private void show() {
if (items.size() < 1) return;
pause();
running = true;
mHandler.postDelayed(rNext, DELAY);
}
private void next() {
if (items.size() < 1) return;
String msg = mContext.getString(R.string.file_deleted).concat(":\n").concat(items.get(0).storage.getName());
snackbar = Snackbar.make(mView, msg, Snackbar.LENGTH_INDEFINITE);
snackbar.setAction(R.string.undo, s -> forget());
snackbar.setActionTextColor(Color.YELLOW);
snackbar.show();
mHandler.postDelayed(rCommit, TIMEOUT);
}
private void commit() {
if (items.size() < 1) return;
while (items.size() > 0) {
Mission mission = items.remove(0);
if (mission.deleted) continue;
mIterator.unHide(mission);
mDownloadManager.deleteMission(mission);
if (mission instanceof FinishedMission) {
mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mission.storage.getUri()));
}
break;
}
if (items.size() < 1) {
pause();
return;
}
show();
}
public void pause() {
running = false;
mHandler.removeCallbacks(rNext);
mHandler.removeCallbacks(rShow);
mHandler.removeCallbacks(rCommit);
if (snackbar != null) snackbar.dismiss();
}
public void resume() {
if (running) return;
mHandler.postDelayed(rShow, DELAY_RESUME);
}
public void dispose() {
if (items.size() < 1) return;
pause();
for (Mission mission : items) mDownloadManager.deleteMission(mission);
items = null;
}
}
package us.shandian.giga.ui.common;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Handler;
import android.view.View;
import com.google.android.material.snackbar.Snackbar;
import org.schabi.newpipe.R;
import java.util.ArrayList;
import us.shandian.giga.get.FinishedMission;
import us.shandian.giga.get.Mission;
import us.shandian.giga.service.DownloadManager;
import us.shandian.giga.service.DownloadManager.MissionIterator;
import us.shandian.giga.ui.adapter.MissionAdapter;
public class Deleter {
private static final int TIMEOUT = 5000;// ms
private static final int DELAY = 350;// ms
private static final int DELAY_RESUME = 400;// ms
private Snackbar snackbar;
private ArrayList<Mission> items;
private boolean running = true;
private final Context mContext;
private final MissionAdapter mAdapter;
private final DownloadManager mDownloadManager;
private final MissionIterator mIterator;
private final Handler mHandler;
private final View mView;
private final Runnable rShow;
private final Runnable rNext;
private final Runnable rCommit;
public Deleter(View v, Context c, MissionAdapter a, DownloadManager d, MissionIterator i, Handler h) {
mView = v;
mContext = c;
mAdapter = a;
mDownloadManager = d;
mIterator = i;
mHandler = h;
// use variables to know the reference of the lambdas
rShow = this::show;
rNext = this::next;
rCommit = this::commit;
items = new ArrayList<>(2);
}
public void append(Mission item) {
mIterator.hide(item);
items.add(0, item);
show();
}
private void forget() {
mIterator.unHide(items.remove(0));
mAdapter.applyChanges();
show();
}
private void show() {
if (items.size() < 1) return;
pause();
running = true;
mHandler.postDelayed(rNext, DELAY);
}
private void next() {
if (items.size() < 1) return;
String msg = mContext.getString(R.string.file_deleted).concat(":\n").concat(items.get(0).storage.getName());
snackbar = Snackbar.make(mView, msg, Snackbar.LENGTH_INDEFINITE);
snackbar.setAction(R.string.undo, s -> forget());
snackbar.setActionTextColor(Color.YELLOW);
snackbar.show();
mHandler.postDelayed(rCommit, TIMEOUT);
}
private void commit() {
if (items.size() < 1) return;
while (items.size() > 0) {
Mission mission = items.remove(0);
if (mission.deleted) continue;
mIterator.unHide(mission);
mDownloadManager.deleteMission(mission);
if (mission instanceof FinishedMission) {
mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mission.storage.getUri()));
}
break;
}
if (items.size() < 1) {
pause();
return;
}
show();
}
public void pause() {
running = false;
mHandler.removeCallbacks(rNext);
mHandler.removeCallbacks(rShow);
mHandler.removeCallbacks(rCommit);
if (snackbar != null) snackbar.dismiss();
}
public void resume() {
if (running) return;
mHandler.postDelayed(rShow, DELAY_RESUME);
}
public void dispose() {
if (items.size() < 1) return;
pause();
for (Mission mission : items) mDownloadManager.deleteMission(mission);
items = null;
}
}

View File

@@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="?attr/colorControlNormal" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/black" android:pathData="M21,6h-7.59l3.29,-3.29L16,2l-4,4 -4,-4 -0.71,0.71L10.59,6L3,6c-1.1,0 -2,0.89 -2,2v12c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,8c0,-1.11 -0.9,-2 -2,-2zM21,20L3,20L3,8h18v12zM9,10v8l7,-4z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#FFFFFF" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M21,6h-7.59l3.29,-3.29L16,2l-4,4 -4,-4 -0.71,0.71L10.59,6L3,6c-1.1,0 -2,0.89 -2,2v12c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,8c0,-1.11 -0.9,-2 -2,-2zM21,20L3,20L3,8h18v12zM9,10v8l7,-4z"/>
</vector>

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

@@ -1,29 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:orientation="vertical">
<TextView
android:id="@+id/item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="relative header"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textSize="16sp"
android:textStyle="bold" />
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@color/black_settings_accent_color" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:orientation="vertical">
<TextView
android:id="@+id/item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="relative header"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textSize="16sp"
android:textStyle="bold" />
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@color/black_settings_accent_color" />
</LinearLayout>

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>
@@ -268,8 +268,8 @@
<string name="no_player_found_toast">لم يتم العثور على مشغل بث (يمكنك تثبيت VLC لتشغيله).</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="show_info">عرض المعلومات</string>
<string name="controls_add_to_playlist_title">إضافة إلى</string>
<string name="settings_category_debug_title">تحليل</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

@@ -1,20 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="view_count_text">%1$s visualizaciones</string>
<string name="view_count_text">%1$s vistes</string>
<string name="upload_date_text">Espublizóse\'l %1$s</string>
<string name="cancel">Encaboxar</string>
<string name="open_in_browser">Abrir nun restolador web</string>
<string name="open_in_browser">Abrir nun restolador</string>
<string name="share">Compartir</string>
<string name="settings">Axustes</string>
<string name="did_you_mean">¿Quixesti dicir «%1$s»\?</string>
<string name="did_you_mean">¿Quxesti dicir «%1$s»\?</string>
<string name="use_external_video_player_title">Usar un reproductor esternu de videu</string>
<string name="use_external_audio_player_title">Usar un reproductor esternu d\'audiu</string>
<string name="default_resolution_title">Resolución predeterminada</string>
<string name="play_with_kodi_title">Reproducir en Kodi</string>
<string name="show_play_with_kodi_title">Amosar la opción «Reproducir en Kodi»</string>
<string name="show_play_with_kodi_summary">Amuesa una opción pa reproducir un videu pel centru multimedia Kodi</string>
<string name="show_play_with_kodi_summary">Amuesa una opción pa reproducir vídeos pel centru multimedia Kodi</string>
<string name="play_audio">Audiu</string>
<string name="default_audio_format_title">Formatu predetermináu d\'audiu</string>
<string name="default_audio_format_title">Formatu d\'audiu predetermináu</string>
<string name="theme_title">Estilu</string>
<string name="dark_theme_title">Escuridá</string>
<string name="light_theme_title">Claridá</string>
@@ -26,16 +26,16 @@
<string name="duration_live">En direuto</string>
<string name="general_error">Fallu</string>
<string name="could_not_load_thumbnails">Nun pudieron cargase toles miniatures</string>
<string name="youtube_signature_deobfuscation_error">Nun pudo descifrase la robla de la URL del videu</string>
<string name="youtube_signature_deobfuscation_error">Nun pudo sabese la robla de la URL del videu</string>
<string name="parsing_error">Nun pudo analizase\'l sitiu web</string>
<string name="live_streams_not_supported">Entá nun se sofiten los fluxos en direuto</string>
<string name="could_not_get_stream">Nun pudo consiguise dengún fluxu</string>
<string name="sorry_string">Perdona pero eso nun debió asoceder.</string>
<string name="live_streams_not_supported">Los fluxos en direuto entá nun se sofiten</string>
<string name="could_not_get_stream">Nun pudo consiguise nengún fluxu</string>
<string name="sorry_string">Buff... Esto nun debió asoceder.</string>
<string name="error_snackbar_message">Perdona mas asocedió daqué malo.</string>
<string name="what_device_headline">Información:</string>
<string name="error_details_headline">Detalles:</string>
<string name="detail_likes_img_view_description">Préstames</string>
<string name="use_tor_title">Usar TOR</string>
<string name="use_tor_title">Usar Tor</string>
<string name="info_dir_created">Creóse\'l direutoriu de descarga «%1$s»</string>
<string name="video">Videu</string>
<string name="audio">Audiu</string>
@@ -48,73 +48,73 @@
<string name="msg_wait">Espera…</string>
<string name="msg_copied">Copióse al cartafueyu</string>
<string name="detail_dislikes_img_view_description">Tarrezmes</string>
<string name="default_video_format_title">Formatu predetermináu de videu</string>
<string name="default_video_format_title">Formatu de videu predetermináu</string>
<string name="black_theme_title">Prietu</string>
<string name="channel">Canal</string>
<string name="yes"></string>
<string name="short_thousand">Mil</string>
<string name="short_million">Mill.</string>
<string name="short_billion">Mil mill.</string>
<string name="msg_popup_permission">Precísase esti permisu
\np\'abrir nel mou ventanu</string>
<string name="short_thousand">mil</string>
<string name="short_million">mill.</string>
<string name="short_billion">mil mill.</string>
<string name="msg_popup_permission">Precísase esti permisu p\'abrir
\nnel mou ventanu</string>
<string name="title_activity_recaptcha">Retu de reCAPTCHA</string>
<string name="recaptcha_request_toast">Solicitóse\'l retu de reCAPTCHA</string>
<string name="recaptcha_request_toast">Solicitóse un retu de reCAPTCHA</string>
<string name="controls_background_title">En segundu planu</string>
<string name="controls_popup_title">Ventanu</string>
<string name="default_popup_resolution_title">Resolución predeterminada del ventanu</string>
<string name="show_higher_resolutions_title">Amosar resoluciones más altes</string>
<string name="show_higher_resolutions_summary">Namái dalgunos preseos puen reproducir vídeos en 2K/4K</string>
<string name="show_higher_resolutions_summary">Namás dalgunos preseos puen reproducir videos en 2K/4K</string>
<string name="clear">Llimpiar</string>
<string name="use_external_video_player_summary">Quita l\'audiu en dalgunes resoluciones</string>
<string name="player_gesture_controls_summary">Usa xestos pa controlar el brilléu y volume del reproductor</string>
<string name="show_search_suggestions_title">Guetar suxerencies</string>
<string name="show_search_suggestions_summary">Amuesa suxerencies al guetar</string>
<string name="player_gesture_controls_summary">Usa xestos pa controlar el volume y brillu del reproductor</string>
<string name="show_search_suggestions_title">Suxerencies de busca</string>
<string name="show_search_suggestions_summary">Amosar suxerencies al buscar</string>
<string name="subscribe_button_title">Soscribise</string>
<string name="subscription_update_failed">Nun pudo anovase la soscripción</string>
<string name="tab_subscriptions">Soscripciones</string>
<string name="fragment_feed_title">Novedaes</string>
<string name="enable_search_history_title">Historial de gueta</string>
<string name="resume_on_audio_focus_gain_title"/>
<string name="resume_on_audio_focus_gain_summary">Sigue cola reproducción dempués de les interrupciones (llamaes telefóniques, por exemplu)</string>
<string name="enable_search_history_title">Historial de busques</string>
<string name="resume_on_audio_focus_gain_title">Siguir cola reproducción</string>
<string name="resume_on_audio_focus_gain_summary">Sigue cola reproducción dempués de les interrupciones (por exemplu, llamaes)</string>
<string name="settings_category_player_title">Reproductor</string>
<string name="settings_category_player_behavior_title">Comportamientu</string>
<string name="settings_category_history_title">Historial y caché</string>
<string name="best_resolution">La meyor resolución</string>
<string name="notification_channel_name">Avisu de NewPipe</string>
<string name="notification_channel_name">Avisu permanente de NewPipe</string>
<string name="search_no_results">Nun hai resultaos</string>
<string name="empty_subscription_feed_subtitle">Equí nun hai más que grillos</string>
<plurals name="subscribers">
<item quantity="one">%s soscriptor</item>
<item quantity="other">%s soscriptores</item>
</plurals>
<string name="no_views">Nun hai visualizaciones</string>
<string name="no_views">Nun hai vistes</string>
<plurals name="views">
<item quantity="one">%s visualización</item>
<item quantity="other">%s visualizaciones</item>
<item quantity="one">%s vista</item>
<item quantity="other">%s vistes</item>
</plurals>
<string name="settings_category_downloads_title">Descarga</string>
<string name="settings_file_charset_title">Caráuteres almitíos nos nomes de ficheros</string>
<string name="settings_file_charset_title">Caráuteres permitíos nos nomes de los ficheros</string>
<string name="charset_letters_and_digits">Lletres y díxitos</string>
<string name="charset_most_special_characters">La mayoría de caráuteres especiales</string>
<string name="title_activity_about">Tocante a NewPipe</string>
<string name="action_settings">Axustes</string>
<string name="action_about">Tocante a</string>
<string name="title_licenses">Llicencies de terceros</string>
<string name="copyright" formatted="true">© %1$s por %2$s so %3$s</string>
<string name="copyright" formatted="true">© %1$s por %2$s baxo %3$s</string>
<string name="error_unable_to_load_license">Nun pudo cargase la llicencia</string>
<string name="tab_about">Tocante a</string>
<string name="tab_contributors">Collaboradores</string>
<string name="tab_licenses">Llicencies</string>
<string name="view_on_github">Ver en GitHub</string>
<string name="app_license_title">Llicencia de NewPipe</string>
<string name="contribution_encouragement">Si sabes traducir, quies encuriosar el códigu, amestar carauteríques o proponer cambeos nel diseñu, vamos agradecételo siempres. ¡Cuánto más, meyor!</string>
<string name="read_full_license">Lleer la llicencia</string>
<string name="contribution_encouragement">Si tienes idees, quies traducir, facer dalgún cambéu nel diseñu, acuriosar poco o muncho\'l códigu... Agradecemos l\'ayuda. ¡Cuanto más se faiga, meyor!</string>
<string name="read_full_license">Lleer</string>
<string name="contribution_title">Collaboración</string>
<string name="title_activity_history">Historial</string>
<string name="title_history_view">Vióse</string>
<string name="action_history">Historial</string>
<string name="history_empty">L\'historial ta baleru</string>
<string name="delete_item_search_history">¿Quies desaniciar esti elementu del historial de gueta\?</string>
<string name="delete_item_search_history">¿Quies desaniciar esti elementu del historial de busques\?</string>
<string name="play_all">Reproducir too</string>
<string name="player_stream_failure">Nun pudo reproducise esti fluxu</string>
<string name="player_unrecoverable_failure">Asocedió un fallu irrecuperable del reproductor</string>
@@ -123,14 +123,14 @@
<string name="select_a_kiosk">Esbilla d\'un quioscu</string>
<string name="kiosk">Quioscu</string>
<string name="trending">Tendencies</string>
<string name="top_50">Destácase</string>
<string name="top_50">Los 50 destacaos</string>
<string name="play_queue_stream_detail">Detalles</string>
<string name="new_and_hot">Novedaes</string>
<string name="new_and_hot">Novedaes destacaes</string>
<string name="unknown_content">[Desconozse]</string>
<string name="start_here_on_background">Reproducir en segundu planu</string>
<string name="start_here_on_popup"/>
<string name="start_here_on_popup">Reproducir nun ventanu</string>
<string name="donation_title">Donación</string>
<string name="donation_encouragement"/>
<string name="donation_encouragement">NewPipe ta desendolcáu por xente voluntario que pasa\'l tiempu llibre ufriéndote la meyor esperiencia d\'usuariu. Devolvi\'l favor p\'ayudar a los desendolcadores p\'ameyorar NewPipe tovía más mentanto esfruten d\'una taza de café.</string>
<string name="give_back">Donar</string>
<string name="website_title">Sitiu web</string>
<string name="website_encouragement">Visita\'l sitiu web de NewPipe pa más información y noticies.</string>
@@ -138,43 +138,43 @@
<string name="always">Siempres</string>
<string name="import_data_title">Importar una base de datos</string>
<string name="export_data_title">Esportar la base de datos</string>
<string name="import_data_summary">Anula l\'historial y les soscripciones actuales</string>
<string name="export_data_summary">Esporta l\'historial, les soscripciones y llistes de reproducción.</string>
<string name="invalid_url_toast">URL nun ye válida</string>
<string name="import_data_summary">Anula l\'historial, les soscripciones, les llistes de reproducción y (opcionalmente) los axustes actuales</string>
<string name="export_data_summary">Esporta l\'historial, les soscripciones, les llistes de reproducción y los axustes</string>
<string name="invalid_url_toast">La URL nun ye válida</string>
<string name="override_current_data">Esto va anular la configuración actual.</string>
<string name="show_info">Amosar la información</string>
<string name="tab_bookmarks">Llistes de reproducción</string>
<string name="tab_bookmarks">Llistes en marcadores</string>
<string name="create">Crear</string>
<string name="dismiss">Escartar</string>
<string name="delete_all_history_prompt">¿De xuru que quies desaniciar tolos elementos del historial\?</string>
<string name="drawer_header_action_paceholder_text">Equí va apaecer dalgo ceo ;D</string>
<string name="create_playlist">Llista nueva de repoducción</string>
<string name="drawer_header_action_paceholder_text">Equí va apaecer daqué pronto ;D</string>
<string name="create_playlist">Llista de reproducción nueva</string>
<string name="name">Nome</string>
<string name="append_playlist">Amestar a una llista de repoducción</string>
<string name="delete_playlist_prompt">¿Desaniciar esta llista de reproducción\?</string>
<string name="append_playlist">Amestar a una llista de reproducción</string>
<string name="delete_playlist_prompt">¿Desanicair esta llista de reproducción\?</string>
<string name="playlist_delete_failure">Nun pudo desaniciase la llista de reproducción.</string>
<string name="caption_none">Ensin sotítulos</string>
<string name="resize_fit">Axustar</string>
<string name="resize_fill">Rellenar</string>
<string name="resize_zoom">Zoom</string>
<string name="file">Ficheru</string>
<string name="invalid_file">El ficheru nun esiste o falta\'l permisu d\'escritura o llectura</string>
<string name="file">FIcheru</string>
<string name="invalid_file">El ficheru nun esiste o a l\'aplicación fálta-y el permisu de llectura/escritura</string>
<string name="error_occurred_detail">Asocedió un fallu: %1$s</string>
<string name="import_export_title">Importación/Esportación</string>
<string name="import_ongoing">Importando…</string>
<string name="export_ongoing">Esportando…</string>
<string name="subscriptions_export_unsuccessful">Nun pudieron esportase les soscripciones</string>
<string name="preferred_open_action_settings_title">Aición preferida d\'apertura</string>
<string name="import_settings">¿Quies importar los axustes tamién\?</string>
<string name="read_privacy_policy">Lleer la política de privacidá</string>
<string name="preferred_open_action_settings_title">Aición d\'apertura preferida</string>
<string name="import_settings">¿Quies tamién importar los axustes\?</string>
<string name="read_privacy_policy">Lleer</string>
<string name="channels">Canales</string>
<string name="playlists">Llistes de reproducción</string>
<string name="tracks">Pistes</string>
<string name="users">Usuarios</string>
<string name="tab_new">Llingüeta nueva</string>
<string name="volume_gesture_control_summary">Usa xestos pa controlar el volume del reproductor</string>
<string name="brightness_gesture_control_summary">Usa xestos pa controlar el brilléu del reproductor</string>
<string name="restore_defaults">Reafitar</string>
<string name="brightness_gesture_control_summary">Usa xestos pa controlar el brillu del reproductor</string>
<string name="restore_defaults">Reafitamientu de valores</string>
<string name="subscribers_count_not_available">El númberu de soscriptores nun ta disponible</string>
<string name="selection">Esbilla</string>
<string name="updates_setting_title">Anovamientos</string>
@@ -184,10 +184,10 @@
<string name="missions_header_finished">Finó</string>
<string name="download_failed">Falló la descarga</string>
<string name="download_already_running">Hai una descarga en cursu con esti nome</string>
<string name="error_path_creation">Nun pue crease la carpeta de destín</string>
<string name="error_path_creation">La carpeta de destín nun pue crease</string>
<string name="error_ssl_exception">Nun pudo afitase una conexón segura</string>
<string name="error_connect_host">Nun pue coneutase col sirvidor</string>
<string name="max_retry_msg">Reintentos máximos</string>
<string name="error_connect_host">Nun pues coneutate al sirvidor</string>
<string name="max_retry_msg">Intentos máximos</string>
<string name="events">Eventos</string>
<string name="conferences">Conferencies</string>
<string name="autoplay_title">Reproducción automática</string>
@@ -195,50 +195,52 @@
<string name="missing_file">El ficheru movióse o desanicióse</string>
<string name="overwrite_unrelated_warning">Yá esiste un ficheru con esti nome</string>
<string name="overwrite_finished_warning">Yá esiste un ficheru baxáu con esti nome</string>
<string name="overwrite_failed">nun pue sobrescribise\'l ficheru</string>
<string name="overwrite_failed">nun pue sobrecribise\'l ficheru</string>
<string name="download_already_pending">Hai una descarga pendiente con esti nome</string>
<string name="error_insufficient_storage">Escosó l\'espaciu del preséu</string>
<string name="error_insufficient_storage">Nun queda espaciu nel preséu</string>
<string name="error_timeout">Escosó\'l tiempu d\'espera de la conexón</string>
<string name="subscriptions_import_unsuccessful">Nun pudieron importase les soscripciones</string>
<string name="caption_setting_title">Sotítulos</string>
<string name="accept">Aceutar</string>
<string name="restore_defaults_confirmation">¿Quies reafitar los valores\?</string>
<string name="error_unknown_host"/>
<string name="error_http_unsupported_range">El sirvidor nun aceuta descargues multifilu, volvi probar con @string/msg_threads = 1</string>
<string name="error_unknown_host">Nun pudo atopase\'l sirvidor</string>
<string name="error_http_unsupported_range">El sirvidor nun aceuta descargues multifilu, volvi tentalo con @string/msg_threads = 1</string>
<string name="no_comments">Nun hai comentarios</string>
<string name="settings_category_clear_data_title">Llimpieza de datos</string>
<string name="show_comments_title">Amosar comentarios</string>
<string name="show_comments_title">Amosar los comentarios</string>
<string name="show_comments_summary">Desactiva esta opción p\'anubrir los comentarios</string>
<string name="start_accept_privacy_policy">Pa cumplir cola GDPR (Regulación Xeneral de Proteición de Datos) europea, pidímoste que revises la política de privacidá de NewPipe. Lléila con procuru.
\nHas aceutala unviándonos un informe de fallos.
</string>
<string name="minimize_on_exit_summary">Aición al cambiar a otra aplicación dende\'l reproductor de vídeos principal — %s</string>
<string name="max_retry_desc">El númberu máximu d\'intentos enantes d\'encaboxar la descarga</string>
<string name="start_accept_privacy_policy">Pa cumplir cola Regulación Xeneral de Proteición de Datos (RGPD), pidímoste que mires la política de privacidá de NewPipe. Lleila con procuru.
\nHas aceutala pa unvianos informes de fallos.</string>
<string name="minimize_on_exit_summary">L\'aición al cambiar a otra aplicación dende\'l reproductor de videu princpial — %s</string>
<string name="max_retry_desc">El númberu máximu d\'intentos pa encaboxar la descarga</string>
<string name="confirm_prompt">¿Quies llimpiar l\'historial de descargues o desaniciar tolos ficheros baxaos\?</string>
<string name="previous_export">Esportación anterior</string>
<string name="import_file_title">Importar el ficheru</string>
<string name="import_youtube_instructions">Importa les soscripciones de YouTube baxando\'l ficheru d\'esportación:
\n
\n1.- Vete a esta URL: %1$s
\n2.- Anicia sesión cuando se te pida
\n3.- Debería aniciase una descarga (que ye\'l ficheru d\'esportación)</string>
<string name="import_soundcloud_instructions">Importa un perfil de SoundCloud teclexando la URL o la ID de to:
\n1.- Activa\'l mou escritoriu nun restolador web (el sitiu nun ta disponible pa móviles)
<string name="import_file_title">Importación d\'un ficheru</string>
<string name="import_youtube_instructions">Importa les soscripciones de YouTube dende Google Takeout:
\n
\n3.- Anicia sesión cuando se te pida
\n2.- Vete a esta URL: %1$s
\n4.- Copia la URL del perfil al que se te redirixa.</string>
<string name="import_soundcloud_instructions_hint">LaToID, soundcloud.com/latoid</string>
<string name="download_thumbnail_title">Cargar miniatures</string>
<string name="download_thumbnail_summary">Desactiva esta opción pa evitar la carga de miniatures y aforrar datos y usu de la memoria. Los cambeos van llimpiar la memoria y la caché d\'imáxenes.</string>
<string name="minimize_on_exit_title">Minimizar al cambiar a otra aplicación</string>
\n1. Vete a esta URL: %1$s
\n2. Anicia sesión cuando se te pida
\n3. Calca en «Tolos datos incluyíos», darréu en «Deseleicionar too», dempués esbilla namás «soscripciones» y calca «Aceutar»
\n4. Calca en «Pasu siguiente» y darréu en «Crear una esportación»
\n5. Calca nel botón «Baxar» dempués de qu\'apaeza y
\n6. A partir del ficheru baxáu, estrái\'l ficheru .json (polo xeneral baxo «YouTube and YouTube Music/subscriptions/subscriptions.json») ya impórtalu equí.</string>
<string name="import_soundcloud_instructions">Importa un perfil de SoundCloud teclexando la URL o la to ID:
\n
\n1. Activa\'l «mou d\'escritoriu» nun restolador web (el sitiu nun ta disponible pa móviles)
\n2. Vete a esta URL: %1$s
\n3. Anicia sesión cuando se te pida
\n4. Copia la URL del perfil al que te redirixeron.</string>
<string name="import_soundcloud_instructions_hint">soundcloud.com/LaToID</string>
<string name="download_thumbnail_title">Cargar les miniatures</string>
<string name="download_thumbnail_summary">Desactiva esta opción pa eviar la carga de miniatures y aforrar datos y usu de memoria. Los cambeos llimpien la caché d\'imáxenes temporal y permanente.</string>
<string name="minimize_on_exit_title">Minimizar al cambiar d\'aplicación</string>
<string name="minimize_on_exit_background_description">Minimizar al reproductor en segundu planu</string>
<string name="minimize_on_exit_popup_description">Minimizar al reproductor en ventanu</string>
<string name="unsubscribe">Desoscribise</string>
<string name="tab_choose">Escoyeta d\'una llingüeta</string>
<string name="unsubscribe">Esborrase</string>
<string name="tab_choose">Esbilla d\'una llingüeta</string>
<string name="enable_playback_resume_title">Siguir cola reproducción</string>
<string name="main_page_content_summary">Les llingüetes que s\'amuesen na páxina principal</string>
<string name="downloads_storage_ask_title">Entrugar ánde baxar</string>
<string name="downloads_storage_ask_title">Entrugar ónde baxar</string>
<string name="downloads">Descargues</string>
<string name="downloads_title">Descargues</string>
<plurals name="videos">
@@ -247,26 +249,26 @@
</plurals>
<string name="player_gesture_controls_title">Control per xestos del reproductor</string>
<string name="preferred_player_fetcher_notification_message">Cargando\'l conteníu solicitáu</string>
<string name="privacy_policy_title">Política de Privacidá de NewPipe</string>
<string name="privacy_policy_title">Política de privacidá de NewPipe</string>
<string name="volume_gesture_control_title">Control per xestos del volume</string>
<string name="brightness_gesture_control_title">Control per xestos del brilléu</string>
<string name="brightness_gesture_control_title">Control per xestos del brillu</string>
<string name="error_file_creation">El ficheru nun pue crease</string>
<string name="error_http_no_content">El sirvidor nun unvia datos</string>
<string name="localization_changes_requires_app_restart">La llingua va camudar namái que se reanicie l\'aplicación.</string>
<string name="search">Guetar</string>
<string name="localization_changes_requires_app_restart">La llingua va camudar namás que se reanicie l\'aplicación.</string>
<string name="search">Buscar</string>
<string name="share_dialog_title">Compartir con</string>
<string name="msg_exists">El ficheru yá esiste</string>
<string name="msg_exists">Yá esiste\'l ficheru</string>
<string name="subscribed_button_title">Soscribiéstite</string>
<string name="history_disabled">L\'historial ta desactiváu</string>
<string name="no_videos">Nun hai vídeos</string>
<string name="delete_search_history_alert">¿Desaniciar tol historial de guetes\?</string>
<string name="app_update_notification_content_title">¡Hai un anovamientu disponible pa NewPipe!</string>
<string name="app_update_notification_content_text">Toca pa baxar la versión</string>
<string name="delete_search_history_alert">¿Desaniciar tol historial de busques\?</string>
<string name="app_update_notification_content_title">¡Hai un anovamientu pa NewPipe!</string>
<string name="app_update_notification_content_text">Toca pa baxalu</string>
<string name="error_progress_lost">Perdióse\'l progresu porque se desanició\'l ficheru</string>
<string name="peertube_instance_url_title">Instancies de PeerTube</string>
<string name="peertube_instance_add_exists">La instancia yá esiste</string>
<string name="app_language_title">Llingua de l\'aplicación</string>
<string name="systems_language">La predeterminada del sistema</string>
<string name="systems_language">Lo predeterminao del sistema</string>
<string name="videos_string">Vídeos</string>
<plurals name="seconds">
<item quantity="one">%d segundu</item>
@@ -275,14 +277,14 @@
<string name="playback_tempo">Tempu</string>
<string name="playback_pitch">Tonu</string>
<string name="decline">Refugar</string>
<string name="unsupported_url">La URL nun se sofita</string>
<string name="unsupported_url">La URL nun ta sofitada</string>
<string name="background_player_playing_toast">Reproduciendo en segundu planu</string>
<string name="popup_playing_toast">Reproduciendo nel mou ventanu</string>
<string name="enable_search_history_summary">Atroxa llocalmente les consultes de gueta</string>
<string name="external_player_unsupported_link_type">Los reproductores esternos nun so</string>
<string name="enable_search_history_summary">Atroxa llocalmente les consultes de busca</string>
<string name="external_player_unsupported_link_type">Los reproductores esternos nun sofiten esti tipu d\'enllaces</string>
<string name="export_complete_toast">Esportóse</string>
<string name="import_complete_toast">Importóse</string>
<string name="could_not_import_all_files">Alvertencia: Nun pudieron importase tolos ficheros.</string>
<string name="could_not_import_all_files">Alvertencia: nun pudieron importase tolos ficheros.</string>
<string name="settings_category_updates_title">Anovamientos</string>
<string name="download_finished">Finó la descarga</string>
<string name="peertube_instance_add_fail">Nun pudo validase la instancia</string>
@@ -299,10 +301,352 @@
<item quantity="other">%d díes</item>
</plurals>
<string name="feed_group_dialog_delete_message">¿Quies desaniciar esti grupu\?</string>
<string name="metadata_cache_wipe_complete_notice">Llipióse la caché de metadatos</string>
<string name="metadata_cache_wipe_summary">Desanicia los datos de les páxines web na caché</string>
<string name="metadata_cache_wipe_complete_notice">Llimpióse la caché de metadatos</string>
<string name="metadata_cache_wipe_summary">Desanicia tolos datos na caché de les páxines web</string>
<string name="metadata_cache_wipe_title">Llimpiar los metadatos de la caché</string>
<string name="thumbnail_cache_wipe_complete_notice">Llimpióse la caché d\'imáxenes</string>
<string name="kore_not_found">¿Instalar l\'aplicación Kore\?</string>
<string name="autoplay_by_calling_app_summary">Reproduz un videu cuando s\'invoca a NewPipe dende otra aplicación</string>
<string name="kore_not_found">¿Instalar Kore\?</string>
<string name="autoplay_by_calling_app_summary">Reproduz un videu al llamar a NewPipe dende otra aplicación</string>
<string name="info_labels">Qué asocedió:\\nSolicitú:\\nLlingua del conteníu:\\nPaís del conteníu:\\nLlingua de l\'aplicación:\\nServiciu:\\nHora en GMT:\\nPaquete:\\nVersión de l\'aplicación:\\nVersión del SO:</string>
<string name="no_player_found_toast">Nun s\'atopó nengún reproductor de fluxos (pues instalar VLC pa reproducilos).</string>
<string name="show_thumbnail_summary">Amuesa una miniatura nel fondu de la pantalla de bloquéu y dientro de los avisos</string>
<string name="show_thumbnail_title">Amosar una miniatura</string>
<string name="playlist_page_summary">Páxina d\'una llista de reproducción</string>
<string name="video_detail_by">Por %s</string>
<string name="channel_created_by">Canal creada por %s</string>
<string name="detail_sub_channel_thumbnail_view_description">Avatar de la canal</string>
<string name="content_not_supported">Esti conteníu entá nun ta sofitáu por NewPipe.
\n
\nQuiciabes nel futuru sí.</string>
<string name="feed_use_dedicated_fetch_method_help_text">¿Cuides que la carga del feed ye perlenta\? Si ye asina, activa la carga rápida (pues camudalo nos axustes o primiendo\'l botón d\'embaxo).
\n
\nNewPipe ufre dos estratexes de descarga de feeds:
\n• Dir en cata de tola canal de soscripciones, lo cual ye lento pero completo.
\n• Usar un serviciu final dedicáu, lo cual ye rápido mas xeneralmente incompleto.
\n
\nLa diferencia ente los dos ye qu\'al más rápidu, polo xeneral, fálta-y dalguna información como\'l tipu (nun pue estremar ente vídeos en direuto o normales) o la duración de los elementos (que devuelve menos).
\n
\nYouTube ye l\'exemplu d\'un serviciu qu\'ufre esti métodu rápidu col so feed RSS.
\n
\nPolo que tu escueyes según lo que prefieras, si velocidá o información precisa.</string>
<string name="feed_use_dedicated_fetch_method_disable_button">Desactivar el mou rápidu</string>
<string name="feed_use_dedicated_fetch_method_enable_button">Activar el mou rápidu</string>
<string name="feed_use_dedicated_fetch_method_summary">Disponible en dalgunos preseos, suel ser muncho más rápido mas podría devolver un númberu llendáu d\'elementos y davezu información completa (por exemplu, falta de la duración, el tipu d\'elementu o l\'estáu de la tresmisión).</string>
<string name="feed_use_dedicated_fetch_method_title">Dir en cata de feeds dedicaos cuando seya posible</string>
<string name="feed_update_threshold_option_always_update">Anovar siempres</string>
<string name="feed_update_threshold_summary">Tiempu que tarda (dende l\'últimu anovamientu) en considerase una soscripción ensin anovar — %s</string>
<string name="feed_update_threshold_title">Llende del anovamientu del feed</string>
<string name="settings_category_feed_title">Feed</string>
<string name="feed_group_show_only_ungrouped_subscriptions">Amosar namás les soscripciones ensin agrupar</string>
<string name="feed_create_new_group_button_title">Nuevu</string>
<string name="feed_group_dialog_empty_name">El nome del grupu ta baleru</string>
<plurals name="feed_group_dialog_selection_count">
<item quantity="one">%d na esbilla</item>
<item quantity="other">%d na esbilla</item>
</plurals>
<string name="feed_group_dialog_empty_selection">Nun s\'esbilló nenguna soscripción</string>
<string name="feed_group_dialog_select_subscriptions">Esbillar soscripciones</string>
<string name="feed_processing_message">Procesando\'l feed…</string>
<string name="feed_notification_loading">Cargando\'l feed…</string>
<string name="feed_subscription_not_loaded_count">Númberu d\'elementos que nun cargaron: %d</string>
<string name="feed_oldest_subscription_update">Últimu anovamientu del feed: %s</string>
<string name="feed_groups_header_title">Grupos de canales</string>
<string name="new_seek_duration_toast">Pola mor de les torgues d\'ExoPlayer la duración afitóse en %d segundos</string>
<string name="remove_watched_popup_yes_and_partially_watched_videos">Sí, y tamién los vistos parcialmente</string>
<string name="remove_watched_popup_warning">Van desaniciase los vídeos que se vieren enantes y dempués d\'amestase a la llista de reproducción.
\n¿De xuru\? ¡Esto nun pue desfacese!</string>
<string name="remove_watched_popup_title">¿Desaniciar los vídeos vistos\?</string>
<string name="remove_watched">Desaniciar lo visto</string>
<string name="choose_instance_prompt">Escoyeta d\'una instancia</string>
<string name="downloads_storage_use_saf_summary">El «Storage Access Framework» permite les descargues nuna tarxeta SD esterna.
\nDalgunos preseos son incompatibles</string>
<string name="downloads_storage_use_saf_title">Usar SAF</string>
<string name="downloads_storage_ask_summary_kitkat">Va pidísete l\'allugamientu onde guardar les descargues con cauna.
\nEscueyi SAF si quies guardar les descargues na tarxeta SD esterna</string>
<string name="downloads_storage_ask_summary">Va pidísete l\'allugamientu onde guardar les descargues con cauna</string>
<string name="pause_downloads">Posar les descargues</string>
<string name="start_downloads">Aniciar les descargues</string>
<string name="enable_queue_limit_desc">Namás va executase una descarga al empar</string>
<string name="enable_queue_limit">Llendar la cola de descarga</string>
<string name="close">Zarrar</string>
<string name="pause_downloads_on_mobile_desc">Útil al cambiar a los datos móviles, magar que dalgunes descargues nun puedan suspendese</string>
<string name="pause_downloads_on_mobile">Torgar nes redes midíes</string>
<string name="stop">Parar</string>
<string name="deleted_downloads">Desaniciáronse %1$d descargues</string>
<string name="delete_downloaded_files">Desaniciar lo baxao</string>
<string name="clear_download_history">Llimpiar l\'historial de descargues</string>
<string name="error_download_resource_gone">Esta descarga nun pue recuperase</string>
<string name="error_postprocessing_stopped">NewPipe zarróse mentanto trabayaba nel ficheru</string>
<string name="error_postprocessing_failed">Falló\'l posprocesamientu</string>
<string name="error_http_not_found">Nun s\'atopó</string>
<string name="error_permission_denied">El sistema negó\'l permisu</string>
<string name="label_code">Códigu</string>
<string name="show_error">Amosar el fallu</string>
<string name="overwrite">Sobrescribir</string>
<string name="generate_unique_name">Xenerar un nome únicu</string>
<string name="download_finished_more">Finaron %s descargues</string>
<string name="permission_denied">El sistema negó l\'aición</string>
<string name="enqueue">Amestar a la cola</string>
<string name="recovering">recuperando</string>
<string name="post_processing">posprocesando</string>
<string name="queued">na cola</string>
<string name="paused">posóse</string>
<string name="missions_header_pending">Pendiente</string>
<string name="switch_view">Cambiar la vista</string>
<string name="auto">Auto</string>
<string name="list_view_mode">Mou de la vista de les llistes</string>
<string name="never">Enxamás</string>
<string name="wifi_only">Namás na Wi-Fi</string>
<string name="autoplay_summary">Anicia automáticamente la reproducción — %s</string>
<string name="minimize_on_exit_none_description">Nada</string>
<string name="limit_mobile_data_usage_title">Llendar la resolución al usar los datos móviles</string>
<string name="limit_data_usage_none_description">Ensin llende</string>
<string name="playback_reset">Reafitar</string>
<string name="playback_step">Pasu</string>
<string name="skip_silence_checkbox">Avance rápidu nos silencios</string>
<string name="unhook_checkbox">Separtar (pue causar distorsión)</string>
<string name="playback_speed_control">Controles de la velocidá de reproducción</string>
<string name="import_network_expensive_warning">Ten en cuenta qu\'esta operación pue ser esixente cola rede.
\n
\n¿Quies siguir\?</string>
<string name="export_to">Esportar a</string>
<string name="import_from">Importar dende</string>
<string name="import_title">Importar</string>
<string name="show_original_time_ago_summary">Los testos orxinales de los servicios van amosase nos elementos de les tresmisiones</string>
<string name="show_original_time_ago_title">Amosar les marques de tiempu orixinales</string>
<string name="enable_disposed_exceptions_summary">Forcia l\'informe d\'esceiciones Rx que nun se puen entregar fuera del ciclu de vida d\'un fragmentu o actividá dempués de desanicialos</string>
<string name="enable_disposed_exceptions_title">Informar de fallos fuera de ciclu</string>
<string name="show_memory_leaks">Amosar los escapes de memoria</string>
<string name="enable_leak_canary_summary">La supervisión de los escapes de memoria pue facer que l\'aplicación nun respuenda al volquiar la pila</string>
<string name="caption_setting_description">Modifica\'l testu de los sotítulos y el so fondu. Rique\'l reaniciu de l\'aplicación pa que faiga efeutu.</string>
<string name="caption_auto_generated">Xeneróse automáticamente</string>
<string name="playlist_no_uploader">Xeneróse automáticamente (nun s\'atopó\'l xubidor)</string>
<string name="playlist_thumbnail_change_success">Camudóse la miniatura de la llista de reproducción.</string>
<string name="playlist_add_stream_success">Metióse nuna llista de reproducción</string>
<string name="playlist_creation_success">Creóse la llista de reproducción</string>
<string name="unbookmark_playlist">Desaniciar el marcador</string>
<string name="bookmark_playlist">Amestar la llista a marcadores</string>
<string name="set_as_playlist_thumbnail">Afitar como la miniatura de la llista</string>
<string name="unmute">Desactivar el soníu</string>
<string name="mute">Activar el soníu</string>
<string name="rename_playlist">Renomar</string>
<string name="delete_playlist">Desaniciar</string>
<string name="preferred_player_fetcher_notification_title">Consiguiendo la información…</string>
<string name="always_ask_open_action">Entrugar siempres</string>
<string name="popup_player">Reproductor en ventanu</string>
<string name="background_player">Reproductor en segundu planu</string>
<string name="video_player">Reproductor de videu</string>
<string name="preferred_open_action_settings_summary">L\'aición predeterminada al abrir conteníu — %s</string>
<string name="drawer_close">Zarrar el caxón</string>
<string name="drawer_open">Abrir el caxón</string>
<string name="start_here_on_main">Reproducir equí</string>
<string name="enqueued">Amestóse a la cola</string>
<string name="enqueue_stream">Amestar a la cola</string>
<string name="hold_to_append">Ten primío p\'amestar a la cola</string>
<string name="play_queue_audio_settings">Axustes del audiu</string>
<string name="play_queue_remove">Desaniciar</string>
<string name="title_activity_play_queue">Cola de reproducción</string>
<string name="most_liked">Lo que más prestó</string>
<string name="recently_added">Amestóse apocayá</string>
<string name="local">Llocal</string>
<string name="no_valid_zip_file">El ficheru ZIP nun ye válidu</string>
<string name="no_playlist_bookmarked_yet">Entá nun hai llistes en marcadores</string>
<string name="select_a_playlist">Esbilla d\'una llista de reproducción</string>
<string name="no_channel_subscribed_yet">Entá nun hai soscripciones a canales</string>
<string name="select_a_channel">Esbilla d\'una canal</string>
<string name="channel_page_summary">Páxina d\'una canal</string>
<string name="feed_page_summary">Páxina del feed</string>
<string name="subscription_page_summary">Páxina de soscripciones</string>
<string name="default_kiosk_page_summary">Quioscu predetermináu</string>
<string name="kiosk_page_summary">Páxina de quioscu</string>
<string name="title_most_played">Lo más reproducío</string>
<string name="title_last_played">Lo último reproducío</string>
<string name="delete_stream_history_prompt">¿Quies desaniciar esti elementu del historial de vídeos vistos\?</string>
<string name="item_deleted">Desanicióse l\'elementu</string>
<string name="history_cleared">Llimpióse l\'historial</string>
<string name="title_history_search">Buscóse</string>
<string name="app_license">NewPipe ye software copyleft: pues usalu, estudialu, compartilu y ameyoralu como quieras. N\'especial, pues redistribuyilu y/o modificalu baxo los términos de la GNU General Public License según espublizó la Free Software Foundation, quier la versión 3 de la llicencia quier (na to opinión) cualesquier versión posterior.</string>
<string name="privacy_policy_encouragement">El proyeutu de NewPipe toma mui en serio la privacidá. Poro, l\'aplicación nun recueye nengún datu ensin el to consentimientu.
\nLa política de privacidá de NewPipe desplica en detalle los datos que s\'unvien y atroxen cuando unvies un informe de casque.</string>
<string name="app_description">Un aplicación llibre pa ver/sentir plataformes de tresmisión n\'Android.</string>
<string name="action_open_website">Abrir el sitiu web</string>
<string name="toast_no_player">Nun hai nenguna aplicación pa reproducir esti ficheru</string>
<string name="settings_file_replacement_character_title">Caráuteres de troquéu</string>
<string name="settings_file_replacement_character_summary">Los caráuteres que nun son válidos van trocase por esti valor</string>
<string name="recaptcha_done_button">Fecho</string>
<string name="subtitle_activity_recaptcha">Primi «Fecho» al resolvelu</string>
<string name="one_item_deleted">Desanicióse 1 elementu.</string>
<string name="no_available_dir">Defini una capeta de descargues dempués, nos axustes de l\'aplicación</string>
<string name="msg_running_detail">Toca pa los detalles</string>
<string name="msg_running">Descarga de NewPipe</string>
<string name="msg_url_malform">La URL ta mal formada o internet nun ta disponible</string>
<string name="msg_server_unsupported">El sirvidor nun ta sofitáu</string>
<string name="msg_name">Nome del ficheru</string>
<string name="rename">Renomar</string>
<string name="delete_all">Desaniciar too</string>
<string name="delete_one">Desaniciar un elementu</string>
<string name="view">Reproducir</string>
<string name="pause">Posar</string>
<string name="start">Aniciar</string>
<string name="infinite_videos">Vídeos ∞</string>
<string name="more_than_100_videos">+100 vídeos</string>
<plurals name="listening">
<item quantity="one">%s oyente</item>
<item quantity="other">%s oyentes</item>
</plurals>
<string name="no_one_listening">Naide nun ta sintiendo</string>
<plurals name="watching">
<item quantity="one">%s espectador</item>
<item quantity="other">%s espectadores</item>
</plurals>
<string name="no_one_watching">Nun hai espectadores</string>
<string name="no_subscribers">Nun hai soscriptores</string>
<string name="drawer_header_description">Alternar el serviciu, esbillóse:</string>
<string name="storage_permission_denied">Concedi l\'accesu al almacenamientu primero</string>
<string name="retry">Retentar</string>
<string name="err_dir_create">Nun pue crease\'l direutoriu de descarga «%1$s»</string>
<string name="detail_drag_description">Arrastra pa reordenar</string>
<string name="user_report">Informe d\'usuariu</string>
<string name="report_error">Informar del fallu</string>
<string name="use_tor_summary">(Esperimental) Forcia\'l tráficu de les descargues pente Tor pa más privacidá (la reproducción de vídeos entá nun se sofita).</string>
<string name="detail_uploader_thumbnail_view_description">Avatar del xubidor</string>
<string name="detail_thumbnail_view_description">Reproducción d\'un videu, duración:</string>
<string name="list_thumbnail_view_description">Miniatura del videu</string>
<string name="your_comment">Un comentariu (n\'inglés):</string>
<string name="what_happened_headline">Qué pasó:</string>
<string name="error_snackbar_action">Informar</string>
<string name="error_report_open_github_notice">Comprueba si yá esiste un problema qu\'alderique esti casque, por favor. Al crear informes duplicaos faes que perdamos el tiempu que podríemos dedicar a iguar el fallu.</string>
<string name="error_report_open_issue_button_text">Informar en GitHub</string>
<string name="copy_for_github">Copiar l\'informe con formatu</string>
<string name="error_report_button_text">Informar d\'esti fallu per corréu</string>
<string name="permission_display_over_apps">Da\'l permisu p\'amosar NewPipe penriba d\'otres aplicaciones</string>
<string name="saved_tabs_invalid_json">Nun pudieron lleese les llingüetes guardaes polo que van usase les predeterminaes</string>
<string name="no_streams_available_download">Nun hai fluxos disponibles pa baxar</string>
<string name="file_name_empty_error">El nome del ficheru nun pue tar baleru</string>
<string name="invalid_source">El ficheru/orixe del conteníu nun esiste</string>
<string name="invalid_directory">La carpeta nun esiste</string>
<string name="audio_streams_empty">Nun s\'atoparon fluxos d\'audiu</string>
<string name="video_streams_empty">Nun s\'atoparon fluxos de videu</string>
<string name="player_recoverable_failure">L\'aplicación ta recuperándose d\'un fallu del reproductor</string>
<string name="app_ui_crash">L\'aplicación/IU cascó</string>
<string name="could_not_load_image">Nun pudo cargase la imaxe</string>
<string name="could_not_setup_download_menu">Nun pudo configurase\'l menú de descarga</string>
<string name="content_not_available">El conteníu nun ta disponible</string>
<string name="light_parsing_error">Nun pudo analizase dafechu\'l sitiu web</string>
<string name="network_error">Fallu de la rede</string>
<string name="download_to_sdcard_error_message">La descarga a la tarxeta SD nun ye posible. ¿Reafitar l\'allugamientu de la carpeta de descarga\?</string>
<string name="download_to_sdcard_error_title">L\'almacenamientu esternu nun ta disponible</string>
<string name="help">Ayuda</string>
<string name="search_history_deleted">Desanicióse l\'historial de busques.</string>
<string name="clear_search_history_summary">Desanicia l\'historial de les pallabres clave de busca</string>
<string name="clear_search_history_title">Llimpiar l\'historial de busca</string>
<string name="watch_history_states_deleted">Desaniciáronse los puntos de reproducción.</string>
<string name="delete_playback_states_alert">¿Desaniciar tolos puntos de reproducción\?</string>
<string name="clear_playback_states_summary">Desanicia tolos puntos de reproducción</string>
<string name="clear_playback_states_title">Desaniciar los puntos de reproducción</string>
<string name="watch_history_deleted">Desanicióse l\'historial de vídeos vistos.</string>
<string name="delete_view_history_alert">¿Desaniciar tol historial de vídeos vistos\?</string>
<string name="clear_views_history_summary">Desanicia l\'historial de fluxos reproducíos y el de puntos de reproducción</string>
<string name="clear_views_history_title">Llimpiar l\'historial de los vídeos vistos</string>
<string name="clear_cookie_summary">Llimpia les cookies que NewPipe atrroxa cuando soluciones un reCAPTCHA</string>
<string name="recaptcha_cookies_cleared">Llimpiáronse les cookies de reCAPTCHA</string>
<string name="clear_cookie_title">Llimpiar les cookies de reCAPTCHA</string>
<string name="switch_to_main">Cambiar al reproductor principal</string>
<string name="switch_to_popup">Cambiar al reproductor en ventanu</string>
<string name="switch_to_background">Cambiar al reproductor en segundu planu</string>
<string name="toggle_orientation">Alternar la orientación</string>
<string name="app_update_notification_channel_description">Anovamientos pa NewPipe</string>
<string name="app_update_notification_channel_name">Avisos d\'anovamientos</string>
<string name="notification_channel_description">Avisos de los reproductores en segundu planu y en ventanu de NewPipe</string>
<string name="just_once">Namás una vegada</string>
<string name="file_deleted">Desanicióse\'l ficheru</string>
<string name="undo">Desfacer</string>
<string name="popup_resizing_indicator_title">Redimensionáu</string>
<string name="refresh">Refrescar</string>
<string name="filter">Peñerar</string>
<string name="disabled">Desactivóse</string>
<string name="later">Dempués</string>
<string name="artists">Artistes</string>
<string name="albums">Álbumes</string>
<string name="songs">Canciones</string>
<string name="playlist">Llista de reproducción</string>
<string name="all">Too</string>
<string name="error_report_title">Informe d\'un fallu</string>
<string name="restricted_video">Tien una torga por edá.
\n
\nActiva «%1$s» nos axustes de l\'aplicación si quies velu.</string>
<string name="youtube_restricted_mode_enabled_summary">YouTube forne\'l «Mou torgáu» qu\'anubre conteníu\'l que seya potencialmente p\'adultos</string>
<string name="youtube_restricted_mode_enabled_title">Activar el «Mou torgáu» de YouTube</string>
<string name="show_age_restricted_content_summary">Amuesa\'l conteníu que quiciabes nun seya afayadizu pa guaḥes porque tien una llende d\'edá (como +18)</string>
<string name="popup_playing_append">Amestóse a la cola del reproductor en ventanu</string>
<string name="background_player_append">Amestóse a la cola del reproductor en segundu planu</string>
<string name="settings_category_notification_title">Avisu permanente</string>
<string name="settings_category_debug_title">Depuración</string>
<string name="settings_category_other_title">Miscelánea</string>
<string name="settings_category_popup_title">Ventanu</string>
<string name="peertube_instance_add_https_only">Namás se sofiten URLs HTTPS</string>
<string name="peertube_instance_add_help">Introduz la URL d\'una instancia</string>
<string name="peertube_instance_add_title">Amiestu d\'una instancia</string>
<string name="peertube_instance_url_help">Atopa les instancies que te presten en %s</string>
<string name="peertube_instance_url_summary">Esbilla les instancies de PeerTube que prefieras</string>
<string name="service_title">Serviciu</string>
<string name="unsupported_url_dialog_message">Nun pudo reconocese la URL. ¿Abrila con otra aplicación\?</string>
<string name="show_hold_to_append_summary">Amuesa\'l mensaxe al primir el nel botón «En segundu planu» o «Ventanu» nel «Details:» de los vídeos</string>
<string name="show_hold_to_append_title">Amosar el mensaxe «Ten primío p\'amestar a la cola»</string>
<string name="show_next_and_similar_title">Amosar los vídeos siguientes y asemeyaos</string>
<string name="download_dialog_title">Descarga</string>
<string name="enable_watch_history_summary">Rexistra los vídeos vistos</string>
<string name="enable_playback_state_lists_summary">Amuesa los indicadores de los puntos de reprodución nes llistes</string>
<string name="enable_playback_state_lists_title">Puntos de reproducción nes llistes</string>
<string name="enable_playback_resume_summary">Restaura l\'últimu puntu de reproducción</string>
<string name="enable_watch_history_title">Historial de vídeos vistos</string>
<string name="auto_queue_toggle">Cola automática</string>
<string name="auto_queue_summary">Amiesta un videu rellacionáu a la cola cuando se repoduz l\'últimu videu a una cola ensin repitición</string>
<string name="auto_queue_title">Meter les tresmisiones siguientes a cola automática</string>
<string name="clear_queue_confirmation_description">Va trocase la cola del reproductor activu</string>
<string name="clear_queue_confirmation_summary">Cambiar d\'un reproductor a otru pue trocar la cola</string>
<string name="clear_queue_confirmation_title">Confirmar la llimpieza de les coles</string>
<string name="seek_duration_title">Duración de la gueta del avance/rebobináu rápidu</string>
<string name="use_inexact_seek_summary">La gueta imprecisa permite al reproductor que guete les posiciones más rápido con menos precisión. La gueta de 5, 15 ó 25 segundos nun funciona con esti axuste.</string>
<string name="use_inexact_seek_title">Usar la gueta rápida imprecisa</string>
<string name="popup_remember_size_pos_summary">Acuérdase del últimu tamañu y la última posición del ventanu</string>
<string name="popup_remember_size_pos_title">Acordase de les propiedaes del ventanu</string>
<string name="notification_colorize_summary">Fai qu\'Android personalice\'l color del avisu permanente según el color principal de les miniatures (decátate qu\'esto nun ta disponible en tolos preseos)</string>
<string name="notification_colorize_title">Avisu con color</string>
<string name="notification_action_nothing">Nada</string>
<string name="notification_action_buffering">Atroxar nel búfer</string>
<string name="notification_action_shuffle">Al debalu</string>
<string name="notification_action_repeat">Repitir</string>
<string name="notification_actions_at_most_three">¡Pues esbillar tres aiciones como máximu p\'amosar nel avisu permanente!</string>
<string name="notification_actions_summary">Edita cada aición d\'embaxo tocando nelles. Esbilla hasta tres p\'amosales nel avisu compautu col usu de los caxellos de la derercha.</string>
<string name="notification_action_4_title">Quintu botón d\'aición</string>
<string name="notification_action_3_title">Cuartu botón d\'aición</string>
<string name="notification_action_2_title">Tercer botón d\'aición</string>
<string name="notification_action_1_title">Segundu botón d\'aición</string>
<string name="notification_action_0_title">Primer botón d\'aición</string>
<string name="notification_scale_to_square_image_summary">Escala les miniatures de los vídeos que s\'amuesen nel avisu permanente de los 16:9 al 1:1 (podría distorsionar les imáxenes)</string>
<string name="notification_scale_to_square_image_title">Afitar la escala 1:1 a les miniatures</string>
<string name="autoplay_by_calling_app_title">Reproducción automática</string>
<string name="download_choose_new_path">Camuda les carpetes de descarga pa que faiga efeutu</string>
<string name="download_path_audio_dialog_title">Escueyi la carpeta de descarga pa los ficheros d\'audiu</string>
<string name="download_path_audio_summary">Los ficheros d\'audiu baxaos atróxense equí</string>
<string name="download_path_audio_title">Carpeta de la descarga d\'audiu</string>
<string name="download_path_dialog_title">Escueyi la carpeta de descarga pa los ficheros de videu</string>
<string name="download_path_summary">Los ficheros de videu baxaos atróxense equí</string>
<string name="download_path_title">Carpeta de la descarga de vídeos</string>
<string name="controls_add_to_playlist_title">Meter nuna llista</string>
<string name="tab_main">Principal</string>
<string name="subscription_change_failed">Nun pudo camudar la soscripción</string>
<string name="channel_unsubscribed">Esborriéstite de la canal</string>
<string name="popup_mode_share_menu_title">Mou ventanu</string>
<string name="screen_rotation">voltéu</string>
<string name="choose_browser">Escoyer un restolador</string>
<string name="search_showing_result_for">Amosando los resultaos de: %s</string>
<string name="controls_download_desc">Baxar el ficheru de fluxos</string>
<string name="download">Baxar</string>
<string name="open_in_popup_mode">Abrir nel mou ventanu</string>
<string name="install">Instalar</string>
<string name="no_player_found">Nun s\'atopó nengún reproductor de fluxos. ¿Instalar VLC\?</string>
<string name="main_bg_subtitle">Toca «Buscar» pa entamar
\n</string>
</resources>

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,102 +305,103 @@
<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="export_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>
<string name="no_valid_zip_file">没有有效的ZIP文件</string>
<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>
<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. 打开这个网页:%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. 打开该网站: %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>
@@ -255,7 +256,7 @@
<string name="toast_no_player">Прыкладанне для прайгравання гэтага файла не ўстаноўлена</string>
<string name="title_activity_about">Аб NewPipe</string>
<string name="action_settings">Налады</string>
<string name="action_about">Аб дадатку</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="error_unable_to_load_license">Не атрымалася загрузіць ліцэнзію</string>
@@ -314,7 +315,7 @@
<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="start_here_on_main">Пачаць адсюль у плэеры</string>
<string name="start_here_on_background">Пачаць адсюль у фоне</string>
<string name="start_here_on_popup">Пачаць адсюль у акне</string>
@@ -402,7 +403,7 @@
<string name="volume_gesture_control_summary">Мяняць гучнасць плэера жэстам</string>
<string name="brightness_gesture_control_title">Жэст яркасці</string>
<string name="brightness_gesture_control_summary">Мяняць яркасць плэера жэстам</string>
<string name="settings_category_updates_title">Абнаўлення</string>
<string name="settings_category_updates_title">Абнаўленні</string>
<string name="file_deleted">Файл выдалены</string>
<string name="app_update_notification_channel_name">Апавяшчэнне аб абнаўленні</string>
<string name="app_update_notification_channel_description">Апавяшчэння аб новай версіі NewPipe</string>
@@ -476,7 +477,7 @@
<string name="error_insufficient_storage">Скончылася вольнае месца на прыладзе</string>
<string name="error_progress_lost">Прагрэс страчаны, так як файл быў выдалены</string>
<string name="error_timeout">Час злучэння выйшла</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>
@@ -492,8 +493,8 @@
<string name="clear_playback_states_summary">Выдаліць ўсе пазіцыі прайгравання</string>
<string name="youtube_restricted_mode_enabled_title">Абмежаваны рэжым YouTube</string>
<string name="peertube_instance_add_https_only">Падтрымліваюцца толькі адрасы URL HTTPS</string>
<string name="peertube_instance_add_title">Дадаць інстанцыю</string>
<string name="peertube_instance_url_title">Інстанцыі PeerTube</string>
<string name="peertube_instance_add_title">Дадаць экзэмпляр</string>
<string name="peertube_instance_url_title">Экзэмпляры PeerTube</string>
<string name="download_choose_new_path">Змяніце папкі загрузкі, каб змены ўступілі ў сілу</string>
<string name="search_showing_result_for">Вынікі для: %s</string>
<string name="notification_scale_to_square_image_title">Мініяцюра відэа ў 1:1</string>
@@ -502,4 +503,61 @@
<string name="notification_action_2_title">Кнопка трэцяга дзеяння</string>
<string name="notification_action_1_title">Кнопка другога дзеяння</string>
<string name="notification_action_0_title">Кнопка першага дзеяння</string>
<string name="feed_groups_header_title">Групы каналаў</string>
<string name="systems_language">Як у сістэме</string>
<string name="app_language_title">Мова прылады</string>
<string name="choose_instance_prompt">Выберыце экзэмпляр</string>
<string name="deleted_downloads">Выдалена %1$d загрузак</string>
<string name="delete_downloaded_files">Выдаліць загружаныя файлы</string>
<string name="show_original_time_ago_summary">Арыгінальныя тэксты з сэрвісаў будуць бачны ў ленце элементаў</string>
<string name="clear_cookie_summary">Ачысціце cookie, якія NewPipe захоўвае пры рашэнні reCAPTCHA</string>
<string name="peertube_instance_add_exists">Экзэмпляр ужо існуе</string>
<string name="peertube_instance_add_fail">Немагчыма праверыць экзэмпляр</string>
<string name="peertube_instance_add_help">Увесці URL экзэмпляра</string>
<string name="peertube_instance_url_summary">Абярыце любімыя экзэмпляры PeerTube</string>
<string name="clear_queue_confirmation_description">Актыўны плэер быў зменены</string>
<string name="clear_queue_confirmation_summary">Змена плэера можа замяніць вашу чаргу</string>
<string name="clear_queue_confirmation_title">Запытаць, перш чым ачысціць чаргу</string>
<string name="never">Ніколі</string>
<string name="wifi_only">Толькі па Wi-Fi</string>
<string name="show_original_time_ago_title">Паказаць арыгінальны час на элементах</string>
<string name="unmute">Уключыць гук</string>
<string name="mute">Цішына</string>
<string name="enqueue_stream">Дадаць у чаргу</string>
<string name="enqueued">Даданае у чаргу</string>
<string name="title_activity_play_queue">Чарга прайгравання</string>
<string name="most_liked">Найбольш папулярнае</string>
<string name="local">Лакальнае</string>
<string name="recently_added">Нядаўна дададзенае</string>
<string name="no_playlist_bookmarked_yet">Няма закладак у плейлісце</string>
<string name="select_a_playlist">Абярыце плэйліст</string>
<string name="default_kiosk_page_summary">Кіёск па змаўчанні</string>
<string name="recaptcha_done_button">Так</string>
<string name="subtitle_activity_recaptcha">Націсніце \"Так\" калі вырашана</string>
<string name="infinite_videos">∞ відэа</string>
<string name="more_than_100_videos">100+ відэа</string>
<string name="error_report_open_issue_button_text">Багрэпарт на GitHub</string>
<string name="copy_for_github">Скапіруйце адфарматаваны багрэпарт</string>
<string name="permission_display_over_apps">Дайце дазвол на адлюстраванне паверх іншых праграм</string>
<string name="help">Дапамога</string>
<string name="delete_playback_states_alert">Выдаліць усе пазіцыі прайгравання\?</string>
<string name="clear_playback_states_title">Выдаліць пазіцыі прайгравання</string>
<string name="clear_cookie_title">Ачысціць reCAPTCHA cookies</string>
<string name="recaptcha_cookies_cleared">reCAPTCHA cookies былі ачышчаны</string>
<string name="artists">Выканаўцы</string>
<string name="albums">Альбомы</string>
<string name="songs">Песні</string>
<string name="videos_string">Відэа</string>
<string name="auto_queue_toggle">Аўтаматычная чарга</string>
<string name="seek_duration_title">Працягласць перамоткі ўперад/назад</string>
<string name="notification_colorize_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_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

@@ -258,8 +258,8 @@
<string name="just_once">Pouze jednou</string>
<string name="import_data_title">Importovat databázi</string>
<string name="export_data_title">Exportovat databázi</string>
<string name="import_data_summary">Přepíše vaši dosavadní historii a odběry</string>
<string name="export_data_summary">Exportuje historii, odběry a playlisty</string>
<string name="import_data_summary">Přepíše Vaši dosavadní historii, odběry, playlisty a (volitelně) nastavení</string>
<string name="export_data_summary">Exportuje historii, odběry, playlisty a nastavení</string>
<string name="external_player_unsupported_link_type">Externí přehrávače nepodporují tyto druhy odkazů</string>
<string name="invalid_url_toast">Neplatná URL</string>
<string name="video_streams_empty">Nenalezeny žádné video streamy</string>
@@ -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>
@@ -132,7 +132,7 @@
<string name="use_external_video_player_summary">Entfernt Tonspur bei manchen Auflösungen</string>
<string name="popup_remember_size_pos_summary">Letzte Größe und Position des Pop-ups merken</string>
<string name="player_gesture_controls_title">Gestensteuerung</string>
<string name="player_gesture_controls_summary">Helligkeit und Lautstärke mittels Gesten einstellen</string>
<string name="player_gesture_controls_summary">Gesten verwenden, um die Helligkeit und Lautstärke einzustellen</string>
<string name="show_search_suggestions_title">Suchvorschläge</string>
<string name="show_search_suggestions_summary">Beim Suchen Vorschläge anzeigen</string>
<string name="settings_category_popup_title">Pop-up</string>
@@ -266,8 +266,8 @@
<string name="preferred_player_fetcher_notification_message">Gewünschten Inhalt laden</string>
<string name="import_data_title">Datenbank importieren</string>
<string name="export_data_title">Datenbank exportieren</string>
<string name="import_data_summary">Überschreibt deinen aktuellen Verlauf und deine Abonnements</string>
<string name="export_data_summary">Verlauf, Abonnements und Wiedergabelisten exportieren</string>
<string name="import_data_summary">Überschreibt deinen aktuellen Verlauf, Abonnements, Wiedergabelisten und (optionale) Einstellungen</string>
<string name="export_data_summary">Export von Verlauf, Abonnements, Wiedergabelisten und Einstellungen</string>
<string name="no_valid_zip_file">Keine gültige ZIP-Datei</string>
<string name="could_not_import_all_files">Warnung: Nicht alle Dateien konnten importiert werden.</string>
<string name="override_current_data">Dies wird deine aktuellen Einstellungen überschreiben.</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>
@@ -402,9 +402,9 @@
<string name="tab_new">Neuer Tab</string>
<string name="tab_choose">Tab wählen</string>
<string name="volume_gesture_control_title">Gestensteuerung für Lautstärke</string>
<string name="volume_gesture_control_summary">Verwende Gesten um die Abspielerlautstärke einzustellen</string>
<string name="volume_gesture_control_summary">Gesten verwenden, um die Lautstärke einzustellen</string>
<string name="brightness_gesture_control_title">Gestensteuerung für Helligkeit</string>
<string name="brightness_gesture_control_summary">Player-Helligkeit über Gesten steuern</string>
<string name="brightness_gesture_control_summary">Gesten verwenden, um die Helligkeit einzustellen</string>
<string name="settings_category_updates_title">Aktualisierungen</string>
<string name="file_deleted">Datei gelöscht</string>
<string name="app_update_notification_channel_name">App-Update-Benachrichtigung</string>
@@ -636,17 +636,20 @@
<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>
<string name="clear_cookie_summary">Lösche Cookies, die NewPipe speichert, wenn du ein reCAPTCHA löst</string>
<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 Inhalt, der möglicherweise unpassend für Kinder ist, da er eine Altersbeschränkung (wie z.B. 18+) hat</string>
<string name="enqueue_stream">Wiedergabe einreihen</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">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

@@ -265,8 +265,8 @@
<string name="preferred_player_fetcher_notification_message">Cargando contenido solicitado</string>
<string name="import_data_title">Importar base de datos</string>
<string name="export_data_title">Exportar base de datos</string>
<string name="import_data_summary">Anula su historial actual y suscripciones</string>
<string name="export_data_summary">Exportar historial, suscripciones y listas de reproducción</string>
<string name="import_data_summary">Anula su historial actual, suscripciones, listas de reproducción y (opcionalmente) ajustes</string>
<string name="export_data_summary">Exportar historial, suscripciones, listas de reproducción y ajustes</string>
<string name="export_complete_toast">Exportado</string>
<string name="import_complete_toast">Importado</string>
<string name="no_valid_zip_file">Archivo ZIP no válido</string>
@@ -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

@@ -263,8 +263,8 @@
<string name="preferred_player_fetcher_notification_message">Chargement du contenu demandé</string>
<string name="import_data_title">Importer la base de données</string>
<string name="export_data_title">Exporter la base de données</string>
<string name="import_data_summary">Remplace votre historique et vos abonnements actuels</string>
<string name="export_data_summary">Exporte lhistorique, les abonnements et les listes de lecture</string>
<string name="import_data_summary">Remplace votre historique, vos abonnements, vos listes de lecture et (en option) vos paramètres</string>
<string name="export_data_summary">Exporte lhistorique, les abonnements, les listes de lecture et les paramètres</string>
<string name="export_complete_toast">Exporté</string>
<string name="import_complete_toast">Importé</string>
<string name="no_valid_zip_file">Fichier ZIP non valide</string>
@@ -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

@@ -268,7 +268,7 @@
<string name="thumbnail_cache_wipe_complete_notice">תמונות מטמון נמחקו</string>
<string name="metadata_cache_wipe_title">ניקוי מטמון נתוני העל</string>
<string name="metadata_cache_wipe_complete_notice">מטמון נתוני העל התרוקן</string>
<string name="export_data_summary">ייצוא היסטוריה, מינויים ורשימות נגינה</string>
<string name="export_data_summary">ייצוא היסטוריה, מינויים, רשימות נגינה והגדרות</string>
<string name="clear_views_history_title">מחיקת היסטוריית הצפייה</string>
<string name="watch_history_deleted">היסטוריית הצפייה נמחקה.</string>
<string name="clear_search_history_title">מחיקת היסטוריית החיפוש</string>
@@ -336,7 +336,7 @@
<string name="auto_queue_summary">להמשיך תור נגינה סופית (בלתי מחזורית) על ידי הוספת תזרים קשור</string>
<string name="toggle_orientation">החלפת כיווניות</string>
<string name="switch_to_main">העברה לראשי</string>
<string name="import_data_summary">משכתב את ההיסטוריה והמינויים הנוכחיים שלך</string>
<string name="import_data_summary">משכתב את ההיסטוריה, המינויים ו(אולי גם) את ההגדרות הנוכחיים שלך</string>
<string name="clear_views_history_summary">מחיקת היסטוריית התזרימים שהתנגנו ומיקומי הנגינה</string>
<string name="channels">ערוצים</string>
<string name="playlists">רשימות נגינה</string>
@@ -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>
@@ -290,15 +290,15 @@
<string name="switch_to_main">Prijeđi na glavni</string>
<string name="import_data_title">Uvoz baze podataka</string>
<string name="export_data_title">Izvoz baze podataka</string>
<string name="import_data_summary">Poništava vašu trenutnu povijest i pretplate</string>
<string name="export_data_summary">Izvezi povijest, pretplate i playliste</string>
<string name="clear_views_history_title">Očisti povijest gledanja</string>
<string name="import_data_summary">Poništava vašu trenutnu povijest, pretplate, playliste i (opcionalno) postavke</string>
<string name="export_data_summary">Izvezi povijest, pretplate, playliste i postavke</string>
<string name="clear_views_history_title">Izbriši povijest gledanja</string>
<string name="clear_views_history_summary">Briše povijest reproduciranih streamova i pozicije reprodukcije</string>
<string name="delete_view_history_alert">Obriši cijelu povijest gledanja\?</string>
<string name="watch_history_deleted">Povijest gledanja izbrisana.</string>
<string name="clear_search_history_title">Obriši povijest pretraživanja</string>
<string name="delete_search_history_alert">Obriši cijelu povijest pretraživanja\?</string>
<string name="search_history_deleted">Povijest pretraživanja obrisana.</string>
<string name="delete_view_history_alert">Izbrisati cijelu povijest gledanja\?</string>
<string name="watch_history_deleted">Povijest gledanja je izbrisana.</string>
<string name="clear_search_history_title">Izbriši povijest pretraživanja</string>
<string name="delete_search_history_alert">Izbrisati cijelu povijest pretraživanja\?</string>
<string name="search_history_deleted">Povijest pretraživanja je izbrisana.</string>
<string name="invalid_url_toast">Neispravan URL</string>
<string name="invalid_directory">Nema takve mape</string>
<string name="file_name_empty_error">Naziv datoteke ne može biti prazan</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:
\n
\n1. Idite na ovaj URL: %1$s
\n2. Ulogirajte se
\n3. Preuzimanje bi trebalo početi (to je izvozna datoteka)</string>
<string name="import_youtube_instructions">Uvezite YouTube pretplatnike preuzimanjem izvozne datoteke Google-a:
\n
\n1. Idite na ovaj URL: %1$s
\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
@@ -477,9 +480,9 @@
<string name="start_downloads">Započni preuzimanja</string>
<string name="pause_downloads">Zaustavi preuzimanja</string>
<string name="downloads_storage_ask_title">Pitaj gdje preuzeti</string>
<string name="clear_playback_states_title">Obriši poziciju reprodukcije</string>
<string name="clear_playback_states_summary">Obriši sve pozicije reprodukcije</string>
<string name="delete_playback_states_alert">Obriši sve pozicije reprodukcije\?</string>
<string name="clear_playback_states_title">Izbriši poziciju reprodukcije</string>
<string name="clear_playback_states_summary">Izbriši sve pozicije reprodukcije</string>
<string name="delete_playback_states_alert">Izbrisati sve pozicije reprodukcije\?</string>
<string name="no_one_watching">Nitko ne gleda</string>
<string name="no_one_listening">Nitko ne sluša</string>
<string name="localization_changes_requires_app_restart">Jezik će se promjeniti nakon ponovnog pokretanja aplikacije.</string>
@@ -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>
@@ -641,4 +644,22 @@
<string name="show_thumbnail_summary">Prikaži minijaturu kao pozadinu pri zaključanom ekranu i unutar obavijesti</string>
<string name="show_thumbnail_title">Prikaži minijaturu</string>
<string name="show_original_time_ago_title">Prikaži izvorno vrijeme elemenata</string>
<string name="downloads_storage_use_saf_summary">„Okvir za pristup spremištu” omogućuje preuzimanje na SD karticu.
\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

@@ -459,4 +459,8 @@
<string name="clear_playback_states_title">Lejátszási pozíciók törlése</string>
<string name="search_showing_result_for">Találatok a következőre: %s</string>
<string name="notification_scale_to_square_image_title">Bélyegkép méretezése 1:1 arányra</string>
<string name="notification_colorize_title">Értesítés színezése</string>
<string name="notification_action_nothing">Semmi</string>
<string name="notification_action_shuffle">Keverés</string>
<string name="notification_action_repeat">Ismétlés</string>
</resources>

View File

@@ -206,8 +206,8 @@
<string name="switch_to_main">Alihkan ke Utama</string>
<string name="import_data_title">Impor basis data</string>
<string name="export_data_title">Ekspor basis data</string>
<string name="import_data_summary">Timpa riwayat dan langganan anda saat ini</string>
<string name="export_data_summary">Ekspor riwayat, langganan dan daftar putar</string>
<string name="import_data_summary">Timpa riwayat, langganan, daftar putar dan (opsional) pengaturan anda saat ini</string>
<string name="export_data_summary">Ekspor riwayat, langganan, daftar putar dan pengaturan</string>
<string name="player_stream_failure">Tidak bisa memutar stream ini</string>
<string name="player_unrecoverable_failure">Telah terjadi galat pemutar yang tidak bisa dipulihkan</string>
<string name="player_recoverable_failure">Memulihkan dari galat pemutar</string>
@@ -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

@@ -5,25 +5,25 @@
<string name="no_player_found">Nessun lettore multimediale trovato. Installare VLC\?</string>
<string name="install">Installa</string>
<string name="cancel">Annulla</string>
<string name="open_in_browser">Apri nel Browser</string>
<string name="open_in_browser">Apri nel browser</string>
<string name="share">Condividi</string>
<string name="download">Scarica</string>
<string name="search">Cerca</string>
<string name="settings">Impostazioni</string>
<string name="did_you_mean">Forse cercavi \"%1$s\"\?</string>
<string name="share_dialog_title">Condividi con</string>
<string name="choose_browser">Scegli Browser</string>
<string name="choose_browser">Scegli browser</string>
<string name="screen_rotation">rotazione</string>
<string name="download_path_title">Cartella Video Scaricati</string>
<string name="download_path_title">Cartella video scaricati</string>
<string name="download_path_summary">I video scaricati saranno salvati qui</string>
<string name="download_path_dialog_title">Scegli la cartella per i video scaricati</string>
<string name="default_resolution_title">Risoluzione Predefinita</string>
<string name="default_resolution_title">Risoluzione predefinita</string>
<string name="play_with_kodi_title">Riproduci con Kodi</string>
<string name="kore_not_found">Installare l\'app Kore\?</string>
<string name="show_play_with_kodi_title">Mostra \"Riproduci con Kodi\"</string>
<string name="show_play_with_kodi_summary">Mostra l\'opzione per riprodurre video tramite Kodi</string>
<string name="play_audio">Audio</string>
<string name="default_audio_format_title">Formato Audio Predefinito</string>
<string name="default_audio_format_title">Formato audio predefinito</string>
<string name="download_dialog_title">Scarica</string>
<string name="show_next_and_similar_title">Mostra video \"Prossimo\" e \"Simili\"</string>
<string name="unsupported_url">URL non supportato</string>
@@ -36,9 +36,9 @@
<string name="detail_likes_img_view_description">Mi piace</string>
<string name="err_dir_create">Impossibile creare la cartella di download \'%1$s\'</string>
<string name="info_dir_created">Creata la cartella per i download \'%1$s\'</string>
<string name="use_external_video_player_title">Usa Lettore Video Esterno</string>
<string name="use_external_audio_player_title">Usa Lettore Audio Esterno</string>
<string name="download_path_audio_title">Cartella Audio Scaricati</string>
<string name="use_external_video_player_title">Usa lettore video esterno</string>
<string name="use_external_audio_player_title">Usa lettore audio esterno</string>
<string name="download_path_audio_title">Cartella audio scaricati</string>
<string name="download_path_audio_summary">Gli audio scaricati saranno salvati qui</string>
<string name="download_path_audio_dialog_title">Scegli la cartella per gli audio scaricati</string>
<string name="theme_title">Tema</string>
@@ -61,7 +61,7 @@
<string name="show_age_restricted_content_title">Mostra contenuti con restrizioni di età</string>
<string name="main_bg_subtitle">Tocca \"Cerca\" per iniziare
\n</string>
<string name="autoplay_by_calling_app_title">Riproduzione Automatica</string>
<string name="autoplay_by_calling_app_title">Riproduzione automatica</string>
<string name="autoplay_by_calling_app_summary">Riproduci i video quando NewPipe viene aperto da un\'altra app</string>
<string name="duration_live">In diretta</string>
<string name="light_parsing_error">Impossibile analizzare completamente il sito web</string>
@@ -114,22 +114,22 @@
<string name="recaptcha_request_toast">È richiesta la risoluzione del reCAPTCHA</string>
<string name="yes"></string>
<string name="later">Più tardi</string>
<string name="open_in_popup_mode">Apri in Modalità Popup</string>
<string name="popup_mode_share_menu_title">Modalità Popup</string>
<string name="open_in_popup_mode">Apri in modalità popup</string>
<string name="popup_mode_share_menu_title">Modalità popup</string>
<string name="popup_playing_toast">Riproduzione in modalità popup</string>
<string name="disabled">Disattivato</string>
<string name="use_external_video_player_summary">Audio non disponibile per alcune risoluzioni</string>
<string name="controls_background_title">In Sottofondo</string>
<string name="controls_background_title">In sottofondo</string>
<string name="controls_popup_title">Popup</string>
<string name="default_popup_resolution_title">Risoluzione Predefinita Lettore Popup</string>
<string name="show_higher_resolutions_title">Mostra Altre Risoluzioni</string>
<string name="default_popup_resolution_title">Risoluzione predefinita lettore popup</string>
<string name="show_higher_resolutions_title">Mostra altre risoluzioni</string>
<string name="show_higher_resolutions_summary">Solo alcuni dispositivi possono riprodurre video 2K/4K</string>
<string name="default_video_format_title">Formato Video Predefinito</string>
<string name="default_video_format_title">Formato video predefinito</string>
<string name="popup_remember_size_pos_title">Ricorda proprietà lettore popup</string>
<string name="popup_remember_size_pos_summary">Ricorda dimensione e posizione della finestra Popup</string>
<string name="player_gesture_controls_title">Controllo Gesti Lettore Multimediale</string>
<string name="popup_remember_size_pos_summary">Ricorda dimensione e posizione del lettore popup</string>
<string name="player_gesture_controls_title">Controllo gesti lettore multimediale</string>
<string name="player_gesture_controls_summary">Usa i gesti per controllare luminosità e volume del lettore multimediale</string>
<string name="show_search_suggestions_title">Suggerimenti di Ricerca</string>
<string name="show_search_suggestions_title">Suggerimenti di ricerca</string>
<string name="show_search_suggestions_summary">Mostra suggerimenti durante la ricerca</string>
<string name="settings_category_popup_title">Popup</string>
<string name="filter">Filtra i risultati</string>
@@ -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>
@@ -264,16 +264,16 @@
<string name="preferred_player_fetcher_notification_message">Caricamento del contenuto richiesto</string>
<string name="import_data_title">Importa database</string>
<string name="export_data_title">Esporta database</string>
<string name="import_data_summary">Sovrascrive la cronologia e le iscrizioni attuali</string>
<string name="export_data_summary">Esporta la cronologia, le iscrizioni e le playlist</string>
<string name="import_data_summary">Sovrascrive la cronologia, le iscrizioni, le playlist e (facoltativamente) le impostazioni correnti</string>
<string name="export_data_summary">Esporta cronologia, iscrizioni, playlist e impostazioni</string>
<string name="export_complete_toast">Esportazione completa</string>
<string name="import_complete_toast">Importazione completa</string>
<string name="no_valid_zip_file">Nessun file ZIP valido</string>
<string name="could_not_import_all_files">Attenzione: Impossibile importare tutti i file.</string>
<string name="override_current_data">Questa operazione sostituirà le tue impostazioni attuali.</string>
<string name="controls_download_desc">Scarica il video</string>
<string name="show_info">Mostra Informazioni</string>
<string name="tab_bookmarks">Playlist Salvate</string>
<string name="show_info">Mostra informazioni</string>
<string name="tab_bookmarks">Playlist salvate</string>
<string name="controls_add_to_playlist_title">Aggiungi a</string>
<string name="detail_drag_description">Trascina per riordinare</string>
<string name="create">Crea</string>
@@ -309,7 +309,7 @@
<string name="enable_leak_canary_summary">Il monitoraggio di memory leak potrebbe causare la mancata risposta dell\'applicazione durante il dumping dell\'heap</string>
<string name="enable_disposed_exceptions_title">Segnala errori «fuori del ciclo di vita»</string>
<string name="enable_disposed_exceptions_summary">Forza la segnalazione di eccezioni Rx non consegnabili al di fuori del ciclo di vita dell\'attività dopo la chiusura</string>
<string name="use_inexact_seek_title">Usa Ricerca Rapida (Imprecisa)</string>
<string name="use_inexact_seek_title">Usa ricerca rapida (imprecisa)</string>
<string name="use_inexact_seek_summary">Consente al lettore multimediale di spostarsi più velocemente, ma con precisione ridotta. Spostamenti di 5, 15 o 25 secondi non funzionano con questo.</string>
<string name="auto_queue_title">Accoda automaticamente l\'elemento successivo</string>
<string name="auto_queue_summary">Accoda un contenuto consigliato al termine della riproduzione, in una coda non ripetitiva</string>
@@ -347,10 +347,10 @@
<string name="import_network_expensive_warning">Tieni presente che questa operazione può consumare una grande quantità di traffico dati.
\n
\nVuoi continuare?</string>
<string name="download_thumbnail_title">Carica Copertine</string>
<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,9 +399,9 @@
<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_title">Gesti controllo luminosità</string>
<string name="brightness_gesture_control_summary">Utilizza i gesti per controllare la luminosità del lettore multimediale</string>
<string name="settings_category_updates_title">Aggiornamenti</string>
<string name="file_deleted">File eliminato</string>
@@ -458,7 +458,7 @@
<string name="events">Eventi</string>
<string name="conferences">Conferenze</string>
<string name="error_timeout">Tempo per la connessione esaurito</string>
<string name="show_comments_title">Mostra Commenti</string>
<string name="show_comments_title">Mostra commenti</string>
<string name="show_comments_summary">Disattiva per nascondere i commenti</string>
<string name="autoplay_title">Riproduzione automatica</string>
<string name="no_comments">Nessun commento</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>
@@ -506,7 +506,7 @@
</plurals>
<string name="localization_changes_requires_app_restart">La lingua verrà cambiata al riavvio dell\'applicazione.</string>
<string name="default_kiosk_page_summary">Contenuti in evidenza predefiniti</string>
<string name="seek_duration_title">Durata Avanzamento e Riavvolgimento Rapidi</string>
<string name="seek_duration_title">Durata avanzamento e riavvolgimento rapidi</string>
<string name="peertube_instance_url_title">Istanze PeerTube</string>
<string name="peertube_instance_url_summary">Seleziona le istanze PeerTube preferite</string>
<string name="peertube_instance_url_help">Trova altre istanze su %s</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>
@@ -619,7 +619,7 @@
<string name="wifi_only">Solo Wi-Fi</string>
<string name="autoplay_summary">Avvia la riproduzione automaticamente — %s</string>
<string name="unsupported_url_dialog_message">URL non riconosciuto. Vuoi aprirlo con un\'altra app\?</string>
<string name="auto_queue_toggle">Accoda Automaticamente</string>
<string name="auto_queue_toggle">Accoda automaticamente</string>
<string name="clear_queue_confirmation_description">La coda del lettore attivo sarà sostituita</string>
<string name="clear_queue_confirmation_title">Chiedi prima di svuotare la coda</string>
<string name="clear_queue_confirmation_summary">Cambiare tipo di riproduzione potrebbe sostituire gli elementi in coda</string>
@@ -635,18 +635,21 @@
<string name="settings_category_notification_title">Notifica</string>
<string name="notification_action_nothing">Niente</string>
<string name="notification_action_repeat">Ripeti</string>
<string name="notification_scale_to_square_image_title">Ridimensiona Copertina alla Proporzione 1:1</string>
<string name="notification_scale_to_square_image_title">Ridimensiona copertina alla proporzione 1:1</string>
<string name="notification_scale_to_square_image_summary">Modifica la proporzione della copertina del video mostrata nella notifica da 16:9 a 1:1 (può introdurre distorsioni)</string>
<string name="show_memory_leaks">Mostra memory leak</string>
<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="notification_colorize_title">Colora notifica</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

@@ -93,7 +93,7 @@
<string name="msg_server_unsupported">このサーバーには対応していません</string>
<string name="msg_exists">ファイルが既に存在します</string>
<string name="msg_url_malform">URL の形式が正しくないか、通信が利用できません</string>
<string name="msg_running">NewPipeで保存</string>
<string name="msg_running">NewPipe ダウンロード</string>
<string name="msg_running_detail">タップして詳細を表示</string>
<string name="msg_wait">お待ちください…</string>
<string name="msg_copied">クリップボードにコピーしました</string>
@@ -176,7 +176,7 @@
<string name="playlist">プレイリスト</string>
<string name="undo">元に戻す</string>
<string name="play_all">すべて再生</string>
<string name="notification_channel_name">NewPipeの通知</string>
<string name="notification_channel_name">NewPipe の通知</string>
<string name="unknown_content">[不明]</string>
<string name="player_stream_failure">動画の再生ができませんでした</string>
<string name="player_unrecoverable_failure">回復不能な再生エラーが発生しました</string>
@@ -228,8 +228,8 @@
<string name="just_once">一度だけ</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="player_recoverable_failure">再生エラーからの回復中</string>
<string name="external_player_unsupported_link_type">外部プレイヤーは、これらのタイプのリンクをサポートしていません</string>
<string name="invalid_url_toast">無効なURL</string>
@@ -324,11 +324,11 @@
<string name="delete_search_history_alert">すべての検索履歴を削除しますか?</string>
<string name="invalid_source">このファイル/コンテンツはありません</string>
<plurals name="subscribers">
<item quantity="other">%s人が登録しています</item>
<item quantity="other">チャンネル登録者数 %s人</item>
</plurals>
<string name="no_views">再生なし</string>
<plurals name="views">
<item quantity="other">再生回数 %s再生</item>
<item quantity="other">再生回数 %s</item>
</plurals>
<string name="one_item_deleted">1 つのアイテムが削除されました。</string>
<string name="give_back">支援する</string>
@@ -341,7 +341,7 @@
<string name="controls_add_to_playlist_title">プレイリスト</string>
<string name="show_hold_to_append_title">「長押しして追加」のヒントを表示</string>
<string name="tracks">トラック</string>
<string name="notification_channel_description">NewPipeのバックグラウンドおよびポップアッププレイヤーの通知</string>
<string name="notification_channel_description">NewPipe のバックグラウンドおよびポップアッププレイヤーの通知</string>
<string name="new_and_hot">新着と人気</string>
<string name="hold_to_append">長押ししてキューに追加</string>
<string name="start_here_on_popup">ポップアップで連続再生を開始</string>
@@ -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

@@ -550,4 +550,32 @@
<string name="search_showing_result_for">%s에 대한 검색 결과</string>
<string name="notification_action_shuffle">셔플</string>
<string name="notification_action_repeat">연속 재생</string>
<string name="playlist_page_summary">재생목록 페이지</string>
<string name="show_thumbnail_title">썸네일 보기</string>
<string name="feed_group_dialog_empty_name">그룹 이름이 없음</string>
<plurals name="days">
<item quantity="other">%d 일</item>
</plurals>
<plurals name="hours">
<item quantity="other">%d 시간</item>
</plurals>
<plurals name="minutes">
<item quantity="other">%d 분</item>
</plurals>
<plurals name="seconds">
<item quantity="other">%d 초</item>
</plurals>
<string name="remove_watched_popup_title">시청 기록을 지우겠습니까\?</string>
<string name="remove_watched">시청 기록 지우기</string>
<string name="title_activity_play_queue">재생목록 실행</string>
<string name="settings_category_notification_title">알림</string>
<string name="unsupported_url_dialog_message">URL을 인식할 수 없습니다. 다른 앱으로 여시겠습니까\?</string>
<string name="clear_queue_confirmation_title">스트림을 비우기 전 확인을 요청합니다.</string>
<string name="notification_colorize_summary">안드로이드에서 썸네일의 색상에 따라 알림 색상을 조절합니다. (지원되지 않는 기기가 있을 수 있습니다.)</string>
<string name="notification_action_buffering">버퍼링</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="permission_display_over_apps">다른 앱 위에 표시되는 권한 부여</string>
</resources>

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="main_bg_subtitle">Tekan carian untuk bermula</string>
<string name="main_bg_subtitle">Tekan \"Cari\" untuk bermula
\n</string>
<string name="view_count_text">%1$s tontonan</string>
<string name="upload_date_text">Diterbitkan pada %1$s</string>
<string name="no_player_found">Tiada pemain strim ditemui. Adakah anda mahu memasang VLC\?</string>

View File

@@ -55,7 +55,7 @@
<string name="autoplay_by_calling_app_title">Automatisk avspilling</string>
<string name="autoplay_by_calling_app_summary">Spiller en video når NewPipe blir forespurt av et annet program</string>
<string name="content">Innhold</string>
<string name="show_age_restricted_content_title">Aldersbegrenset innhold</string>
<string name="show_age_restricted_content_title">Vis aldersbegrenset innhold</string>
<string name="general_error">Feil</string>
<string name="could_not_load_thumbnails">Kunne ikke laste inn alle miniatyrbilder</string>
<string name="youtube_signature_deobfuscation_error">Kunne ikke dekryptere signaturen til videoens nettadresse</string>
@@ -225,7 +225,7 @@
<string name="play_queue_audio_settings">Lydinnstillinger</string>
<string name="hold_to_append">Hold for å legge i kø</string>
<string name="show_hold_to_append_title">Vis \"Hold for å legge til\" -tips</string>
<string name="show_hold_to_append_summary">Vis tips når bakgrunnen eller oppsprettsknappen i videoens «Detaljer:» trykkes</string>
<string name="show_hold_to_append_summary">Vis tips når det trykkes på bakgrunnen eller oppsprettsknappen i videoens «Detaljer:»</string>
<string name="background_player_append">Lagt i kø for bakgrunnsavspiller</string>
<string name="popup_playing_append">Lagt i kø for oppsprettsspiller</string>
<string name="unknown_content">[Ukjent]</string>
@@ -265,7 +265,7 @@
<string name="import_data_title">Importer database</string>
<string name="export_data_title">Eksporter database</string>
<string name="import_data_summary">Overstyrer din nåværende historikk og abonnementsliste</string>
<string name="export_data_summary">Eksporter historikk, abonnementer og spillelister</string>
<string name="export_data_summary">Eksporter historikk, abonnementer, spillelister og innstillinger</string>
<string name="export_complete_toast">Eksportert</string>
<string name="import_complete_toast">Importert</string>
<string name="no_valid_zip_file">Ingen gyldig ZIP-fil</string>
@@ -357,7 +357,10 @@
\n
\n1. Gå til denne nettadressen: %1$s
\n2. Logg inn når forespurt
\n3. En nedlasting av eksportfilen bør starte</string>
\n3. En nedlasting av eksportfilen bør starte
\n4. Klikk på «Neste steg» og så på «Opprett eksport»
\n5. Klikk på «Last ned»-knappen etter den vises, og
\n6. Fra nedlastet takeout.zip, pakk ut .json-filen (vanligvis under «YouTube og YouTube Music/subscriptions/subscriptions.json» og importer den her.</string>
<string name="import_soundcloud_instructions">Importer en SoundCloud-profil ved å skrive enten nettadressen eller din ID:
\n
\n1. Skru på \"skrivebordsmodus\" i en nettleser ( siden er ikke tilgjengelig for mobile enheter)
@@ -644,4 +647,9 @@
<string name="show_age_restricted_content_summary">Vis innhold som muligens er upassende for barn, siden det har aldersgrense (som 18+).</string>
<string name="notification_colorize_summary">Få Android til å tilpasse merknadens farge i henhold til hovedfargen på miniatyrbildet (merk at dette ikke støttes på alle enheter)</string>
<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

@@ -269,8 +269,8 @@
<string name="switch_to_main">Odtwarzaj na pierwszym planie</string>
<string name="import_data_title">Importuj dane</string>
<string name="export_data_title">Eksportuj dane</string>
<string name="import_data_summary">Zastępuje Twoją bieżącą historię i subskrypcje</string>
<string name="export_data_summary">Eksportuje bieżącą historię, subskrypcje i playlisty</string>
<string name="import_data_summary">Zastępuje Twoją bieżącą historię, subskrypcje, playlisty i (opcjonalnie) ustawienia</string>
<string name="export_data_summary">Eksportuje bieżącą historię, subskrypcje, playlisty i ustawienia</string>
<string name="detail_drag_description">Przeciągnij, aby zmienić kolejność</string>
<string name="create">Utwórz</string>
<string name="delete_one">Usuń bieżący</string>
@@ -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

@@ -262,8 +262,8 @@
<string name="preferred_player_fetcher_notification_message">Carregando conteúdo solicitado</string>
<string name="import_data_title">Importar base de dados</string>
<string name="export_data_title">Exportar base de dados</string>
<string name="import_data_summary">Substitui seu histórico e inscrições atuai</string>
<string name="export_data_summary">Exporte histórico, inscrições e playlists</string>
<string name="import_data_summary">Substitui seu histórico atual, inscrições, playlists e (opcionalmente) configurações</string>
<string name="export_data_summary">Exporte histórico, inscrições, playlists e configurações</string>
<string name="export_complete_toast">Exportado</string>
<string name="import_complete_toast">Importado</string>
<string name="no_valid_zip_file">Não há nenhum arquivo ZIP válido</string>
@@ -596,7 +596,7 @@
\n
\nAtive \"%1$s\" nas configurações se quiser vê-lo.</string>
<string name="remove_watched_popup_yes_and_partially_watched_videos">Sim, e vídeos parcialmente vistos</string>
<string name="remove_watched_popup_warning">Vídeos vistos antes e depois de adicionar à lista de reprodução serão removidos.
<string name="remove_watched_popup_warning">Vídeos vistos antes e depois de adicionar à playlists serão removidos.
\nTem certeza\? Isto não pode ser desfeito!</string>
<string name="remove_watched_popup_title">Remover vídeos vistos\?</string>
<string name="remove_watched">Remover vistos</string>
@@ -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

@@ -50,7 +50,7 @@
<string name="new_seek_duration_toast">Devido às restrições de ExoPlayer, a duração da pesquisa foi definida para %d segundos</string>
<string name="overwrite">Sobrescrever</string>
<string name="mute">Sem som</string>
<string name="enable_watch_history_title">Ver histórico</string>
<string name="enable_watch_history_title">Histórico de visualizações</string>
<plurals name="views">
<item quantity="one">%s visualização</item>
<item quantity="other">%s visualizações</item>
@@ -108,7 +108,7 @@
<string name="artists">Artistas</string>
<string name="error_connect_host">Não foi possível ligar ao servidor</string>
<string name="show_play_with_kodi_summary">Mostrar uma opção para reproduzir o vídeo no Kodi</string>
<string name="list_view_mode">Modo de vista em lista</string>
<string name="list_view_mode">Modo de exibição</string>
<string name="use_inexact_seek_summary">A pesquisa inexata permite que esta seja mais rápida mas reduz a precisão. Procurar por 5, 15 ou 25 segundos não funciona corretamente.</string>
<string name="permission_display_over_apps">Permitir sobreposição a outras aplicações</string>
<string name="autoplay_by_calling_app_title">Reprodução automática</string>
@@ -121,7 +121,7 @@
<string name="error_report_open_issue_button_text">Reportar no GitHub</string>
<string name="detail_likes_img_view_description">Gosto</string>
<string name="history_disabled">O histórico está desativado</string>
<string name="download_path_title">Pasta para os vídeos</string>
<string name="download_path_title">Pasta para os ficheiros de vídeo</string>
<string name="subtitle_activity_recaptcha">Prima \"Feito\" ao resolver</string>
<string name="feed_notification_loading">A carregar…</string>
<string name="play_audio">Áudio</string>
@@ -398,7 +398,7 @@
<string name="auto_queue_title">Colocar vídeo seguinte na fila</string>
<string name="peertube_instance_url_summary">Defina as suas instâncias favoritas PeerTube</string>
<string name="import_export_title">Importar/exportar</string>
<string name="export_data_summary">Exportar histórico, subscrições e listas de reprodução</string>
<string name="export_data_summary">Exportar histórico, subscrições, listas de reprodução e definições</string>
<string name="best_resolution">Melhor resolução</string>
<string name="select_a_channel">Selecione um canal</string>
<string name="choose_browser">Escolher navegador</string>
@@ -453,7 +453,7 @@
<string name="clear_search_history_title">Limpar histórico de pesquisas</string>
<string name="msg_error">Erro</string>
<string name="popup_remember_size_pos_title">Lembrar propriedades de popup</string>
<string name="download_path_summary">Os ficheiros de vídeo descarregados serão armazenados aqui</string>
<string name="download_path_summary">Os ficheiros de vídeo descarregados serão guardados aqui</string>
<string name="switch_to_main">Mudar para principal</string>
<string name="msg_popup_permission">Esta permissão é necessária
\npara o modo popup</string>
@@ -471,7 +471,7 @@
<string name="missions_header_pending">Pendente</string>
<string name="import_complete_toast">Importado</string>
<string name="auto">Automático</string>
<string name="import_data_summary">Substitui o histórico e as subscrições atuais</string>
<string name="import_data_summary">Substitui o seu histórico, subscrições, listas de reprodução e (opcionalmente) definições</string>
<string name="settings_category_popup_title">Popup</string>
<string name="short_thousand">k</string>
<string name="err_dir_create">Não foi possível criar a pasta \'%1$s\'</string>
@@ -538,7 +538,7 @@
<string name="settings_file_replacement_character_title">Carácter de substituição</string>
<string name="video">Vídeo</string>
<string name="no_streams_available_download">Não existem vídeos para descarregar</string>
<string name="download_path_audio_summary">Os ficheiros de áudio descarregados serão armazenados aqui</string>
<string name="download_path_audio_summary">Os ficheiros de áudio descarregados serão guardados aqui</string>
<string name="videos_string">Vídeos</string>
<string name="metadata_cache_wipe_complete_notice">Meta-dados em cache limpos</string>
<string name="show_hold_to_append_summary">Mostrar dica ao premir em segundo plano ou no botão \"Detalhes:\" da janela popup</string>

View File

@@ -16,8 +16,8 @@
<string name="screen_rotation">rotação</string>
<string name="use_external_video_player_title">Utilizar reprodutor de vídeo externo</string>
<string name="use_external_audio_player_title">Utilizar reprodutor de áudio externo</string>
<string name="download_path_title">Pasta para os vídeos</string>
<string name="download_path_summary">Os ficheiros de vídeo descarregados serão armazenados aqui</string>
<string name="download_path_title">Pasta para os ficheiros de vídeo</string>
<string name="download_path_summary">Os ficheiros de vídeo descarregados serão guardados aqui</string>
<string name="download_path_dialog_title">Escolha a pasta para colocar os ficheiros de vídeo</string>
<string name="default_resolution_title">Resolução padrão</string>
<string name="play_with_kodi_title">Reproduzir no Kodi</string>
@@ -46,7 +46,7 @@
<string name="use_tor_title">Utilizar Tor</string>
<string name="use_tor_summary">(Experimental) Forçar tráfego via Tor para aumentar a privacidade (ainda não é suportada a emissão de vídeos).</string>
<string name="download_path_audio_title">Pasta para ficheiros de áudio</string>
<string name="download_path_audio_summary">Os ficheiros de áudio descarregados serão armazenados aqui</string>
<string name="download_path_audio_summary">Os ficheiros de áudio descarregados serão guardados aqui</string>
<string name="download_path_audio_dialog_title">Escolha a pasta para colocar os ficheiros de áudio</string>
<string name="err_dir_create">Não foi possível criar a pasta \'%1$s\'</string>
<string name="info_dir_created">Pasta \'%1$s\' criada com sucesso</string>
@@ -165,8 +165,8 @@
<string name="fragment_feed_title">Novidades</string>
<string name="enable_search_history_title">Histórico de pesquisa</string>
<string name="enable_search_history_summary">Guardar termos de pesquisa localmente</string>
<string name="enable_watch_history_title">Ver histórico</string>
<string name="enable_watch_history_summary">Manter histórico dos vídeos vistos</string>
<string name="enable_watch_history_title">Histórico de visualizações</string>
<string name="enable_watch_history_summary">Manter histórico dos vídeos visualizados</string>
<string name="resume_on_audio_focus_gain_title">Continuar reprodução</string>
<string name="resume_on_audio_focus_gain_summary">Continuar reprodução após interrupções (ex. chamadas)</string>
<string name="settings_category_player_title">Reprodutor</string>
@@ -237,8 +237,8 @@
<string name="toggle_orientation">Alternar orientação</string>
<string name="import_data_title">Importar base de dados</string>
<string name="export_data_title">Exportar base de dados</string>
<string name="import_data_summary">Substitui o histórico e as subscrições atuais</string>
<string name="export_data_summary">Exportar histórico, subscrições e listas de reprodução</string>
<string name="import_data_summary">Substitui o seu histórico, subscrições, listas de reprodução e (opcionalmente) definições</string>
<string name="export_data_summary">Exportar histórico, subscrições, listas de reprodução e definições</string>
<string name="background_player_append">Na fila do reprodutor em segundo plano</string>
<string name="popup_playing_append">Na fila do reprodutor popup</string>
<string name="switch_to_background">Mudar para segundo plano</string>
@@ -417,7 +417,7 @@
<string name="selection">Seleção</string>
<string name="updates_setting_title">Atualizações</string>
<string name="updates_setting_description">Mostrar uma notificação para pedir a atualização da aplicação se existir uma nova versão</string>
<string name="list_view_mode">Modo de vista em lista</string>
<string name="list_view_mode">Modo de exibição</string>
<string name="list">Lista</string>
<string name="grid">Grelha</string>
<string name="auto">Automático</string>
@@ -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

@@ -26,7 +26,7 @@
<string name="default_audio_format_title">Формат аудио по умолчанию</string>
<string name="download_dialog_title">Скачать</string>
<string name="unsupported_url">URL не поддерживается</string>
<string name="show_next_and_similar_title">\"Следующее\" и похожие видео</string>
<string name="show_next_and_similar_title">Показать похожие видео</string>
<string name="content_language_title">Язык контента по умолчанию</string>
<string name="settings_category_video_audio_title">Видео и аудио</string>
<string name="settings_category_appearance_title">Внешний вид</string>
@@ -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>
@@ -153,7 +153,7 @@
<string name="app_description">Свободное и легковесное потоковое воспроизведение для Android.</string>
<string name="view_on_github">Открыть на GitHub</string>
<string name="contribution_encouragement">Приветствуется всё — идеи, перевод, изменения дизайна, чистка кода или огромные изменения в коде. Чем больше сделано, тем лучше!</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="contribution_title">Помощь проекту</string>
<string name="subscribe_button_title">Подписаться</string>
<string name="subscription_change_failed">Не удалось изменить подписку</string>
@@ -162,7 +162,7 @@
<string name="tab_subscriptions">Подписки</string>
<string name="fragment_feed_title">Что нового</string>
<string name="enable_search_history_title">История поиска</string>
<string name="enable_search_history_summary">Хранить запросы поиска локально</string>
<string name="enable_search_history_summary">Хранить запросы поиска (локально)</string>
<string name="enable_watch_history_title">История просмотров</string>
<string name="enable_playback_resume_title">Продолжать воспроизведение</string>
<string name="enable_playback_resume_summary">Восстанавливать последнюю позицию</string>
@@ -282,8 +282,8 @@
<string name="file">Файл</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="invalid_directory">Папка не существует</string>
<string name="invalid_source">Папка или источник контента не существуют</string>
<string name="invalid_file">Файл не существует или нет разрешения на его чтение или запись</string>
@@ -383,7 +383,7 @@
<string name="preferred_open_action_settings_title">При открытии ссылки</string>
<string name="import_settings">Хотите импортировать настройки?</string>
<string name="privacy_policy_title">Конфиденциальность</string>
<string name="privacy_policy_encouragement">Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Поэтому приложение не собирает никаких данных без вашего согласия.
<string name="privacy_policy_encouragement">Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никаких данных без вашего согласия.
\nПолитика конфиденциальности NewPipe подробно объясняет, какие данные отправляются и хранятся при отправке отчёта о сбоях.</string>
<string name="read_privacy_policy">Прочитать политику</string>
<string name="start_accept_privacy_policy">В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней.
@@ -580,19 +580,19 @@
<string name="feed_update_threshold_option_always_update">Обновлять всегда</string>
<string name="feed_group_dialog_empty_selection">Подписки не выбраны</string>
<string name="feed_groups_header_title">Группы каналов</string>
<string name="feed_use_dedicated_fetch_method_help_text">Если обновление подписок кажется вам слишком медленным, попробуйте быстрый режим (включите в настройках или кнопкой внизу).
<string name="feed_use_dedicated_fetch_method_help_text">Если подписки обновляются слишком медленно, попробуйте быстрый режим (включите в настройках или кнопкой внизу).
\n
\nNewPipe позволяет обновлять подписки двумя способами:
\n• получение канала целиком, медленное, но с полными сведениями;
\n• обновление по RSS, быстрое, но с потерей сведений.
\nNewPipe может обновлять подписки двумя способами:
\n• получение канала целиком, медленное, с полными сведениями;
\n• обновление по RSS, быстрое, с потерей сведений.
\n
\nПри быстром обновлении теряются длительность элемента и его тип (нельзя определить, трансляция это или обычное видео), могут быть получены не все элементы канала.
\nПри быстром обновлении теряются длительность элемента и его тип (трансляция или обычное видео), могут быть получены не все элементы канала.
\n
\nYouTube является примером такого сервиса, допуская быстрое обновление по RSS.
\nКак пример, YouTube поддерживает быстрое обновление.
\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
@@ -640,7 +640,7 @@
<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_summary">Действия можно изменить, нажав на них. Отметьте не более трёх для отображения в компактном уведомлении</string>
<string name="notification_action_4_title">Пятое действие</string>
<string name="notification_action_3_title">Четвёртое действие</string>
<string name="notification_action_2_title">Третье действие</string>
@@ -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

@@ -443,8 +443,8 @@
<string name="delete_view_history_alert">Cheres iscantzellare totu sa cronologia de sos pompiados\?</string>
<string name="clear_views_history_summary">Iscantzellat sa cronologia de sos cuntenutos riproduidos e sas positziones de riprodutzione</string>
<string name="clear_views_history_title">Isbòida sa cronologia de sos pompiados</string>
<string name="export_data_summary">Esporta sa cronologia, sos abbonamentos e sas iscalitas</string>
<string name="import_data_summary">Subraiscriet sa cronologia e sos abbonamentos atuales tuos</string>
<string name="export_data_summary">Esporta sa cronologia, sos abbonamentos, sas iscalitas e sas impostatziones</string>
<string name="import_data_summary">Subraiscriet sa cronologia, sos abbonamentos, sas iscalita e (optzionalmente) sas impostatziones tuas atuales</string>
<string name="export_data_title">Esporta sa base de datos</string>
<string name="import_data_title">Importa sa base de datos</string>
<string name="switch_to_main">Cola a sa modalidade printzipale</string>
@@ -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

@@ -231,8 +231,8 @@
<string name="switch_to_main">Prepnúť na Video</string>
<string name="import_data_title">Importovať databázu</string>
<string name="export_data_title">Exportovať databázu</string>
<string name="import_data_summary">Prepíše aktuálnu históriu pozretí a odberov</string>
<string name="export_data_summary">Exportovať históriu, odbery a zoznamy skladieb</string>
<string name="import_data_summary">Prepíše aktuálnu históriu, odbery, zoznamy skladieb a (voliteľne aj) nastavenia</string>
<string name="export_data_summary">Exportovať históriu, odbery, zoznamy skladieb a nastavenia</string>
<string name="player_stream_failure">Nepodarilo sa prehrať tento stream</string>
<string name="player_unrecoverable_failure">Pri prehrávaní došlo k chybe a nemožno pokračovať</string>
<string name="player_recoverable_failure">Zotavovanie po chybe v prehrávaní</string>
@@ -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

@@ -260,8 +260,8 @@
<string name="preferred_player_fetcher_notification_message">İstenen içerik yükleniyor</string>
<string name="import_data_title">Veri tabanını içe aktar</string>
<string name="export_data_title">Veri tabanını dışa aktar</string>
<string name="import_data_summary">Geçerli geçmişinizi ve aboneliklerinizi geçersiz kılar</string>
<string name="export_data_summary">Geçmişi, abonelikleri ve oynatma listelerini dışa aktar</string>
<string name="import_data_summary">Geçerli geçmişinizi, aboneliklerinizi, oynatma listelerinizi ve (isteğe bağlı olarak) ayarlarınızı geçersiz kılar</string>
<string name="export_data_summary">Geçmişi, abonelikleri, oynatma listelerini ve ayarları dışa aktar</string>
<string name="export_complete_toast">Dışa aktarıldı</string>
<string name="import_complete_toast">İçe aktarıldı</string>
<string name="no_valid_zip_file">Geçerli ZIP dosyası yok</string>
@@ -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>
@@ -228,8 +228,8 @@
<string name="website_title">網站</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="give_back">回饋</string>
<string name="website_encouragement">如欲了解更多有關 NewPipe 的資訊和新聞,請造訪我們的網站。</string>
<string name="main_page_content">首頁內容</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

@@ -82,6 +82,7 @@
<attr name="ic_sort" format="reference" />
<attr name="ic_help" format="reference" />
<attr name="ic_arrow_back" format="reference" />
<attr name="ic_live_tv" format="reference" />
<attr name="progress_horizontal_drawable" format="reference" />
<!-- Can't refer to colors directly in drawable's xml-->

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>

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