mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2025-11-16 19:43:29 +01:00
Compare commits
1041 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ff8868f6a3 | ||
|
|
8c6e37d1d1 | ||
|
|
c90237c14c | ||
|
|
3750561b4d | ||
|
|
6b026557d4 | ||
|
|
1ee137bbda | ||
|
|
2c88e9d068 | ||
|
|
4825a0a35f | ||
|
|
122b0b0de4 | ||
|
|
7dc85af5fb | ||
|
|
c7daf32904 | ||
|
|
4c8dca5300 | ||
|
|
ef91214085 | ||
|
|
dc09a4621b | ||
|
|
2f99a217c3 | ||
|
|
6992b2c308 | ||
|
|
0d51eefbb9 | ||
|
|
aa28a85747 | ||
|
|
f18ee8e83d | ||
|
|
fb58967766 | ||
|
|
c3f1478fde | ||
|
|
e5c00a7ef4 | ||
|
|
769791af7a | ||
|
|
e632fab4d0 | ||
|
|
6cd25d7e55 | ||
|
|
c9488eb042 | ||
|
|
c8516a04dc | ||
|
|
02d1b98b1c | ||
|
|
d8236bbedd | ||
|
|
1de21fb0c2 | ||
|
|
13cac07b8d | ||
|
|
bd9dcfb28a | ||
|
|
d5199eac3e | ||
|
|
7638d229c0 | ||
|
|
a641c5bb58 | ||
|
|
1e0c9f46ad | ||
|
|
4eb02f584e | ||
|
|
700c1b4b25 | ||
|
|
4b4337e078 | ||
|
|
38ce800685 | ||
|
|
2310e8c1d6 | ||
|
|
1b2b3a4f88 | ||
|
|
d11129a76b | ||
|
|
02789122a0 | ||
|
|
676bc02d52 | ||
|
|
8b807b0706 | ||
|
|
72dfe974ab | ||
|
|
316db0e4c6 | ||
|
|
010c607e40 | ||
|
|
3e099fb2a3 | ||
|
|
9c9730b152 | ||
|
|
9e44053e22 | ||
|
|
dee32c3dc5 | ||
|
|
344fbff59a | ||
|
|
e39a816bdc | ||
|
|
605b8fac5e | ||
|
|
dfba10f8ae | ||
|
|
48a1ab64b0 | ||
|
|
dd2cde3c1a | ||
|
|
1b9c2b37c5 | ||
|
|
eae1f8b597 | ||
|
|
18ce86c2ed | ||
|
|
d5f25e05d9 | ||
|
|
53303ac5d3 | ||
|
|
90cc8e2144 | ||
|
|
adf9badbf6 | ||
|
|
c35fe4f3f1 | ||
|
|
63291f8101 | ||
|
|
62efb588ef | ||
|
|
203ca9afc6 | ||
|
|
a23f941ac8 | ||
|
|
b0a10f0542 | ||
|
|
478ad42977 | ||
|
|
0764983ac6 | ||
|
|
2b2f1ee8f5 | ||
|
|
28f167fd99 | ||
|
|
272be36dd9 | ||
|
|
f933db8117 | ||
|
|
cddb9bccb9 | ||
|
|
b5ad24eb47 | ||
|
|
ad8f791f71 | ||
|
|
2e862b4ccc | ||
|
|
ecac897e7b | ||
|
|
702adb53a7 | ||
|
|
4ea962f523 | ||
|
|
acaf92d671 | ||
|
|
c673cb6157 | ||
|
|
c0f7b123a3 | ||
|
|
e9e2afa61a | ||
|
|
403154b2e1 | ||
|
|
e5fd24b0d1 | ||
|
|
8dc34274a1 | ||
|
|
467bd21de2 | ||
|
|
5c9705d94e | ||
|
|
85fb5827aa | ||
|
|
0bcc9bd3ba | ||
|
|
25e120bec1 | ||
|
|
7067deb328 | ||
|
|
f6efd302dc | ||
|
|
61972141ae | ||
|
|
af936bc646 | ||
|
|
d66f933c69 | ||
|
|
cf81c37683 | ||
|
|
d2306b0fd7 | ||
|
|
94dfabf3dc | ||
|
|
5522dc10b8 | ||
|
|
0ae04b8ead | ||
|
|
44cad27d0a | ||
|
|
5d59025b3c | ||
|
|
768bb0bbcd | ||
|
|
ac071b383f | ||
|
|
e0b1a6b88b | ||
|
|
ed86b1c572 | ||
|
|
b6c2bade73 | ||
|
|
b6b19b474e | ||
|
|
231b7492fb | ||
|
|
b4950fcb2e | ||
|
|
b79ea7b51b | ||
|
|
28c72e7f63 | ||
|
|
5fcc3b4dab | ||
|
|
51837ce36f | ||
|
|
ddaafb68c8 | ||
|
|
a744775fe7 | ||
|
|
50b85a7734 | ||
|
|
aab09c0c65 | ||
|
|
3ded6feddb | ||
|
|
c8802fe5d0 | ||
|
|
411b3129f9 | ||
|
|
a55acd38df | ||
|
|
e7773d8807 | ||
|
|
7edef8d5a2 | ||
|
|
03d2ca9f9f | ||
|
|
2271ea4281 | ||
|
|
afc8db8f81 | ||
|
|
4af49ee5a6 | ||
|
|
d7b29aae5c | ||
|
|
9f7a8407ca | ||
|
|
7eb13a9b93 | ||
|
|
7c9896beaf | ||
|
|
54d3bff26d | ||
|
|
a2050a5211 | ||
|
|
048743c062 | ||
|
|
e9bd2934c3 | ||
|
|
50634eb2b3 | ||
|
|
08489b81fb | ||
|
|
a2ff770afc | ||
|
|
e0ba9b3902 | ||
|
|
f11b5ae7a1 | ||
|
|
7baeb6eca7 | ||
|
|
658d988254 | ||
|
|
9d7e9289bb | ||
|
|
4e8519a1b9 | ||
|
|
12aac09c7b | ||
|
|
d7d87691cb | ||
|
|
731640997e | ||
|
|
64d7432852 | ||
|
|
e6fffc0d5b | ||
|
|
1c9f68bcae | ||
|
|
4fde62ff89 | ||
|
|
4c5fc7fa7c | ||
|
|
b633108a4c | ||
|
|
ceb55d0ede | ||
|
|
87c958b2e7 | ||
|
|
d844e0aba6 | ||
|
|
3d42da5ff5 | ||
|
|
1b869199f4 | ||
|
|
f3cd2f6c9d | ||
|
|
2e3e7f9bf2 | ||
|
|
92327dd9e3 | ||
|
|
d40b432f46 | ||
|
|
5b3137093f | ||
|
|
4fc9f2e5fd | ||
|
|
ce592f4baf | ||
|
|
2b3edcf2d1 | ||
|
|
f165f97bd9 | ||
|
|
4ec572372e | ||
|
|
a953aab9b4 | ||
|
|
672eb34049 | ||
|
|
a0b042091b | ||
|
|
b753705a84 | ||
|
|
f48ff610a3 | ||
|
|
93aed9f34c | ||
|
|
3cf94382e6 | ||
|
|
f52cb3bbe0 | ||
|
|
d45182cb5c | ||
|
|
22847c6c92 | ||
|
|
a70c51b71c | ||
|
|
02d417476e | ||
|
|
bc3139e5f9 | ||
|
|
c1f7b2653c | ||
|
|
72dbb9441e | ||
|
|
bbc13756f3 | ||
|
|
ba0876b43b | ||
|
|
c0d41661e8 | ||
|
|
b2e2551e33 | ||
|
|
ac371e6fb4 | ||
|
|
108af48b76 | ||
|
|
a225ac5deb | ||
|
|
920695f90a | ||
|
|
49fc57eee9 | ||
|
|
b61d44aaa6 | ||
|
|
f36fd2f7b2 | ||
|
|
7e26748dc4 | ||
|
|
ba6fdecbae | ||
|
|
f791e83380 | ||
|
|
dd7f914b8d | ||
|
|
7667b2ce59 | ||
|
|
8272b2508b | ||
|
|
70354eb73e | ||
|
|
63083ac0c3 | ||
|
|
9346f9b0f3 | ||
|
|
605e5d265c | ||
|
|
25456b15e7 | ||
|
|
ebbe7ef944 | ||
|
|
60a272e70a | ||
|
|
672fcb9ce3 | ||
|
|
870d50ebcd | ||
|
|
b62b3e91a0 | ||
|
|
b022d90303 | ||
|
|
02af529551 | ||
|
|
dd9cc619ed | ||
|
|
75c9e959de | ||
|
|
fb8afec1bf | ||
|
|
a2887034a6 | ||
|
|
7eb5aa1bc5 | ||
|
|
08ebd7d39a | ||
|
|
9ea263f72e | ||
|
|
e4a2d2f3c1 | ||
|
|
892b4a15f6 | ||
|
|
fda0a550fd | ||
|
|
638825cdff | ||
|
|
6a1d81fcf3 | ||
|
|
8afd44a72f | ||
|
|
22c5135740 | ||
|
|
4d51ebc37a | ||
|
|
433c6dc33b | ||
|
|
ed4fdadd4d | ||
|
|
298e96b821 | ||
|
|
9006667b4d | ||
|
|
abbf71982d | ||
|
|
57110717d3 | ||
|
|
c3b5444281 | ||
|
|
7a542975ca | ||
|
|
490aff5846 | ||
|
|
1dfc036ead | ||
|
|
360d6b998c | ||
|
|
be7307cf39 | ||
|
|
12096ab050 | ||
|
|
225f23ce02 | ||
|
|
9c15ee7285 | ||
|
|
8dd617fc6b | ||
|
|
ae8e72f34b | ||
|
|
fc52a6e871 | ||
|
|
722b47b86f | ||
|
|
3a09039b93 | ||
|
|
669a35bc78 | ||
|
|
81fa0c1558 | ||
|
|
ed408b2094 | ||
|
|
3bc661f583 | ||
|
|
cf9b482be2 | ||
|
|
1d935b46f9 | ||
|
|
520ac2e935 | ||
|
|
c6316abbce | ||
|
|
2dfe837c35 | ||
|
|
3c2ea7697c | ||
|
|
faa7a91764 | ||
|
|
f629a4d206 | ||
|
|
4b7c37e919 | ||
|
|
a4c9732916 | ||
|
|
f8f2dfce4b | ||
|
|
5284072b8d | ||
|
|
e603dddc54 | ||
|
|
15691ba41a | ||
|
|
a555aab3e7 | ||
|
|
88f1c3a808 | ||
|
|
0e6668636d | ||
|
|
d0f4d8b132 | ||
|
|
cfdcb92fa3 | ||
|
|
039bd5d413 | ||
|
|
5ffba55b4a | ||
|
|
57ca281c80 | ||
|
|
46f74b908a | ||
|
|
703f1550d8 | ||
|
|
8bfd380b89 | ||
|
|
43e91ae4ae | ||
|
|
023a2c1d9c | ||
|
|
d931d058d9 | ||
|
|
a825253b7f | ||
|
|
d9086300f3 | ||
|
|
f18a7c91ca | ||
|
|
556aad0114 | ||
|
|
05f6ea6401 | ||
|
|
43d0543b9f | ||
|
|
e95637f7b7 | ||
|
|
4cd7c42b9e | ||
|
|
0787d62254 | ||
|
|
b061423847 | ||
|
|
dbd90299bd | ||
|
|
1faf1b261c | ||
|
|
c6ead351c0 | ||
|
|
bbcfdf2969 | ||
|
|
36e72d5a41 | ||
|
|
f8297a8a9b | ||
|
|
a4503eb609 | ||
|
|
a1cb3e59d6 | ||
|
|
ef94458249 | ||
|
|
1b05c404d5 | ||
|
|
5de455bb86 | ||
|
|
acdfee5c25 | ||
|
|
a6d6ed6474 | ||
|
|
87e7d95966 | ||
|
|
d37ee1e0dc | ||
|
|
1d33e7ab49 | ||
|
|
2027b743b4 | ||
|
|
7e27e73532 | ||
|
|
3705a1adad | ||
|
|
793b88a7d4 | ||
|
|
2928df0cc9 | ||
|
|
4f5e772157 | ||
|
|
f7a0b9951e | ||
|
|
44128f9145 | ||
|
|
6eaff5ca6a | ||
|
|
c0664c1cb6 | ||
|
|
e229e5355d | ||
|
|
52189fc5df | ||
|
|
314964c5f9 | ||
|
|
fcef783bbb | ||
|
|
9c5ac069d7 | ||
|
|
160f9df64e | ||
|
|
bdbb9bead2 | ||
|
|
e4dfce9ee2 | ||
|
|
6fbb601802 | ||
|
|
94b4c76749 | ||
|
|
8715e7dd98 | ||
|
|
ccc2d892c1 | ||
|
|
d1ce8e7baa | ||
|
|
82fbbbecac | ||
|
|
bf029ddd9f | ||
|
|
af5f0c042a | ||
|
|
4e15f0ddac | ||
|
|
b566355c4f | ||
|
|
5c31dff72d | ||
|
|
d69672e113 | ||
|
|
a209e87c69 | ||
|
|
71610a365f | ||
|
|
44860f2ea7 | ||
|
|
967bdf8f08 | ||
|
|
02aa6fcab0 | ||
|
|
712985ced1 | ||
|
|
0683dafa55 | ||
|
|
6f1958d398 | ||
|
|
85fbd2560d | ||
|
|
65f2730261 | ||
|
|
21bcadeecb | ||
|
|
bd0427c79f | ||
|
|
241054fd26 | ||
|
|
d8888e3495 | ||
|
|
137d9e6d6e | ||
|
|
d0cbd1e663 | ||
|
|
da51e1ed72 | ||
|
|
76803bfcb1 | ||
|
|
c248741c00 | ||
|
|
759a078ce0 | ||
|
|
a536311d56 | ||
|
|
9dd2a82b7d | ||
|
|
4d50a66e40 | ||
|
|
e6c56cacc6 | ||
|
|
c3b9465aa3 | ||
|
|
5f3b8bea52 | ||
|
|
0e4c8ea8af | ||
|
|
f9ab23bb4a | ||
|
|
9f8b2264a2 | ||
|
|
52cc3f10c1 | ||
|
|
1d61bb58f5 | ||
|
|
a3440cc8ef | ||
|
|
51c60e5261 | ||
|
|
c3349e18a5 | ||
|
|
12e46e0a36 | ||
|
|
f8caed139a | ||
|
|
a2297fb5b8 | ||
|
|
26c39381a8 | ||
|
|
a4742ad9e9 | ||
|
|
23a6973291 | ||
|
|
340a84e583 | ||
|
|
4291877830 | ||
|
|
8f6d608a43 | ||
|
|
45dd98e639 | ||
|
|
2ac265a6f5 | ||
|
|
e100806fd9 | ||
|
|
c7f75bf7d1 | ||
|
|
4bf5ddbfe9 | ||
|
|
32dffb577c | ||
|
|
a9623f8e6a | ||
|
|
bc74bb6bf6 | ||
|
|
d32450255c | ||
|
|
896aec5295 | ||
|
|
d42a534fc3 | ||
|
|
398007ca90 | ||
|
|
551e8df8b8 | ||
|
|
dc0a28b93d | ||
|
|
644396149b | ||
|
|
a25bb2618a | ||
|
|
0e12cdea7c | ||
|
|
903296014a | ||
|
|
cd713db029 | ||
|
|
bdd16e06e0 | ||
|
|
4c632810ec | ||
|
|
f451bdbfa4 | ||
|
|
bfac73b992 | ||
|
|
2b41f710a8 | ||
|
|
5924edb289 | ||
|
|
5ceec31adf | ||
|
|
e2791cdf0f | ||
|
|
50f3b08c59 | ||
|
|
2aebf6ceaf | ||
|
|
7ceea2cd8d | ||
|
|
0cb801179c | ||
|
|
1822d21676 | ||
|
|
7fd2ebc252 | ||
|
|
f709ac16f8 | ||
|
|
74173317de | ||
|
|
3874e16187 | ||
|
|
39722a5563 | ||
|
|
1f9ad12593 | ||
|
|
52c136439e | ||
|
|
cd86ed3877 | ||
|
|
1d85661ab9 | ||
|
|
736cefed5a | ||
|
|
fa8630ddae | ||
|
|
4a2bd7bd7b | ||
|
|
a9e21a35ea | ||
|
|
fd4e1b8d2c | ||
|
|
420f0505ae | ||
|
|
b58f7856a1 | ||
|
|
44a6429267 | ||
|
|
472bde9eea | ||
|
|
c422f65935 | ||
|
|
f5962375f8 | ||
|
|
4e33f2dcb6 | ||
|
|
dce874bbc7 | ||
|
|
7d69dfa62a | ||
|
|
a56f17cc3b | ||
|
|
7be7a32d70 | ||
|
|
a7dd3af4e5 | ||
|
|
63fdc100d6 | ||
|
|
9e2ece78dd | ||
|
|
cebcaf4d6a | ||
|
|
4a242e43a7 | ||
|
|
d8f442cc89 | ||
|
|
f6923e073e | ||
|
|
f02c6be10d | ||
|
|
5ba3ef0a25 | ||
|
|
9458b9f37d | ||
|
|
ca282f2be8 | ||
|
|
0cde08c46e | ||
|
|
bec8512c7b | ||
|
|
46e7da4e21 | ||
|
|
c7b8bd3436 | ||
|
|
1721817fdb | ||
|
|
d57bfde604 | ||
|
|
3167ab3ba0 | ||
|
|
8f559965f6 | ||
|
|
35e005caaa | ||
|
|
6c25ce56a3 | ||
|
|
baa12c7069 | ||
|
|
e2b044d2ee | ||
|
|
621af8d812 | ||
|
|
efd038a536 | ||
|
|
0b2629e910 | ||
|
|
a9b5ef3bd3 | ||
|
|
2a24532e1d | ||
|
|
88c4195260 | ||
|
|
c5f2eb1dd8 | ||
|
|
384d964827 | ||
|
|
253526e565 | ||
|
|
2e2dbaf77f | ||
|
|
43133df2ad | ||
|
|
eef568b24c | ||
|
|
e7d5011f42 | ||
|
|
36c198fc33 | ||
|
|
75a8edf20f | ||
|
|
81107df53f | ||
|
|
a932bc2503 | ||
|
|
f4e2eca256 | ||
|
|
08d5dfa49c | ||
|
|
e7f339a946 | ||
|
|
d3375a921d | ||
|
|
a2eb810df0 | ||
|
|
6e576a165c | ||
|
|
dfa941a9e7 | ||
|
|
1584028995 | ||
|
|
14dab85ff0 | ||
|
|
403e336a64 | ||
|
|
2aa5f68b7b | ||
|
|
56ea526cce | ||
|
|
96f5cd9f17 | ||
|
|
64efb89cce | ||
|
|
4d5b68792b | ||
|
|
85d813a94b | ||
|
|
e9b008ee84 | ||
|
|
b795c5f017 | ||
|
|
1e4686463b | ||
|
|
4e9631a8d8 | ||
|
|
3a83062670 | ||
|
|
79102a20d2 | ||
|
|
2e053ea25a | ||
|
|
fd3d46c813 | ||
|
|
ab838fd84f | ||
|
|
9ca2691a2c | ||
|
|
7c3f5a62c5 | ||
|
|
6711dae4e0 | ||
|
|
a73a4afcad | ||
|
|
4ea2d8e7ba | ||
|
|
bb386fea16 | ||
|
|
82cdb0fdb3 | ||
|
|
a94dacf03c | ||
|
|
de312eb768 | ||
|
|
29aa1de4e3 | ||
|
|
09435a1b63 | ||
|
|
85e864a01e | ||
|
|
573839c0ff | ||
|
|
9c636f5ee2 | ||
|
|
f78d2a5ed8 | ||
|
|
48c2c156cb | ||
|
|
435813355f | ||
|
|
e30a552b6c | ||
|
|
22a4a4b2df | ||
|
|
5ac418aa61 | ||
|
|
d8a0a74d47 | ||
|
|
3931c0d200 | ||
|
|
e26607fbd1 | ||
|
|
a63683e6b8 | ||
|
|
83b198f6fe | ||
|
|
23f6e1084b | ||
|
|
99335bab7a | ||
|
|
33fbc889fb | ||
|
|
201e5ee09d | ||
|
|
c398308872 | ||
|
|
090c063644 | ||
|
|
ec40c8ed1e | ||
|
|
78a99526a9 | ||
|
|
25914b0263 | ||
|
|
aaa3e20c5a | ||
|
|
0da8e28651 | ||
|
|
d7dcfa5729 | ||
|
|
65824ff64d | ||
|
|
63cad7ebb0 | ||
|
|
b996fa7eef | ||
|
|
5ebf3726ed | ||
|
|
484c852efd | ||
|
|
25cf8dc20a | ||
|
|
cb1a138140 | ||
|
|
384ca66205 | ||
|
|
46bfec66cb | ||
|
|
afe06b379f | ||
|
|
a9e85abd7f | ||
|
|
08d4651ef0 | ||
|
|
62b4f333bb | ||
|
|
02b0909829 | ||
|
|
ae39b31c68 | ||
|
|
e5a1438673 | ||
|
|
72d305b283 | ||
|
|
785c0376f8 | ||
|
|
0bdf8de38e | ||
|
|
6c575511be | ||
|
|
9767e98e50 | ||
|
|
79deff3261 | ||
|
|
0782410a14 | ||
|
|
f5d015e8f9 | ||
|
|
74ad488f4a | ||
|
|
0db3406ad8 | ||
|
|
6e377dd3c5 | ||
|
|
be676ad93c | ||
|
|
f00cffd17e | ||
|
|
0803d9f2b5 | ||
|
|
841fb4cfc5 | ||
|
|
8b3e32b6eb | ||
|
|
90de75968d | ||
|
|
2de9d7b4a7 | ||
|
|
a9ab2f54ea | ||
|
|
a1432e939f | ||
|
|
cae160b5be | ||
|
|
aa4e5da146 | ||
|
|
1061fca6a3 | ||
|
|
e4885e3c52 | ||
|
|
a98c0bdec7 | ||
|
|
d6e0bd8c26 | ||
|
|
e01ef42d31 | ||
|
|
92910eb227 | ||
|
|
cdfe686322 | ||
|
|
553943ab93 | ||
|
|
32df4d39a4 | ||
|
|
1281ea858c | ||
|
|
30a303f873 | ||
|
|
fdb6679d2d | ||
|
|
7145b117cc | ||
|
|
4698d07323 | ||
|
|
2142f05a88 | ||
|
|
40a2df847b | ||
|
|
6063ff063b | ||
|
|
547a1a9970 | ||
|
|
8c52a812d9 | ||
|
|
4eef498d24 | ||
|
|
32b0bdb98c | ||
|
|
edfe0f9c30 | ||
|
|
eef418a757 | ||
|
|
218f25c171 | ||
|
|
f02df6d80c | ||
|
|
da4d379b22 | ||
|
|
f13f4cc5d2 | ||
|
|
a79badd783 | ||
|
|
2702700d10 | ||
|
|
267686fd37 | ||
|
|
e5df2f65b8 | ||
|
|
d6decc05d7 | ||
|
|
d85afd6435 | ||
|
|
2fb86364ab | ||
|
|
c972940338 | ||
|
|
6abdd2a6d8 | ||
|
|
9e9d1a04e4 | ||
|
|
ae9349e36c | ||
|
|
4031777606 | ||
|
|
9591f14551 | ||
|
|
06d10cf9aa | ||
|
|
0113ad5e14 | ||
|
|
e58feadba9 | ||
|
|
360f5ac6f7 | ||
|
|
e846f69e38 | ||
|
|
fa1d7ffac3 | ||
|
|
272d589518 | ||
|
|
6ab4787e97 | ||
|
|
060f09ff55 | ||
|
|
f47ae3668f | ||
|
|
56cd84c1fe | ||
|
|
a2eead521f | ||
|
|
a2fd5ae20c | ||
|
|
543440e38d | ||
|
|
0b64382ef6 | ||
|
|
bede758507 | ||
|
|
5532666ad5 | ||
|
|
63cff25616 | ||
|
|
5e2735aaa2 | ||
|
|
6fc0d8fce4 | ||
|
|
e0c1ca1209 | ||
|
|
3dc4ed1764 | ||
|
|
f63a4ee2ae | ||
|
|
c96bdfcb32 | ||
|
|
2a99e0e435 | ||
|
|
5ffc667bea | ||
|
|
21b8df0375 | ||
|
|
b78ac7d2e9 | ||
|
|
114dc8ffa0 | ||
|
|
eea43d5a73 | ||
|
|
bcb1cf6603 | ||
|
|
6a0c5a874c | ||
|
|
1e8b3826dc | ||
|
|
7efe62ee80 | ||
|
|
febb21a01d | ||
|
|
cb4e6159c4 | ||
|
|
1164ea52f9 | ||
|
|
0f75024e03 | ||
|
|
1e09a1768e | ||
|
|
7c78d963d9 | ||
|
|
b57ecae565 | ||
|
|
89317d4abc | ||
|
|
c5dd3dc7a9 | ||
|
|
ccc46971b4 | ||
|
|
6ad4b425e4 | ||
|
|
761e01c3b9 | ||
|
|
70b9330b61 | ||
|
|
f1e8667945 | ||
|
|
509f501696 | ||
|
|
3fe0368486 | ||
|
|
8f027e274e | ||
|
|
3b0045917c | ||
|
|
a102fc9cad | ||
|
|
f6bca68da2 | ||
|
|
d921e2e61b | ||
|
|
0f7ed0ec70 | ||
|
|
49b12ea4f8 | ||
|
|
69fc466323 | ||
|
|
81d00f2e97 | ||
|
|
ded6540422 | ||
|
|
583a028529 | ||
|
|
f1bb56e2fb | ||
|
|
f583dd47ac | ||
|
|
7e3b3453c0 | ||
|
|
abc354f516 | ||
|
|
79efffe12f | ||
|
|
25130db371 | ||
|
|
932eb94f9d | ||
|
|
9bf4eff173 | ||
|
|
9fc3ddeab7 | ||
|
|
98fdbec442 | ||
|
|
332b90d6c1 | ||
|
|
db2e03eb14 | ||
|
|
8ed8b94ec7 | ||
|
|
63c9308f59 | ||
|
|
1306a777fc | ||
|
|
f739ed7581 | ||
|
|
b4d6015464 | ||
|
|
b9aaafdb30 | ||
|
|
71aa6c6e92 | ||
|
|
f98d2631e5 | ||
|
|
9e94c81ef2 | ||
|
|
d025ef11f8 | ||
|
|
fe7536e374 | ||
|
|
14256137e8 | ||
|
|
bc3e43ac58 | ||
|
|
d0d5373be9 | ||
|
|
997267bad1 | ||
|
|
ef6d0cc4b1 | ||
|
|
ffad244e1e | ||
|
|
fdee7c3d06 | ||
|
|
142cde975f | ||
|
|
004907d306 | ||
|
|
05eb0d0fbe | ||
|
|
f13a1b04e6 | ||
|
|
fd4408e572 | ||
|
|
a84ab7413c | ||
|
|
62b593da08 | ||
|
|
0eb69b6659 | ||
|
|
67b83388b1 | ||
|
|
ecc998aea8 | ||
|
|
6956d16f0e | ||
|
|
f1bc4f5c20 | ||
|
|
f134e2d02a | ||
|
|
6ec72ef945 | ||
|
|
e8d518cd6c | ||
|
|
b564433ff6 | ||
|
|
79f7dcd1a3 | ||
|
|
23ee9b7867 | ||
|
|
afbf36900f | ||
|
|
2829851e49 | ||
|
|
2b8fda3511 | ||
|
|
d31959990e | ||
|
|
26c535db84 | ||
|
|
ea1b910d7e | ||
|
|
8f4c6fb6ac | ||
|
|
9b1861417c | ||
|
|
448989f32f | ||
|
|
2fc26bc154 | ||
|
|
1812249d37 | ||
|
|
14bbaccb9f | ||
|
|
d2b03afcf4 | ||
|
|
1cac3895dc | ||
|
|
01aab25889 | ||
|
|
96d731dfc7 | ||
|
|
8080c32b1f | ||
|
|
4b27aec196 | ||
|
|
38fb510375 | ||
|
|
6422e31b10 | ||
|
|
c0f47195a2 | ||
|
|
40f66977c7 | ||
|
|
e518c0dc14 | ||
|
|
2e161a1f45 | ||
|
|
5ab6e84044 | ||
|
|
e1a6347c4e | ||
|
|
bf8e8798d9 | ||
|
|
08949ee347 | ||
|
|
92a67bb8cb | ||
|
|
363bbf5fd3 | ||
|
|
77f6940336 | ||
|
|
e8eeac6735 | ||
|
|
775fbc9a75 | ||
|
|
8d0f2d371d | ||
|
|
8efe2859b8 | ||
|
|
441c68ead2 | ||
|
|
882b235a78 | ||
|
|
4cd1f201f5 | ||
|
|
013c59f904 | ||
|
|
57474e2dab | ||
|
|
139ced885d | ||
|
|
10b1da135e | ||
|
|
f0bb2e8687 | ||
|
|
4643ccef6f | ||
|
|
753ca7cb53 | ||
|
|
87d2f33e55 | ||
|
|
fc7944d287 | ||
|
|
376e5c1546 | ||
|
|
e8ad947d37 | ||
|
|
067528211f | ||
|
|
92ab9cae27 | ||
|
|
fa2b11b768 | ||
|
|
82f43ac6a6 | ||
|
|
c7660b8c2d | ||
|
|
847831c195 | ||
|
|
e0b246431f | ||
|
|
3b1c4b043d | ||
|
|
e8b8391868 | ||
|
|
cd0a87785e | ||
|
|
c808beec30 | ||
|
|
2d4a3c2554 | ||
|
|
b2b9938484 | ||
|
|
eb1cefe2fa | ||
|
|
5eb5dbddde | ||
|
|
bfe3eff5ff | ||
|
|
e7936e6c9a | ||
|
|
514f92e6f2 | ||
|
|
68fd7a031f | ||
|
|
95f61542b5 | ||
|
|
9fc6f19702 | ||
|
|
4038617d59 | ||
|
|
98ccd577d6 | ||
|
|
1d43a2362c | ||
|
|
0ff675171b | ||
|
|
59594c6637 | ||
|
|
9595733563 | ||
|
|
5eb1d49857 | ||
|
|
fa1fdbf73e | ||
|
|
52e52b3ca1 | ||
|
|
5b4fbe32b1 | ||
|
|
31ea44ccf1 | ||
|
|
7fdb6e1425 | ||
|
|
621f049a5c | ||
|
|
d26ca194b3 | ||
|
|
a012e26d63 | ||
|
|
f80b1fb2fe | ||
|
|
38ed07caa7 | ||
|
|
72ee4be495 | ||
|
|
c85b97a484 | ||
|
|
c7510c628f | ||
|
|
3ca1e550fe | ||
|
|
01e8944077 | ||
|
|
d6ab3298a3 | ||
|
|
97b28bba4d | ||
|
|
7f6674a0e6 | ||
|
|
2c1df5f875 | ||
|
|
e7ae215ab0 | ||
|
|
4a9c790652 | ||
|
|
91ca680911 | ||
|
|
01376aba86 | ||
|
|
d56ffa3531 | ||
|
|
5a5a24bf1a | ||
|
|
3d2c65b398 | ||
|
|
bacb35fb1c | ||
|
|
0a2ed805a2 | ||
|
|
e70c153cd3 | ||
|
|
b54c2b7f57 | ||
|
|
3fe80ec5ac | ||
|
|
e52048c69e | ||
|
|
ceb930aed6 | ||
|
|
e775037366 | ||
|
|
4357e02c58 | ||
|
|
67c0ceedc9 | ||
|
|
0039312a64 | ||
|
|
57f1152751 | ||
|
|
bfb9be1225 | ||
|
|
8837b54aab | ||
|
|
8ab5a4d394 | ||
|
|
29bcf94d50 | ||
|
|
dd68bf8eeb | ||
|
|
fc4dd4524a | ||
|
|
c12ac64678 | ||
|
|
264044272a | ||
|
|
c74162c586 | ||
|
|
fa6ff4e5eb | ||
|
|
01bbc50c68 | ||
|
|
e5457e5029 | ||
|
|
b025bdf0c7 | ||
|
|
600e156c4c | ||
|
|
13ba708adc | ||
|
|
edf8bf2c9d | ||
|
|
c9e0bf4f02 | ||
|
|
8f9eaa22e6 | ||
|
|
3fcd580491 | ||
|
|
cf3cc2e984 | ||
|
|
76322d8089 | ||
|
|
9e29d8d692 | ||
|
|
5d5f8b4d51 | ||
|
|
4d74be881d | ||
|
|
425a312151 | ||
|
|
ea294e8e5d | ||
|
|
e75d0de135 | ||
|
|
81cacbd917 | ||
|
|
c0c78ae9bb | ||
|
|
eb572e8d8f | ||
|
|
781c499806 | ||
|
|
a3d74ea444 | ||
|
|
86a19aa037 | ||
|
|
e484339cca | ||
|
|
6b5a1d0202 | ||
|
|
24247fd6a6 | ||
|
|
2af20d5c40 | ||
|
|
dfb983c3cf | ||
|
|
e1a6b69f9a | ||
|
|
8df935f5fe | ||
|
|
04c5acd1d7 | ||
|
|
c9766d25ef | ||
|
|
aaea661b70 | ||
|
|
7061859112 | ||
|
|
66c24af3d2 | ||
|
|
083c315fd6 | ||
|
|
29b44a181b | ||
|
|
4fdc5ea646 | ||
|
|
e17bfa029c | ||
|
|
279e4c2fa8 | ||
|
|
856a39855e | ||
|
|
4a9d21062a | ||
|
|
ad8f3aa6c9 | ||
|
|
43f85408be | ||
|
|
5739caaa5a | ||
|
|
73cfa5499d | ||
|
|
8f0323fb8d | ||
|
|
83d16932a4 | ||
|
|
84e3f6ca18 | ||
|
|
5d6a568308 | ||
|
|
3e8cba745a | ||
|
|
be4d12789d | ||
|
|
00fbfb5a56 | ||
|
|
27d0f7f277 | ||
|
|
fb1aab2a49 | ||
|
|
cc72fa4793 | ||
|
|
e9c60eff85 | ||
|
|
5b7c87ee79 | ||
|
|
c8b4685fc9 | ||
|
|
561d5675f7 | ||
|
|
c906cb57ee | ||
|
|
84de865daf | ||
|
|
24a264d78c | ||
|
|
62c3c7ac21 | ||
|
|
a7d6ad5162 | ||
|
|
0dbb212d13 | ||
|
|
8002cc2771 | ||
|
|
8d64eac853 | ||
|
|
80d1c5b9f5 | ||
|
|
7175f27da8 | ||
|
|
d6f9aace8c | ||
|
|
aeccb5b472 | ||
|
|
09a7b7718a | ||
|
|
ef2c76efaf | ||
|
|
69793049c3 | ||
|
|
67942a906a | ||
|
|
6a9cae3de8 | ||
|
|
0afdac5683 | ||
|
|
609d09a8e2 | ||
|
|
01e8654fbd | ||
|
|
f477ab84d5 | ||
|
|
9f59d4baa3 | ||
|
|
2e9a1d958c | ||
|
|
e4f2c58933 | ||
|
|
a9e8b3e06b | ||
|
|
daa5b7827a | ||
|
|
dd00152485 | ||
|
|
df52a6ea6b | ||
|
|
7d5197e6fd | ||
|
|
81e08d0cc4 | ||
|
|
32a159d48f | ||
|
|
44f3a7484d | ||
|
|
38eb8e40ea | ||
|
|
fd14c8cdce | ||
|
|
eb6968fb3f | ||
|
|
216da63276 | ||
|
|
08d8f2564a | ||
|
|
1d51002173 | ||
|
|
610d0b272e | ||
|
|
b3e2418b93 | ||
|
|
464d0e50b0 | ||
|
|
7411c54f9e | ||
|
|
7c74deb700 | ||
|
|
e63165e80f | ||
|
|
e2bc9dfacd | ||
|
|
48789dbab7 | ||
|
|
196f0f0475 | ||
|
|
085b59f2e1 | ||
|
|
2fdc2664ff | ||
|
|
a33a5c5527 | ||
|
|
a7c0f37904 | ||
|
|
4889ab3462 | ||
|
|
3923deeaad | ||
|
|
80d6fff0ca | ||
|
|
fe43b4da39 | ||
|
|
67afd05e22 | ||
|
|
0fcaf20221 | ||
|
|
0277b94b37 | ||
|
|
6a9d5fd4cc | ||
|
|
a83106f717 | ||
|
|
4c2a6e346d | ||
|
|
cae63a7ada | ||
|
|
c7efa8c4f1 | ||
|
|
bf6645e829 | ||
|
|
ea1b42510c | ||
|
|
72818ffa42 | ||
|
|
985308bf0c | ||
|
|
86381696f4 | ||
|
|
08b960cc6e | ||
|
|
731c65cd59 | ||
|
|
a85e8a29ff | ||
|
|
22b2f52f8c | ||
|
|
a713ce2126 | ||
|
|
4fac3cf304 | ||
|
|
74e20a8c52 | ||
|
|
8cf4ba25f5 | ||
|
|
feb65cf8f3 | ||
|
|
93592d23f4 | ||
|
|
338a4837bc | ||
|
|
8e19fe535c | ||
|
|
2aeccc0c5c | ||
|
|
8db1234a59 | ||
|
|
80fb351ad3 | ||
|
|
523f85d4d1 | ||
|
|
bfff500915 | ||
|
|
3e83bb0d95 | ||
|
|
bdaee25e61 | ||
|
|
71d3227791 | ||
|
|
a28aa6a8c4 | ||
|
|
292e103073 | ||
|
|
39a3f03e79 | ||
|
|
404a6c12a6 | ||
|
|
8271409afe | ||
|
|
985f659026 | ||
|
|
7c36cbffd0 | ||
|
|
285ea4e3fd | ||
|
|
8ce18647f1 | ||
|
|
aee0478235 | ||
|
|
c3cf1d81c2 | ||
|
|
c2b6cec37d | ||
|
|
b265cabc22 | ||
|
|
463dd8ea74 | ||
|
|
0263125e11 | ||
|
|
1fc8e4c148 | ||
|
|
c43bca6007 | ||
|
|
4c31636d19 | ||
|
|
3a61ab59f2 | ||
|
|
1db3c57ef0 | ||
|
|
eeaf3496d5 | ||
|
|
70f421b787 | ||
|
|
86fa629591 | ||
|
|
553b80164b | ||
|
|
8518933ca8 | ||
|
|
ea53b7d4ad | ||
|
|
37a96d063f | ||
|
|
b360920472 | ||
|
|
9e1744f904 | ||
|
|
85a468bda9 | ||
|
|
b236bb407b | ||
|
|
8978187c64 | ||
|
|
eba0b07782 | ||
|
|
80161c36c6 | ||
|
|
aea912f499 | ||
|
|
a3c4a10721 |
69
.github/CONTRIBUTING.md
vendored
69
.github/CONTRIBUTING.md
vendored
@@ -3,9 +3,9 @@ NewPipe contribution guidelines
|
|||||||
|
|
||||||
## Crash reporting
|
## Crash reporting
|
||||||
|
|
||||||
Report crashes through the automated crash report system of NewPipe.
|
Report crashes through the **automated crash report system** of NewPipe.
|
||||||
This way all the data needed for debugging is included in your bugreport for GitHub.
|
This way all the data needed for debugging is included in your bugreport for GitHub.
|
||||||
You'll see exactly what is sent, be able to add your comments, and then send it.
|
You'll see *exactly* what is sent, be able to add **your comments**, and then send it.
|
||||||
|
|
||||||
## Issue reporting/feature requests
|
## Issue reporting/feature requests
|
||||||
|
|
||||||
@@ -25,22 +25,61 @@ You'll see exactly what is sent, be able to add your comments, and then send it.
|
|||||||
|
|
||||||
## Code contribution
|
## Code contribution
|
||||||
|
|
||||||
* If you want to help out with an existing bug report or feature request, leave a comment on that issue saying you want to try your hand at it.
|
### Guidelines
|
||||||
* If there is no existing issue for what you want to work on, open a new one describing your changes. This gives the team and the community a chance to give feedback before you spend time on something that is already in development, should be done differently, or should be avoided completely.
|
|
||||||
* Stick to NewPipe's style conventions of [checkStyle](https://github.com/checkstyle/checkstyle). It runs each time you build the project.
|
* Stick to NewPipe's *style conventions* of [checkStyle](https://github.com/checkstyle/checkstyle) and [ktlint](https://github.com/pinterest/ktlint). They run each time you build the project.
|
||||||
* Do not bring non-free software (e.g. binary blobs) into the project. Make sure you do not introduce Google
|
|
||||||
libraries.
|
|
||||||
* Stick to [F-Droid contribution guidelines](https://f-droid.org/wiki/page/Inclusion_Policy).
|
* Stick to [F-Droid contribution guidelines](https://f-droid.org/wiki/page/Inclusion_Policy).
|
||||||
* Make changes on a separate branch with a meaningful name, not on the _master_ branch or the _dev_ branch. This is commonly known as *feature branch workflow*. You may then send your changes as a pull request (PR) on GitHub.
|
* In particular **do not bring non-free software** (e.g. binary blobs) into the project. Make sure you do not introduce any closed-source library from Google.
|
||||||
* Please test (compile and run) your code before submitting changes! Ideally, provide test feedback in the PR description. Untested code will **not** be merged!
|
|
||||||
* Make sure your PR is up-to-date with the rest of the code. Often, a simple click on "Update branch" will do the job, but if not, you must rebase the dev branch manually and resolve the problems on your own. You can find help [on the wiki](https://github.com/TeamNewPipe/NewPipe/wiki/How-to-merge-a-PR). That makes the maintainers' jobs way easier.
|
### Before starting development
|
||||||
* Please show intention to maintain your features and code after you contribute a PR. Unmaintained code is a hassle for core developers. If you do not intend to maintain features you plan to contribute, please rethink your submission, or clearly state that in the PR description.
|
|
||||||
|
* If you want to help out with an existing bug report or feature request, **leave a comment** on that issue saying you want to try your hand at it.
|
||||||
|
* If there is no existing issue for what you want to work on, **open a new one** describing the changes you are planning to introduce. This gives the team and the community a chance to give **feedback** before you spend time on something that is already in development, should be done differently, or should be avoided completely.
|
||||||
|
* Please show **intention to maintain your features** and code after you contribute a PR. Unmaintained code is a hassle for core developers. If you do not intend to maintain features you plan to contribute, please rethink your submission, or clearly state that in the PR description.
|
||||||
|
* Create PRs that cover only **one specific issue/solution/bug**. Do not create PRs that are huge monoliths and could have been split into multiple independent contributions.
|
||||||
|
* NewPipe uses [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor) to fetch data from services. If you need to change something there, you must test your changes in NewPipe. Telling NewPipe to use your extractor version can be accomplished by editing the `app/build.gradle` file: the comments under the "NewPipe libraries" section of `dependencies` will help you out.
|
||||||
|
|
||||||
|
### Kotlin in NewPipe
|
||||||
|
* NewPipe will remain mostly Java for time being
|
||||||
|
* Contributions containing a simple conversion from Java to Kotlin should be avoided. Conversions to Kotlin should only be done if Kotlin actually brings improvements like bug fixes or better performance which are not, or only with much more effort, implementable in Java. The core team sees Java as an easier to learn and generally well adopted programming language.
|
||||||
|
|
||||||
|
### Creating a Pull Request (PR)
|
||||||
|
|
||||||
|
* Make changes on a **separate branch** with a meaningful name, not on the _master_ branch or the _dev_ branch. This is commonly known as *feature branch workflow*. You may then send your changes as a pull request (PR) on GitHub.
|
||||||
|
* Please **test** (compile and run) your code before submitting changes! Ideally, provide test feedback in the PR description. Untested code will **not** be merged!
|
||||||
* Respond if someone requests changes or otherwise raises issues about your PRs.
|
* Respond if someone requests changes or otherwise raises issues about your PRs.
|
||||||
* Send PRs that only cover one specific issue/solution/bug. Do not send PRs that are huge and consist of multiple independent solutions.
|
|
||||||
* Try to figure out yourself why builds on our CI fail.
|
* Try to figure out yourself why builds on our CI fail.
|
||||||
|
* Make sure your PR is **up-to-date** with the rest of the code. Often, a simple click on "Update branch" will do the job, but if not, you must *rebase* your branch on the `dev` branch manually and resolve the conflicts on your own. You can find help [on the wiki](https://github.com/TeamNewPipe/NewPipe/wiki/How-to-merge-a-PR). Doing this makes the maintainers' job way easier.
|
||||||
|
|
||||||
|
## IDE setup & building the app
|
||||||
|
|
||||||
|
### Basic setup
|
||||||
|
|
||||||
|
NewPipe is developed using [Android Studio](https://developer.android.com/studio/). Learn more about how to install it and how it works in the [official documentation](https://developer.android.com/studio/intro). In particular, make sure you have accepted Android Studio's SDK licences. Once Android Studio is ready, setting up the NewPipe project is fairly simple:
|
||||||
|
- Clone the NewPipe repository with `git clone https://github.com/TeamNewPipe/NewPipe.git` (or use the link from your own fork, if you want to open a PR).
|
||||||
|
- Open the folder you just cloned with Android Studio.
|
||||||
|
- Build and run it just like you would do with any other app, with the green triangle in the top bar.
|
||||||
|
|
||||||
|
You may find [SonarLint](https://www.sonarlint.org/intellij)'s **inspections** useful in helping you to write good code and prevent bugs.
|
||||||
|
|
||||||
|
### checkStyle setup
|
||||||
|
|
||||||
|
The [checkStyle](https://github.com/checkstyle/checkstyle) plugin verifies that Java code abides by the project style. It runs automatically each time you build the project. If you want to view errors directly in the editor, instead of having to skim through the build output, you can install an Android Studio plugin:
|
||||||
|
- Go to `File -> Settings -> Plugins`, search for `checkstyle` and install `CheckStyle-IDEA`.
|
||||||
|
- Go to `File -> Settings -> Tools -> Checkstyle`.
|
||||||
|
- Add NewPipe's configuration file by clicking the `+` in the right toolbar of the "Configuration File" list.
|
||||||
|
- Under the "Use a local Checkstyle file" bullet, click on `Browse` and pick the file named `checkstyle.xml` in the project's root folder.
|
||||||
|
- Enable "Store relative to project location" so that moving the directory around does not create issues.
|
||||||
|
- Insert a description in the top bar, then click `Next` and then `Finish`.
|
||||||
|
- Activate the configuration file you just added by enabling the checkbox on the left.
|
||||||
|
- Click `Ok` and you are done.
|
||||||
|
|
||||||
|
### ktlint setup
|
||||||
|
|
||||||
|
The [ktlint](https://github.com/pinterest/ktlint) plugin does the same job as checkStyle for Kotlin files. Installing the related plugin is as simple as going to `File -> Settings -> Plugins`, searching for `ktlint` and installing `Ktlint (unofficial)`.
|
||||||
|
|
||||||
## Communication
|
## Communication
|
||||||
|
|
||||||
* The [#newpipe](irc:irc.freenode.net/newpipe) channel on freenode has the core team and other developers in it. [Click here for webchat](https://webchat.freenode.net/?channels=newpipe)!
|
* The #newpipe channel on Libera Chat (`ircs://irc.libera.chat:6697/newpipe`) has the core team and other developers in it. [Click here for webchat](https://web.libera.chat/#newpipe)!
|
||||||
* You can also use a Matrix account to join the Newpipe channel at [#freenode_#newpipe:matrix.org](https://matrix.to/#/#freenode_#newpipe:matrix.org).
|
* You can also use a Matrix account to join the NewPipe channel at [#newpipe:libera.chat](https://matrix.to/#/#newpipe:libera.chat). Some convenient clients, available both for phone and desktop, are listed at that link.
|
||||||
* Post suggestions, changes, ideas etc. on GitHub or IRC.
|
* You can post your suggestions, changes, ideas etc. on either GitHub or IRC.
|
||||||
|
|||||||
4
.github/ISSUE_TEMPLATE/bug_report.md
vendored
4
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -33,7 +33,7 @@ Oh no, a bug! It happens. Thanks for reporting an issue with NewPipe. To make it
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Actual behaviour
|
### Actual behavior
|
||||||
<!-- Tell us what happens with the steps given above. -->
|
<!-- Tell us what happens with the steps given above. -->
|
||||||
|
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ Oh no, a bug! It happens. Thanks for reporting an issue with NewPipe. To make it
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Please fill this out when you do not provide a log generate by NewPipe -->
|
<!-- Please fill this section if you did not provide a log generated by NewPipe -->
|
||||||
|
|
||||||
### Device info
|
### Device info
|
||||||
|
|
||||||
|
|||||||
7
.github/ISSUE_TEMPLATE/config.yml
vendored
7
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1 +1,8 @@
|
|||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: 💬 IRC
|
||||||
|
url: https://web.libera.chat/#newpipe
|
||||||
|
about: Chat with us via IRC for quick Q/A
|
||||||
|
- name: 💬 Matrix
|
||||||
|
url: https://matrix.to/#/#newpipe:libera.chat
|
||||||
|
about: Chat with us via Matrix for quick Q/A
|
||||||
|
|||||||
34
.github/ISSUE_TEMPLATE/feature_request.md
vendored
34
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -5,10 +5,9 @@ labels: enhancement
|
|||||||
assignees: ''
|
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. -->
|
<!-- 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). -->
|
||||||
<!-- The comments between these brackets won't show up in the submitted issue (as you can see in the Preview). -->
|
|
||||||
|
|
||||||
### Checklist
|
### Checklist
|
||||||
<!-- This checklist is COMPULSORY. The first box has been checked for you to show you how it is done. -->
|
<!-- This checklist is COMPULSORY. The first box has been checked for you to show you how it is done. -->
|
||||||
@@ -17,30 +16,9 @@ assignees: ''
|
|||||||
- [ ] I have read the contribution guidelines given at https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md.
|
- [ ] 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.
|
- [ ] This issue contains only one feature request. I will open one issue for every feature I want to request.
|
||||||
|
|
||||||
|
#### What feature do you want?
|
||||||
#### Describe the feature you want
|
<!-- Explain how you want the app's look or behavior to change to suit your needs. -->
|
||||||
<!-- A clear and concise description of what you wish should happen.
|
|
||||||
Example: *I think it would be nice if you add feature Y which makes X possible.*
|
|
||||||
|
|
||||||
Optionally, also describe alternatives you've considered.
|
|
||||||
Example: *Z is also a good alternative. Not as good as Y, but at least...* or *I considered Z, but that didn't turn out to be a good idea because...* -->
|
|
||||||
|
|
||||||
|
|
||||||
|
#### Why do you want this feature?
|
||||||
#### Is your feature request related to a problem? Please describe it
|
<!-- Describe any problem or limitation you come across while using the app which would be solved by this feature. -->
|
||||||
<!-- A clear and concise description of what the problem is. Maybe the developers and the community could brainstorm and come up with a better solution to your problem. If they exist, link to related Issues and/or PRs for developers to keep track easier.
|
|
||||||
Example: *I want to do X, but there is no way to do it.* -->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### Additional context
|
|
||||||
<!-- Add any other context, like screenshots, about the feature request here.
|
|
||||||
Example: *Here's a photo of my cat!* -->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### How will you/everyone benefit from this feature?
|
|
||||||
<!-- Convince us! How does it change your NewPipe experience and/or your life?
|
|
||||||
The better this paragraph is, the more likely a developer will think about working on it.
|
|
||||||
Example: *This feature will help us colonize the galaxy! -->
|
|
||||||
|
|
||||||
|
|||||||
24
.github/ISSUE_TEMPLATE/question.md
vendored
Normal file
24
.github/ISSUE_TEMPLATE/question.md
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
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!* -->
|
||||||
13
.github/PULL_REQUEST_TEMPLATE.md
vendored
13
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -12,18 +12,23 @@
|
|||||||
- create clones
|
- create clones
|
||||||
- take over the world
|
- take over the world
|
||||||
|
|
||||||
|
#### Before/After Screenshots/Screen Record
|
||||||
|
<!-- If your PR changes the app's UI in any way, please include screenshots or a video showing exactly what changed, so that developers and users can pinpoint it easily. Delete this if it doesn't apply to your PR.-->
|
||||||
|
- Before:
|
||||||
|
- After:
|
||||||
|
|
||||||
#### Fixes the following issue(s)
|
#### Fixes the following issue(s)
|
||||||
<!-- Also add any other links relevant to your change. -->
|
<!-- Prefix issues with "Fixes" so that GitHub closes them when the PR is merged (note that each "Fixes #" should be in its own item). Also add any other relevant links. -->
|
||||||
-
|
- Fixes #
|
||||||
|
|
||||||
#### Relies on the following changes
|
#### Relies on the following changes
|
||||||
<!-- Delete this if it doesn't apply to you. -->
|
<!-- Delete this if it doesn't apply to your PR. -->
|
||||||
-
|
-
|
||||||
|
|
||||||
#### APK testing
|
#### APK testing
|
||||||
<!-- Use a new, meaningfully named branch. The name is used as a suffix for the app ID to allow installing and testing multiple versions of NewPipe, e.g. "commentfix", if your PR implements a bugfix for comments. (No names like "patch-0" and "feature-1".) -->
|
<!-- Use a new, meaningfully named branch. The name is used as a suffix for the app ID to allow installing and testing multiple versions of NewPipe, e.g. "commentfix", if your PR implements a bugfix for comments. (No names like "patch-0" and "feature-1".) -->
|
||||||
<!-- Remove the following line if you directly link the APK created by the CI pipeline. Directly linking is preferred if you need to let users test.-->
|
<!-- Remove the following line if you directly link the APK created by the CI pipeline. Directly linking is preferred if you need to let users test.-->
|
||||||
On the website the APK can be found by going to the "Checks" tab below the title and then on "artifacts" on the right.
|
The APK can be found by going to the "Checks" tab below the title. On the left pane, click on "CI", scroll down to "artifacts" and click "app" to download the zip file which contains the debug APK of this PR.
|
||||||
|
|
||||||
#### Due diligence
|
#### Due diligence
|
||||||
- [ ] I read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md).
|
- [ ] I read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md).
|
||||||
|
|||||||
97
.github/workflows/ci.yml
vendored
97
.github/workflows/ci.yml
vendored
@@ -1,35 +1,102 @@
|
|||||||
name: CI
|
name: CI
|
||||||
|
|
||||||
on: [push, pull_request]
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- dev
|
||||||
|
- master
|
||||||
|
paths-ignore:
|
||||||
|
- 'README*.md'
|
||||||
|
- 'fastlane/**'
|
||||||
|
- 'assets/**'
|
||||||
|
- '.github/**/*.md'
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- dev
|
||||||
|
- master
|
||||||
|
paths-ignore:
|
||||||
|
- 'README*.md'
|
||||||
|
- 'fastlane/**'
|
||||||
|
- 'assets/**'
|
||||||
|
- '.github/**/*.md'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-and-test:
|
build-and-test-jvm:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
- uses: gradle/wrapper-validation-action@v1
|
||||||
|
|
||||||
- name: create and checkout branch
|
- name: create and checkout branch
|
||||||
# push events already checked out the branch
|
# push events already checked out the branch
|
||||||
if: github.event_name == 'pull_request'
|
if: github.event_name == 'pull_request'
|
||||||
run: git checkout -B ${{ github.head_ref }}
|
run: git checkout -B ${{ github.head_ref }}
|
||||||
|
|
||||||
- name: set up JDK 1.8
|
- name: set up JDK 11
|
||||||
uses: actions/setup-java@v1.4.3
|
uses: actions/setup-java@v2
|
||||||
with:
|
with:
|
||||||
java-version: 1.8
|
java-version: 11
|
||||||
|
distribution: "temurin"
|
||||||
- name: Cache Gradle dependencies
|
cache: 'gradle'
|
||||||
uses: actions/cache@v2
|
|
||||||
with:
|
- name: Build debug APK and run jvm tests
|
||||||
path: ~/.gradle/caches
|
run: ./gradlew assembleDebug lintDebug testDebugUnitTest --stacktrace -DskipFormatKtlint
|
||||||
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
|
|
||||||
restore-keys: ${{ runner.os }}-gradle
|
|
||||||
|
|
||||||
- name: Build debug APK and run Tests
|
|
||||||
run: ./gradlew assembleDebug lintDebug testDebugUnitTest --stacktrace
|
|
||||||
|
|
||||||
- name: Upload APK
|
- name: Upload APK
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: app
|
name: app
|
||||||
path: app/build/outputs/apk/debug/*.apk
|
path: app/build/outputs/apk/debug/*.apk
|
||||||
|
|
||||||
|
test-android:
|
||||||
|
# macos has hardware acceleration. See android-emulator-runner action
|
||||||
|
runs-on: macos-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
# api-level 19 is min sdk, but throws errors related to desugaring
|
||||||
|
api-level: [ 21, 29 ]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: set up JDK 11
|
||||||
|
uses: actions/setup-java@v2
|
||||||
|
with:
|
||||||
|
java-version: 11
|
||||||
|
distribution: "temurin"
|
||||||
|
cache: 'gradle'
|
||||||
|
|
||||||
|
- name: Run android tests
|
||||||
|
uses: reactivecircus/android-emulator-runner@v2
|
||||||
|
with:
|
||||||
|
api-level: ${{ matrix.api-level }}
|
||||||
|
# workaround to emulator bug: https://github.com/ReactiveCircus/android-emulator-runner/issues/160
|
||||||
|
emulator-build: 7425822
|
||||||
|
script: ./gradlew connectedCheck
|
||||||
|
|
||||||
|
# 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: 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
|
||||||
|
|||||||
20
.github/workflows/no-response.yml
vendored
Normal file
20
.github/workflows/no-response.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
name: No Response
|
||||||
|
|
||||||
|
# Both `issue_comment` and `scheduled` event types are required for this Action
|
||||||
|
# to work properly.
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
schedule:
|
||||||
|
# Run daily at midnight.
|
||||||
|
- cron: '0 0 * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
noResponse:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: lee-dohm/no-response@v0.5.0
|
||||||
|
with:
|
||||||
|
token: ${{ github.token }}
|
||||||
|
daysUntilClose: 14
|
||||||
|
responseRequiredLabel: waiting-for-author
|
||||||
16
.gitignore
vendored
16
.gitignore
vendored
@@ -1,15 +1,15 @@
|
|||||||
.gitignore
|
.gradle/
|
||||||
.gradle
|
local.properties
|
||||||
/local.properties
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
/build
|
build/
|
||||||
/captures
|
captures/
|
||||||
/app/app.iml
|
.idea/
|
||||||
/.idea
|
*.iml
|
||||||
/*.iml
|
|
||||||
*~
|
*~
|
||||||
.weblate
|
.weblate
|
||||||
*.class
|
*.class
|
||||||
|
**/debug/
|
||||||
|
**/release/
|
||||||
|
|
||||||
# vscode / eclipse files
|
# vscode / eclipse files
|
||||||
*.classpath
|
*.classpath
|
||||||
|
|||||||
143
README.es.md
Normal file
143
README.es.md
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
<p align="center"><a href="https://newpipe.net"><img src="assets/new_pipe_icon_5.png" width="150"></a></p>
|
||||||
|
<h2 align="center"><b>NewPipe</b></h2>
|
||||||
|
<h4 align="center">Una interfaz de streaming ligera y libre para Android.</h4>
|
||||||
|
|
||||||
|
<p align="center"><a href="https://f-droid.org/packages/org.schabi.newpipe/"><img src="https://fdroid.gitlab.io/artwork/badge/get-it-on-es.svg"></a></p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/TeamNewPipe/NewPipe/releases" alt="Lanzamientos GitHub"><img src="https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg" ></a>
|
||||||
|
<a href="https://www.gnu.org/licenses/gpl-3.0" alt="Licencia: GPLv3"><img src="https://img.shields.io/badge/Licencia-GPL%20v3-blue.svg"></a>
|
||||||
|
<a href="https://github.com/TeamNewPipe/NewPipe/actions" alt="Estado del Build"><img src="https://github.com/TeamNewPipe/NewPipe/workflows/CI/badge.svg?branch=dev&event=push"></a>
|
||||||
|
<a href="https://hosted.weblate.org/engage/newpipe/es/" alt="Estado de la Traducción"><img src="https://hosted.weblate.org/widgets/newpipe/es/svg-badge.svg"></a>
|
||||||
|
<a href="https://web.libera.chat/#newpipe" alt="Canal de IRC: #newpipe"><img src="https://img.shields.io/badge/Canal%20de%20IRC%20-%23newpipe-brightgreen.svg"></a>
|
||||||
|
<a href="https://www.bountysource.com/teams/newpipe" alt="Recompensas en Bountysource"><img src="https://img.shields.io/bountysource/team/newpipe/activity.svg?colorB=cd201f"></a>
|
||||||
|
</p>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p align="center"><a href="#capturas-de-pantalla">Capturas de Pantalla</a> • <a href="#descripción">Descripción</a> • <a href="#características">Características</a> • <a href="#instalación-y-actualizaciones">Instalación y Actualizaciones</a> • <a href="#contribución">Contribución</a> • <a href="#donar">Donar</a> • <a href="#licencia">Licencia</a></p>
|
||||||
|
<p align="center"><a href="https://newpipe.net">Sitio Web</a> • <a href="https://newpipe.net/blog/">Blog</a> • <a href="https://newpipe.net/FAQ/">Preguntas Frecuentes</a> • <a href="https://newpipe.net/press/">Prensa</a></p>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
*Lea esto en otros idiomas: [English](README.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).*
|
||||||
|
|
||||||
|
<b>AVISO: ESTA ES UNA VERSIÓN BETA, POR LO TANTO, PUEDE ENCONTRAR BUGS. SI ENCUENTRA UNO ABRA UN ISSUE A TRAVÉS DE NUESTRO REPOSITORIO DE GITHUB.</b>
|
||||||
|
|
||||||
|
<b>COLOCAR NEWPIPE O CUALQUIER FORK DE NEWPIPE EN LA GOOGLE PLAY STORE VIOLARÁ SUS TÉRMINOS Y CONDICIONES.</b>
|
||||||
|
|
||||||
|
## Capturas de Pantalla
|
||||||
|
|
||||||
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png)
|
||||||
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png)
|
||||||
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png)
|
||||||
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png)
|
||||||
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png)
|
||||||
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png)
|
||||||
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png)
|
||||||
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png)
|
||||||
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png)
|
||||||
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png)
|
||||||
|
[<img src="fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png" width=405>](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png)
|
||||||
|
[<img src="fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png" width=405>](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png)
|
||||||
|
|
||||||
|
## Descripción
|
||||||
|
|
||||||
|
NewPipe no usa ninguna librería del framework de Google, ni la API de YouTube. Los sitios web solamente se analizan para extraer la información requerida, por lo que esta app se puede usar sin los servicios de Google instalados. Además, no se necesita una cuenta de YouTube para usar NewPipe, lo cual es un software libre de copyleft.
|
||||||
|
|
||||||
|
### Características
|
||||||
|
|
||||||
|
* Buscar videos
|
||||||
|
* No requiere inicio de sesión
|
||||||
|
* Mostrar información general sobre videos
|
||||||
|
* Mirar videos de YouTube
|
||||||
|
* Modo de solo audio en videos de YouTube
|
||||||
|
* Modo pop-up (reproductor flotante)
|
||||||
|
* Elegir un reproductor de video externo para mirar videos
|
||||||
|
* Descargar videos
|
||||||
|
* Descargar solo audio
|
||||||
|
* Abrir videos en Kodi
|
||||||
|
* Mostrar videos próximos/relacionados
|
||||||
|
* Buscar a través de YouTube en un idioma específico
|
||||||
|
* Mirar/Bloquear videos restringidos por edad
|
||||||
|
* Mostrar información general sobre canales
|
||||||
|
* Buscar de canales
|
||||||
|
* Mirar videos de un canal
|
||||||
|
* Soporte Orbot/Tor (todavía no directamente)
|
||||||
|
* Soporte para videos en 1080p/2K/4K
|
||||||
|
* Historial de videos vistos
|
||||||
|
* Suscripción a canales
|
||||||
|
* Historial de búsquedas
|
||||||
|
* Buscar/Mirar listas de reproducción
|
||||||
|
* Mirar listas de reproducción en cola
|
||||||
|
* Poner videos en cola
|
||||||
|
* Listas de reproducción locales
|
||||||
|
* Subtítulos
|
||||||
|
* Soporte para transmisiones en vivo
|
||||||
|
* Mostrar comentarios
|
||||||
|
|
||||||
|
### Servicios Soportados
|
||||||
|
|
||||||
|
NewPipe soporta varios servicios. Nuestras [documentaciones](https://teamnewpipe.github.io/documentation/) ofrecen más información sobre cómo se puede agregar un servicio nuevo a la app y al extractor. Por favor ponte en contacto con nosotros si tienes pensado agregar uno nuevo. Actualmente los servicios soportados son:
|
||||||
|
|
||||||
|
* YouTube
|
||||||
|
* SoundCloud \[beta\]
|
||||||
|
* media.ccc.de \[beta\]
|
||||||
|
* PeerTube instances \[beta\]
|
||||||
|
* Bandcamp \[beta\]
|
||||||
|
|
||||||
|
## Instalación y Actualizaciones
|
||||||
|
|
||||||
|
Se puede instalar NewPipe usando uno de los métodos siguientes:
|
||||||
|
|
||||||
|
1. Agregando nuestro repositorio personalizado a F-Droid e instalarlo desde allí. Las instrucciones están [aquí](https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/).
|
||||||
|
2. Descargando el archivo APK de [aquí](https://github.com/TeamNewPipe/NewPipe/releases) y posteriormente instalarlo.
|
||||||
|
3. Usando el repositorio oficial de F-Droid. Este es el método más lento para obtener actualizaciones, ya que F-Droid debe reconocer los cambios, construir el APK aparte, firmarlo con una clave, y finalmente publicar la actualización.
|
||||||
|
4. Construyendo la app usted mismo. Este es el modo más rápido para obtener nuevas características en su dispositivo, pero es mucho más complicado, así que recomendamos uno de los otros métodos.
|
||||||
|
|
||||||
|
Recomendamos el método 1 para la mayoría de usuarios. Los APKs instalados usando método 1 y 2 son compatibles entre sí, pero no lo son con los instalados usando el método 3. Esto es debido a la clave de firmado, ya que los métodos 1 y 2 usan la misma clave (la nuestra), pero el método 3 usa una clave diferente (la de F-Droid). El método 4 excluye totalmente una clave de firmado. Las claves de firmado aseguran que el usuario no esté siendo engañado para instalar/actualizar una APK maliciosa.
|
||||||
|
|
||||||
|
Además, si quiere cambiar el método de instalación por alguna razón (por ejemplo: la funcionalidad del núcleo de NewPipe se rompe o F-Droid aún no publica la actualización), recomendamos el siguiente procedimiento:
|
||||||
|
1. Respalde su información a través de Ajustes > Contenido > Exportar base de datos; esto guardará su historial (videos vistos y búsquedas), suscripciones, listas de reproducción y ajustes.
|
||||||
|
2. Desinstale NewPipe.
|
||||||
|
3. Descargue el APK con un método distinto e instálelo.
|
||||||
|
4. Importe la información (la base de datos extraída del paso 1) a través de Ajustes > Contenido > Importar base de datos. Tenga en cuenta que esta opción superpondrá su historial actual (tanto de vídeos como de búsquedas), sus listas de reproducción y (opcionalmente) sus configuraciones.
|
||||||
|
|
||||||
|
## Contribución
|
||||||
|
|
||||||
|
Si tiene ideas, traducciones, cambios de diseño, limpieza de código o cambios grandes de código, su ayuda es siempre bienvenida. ¡Cuanto más hagamos, NewPipe será mucho mejor!
|
||||||
|
|
||||||
|
Si quiere involucrarse, fíjese en nuestras [notas de contribución](.github/CONTRIBUTING.md).
|
||||||
|
|
||||||
|
<a href="https://hosted.weblate.org/engage/newpipe/es/">
|
||||||
|
<img src="https://hosted.weblate.org/widgets/newpipe/es/287x66-grey.png" alt="Estado de la Traducción" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
## Donar
|
||||||
|
Si te gusta NewPipe, estaremos felices con una donación. Puede enviar bitcoin o donar a través de Bountysource o Liberapay. Visita nuestro [sitio web](https://newpipe.net/donate) para más información.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><img src="https://bitcoin.org/img/icons/logotop.svg" alt="Bitcoin"></td>
|
||||||
|
<td><img src="assets/bitcoin_qr_code.png" alt="Código QR del Bitcoin" width="100px"></td>
|
||||||
|
<td><samp>16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh</samp></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><a href="https://liberapay.com/TeamNewPipe/"><img src="https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg" alt="Liberapay" width="80px" ></a></td>
|
||||||
|
<td><a href="https://liberapay.com/TeamNewPipe/"><img src="assets/liberapay_qr_code.png" alt="Visita NewPipe en liberapay.com" width="100px"></a></td>
|
||||||
|
<td><a href="https://liberapay.com/TeamNewPipe/donate"><img src="assets/liberapay_donate_button.svg" alt="Dona vía Liberapay" height="35px"></a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><a href="https://www.bountysource.com/teams/newpipe"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Bountysource.png/320px-Bountysource.png" alt="Bountysource" width="190px"></a></td>
|
||||||
|
<td><a href="https://www.bountysource.com/teams/newpipe"><img src="assets/bountysource_qr_code.png" alt="Visita NewPipe en bountysource.com" width="100px"></a></td>
|
||||||
|
<td><a href="https://www.bountysource.com/teams/newpipe/issues"><img src="https://img.shields.io/bountysource/team/newpipe/activity.svg?colorB=cd201f" height="30px" alt="Revisa cuántas recompensas puedes obtener."></a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Política de Privacidad
|
||||||
|
|
||||||
|
El proyecto NewPipe tiene como objetivo ofrecer una experience privada y anónima al usar servicios web multimedia. Por lo tanto, la app no recoleta ningún tipo de información sin su consentimiento. La politica de privacidad de NewPipe explica en detalle qué información es enviada y almacenada cuando envía un informe de error o comenta en [nuestro blog](https://newpipe.net/blog/). Puede encontrar el documento [aquí](https://newpipe.net/legal/privacy/).
|
||||||
|
|
||||||
|
## Licencia
|
||||||
|
|
||||||
|
[](https://www.gnu.org/licenses/gpl-3.0.html)
|
||||||
|
|
||||||
|
NewPipe es Software Libre: Puede usarlo, estudiarlo, compartirlo y mejorarlo a su voluntad. Más específicamente, puede redistribuirlo y/o modificarlo bajo los términos de la [GNU General Public License](https://www.gnu.org/licenses/gpl.html) publicada por la Free Software Foundation tanto si usa la versión 3 o posterior de la licencia.
|
||||||
10
README.ja.md
10
README.ja.md
@@ -2,15 +2,14 @@
|
|||||||
<h2 align="center"><b>NewPipe</b></h2>
|
<h2 align="center"><b>NewPipe</b></h2>
|
||||||
<h4 align="center">自由で軽量な Android 向けストリーミングフロントエンド</h4>
|
<h4 align="center">自由で軽量な Android 向けストリーミングフロントエンド</h4>
|
||||||
|
|
||||||
<!-- F-Droid is extremely out of date, so we hide this for now. -->
|
<p align="center"><a href="https://f-droid.org/packages/org.schabi.newpipe/"><img src="https://fdroid.gitlab.io/artwork/badge/get-it-on-ja.svg"></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-ja.svg"></a></p> -->
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/TeamNewPipe/NewPipe/releases" alt="GitHub リリース"><img src="https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg"></a>
|
<a href="https://github.com/TeamNewPipe/NewPipe/releases" alt="GitHub リリース"><img src="https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg"></a>
|
||||||
<a href="https://www.gnu.org/licenses/gpl-3.0" alt="ライセンス: GPLv3"><img src="https://img.shields.io/badge/License-GPL%20v3-blue.svg"></a>
|
<a href="https://www.gnu.org/licenses/gpl-3.0" alt="ライセンス: GPLv3"><img src="https://img.shields.io/badge/License-GPL%20v3-blue.svg"></a>
|
||||||
<a href="https://github.com/TeamNewPipe/NewPipe/actions" alt="ビルド状態"><img src="https://github.com/TeamNewPipe/NewPipe/workflows/CI/badge.svg?branch=dev&event=push"></a>
|
<a href="https://github.com/TeamNewPipe/NewPipe/actions" alt="ビルド状態"><img src="https://github.com/TeamNewPipe/NewPipe/workflows/CI/badge.svg?branch=dev&event=push"></a>
|
||||||
<a href="https://hosted.weblate.org/engage/newpipe/" alt="翻訳状態"><img src="https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg"></a>
|
<a href="https://hosted.weblate.org/engage/newpipe/" alt="翻訳状態"><img src="https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg"></a>
|
||||||
<a href="http://webchat.freenode.net/?channels=%23newpipe" alt="IRC チャンネル: #newpipe"><img src="https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg"></a>
|
<a href="https://web.libera.chat/#newpipe" alt="IRC チャンネル: #newpipe"><img src="https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg"></a>
|
||||||
<a href="https://www.bountysource.com/teams/newpipe" alt="Bountysource 寄付"><img src="https://img.shields.io/bountysource/team/newpipe/activity.svg?colorB=cd201f"></a>
|
<a href="https://www.bountysource.com/teams/newpipe" alt="Bountysource 寄付"><img src="https://img.shields.io/bountysource/team/newpipe/activity.svg?colorB=cd201f"></a>
|
||||||
</p>
|
</p>
|
||||||
<hr>
|
<hr>
|
||||||
@@ -18,7 +17,7 @@
|
|||||||
<p align="center"><a href="https://newpipe.net">ウェブサイト</a> • <a href="https://newpipe.net/blog/">ブログ</a> • <a href="https://newpipe.net/FAQ/">FAQ</a> • <a href="https://newpipe.net/press/">ニュース</a></p>
|
<p align="center"><a href="https://newpipe.net">ウェブサイト</a> • <a href="https://newpipe.net/blog/">ブログ</a> • <a href="https://newpipe.net/FAQ/">FAQ</a> • <a href="https://newpipe.net/press/">ニュース</a></p>
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
*他の言語で読む: [English](README.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt.br.md), [日本語](README.ja.md), [Română](README.ro.md) 。*
|
*他の言語で読む: [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)。*
|
||||||
|
|
||||||
<b>注意: これはベータ版のため、バグが発生する可能性があります。もしバグが発生した場合、GitHub のリポジトリで Issue を開いてください。</b>
|
<b>注意: これはベータ版のため、バグが発生する可能性があります。もしバグが発生した場合、GitHub のリポジトリで Issue を開いてください。</b>
|
||||||
|
|
||||||
@@ -84,6 +83,7 @@ NewPipe は複数のサービスに対応しています。[ドキュメント](
|
|||||||
* SoundCloud \[ベータ\]
|
* SoundCloud \[ベータ\]
|
||||||
* media.ccc.de \[ベータ\]
|
* media.ccc.de \[ベータ\]
|
||||||
* PeerTube インスタンス \[ベータ\]
|
* PeerTube インスタンス \[ベータ\]
|
||||||
|
* Bandcamp \[ベータ\]
|
||||||
|
|
||||||
<!-- Hidden span to keep old links compatible. -->
|
<!-- Hidden span to keep old links compatible. -->
|
||||||
<span id="updates"></span>
|
<span id="updates"></span>
|
||||||
@@ -143,7 +143,7 @@ NewPipe プロジェクトはメディアウェブサービスを使用する上
|
|||||||
|
|
||||||
<span id="license"></span>
|
<span id="license"></span>
|
||||||
## ライセンス
|
## ライセンス
|
||||||
[](http://www.gnu.org/licenses/gpl-3.0.en.html)
|
[](https://www.gnu.org/licenses/gpl-3.0.en.html)
|
||||||
|
|
||||||
NewPipe はフリーソフトウェアなので、あなたはあなたの望むように使用、習得、共有、改善を行えます。
|
NewPipe はフリーソフトウェアなので、あなたはあなたの望むように使用、習得、共有、改善を行えます。
|
||||||
具体的には、フリーソフトウェア財団により公開された [GNU General Public License](https://www.gnu.org/licenses/gpl.html) のバージョン3のライセンスもしくは、(あなたの選択で) いずれかの後継バージョンの規約の元で配布または改変を行うことができます。
|
具体的には、フリーソフトウェア財団により公開された [GNU General Public License](https://www.gnu.org/licenses/gpl.html) のバージョン3のライセンスもしくは、(あなたの選択で) いずれかの後継バージョンの規約の元で配布または改変を行うことができます。
|
||||||
|
|||||||
12
README.ko.md
12
README.ko.md
@@ -1,14 +1,15 @@
|
|||||||
<p align="center"><a href="https://newpipe.net"><img src="assets/new_pipe_icon_5.png" width="150"></a></p>
|
<p align="center"><a href="https://newpipe.net"><img src="assets/new_pipe_icon_5.png" width="150"></a></p>
|
||||||
<h2 align="center"><b>NewPipe</b></h2>
|
<h2 align="center"><b>NewPipe</b></h2>
|
||||||
<h4 align="center">A libre lightweight streaming frontend for Android.</h4>
|
<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-ko.svg"></a></p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/TeamNewPipe/NewPipe/releases" alt="GitHub release"><img src="https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg" ></a>
|
<a href="https://github.com/TeamNewPipe/NewPipe/releases" alt="GitHub release"><img src="https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg" ></a>
|
||||||
<a href="https://www.gnu.org/licenses/gpl-3.0" alt="License: GPLv3"><img src="https://img.shields.io/badge/License-GPL%20v3-blue.svg"></a>
|
<a href="https://www.gnu.org/licenses/gpl-3.0" alt="License: GPLv3"><img src="https://img.shields.io/badge/License-GPL%20v3-blue.svg"></a>
|
||||||
<a href="https://github.com/TeamNewPipe/NewPipe/actions" alt="Build Status"><img src="https://github.com/TeamNewPipe/NewPipe/workflows/CI/badge.svg?branch=dev&event=push"></a>
|
<a href="https://github.com/TeamNewPipe/NewPipe/actions" alt="Build Status"><img src="https://github.com/TeamNewPipe/NewPipe/workflows/CI/badge.svg?branch=dev&event=push"></a>
|
||||||
<a href="https://hosted.weblate.org/engage/newpipe/" alt="Translation Status"><img src="https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg"></a>
|
<a href="https://hosted.weblate.org/engage/newpipe/" alt="Translation Status"><img src="https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg"></a>
|
||||||
<a href="http://webchat.freenode.net/?channels=%23newpipe" alt="IRC channel: #newpipe"><img src="https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg"></a>
|
<a href="https://web.libera.chat/#newpipe" alt="IRC channel: #newpipe"><img src="https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg"></a>
|
||||||
<a href="https://www.bountysource.com/teams/newpipe" alt="Bountysource bounties"><img src="https://img.shields.io/bountysource/team/newpipe/activity.svg?colorB=cd201f"></a>
|
<a href="https://www.bountysource.com/teams/newpipe" alt="Bountysource bounties"><img src="https://img.shields.io/bountysource/team/newpipe/activity.svg?colorB=cd201f"></a>
|
||||||
</p>
|
</p>
|
||||||
<hr>
|
<hr>
|
||||||
@@ -16,7 +17,7 @@
|
|||||||
<p align="center"><a href="https://newpipe.net">Website</a> • <a href="https://newpipe.net/blog/">Blog</a> • <a href="https://newpipe.net/FAQ/">FAQ</a> • <a href="https://newpipe.net/press/">Press</a></p>
|
<p align="center"><a href="https://newpipe.net">Website</a> • <a href="https://newpipe.net/blog/">Blog</a> • <a href="https://newpipe.net/FAQ/">FAQ</a> • <a href="https://newpipe.net/press/">Press</a></p>
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
*Read this in other languages: [English](README.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [日本語](README.ja.md), [Română](README.ro.md).*
|
*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).*
|
||||||
|
|
||||||
<b>경고: 이 버전은 베타 버전이므로, 버그가 발생할 수도 있습니다. 만약 버그가 발생하였다면, 우리의 GITHUB 저장소에서 ISSUE를 열람하여 주십시오.</b>
|
<b>경고: 이 버전은 베타 버전이므로, 버그가 발생할 수도 있습니다. 만약 버그가 발생하였다면, 우리의 GITHUB 저장소에서 ISSUE를 열람하여 주십시오.</b>
|
||||||
|
|
||||||
@@ -79,6 +80,7 @@ NewPipe는 여러가지 서비스를 지원합니다. 우리의 [문서](https:/
|
|||||||
* SoundCloud \[beta\]
|
* SoundCloud \[beta\]
|
||||||
* media.ccc.de \[beta\]
|
* media.ccc.de \[beta\]
|
||||||
* PeerTube instances \[beta\]
|
* PeerTube instances \[beta\]
|
||||||
|
* Bandcamp \[beta\]
|
||||||
|
|
||||||
## Updates
|
## Updates
|
||||||
NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로 인해), 결국 릴리즈가 발생할 것입니다. 이것들의 형식은 x.xx.x 입니다.
|
NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로 인해), 결국 릴리즈가 발생할 것입니다. 이것들의 형식은 x.xx.x 입니다.
|
||||||
@@ -87,7 +89,7 @@ NewPipe 코드의 변경이 있을 때(기능 추가 또는 버그 수정으로
|
|||||||
따라서 우리는 다른 방법들 중 하나를 사용하는 것을 추천합니다.
|
따라서 우리는 다른 방법들 중 하나를 사용하는 것을 추천합니다.
|
||||||
2. 우리의 커스텀 저장소를 F-Droid에 추가하고 우리가 릴리즈를 게시하는 대로 저곳에서 릴리즈를 설치할 수 있습니다.
|
2. 우리의 커스텀 저장소를 F-Droid에 추가하고 우리가 릴리즈를 게시하는 대로 저곳에서 릴리즈를 설치할 수 있습니다.
|
||||||
이에 대한 설명서는 이곳에서 확인할 수 있습니다: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/
|
이에 대한 설명서는 이곳에서 확인할 수 있습니다: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/
|
||||||
3. 우리가 릴리즈를 게시하는 대로 [Github Releases](https://github.com/TeamNewPipe/NewPipe/releases)에서 APK를 다운받고 이것을 설치할 수 있습니다.
|
3. 우리가 릴리즈를 게시하는 대로 [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases)에서 APK를 다운받고 이것을 설치할 수 있습니다.
|
||||||
4. F-Droid를 통해 업데이트 할 수 있습니다. F-Droid는 변화를 인식하고, 스스로 APK를 생성하고, 이것에 서명하고, 사용자들에서 업데이트를 전달해야만 하기 때문에,
|
4. F-Droid를 통해 업데이트 할 수 있습니다. F-Droid는 변화를 인식하고, 스스로 APK를 생성하고, 이것에 서명하고, 사용자들에서 업데이트를 전달해야만 하기 때문에,
|
||||||
이것은 업데이트를 받는 가장 느린 방법입니다.
|
이것은 업데이트를 받는 가장 느린 방법입니다.
|
||||||
|
|
||||||
@@ -137,7 +139,7 @@ NewPipe 프로젝트는 미디어 웹 서비스를 사용하는 것에 대한
|
|||||||
그러므로, 앱은 당신의 동의 없이 어떤 데이터도 수집하지 않습니다. NewPipe의 개인정보보호정책은 당신이 충돌 리포트를 보내거나, 또는 우리의 블로그에 글을 남길 때 어떤 데이터가 보내지고 저장되는지에 대해 상세히 설명합니다. 이 문서는 [여기](https://newpipe.net/legal/privacy/)에서 확인할 수 있습니다.
|
그러므로, 앱은 당신의 동의 없이 어떤 데이터도 수집하지 않습니다. NewPipe의 개인정보보호정책은 당신이 충돌 리포트를 보내거나, 또는 우리의 블로그에 글을 남길 때 어떤 데이터가 보내지고 저장되는지에 대해 상세히 설명합니다. 이 문서는 [여기](https://newpipe.net/legal/privacy/)에서 확인할 수 있습니다.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
[](http://www.gnu.org/licenses/gpl-3.0.en.html)
|
[](https://www.gnu.org/licenses/gpl-3.0.en.html)
|
||||||
|
|
||||||
NewPipe는 자유 소프트웨어입니다: 당신의 마음대로 이것을 사용하고, 연구하고, 공유하고, 개선할 수 있습니다.
|
NewPipe는 자유 소프트웨어입니다: 당신의 마음대로 이것을 사용하고, 연구하고, 공유하고, 개선할 수 있습니다.
|
||||||
구체적으로 당신은 자유 소프트웨어 재단에서 발행되는, 버전 3 또는 (당신의 선택에 따라)이후 버전의,
|
구체적으로 당신은 자유 소프트웨어 재단에서 발행되는, 버전 3 또는 (당신의 선택에 따라)이후 버전의,
|
||||||
|
|||||||
19
README.md
19
README.md
@@ -2,15 +2,14 @@
|
|||||||
<h2 align="center"><b>NewPipe</b></h2>
|
<h2 align="center"><b>NewPipe</b></h2>
|
||||||
<h4 align="center">A libre lightweight streaming frontend for Android.</h4>
|
<h4 align="center">A libre lightweight streaming frontend for Android.</h4>
|
||||||
|
|
||||||
<!-- F-Droid is extremely out of date, so we hide this for now. -->
|
<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://f-droid.org/wiki/images/0/06/F-Droid-button_get-it-on.png"></a></p> -->
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/TeamNewPipe/NewPipe/releases" alt="GitHub release"><img src="https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg" ></a>
|
<a href="https://github.com/TeamNewPipe/NewPipe/releases" alt="GitHub release"><img src="https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg" ></a>
|
||||||
<a href="https://www.gnu.org/licenses/gpl-3.0" alt="License: GPLv3"><img src="https://img.shields.io/badge/License-GPL%20v3-blue.svg"></a>
|
<a href="https://www.gnu.org/licenses/gpl-3.0" alt="License: GPLv3"><img src="https://img.shields.io/badge/License-GPL%20v3-blue.svg"></a>
|
||||||
<a href="https://github.com/TeamNewPipe/NewPipe/actions" alt="Build Status"><img src="https://github.com/TeamNewPipe/NewPipe/workflows/CI/badge.svg?branch=dev&event=push"></a>
|
<a href="https://github.com/TeamNewPipe/NewPipe/actions" alt="Build Status"><img src="https://github.com/TeamNewPipe/NewPipe/workflows/CI/badge.svg?branch=dev&event=push"></a>
|
||||||
<a href="https://hosted.weblate.org/engage/newpipe/" alt="Translation Status"><img src="https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg"></a>
|
<a href="https://hosted.weblate.org/engage/newpipe/" alt="Translation Status"><img src="https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg"></a>
|
||||||
<a href="http://webchat.freenode.net/?channels=%23newpipe" alt="IRC channel: #newpipe"><img src="https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg"></a>
|
<a href="https://web.libera.chat/#newpipe" alt="IRC channel: #newpipe"><img src="https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg"></a>
|
||||||
<a href="https://www.bountysource.com/teams/newpipe" alt="Bountysource bounties"><img src="https://img.shields.io/bountysource/team/newpipe/activity.svg?colorB=cd201f"></a>
|
<a href="https://www.bountysource.com/teams/newpipe" alt="Bountysource bounties"><img src="https://img.shields.io/bountysource/team/newpipe/activity.svg?colorB=cd201f"></a>
|
||||||
</p>
|
</p>
|
||||||
<hr>
|
<hr>
|
||||||
@@ -18,7 +17,7 @@
|
|||||||
<p align="center"><a href="https://newpipe.net">Website</a> • <a href="https://newpipe.net/blog/">Blog</a> • <a href="https://newpipe.net/FAQ/">FAQ</a> • <a href="https://newpipe.net/press/">Press</a></p>
|
<p align="center"><a href="https://newpipe.net">Website</a> • <a href="https://newpipe.net/blog/">Blog</a> • <a href="https://newpipe.net/FAQ/">FAQ</a> • <a href="https://newpipe.net/press/">Press</a></p>
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
*Read this in other languages: [English](README.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [日本語](README.ja.md),[Română](README.ro.md) .*
|
*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).*
|
||||||
|
|
||||||
<b>WARNING: THIS IS A BETA VERSION, THEREFORE YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE VIA OUR GITHUB REPOSITORY.</b>
|
<b>WARNING: THIS IS A BETA VERSION, THEREFORE YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE VIA OUR GITHUB REPOSITORY.</b>
|
||||||
|
|
||||||
@@ -46,6 +45,7 @@ NewPipe does not use any Google framework libraries, nor the YouTube API. Websit
|
|||||||
### Features
|
### Features
|
||||||
|
|
||||||
* Search videos
|
* Search videos
|
||||||
|
* No Login Required
|
||||||
* Display general info about videos
|
* Display general info about videos
|
||||||
* Watch YouTube videos
|
* Watch YouTube videos
|
||||||
* Listen to YouTube videos
|
* Listen to YouTube videos
|
||||||
@@ -81,20 +81,21 @@ NewPipe supports multiple services. Our [docs](https://teamnewpipe.github.io/doc
|
|||||||
* SoundCloud \[beta\]
|
* SoundCloud \[beta\]
|
||||||
* media.ccc.de \[beta\]
|
* media.ccc.de \[beta\]
|
||||||
* PeerTube instances \[beta\]
|
* PeerTube instances \[beta\]
|
||||||
|
* Bandcamp \[beta\]
|
||||||
|
|
||||||
<!-- Hidden span to keep old links compatible. -->
|
<!-- Hidden span to keep old links compatible. -->
|
||||||
<span id="updates"></span>
|
<span id="updates"></span>
|
||||||
|
|
||||||
## Installation and updates
|
## Installation and updates
|
||||||
You can install NewPipe using one of the following methods:
|
You can install NewPipe using one of the following methods:
|
||||||
1. Add our custom repo to F-Droid and install it from there. The instructions are here: https://newpipe.schabi.org/FAQ/tutorials/install-add-fdroid-repo/
|
1. Add our custom repo to F-Droid and install it from there. The instructions are here: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/
|
||||||
2. Download the APK from [Github Releases](https://github.com/TeamNewPipe/NewPipe/releases) and install it.
|
2. Download the APK from [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) and install it.
|
||||||
3. Update via F-Droid. This is the slowest method of getting updates, as F-Droid must recognize changes, build the APK itself, sign it, then push the update to users. (**IMPORTANT**: as of the time of writing, an issue is preventing releases later than 0.20.1 from being published. Thus, till this issue is solved, if you want to use F-Droid, we recommend method 1.)
|
3. Update via F-Droid. This is the slowest method of getting updates, as F-Droid must recognize changes, build the APK itself, sign it, then push the update to users.
|
||||||
4. Build a debug APK yourself. This is the fastest way to get new features on your device, but is much more complicated, so we recommend using one of the other methods.
|
4. Build a debug APK yourself. This is the fastest way to get new features on your device, but is much more complicated, so we recommend using one of the other methods.
|
||||||
|
|
||||||
We recommend method 1 for most users. APKs installed using method 1 or 2 are compatible with each other, but not with those installed using method 3. This is due to the same signing key (ours) being used for 1 and 2, but a different signing key (F-Droid's) being used for 3. Building a debug APK using method 4 excludes a key entirely. Signing keys help ensure that a user isn't tricked into installing a malicious update to an app.
|
We recommend method 1 for most users. APKs installed using method 1 or 2 are compatible with each other, but not with those installed using method 3. This is due to the same signing key (ours) being used for 1 and 2, but a different signing key (F-Droid's) being used for 3. Building a debug APK using method 4 excludes a key entirely. Signing keys help ensure that a user isn't tricked into installing a malicious update to an app.
|
||||||
|
|
||||||
In the meanwhile, if you want to switch sources for some reason (e.g. NewPipe's core functionality was broken and F-Droid doesn't have the update yet), we recommend following this procedure:
|
In the meanwhile, if you want to switch sources for some reason (e.g. NewPipe's core functionality breaks and F-Droid doesn't have the latest update yet), we recommend following this procedure:
|
||||||
1. Back up your data via Settings > Content > Export Database so you keep your history, subscriptions, and playlists
|
1. Back up your data via Settings > Content > Export Database so you keep your history, subscriptions, and playlists
|
||||||
2. Uninstall NewPipe
|
2. Uninstall NewPipe
|
||||||
3. Download the APK from the new source and install it
|
3. Download the APK from the new source and install it
|
||||||
@@ -137,7 +138,7 @@ The NewPipe project aims to provide a private, anonymous experience for using me
|
|||||||
Therefore, the app does not collect any data without your consent. NewPipe's privacy policy explains in detail what data is sent and stored when you send a crash report, or comment in our blog. You can find the document [here](https://newpipe.net/legal/privacy/).
|
Therefore, the app does not collect any data without your consent. NewPipe's privacy policy explains in detail what data is sent and stored when you send a crash report, or comment in our blog. You can find the document [here](https://newpipe.net/legal/privacy/).
|
||||||
|
|
||||||
## License
|
## License
|
||||||
[](http://www.gnu.org/licenses/gpl-3.0.en.html)
|
[](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 your
|
||||||
will. Specifically you can redistribute and/or modify it under the terms of the
|
will. Specifically you can redistribute and/or modify it under the terms of the
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
17
README.ro.md
17
README.ro.md
File diff suppressed because one or more lines are too long
12
README.so.md
12
README.so.md
File diff suppressed because one or more lines are too long
145
README.tr.md
Normal file
145
README.tr.md
Normal file
File diff suppressed because one or more lines are too long
3
app/.gitignore
vendored
3
app/.gitignore
vendored
@@ -1,3 +0,0 @@
|
|||||||
.gitignore
|
|
||||||
/build
|
|
||||||
*.iml
|
|
||||||
199
app/build.gradle
199
app/build.gradle
File diff suppressed because it is too large
Load Diff
713
app/schemas/org.schabi.newpipe.database.AppDatabase/4.json
Normal file
713
app/schemas/org.schabi.newpipe.database.AppDatabase/4.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,134 +0,0 @@
|
|||||||
package org.schabi.newpipe.database
|
|
||||||
|
|
||||||
import android.content.ContentValues
|
|
||||||
import android.database.sqlite.SQLiteDatabase
|
|
||||||
import androidx.room.Room
|
|
||||||
import androidx.room.testing.MigrationTestHelper
|
|
||||||
import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory
|
|
||||||
import androidx.test.core.app.ApplicationProvider
|
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
|
||||||
import androidx.test.platform.app.InstrumentationRegistry
|
|
||||||
import org.junit.Assert.assertEquals
|
|
||||||
import org.junit.Assert.assertNull
|
|
||||||
import org.junit.Rule
|
|
||||||
import org.junit.Test
|
|
||||||
import org.junit.runner.RunWith
|
|
||||||
import org.schabi.newpipe.extractor.stream.StreamType
|
|
||||||
|
|
||||||
@RunWith(AndroidJUnit4::class)
|
|
||||||
class AppDatabaseTest {
|
|
||||||
companion object {
|
|
||||||
private const val DEFAULT_SERVICE_ID = 0
|
|
||||||
private const val DEFAULT_URL = "https://www.youtube.com/watch?v=cDphUib5iG4"
|
|
||||||
private const val DEFAULT_TITLE = "Test Title"
|
|
||||||
private val DEFAULT_TYPE = StreamType.VIDEO_STREAM
|
|
||||||
private const val DEFAULT_DURATION = 480L
|
|
||||||
private const val DEFAULT_UPLOADER_NAME = "Uploader Test"
|
|
||||||
private const val DEFAULT_THUMBNAIL = "https://example.com/example.jpg"
|
|
||||||
|
|
||||||
private const val DEFAULT_SECOND_SERVICE_ID = 0
|
|
||||||
private const val DEFAULT_SECOND_URL = "https://www.youtube.com/watch?v=ncQU6iBn5Fc"
|
|
||||||
}
|
|
||||||
|
|
||||||
@get:Rule
|
|
||||||
val testHelper = MigrationTestHelper(
|
|
||||||
InstrumentationRegistry.getInstrumentation(),
|
|
||||||
AppDatabase::class.java.canonicalName, FrameworkSQLiteOpenHelperFactory()
|
|
||||||
)
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun migrateDatabaseFrom2to3() {
|
|
||||||
val databaseInV2 = testHelper.createDatabase(AppDatabase.DATABASE_NAME, Migrations.DB_VER_2)
|
|
||||||
|
|
||||||
databaseInV2.run {
|
|
||||||
insert(
|
|
||||||
"streams", SQLiteDatabase.CONFLICT_FAIL,
|
|
||||||
ContentValues().apply {
|
|
||||||
// put("uid", null)
|
|
||||||
put("service_id", DEFAULT_SERVICE_ID)
|
|
||||||
put("url", DEFAULT_URL)
|
|
||||||
put("title", DEFAULT_TITLE)
|
|
||||||
put("stream_type", DEFAULT_TYPE.name)
|
|
||||||
put("duration", DEFAULT_DURATION)
|
|
||||||
put("uploader", DEFAULT_UPLOADER_NAME)
|
|
||||||
put("thumbnail_url", DEFAULT_THUMBNAIL)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
insert(
|
|
||||||
"streams", SQLiteDatabase.CONFLICT_FAIL,
|
|
||||||
ContentValues().apply {
|
|
||||||
// put("uid", null)
|
|
||||||
put("service_id", DEFAULT_SECOND_SERVICE_ID)
|
|
||||||
put("url", DEFAULT_SECOND_URL)
|
|
||||||
// put("title", null)
|
|
||||||
// put("stream_type", null)
|
|
||||||
// put("duration", null)
|
|
||||||
// put("uploader", null)
|
|
||||||
// put("thumbnail_url", null)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
insert(
|
|
||||||
"streams", SQLiteDatabase.CONFLICT_FAIL,
|
|
||||||
ContentValues().apply {
|
|
||||||
// put("uid", null)
|
|
||||||
put("service_id", DEFAULT_SERVICE_ID)
|
|
||||||
// put("url", null)
|
|
||||||
// put("title", null)
|
|
||||||
// put("stream_type", null)
|
|
||||||
// put("duration", null)
|
|
||||||
// put("uploader", null)
|
|
||||||
// put("thumbnail_url", null)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
close()
|
|
||||||
}
|
|
||||||
|
|
||||||
testHelper.runMigrationsAndValidate(
|
|
||||||
AppDatabase.DATABASE_NAME, Migrations.DB_VER_3,
|
|
||||||
true, Migrations.MIGRATION_2_3
|
|
||||||
)
|
|
||||||
|
|
||||||
val migratedDatabaseV3 = getMigratedDatabase()
|
|
||||||
val listFromDB = migratedDatabaseV3.streamDAO().all.blockingFirst()
|
|
||||||
|
|
||||||
// Only expect 2, the one with the null url will be ignored
|
|
||||||
assertEquals(2, listFromDB.size)
|
|
||||||
|
|
||||||
val streamFromMigratedDatabase = listFromDB[0]
|
|
||||||
assertEquals(DEFAULT_SERVICE_ID, streamFromMigratedDatabase.serviceId)
|
|
||||||
assertEquals(DEFAULT_URL, streamFromMigratedDatabase.url)
|
|
||||||
assertEquals(DEFAULT_TITLE, streamFromMigratedDatabase.title)
|
|
||||||
assertEquals(DEFAULT_TYPE, streamFromMigratedDatabase.streamType)
|
|
||||||
assertEquals(DEFAULT_DURATION, streamFromMigratedDatabase.duration)
|
|
||||||
assertEquals(DEFAULT_UPLOADER_NAME, streamFromMigratedDatabase.uploader)
|
|
||||||
assertEquals(DEFAULT_THUMBNAIL, streamFromMigratedDatabase.thumbnailUrl)
|
|
||||||
assertNull(streamFromMigratedDatabase.viewCount)
|
|
||||||
assertNull(streamFromMigratedDatabase.textualUploadDate)
|
|
||||||
assertNull(streamFromMigratedDatabase.uploadDate)
|
|
||||||
assertNull(streamFromMigratedDatabase.isUploadDateApproximation)
|
|
||||||
|
|
||||||
val secondStreamFromMigratedDatabase = listFromDB[1]
|
|
||||||
assertEquals(DEFAULT_SECOND_SERVICE_ID, secondStreamFromMigratedDatabase.serviceId)
|
|
||||||
assertEquals(DEFAULT_SECOND_URL, secondStreamFromMigratedDatabase.url)
|
|
||||||
assertEquals("", secondStreamFromMigratedDatabase.title)
|
|
||||||
// Should fallback to VIDEO_STREAM
|
|
||||||
assertEquals(StreamType.VIDEO_STREAM, secondStreamFromMigratedDatabase.streamType)
|
|
||||||
assertEquals(0, secondStreamFromMigratedDatabase.duration)
|
|
||||||
assertEquals("", secondStreamFromMigratedDatabase.uploader)
|
|
||||||
assertEquals("", secondStreamFromMigratedDatabase.thumbnailUrl)
|
|
||||||
assertNull(secondStreamFromMigratedDatabase.viewCount)
|
|
||||||
assertNull(secondStreamFromMigratedDatabase.textualUploadDate)
|
|
||||||
assertNull(secondStreamFromMigratedDatabase.uploadDate)
|
|
||||||
assertNull(secondStreamFromMigratedDatabase.isUploadDateApproximation)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getMigratedDatabase(): AppDatabase {
|
|
||||||
val database: AppDatabase = Room.databaseBuilder(
|
|
||||||
ApplicationProvider.getApplicationContext(),
|
|
||||||
AppDatabase::class.java, AppDatabase.DATABASE_NAME
|
|
||||||
)
|
|
||||||
.build()
|
|
||||||
testHelper.closeWhenFinished(database)
|
|
||||||
return database
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package org.schabi.newpipe.error;
|
||||||
|
|
||||||
|
import android.os.Parcel;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
import androidx.test.filters.LargeTest;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.schabi.newpipe.R;
|
||||||
|
import org.schabi.newpipe.extractor.ServiceList;
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instrumented tests for {@link ErrorInfo}.
|
||||||
|
*/
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
@LargeTest
|
||||||
|
public class ErrorInfoTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void errorInfoTestParcelable() {
|
||||||
|
final ErrorInfo info = new ErrorInfo(new ParsingException("Hello"),
|
||||||
|
UserAction.USER_REPORT, "request", ServiceList.YouTube.getServiceId());
|
||||||
|
// Obtain a Parcel object and write the parcelable object to it:
|
||||||
|
final Parcel parcel = Parcel.obtain();
|
||||||
|
info.writeToParcel(parcel, 0);
|
||||||
|
parcel.setDataPosition(0);
|
||||||
|
final ErrorInfo infoFromParcel = (ErrorInfo) ErrorInfo.CREATOR.createFromParcel(parcel);
|
||||||
|
|
||||||
|
assertTrue(Arrays.toString(infoFromParcel.getStackTraces())
|
||||||
|
.contains(ErrorInfoTest.class.getSimpleName()));
|
||||||
|
assertEquals(UserAction.USER_REPORT, infoFromParcel.getUserAction());
|
||||||
|
assertEquals(ServiceList.YouTube.getServiceInfo().getName(),
|
||||||
|
infoFromParcel.getServiceName());
|
||||||
|
assertEquals("request", infoFromParcel.getRequest());
|
||||||
|
assertEquals(R.string.parsing_error, infoFromParcel.getMessageStringId());
|
||||||
|
|
||||||
|
parcel.recycle();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
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.TrampolineSchedulerRule
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
|
class LocalPlaylistManagerTest {
|
||||||
|
|
||||||
|
private lateinit var manager: LocalPlaylistManager
|
||||||
|
private lateinit var database: AppDatabase
|
||||||
|
|
||||||
|
@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()
|
||||||
|
|
||||||
|
manager = LocalPlaylistManager(database)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun cleanUp() {
|
||||||
|
database.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun createPlaylist() {
|
||||||
|
val NEWPIPE_URL = "https://newpipe.net/"
|
||||||
|
val stream = StreamEntity(
|
||||||
|
serviceId = 1, url = NEWPIPE_URL, title = "title",
|
||||||
|
streamType = StreamType.VIDEO_STREAM, duration = 1, uploader = "uploader",
|
||||||
|
uploaderUrl = NEWPIPE_URL
|
||||||
|
)
|
||||||
|
|
||||||
|
val result = manager.createPlaylist("name", listOf(stream))
|
||||||
|
|
||||||
|
// This should not behave like this.
|
||||||
|
// Currently list of all stream ids is returned instead of playlist id
|
||||||
|
result.test().await().assertValue(listOf(1L))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun createPlaylist_emptyPlaylistMustReturnEmpty() {
|
||||||
|
val result = manager.createPlaylist("name", emptyList())
|
||||||
|
|
||||||
|
// This should not behave like this.
|
||||||
|
// It should throw an error because currently the result is null
|
||||||
|
result.test().await().assertComplete()
|
||||||
|
manager.playlists.test().awaitCount(1).assertValue(emptyList())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test()
|
||||||
|
fun createPlaylist_nonExistentStreamsAreUpserted() {
|
||||||
|
val stream = StreamEntity(
|
||||||
|
serviceId = 1, url = "https://newpipe.net/", title = "title",
|
||||||
|
streamType = StreamType.VIDEO_STREAM, duration = 1, uploader = "uploader",
|
||||||
|
uploaderUrl = "https://newpipe.net/"
|
||||||
|
)
|
||||||
|
database.streamDAO().insert(stream)
|
||||||
|
val upserted = StreamEntity(
|
||||||
|
serviceId = 1, url = "https://newpipe.net/2", title = "title2",
|
||||||
|
streamType = StreamType.VIDEO_STREAM, duration = 1, uploader = "uploader",
|
||||||
|
uploaderUrl = "https://newpipe.net/"
|
||||||
|
)
|
||||||
|
|
||||||
|
val result = manager.createPlaylist("name", listOf(stream, upserted))
|
||||||
|
|
||||||
|
result.test().await().assertComplete()
|
||||||
|
database.streamDAO().all.test().awaitCount(1).assertValue(listOf(stream, upserted))
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
package org.schabi.newpipe.report;
|
|
||||||
|
|
||||||
import android.os.Parcel;
|
|
||||||
|
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
|
||||||
import androidx.test.filters.LargeTest;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.schabi.newpipe.R;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instrumented tests for {@link ErrorInfo}.
|
|
||||||
*/
|
|
||||||
@RunWith(AndroidJUnit4.class)
|
|
||||||
@LargeTest
|
|
||||||
public class ErrorInfoTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void errorInfoTestParcelable() {
|
|
||||||
final ErrorInfo info = ErrorInfo.make(UserAction.USER_REPORT, "youtube", "request",
|
|
||||||
R.string.general_error);
|
|
||||||
// Obtain a Parcel object and write the parcelable object to it:
|
|
||||||
final Parcel parcel = Parcel.obtain();
|
|
||||||
info.writeToParcel(parcel, 0);
|
|
||||||
parcel.setDataPosition(0);
|
|
||||||
final ErrorInfo infoFromParcel = ErrorInfo.CREATOR.createFromParcel(parcel);
|
|
||||||
|
|
||||||
assertEquals(UserAction.USER_REPORT, infoFromParcel.getUserAction());
|
|
||||||
assertEquals("youtube", infoFromParcel.getServiceName());
|
|
||||||
assertEquals("request", infoFromParcel.getRequest());
|
|
||||||
assertEquals(R.string.general_error, infoFromParcel.getMessage());
|
|
||||||
|
|
||||||
parcel.recycle();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package org.schabi.newpipe.testUtil
|
||||||
|
|
||||||
|
import io.reactivex.rxjava3.android.plugins.RxAndroidPlugins
|
||||||
|
import io.reactivex.rxjava3.plugins.RxJavaPlugins
|
||||||
|
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||||
|
import org.junit.rules.TestRule
|
||||||
|
import org.junit.runner.Description
|
||||||
|
import org.junit.runners.model.Statement
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Always run on [Schedulers.trampoline].
|
||||||
|
* This executes the task in the current thread in FIFO manner.
|
||||||
|
* This ensures that tasks are run quickly inside the tests
|
||||||
|
* and not scheduled away to another thread for later execution
|
||||||
|
*/
|
||||||
|
class TrampolineSchedulerRule : TestRule {
|
||||||
|
|
||||||
|
private val scheduler = Schedulers.trampoline()
|
||||||
|
|
||||||
|
override fun apply(base: Statement, description: Description): Statement =
|
||||||
|
object : Statement() {
|
||||||
|
override fun evaluate() {
|
||||||
|
try {
|
||||||
|
RxJavaPlugins.setComputationSchedulerHandler { scheduler }
|
||||||
|
RxJavaPlugins.setIoSchedulerHandler { scheduler }
|
||||||
|
RxJavaPlugins.setNewThreadSchedulerHandler { scheduler }
|
||||||
|
RxJavaPlugins.setSingleSchedulerHandler { scheduler }
|
||||||
|
RxAndroidPlugins.setInitMainThreadSchedulerHandler { scheduler }
|
||||||
|
|
||||||
|
base.evaluate()
|
||||||
|
} finally {
|
||||||
|
RxJavaPlugins.reset()
|
||||||
|
RxAndroidPlugins.reset()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,24 +2,27 @@ package org.schabi.newpipe.settings;
|
|||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
|
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
|
import org.schabi.newpipe.util.PicassoHelper;
|
||||||
|
|
||||||
import leakcanary.LeakCanary;
|
import leakcanary.LeakCanary;
|
||||||
|
|
||||||
public class DebugSettingsFragment extends BasePreferenceFragment {
|
public class DebugSettingsFragment extends BasePreferenceFragment {
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(@Nullable final Bundle savedInstanceState) {
|
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
||||||
super.onCreate(savedInstanceState);
|
addPreferencesFromResource(R.xml.debug_settings);
|
||||||
|
|
||||||
final Preference showMemoryLeaksPreference
|
final Preference showMemoryLeaksPreference
|
||||||
= findPreference(getString(R.string.show_memory_leaks_key));
|
= findPreference(getString(R.string.show_memory_leaks_key));
|
||||||
|
final Preference showImageIndicatorsPreference
|
||||||
|
= findPreference(getString(R.string.show_image_indicators_key));
|
||||||
final Preference crashTheAppPreference
|
final Preference crashTheAppPreference
|
||||||
= findPreference(getString(R.string.crash_the_app_key));
|
= findPreference(getString(R.string.crash_the_app_key));
|
||||||
|
|
||||||
assert showMemoryLeaksPreference != null;
|
assert showMemoryLeaksPreference != null;
|
||||||
|
assert showImageIndicatorsPreference != null;
|
||||||
assert crashTheAppPreference != null;
|
assert crashTheAppPreference != null;
|
||||||
|
|
||||||
showMemoryLeaksPreference.setOnPreferenceClickListener(preference -> {
|
showMemoryLeaksPreference.setOnPreferenceClickListener(preference -> {
|
||||||
@@ -27,13 +30,13 @@ public class DebugSettingsFragment extends BasePreferenceFragment {
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
showImageIndicatorsPreference.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||||
|
PicassoHelper.setIndicatorsEnabled((Boolean) newValue);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
crashTheAppPreference.setOnPreferenceClickListener(preference -> {
|
crashTheAppPreference.setOnPreferenceClickListener(preference -> {
|
||||||
throw new RuntimeException();
|
throw new RuntimeException();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
|
|
||||||
addPreferencesFromResource(R.xml.debug_settings);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,50 +6,50 @@
|
|||||||
|
|
||||||
<PreferenceScreen
|
<PreferenceScreen
|
||||||
android:fragment="org.schabi.newpipe.settings.VideoAudioSettingsFragment"
|
android:fragment="org.schabi.newpipe.settings.VideoAudioSettingsFragment"
|
||||||
android:icon="?attr/ic_headset"
|
android:icon="@drawable/ic_headset"
|
||||||
android:title="@string/settings_category_video_audio_title"
|
android:title="@string/settings_category_video_audio_title"
|
||||||
app:iconSpaceReserved="false" />
|
app:iconSpaceReserved="false" />
|
||||||
|
|
||||||
<PreferenceScreen
|
<PreferenceScreen
|
||||||
android:fragment="org.schabi.newpipe.settings.DownloadSettingsFragment"
|
android:fragment="org.schabi.newpipe.settings.DownloadSettingsFragment"
|
||||||
android:icon="?attr/ic_file_download"
|
android:icon="@drawable/ic_file_download"
|
||||||
android:title="@string/settings_category_downloads_title"
|
android:title="@string/settings_category_downloads_title"
|
||||||
app:iconSpaceReserved="false" />
|
app:iconSpaceReserved="false" />
|
||||||
|
|
||||||
<PreferenceScreen
|
<PreferenceScreen
|
||||||
android:fragment="org.schabi.newpipe.settings.AppearanceSettingsFragment"
|
android:fragment="org.schabi.newpipe.settings.AppearanceSettingsFragment"
|
||||||
android:icon="?attr/ic_palette"
|
android:icon="@drawable/ic_palette"
|
||||||
android:title="@string/settings_category_appearance_title"
|
android:title="@string/settings_category_appearance_title"
|
||||||
app:iconSpaceReserved="false" />
|
app:iconSpaceReserved="false" />
|
||||||
|
|
||||||
<PreferenceScreen
|
<PreferenceScreen
|
||||||
android:fragment="org.schabi.newpipe.settings.HistorySettingsFragment"
|
android:fragment="org.schabi.newpipe.settings.HistorySettingsFragment"
|
||||||
android:icon="?attr/ic_history"
|
android:icon="@drawable/ic_history"
|
||||||
android:title="@string/settings_category_history_title"
|
android:title="@string/settings_category_history_title"
|
||||||
app:iconSpaceReserved="false" />
|
app:iconSpaceReserved="false" />
|
||||||
|
|
||||||
<PreferenceScreen
|
<PreferenceScreen
|
||||||
android:fragment="org.schabi.newpipe.settings.ContentSettingsFragment"
|
android:fragment="org.schabi.newpipe.settings.ContentSettingsFragment"
|
||||||
android:icon="?attr/ic_language"
|
android:icon="@drawable/ic_language"
|
||||||
android:title="@string/content"
|
android:title="@string/content"
|
||||||
app:iconSpaceReserved="false" />
|
app:iconSpaceReserved="false" />
|
||||||
|
|
||||||
<PreferenceScreen
|
<PreferenceScreen
|
||||||
android:fragment="org.schabi.newpipe.settings.NotificationSettingsFragment"
|
android:fragment="org.schabi.newpipe.settings.NotificationSettingsFragment"
|
||||||
android:icon="?attr/ic_play_arrow"
|
android:icon="@drawable/ic_play_arrow"
|
||||||
android:title="@string/settings_category_notification_title"
|
android:title="@string/settings_category_notification_title"
|
||||||
app:iconSpaceReserved="false" />
|
app:iconSpaceReserved="false" />
|
||||||
|
|
||||||
<PreferenceScreen
|
<PreferenceScreen
|
||||||
android:fragment="org.schabi.newpipe.settings.UpdateSettingsFragment"
|
android:fragment="org.schabi.newpipe.settings.UpdateSettingsFragment"
|
||||||
android:icon="?attr/ic_settings_update"
|
android:icon="@drawable/ic_cloud_download"
|
||||||
android:key="update_pref_screen_key"
|
android:key="update_pref_screen_key"
|
||||||
android:title="@string/settings_category_updates_title"
|
android:title="@string/settings_category_updates_title"
|
||||||
app:iconSpaceReserved="false" />
|
app:iconSpaceReserved="false" />
|
||||||
|
|
||||||
<PreferenceScreen
|
<PreferenceScreen
|
||||||
android:fragment="org.schabi.newpipe.settings.DebugSettingsFragment"
|
android:fragment="org.schabi.newpipe.settings.DebugSettingsFragment"
|
||||||
android:icon="?attr/ic_bug_report"
|
android:icon="@drawable/ic_bug_report"
|
||||||
android:key="@string/debug_pref_screen_key"
|
android:key="@string/debug_pref_screen_key"
|
||||||
android:title="@string/settings_category_debug_title"
|
android:title="@string/settings_category_debug_title"
|
||||||
app:iconSpaceReserved="false" />
|
app:iconSpaceReserved="false" />
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
package="org.schabi.newpipe">
|
package="org.schabi.newpipe"
|
||||||
|
android:installLocation="auto">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
@@ -21,7 +22,6 @@
|
|||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:logo="@mipmap/ic_launcher"
|
android:logo="@mipmap/ic_launcher"
|
||||||
android:requestLegacyExternalStorage="true"
|
|
||||||
android:theme="@style/OpeningTheme"
|
android:theme="@style/OpeningTheme"
|
||||||
android:resizeableActivity="true"
|
android:resizeableActivity="true"
|
||||||
tools:ignore="AllowBackup">
|
tools:ignore="AllowBackup">
|
||||||
@@ -85,7 +85,7 @@
|
|||||||
android:name=".ExitActivity"
|
android:name=".ExitActivity"
|
||||||
android:label="@string/general_error"
|
android:label="@string/general_error"
|
||||||
android:theme="@android:style/Theme.NoDisplay" />
|
android:theme="@android:style/Theme.NoDisplay" />
|
||||||
<activity android:name=".report.ErrorActivity" />
|
<activity android:name=".error.ErrorActivity" />
|
||||||
|
|
||||||
<!-- giga get related -->
|
<!-- giga get related -->
|
||||||
<activity
|
<activity
|
||||||
@@ -106,7 +106,7 @@
|
|||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ReCaptchaActivity"
|
android:name=".error.ReCaptchaActivity"
|
||||||
android:label="@string/recaptcha" />
|
android:label="@string/recaptcha" />
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
@@ -146,6 +146,7 @@
|
|||||||
<data android:pathPrefix="/embed/" />
|
<data android:pathPrefix="/embed/" />
|
||||||
<data android:pathPrefix="/watch" />
|
<data android:pathPrefix="/watch" />
|
||||||
<data android:pathPrefix="/attribution_link" />
|
<data android:pathPrefix="/attribution_link" />
|
||||||
|
<data android:pathPrefix="/shorts/" />
|
||||||
<!-- channel prefix -->
|
<!-- channel prefix -->
|
||||||
<data android:pathPrefix="/channel/" />
|
<data android:pathPrefix="/channel/" />
|
||||||
<data android:pathPrefix="/user/" />
|
<data android:pathPrefix="/user/" />
|
||||||
@@ -224,6 +225,7 @@
|
|||||||
|
|
||||||
<data android:scheme="http" />
|
<data android:scheme="http" />
|
||||||
<data android:scheme="https" />
|
<data android:scheme="https" />
|
||||||
|
<data android:host="tubus.eduvid.org" />
|
||||||
<data android:host="invidio.us" />
|
<data android:host="invidio.us" />
|
||||||
<data android:host="dev.invidio.us" />
|
<data android:host="dev.invidio.us" />
|
||||||
<data android:host="www.invidio.us" />
|
<data android:host="www.invidio.us" />
|
||||||
@@ -231,11 +233,10 @@
|
|||||||
<data android:host="invidious.snopyta.org" />
|
<data android:host="invidious.snopyta.org" />
|
||||||
<data android:host="yewtu.be" />
|
<data android:host="yewtu.be" />
|
||||||
<data android:host="tube.connect.cafe" />
|
<data android:host="tube.connect.cafe" />
|
||||||
<data android:host="invidious.zapashcanon.fr" />
|
|
||||||
<data android:host="invidious.kavin.rocks" />
|
<data android:host="invidious.kavin.rocks" />
|
||||||
<data android:host="invidious.tube" />
|
<data android:host="invidious-us.kavin.rocks" />
|
||||||
|
<data android:host="piped.kavin.rocks" />
|
||||||
<data android:host="invidious.site" />
|
<data android:host="invidious.site" />
|
||||||
<data android:host="invidious.xyz" />
|
|
||||||
<data android:host="vid.mint.lgbt" />
|
<data android:host="vid.mint.lgbt" />
|
||||||
<data android:host="invidiou.site" />
|
<data android:host="invidiou.site" />
|
||||||
<data android:host="invidious.fdn.fr" />
|
<data android:host="invidious.fdn.fr" />
|
||||||
@@ -243,6 +244,30 @@
|
|||||||
<data android:host="invidious.zee.li" />
|
<data android:host="invidious.zee.li" />
|
||||||
<data android:host="vid.puffyan.us" />
|
<data android:host="vid.puffyan.us" />
|
||||||
<data android:host="ytprivate.com" />
|
<data android:host="ytprivate.com" />
|
||||||
|
<data android:host="invidious.namazso.eu" />
|
||||||
|
<data android:host="invidious.silkky.cloud" />
|
||||||
|
<data android:host="invidious.exonip.de" />
|
||||||
|
<data android:host="inv.riverside.rocks" />
|
||||||
|
<data android:host="invidious.blamefran.net" />
|
||||||
|
<data android:host="invidious.moomoo.me" />
|
||||||
|
<data android:host="ytb.trom.tf" />
|
||||||
|
<data android:host="yt.cyberhost.uk" />
|
||||||
|
<data android:host="y.com.cm" />
|
||||||
|
<data android:pathPrefix="/" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<!-- y2u.be filter -->
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
|
||||||
|
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
|
||||||
|
<data android:scheme="http" />
|
||||||
|
<data android:scheme="https" />
|
||||||
|
<data android:host="y2u.be" />
|
||||||
<data android:pathPrefix="/" />
|
<data android:pathPrefix="/" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
@@ -301,6 +326,7 @@
|
|||||||
<data android:scheme="http" />
|
<data android:scheme="http" />
|
||||||
<data android:scheme="https" />
|
<data android:scheme="https" />
|
||||||
|
|
||||||
|
<data android:host="eduvid.org" />
|
||||||
<data android:host="framatube.org" />
|
<data android:host="framatube.org" />
|
||||||
<data android:host="media.assassinate-you.net" />
|
<data android:host="media.assassinate-you.net" />
|
||||||
<data android:host="peertube.co.uk" />
|
<data android:host="peertube.co.uk" />
|
||||||
@@ -314,13 +340,49 @@
|
|||||||
<data android:host="skeptikon.fr" />
|
<data android:host="skeptikon.fr" />
|
||||||
|
|
||||||
<data android:pathPrefix="/videos/" /> <!-- it contains playlists -->
|
<data android:pathPrefix="/videos/" /> <!-- it contains playlists -->
|
||||||
|
<data android:pathPrefix="/w/" /> <!-- short video URLs -->
|
||||||
|
<data android:pathPrefix="/w/p/" /> <!-- short playlist URLs -->
|
||||||
<data android:pathPrefix="/accounts/" />
|
<data android:pathPrefix="/accounts/" />
|
||||||
|
<data android:pathPrefix="/a/" /> <!-- short account URLs -->
|
||||||
<data android:pathPrefix="/video-channels/" />
|
<data android:pathPrefix="/video-channels/" />
|
||||||
|
<data android:pathPrefix="/c/" /> <!-- short video-channels URLs -->
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
|
<!-- Bandcamp filter for tracks, albums and playlists -->
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
|
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
||||||
|
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||||||
|
|
||||||
|
<data android:scheme="http"/>
|
||||||
|
<data android:scheme="https"/>
|
||||||
|
<data android:host="*.bandcamp.com"/>
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<!-- Bandcamp filter for radio -->
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
|
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
||||||
|
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||||||
|
|
||||||
|
<data android:scheme="http"/>
|
||||||
|
<data android:scheme="https"/>
|
||||||
|
<data android:sspPattern="bandcamp.com/?show=*"/>
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
</activity>
|
</activity>
|
||||||
<service
|
<service
|
||||||
android:name=".RouterActivity$FetcherService"
|
android:name=".RouterActivity$FetcherService"
|
||||||
android:exported="false" />
|
android:exported="false" />
|
||||||
|
<service
|
||||||
|
android:name=".CheckForNewAppVersion"
|
||||||
|
android:exported="false" />
|
||||||
|
|
||||||
<!-- opting out of sending metrics to Google in Android System WebView -->
|
<!-- opting out of sending metrics to Google in Android System WebView -->
|
||||||
<meta-data android:name="android.webkit.WebView.MetricsOptOut" android:value="true" />
|
<meta-data android:name="android.webkit.WebView.MetricsOptOut" android:value="true" />
|
||||||
|
|||||||
@@ -51,8 +51,12 @@ import java.util.ArrayList;
|
|||||||
* <li>{@link #saveState()}</li>
|
* <li>{@link #saveState()}</li>
|
||||||
* <li>{@link #restoreState(Parcelable, ClassLoader)}</li>
|
* <li>{@link #restoreState(Parcelable, ClassLoader)}</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
|
*
|
||||||
|
* @deprecated Switch to {@link androidx.viewpager2.widget.ViewPager2} and use
|
||||||
|
* {@link androidx.viewpager2.adapter.FragmentStateAdapter} instead.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
|
@Deprecated
|
||||||
public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapter {
|
public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapter {
|
||||||
private static final String TAG = "FragmentStatePagerAdapt";
|
private static final String TAG = "FragmentStatePagerAdapt";
|
||||||
private static final boolean DEBUG = false;
|
private static final boolean DEBUG = false;
|
||||||
@@ -86,9 +90,10 @@ public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapt
|
|||||||
private final int mBehavior;
|
private final int mBehavior;
|
||||||
private FragmentTransaction mCurTransaction = null;
|
private FragmentTransaction mCurTransaction = null;
|
||||||
|
|
||||||
private final ArrayList<Fragment.SavedState> mSavedState = new ArrayList<Fragment.SavedState>();
|
private final ArrayList<Fragment.SavedState> mSavedState = new ArrayList<>();
|
||||||
private final ArrayList<Fragment> mFragments = new ArrayList<Fragment>();
|
private final ArrayList<Fragment> mFragments = new ArrayList<>();
|
||||||
private Fragment mCurrentPrimaryItem = null;
|
private Fragment mCurrentPrimaryItem = null;
|
||||||
|
private boolean mExecutingFinishUpdate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for {@link FragmentStatePagerAdapterMenuWorkaround}
|
* Constructor for {@link FragmentStatePagerAdapterMenuWorkaround}
|
||||||
@@ -208,7 +213,7 @@ public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapt
|
|||||||
mFragments.set(position, null);
|
mFragments.set(position, null);
|
||||||
|
|
||||||
mCurTransaction.remove(fragment);
|
mCurTransaction.remove(fragment);
|
||||||
if (fragment == mCurrentPrimaryItem) {
|
if (fragment.equals(mCurrentPrimaryItem)) {
|
||||||
mCurrentPrimaryItem = null;
|
mCurrentPrimaryItem = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -247,7 +252,19 @@ public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapt
|
|||||||
@Override
|
@Override
|
||||||
public void finishUpdate(@NonNull final ViewGroup container) {
|
public void finishUpdate(@NonNull final ViewGroup container) {
|
||||||
if (mCurTransaction != null) {
|
if (mCurTransaction != null) {
|
||||||
mCurTransaction.commitNowAllowingStateLoss();
|
// We drop any transactions that attempt to be committed
|
||||||
|
// from a re-entrant call to finishUpdate(). We need to
|
||||||
|
// do this as a workaround for Robolectric running measure/layout
|
||||||
|
// calls inline rather than allowing them to be posted
|
||||||
|
// as they would on a real device.
|
||||||
|
if (!mExecutingFinishUpdate) {
|
||||||
|
try {
|
||||||
|
mExecutingFinishUpdate = true;
|
||||||
|
mCurTransaction.commitNowAllowingStateLoss();
|
||||||
|
} finally {
|
||||||
|
mExecutingFinishUpdate = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
mCurTransaction = null;
|
mCurTransaction = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,8 +63,9 @@ public final class FlingBehavior extends AppBarLayout.Behavior {
|
|||||||
return consumed == dy;
|
return consumed == dy;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onInterceptTouchEvent(final CoordinatorLayout parent, final AppBarLayout child,
|
public boolean onInterceptTouchEvent(@NonNull final CoordinatorLayout parent,
|
||||||
final MotionEvent ev) {
|
@NonNull final AppBarLayout child,
|
||||||
|
@NonNull final MotionEvent ev) {
|
||||||
for (final Integer element : skipInterceptionOfElements) {
|
for (final Integer element : skipInterceptionOfElements) {
|
||||||
final View view = child.findViewById(element);
|
final View view = child.findViewById(element);
|
||||||
if (view != null) {
|
if (view != null) {
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
package org.schabi.newpipe;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Created by Christian Schabesberger on 24.12.15.
|
|
||||||
*
|
|
||||||
* Copyright (C) Christian Schabesberger 2015 <chris.schabesberger@mailbox.org>
|
|
||||||
* ActivityCommunicator.java is part of NewPipe.
|
|
||||||
*
|
|
||||||
* NewPipe is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* NewPipe is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Singleton:
|
|
||||||
* Used to send data between certain Activity/Services within the same process.
|
|
||||||
* This can be considered as an ugly hack inside the Android universe.
|
|
||||||
**/
|
|
||||||
public class ActivityCommunicator {
|
|
||||||
|
|
||||||
private static ActivityCommunicator activityCommunicator;
|
|
||||||
private volatile Class returnActivity;
|
|
||||||
|
|
||||||
public static ActivityCommunicator getCommunicator() {
|
|
||||||
if (activityCommunicator == null) {
|
|
||||||
activityCommunicator = new ActivityCommunicator();
|
|
||||||
}
|
|
||||||
return activityCommunicator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Class getReturnActivity() {
|
|
||||||
return returnActivity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setReturnActivity(final Class returnActivity) {
|
|
||||||
this.returnActivity = returnActivity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,33 +1,31 @@
|
|||||||
package org.schabi.newpipe;
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
import android.app.NotificationChannel;
|
|
||||||
import android.app.NotificationManager;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Build;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.core.app.NotificationChannelCompat;
|
||||||
|
import androidx.core.app.NotificationManagerCompat;
|
||||||
import androidx.multidex.MultiDexApplication;
|
import androidx.multidex.MultiDexApplication;
|
||||||
import androidx.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
|
|
||||||
import com.nostra13.universalimageloader.cache.memory.impl.LRULimitedMemoryCache;
|
import com.jakewharton.processphoenix.ProcessPhoenix;
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
|
||||||
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
|
|
||||||
|
|
||||||
import org.acra.ACRA;
|
import org.acra.ACRA;
|
||||||
import org.acra.config.ACRAConfigurationException;
|
import org.acra.config.ACRAConfigurationException;
|
||||||
import org.acra.config.CoreConfiguration;
|
import org.acra.config.CoreConfiguration;
|
||||||
import org.acra.config.CoreConfigurationBuilder;
|
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.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.downloader.Downloader;
|
import org.schabi.newpipe.extractor.downloader.Downloader;
|
||||||
import org.schabi.newpipe.ktx.ExceptionUtils;
|
import org.schabi.newpipe.ktx.ExceptionUtils;
|
||||||
import org.schabi.newpipe.report.ErrorActivity;
|
import org.schabi.newpipe.settings.NewPipeSettings;
|
||||||
import org.schabi.newpipe.report.ErrorInfo;
|
|
||||||
import org.schabi.newpipe.report.UserAction;
|
|
||||||
import org.schabi.newpipe.settings.SettingsActivity;
|
|
||||||
import org.schabi.newpipe.util.Localization;
|
import org.schabi.newpipe.util.Localization;
|
||||||
|
import org.schabi.newpipe.util.PicassoHelper;
|
||||||
import org.schabi.newpipe.util.ServiceHelper;
|
import org.schabi.newpipe.util.ServiceHelper;
|
||||||
import org.schabi.newpipe.util.StateSaver;
|
import org.schabi.newpipe.util.StateSaver;
|
||||||
|
|
||||||
@@ -38,7 +36,6 @@ import java.util.Arrays;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import io.reactivex.rxjava3.disposables.Disposable;
|
|
||||||
import io.reactivex.rxjava3.exceptions.CompositeException;
|
import io.reactivex.rxjava3.exceptions.CompositeException;
|
||||||
import io.reactivex.rxjava3.exceptions.MissingBackpressureException;
|
import io.reactivex.rxjava3.exceptions.MissingBackpressureException;
|
||||||
import io.reactivex.rxjava3.exceptions.OnErrorNotImplementedException;
|
import io.reactivex.rxjava3.exceptions.OnErrorNotImplementedException;
|
||||||
@@ -65,12 +62,9 @@ import io.reactivex.rxjava3.plugins.RxJavaPlugins;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public class App extends MultiDexApplication {
|
public class App extends MultiDexApplication {
|
||||||
protected static final String TAG = App.class.toString();
|
|
||||||
private static App app;
|
|
||||||
public static final String PACKAGE_NAME = BuildConfig.APPLICATION_ID;
|
public static final String PACKAGE_NAME = BuildConfig.APPLICATION_ID;
|
||||||
|
private static final String TAG = App.class.toString();
|
||||||
@Nullable
|
private static App app;
|
||||||
private Disposable disposable = null;
|
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public static App getApp() {
|
public static App getApp() {
|
||||||
@@ -89,8 +83,14 @@ public class App extends MultiDexApplication {
|
|||||||
|
|
||||||
app = this;
|
app = this;
|
||||||
|
|
||||||
|
if (ProcessPhoenix.isPhoenixProcess(this)) {
|
||||||
|
Log.i(TAG, "This is a phoenix process! "
|
||||||
|
+ "Aborting initialization of App[onCreate]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize settings first because others inits can use its values
|
// Initialize settings first because others inits can use its values
|
||||||
SettingsActivity.initSettings(this);
|
NewPipeSettings.initSettings(this);
|
||||||
|
|
||||||
NewPipe.init(getDownloader(),
|
NewPipe.init(getDownloader(),
|
||||||
Localization.getPreferredLocalization(this),
|
Localization.getPreferredLocalization(this),
|
||||||
@@ -103,20 +103,20 @@ public class App extends MultiDexApplication {
|
|||||||
ServiceHelper.initServices(this);
|
ServiceHelper.initServices(this);
|
||||||
|
|
||||||
// Initialize image loader
|
// Initialize image loader
|
||||||
ImageLoader.getInstance().init(getImageLoaderConfigurations(10, 50));
|
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
|
PicassoHelper.init(this);
|
||||||
|
PicassoHelper.setShouldLoadImages(
|
||||||
|
prefs.getBoolean(getString(R.string.download_thumbnail_key), true));
|
||||||
|
PicassoHelper.setIndicatorsEnabled(MainActivity.DEBUG
|
||||||
|
&& prefs.getBoolean(getString(R.string.show_image_indicators_key), false));
|
||||||
|
|
||||||
configureRxJavaErrorHandler();
|
configureRxJavaErrorHandler();
|
||||||
|
|
||||||
// Check for new version
|
|
||||||
disposable = CheckForNewAppVersion.checkNewVersion(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTerminate() {
|
public void onTerminate() {
|
||||||
if (disposable != null) {
|
|
||||||
disposable.dispose();
|
|
||||||
}
|
|
||||||
super.onTerminate();
|
super.onTerminate();
|
||||||
|
PicassoHelper.terminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Downloader getDownloader() {
|
protected Downloader getDownloader() {
|
||||||
@@ -129,7 +129,7 @@ public class App extends MultiDexApplication {
|
|||||||
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
|
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
|
||||||
getApplicationContext());
|
getApplicationContext());
|
||||||
final String key = getApplicationContext().getString(R.string.recaptcha_cookies_key);
|
final String key = getApplicationContext().getString(R.string.recaptcha_cookies_key);
|
||||||
downloader.setCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY, prefs.getString(key, ""));
|
downloader.setCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY, prefs.getString(key, null));
|
||||||
downloader.updateYoutubeRestrictedModeCookies(getApplicationContext());
|
downloader.updateYoutubeRestrictedModeCookies(getApplicationContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,15 +201,6 @@ public class App extends MultiDexApplication {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private ImageLoaderConfiguration getImageLoaderConfigurations(final int memoryCacheSizeMb,
|
|
||||||
final int diskCacheSizeMb) {
|
|
||||||
return new ImageLoaderConfiguration.Builder(this)
|
|
||||||
.memoryCache(new LRULimitedMemoryCache(memoryCacheSizeMb * 1024 * 1024))
|
|
||||||
.diskCacheSize(diskCacheSizeMb * 1024 * 1024)
|
|
||||||
.imageDownloader(new ImageDownloader(getApplicationContext()))
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called in {@link #attachBaseContext(Context)} after calling the {@code super} method.
|
* Called in {@link #attachBaseContext(Context)} after calling the {@code super} method.
|
||||||
* Should be overridden if MultiDex is enabled, since it has to be initialized before ACRA.
|
* Should be overridden if MultiDex is enabled, since it has to be initialized before ACRA.
|
||||||
@@ -224,54 +215,44 @@ public class App extends MultiDexApplication {
|
|||||||
.setBuildConfigClass(BuildConfig.class)
|
.setBuildConfigClass(BuildConfig.class)
|
||||||
.build();
|
.build();
|
||||||
ACRA.init(this, acraConfig);
|
ACRA.init(this, acraConfig);
|
||||||
} catch (final ACRAConfigurationException ace) {
|
} catch (final ACRAConfigurationException exception) {
|
||||||
ace.printStackTrace();
|
exception.printStackTrace();
|
||||||
ErrorActivity.reportError(this,
|
ErrorActivity.reportError(this, new ErrorInfo(exception,
|
||||||
ace,
|
UserAction.SOMETHING_ELSE, "Could not initialize ACRA crash report"));
|
||||||
null,
|
|
||||||
null,
|
|
||||||
ErrorInfo.make(UserAction.SOMETHING_ELSE, "none",
|
|
||||||
"Could not initialize ACRA crash report", R.string.app_ui_crash));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initNotificationChannels() {
|
private void initNotificationChannels() {
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
// Keep the importance below DEFAULT to avoid making noise on every notification update for
|
||||||
return;
|
// the main and update channels
|
||||||
}
|
final NotificationChannelCompat mainChannel = new NotificationChannelCompat
|
||||||
|
.Builder(getString(R.string.notification_channel_id),
|
||||||
|
NotificationManagerCompat.IMPORTANCE_LOW)
|
||||||
|
.setName(getString(R.string.notification_channel_name))
|
||||||
|
.setDescription(getString(R.string.notification_channel_description))
|
||||||
|
.build();
|
||||||
|
|
||||||
String id = getString(R.string.notification_channel_id);
|
final NotificationChannelCompat appUpdateChannel = new NotificationChannelCompat
|
||||||
String name = getString(R.string.notification_channel_name);
|
.Builder(getString(R.string.app_update_notification_channel_id),
|
||||||
String description = getString(R.string.notification_channel_description);
|
NotificationManagerCompat.IMPORTANCE_LOW)
|
||||||
|
.setName(getString(R.string.app_update_notification_channel_name))
|
||||||
|
.setDescription(getString(R.string.app_update_notification_channel_description))
|
||||||
|
.build();
|
||||||
|
|
||||||
// Keep this below DEFAULT to avoid making noise on every notification update for the main
|
final NotificationChannelCompat hashChannel = new NotificationChannelCompat
|
||||||
// and update channels
|
.Builder(getString(R.string.hash_channel_id),
|
||||||
int importance = NotificationManager.IMPORTANCE_LOW;
|
NotificationManagerCompat.IMPORTANCE_HIGH)
|
||||||
|
.setName(getString(R.string.hash_channel_name))
|
||||||
|
.setDescription(getString(R.string.hash_channel_description))
|
||||||
|
.build();
|
||||||
|
|
||||||
final NotificationChannel mainChannel = new NotificationChannel(id, name, importance);
|
final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
|
||||||
mainChannel.setDescription(description);
|
notificationManager.createNotificationChannelsCompat(Arrays.asList(mainChannel,
|
||||||
|
|
||||||
id = getString(R.string.app_update_notification_channel_id);
|
|
||||||
name = getString(R.string.app_update_notification_channel_name);
|
|
||||||
description = getString(R.string.app_update_notification_channel_description);
|
|
||||||
|
|
||||||
final NotificationChannel appUpdateChannel = new NotificationChannel(id, name, importance);
|
|
||||||
appUpdateChannel.setDescription(description);
|
|
||||||
|
|
||||||
id = getString(R.string.hash_channel_id);
|
|
||||||
name = getString(R.string.hash_channel_name);
|
|
||||||
description = getString(R.string.hash_channel_description);
|
|
||||||
importance = NotificationManager.IMPORTANCE_HIGH;
|
|
||||||
|
|
||||||
final NotificationChannel hashChannel = new NotificationChannel(id, name, importance);
|
|
||||||
hashChannel.setDescription(description);
|
|
||||||
|
|
||||||
final NotificationManager notificationManager = getSystemService(NotificationManager.class);
|
|
||||||
notificationManager.createNotificationChannels(Arrays.asList(mainChannel,
|
|
||||||
appUpdateChannel, hashChannel));
|
appUpdateChannel, hashChannel));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isDisposedRxExceptionsReported() {
|
protected boolean isDisposedRxExceptionsReported() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user