1
mirror of https://github.com/TeamNewPipe/NewPipe synced 2025-09-22 21:40:52 +02:00

Compare commits

...

274 Commits

Author SHA1 Message Date
Stypox
53a659c0cf Merge pull request #8222 from TeamNewPipe/release/0.22.2
Update NewPipeExtractor again to fix throttling on age restricted videos
2022-04-15 20:08:44 +02:00
Stypox
955748f00f Merge pull request #8215 from TeamNewPipe/release/0.22.2
Hotfix release v0.22.2
2022-04-15 14:58:56 +02:00
Stypox
bc53bc7cfd Update NewPipeExtractor again to fix throttling on age restricted videos 2022-04-15 13:36:11 +02:00
Stypox
5ce5f84f4a Add hotfix changelogs for NewPipe 0.22.2 (985)
The changelogs were just copied from 982.txt for all languages that had it, since the subject of the hotfix release was the same, i.e. youtube breaking
2022-04-15 11:05:19 +02:00
Stypox
ffa7efedd6 Hotfix release 0.22.2 (985) 2022-04-15 10:57:55 +02:00
Stypox
5e6752db14 Update NewPipeExtractor for hotfix release 2022-04-15 10:54:31 +02:00
Stypox
47f9ed08e9 Merge pull request #7934 from TeamNewPipe/release/0.22.1
Release 0.22.1
2022-02-26 22:01:30 +01:00
Hosted Weblate
ee3c06394d Translated using Weblate (Swedish)
Currently translated at 49.2% (32 of 65 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Greek)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 58.4% (38 of 65 strings)

Translated using Weblate (Dutch (Belgium))

Currently translated at 23.0% (15 of 65 strings)

Translated using Weblate (French)

Currently translated at 66.1% (43 of 65 strings)

Translated using Weblate (Azerbaijani)

Currently translated at 7.6% (5 of 65 strings)

Translated using Weblate (Italian)

Currently translated at 38.4% (25 of 65 strings)

Translated using Weblate (Polish)

Currently translated at 55.3% (36 of 65 strings)

Translated using Weblate (Hebrew)

Currently translated at 53.8% (35 of 65 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (65 of 65 strings)

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

Currently translated at 7.6% (5 of 65 strings)

Translated using Weblate (German)

Currently translated at 66.1% (43 of 65 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (English)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (English)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (English)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (French)

Currently translated at 65.6% (42 of 64 strings)

Translated using Weblate (Dutch)

Currently translated at 71.8% (46 of 64 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (613 of 613 strings)

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

Currently translated at 80.4% (493 of 613 strings)

Translated using Weblate (French)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (613 of 613 strings)

Co-authored-by: Agnieszka C <aga_04@o2.pl>
Co-authored-by: Alex25820 <alexs25820@gmail.com>
Co-authored-by: Benedikt Freisen <b.freisen@gmx.net>
Co-authored-by: Corc <nizamismidov4@gmail.com>
Co-authored-by: Guillem <guillemglez@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Issa1553 <fairfull.playing@gmail.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Mohammed Anas <triallax@tutanota.com>
Co-authored-by: Oğuz Ersen <oguzersen@protonmail.com>
Co-authored-by: Ray <ray.cfu@protonmail.com>
Co-authored-by: Retrial <giwrgosmant@gmail.com>
Co-authored-by: Stypox <stypox@pm.me>
Co-authored-by: TiA4f8R <avdivers84@gmail.com>
Co-authored-by: Vitor Henrique <vitorhcl00@gmail.com>
Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Co-authored-by: mm4c <oldblue@vivaldi.net>
Co-authored-by: ssantos <ssantos@web.de>
Co-authored-by: zmni <zmni@outlook.com>
Co-authored-by: Éfrit <efrit@posteo.net>
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/az/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/he/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nl/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nl_BE/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sv/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/uk/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant_HK/
Translation: NewPipe/Metadata
2022-02-26 18:52:17 +01:00
Stypox
443ebc46d6 Release 0.22.1 (984) 2022-02-23 15:16:37 +01:00
Tobi
c42f29446d Merge pull request #7924 from litetex/revert-7451
Revert "Respect cutouts when playing in MultiWindow"
2022-02-21 21:36:07 +01:00
litetex
1030e09fc1 Merge pull request #7901 from Stypox/player-small-refactor
Small refactor in player class
2022-02-21 20:48:03 +01:00
litetex
96b930cd07 Revert "Respect cutouts when playing in MultiWindow"
This reverts commit c92a90749e.
2022-02-21 20:30:56 +01:00
litetex
de08edb831 Merge pull request #7898 from Stypox/regression-arc
Have fast seek overlay arc go under system ui
2022-02-21 20:19:22 +01:00
Stypox
af80d96b9e Merge pull request #7659 from litetex/load-enough-initial-data
Load enough initial items (into BaseListFragment and descendants)
2022-02-19 15:43:13 +01:00
Stypox
3c23fb0b13 Small refactor in player class 2022-02-19 13:30:55 +01:00
Tobi
750490cd2f Merge pull request #7900 from Stypox/increment-compile-sdk
Change `compileSdk` from 30 to 31
2022-02-19 12:35:13 +01:00
Stypox
579b8611be Change compileSdk from 30 to 31
This will allow newer libraries to be used, see #7782 and #2335. This should have no changes on the app since the targetSdk stayed the same.
2022-02-19 12:00:04 +01:00
Stypox
da12b92d75 Fix fast seek arc not going under system ui 2022-02-19 11:29:33 +01:00
TobiGr
a3f99bd781 Merge branch 'master' into dev 2022-02-19 10:56:19 +01:00
Tobi
7ae908a466 Merge pull request #7858 from TeamNewPipe/release/0.22.0
Release 0.22.0
2022-02-19 10:51:52 +01:00
Stypox
00767f4bf3 Fix fast seek overlay arc not correctly centered
This happened in fullscreen player: while play-pause, brightness, volume, ... buttons were correctly centered in the app UI, the fast seek overlay was centered in the system UI, causing a mismatch between the two that looked ugly
2022-02-18 22:34:55 +01:00
TobiGr
54f0b3d8b3 Release NewPipe 0.22.0 (983) 2022-02-18 20:39:51 +01:00
Hosted Weblate
08eb70833d Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (64 of 64 strings)

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

Currently translated at 6.2% (4 of 64 strings)

Translated using Weblate (Malay)

Currently translated at 60.0% (368 of 613 strings)

Translated using Weblate (Estonian)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Finnish)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (613 of 613 strings)

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

Currently translated at 63.9% (392 of 613 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Dutch)

Currently translated at 64.0% (41 of 64 strings)

Translated using Weblate (Hebrew)

Currently translated at 53.1% (34 of 64 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Polish)

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 (Dutch)

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 (Polish)

Currently translated at 54.6% (35 of 64 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (64 of 64 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 95.2% (584 of 613 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Slovak)

Currently translated at 98.0% (601 of 613 strings)

Translated using Weblate (Hungarian)

Currently translated at 99.5% (610 of 613 strings)

Translated using Weblate (English)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (63 of 63 strings)

Translated using Weblate (Dutch)

Currently translated at 46.0% (29 of 63 strings)

Translated using Weblate (Hebrew)

Currently translated at 52.3% (33 of 63 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (63 of 63 strings)

Translated using Weblate (Interlingua)

Currently translated at 35.0% (215 of 613 strings)

Translated using Weblate (Danish)

Currently translated at 49.1% (301 of 613 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 94.2% (578 of 613 strings)

Translated using Weblate (Estonian)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Finnish)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Arabic)

Currently translated at 99.6% (611 of 613 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Dutch)

Currently translated at 28.5% (18 of 63 strings)

Translated using Weblate (Dutch)

Currently translated at 28.5% (18 of 63 strings)

Translated using Weblate (Swedish)

Currently translated at 48.3% (30 of 62 strings)

Translated using Weblate (French)

Currently translated at 66.1% (41 of 62 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (62 of 62 strings)

Translated using Weblate (Estonian)

Currently translated at 99.8% (612 of 613 strings)

Translated using Weblate (Catalan)

Currently translated at 99.1% (608 of 613 strings)

Translated using Weblate (Tamil)

Currently translated at 55.4% (340 of 613 strings)

Translated using Weblate (Finnish)

Currently translated at 99.0% (607 of 613 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Armenian)

Currently translated at 19.0% (117 of 613 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Persian)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Indonesian)

Currently translated at 99.8% (612 of 613 strings)

Translated using Weblate (Japanese)

Currently translated at 99.8% (612 of 613 strings)

Translated using Weblate (French)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (English)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Sardinian)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Portuguese (Portugal))

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Kurdish (Central))

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Catalan)

Currently translated at 99.3% (609 of 613 strings)

Translated using Weblate (Lithuanian)

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 (Portuguese (Brazil))

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Ukrainian)

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 (Italian)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (French)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (German)

Currently translated at 100.0% (613 of 613 strings)

Added translation using Weblate (German (Low))

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Polish)

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 (Russian)

Currently translated at 100.0% (613 of 613 strings)

Translated using Weblate (Malay)

Currently translated at 4.8% (3 of 62 strings)

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

Currently translated at 4.8% (3 of 62 strings)

Translated using Weblate (Galician)

Currently translated at 94.9% (581 of 612 strings)

Translated using Weblate (Malay)

Currently translated at 60.1% (368 of 612 strings)

Translated using Weblate (Malay)

Currently translated at 60.1% (368 of 612 strings)

Translated using Weblate (Tamil)

Currently translated at 49.8% (305 of 612 strings)

Translated using Weblate (Finnish)

Currently translated at 97.2% (595 of 612 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (612 of 612 strings)

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

Currently translated at 57.1% (350 of 612 strings)

Translated using Weblate (French)

Currently translated at 99.6% (610 of 612 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 7.6% (47 of 612 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (62 of 62 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (62 of 62 strings)

Translated using Weblate (Tamil)

Currently translated at 44.6% (273 of 612 strings)

Translated using Weblate (Arabic)

Currently translated at 99.8% (611 of 612 strings)

Co-authored-by: A <ville.mourujarvi@hostedweblate.mail.kapsi.fi>
Co-authored-by: Agnieszka C <aga_04@o2.pl>
Co-authored-by: Ajeje Brazorf <lmelonimamo@yahoo.it>
Co-authored-by: Albert Vila <vilacalvo.albert@gmail.com>
Co-authored-by: Alex25820 <alexs25820@gmail.com>
Co-authored-by: Alfonso Scarpino <alfonso.scarpino@gmail.com>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Danial Behzadi <dani.behzi@ubuntu.com>
Co-authored-by: Davit Mayilyan <davit.mayilyan@protonmail.ch>
Co-authored-by: Denys Nykula <nykula@ukr.net>
Co-authored-by: Eric <alchemillatruth@purelymail.com>
Co-authored-by: GnuPGを使うべきだ <dieeeazpnnqbpddh@cock.email>
Co-authored-by: GobinathAL <gobinathal8@gmail.com>
Co-authored-by: Guillem <guillemglez@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: JY3 <GeeyunJY3@gmail.com>
Co-authored-by: Jeff Huang <s8321414@gmail.com>
Co-authored-by: John Smith <a@shatin.ml>
Co-authored-by: Karl Tammik <karltammik@protonmail.com>
Co-authored-by: Lim Jia Ming <jiaminglimjm@protonmail.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Marian Hanzel <marulinko@gmail.com>
Co-authored-by: Mark <theMurk@protonmail.com>
Co-authored-by: Mohammed Anas <6daf084a-8eaf-40fb-86c7-8500077c3b69@anonaddy.me>
Co-authored-by: Mohammed Anas <triallax@tutanota.com>
Co-authored-by: MohammedSR Vevo <mohammednajmidin@gmail.com>
Co-authored-by: My <quentin.lalle@gmail.com>
Co-authored-by: Ray <ray.cfu@protonmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Ricardo <contatorms7@tutamail.com>
Co-authored-by: S3aBreeze <paperwork@evilcorp.ltd>
Co-authored-by: SamTada <SamLbttyw@protonmail.com>
Co-authored-by: Software In Interlingua <softinterlingua@gmail.com>
Co-authored-by: THANOS SIOURDAKIS <siourdakisthanos@gmail.com>
Co-authored-by: Thomas Frarke <goetzknecht23@gmail.com>
Co-authored-by: TobiGr <tobigr@mail.de>
Co-authored-by: Vasilis K <skyhirules@gmail.com>
Co-authored-by: VfBFan <drop0815@posteo.de>
Co-authored-by: Ville Rantanen <v.r@iki.fi>
Co-authored-by: WB <web0nst@tuta.io>
Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Co-authored-by: chr56 <chr0056@gmail.com>
Co-authored-by: gymka <gymka@archlinux.lt>
Co-authored-by: jojo <welwhazosky@gmail.com>
Co-authored-by: mm4c <oldblue@vivaldi.net>
Co-authored-by: nzgha <nzgha.hw@runbox.com>
Co-authored-by: ssantos <ssantos@web.de>
Co-authored-by: translator <kvb@tuta.io>
Co-authored-by: xainsworth <202120614015@ogr.balikesir.edu.tr>
Co-authored-by: Ács Zoltán <acszoltan111@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/he/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ms/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nl/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sv/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/uk/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant_HK/
Translation: NewPipe/Metadata
2022-02-18 20:39:51 +01:00
TobiGr
42aafd3a2d Update NewPipe Extractor to v0.21.14 2022-02-18 20:39:51 +01:00
litetex
2acaefdb2a Fixed scrolling not working when rotating device 2022-02-17 20:59:41 +01:00
litetex
9c2cdd2513 Removed useless code
https://github.com/TeamNewPipe/NewPipe/pull/7659#discussion_r793752985
2022-02-17 20:59:40 +01:00
litetex
01683aa816 Code improvements 2022-02-17 20:59:39 +01:00
litetex
85f701b94e Fixed listener not re-registering after e.g. a new search is started 2022-02-17 20:59:38 +01:00
litetex
ff7cfe4715 Reverted to loading behavior of #7638 and improved it
The previous/reverted behavior caused unwanted data transmission:
* Removed loading via handleResults/loadMoreItems-callback because the RecyclerView is apparently not immediately updated in the UI when the data is set which causes one load of data to much.
2022-02-17 20:59:38 +01:00
litetex
d3cd3d62b4 Tried to repair #4475 and #3368
* Always recreate the footer so that it's not possible to attach the same instance twice
* Removed support for creating a custom footer as it's never used
* Supply the header with an supplier
  * This might not fix the problem completely as we currently can only create the header once inside Channel, Playlist and RelatedItems-Fragment - allowing creation of multiple headers might be done in the future if the issues still arise
* Other minor fixes
2022-02-17 20:59:36 +01:00
litetex
91c67b085b Code improvements
Removed - partial - stupid code.
2022-02-17 20:59:35 +01:00
litetex
cd8c7ec3c0 Removed InfoListAdapter from checkstyle-suppressions
because if you modify something in the code the suppressions-file no longer matches
2022-02-17 20:59:34 +01:00
litetex
2c51a7970d Improved InfoListAdapter
* Removed unused code
* Cleaned it up
* Made code more readable
2022-02-17 20:59:33 +01:00
litetex
fb362022f7 Load enough initial data into BaseListFragment 2022-02-17 20:59:33 +01:00
litetex
2814ae6d3c Merge pull request #7884 from litetex/improve-image-minimizer
Improved image-minimizer
2022-02-17 19:33:39 +01:00
litetex
7225199deb Fixed typo
It was late when I typed this 😆
2022-02-16 20:31:15 +01:00
litetex
c08a4e851b Improved image-minimizer
* Don't minimize images that are too wide -> they will get stretched otherwise
* Don't try to modify the issue/comment when nothing changed
* Fixed typo
2022-02-15 20:09:21 +01:00
Robin
9f8e8c0856 Merge pull request #7679 from TacoTheDank/reportSenderKotlin
Update ACRA library
2022-02-14 15:35:00 +01:00
litetex
e2a7b9ac56 Switch to GitHub issue forms (#7773)
* Switched to GitHub issue forms

See also
* https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository#creating-issue-forms
* https://github.blog/changelog/2021-06-23-issues-forms-beta-for-public-repositories/

* Switched expected and actual behavior

* Improved/Reworked issue template

Credits to @TheAssassin

* CI: Ignore changes to issue-templates

* Improved/Reworked issue template

Credits to @opusforlife2 and @mhmdanas

* Further improved the issue templates

* Next round of review

Co-authored-by: opusforlife2 <53176348+opusforlife2@users.noreply.github.com>
2022-02-12 19:34:08 +00:00
Tobi
5e593f687d Merge pull request #7860 from litetex/fix-settings-search-language
Use the correct app language when searching in the settings
2022-02-11 21:20:08 +01:00
litetex
3223ec04e3 Use the correct app language when searching in the settings 2022-02-11 20:58:44 +01:00
litetex
f388a1af67 Added image-minimizer (#7772)
Co-authored-by: Mohammed Anas <triallax@tutanota.com>
2022-02-11 19:54:12 +00:00
Tobi
c1fe5c8d07 Merge pull request #7852 from TiA4f8R/player-recovery-workaround-play-thumbnail
Set workaround for playback position reset when switching to main player with content thumbnail
2022-02-11 20:49:12 +01:00
TiA4f8R
608e73e2f2 Set workaround for playback position reset when switching to main player with content thumbnail
The workaround set before was not applied when switching to main player with content thumbnail from popup or background player. This commit fixes this by applying the workaround when switching to main player with content thumbnail from popup or background player.
2022-02-11 19:32:13 +01:00
Tobi
2e538b8959 Add changelog for NewPipe 0.22.0 (983) (#7810)
* Add changelog for NewPipe 0.22.0 (983)
Co-authored-by: opusforlife2 <53176348+opusforlife2@users.noreply.github.com>
Co-authored-by: Mohammed Anas <triallax@tutanota.com>
2022-02-11 15:25:25 +01:00
litetex
1278fc27ae Merge pull request #7803 from mhmdanas/paths-ignore-doc-dir
Add some stuff to `paths-ignore`
2022-02-09 19:57:47 +01:00
litetex
be95d7fe0f Merge pull request #7704 from Stypox/fix-stream-menu-crash
Fix crash when long-pressing stream while player is starting
2022-02-09 19:53:09 +01:00
Mohammed Anas
377914f1d8 Small changes to license section of README (#7710)
Co-authored-by: opusforlife2 <53176348+opusforlife2@users.noreply.github.com>
2022-02-04 18:26:37 +00:00
Poussinou
5bf439ad9e Update FUNDING.yml (#7682)
Co-authored-by: Mohammed Anas <triallax@tutanota.com>
2022-02-04 10:36:00 +00:00
Mohammed Anas
3b1b23ba2a Add FUNDING.yml to paths-ignore 2022-02-04 10:32:33 +00:00
Mohammed Anas
9274e6417a Add files in doc to paths-ignore 2022-02-04 10:13:10 +00:00
Mohammed Anas
dce6565af4 Merge pull request #7776 from litetex/merged-master-into-dev-v0.21.16
Merge ``master`` branch back into ``dev``
2022-02-03 23:41:20 +03:00
Alberto Mosconi
8b3aec5edb Move translated READMEs to subfolder (#7784) 2022-02-03 20:33:27 +00:00
litetex
b0e4f947ea Fixed merge conflict
Co-authored-by: Mohammed Anas <triallax@tutanota.com>
2022-02-03 21:06:25 +01:00
TacoTheDank
79060f0bfe Update ACRA library 2022-02-02 13:12:29 -05:00
litetex
91bcd8766a Merge remote-tracking branch 'upstream/master' into experimental 2022-02-01 22:05:19 +01:00
Mohammed Anas
4e633504a8 Merge pull request #7753 from TeamNewPipe/release/0.21.16
Release 0.21.16
2022-02-01 16:18:52 +03:00
TobiGr
144a10f7a6 Release 0.21.16 (982) 2022-02-01 13:44:19 +01:00
TobiGr
72a2644f25 Update NewPipe Extractor to 0.21.13 2022-02-01 13:41:12 +01:00
Robin
e865c4350e Merge pull request #7661 from TiA4f8R/livestreams-improvements
Increase playlist stuck target duration coefficient and catch BehindLiveWindowExceptions properly
2022-02-01 11:38:12 +01:00
TiA4f8R
52cc4a0a05 Add JavaDoc for PlayerDataSource.PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT 2022-01-30 20:42:02 +01:00
TiA4f8R
e103e4817c Apply suggested changes and remove the CustomHlsPlaylistTracker class 2022-01-30 20:42:02 +01:00
TiA4f8R
d0637a8832 Suppress SonarLint NullPointerException warnings in CustomHlsPlaylistTracker
They seem to be wrong, by looking at the class work and at the return of CustomHlsPlaylistTracker's methods.
2022-01-30 20:42:02 +01:00
TiA4f8R
94f774b82d Use a custom HlsPlaylistTracker, based on DefaultHlsPlaylistTracker to allow more stucking on HLS livestreams
ExoPlayer's default behavior is to use a multiplication of target segment by a coefficient (3,5).
This coefficient (and this behavior) cannot be customized without using a custom HlsPlaylistTracker right now.

New behavior is to wait 15 seconds before throwing a PlaylistStuckException.
This should improve a lot HLS live streaming on (very) low-latency livestreams with buffering issues, especially on YouTube with their HLS manifests.
2022-01-30 20:42:01 +01:00
TiA4f8R
651b79d3ed Catch properly BehindLiveWindowExceptions
Instead of trying to reload the play queue manager and then throwing an error, BehindLiveWindowExceptions now make the app seek to the default playback position, like recommended by ExoPlayer.
The buffering state is shown in this case.

Error handling of other exceptions is not changed.
2022-01-30 20:42:01 +01:00
Radplay
9e5b9ca326 Polish translation of README (#7694)
Co-authored-by: Mohammed Anas <triallax@tutanota.com>
2022-01-30 20:10:53 +03:00
litetex
dfa606ef49 Merge pull request #7586 from litetex/add-preference-search
Made preferences searchable
2022-01-30 17:08:04 +01:00
litetex
2886bc3b01 Merge pull request #4833 from vkay94/youtube-rewind-forward
YouTube's Fast Forward/Rewind behavior
2022-01-30 17:07:15 +01:00
Stypox
71c5aaa11e Do not show enqueue button if play queue not ready 2022-01-27 17:11:16 +01:00
Stypox
466db83375 Improve HistoryRecordManager tests (#7700)
* Improve HistoryRecordManager tests

* Improve shuffle as requested
2022-01-27 14:43:51 +01:00
Stypox
17c0fffd73 Merge pull request #7538 from ktprograms/fix-queue-channel-details-not-in-db
Load uploaderUrl when showing Channel Details from Play Queue
2022-01-26 09:58:32 +01:00
litetex
8a069b497f Code cleanup
Co-authored-by: Stypox <stypox@pm.me>
2022-01-25 20:47:53 +01:00
litetex
af79479716 Fixed "Changing the seeks duration does not update the displayed seconds" 2022-01-25 20:44:49 +01:00
litetex
8cfe8c17e3 Merge pull request #7693 from TiA4f8R/fix-first-item-play-queue-always-played
Fix first item always played in the play queue when reloading play queue manager
2022-01-25 19:55:10 +01:00
Stypox
5108d75682 Fix NPE and add some @Nullables
Fix NullPointerException in PlayerHolder.getQueueSize() and add `@Nullable` here and there so that the linter reports risks of NPEs
2022-01-25 17:37:20 +01:00
Stypox
ac53196dcc Merge pull request #7678 from TacoTheDank/gradleDeprecations
Fix some gradle deprecations
2022-01-25 10:17:09 +01:00
ktprograms
1e652b159e Load uploaderUrl when showing Channel Details from Play Queue
This checks if the uploaderUrl is in the database, if not it gets the
uploaderUrl and puts it in the database. This is similar to the fetching
of uploaderUrl when it doesn't exist done in #6919.

Also use createNotification when error occurs in getStreamInfo.
2022-01-25 11:00:34 +08:00
TiA4f8R
ea07d7751b Fix first item played in playlists when switching player type or resolution
The issue was caused by an ExoPlayer change, which when setting a media source, resets the current playback position and the current window index by default.

Also set player recovery in more places to fix playback position not propely set in some cases after a player type switch.
2022-01-24 21:40:16 +01:00
litetex
82de35d724 Use view binding inside `PreferenceViewHolder` 2022-01-24 21:08:52 +01:00
litetex
f55e8ea3aa Use ViewBinding 2022-01-24 21:08:52 +01:00
litetex
7067ebdd12 Fixed imports 2022-01-24 21:08:51 +01:00
litetex
03bb2123f2 Removed breadcrumbs customization 2022-01-24 21:08:51 +01:00
litetex
e2f449f0c8 Code improvements
* Renamed methods so that they are more understandable
* Removed ``SearchIndexItem``
2022-01-24 21:08:50 +01:00
litetex
b16e972710 Improved doc 2022-01-24 21:08:50 +01:00
litetex
37cd71328c Moved `FuzzyScore` to original Apache package 2022-01-24 21:08:49 +01:00
litetex
9b2c86a37b Improved documentation 2022-01-24 21:08:48 +01:00
litetex
ce4dd33eab Fixed problems with Android's lifecycle (restore) 2022-01-24 21:08:48 +01:00
litetex
8bbc3e531c Fixed gitignore and commited missing file 2022-01-24 21:08:47 +01:00
litetex
c5a06243a6 Fixed variable name 2022-01-24 21:08:47 +01:00
litetex
bebd2b449c Removed unused import 2022-01-24 21:08:46 +01:00
litetex
658168eb8d Fixed some sonar warnings 2022-01-24 21:08:45 +01:00
litetex
6b23df0659 Made debug settings searchable (debug only)
* Consolidated main-setttings into a single file
* Debug settings are only enabled in the DEBUG build
* Moved LeakCanary (debug) specific stuff into a small class that's only shipped with the debug build
* Other minor fixes
2022-01-24 21:08:45 +01:00
litetex
d59314801c Code rework 2022-01-24 21:08:44 +01:00
litetex
0f45c69388 Code cleanup + indexing improvements
* Removed unused method
* Only index all settings once -> Saves performance
* Fixed some SonarLint reported problems
2022-01-24 21:08:44 +01:00
litetex
52542e04e8 Added fuzzy searching + Some minor code refactoring 2022-01-24 21:08:43 +01:00
litetex
7fc0a3841a Fine tuning 2022-01-24 21:08:42 +01:00
litetex
22db4175f3 Moved reset-reCAPTCHA-cookie to cache tab and made it read-only
so that the search works as expected
2022-01-24 21:08:42 +01:00
litetex
8fc935b09d Added resource files
Forgot to commit them before...
2022-01-24 21:08:41 +01:00
litetex
07fb319e88 Applied code changes for preference search framework 2022-01-24 21:08:41 +01:00
litetex
12a78a826d Added preference search "framework" 2022-01-24 21:08:40 +01:00
litetex
4a061f20ed Code cleanup 2022-01-24 21:08:39 +01:00
litetex
f3be89b503 Abstracted methods for the Android keyboard 2022-01-24 21:08:39 +01:00
litetex
12acaf29dd Added credit to the project which inspired the preference search 2022-01-24 21:08:38 +01:00
litetex
683d9816cb Removed dead code 2022-01-24 21:08:38 +01:00
Tobi
8802582997 Merge pull request #7699 from litetex/sync-weblate-v2
Sync weblate v2
2022-01-24 20:42:20 +01:00
Ajeje Brazorf
983c98d262 Translated using Weblate (Sardinian)
Currently translated at 100.0% (640 of 640 strings)
2022-01-24 20:15:51 +01:00
Alex25820
c38389672a Translated using Weblate (Swedish)
Currently translated at 100.0% (640 of 640 strings)
2022-01-24 20:15:50 +01:00
litetex
93148400a2 Merge pull request #7689 from litetex/sync-weblate
Sync weblate
2022-01-24 19:59:44 +01:00
TobiGr
194e43f5cb Remove unused strings
report_player_errors_title and report_player_errors_summary were removed in #7482
2022-01-23 22:40:48 +01:00
retiolus
08c928e1d0 Translated using Weblate (Catalan)
Currently translated at 98.5% (631 of 640 strings)
2022-01-23 21:05:46 +01:00
subba raidu
69dacb34b9 Translated using Weblate (Telugu)
Currently translated at 66.0% (423 of 640 strings)
2022-01-23 21:05:45 +01:00
Danial Behzadi
60c3a2dc9c Translated using Weblate (Persian)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:45 +01:00
TiA4f8R
b8e5e036b2 Translated using Weblate (French)
Currently translated at 99.2% (635 of 640 strings)
2022-01-23 21:05:44 +01:00
VfBFan
2f87305f2d Translated using Weblate (German)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:43 +01:00
translator
15dc99f110 Translated using Weblate (French)
Currently translated at 99.2% (635 of 640 strings)
2022-01-23 21:05:42 +01:00
qqqq1
2d907706ea Translated using Weblate (Persian)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:40 +01:00
ssantos
f5dbb07893 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:40 +01:00
Zi
a437672dc1 Translated using Weblate (Javanese)
Currently translated at 9.5% (61 of 640 strings)
2022-01-23 21:05:39 +01:00
Yaron Shahrabani
388a4860b5 Translated using Weblate (Hebrew)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:39 +01:00
Jeff Huang
4b72ee53b0 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:39 +01:00
Agnieszka C
d77c23ed34 Translated using Weblate (Polish)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:39 +01:00
Rex_sa
31635c122e Translated using Weblate (Arabic)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:38 +01:00
Soare Robert Daniel
afef793fbb Translated using Weblate (Romanian)
Currently translated at 97.9% (627 of 640 strings)
2022-01-23 21:05:38 +01:00
Vasilis K
3bc2ec90ef Translated using Weblate (Greek)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:38 +01:00
Sergio Varela
a3e68c93f8 Translated using Weblate (Basque)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:37 +01:00
ssantos
15e6f1cb3b Translated using Weblate (Portuguese)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:37 +01:00
S3aBreeze
89c540c520 Translated using Weblate (Russian)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:37 +01:00
mm4c
6632720bc3 Translated using Weblate (Dutch)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:37 +01:00
TiA4f8R
b5662c2d07 Translated using Weblate (French)
Currently translated at 99.2% (635 of 640 strings)
2022-01-23 21:05:36 +01:00
ssantos
0f74c2463e Translated using Weblate (Portuguese (Portugal))
Currently translated at 99.8% (639 of 640 strings)
2022-01-23 21:05:36 +01:00
MohammedSR Vevo
fdfdf94cb9 Translated using Weblate (Kurdish (Central))
Currently translated at 99.2% (635 of 640 strings)
2022-01-23 21:05:36 +01:00
Mikkel
8595078053 Translated using Weblate (Danish)
Currently translated at 51.2% (328 of 640 strings)
2022-01-23 21:05:36 +01:00
Priit Jõerüüt
80be089ca9 Translated using Weblate (Estonian)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:35 +01:00
Karl Tammik
96ab2f855e Translated using Weblate (Estonian)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:35 +01:00
Ihor Hordiichuk
4206ae84c1 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:35 +01:00
Mohammed Anas
2f21523da9 Translated using Weblate (Arabic)
Currently translated at 99.6% (638 of 640 strings)
2022-01-23 21:05:35 +01:00
Daniel
6c1222ea32 Translated using Weblate (Romanian)
Currently translated at 96.4% (617 of 640 strings)
2022-01-23 21:05:34 +01:00
ssantos
ba50de236c Translated using Weblate (Portuguese)
Currently translated at 99.8% (639 of 640 strings)
2022-01-23 21:05:34 +01:00
translator
bef8882a7c Translated using Weblate (French)
Currently translated at 99.2% (635 of 640 strings)
2022-01-23 21:05:34 +01:00
Allan Nordhøy
0d8b7e23e7 Translated using Weblate (English)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:34 +01:00
retiolus
864c19e7dc Translated using Weblate (Catalan)
Currently translated at 94.8% (607 of 640 strings)
2022-01-23 21:05:34 +01:00
subba raidu
4b0ed9de5d Translated using Weblate (Telugu)
Currently translated at 63.5% (407 of 640 strings)
2022-01-23 21:05:33 +01:00
ToldYouThat
d18a34b766 Translated using Weblate (Turkish)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:33 +01:00
zeritti
0cf24c5d36 Translated using Weblate (Czech)
Currently translated at 100.0% (640 of 640 strings)
2022-01-23 21:05:33 +01:00
Hosted Weblate
fa293e3415 Translated using Weblate (Telugu)
Currently translated at 58.4% (374 of 640 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Sardinian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 94.8% (607 of 640 strings)

Translated using Weblate (Swedish)

Currently translated at 99.6% (638 of 640 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Persian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Greek)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Basque)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Japanese)

Currently translated at 99.5% (637 of 640 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (German)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (German)

Currently translated at 100.0% (640 of 640 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (62 of 62 strings)

Translated using Weblate (Swedish)

Currently translated at 25.8% (16 of 62 strings)

Translated using Weblate (Portuguese)

Currently translated at 67.7% (42 of 62 strings)

Translated using Weblate (Ukrainian)

Currently translated at 82.2% (51 of 62 strings)

Translated using Weblate (Telugu)

Currently translated at 51.4% (328 of 638 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Czech)

Currently translated at 97.1% (620 of 638 strings)

Translated using Weblate (Japanese)

Currently translated at 99.2% (633 of 638 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (French)

Currently translated at 99.5% (635 of 638 strings)

Translated using Weblate (French)

Currently translated at 99.5% (635 of 638 strings)

Translated using Weblate (Santali)

Currently translated at 13.9% (89 of 638 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (62 of 62 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 59.6% (37 of 62 strings)

Translated using Weblate (Portuguese (Portugal))

Currently translated at 66.1% (41 of 62 strings)

Translated using Weblate (Persian)

Currently translated at 62.9% (39 of 62 strings)

Translated using Weblate (Spanish)

Currently translated at 58.0% (36 of 62 strings)

Translated using Weblate (Dutch)

Currently translated at 12.9% (8 of 62 strings)

Translated using Weblate (Hebrew)

Currently translated at 51.6% (32 of 62 strings)

Translated using Weblate (Portuguese)

Currently translated at 66.1% (41 of 62 strings)

Translated using Weblate (Ukrainian)

Currently translated at 80.6% (50 of 62 strings)

Translated using Weblate (Dutch)

Currently translated at 98.4% (628 of 638 strings)

Translated using Weblate (Hindi)

Currently translated at 4.9% (3 of 61 strings)

Translated using Weblate (Hungarian)

Currently translated at 6.5% (4 of 61 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Russian)

Currently translated at 99.8% (637 of 638 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (French)

Currently translated at 99.3% (634 of 638 strings)

Translated using Weblate (Hungarian)

Currently translated at 6.5% (4 of 61 strings)

Translated using Weblate (Hungarian)

Currently translated at 6.5% (4 of 61 strings)

Translated using Weblate (Hungarian)

Currently translated at 4.9% (3 of 61 strings)

Translated using Weblate (Telugu)

Currently translated at 51.0% (326 of 638 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Swedish)

Currently translated at 24.5% (15 of 61 strings)

Translated using Weblate (Portuguese (Portugal))

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Sardinian)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Croatian)

Currently translated at 98.7% (630 of 638 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (637 of 638 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Hebrew)

Currently translated at 99.0% (632 of 638 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Greek)

Currently translated at 100.0% (638 of 638 strings)

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

Currently translated at 58.4% (373 of 638 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (638 of 638 strings)

Added translation using Weblate (English (Middle))

Translated using Weblate (Dutch)

Currently translated at 11.4% (7 of 61 strings)

Translated using Weblate (Telugu)

Currently translated at 50.6% (323 of 638 strings)

Translated using Weblate (Hebrew)

Currently translated at 97.9% (625 of 638 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Persian)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (Greek)

Currently translated at 99.8% (637 of 638 strings)

Translated using Weblate (Japanese)

Currently translated at 98.5% (629 of 638 strings)

Translated using Weblate (Russian)

Currently translated at 98.1% (626 of 638 strings)

Translated using Weblate (French)

Currently translated at 98.5% (629 of 638 strings)

Translated using Weblate (Spanish)

Currently translated at 99.0% (632 of 638 strings)

Translated using Weblate (German)

Currently translated at 100.0% (638 of 638 strings)

Translated using Weblate (English)

Currently translated at 100.0% (631 of 631 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (631 of 631 strings)

Translated using Weblate (French)

Currently translated at 99.6% (629 of 631 strings)

Translated using Weblate (Telugu)

Currently translated at 43.2% (273 of 631 strings)

Translated using Weblate (Japanese)

Currently translated at 99.8% (630 of 631 strings)

Translated using Weblate (French)

Currently translated at 99.6% (629 of 631 strings)

Co-authored-by: Abhishek Kumar <abhi7737-22@yahoo.com>
Co-authored-by: Agnieszka C <aga_04@o2.pl>
Co-authored-by: AioiLight <info@aioilight.space>
Co-authored-by: Ajeje Brazorf <lmelonimamo@yahoo.it>
Co-authored-by: Alex25820 <alexs25820@gmail.com>
Co-authored-by: Alfonso Scarpino <alfonso.scarpino@gmail.com>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Andreas P <andreas.polnas93@hotmail.com>
Co-authored-by: Andrey F <firsan777@mail.ru>
Co-authored-by: Balázs Meskó <meskobalazs@mailbox.org>
Co-authored-by: Boros Zsombor <zsombor2626@gmail.com>
Co-authored-by: Calcitem <calcitem@outlook.com>
Co-authored-by: Danial Behzadi <dani.behzi@ubuntu.com>
Co-authored-by: Emin Tufan Çetin <etcetin@gmail.com>
Co-authored-by: Florian <flo.site@zaclys.net>
Co-authored-by: GnuPGを使うべきだ <dieeeazpnnqbpddh@cock.email>
Co-authored-by: Gontzal Manuel Pujana Onaindia <thadahdenyse@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: JY3 <GeeyunJY3@gmail.com>
Co-authored-by: Jeff Huang <s8321414@gmail.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Name Protected <notemailprotected@protonmail.com>
Co-authored-by: Prasanta-Hembram <Prasantahembram720@gmail.com>
Co-authored-by: Ray <ray.cfu@protonmail.com>
Co-authored-by: Retrial <giwrgosmant@gmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Ricardo <contatorms7@tutamail.com>
Co-authored-by: S3aBreeze <paperwork@evilcorp.ltd>
Co-authored-by: TiA4f8R <avdivers84@gmail.com>
Co-authored-by: Vasilis K <skyhirules@gmail.com>
Co-authored-by: VfBFan <drop0815@posteo.de>
Co-authored-by: Yaron Shahrabani <sh.yaron@gmail.com>
Co-authored-by: Yuki Monkey <ymonkey32@gmail.com>
Co-authored-by: bomzhellino <adm.bomzh@gmail.com>
Co-authored-by: bruh <quangtrung02hn16@gmail.com>
Co-authored-by: chr56 <chr0056@gmail.com>
Co-authored-by: evfjunior <evfjunior@protonmail.com>
Co-authored-by: mm4c <oldblue@vivaldi.net>
Co-authored-by: nautilusx <translate@disroot.org>
Co-authored-by: ndrnry <ondernuray@gmail.com>
Co-authored-by: nzgha <nzgha@runbox.com>
Co-authored-by: nzgha <nzghafoss.ldxwe@slmail.me>
Co-authored-by: pjammo <adrianoghr@hotmail.it>
Co-authored-by: ssantos <ssantos@web.de>
Co-authored-by: subba raidu <raidu4u@gmail.com>
Co-authored-by: translator <kvb@tuta.io>
Co-authored-by: wmd arg <wmdarg3@gmail.com>
Co-authored-by: zmni <zmni@outlook.com>
Co-authored-by: 刘韬 <lyuutau@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/es/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fa/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/he/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hi/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hu/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/nl/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_PT/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sv/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/uk/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/
Translation: NewPipe/Metadata
2022-01-23 21:05:32 +01:00
Stypox
1531a5112c Merge pull request #7614 from litetex/revert-7568
Revert #7568
2022-01-23 15:54:55 +01:00
litetex
e127db6fa6 Simplified toast showing behavior
after feedback from the review
2022-01-23 15:34:11 +01:00
litetex
49b1649348 Revert "Merge pull request #7568 from vhouriet/vhouriet_feature_already-playing-in-backgroud"
This reverts commit ee19ea66b3, reversing
changes made to 6b490ee547.
2022-01-23 15:34:11 +01:00
Filip Czaplicki
9f503917c2 Android TV banner with text (#7566)
The banner was made by @AioiLight.
2022-01-22 20:29:12 +03:00
litetex
54ef604569 Improved docs 2022-01-21 22:49:25 +01:00
litetex
30ce906f72 Apply seek conditions based on direction
* When rewinding: Check if <0,5s
* When fast-forwarding: Check if player has completed or the current playback has ended

This allows rewinding on the endscreen
2022-01-21 22:49:25 +01:00
litetex
1c20eabb48 Code cleanup 2022-01-21 22:49:25 +01:00
litetex
f8c52c4dac Fixed SonarLint problems
* Removed alphaRelativeDuration as there is no use for it
2022-01-21 22:49:24 +01:00
litetex
345ba74d58 Fixed naming 2022-01-21 22:49:24 +01:00
litetex
d2aaf152a0 Removed related import 2022-01-21 22:49:24 +01:00
litetex
7bf1f3dba6 Removed unused field 2022-01-21 22:49:24 +01:00
litetex
452fe3a8e2 Respect disabled animations 2022-01-21 22:49:24 +01:00
litetex
c25e523df6 Removed all animations to be consistent with the current behavior 2022-01-21 22:49:23 +01:00
litetex
65bb1dcdbf Refactored code 2022-01-21 22:49:23 +01:00
litetex
fe42206e94 Code cleanup and minimization
* Deduplicated and simplified a lot of code
* Fixed ``invalidSeekConditions`` so that it's possible to seek while the player is loading (like currently the case)
2022-01-21 22:49:23 +01:00
TobiGr
dac47d9f52 Replace NotNull annotation with NonNull annotation 2022-01-21 22:49:23 +01:00
Stypox
83a3d11f38 Small improvements to player 2022-01-21 22:49:22 +01:00
Stypox
03d5372525 Fix buttons' selectable item background not working in player 2022-01-21 22:49:22 +01:00
Stypox
a454a41b51 Fix controls not hiding correctly when switching player 2022-01-21 22:49:22 +01:00
Stypox
95631dba46 Convert SecondsView from kotlin synthetics to view binding 2022-01-21 22:49:22 +01:00
Stypox
ee827407aa Fix seek triangles not visible on API 19 2022-01-21 22:49:22 +01:00
vkay94
3aebfa22e9 SeekOverlay: Switch to merge for SecondsView and other adjustments 2022-01-21 22:49:21 +01:00
vkay94
72eb3b4415 SeekOverlay: Add seek overlay logic to player 2022-01-21 22:49:21 +01:00
vkay94
3a40759cd2 SeekOverlay: Add Views 2022-01-21 22:49:21 +01:00
litetex
6f44ced7b6 Merge pull request #7672 from Stypox/fix-froid-icon
Add app icon to fastlane metadata
2022-01-21 22:35:48 +01:00
litetex
81843ddb6e Merge pull request #7670 from XiangRongLin/search_history_test
Ensure order of search history entries in tests
2022-01-21 22:34:48 +01:00
TacoTheDank
23d14ab443 Fix some gradle deprecations 2022-01-21 16:25:11 -05:00
litetex
3d3d94655b Fixed imports 2022-01-21 22:19:52 +01:00
litetex
a6515d5450 Moved timeout control from the tests to the CI pipeline
How fast a tests is executed on a shared CI pipeline is not predictable as the build might be throttled because other builds are running.
Therefore adding extremely short timeouts inside the tests - where they can't be changed - is a bad idea.
Removed them for now.
2022-01-21 22:15:34 +01:00
litetex
2d0da2c7a4 Merge pull request #7317 from TacoTheDank/ignoreStrings
Some untranslatable string improvements
2022-01-21 20:57:45 +01:00
akamayu-ouo
f05affa984 Add traditional Chinese README (#7618)
* Add traditional Chinese README
2022-01-21 20:56:14 +01:00
XiangRongLin
cd265fc31f Make SearchHistoryEntry.kt fields nullable to match java version (#7674) 2022-01-21 16:01:11 +00:00
XiangRongLin
3c21be8fa5 use constant instead of now 2022-01-20 19:14:47 +01:00
litetex
f681b0bb5a Merge pull request #7648 from mhmdanas/small-refactors
Fix false warning
2022-01-19 19:48:07 +01:00
XiangRongLin
d7fbddf6f8 Merge pull request #7668 from litetex/fix-video-reset-on-player-switch
Workaround: Set recovery before switching player
2022-01-19 16:45:10 +01:00
Stypox
993c34911a Add app icon to fastlane metadata
For some reason F-Droid decided not to grab it from Android metadata anymore
2022-01-19 12:03:46 +01:00
XiangRongLin
4a7cfd1a6c Ensure order of search history entries in tests 2022-01-18 18:36:43 +01:00
mhmdanas
402990dd9d Fix false warning 2022-01-18 07:40:59 +03:00
litetex
41faf70da1 Workaround: Set recovery before switching player
Quick fix
2022-01-17 20:52:07 +01:00
litetex
15e3b6301c Merge pull request #7662 from TiA4f8R/fix-npe-share-button-playlists
Fix crash when sharing a playlist which is loading
2022-01-16 19:47:55 +01:00
XiangRongLin
5b9c28b93b Replace JUnit asserts with AssertJ in HistoryRecordManagerTest (#7654)
* Replace JUnit asserts with AssertJ in HistoryRecordManagerTest

They provide a wider range of assertions, which allow for more detailed error messages.
Also convert SearchHistoryEntry to kotlin data class for better error messages, since toString() is implemented.

Co-authored-by: Mohammed Anas <triallax@tutanota.com>
2022-01-16 09:10:45 +01:00
TiA4f8R
6672169707 Fix NullPointerException when sharing a playlist which is loading
Prevent a NullPointerException by adding a null check for currentInfo when sharing a playlist.
2022-01-15 21:19:04 +01:00
XiangRongLin
9ff1baefde Merge pull request #7636 from litetex/show-ci-android-test-failures
CI: Upload test-report when an error occurs
2022-01-10 09:41:12 +01:00
litetex
552734faa5 CI: Upload test-report when an error occurs 2022-01-09 18:09:47 +01:00
TacoTheDank
7268e04361 Remove redundant XML attributes in settings_keys 2022-01-07 21:26:51 -05:00
TacoTheDank
45d8fef00c Update F-Droid VLC link 2022-01-07 21:24:25 -05:00
TacoTheDank
0f83497284 Move untranslatable strings to a donottranslate file 2022-01-07 21:24:01 -05:00
Stypox
1475ff805f Merge pull request #7619 from litetex/removed-list_thumbnail_view_description
Removed "list_thumbnail_view_description"
2022-01-07 22:10:27 +01:00
Stypox
7907182e7e Merge pull request #7036 from Douile/fix/queue-metadata
Load full stream info when enqueuing a stream
2022-01-07 21:57:30 +01:00
litetex
0f457127df Removed "list_thumbnail_view_description"
due to accessibility problems
2022-01-04 16:00:01 +01:00
Douile
064242d962 Remove unecessary interface InfoCallback
Co-authored-by: Stypox <stypox@pm.me>

Replace the unecessary callback interface InfoCallback in favour of the
standard type Consumer<SinglePlayQueue>
2022-01-03 17:52:27 +00:00
litetex
ddcbe27fd3 Fixed search not accepting key input after closing player overlay (#7607)
* Fixed search not accepting key input after closing player overlay

* Made comments easier to understand

* More comments
2022-01-03 11:52:08 +01:00
litetex
ee19ea66b3 Merge pull request #7568 from vhouriet/vhouriet_feature_already-playing-in-backgroud
Add Already playing in background toast
2021-12-31 14:54:05 +01:00
litetex
6b490ee547 Merge pull request #7582 from Jaspann/sub-channel-tumbnail-view-fix
Fixes view of sub-channel icon when not in use
2021-12-31 14:52:32 +01:00
litetex
e127697fff Merge pull request #7589 from litetex/bump-extractor
Updated NewPipeExtractor
2021-12-29 14:44:51 +01:00
Jaspann
558c9147a2 Move sub icon visibility line 2021-12-28 15:54:36 -05:00
litetex
4147c7c1d1 Updated NewPipeExtractor 2021-12-27 18:41:53 +01:00
Tobi
45ef9b0278 Merge pull request #7577 from dkramer95/feature/pinned-comment
Added ability to see pinned comment
2021-12-27 16:51:36 +01:00
litetex
fc0e709817 Fixed usage of wrong string 2021-12-27 00:14:04 +01:00
litetex
b67bf16d4f Minified code 2021-12-26 23:57:54 +01:00
William Parker
fb3be544ce Fixed code styling 2021-12-26 00:12:48 -05:00
Jaspann
53f5741317 Fixes view of sub-channel icon when not in use 2021-12-25 18:10:05 -05:00
David Kramer
07015973d2 Added ability to see pinned comment 2021-12-24 11:29:34 -06:00
Tobi
215880207e Merge pull request #7562 from TeamNewPipe/code-quality
Small improvements to code quality and readability
2021-12-23 23:54:29 +01:00
TobiGr
41c4ab5739 Merge branch 'master' into dev 2021-12-23 23:41:37 +01:00
TobiGr
ff8868f6a3 NewPipe version 0.21.15 (981) 2021-12-23 23:41:20 +01:00
Robin
8c6e37d1d1 Disable media tunneling on Philips QM16XE 2021-12-23 23:35:04 +01:00
litetex
c90237c14c Removed/Reverted MediaParser support (Android 11+) due to bugs 2021-12-23 23:33:55 +01:00
vhouriet
989bcbf895 Add Already playing in background toast 2021-12-23 22:12:38 +01:00
XiangRongLin
19dd9d266a Merge pull request #6855 from TeamNewPipe/fix/inspection
Fix readme link
2021-12-23 11:47:03 +01:00
XiangRongLin
05370dbb94 Merge pull request #7556 from Jaspann/improve-hashtags
Fixes hashtags that use non-English characters.
2021-12-23 11:45:52 +01:00
TobiGr
f3edc69897 Fix incorrect link in Japanese README 2021-12-22 21:16:45 +01:00
Robin
f6cad2d9cf Merge pull request #7555 from litetex/remove-mediaparser
Remove/Revert MediaParser support (Android 11+) due to bugs
2021-12-22 17:32:28 +01:00
XiangRongLin
dc67628ba5 Log test-android CI job in stacktrace mode 2021-12-22 09:55:16 +01:00
TobiGr
37b8a9375f Small improvements to code quality and readability
Add annotations to methods and parameters.
Replace Jetbrains' @NotNull with Androidx' @NonNull annotatiation.
Make class variables static if possible.
Use constants for some Strings.
Simplify if conditions.
2021-12-21 20:55:41 +01:00
TobiGr
d71af9a625 Introduce constants for some Strings that indicate no data in Tab class 2021-12-21 20:53:17 +01:00
TobiGr
a163d5461d Make PlayerHolder.bound private 2021-12-21 20:51:18 +01:00
Jaspann
a274baf5cd Adds comment to HASHTAGS_PATTERN 2021-12-20 14:13:40 -05:00
XiangRongLin
96eb1425f8 Merge pull request #7552 from XiangRongLin/readd_sonar
Readd sonar CI job
2021-12-20 03:32:28 -05:00
Jaspann
361760be0a Allows multilingual support in hashtags 2021-12-19 20:33:55 -05:00
litetex
eea2768633 Removed/Reverted MediaParser support (Android 11+) due to bugs 2021-12-19 20:16:10 +01:00
Robin
d3562c70f5 Merge pull request #7451 from Cheechaii/respect-cutout-in-multiwindow
Respect cutouts when playing in MultiWindow
2021-12-19 13:23:28 +01:00
XiangRongLin
e06342eacf Readd sonar CI job 2021-12-19 12:18:37 +01:00
litetex
e8d909553d Merge pull request #7499 from TacoTheDank/bumpVersions
Update a bunch of libraries
2021-12-18 22:52:11 +01:00
litetex
b21d231e3a Merge pull request #7452 from litetex/show-alert-when-file-manager-not-found
Show an alert-dialog when no appropriate file-manager was found
2021-12-14 20:01:02 +01:00
litetex
4058277b7a Merge pull request #7482 from TeamNewPipe/unify-error-reporting
Unify error reporting and add error notification
2021-12-14 19:58:41 +01:00
XiangRongLin
dd9772cde2 Merge pull request #7491 from Stypox/fix-search-order
Fix order of local search results
2021-12-14 09:07:17 -05:00
TacoTheDank
a924f819a9 Update a bunch of libraries 2021-12-12 21:26:59 -05:00
TacoTheDank
156bbad5b5 Update Gradle 2021-12-12 20:03:42 -05:00
Stypox
2963cd5c6e Add HistoryRecordManagerTest 2021-12-12 16:00:16 +01:00
Stypox
7d6688f497 Add DatabaseMocker to mock NewPipeDatabase 2021-12-12 15:59:04 +01:00
litetex
b056faa97f Merge pull request #7500 from TacoTheDank/bumpKtlint
Bump ktlint, Checkstyle, Java version
2021-12-12 15:07:24 +01:00
Douile
3ff00ff50e Fix lambda code formatting
Co-authored-by: Stypox <stypox@pm.me>
2021-12-12 13:04:32 +00:00
Tom
baee915db5 Remove unecessary line
Co-authored-by: Stypox <stypox@pm.me>
2021-12-12 12:51:01 +00:00
Tobi
4e6dcc693b Merge pull request #7524 from TeamNewPipe/master
Sync changes from ``master`` back to ``dev``
2021-12-11 17:32:29 +01:00
Cheechaii
c92a90749e Respect cutouts when playing in MultiWindow 2021-12-09 20:58:05 +01:00
litetex
e806f8c4e6 Android 10+ only allows SAF -> Respect that in the dialog 2021-12-08 20:22:26 +01:00
Stypox
8a5e2ffa57 Fix order of local search results 2021-12-08 13:59:32 +01:00
litetex
ad405d9e0b Merge pull request #7481 from mhmdanas/add-fsfe-tube-link-support
Add FSFE-Tube PeerTube instance
2021-12-07 21:55:17 +01:00
litetex
b9ee14ac30 Update string-resource
Co-authored-by: Stypox <stypox@pm.me>
2021-12-07 21:31:12 +01:00
Stypox
bb49b1cfb1 Add javadoc to ErrorUtil and ErrorActivity 2021-12-07 18:14:53 +01:00
litetex
4fc9443b4f Merge pull request #7497 from TeamNewPipe/fix-qm16xe
Disable media tunneling on Philips QM16XE
2021-12-06 20:54:07 +01:00
litetex
581ede022e Merge pull request #7498 from litetex/fix-get-it-on-fdroid
Updated/Fixed "Get it on F-Droid"
2021-12-06 20:35:45 +01:00
TacoTheDank
f86fc03c46 Update Checkstyle to 9.2 2021-12-04 21:30:23 -05:00
TacoTheDank
75db002369 Update ktlint to 0.43.2 2021-12-04 21:22:29 -05:00
TacoTheDank
dbfa4e554b Update Sonarqube to 3.3 2021-12-04 21:22:15 -05:00
TacoTheDank
84d87a2e60 Move plugins to the DSL block 2021-12-04 21:16:37 -05:00
litetex
9e3577e77b Updated/Fixed "Get it on F-Droid" 2021-12-04 23:46:40 +01:00
Robin
41a0dc1abd Disable media tunneling on Philips QM16XE 2021-12-04 22:23:09 +01:00
Stypox
950956ebf2 Also show a toast on error notification
since the notification is silent, also show a toast, otherwise the user is confused
2021-12-04 10:50:27 +01:00
Stypox
c000c1d455 Add debug prefs to show error snackbar/notification 2021-12-04 10:36:36 +01:00
Stypox
c8e2ab4c83 Remove PlayerErrorHandler and correctly set ErrorInfo msg 2021-12-04 10:36:36 +01:00
Stypox
397f93b079 Prevent exception from being serialized in ErrorInfo
The wrong @Decorator was put in the wrong place to mark the throwable fieldd as transient, now this is fixed and the exception is not serialized. So if a non-serializable throwable is passed, that's not an issue, since it's not going to be serialized. The need for EnsureExceptionSerializable is also gone.
2021-12-04 10:36:36 +01:00
Stypox
09d137f740 Add PendingIntent to ErrorUtil.createNotification 2021-12-04 10:36:36 +01:00
Stypox
81f740d409 Replace ErrorActivity with ErrorUtil 2021-12-04 10:36:36 +01:00
Stypox
1d2642f1e3 Create ErrorUtil class with three ways to report errors
Activity, snackbar and notification
2021-12-04 10:36:31 +01:00
Douile
7cd3603bbb Fetch sparse items when playing in background or popup 2021-12-03 22:38:03 +00:00
Douile
ec7de2a6dc Fix StreamType check, missing import, and styling errors 2021-12-03 21:53:36 +00:00
Tom
3d1a3606c9 Remove unused variable
Co-authored-by: Stypox <stypox@pm.me>
2021-12-03 21:30:26 +00:00
Douile
6472e9b6b6 Remove unused code 2021-12-03 21:29:34 +00:00
mhmdanas
7adebbe989 Add FSFE-Tube PeerTube instance 2021-12-01 20:24:53 +03:00
litetex
744cfe5672 Removed unused import 2021-11-29 21:13:22 +01:00
litetex
17724a901c Removed annotations due to wrong warnings 2021-11-29 21:03:59 +01:00
litetex
b2323859e5 Refactoring + deduplicated code 2021-11-28 14:07:45 +01:00
litetex
68e7fcf8ee Fixed typos 2021-11-27 23:39:17 +01:00
litetex
f78983b16b Show an alert/dialog when no appropriate file-manager was found 2021-11-27 15:52:54 +01:00
Tom
91611fcae4 Don't fetch uneeded stream info for live streams
Co-authored-by: Stypox <stypox@pm.me>
2021-11-23 15:22:11 +00:00
Douile
bc2f0f9f3e Update stream state in database after loading 2021-10-28 01:11:53 +01:00
Douile
62d36126ea Load full stream info when enqueuing a stream
This commit calls getStreamInfo causing a full network fetch of stream
info (I believe only if required) when adding a stream item to the
queue. This should prevent UI issues of missing metadata when queueing
videos that have been fast-loaded and are missing metadata.

Fixes #7035
2021-09-19 00:15:56 +01:00
391 changed files with 8058 additions and 3019 deletions

1
.github/FUNDING.yml vendored
View File

@@ -1 +1,2 @@
liberapay: TeamNewPipe
custom: 'https://newpipe.net/donate/'

View File

@@ -1,65 +0,0 @@
---
name: Bug report
about: Create a bug report to help us improve
labels: bug
assignees: ''
---
<!--
Oh no, a bug! It happens. Thanks for reporting an issue with NewPipe. To make it easier for us to help you please enter detailed information in the template we have provided below. If a section isn't relevant, just delete it, though it would be helpful to still provide as much detail as possible.
-->
<!-- IF YOU DON'T FILL IN THE TEMPLATE PROPERLY, YOUR ISSUE IS LIABLE TO BE CLOSED. If you feel tired/lazy right now, open your issue some other time. We'll wait. -->
<!-- The comments between these brackets won't show up in the submitted issue (as you can see in the Preview). -->
### Checklist
<!-- This checklist is COMPULSORY. The first box has been checked for you to show you how it is done. -->
- [x] I am using the latest version - x.xx.x <!-- Check https://github.com/TeamNewPipe/NewPipe/releases -->
- [ ] I checked, but didn't find any duplicates (open OR closed) of this issue in the repo. <!-- Seriously, check. O_O -->
- [ ] I have read the contribution guidelines given at https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md.
- [ ] This issue contains only one bug. I will open one issue for every bug report I want to file.
### Steps to reproduce the bug
<!--
1. Go to '...'
2. Press on '....'
3. Swipe down to '....'
-->
<!-- If you can't cause the bug to show up again reliably (and hence don't have a proper set of steps to give us), please still try to give as many details as possible on how you think you encountered the bug. -->
### Actual behavior
<!-- Tell us what happens with the steps given above. -->
### Expected behavior
<!-- Tell us what you expect to happen. -->
### Screenshots/Screen recordings
<!-- If applicable, add screenshots or a screen recording to help explain your problem. GitHub supports uploading them directly in the issue text box. If your file is too big for Github to accept, feel free to paste a link from an image/video hoster here instead. -->
<!-- DON'T POST SCREENSHOTS OF THE ERROR PAGE. Use the buttons given on the error page to paste the error as text in the Logs section below. -->
### Logs
<!-- If your bug includes a crash (where you're shown the Error Report page with a bunch of info), tap on "Copy formatted report" at the bottom and paste it here: -->
<!-- That's right, here! -->
<!-- Please fill this section if you did not provide a log generated by NewPipe -->
### Device info
- Android version/Custom ROM version:
- Device model:

113
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@@ -0,0 +1,113 @@
name: Bug report
description: Create a bug report to help us improve
labels: [bug]
body:
- type: markdown
attributes:
value: |
Thank you for helping to make NewPipe better by reporting a bug. :hugs:
Please fill in as much information as possible about your bug so that we don't have to play "information ping-pong" and can help you immediately.
- type: checkboxes
id: checklist
attributes:
label: "Checklist"
options:
- label: "I am able to reproduce the bug with the [latest version](https://github.com/TeamNewPipe/NewPipe/releases/latest)."
required: true
- label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to."
required: true
- label: "I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise."
required: true
- label: "This issue contains only one bug."
required: true
- label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)."
required: true
- type: input
id: app-version
attributes:
label: Affected version
description: "In which NewPipe version did you encounter the bug?"
placeholder: "x.xx.x - Can be seen in the app from the 'About' section in the sidebar"
validations:
required: true
- type: textarea
id: steps-to-reproduce
attributes:
label: Steps to reproduce the bug
description: |
What did you do for the bug to show up?
If you can't cause the bug to show up again reliably (and hence don't have a proper set of steps to give us), please still try to give as many details as possible on how you think you encountered the bug.
placeholder: |
1. Go to '...'
2. Press on '....'
3. Swipe down to '....'
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: Expected behavior
description: |
Tell us what you expect to happen.
- type: textarea
id: actual-behavior
attributes:
label: Actual behavior
description: |
Tell us what happens with the steps given above.
- type: textarea
id: screen-media
attributes:
label: Screenshots/Screen recordings
description: |
A picture or video is worth a thousand words.
If applicable, add screenshots or a screen recording to help explain your problem.
GitHub supports uploading them directly in the text box.
If your file is too big for Github to accept, try to compress it (ZIP-file) or feel free to paste a link to an image/video hoster here instead.
:heavy_exclamation_mark: DON'T POST SCREENSHOTS OF THE ERROR PAGE.
Instead, follow the instructions in the "Logs" section below.
- type: textarea
id: logs
attributes:
label: Logs
description: |
If your bug includes a crash (where you're shown the Error Report page with a bunch of info), tap on "Copy formatted report" at the bottom and paste it here.
- type: input
id: device-os-info
attributes:
label: Affected Android/Custom ROM version
description: |
With what operating system (+ version) did you encounter the bug?
placeholder: "Example: Android 12 / LineageOS 18.1"
- type: input
id: device-model-info
attributes:
label: Affected device model
description: |
On what device did you encounter the bug?
placeholder: "Example: Huawei P20 lite (ANE-LX1) / Samsung Galaxy S20"
- type: textarea
id: additional-information
attributes:
label: Additional information
description: |
Any other information you'd like to include, for instance that
* the affected device is foldable or a TV
* you have disabled all animations on your device
* your cat disabled your network connection
* ...

View File

@@ -1,24 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
labels: enhancement
assignees: ''
---
<!-- IF YOU DON'T FILL IN THE TEMPLATE PROPERLY, YOUR ISSUE IS LIABLE TO BE CLOSED. If you are currently unable to do so for any reason, open your issue some other time. We'll wait. -->
<!-- The comments between these brackets won't show up in the submitted issue (as you can see in the Preview tab). -->
### Checklist
<!-- This checklist is COMPULSORY. The first box has been checked for you to show you how it is done. -->
- [x] I checked, but didn't find any duplicates (open OR closed) of this issue in the repo. <!-- Seriously, check. O_O -->
- [ ] I have read the contribution guidelines given at https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md.
- [ ] This issue contains only one feature request. I will open one issue for every feature I want to request.
#### What feature do you want?
<!-- Explain how you want the app's look or behavior to change to suit your needs. -->
#### Why do you want this feature?
<!-- Describe any problem or limitation you come across while using the app which would be solved by this feature. -->

View File

@@ -0,0 +1,51 @@
name: Feature request
description: Suggest an idea for this project
labels: [enhancement]
body:
- type: markdown
attributes:
value: |
Thank you for helping to make NewPipe better by suggesting a feature. :hugs:
Your ideas are highly welcome! The app is made for you, the users, after all.
- type: checkboxes
id: checklist
attributes:
label: "Checklist"
options:
- label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to."
required: true
- label: "I'm aware that this is a request for NewPipe itself and that requests for adding a new service need to be made at [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor/issues)."
required: true
- label: "I have taken the time to fill in all the required details. I understand that the feature request will be dismissed otherwise."
required: true
- label: "This issue contains only one feature request."
required: true
- label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)."
required: true
- type: textarea
id: feature-description
attributes:
label: Feature description
description: |
Explain how you want the app's look or behavior to change to suit your needs.
validations:
required: true
- type: textarea
id: why-is-the-feature-requested
attributes:
label: Why do you want this feature?
description: |
Describe any problem or limitation you come across while using the app which would be solved by this feature.
validations:
required: true
- type: textarea
id: additional-information
attributes:
label: Additional information
description: Any other information you'd like to include, for instance sketches, mockups, pictures of cats, etc.

View File

@@ -1,24 +0,0 @@
---
name: Question
about: Ask about anything NewPipe-related
labels: question
assignees: ''
---
<!-- IF YOU DON'T FILL IN THE TEMPLATE PROPERLY, YOUR ISSUE IS LIABLE TO BE CLOSED. If you feel tired/lazy right now, open your issue some other time. We'll wait. -->
<!-- The comments between these brackets won't show up in the submitted issue (as you can see in the Preview). -->
### Checklist
<!-- This checklist is COMPULSORY. The first box has been checked for you to show you how it is done. -->
- [x] I checked, but didn't find any duplicates (open OR closed) of this issue in the repo. <!-- Seriously, check. O_O (If there's already an issue but you'd like to see if something changed, just make a comment on the issue instead of opening a new one.) -->
- [ ] I have read the contribution guidelines given at https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md.
#### What's your question(s)?
#### Additional context
<!-- Add any other context, like screenshots or links, about the question here.
Example: *Here's a photo of my cat!* -->

35
.github/ISSUE_TEMPLATE/question.yml vendored Normal file
View File

@@ -0,0 +1,35 @@
name: Question
description: Ask about anything NewPipe-related
labels: [question]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this issue! :hugs:
Note that you can also ask questions on our [IRC channel](https://web.libera.chat/#newpipe).
- type: checkboxes
id: checklist
attributes:
label: "Checklist"
options:
- label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to."
required: true
- label: "I have taken the time to fill in all the required details. I understand that the question will be dismissed otherwise."
required: true
- label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)."
required: true
- type: textarea
id: what-is-the-question
attributes:
label: What is/are your question(s)?
validations:
required: true
- type: textarea
id: additional-information
attributes:
label: Additional information
description: Any other information you'd like to include, for instance sketches, mockups, pictures of cats, etc.

View File

@@ -7,19 +7,25 @@ on:
- dev
- master
paths-ignore:
- 'README*.md'
- 'README.md'
- 'doc/**'
- 'fastlane/**'
- 'assets/**'
- '.github/**/*.md'
- '.github/FUNDING.yml'
- '.github/ISSUE_TEMPLATE/**'
push:
branches:
- dev
- master
paths-ignore:
- 'README*.md'
- 'README.md'
- 'doc/**'
- 'fastlane/**'
- 'assets/**'
- '.github/**/*.md'
- '.github/FUNDING.yml'
- '.github/ISSUE_TEMPLATE/**'
jobs:
build-and-test-jvm:
@@ -39,7 +45,7 @@ jobs:
java-version: 11
distribution: "temurin"
cache: 'gradle'
- name: Build debug APK and run jvm tests
run: ./gradlew assembleDebug lintDebug testDebugUnitTest --stacktrace -DskipFormatKtlint
@@ -52,9 +58,10 @@ jobs:
test-android:
# macos has hardware acceleration. See android-emulator-runner action
runs-on: macos-latest
timeout-minutes: 20
strategy:
matrix:
# api-level 19 is min sdk, but throws errors related to desugaring
# api-level 19 is min sdk, but throws errors related to desugaring
api-level: [ 21, 29 ]
steps:
- uses: actions/checkout@v2
@@ -72,31 +79,38 @@ jobs:
api-level: ${{ matrix.api-level }}
# workaround to emulator bug: https://github.com/ReactiveCircus/android-emulator-runner/issues/160
emulator-build: 7425822
script: ./gradlew connectedCheck
script: ./gradlew connectedCheck --stacktrace
- name: Upload test report when tests fail # because the printed out stacktrace (console) is too short, see also #7553
uses: actions/upload-artifact@v2
if: failure()
with:
name: android-test-report-api${{ matrix.api-level }}
path: app/build/reports/androidTests/connected/**
# sonar:
# runs-on: ubuntu-latest
# steps:
# - uses: actions/checkout@v2
# with:
# fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
sonar:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
# - name: Set up JDK 11
# uses: actions/setup-java@v2
# with:
# java-version: 11 # Sonar requires JDK 11
# distribution: "temurin"
# cache: 'gradle'
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: 11 # Sonar requires JDK 11
distribution: "temurin"
cache: 'gradle'
# - name: Cache SonarCloud packages
# uses: actions/cache@v2
# with:
# path: ~/.sonar/cache
# key: ${{ runner.os }}-sonar
# restore-keys: ${{ runner.os }}-sonar
- name: Cache SonarCloud packages
uses: actions/cache@v2
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
# - name: Build and analyze
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
# SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
# run: ./gradlew build sonarqube --info
- name: Build and analyze
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: ./gradlew build sonarqube --info

130
.github/workflows/image-minimizer.js vendored Normal file
View File

@@ -0,0 +1,130 @@
/*
* Script for minimizing big images (jpg,gif,png) when they are uploaded to GitHub and not edited otherwise
*/
module.exports = async ({github, context}) => {
const IGNORE_KEY = '<!-- IGNORE IMAGE MINIFY -->';
const IGNORE_ALT_NAME_END = 'ignoreImageMinify';
// Targeted maximum height
const IMG_MAX_HEIGHT_PX = 600;
// maximum width of GitHub issues/comments
const IMG_MAX_WIDTH_PX = 800;
// all images that have a lower aspect ratio (-> have a smaller width) than this will be minimized
const MIN_ASPECT_RATIO = IMG_MAX_WIDTH_PX / IMG_MAX_HEIGHT_PX
// Get the body of the image
let initialBody = null;
if (context.eventName == 'issue_comment') {
initialBody = context.payload.comment.body;
} else if (context.eventName == 'issues') {
initialBody = context.payload.issue.body;
} else {
console.log('Aborting: No body found');
return;
}
console.log(`Found body: \n${initialBody}\n`);
// Check if we should ignore the currently processing element
if (initialBody.includes(IGNORE_KEY)) {
console.log('Ignoring: Body contains IGNORE_KEY');
return;
}
// Regex for finding images (simple variant) ![ALT_TEXT](https://*.githubusercontent.com/<number>/<variousHexStringsAnd->.<fileExtension>)
const REGEX_IMAGE_LOOKUP = /\!\[(.*)\]\((https:\/\/[-a-z0-9]+\.githubusercontent\.com\/\d+\/[-0-9a-f]{32,512}\.(jpg|gif|png))\)/gm;
// Check if we found something
let foundSimpleImages = REGEX_IMAGE_LOOKUP.test(initialBody);
if (!foundSimpleImages) {
console.log('Found no simple images to process');
return;
}
console.log('Found at least one simple image to process');
// Require the probe lib for getting the image dimensions
const probe = require('probe-image-size');
var wasMatchModified = false;
// Try to find and replace the images with minimized ones
let newBody = await replaceAsync(initialBody, REGEX_IMAGE_LOOKUP, async (match, g1, g2) => {
console.log(`Found match '${match}'`);
if (g1.endsWith(IGNORE_ALT_NAME_END)) {
console.log(`Ignoring match '${match}': IGNORE_ALT_NAME_END`);
return match;
}
let shouldModify = false;
try {
console.log(`Probing ${g2}`);
let probeResult = await probe(g2);
if (probeResult == null) {
throw 'No probeResult';
}
if (probeResult.hUnits != 'px') {
throw `Unexpected probeResult.hUnits (expected px but got ${probeResult.hUnits})`;
}
if (probeResult.height <= 0) {
throw `Unexpected probeResult.height (height is invalid: ${probeResult.height})`;
}
if (probeResult.wUnits != 'px') {
throw `Unexpected probeResult.wUnits (expected px but got ${probeResult.wUnits})`;
}
if (probeResult.width <= 0) {
throw `Unexpected probeResult.width (width is invalid: ${probeResult.width})`;
}
console.log(`Probing resulted in ${probeResult.width}x${probeResult.height}px`);
shouldModify = probeResult.height > IMG_MAX_HEIGHT_PX && (probeResult.width / probeResult.height) < MIN_ASPECT_RATIO;
} catch(e) {
console.log('Probing failed:', e);
// Immediately abort
return match;
}
if (shouldModify) {
wasMatchModified = true;
console.log(`Modifying match '${match}'`);
return `<img alt="${g1}" src="${g2}" height=${IMG_MAX_HEIGHT_PX} />`;
}
console.log(`Match '${match}' is ok/will not be modified`);
return match;
});
if (!wasMatchModified) {
console.log('Nothing was modified. Skipping update');
return;
}
// Update the corresponding element
if (context.eventName == 'issue_comment') {
console.log('Updating comment with id', context.payload.comment.id);
await github.rest.issues.updateComment({
comment_id: context.payload.comment.id,
owner: context.repo.owner,
repo: context.repo.repo,
body: newBody
})
} else if (context.eventName == 'issues') {
console.log('Updating issue', context.payload.issue.number);
await github.rest.issues.update({
issue_number: context.payload.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: newBody
});
}
// Asnyc replace function from https://stackoverflow.com/a/48032528
async function replaceAsync(str, regex, asyncFn) {
const promises = [];
str.replace(regex, (match, ...args) => {
const promise = asyncFn(match, ...args);
promises.push(promise);
});
const data = await Promise.all(promises);
return str.replace(regex, () => data.shift());
}
}

29
.github/workflows/image-minimizer.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
name: Image Minimizer
on:
issue_comment:
types: [created, edited]
issues:
types: [opened, edited]
jobs:
try-minimize:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 16
- name: Install probe-image-size
run: npm i probe-image-size@7.2.3 --ignore-scripts
- name: Minimize simple images
uses: actions/github-script@v5
timeout-minutes: 3
with:
script: |
const script = require('.github/workflows/image-minimizer.js');
await script({github, context});

4
.gitignore vendored
View File

@@ -8,8 +8,8 @@ captures/
*~
.weblate
*.class
**/debug/
**/release/
app/debug/
app/release/
# vscode / eclipse files
*.classpath

View File

@@ -2,7 +2,7 @@
<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>
<p align="center"><a href="https://f-droid.org/packages/org.schabi.newpipe/"><img src="https://fdroid.gitlab.io/artwork/badge/get-it-on-en.svg" alt="Get it on F-Droid" height=80/></a></p>
<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>
@@ -17,7 +17,7 @@
<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), [Español](README.es.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md).*
*Read this in other languages: [English](README.md), [Español](doc/README.es.md), [한국어](doc/README.ko.md), [Soomaali](doc/README.so.md), [Português Brasil](doc/README.pt_BR.md), [Polski](doc/README.pl.md), [日本語](doc/README.ja.md), [Română](doc/README.ro.md), [Türkçe](doc/README.tr.md), [正體中文](doc/README.zh_TW.md).*
<b>WARNING: THIS IS A BETA VERSION, THEREFORE YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE VIA OUR GITHUB REPOSITORY.</b>
@@ -140,7 +140,7 @@ Therefore, the app does not collect any data without your consent. NewPipe's pri
## License
[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)
NewPipe is Free Software: You can use, study share and improve it at your
NewPipe is Free Software: You can use, study, share, and improve it at
will. Specifically you can redistribute and/or modify it under the terms of the
[GNU General Public License](https://www.gnu.org/licenses/gpl.html) as
published by the Free Software Foundation, either version 3 of the License, or

View File

@@ -1,24 +1,23 @@
plugins {
id "org.sonarqube" version "3.1.1"
id "com.android.application"
id "kotlin-android"
id "kotlin-kapt"
id "kotlin-parcelize"
id "checkstyle"
id "org.sonarqube" version "3.3"
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-parcelize'
apply plugin: 'kotlin-kapt'
apply plugin: 'checkstyle'
android {
compileSdkVersion 30
compileSdk 31
buildToolsVersion '30.0.3'
defaultConfig {
applicationId "org.schabi.newpipe"
resValue "string", "app_name", "NewPipe"
minSdkVersion 19
targetSdkVersion 29
versionCode 980
versionName "0.21.14"
minSdk 19
targetSdk 29
versionCode 985
versionName "0.22.2"
multiDexEnabled true
@@ -66,7 +65,7 @@ android {
}
}
lintOptions {
lint {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
@@ -80,13 +79,13 @@ android {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
encoding 'utf-8'
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8
jvmTarget = JavaVersion.VERSION_11
}
sourceSets {
@@ -99,20 +98,21 @@ android {
}
ext {
checkstyleVersion = '8.38'
checkstyleVersion = '9.2.1'
androidxLifecycleVersion = '2.3.1'
androidxRoomVersion = '2.3.0'
icepickVersion = '3.2.0'
exoPlayerVersion = '2.14.2'
googleAutoServiceVersion = '1.0'
googleAutoServiceVersion = '1.0.1'
groupieVersion = '2.10.0'
markwonVersion = '4.6.2'
leakCanaryVersion = '2.5'
stethoVersion = '1.6.0'
mockitoVersion = '3.6.0'
mockitoVersion = '4.0.0'
assertJVersion = '3.22.0'
}
configurations {
@@ -189,11 +189,11 @@ dependencies {
// name and the commit hash with the commit hash of the (pushed) commit you want to test
// This works thanks to JitPack: https://jitpack.io/
implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.21.12'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:b77c72fb8826c3ffca0be5f96b066cca0a07b1c9'
/** Checkstyle **/
checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}"
ktlint 'com.pinterest:ktlint:0.40.0'
ktlint 'com.pinterest:ktlint:0.43.2'
/** Kotlin **/
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlin_version}"
@@ -201,7 +201,7 @@ dependencies {
/** AndroidX **/
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.documentfile:documentfile:1.0.1'
implementation 'androidx.fragment:fragment-ktx:1.3.6'
@@ -220,7 +220,7 @@ dependencies {
// https://developer.android.com/jetpack/androidx/releases/viewpager2#1.1.0-alpha01
implementation 'androidx.viewpager2:viewpager2:1.1.0-beta01'
implementation 'androidx.webkit:webkit:1.4.0'
implementation 'com.google.android.material:material:1.2.1'
implementation 'com.google.android.material:material:1.4.0'
/** Third-party libraries **/
// Instance state boilerplate elimination
@@ -228,7 +228,7 @@ dependencies {
kapt "frankiesardo:icepick-processor:${icepickVersion}"
// HTML parser
implementation "org.jsoup:jsoup:1.13.1"
implementation "org.jsoup:jsoup:1.14.3"
// HTTP client
//noinspection GradleDependency --> do not update okhttp to keep supporting Android 4.4 users
@@ -260,19 +260,19 @@ dependencies {
implementation "com.nononsenseapps:filepicker:4.2.1"
// Crash reporting
implementation "ch.acra:acra-core:5.7.0"
implementation "ch.acra:acra-core:5.8.4"
// Properly restarting
implementation 'com.jakewharton:process-phoenix:2.1.2'
// Reactive extensions for Java VM
implementation "io.reactivex.rxjava3:rxjava:3.0.7"
implementation "io.reactivex.rxjava3:rxjava:3.0.13"
implementation "io.reactivex.rxjava3:rxandroid:3.0.0"
// RxJava binding APIs for Android UI widgets
implementation "com.jakewharton.rxbinding4:rxbinding:4.0.0"
// Date and time formatting
implementation "org.ocpsoft.prettytime:prettytime:5.0.1.Final"
implementation "org.ocpsoft.prettytime:prettytime:5.0.2.Final"
/** Debugging **/
// Memory leak detection
@@ -288,11 +288,10 @@ dependencies {
testImplementation "org.mockito:mockito-core:${mockitoVersion}"
testImplementation "org.mockito:mockito-inline:${mockitoVersion}"
androidTestImplementation "androidx.test.ext:junit:1.1.2"
androidTestImplementation "androidx.test.ext:junit:1.1.3"
androidTestImplementation "androidx.test:runner:1.4.0"
androidTestImplementation "androidx.room:room-testing:${androidxRoomVersion}"
androidTestImplementation "androidx.test.espresso:espresso-core:3.3.0", {
exclude module: 'support-annotations'
}
androidTestImplementation "org.assertj:assertj-core:${assertJVersion}"
}
static String getGitWorkingBranch() {

View File

@@ -0,0 +1,178 @@
package org.schabi.newpipe.local.history
import androidx.test.core.app.ApplicationProvider
import org.assertj.core.api.Assertions.assertThat
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.schabi.newpipe.database.AppDatabase
import org.schabi.newpipe.database.history.model.SearchHistoryEntry
import org.schabi.newpipe.testUtil.TestDatabase
import org.schabi.newpipe.testUtil.TrampolineSchedulerRule
import java.time.LocalDateTime
import java.time.OffsetDateTime
import java.time.ZoneOffset
class HistoryRecordManagerTest {
private lateinit var manager: HistoryRecordManager
private lateinit var database: AppDatabase
@get:Rule
val trampolineScheduler = TrampolineSchedulerRule()
@Before
fun setup() {
database = TestDatabase.createReplacingNewPipeDatabase()
manager = HistoryRecordManager(ApplicationProvider.getApplicationContext())
}
@After
fun cleanUp() {
database.close()
}
@Test
fun onSearched() {
manager.onSearched(0, "Hello").test().await().assertValue(1)
// For some reason the Flowable returned by getAll() never completes, so we can't assert
// that the number of Lists it returns is exactly 1, we can only check if the first List is
// correct. Why on earth has a Flowable been used instead of a Single for getAll()?!?
val entities = database.searchHistoryDAO().all.blockingFirst()
assertThat(entities).hasSize(1)
assertThat(entities[0].id).isEqualTo(1)
assertThat(entities[0].serviceId).isEqualTo(0)
assertThat(entities[0].search).isEqualTo("Hello")
}
@Test
fun deleteSearchHistory() {
val entries = listOf(
SearchHistoryEntry(time.minusSeconds(1), 0, "A"),
SearchHistoryEntry(time.minusSeconds(2), 2, "A"),
SearchHistoryEntry(time.minusSeconds(3), 1, "B"),
SearchHistoryEntry(time.minusSeconds(4), 0, "B"),
)
// make sure all 4 were inserted
database.searchHistoryDAO().insertAll(entries)
assertThat(database.searchHistoryDAO().all.blockingFirst()).hasSameSizeAs(entries)
// try to delete only "A" entries, "B" entries should be untouched
manager.deleteSearchHistory("A").test().await().assertValue(2)
val entities = database.searchHistoryDAO().all.blockingFirst()
assertThat(entities).hasSize(2)
assertThat(entities).usingElementComparator { o1, o2 -> if (o1.hasEqualValues(o2)) 0 else 1 }
.containsExactly(*entries.subList(2, 4).toTypedArray())
// assert that nothing happens if we delete a search query that does exist in the db
manager.deleteSearchHistory("A").test().await().assertValue(0)
val entities2 = database.searchHistoryDAO().all.blockingFirst()
assertThat(entities2).hasSize(2)
assertThat(entities2).usingElementComparator { o1, o2 -> if (o1.hasEqualValues(o2)) 0 else 1 }
.containsExactly(*entries.subList(2, 4).toTypedArray())
// delete all remaining entries
manager.deleteSearchHistory("B").test().await().assertValue(2)
assertThat(database.searchHistoryDAO().all.blockingFirst()).isEmpty()
}
@Test
fun deleteCompleteSearchHistory() {
val entries = listOf(
SearchHistoryEntry(time.minusSeconds(1), 1, "A"),
SearchHistoryEntry(time.minusSeconds(2), 2, "B"),
SearchHistoryEntry(time.minusSeconds(3), 0, "C"),
)
// make sure all 3 were inserted
database.searchHistoryDAO().insertAll(entries)
assertThat(database.searchHistoryDAO().all.blockingFirst()).hasSameSizeAs(entries)
// should remove everything
manager.deleteCompleteSearchHistory().test().await().assertValue(entries.size)
assertThat(database.searchHistoryDAO().all.blockingFirst()).isEmpty()
}
private fun insertShuffledRelatedSearches(relatedSearches: Collection<SearchHistoryEntry>) {
// shuffle to make sure the order of items returned by queries depends only on
// SearchHistoryEntry.creationDate, not on the actual insertion time, so that we can
// verify that the `ORDER BY` clause does its job
database.searchHistoryDAO().insertAll(relatedSearches.shuffled())
// make sure all entries were inserted
assertEquals(
relatedSearches.size,
database.searchHistoryDAO().all.blockingFirst().size
)
}
@Test
fun getRelatedSearches_emptyQuery() {
insertShuffledRelatedSearches(RELATED_SEARCHES_ENTRIES)
// make sure correct number of searches is returned and in correct order
val searches = manager.getRelatedSearches("", 6, 4).blockingFirst()
assertThat(searches).containsExactly(
RELATED_SEARCHES_ENTRIES[6].search, // A (even if in two places)
RELATED_SEARCHES_ENTRIES[4].search, // B
RELATED_SEARCHES_ENTRIES[5].search, // AA
RELATED_SEARCHES_ENTRIES[2].search, // BA
)
}
@Test
fun getRelatedSearches_emptyQuery_manyDuplicates() {
insertShuffledRelatedSearches(
listOf(
SearchHistoryEntry(time.minusSeconds(9), 3, "A"),
SearchHistoryEntry(time.minusSeconds(8), 3, "AB"),
SearchHistoryEntry(time.minusSeconds(7), 3, "A"),
SearchHistoryEntry(time.minusSeconds(6), 3, "A"),
SearchHistoryEntry(time.minusSeconds(5), 3, "BA"),
SearchHistoryEntry(time.minusSeconds(4), 3, "A"),
SearchHistoryEntry(time.minusSeconds(3), 3, "A"),
SearchHistoryEntry(time.minusSeconds(2), 0, "A"),
SearchHistoryEntry(time.minusSeconds(1), 2, "AA"),
)
)
val searches = manager.getRelatedSearches("", 9, 3).blockingFirst()
assertThat(searches).containsExactly("AA", "A", "BA")
}
@Test
fun getRelatedSearched_nonEmptyQuery() {
insertShuffledRelatedSearches(RELATED_SEARCHES_ENTRIES)
// make sure correct number of searches is returned and in correct order
val searches = manager.getRelatedSearches("A", 3, 5).blockingFirst()
assertThat(searches).containsExactly(
RELATED_SEARCHES_ENTRIES[6].search, // A (even if in two places)
RELATED_SEARCHES_ENTRIES[5].search, // AA
RELATED_SEARCHES_ENTRIES[1].search, // BA
)
// also make sure that the string comparison is case insensitive
val searches2 = manager.getRelatedSearches("a", 3, 5).blockingFirst()
assertThat(searches).isEqualTo(searches2)
}
companion object {
private val time = OffsetDateTime.of(LocalDateTime.of(2000, 1, 1, 1, 1), ZoneOffset.UTC)
private val RELATED_SEARCHES_ENTRIES = listOf(
SearchHistoryEntry(time.minusSeconds(7), 2, "AC"),
SearchHistoryEntry(time.minusSeconds(6), 0, "ABC"),
SearchHistoryEntry(time.minusSeconds(5), 1, "BA"),
SearchHistoryEntry(time.minusSeconds(4), 3, "A"),
SearchHistoryEntry(time.minusSeconds(2), 0, "B"),
SearchHistoryEntry(time.minusSeconds(3), 2, "AA"),
SearchHistoryEntry(time.minusSeconds(1), 1, "A"),
)
}
}

View File

@@ -1,17 +1,14 @@
package org.schabi.newpipe.local.playlist
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.Timeout
import org.schabi.newpipe.database.AppDatabase
import org.schabi.newpipe.database.stream.model.StreamEntity
import org.schabi.newpipe.extractor.stream.StreamType
import org.schabi.newpipe.testUtil.TestDatabase
import org.schabi.newpipe.testUtil.TrampolineSchedulerRule
import java.util.concurrent.TimeUnit
class LocalPlaylistManagerTest {
@@ -21,18 +18,9 @@ class LocalPlaylistManagerTest {
@get:Rule
val trampolineScheduler = TrampolineSchedulerRule()
@get:Rule
val timeout = Timeout(10, TimeUnit.SECONDS)
@Before
fun setup() {
database = Room.inMemoryDatabaseBuilder(
ApplicationProvider.getApplicationContext(),
AppDatabase::class.java
)
.allowMainThreadQueries()
.build()
database = TestDatabase.createReplacingNewPipeDatabase()
manager = LocalPlaylistManager(database)
}

View File

@@ -0,0 +1,32 @@
package org.schabi.newpipe.testUtil
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
import org.junit.Assert.assertSame
import org.schabi.newpipe.NewPipeDatabase
import org.schabi.newpipe.database.AppDatabase
class TestDatabase {
companion object {
fun createReplacingNewPipeDatabase(): AppDatabase {
val database = Room.inMemoryDatabaseBuilder(
ApplicationProvider.getApplicationContext(),
AppDatabase::class.java
)
.allowMainThreadQueries()
.build()
val databaseField = NewPipeDatabase::class.java.getDeclaredField("databaseInstance")
databaseField.isAccessible = true
databaseField.set(NewPipeDatabase::class, database)
assertSame(
"Mocking database failed!",
database,
NewPipeDatabase.getInstance(ApplicationProvider.getApplicationContext())
)
return database
}
}
}

View File

@@ -0,0 +1,20 @@
package org.schabi.newpipe.settings;
import android.content.Intent;
import leakcanary.LeakCanary;
/**
* Build variant dependent (BVD) leak canary API implementation for the debug settings fragment.
* This class is loaded via reflection by
* {@link DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI}.
*/
@SuppressWarnings("unused") // Class is used but loaded via reflection
public class DebugSettingsBVDLeakCanary
implements DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI {
@Override
public Intent getNewLeakDisplayActivityIntent() {
return LeakCanary.INSTANCE.newLeakDisplayActivityIntent();
}
}

View File

@@ -1,42 +0,0 @@
package org.schabi.newpipe.settings;
import android.os.Bundle;
import androidx.preference.Preference;
import org.schabi.newpipe.R;
import org.schabi.newpipe.util.PicassoHelper;
import leakcanary.LeakCanary;
public class DebugSettingsFragment extends BasePreferenceFragment {
@Override
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
addPreferencesFromResource(R.xml.debug_settings);
final Preference showMemoryLeaksPreference
= findPreference(getString(R.string.show_memory_leaks_key));
final Preference showImageIndicatorsPreference
= findPreference(getString(R.string.show_image_indicators_key));
final Preference crashTheAppPreference
= findPreference(getString(R.string.crash_the_app_key));
assert showMemoryLeaksPreference != null;
assert showImageIndicatorsPreference != null;
assert crashTheAppPreference != null;
showMemoryLeaksPreference.setOnPreferenceClickListener(preference -> {
startActivity(LeakCanary.INSTANCE.newLeakDisplayActivityIntent());
return true;
});
showImageIndicatorsPreference.setOnPreferenceChangeListener((preference, newValue) -> {
PicassoHelper.setIndicatorsEnabled((Boolean) newValue);
return true;
});
crashTheAppPreference.setOnPreferenceClickListener(preference -> {
throw new RuntimeException();
});
}
}

View File

@@ -338,6 +338,7 @@
<data android:host="video.ploud.fr" />
<data android:host="video.lqdn.fr" />
<data android:host="skeptikon.fr" />
<data android:host="media.fsfe.org" />
<data android:pathPrefix="/videos/" /> <!-- it contains playlists -->
<data android:pathPrefix="/w/" /> <!-- short video URLs -->

View File

@@ -63,6 +63,7 @@ public final class FlingBehavior extends AppBarLayout.Behavior {
return consumed == dy;
}
@Override
public boolean onInterceptTouchEvent(@NonNull final CoordinatorLayout parent,
@NonNull final AppBarLayout child,
@NonNull final MotionEvent ev) {

View File

@@ -0,0 +1,148 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.text.similarity;
import java.util.Locale;
/**
* A matching algorithm that is similar to the searching algorithms implemented in editors such
* as Sublime Text, TextMate, Atom and others.
*
* <p>
* One point is given for every matched character. Subsequent matches yield two bonus points.
* A higher score indicates a higher similarity.
* </p>
*
* <p>
* This code has been adapted from Apache Commons Lang 3.3.
* </p>
*
* @since 1.0
*
* Note: This class was forked from
* <a href="https://git.io/JyYJg">
* apache/commons-text (8cfdafc) FuzzyScore.java
* </a>
*/
public class FuzzyScore {
/**
* Locale used to change the case of text.
*/
private final Locale locale;
/**
* This returns a {@link Locale}-specific {@link FuzzyScore}.
*
* @param locale The string matching logic is case insensitive.
A {@link Locale} is necessary to normalize both Strings to lower case.
* @throws IllegalArgumentException
* This is thrown if the {@link Locale} parameter is {@code null}.
*/
public FuzzyScore(final Locale locale) {
if (locale == null) {
throw new IllegalArgumentException("Locale must not be null");
}
this.locale = locale;
}
/**
* Find the Fuzzy Score which indicates the similarity score between two
* Strings.
*
* <pre>
* score.fuzzyScore(null, null) = IllegalArgumentException
* score.fuzzyScore("not null", null) = IllegalArgumentException
* score.fuzzyScore(null, "not null") = IllegalArgumentException
* score.fuzzyScore("", "") = 0
* score.fuzzyScore("Workshop", "b") = 0
* score.fuzzyScore("Room", "o") = 1
* score.fuzzyScore("Workshop", "w") = 1
* score.fuzzyScore("Workshop", "ws") = 2
* score.fuzzyScore("Workshop", "wo") = 4
* score.fuzzyScore("Apache Software Foundation", "asf") = 3
* </pre>
*
* @param term a full term that should be matched against, must not be null
* @param query the query that will be matched against a term, must not be
* null
* @return result score
* @throws IllegalArgumentException if the term or query is {@code null}
*/
public Integer fuzzyScore(final CharSequence term, final CharSequence query) {
if (term == null || query == null) {
throw new IllegalArgumentException("CharSequences must not be null");
}
// fuzzy logic is case insensitive. We normalize the Strings to lower
// case right from the start. Turning characters to lower case
// via Character.toLowerCase(char) is unfortunately insufficient
// as it does not accept a locale.
final String termLowerCase = term.toString().toLowerCase(locale);
final String queryLowerCase = query.toString().toLowerCase(locale);
// the resulting score
int score = 0;
// the position in the term which will be scanned next for potential
// query character matches
int termIndex = 0;
// index of the previously matched character in the term
int previousMatchingCharacterIndex = Integer.MIN_VALUE;
for (int queryIndex = 0; queryIndex < queryLowerCase.length(); queryIndex++) {
final char queryChar = queryLowerCase.charAt(queryIndex);
boolean termCharacterMatchFound = false;
for (; termIndex < termLowerCase.length()
&& !termCharacterMatchFound; termIndex++) {
final char termChar = termLowerCase.charAt(termIndex);
if (queryChar == termChar) {
// simple character matches result in one point
score++;
// subsequent character matches further improve
// the score.
if (previousMatchingCharacterIndex + 1 == termIndex) {
score += 2;
}
previousMatchingCharacterIndex = termIndex;
// we can leave the nested loop. Every character in the
// query can match at most one character in the term.
termCharacterMatchFound = true;
}
}
}
return score;
}
/**
* Gets the locale.
*
* @return The locale
*/
public Locale getLocale() {
return locale;
}
}

View File

@@ -13,13 +13,8 @@ import androidx.preference.PreferenceManager;
import com.jakewharton.processphoenix.ProcessPhoenix;
import org.acra.ACRA;
import org.acra.config.ACRAConfigurationException;
import org.acra.config.CoreConfiguration;
import org.acra.config.CoreConfigurationBuilder;
import org.schabi.newpipe.error.ErrorActivity;
import org.schabi.newpipe.error.ErrorInfo;
import org.schabi.newpipe.error.ReCaptchaActivity;
import org.schabi.newpipe.error.UserAction;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.downloader.Downloader;
import org.schabi.newpipe.ktx.ExceptionUtils;
@@ -210,16 +205,9 @@ public class App extends MultiDexApplication {
return;
}
try {
final CoreConfiguration acraConfig = new CoreConfigurationBuilder(this)
.setBuildConfigClass(BuildConfig.class)
.build();
ACRA.init(this, acraConfig);
} catch (final ACRAConfigurationException exception) {
exception.printStackTrace();
ErrorActivity.reportError(this, new ErrorInfo(exception,
UserAction.SOMETHING_ELSE, "Could not initialize ACRA crash report"));
}
final CoreConfigurationBuilder acraConfig = new CoreConfigurationBuilder(this)
.withBuildConfigClass(BuildConfig.class);
ACRA.init(this, acraConfig);
}
private void initNotificationChannels() {
@@ -227,28 +215,35 @@ public class App extends MultiDexApplication {
// the main and update channels
final NotificationChannelCompat mainChannel = new NotificationChannelCompat
.Builder(getString(R.string.notification_channel_id),
NotificationManagerCompat.IMPORTANCE_LOW)
NotificationManagerCompat.IMPORTANCE_LOW)
.setName(getString(R.string.notification_channel_name))
.setDescription(getString(R.string.notification_channel_description))
.build();
final NotificationChannelCompat appUpdateChannel = new NotificationChannelCompat
.Builder(getString(R.string.app_update_notification_channel_id),
NotificationManagerCompat.IMPORTANCE_LOW)
NotificationManagerCompat.IMPORTANCE_LOW)
.setName(getString(R.string.app_update_notification_channel_name))
.setDescription(getString(R.string.app_update_notification_channel_description))
.build();
final NotificationChannelCompat hashChannel = new NotificationChannelCompat
.Builder(getString(R.string.hash_channel_id),
NotificationManagerCompat.IMPORTANCE_HIGH)
NotificationManagerCompat.IMPORTANCE_HIGH)
.setName(getString(R.string.hash_channel_name))
.setDescription(getString(R.string.hash_channel_description))
.build();
final NotificationChannelCompat errorReportChannel = new NotificationChannelCompat
.Builder(getString(R.string.error_report_channel_id),
NotificationManagerCompat.IMPORTANCE_LOW)
.setName(getString(R.string.error_report_channel_name))
.setDescription(getString(R.string.error_report_channel_description))
.build();
final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.createNotificationChannelsCompat(Arrays.asList(mainChannel,
appUpdateChannel, hashChannel));
appUpdateChannel, hashChannel, errorReportChannel));
}
protected boolean isDisposedRxExceptionsReported() {

View File

@@ -21,8 +21,8 @@ import com.grack.nanojson.JsonObject;
import com.grack.nanojson.JsonParser;
import com.grack.nanojson.JsonParserException;
import org.schabi.newpipe.error.ErrorActivity;
import org.schabi.newpipe.error.ErrorInfo;
import org.schabi.newpipe.error.ErrorUtil;
import org.schabi.newpipe.error.UserAction;
import org.schabi.newpipe.extractor.downloader.Response;
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
@@ -64,7 +64,7 @@ public final class CheckForNewAppVersion extends IntentService {
signatures = PackageInfoCompat.getSignatures(application.getPackageManager(),
application.getPackageName());
} catch (final PackageManager.NameNotFoundException e) {
ErrorActivity.reportError(application, new ErrorInfo(e,
ErrorUtil.createNotification(application, new ErrorInfo(e,
UserAction.CHECK_FOR_NEW_APP_VERSION, "Could not find package info"));
return "";
}
@@ -79,7 +79,7 @@ public final class CheckForNewAppVersion extends IntentService {
final CertificateFactory cf = CertificateFactory.getInstance("X509");
c = (X509Certificate) cf.generateCertificate(input);
} catch (final CertificateException e) {
ErrorActivity.reportError(application, new ErrorInfo(e,
ErrorUtil.createNotification(application, new ErrorInfo(e,
UserAction.CHECK_FOR_NEW_APP_VERSION, "Certificate error"));
return "";
}
@@ -89,7 +89,7 @@ public final class CheckForNewAppVersion extends IntentService {
final byte[] publicKey = md.digest(c.getEncoded());
return byte2HexFormatted(publicKey);
} catch (NoSuchAlgorithmException | CertificateEncodingException e) {
ErrorActivity.reportError(application, new ErrorInfo(e,
ErrorUtil.createNotification(application, new ErrorInfo(e,
UserAction.CHECK_FOR_NEW_APP_VERSION, "Could not retrieve SHA1 key"));
return "";
}

View File

@@ -63,7 +63,7 @@ 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.error.ErrorActivity;
import org.schabi.newpipe.error.ErrorUtil;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
@@ -157,7 +157,7 @@ public class MainActivity extends AppCompatActivity {
try {
setupDrawer();
} catch (final Exception e) {
ErrorActivity.reportUiErrorInSnackbar(this, "Setting up drawer", e);
ErrorUtil.showUiErrorSnackbar(this, "Setting up drawer", e);
}
if (DeviceUtils.isTv(this)) {
@@ -214,7 +214,7 @@ public class MainActivity extends AppCompatActivity {
/**
* Builds the drawer menu for the current service.
*
* @throws ExtractionException
* @throws ExtractionException if the service didn't provide available kiosks
*/
private void addDrawerMenuForCurrentService() throws ExtractionException {
//Tabs
@@ -266,7 +266,7 @@ public class MainActivity extends AppCompatActivity {
try {
tabSelected(item);
} catch (final Exception e) {
ErrorActivity.reportUiErrorInSnackbar(this, "Selecting main page tab", e);
ErrorUtil.showUiErrorSnackbar(this, "Selecting main page tab", e);
}
break;
case R.id.menu_options_about_group:
@@ -372,7 +372,7 @@ public class MainActivity extends AppCompatActivity {
try {
addDrawerMenuForCurrentService();
} catch (final Exception e) {
ErrorActivity.reportUiErrorInSnackbar(this, "Showing main page tabs", e);
ErrorUtil.showUiErrorSnackbar(this, "Showing main page tabs", e);
}
}
}
@@ -475,7 +475,7 @@ public class MainActivity extends AppCompatActivity {
drawerHeaderBinding.drawerHeaderActionButton.setContentDescription(
getString(R.string.drawer_header_description) + selectedServiceName);
} catch (final Exception e) {
ErrorActivity.reportUiErrorInSnackbar(this, "Setting up service toggle", e);
ErrorUtil.showUiErrorSnackbar(this, "Setting up service toggle", e);
}
final SharedPreferences sharedPreferences
@@ -785,7 +785,7 @@ public class MainActivity extends AppCompatActivity {
NavigationHelper.gotoMainFragment(getSupportFragmentManager());
}
} catch (final Exception e) {
ErrorActivity.reportUiErrorInSnackbar(this, "Handling intent", e);
ErrorUtil.showUiErrorSnackbar(this, "Handling intent", e);
}
}

View File

@@ -14,6 +14,7 @@ import org.schabi.newpipe.local.dialog.PlaylistDialog;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.SaveUploaderUrlHelper;
import java.util.Collections;
@@ -61,11 +62,13 @@ public final class QueueItemMenuUtil {
return true;
case R.id.menu_item_channel_details:
// An intent must be used here.
// Opening with FragmentManager transactions is not working,
// as PlayQueueActivity doesn't use fragments.
NavigationHelper.openChannelFragmentUsingIntent(context, item.getServiceId(),
item.getUploaderUrl(), item.getUploader());
SaveUploaderUrlHelper.saveUploaderUrlIfNeeded(context, item,
// An intent must be used here.
// Opening with FragmentManager transactions is not working,
// as PlayQueueActivity doesn't use fragments.
uploaderUrl -> NavigationHelper.openChannelFragmentUsingIntent(
context, item.getServiceId(), uploaderUrl, item.getUploader()
));
return true;
case R.id.menu_item_share:
shareText(context, item.getTitle(), item.getUrl(),

View File

@@ -37,8 +37,8 @@ import org.schabi.newpipe.database.stream.model.StreamEntity;
import org.schabi.newpipe.databinding.ListRadioIconItemBinding;
import org.schabi.newpipe.databinding.SingleChoiceDialogViewBinding;
import org.schabi.newpipe.download.DownloadDialog;
import org.schabi.newpipe.error.ErrorActivity;
import org.schabi.newpipe.error.ErrorInfo;
import org.schabi.newpipe.error.ErrorUtil;
import org.schabi.newpipe.error.ReCaptchaActivity;
import org.schabi.newpipe.error.UserAction;
import org.schabi.newpipe.extractor.Info;
@@ -231,7 +231,7 @@ public class RouterActivity extends AppCompatActivity {
} else if (errorInfo.getThrowable() instanceof ContentNotSupportedException) {
Toast.makeText(context, R.string.content_not_supported, Toast.LENGTH_LONG).show();
} else {
ErrorActivity.reportError(context, errorInfo);
ErrorUtil.createNotification(context, errorInfo);
}
if (context instanceof RouterActivity) {

View File

@@ -185,7 +185,11 @@ class AboutActivity : AppCompatActivity() {
SoftwareComponent(
"RxJava", "2016 - 2020", "RxJava Contributors",
"https://github.com/ReactiveX/RxJava", StandardLicenses.APACHE2
)
),
SoftwareComponent(
"SearchPreference", "2018", "ByteHamster",
"https://github.com/ByteHamster/SearchPreference", StandardLicenses.MIT
),
)
private const val POS_ABOUT = 0
private const val POS_LICENSE = 1

View File

@@ -19,6 +19,7 @@ import static org.schabi.newpipe.database.history.model.SearchHistoryEntry.TABLE
@Dao
public interface SearchHistoryDAO extends HistoryDAO<SearchHistoryEntry> {
String ORDER_BY_CREATION_DATE = " ORDER BY " + CREATION_DATE + " DESC";
String ORDER_BY_MAX_CREATION_DATE = " ORDER BY MAX(" + CREATION_DATE + ") DESC";
@Query("SELECT * FROM " + TABLE_NAME
+ " WHERE " + ID + " = (SELECT MAX(" + ID + ") FROM " + TABLE_NAME + ")")
@@ -36,16 +37,16 @@ public interface SearchHistoryDAO extends HistoryDAO<SearchHistoryEntry> {
@Override
Flowable<List<SearchHistoryEntry>> getAll();
@Query("SELECT * FROM " + TABLE_NAME + " GROUP BY " + SEARCH + ORDER_BY_CREATION_DATE
+ " LIMIT :limit")
Flowable<List<SearchHistoryEntry>> getUniqueEntries(int limit);
@Query("SELECT " + SEARCH + " FROM " + TABLE_NAME + " GROUP BY " + SEARCH
+ ORDER_BY_MAX_CREATION_DATE + " LIMIT :limit")
Flowable<List<String>> getUniqueEntries(int limit);
@Query("SELECT * FROM " + TABLE_NAME
+ " WHERE " + SERVICE_ID + " = :serviceId" + ORDER_BY_CREATION_DATE)
@Override
Flowable<List<SearchHistoryEntry>> listByService(int serviceId);
@Query("SELECT * FROM " + TABLE_NAME + " WHERE " + SEARCH + " LIKE :query || '%'"
+ " GROUP BY " + SEARCH + " LIMIT :limit")
Flowable<List<SearchHistoryEntry>> getSimilarEntries(String query, int limit);
@Query("SELECT " + SEARCH + " FROM " + TABLE_NAME + " WHERE " + SEARCH + " LIKE :query || '%'"
+ " GROUP BY " + SEARCH + ORDER_BY_MAX_CREATION_DATE + " LIMIT :limit")
Flowable<List<String>> getSimilarEntries(String query, int limit);
}

View File

@@ -1,79 +0,0 @@
package org.schabi.newpipe.database.history.model;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.Ignore;
import androidx.room.Index;
import androidx.room.PrimaryKey;
import java.time.OffsetDateTime;
import static org.schabi.newpipe.database.history.model.SearchHistoryEntry.SEARCH;
@Entity(tableName = SearchHistoryEntry.TABLE_NAME,
indices = {@Index(value = SEARCH)})
public class SearchHistoryEntry {
public static final String ID = "id";
public static final String TABLE_NAME = "search_history";
public static final String SERVICE_ID = "service_id";
public static final String CREATION_DATE = "creation_date";
public static final String SEARCH = "search";
@ColumnInfo(name = ID)
@PrimaryKey(autoGenerate = true)
private long id;
@ColumnInfo(name = CREATION_DATE)
private OffsetDateTime creationDate;
@ColumnInfo(name = SERVICE_ID)
private int serviceId;
@ColumnInfo(name = SEARCH)
private String search;
public SearchHistoryEntry(final OffsetDateTime creationDate, final int serviceId,
final String search) {
this.serviceId = serviceId;
this.creationDate = creationDate;
this.search = search;
}
public long getId() {
return id;
}
public void setId(final long id) {
this.id = id;
}
public OffsetDateTime getCreationDate() {
return creationDate;
}
public void setCreationDate(final OffsetDateTime creationDate) {
this.creationDate = creationDate;
}
public int getServiceId() {
return serviceId;
}
public void setServiceId(final int serviceId) {
this.serviceId = serviceId;
}
public String getSearch() {
return search;
}
public void setSearch(final String search) {
this.search = search;
}
@Ignore
public boolean hasEqualValues(final SearchHistoryEntry otherEntry) {
return getServiceId() == otherEntry.getServiceId()
&& getSearch().equals(otherEntry.getSearch());
}
}

View File

@@ -0,0 +1,40 @@
package org.schabi.newpipe.database.history.model
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.Ignore
import androidx.room.Index
import androidx.room.PrimaryKey
import java.time.OffsetDateTime
@Entity(
tableName = SearchHistoryEntry.TABLE_NAME,
indices = [Index(value = [SearchHistoryEntry.SEARCH])]
)
data class SearchHistoryEntry(
@field:ColumnInfo(name = CREATION_DATE) var creationDate: OffsetDateTime?,
@field:ColumnInfo(
name = SERVICE_ID
) var serviceId: Int,
@field:ColumnInfo(name = SEARCH) var search: String?
) {
@ColumnInfo(name = ID)
@PrimaryKey(autoGenerate = true)
var id: Long = 0
@Ignore
fun hasEqualValues(otherEntry: SearchHistoryEntry): Boolean {
return (
serviceId == otherEntry.serviceId &&
search == otherEntry.search
)
}
companion object {
const val ID = "id"
const val TABLE_NAME = "search_history"
const val SERVICE_ID = "service_id"
const val CREATION_DATE = "creation_date"
const val SEARCH = "search"
}
}

View File

@@ -41,8 +41,8 @@ import com.nononsenseapps.filepicker.Utils;
import org.schabi.newpipe.MainActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.DownloadDialogBinding;
import org.schabi.newpipe.error.ErrorActivity;
import org.schabi.newpipe.error.ErrorInfo;
import org.schabi.newpipe.error.ErrorUtil;
import org.schabi.newpipe.error.UserAction;
import org.schabi.newpipe.extractor.MediaFormat;
import org.schabi.newpipe.extractor.NewPipe;
@@ -53,6 +53,7 @@ import org.schabi.newpipe.extractor.stream.StreamInfo;
import org.schabi.newpipe.extractor.stream.SubtitlesStream;
import org.schabi.newpipe.extractor.stream.VideoStream;
import org.schabi.newpipe.settings.NewPipeSettings;
import org.schabi.newpipe.streams.io.NoFileManagerSafeGuard;
import org.schabi.newpipe.streams.io.StoredDirectoryHelper;
import org.schabi.newpipe.streams.io.StoredFileHelper;
import org.schabi.newpipe.util.FilePickerActivityHelper;
@@ -402,7 +403,7 @@ public class DownloadDialog extends DialogFragment
== R.id.video_button) {
setupVideoSpinner();
}
}, throwable -> ErrorActivity.reportErrorInSnackbar(context,
}, throwable -> ErrorUtil.showSnackbar(context,
new ErrorInfo(throwable, UserAction.DOWNLOAD_OPEN_DIALOG,
"Downloading video stream size",
currentInfo.getServiceId()))));
@@ -412,7 +413,7 @@ public class DownloadDialog extends DialogFragment
== R.id.audio_button) {
setupAudioSpinner();
}
}, throwable -> ErrorActivity.reportErrorInSnackbar(context,
}, throwable -> ErrorUtil.showSnackbar(context,
new ErrorInfo(throwable, UserAction.DOWNLOAD_OPEN_DIALOG,
"Downloading audio stream size",
currentInfo.getServiceId()))));
@@ -422,7 +423,7 @@ public class DownloadDialog extends DialogFragment
== R.id.subtitle_button) {
setupSubtitleSpinner();
}
}, throwable -> ErrorActivity.reportErrorInSnackbar(context,
}, throwable -> ErrorUtil.showSnackbar(context,
new ErrorInfo(throwable, UserAction.DOWNLOAD_OPEN_DIALOG,
"Downloading subtitle stream size",
currentInfo.getServiceId()))));
@@ -687,7 +688,12 @@ public class DownloadDialog extends DialogFragment
}
private void launchDirectoryPicker(final ActivityResultLauncher<Intent> launcher) {
launcher.launch(StoredDirectoryHelper.getPicker(context));
NoFileManagerSafeGuard.launchSafe(
launcher,
StoredDirectoryHelper.getPicker(context),
TAG,
context
);
}
private void prepareSelectedDownload() {
@@ -766,8 +772,12 @@ public class DownloadDialog extends DialogFragment
initialPath = Uri.parse(initialSavePath.getAbsolutePath());
}
requestDownloadSaveAsLauncher.launch(StoredFileHelper.getNewPicker(context,
filenameTmp, mimeTmp, initialPath));
NoFileManagerSafeGuard.launchSafe(
requestDownloadSaveAsLauncher,
StoredFileHelper.getNewPicker(context, filenameTmp, mimeTmp, initialPath),
TAG,
context
);
return;
}
@@ -799,7 +809,7 @@ public class DownloadDialog extends DialogFragment
mainStorage.getTag());
}
} catch (final Exception e) {
ErrorActivity.reportErrorInSnackbar(this,
ErrorUtil.createNotification(requireContext(),
new ErrorInfo(e, UserAction.DOWNLOAD_FAILED, "Getting storage"));
return;
}

View File

@@ -33,12 +33,11 @@ public class AcraReportSender implements ReportSender {
@Override
public void send(@NonNull final Context context, @NonNull final CrashReportData report) {
ErrorActivity.reportError(context, new ErrorInfo(
ErrorUtil.openActivity(context, new ErrorInfo(
new String[]{report.getString(ReportField.STACK_TRACE)},
UserAction.UI_ERROR,
ErrorInfo.SERVICE_NONE,
"ACRA report",
R.string.app_ui_crash,
null));
R.string.app_ui_crash));
}
}

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