mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2025-09-30 04:40:52 +02:00
Compare commits
1843 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
25d555126d | ||
![]() |
f529d15d7a | ||
![]() |
9eda30fc71 | ||
![]() |
e1024e59c3 | ||
![]() |
175652f23b | ||
![]() |
3329e0c4a1 | ||
![]() |
ea0a0c7c5a | ||
![]() |
535a0504d8 | ||
![]() |
365c49d6d2 | ||
![]() |
b70bea48f2 | ||
![]() |
996f8644c4 | ||
![]() |
b3882ec6e3 | ||
![]() |
f87d447397 | ||
![]() |
9d8570d0d2 | ||
![]() |
796755dad8 | ||
![]() |
9387753995 | ||
![]() |
618d36dc07 | ||
![]() |
f11b0be483 | ||
![]() |
1b8b15b136 | ||
![]() |
bb63673cce | ||
![]() |
6770ad68d5 | ||
![]() |
bfe90c58d1 | ||
![]() |
f1cbeb3c29 | ||
![]() |
554ab4ea16 | ||
![]() |
a2becac2e6 | ||
![]() |
67a651f5e9 | ||
![]() |
ac8efe19d8 | ||
![]() |
ffd65d5afa | ||
![]() |
e86677178f | ||
![]() |
3c49a3341a | ||
![]() |
3433b2a73e | ||
![]() |
730988e7b7 | ||
![]() |
2a3b89e596 | ||
![]() |
f1a31bf58c | ||
![]() |
f1b62a9056 | ||
![]() |
dd943d24c8 | ||
![]() |
801320a3f3 | ||
![]() |
222ed2debd | ||
![]() |
7aab782c5f | ||
![]() |
3836f2f353 | ||
![]() |
5bfaa9a5db | ||
![]() |
95581771d6 | ||
![]() |
db5e3f2479 | ||
![]() |
b5a9631bcc | ||
![]() |
4a2d62ece0 | ||
![]() |
c3836decee | ||
![]() |
f7a030c895 | ||
![]() |
f171a692d3 | ||
![]() |
df5e73192b | ||
![]() |
fc1447d614 | ||
![]() |
77fd206b06 | ||
![]() |
23bdc03490 | ||
![]() |
9fe4de5709 | ||
![]() |
54fd601809 | ||
![]() |
71d027a966 | ||
![]() |
8b63aa2fe6 | ||
![]() |
5a35842c28 | ||
![]() |
d6a1ae3b3a | ||
![]() |
be5f4cb562 | ||
![]() |
d8b5464833 | ||
![]() |
5e7bbcd3bc | ||
![]() |
5383e53c4d | ||
![]() |
5b6fc713d6 | ||
![]() |
272be025e1 | ||
![]() |
e4ab250729 | ||
![]() |
4dcca9d5af | ||
![]() |
1988a08631 | ||
![]() |
34de0e569f | ||
![]() |
343d0fa09d | ||
![]() |
8eb6686103 | ||
![]() |
9e9687b5b8 | ||
![]() |
ef888d1afe | ||
![]() |
0e70e1a37a | ||
![]() |
06aaceb673 | ||
![]() |
703a4b7858 | ||
![]() |
32ba2ba83d | ||
![]() |
272b03ed92 | ||
![]() |
ecf19214ee | ||
![]() |
f3eb0c497f | ||
![]() |
c1f29a7565 | ||
![]() |
fb745b9108 | ||
![]() |
9410bf40d3 | ||
![]() |
c7a695cb04 | ||
![]() |
b991d5cab6 | ||
![]() |
42fd318321 | ||
![]() |
903aeec383 | ||
![]() |
8768fe4dcf | ||
![]() |
d8ba2ceed4 | ||
![]() |
ef8a1bcf47 | ||
![]() |
2b1469e02e | ||
![]() |
83ea91586b | ||
![]() |
dbb86d25e1 | ||
![]() |
794c74e514 | ||
![]() |
fbcdaa77e3 | ||
![]() |
dbdc04c45e | ||
![]() |
a4bb22280f | ||
![]() |
c0e1bbbfb6 | ||
![]() |
196b9dc771 | ||
![]() |
09578b4e46 | ||
![]() |
4d88dadf8c | ||
![]() |
d4fda5847d | ||
![]() |
b1ea7d6cbc | ||
![]() |
4e7632949d | ||
![]() |
26a8bd147b | ||
![]() |
dd726fac02 | ||
![]() |
3a3ecc7775 | ||
![]() |
6665d630ec | ||
![]() |
7706d7471a | ||
![]() |
ed87d6b268 | ||
![]() |
ed51c8b318 | ||
![]() |
6ffbb7b1ed | ||
![]() |
06764db118 | ||
![]() |
4864fa3f2d | ||
![]() |
2d25b6a1f4 | ||
![]() |
be76b3d105 | ||
![]() |
81cbeb4b24 | ||
![]() |
f0b658ba14 | ||
![]() |
295836fc7e | ||
![]() |
54e9858148 | ||
![]() |
b68f015825 | ||
![]() |
87ae26ede3 | ||
![]() |
49615f81b4 | ||
![]() |
87ce5140fa | ||
![]() |
3ba9fb375c | ||
![]() |
f4bd20361a | ||
![]() |
54f8a17aac | ||
![]() |
7a1e5026c4 | ||
![]() |
323161c6de | ||
![]() |
1ac4890893 | ||
![]() |
e9c88fecc5 | ||
![]() |
33deaaefac | ||
![]() |
bb6438ebe4 | ||
![]() |
d42af74afa | ||
![]() |
ea1f2f4ad4 | ||
![]() |
95b45651bb | ||
![]() |
0d5730d33e | ||
![]() |
0625a35ddf | ||
![]() |
2d3271ee13 | ||
![]() |
6da2e80027 | ||
![]() |
439edbf85c | ||
![]() |
e0237a0b86 | ||
![]() |
e1845ba603 | ||
![]() |
1cf757d401 | ||
![]() |
14985b1727 | ||
![]() |
6b2788be57 | ||
![]() |
ac888f4cb2 | ||
![]() |
df06cfc4c5 | ||
![]() |
dcba3a681c | ||
![]() |
7fd49c22a8 | ||
![]() |
314287a6d9 | ||
![]() |
f5e7b8f229 | ||
![]() |
de84db070e | ||
![]() |
c1d5a5cd98 | ||
![]() |
160a04c3c7 | ||
![]() |
23bfc30c57 | ||
![]() |
d9329bffd1 | ||
![]() |
bafc1df988 | ||
![]() |
30b8835919 | ||
![]() |
44b19e75f6 | ||
![]() |
2a558ad11d | ||
![]() |
123d8972e1 | ||
![]() |
e550a8ea27 | ||
![]() |
8b29460fed | ||
![]() |
e380d63c57 | ||
![]() |
89b4f2c4d4 | ||
![]() |
6c2f63f738 | ||
![]() |
77c612f0f5 | ||
![]() |
2d06c01192 | ||
![]() |
d13c19f05f | ||
![]() |
3d2ba05c77 | ||
![]() |
6898b9d9a4 | ||
![]() |
a65aaa6b83 | ||
![]() |
b3136c20c4 | ||
![]() |
0ae3dfd9cc | ||
![]() |
0370fa6c00 | ||
![]() |
7ab323b00c | ||
![]() |
541eb70b9c | ||
![]() |
e53e5ca20e | ||
![]() |
609bf64856 | ||
![]() |
a9fafe91a5 | ||
![]() |
0466b320dd | ||
![]() |
5b74d22d0a | ||
![]() |
4152c7f956 | ||
![]() |
d5f603303d | ||
![]() |
fc9c073a60 | ||
![]() |
9a0c2c40bd | ||
![]() |
d0fc9fda71 | ||
![]() |
df9823988e | ||
![]() |
eeb09c074c | ||
![]() |
af0928e2bd | ||
![]() |
d9cf4de3f7 | ||
![]() |
2d6dd4b3be | ||
![]() |
160312393a | ||
![]() |
e3ff9f9c86 | ||
![]() |
95570d796d | ||
![]() |
cd0d58a915 | ||
![]() |
2f1007c725 | ||
![]() |
b53d5d8c00 | ||
![]() |
3c4a4e5384 | ||
![]() |
0e5f85db95 | ||
![]() |
ad3364671d | ||
![]() |
3add24b8aa | ||
![]() |
e0f02d4080 | ||
![]() |
00c4c10472 | ||
![]() |
a2b8cc9dc2 | ||
![]() |
3465002cbb | ||
![]() |
631cb73305 | ||
![]() |
b3b6384bef | ||
![]() |
941ca575fb | ||
![]() |
2d65c3595d | ||
![]() |
b3812d913a | ||
![]() |
adcc420c81 | ||
![]() |
b97ad99bb4 | ||
![]() |
e93a2850d6 | ||
![]() |
411d0691fa | ||
![]() |
c843e77183 | ||
![]() |
093d6e5336 | ||
![]() |
8a3c752d42 | ||
![]() |
b4e073cde7 | ||
![]() |
814efbf8df | ||
![]() |
11e048abb1 | ||
![]() |
34e7855af6 | ||
![]() |
de54dc27ad | ||
![]() |
790133978d | ||
![]() |
b914d67d9d | ||
![]() |
518eb97e3a | ||
![]() |
f41549ccf1 | ||
![]() |
b69e477ecd | ||
![]() |
0062ff9cfa | ||
![]() |
f8de72f59f | ||
![]() |
7317737e90 | ||
![]() |
5b8eda4805 | ||
![]() |
886a949a00 | ||
![]() |
92e13dafe5 | ||
![]() |
c9be812330 | ||
![]() |
59e7ebabfa | ||
![]() |
1afc48fce3 | ||
![]() |
a1e4ef9e8e | ||
![]() |
5ada0ae2c7 | ||
![]() |
a5312c1341 | ||
![]() |
150e156d26 | ||
![]() |
6d38615ea8 | ||
![]() |
011cc7d337 | ||
![]() |
b747d09836 | ||
![]() |
4b7311bafd | ||
![]() |
eeba9c0a5f | ||
![]() |
11d9a037f7 | ||
![]() |
883e4fcd7c | ||
![]() |
2017e6a3e3 | ||
![]() |
bccfe500b3 | ||
![]() |
5846fbabce | ||
![]() |
52e89c1d1c | ||
![]() |
1605e50cef | ||
![]() |
2215ce58a4 | ||
![]() |
a13e6b69e3 | ||
![]() |
1d6370e11c | ||
![]() |
bd34c7ede3 | ||
![]() |
bc8954fbba | ||
![]() |
9cf0bc6c82 | ||
![]() |
71b32fe641 | ||
![]() |
530f745e44 | ||
![]() |
a5a2313851 | ||
![]() |
4e98c2e7f6 | ||
![]() |
14486782dc | ||
![]() |
31814b70da | ||
![]() |
408e819d32 | ||
![]() |
622676f9bc | ||
![]() |
5b631e0387 | ||
![]() |
06d54ef77e | ||
![]() |
6c5ef567ed | ||
![]() |
f86b40302d | ||
![]() |
273c287fbf | ||
![]() |
6cb16be5df | ||
![]() |
a4feb3fc09 | ||
![]() |
ba6c7de35a | ||
![]() |
79e2bb382f | ||
![]() |
0090256ded | ||
![]() |
00ce077758 | ||
![]() |
a801d0994f | ||
![]() |
628575dc5f | ||
![]() |
0a22f21410 | ||
![]() |
97ff9e9c5b | ||
![]() |
8b3a09306b | ||
![]() |
7766fd13fd | ||
![]() |
c79997ebe3 | ||
![]() |
0fd1e2fcd9 | ||
![]() |
99442b6e04 | ||
![]() |
b8a35e9e4a | ||
![]() |
e833d415e3 | ||
![]() |
8030312924 | ||
![]() |
a84b54f940 | ||
![]() |
c66c81294e | ||
![]() |
bfdc215c65 | ||
![]() |
e10c7beedb | ||
![]() |
18c3286364 | ||
![]() |
8d2ec30818 | ||
![]() |
e5ffddfc6b | ||
![]() |
59fc1e4b5f | ||
![]() |
7ead581953 | ||
![]() |
b860980df4 | ||
![]() |
97a366d62e | ||
![]() |
9ad68097d0 | ||
![]() |
331999fb95 | ||
![]() |
6519d7051d | ||
![]() |
552d585fca | ||
![]() |
24c24d6c72 | ||
![]() |
b7f50c3e12 | ||
![]() |
aed1687a45 | ||
![]() |
daa427dc15 | ||
![]() |
e9d4303fdb | ||
![]() |
5485e994ee | ||
![]() |
87228673b4 | ||
![]() |
d306513319 | ||
![]() |
e08480f345 | ||
![]() |
13c9096417 | ||
![]() |
d3d65c8e3a | ||
![]() |
12ac5ef781 | ||
![]() |
adef9a8acf | ||
![]() |
5ef407d15f | ||
![]() |
970b636eb4 | ||
![]() |
fcf9131aae | ||
![]() |
7fd27fac45 | ||
![]() |
6e17af91fb | ||
![]() |
68555573ad | ||
![]() |
fb9905a89e | ||
![]() |
1e7504dc5a | ||
![]() |
d7af019511 | ||
![]() |
04bb070afa | ||
![]() |
e693d80857 | ||
![]() |
45ae05f1b5 | ||
![]() |
05a83beb44 | ||
![]() |
8a1a42e83b | ||
![]() |
1b3f3cedb3 | ||
![]() |
f815ae5973 | ||
![]() |
fb7035bf22 | ||
![]() |
02bcbc3221 | ||
![]() |
f0a51d4ab4 | ||
![]() |
24fe8fe9a0 | ||
![]() |
244e95d959 | ||
![]() |
ad72c64e32 | ||
![]() |
767ac6a51b | ||
![]() |
3a6f87659a | ||
![]() |
b7ac16c7d9 | ||
![]() |
f9f84cbd89 | ||
![]() |
701c87eefa | ||
![]() |
5379cf0544 | ||
![]() |
6b5c37f17f | ||
![]() |
50b2fad180 | ||
![]() |
b9cb65b24e | ||
![]() |
d7574973e9 | ||
![]() |
ff48c93d59 | ||
![]() |
d2e6700dd1 | ||
![]() |
05b8c3f35f | ||
![]() |
70b643e7ba | ||
![]() |
dce973a519 | ||
![]() |
eb2f75579a | ||
![]() |
773316ce4f | ||
![]() |
5fd7ae33b4 | ||
![]() |
13a065f2dc | ||
![]() |
1a8ff81087 | ||
![]() |
65637fce40 | ||
![]() |
b11fa7a28e | ||
![]() |
45408caf33 | ||
![]() |
963ee4dbab | ||
![]() |
3b46d5a440 | ||
![]() |
212fddd8e1 | ||
![]() |
433485470e | ||
![]() |
e160a1f794 | ||
![]() |
7911b7e637 | ||
![]() |
7fc5a77e7e | ||
![]() |
f0fb55640e | ||
![]() |
d5685f2255 | ||
![]() |
a732233db6 | ||
![]() |
a5918c29ee | ||
![]() |
3b719803bb | ||
![]() |
d77463c9f1 | ||
![]() |
2d8fd9bedf | ||
![]() |
b17a667a9d | ||
![]() |
b7287a070b | ||
![]() |
fbb5c8cdd6 | ||
![]() |
baaf2815e4 | ||
![]() |
d8b5549fd9 | ||
![]() |
6de03f2bf0 | ||
![]() |
caf7c55069 | ||
![]() |
7d499ffba1 | ||
![]() |
4abf6b2f5c | ||
![]() |
a842b06301 | ||
![]() |
0bca4925d7 | ||
![]() |
ae3953cbec | ||
![]() |
a99667c54c | ||
![]() |
465963a8c2 | ||
![]() |
b9b4762faf | ||
![]() |
a56b128a4b | ||
![]() |
d43cc089fd | ||
![]() |
771513d287 | ||
![]() |
c387678217 | ||
![]() |
847368718b | ||
![]() |
458b3daac3 | ||
![]() |
3ea5278b12 | ||
![]() |
20b9748a8c | ||
![]() |
79487adbec | ||
![]() |
89f3fca6b1 | ||
![]() |
f290b2bf5a | ||
![]() |
04e7d13043 | ||
![]() |
e41218c46b | ||
![]() |
8562fbdbbe | ||
![]() |
c841d7a32b | ||
![]() |
8827ae4d2c | ||
![]() |
2e1029e157 | ||
![]() |
a7dc0c2d55 | ||
![]() |
7f1749d853 | ||
![]() |
b4a34d58db | ||
![]() |
4a50fcab2c | ||
![]() |
c9ef089199 | ||
![]() |
94ecf9a081 | ||
![]() |
67aaa9a655 | ||
![]() |
823f5640f7 | ||
![]() |
45d1c63895 | ||
![]() |
d3b6781bb8 | ||
![]() |
21d1f69d6d | ||
![]() |
1b9f5989ef | ||
![]() |
348e46ff3b | ||
![]() |
7918e3a1aa | ||
![]() |
d6d8c7830c | ||
![]() |
f53a0f0d07 | ||
![]() |
17edd1c3d4 | ||
![]() |
b0685c153a | ||
![]() |
a5ca20ee4c | ||
![]() |
03685db2fc | ||
![]() |
68ed738dcd | ||
![]() |
5293d17e32 | ||
![]() |
f2e4b69466 | ||
![]() |
ec8b00042b | ||
![]() |
08db1d59e5 | ||
![]() |
7c79d421e8 | ||
![]() |
ade5e38fa5 | ||
![]() |
7385aa09a8 | ||
![]() |
185a5fad88 | ||
![]() |
a1e2477d14 | ||
![]() |
a1200a5fff | ||
![]() |
91a0257c8f | ||
![]() |
53ffc82fe2 | ||
![]() |
801267df18 | ||
![]() |
6e73e0b395 | ||
![]() |
7aa8a5c368 | ||
![]() |
3ecbbea7cb | ||
![]() |
77cd3182f1 | ||
![]() |
c7ccf9bab8 | ||
![]() |
06e70abb86 | ||
![]() |
88c86e88b0 | ||
![]() |
2d6cf48532 | ||
![]() |
19e152a54b | ||
![]() |
2898bead66 | ||
![]() |
381c329441 | ||
![]() |
a3de3705f7 | ||
![]() |
dc3dc6b77f | ||
![]() |
e028a63f30 | ||
![]() |
d196f8b4b2 | ||
![]() |
4274827dbe | ||
![]() |
7a30f4a7d2 | ||
![]() |
d0c03a0211 | ||
![]() |
787b136d13 | ||
![]() |
08412d6108 | ||
![]() |
d8f7db4715 | ||
![]() |
bff238774e | ||
![]() |
d2aaa6f691 | ||
![]() |
c900ef036c | ||
![]() |
b2164ce5fc | ||
![]() |
d088d432c5 | ||
![]() |
c9fafbe198 | ||
![]() |
2d909b0514 | ||
![]() |
c2a012553d | ||
![]() |
085f0266ac | ||
![]() |
7ede2daa3c | ||
![]() |
713c53d170 | ||
![]() |
110b3a6a8f | ||
![]() |
e12e6dd7a7 | ||
![]() |
e183fc6118 | ||
![]() |
dd57e246b8 | ||
![]() |
f4a4172369 | ||
![]() |
b96d1714b5 | ||
![]() |
dbd809b040 | ||
![]() |
ff4e6b139d | ||
![]() |
af098aaac8 | ||
![]() |
5d7e62c736 | ||
![]() |
e2ead011f5 | ||
![]() |
a067c950e1 | ||
![]() |
3369618cfa | ||
![]() |
4e9b6520e5 | ||
![]() |
a074203fae | ||
![]() |
42092e3f28 | ||
![]() |
c07b34e298 | ||
![]() |
ef5f181328 | ||
![]() |
a7ea2fcf92 | ||
![]() |
e81730715c | ||
![]() |
c09f2ad482 | ||
![]() |
84aef8b5b5 | ||
![]() |
8fac3e8221 | ||
![]() |
5874ed781d | ||
![]() |
d8f29bd7a7 | ||
![]() |
8120b6aaaa | ||
![]() |
13a0d1de70 | ||
![]() |
20e828be51 | ||
![]() |
ccd82fb8b8 | ||
![]() |
0711650ff8 | ||
![]() |
4194ac2226 | ||
![]() |
248e2d7ee0 | ||
![]() |
1daa654051 | ||
![]() |
d751434979 | ||
![]() |
8cc21920b7 | ||
![]() |
248212588d | ||
![]() |
13c0fdef08 | ||
![]() |
dfc27b2480 | ||
![]() |
b2d78d380b | ||
![]() |
faa6cb5c7d | ||
![]() |
452977abdf | ||
![]() |
93570b2f59 | ||
![]() |
073f5c2c8c | ||
![]() |
1b4313f847 | ||
![]() |
07cead7e99 | ||
![]() |
f128751aba | ||
![]() |
9516d9da17 | ||
![]() |
e9aafc2a56 | ||
![]() |
a91a6575e0 | ||
![]() |
5bd4093dfb | ||
![]() |
f9890e2016 | ||
![]() |
00529fe134 | ||
![]() |
5e9dce7d39 | ||
![]() |
734680b9f0 | ||
![]() |
d0b5345252 | ||
![]() |
c2b4a44a59 | ||
![]() |
38c79bbc11 | ||
![]() |
0d7028a36c | ||
![]() |
b63f687491 | ||
![]() |
952b636569 | ||
![]() |
e14ba48244 | ||
![]() |
720c8c31ec | ||
![]() |
4e8407ed8f | ||
![]() |
26c5f69161 | ||
![]() |
078ae15794 | ||
![]() |
16ae90dc9f | ||
![]() |
3de5afc68e | ||
![]() |
a7e8f5087e | ||
![]() |
5cc60ed760 | ||
![]() |
2e6e75cd4e | ||
![]() |
9f3b35634a | ||
![]() |
c24dfc63dc | ||
![]() |
c029929850 | ||
![]() |
d9100913d5 | ||
![]() |
a7fbe05a73 | ||
![]() |
e03d970bc2 | ||
![]() |
fe4516ea23 | ||
![]() |
039b47b872 | ||
![]() |
0a57a8a7f3 | ||
![]() |
8c823f3a2d | ||
![]() |
33f3a4f455 | ||
![]() |
2ecf8044d7 | ||
![]() |
c9a1eb55b5 | ||
![]() |
76bb1fd61e | ||
![]() |
1275b26ba0 | ||
![]() |
a470a4af9b | ||
![]() |
487c9ebbd4 | ||
![]() |
c796e2ae3c | ||
![]() |
746cab92f0 | ||
![]() |
33266a96ff | ||
![]() |
2816889d8d | ||
![]() |
58e177b3e4 | ||
![]() |
5cfd8bbb56 | ||
![]() |
e6fe6fd645 | ||
![]() |
63e167b38e | ||
![]() |
abe77c4783 | ||
![]() |
72af51fe9d | ||
![]() |
36b4134838 | ||
![]() |
cf6ee26fdb | ||
![]() |
858111e623 | ||
![]() |
367e625804 | ||
![]() |
ae4d9c7f80 | ||
![]() |
6c6ee41346 | ||
![]() |
9ef7688f9e | ||
![]() |
7d6e226c2b | ||
![]() |
17d1346a8a | ||
![]() |
59e0c10c42 | ||
![]() |
0d29e66092 | ||
![]() |
caa000f447 | ||
![]() |
267e114354 | ||
![]() |
b5375396d2 | ||
![]() |
e34f666b70 | ||
![]() |
19334b4f96 | ||
![]() |
1fa609e539 | ||
![]() |
d9ce25a721 | ||
![]() |
5b8fc25da6 | ||
![]() |
c70968dcf1 | ||
![]() |
77147510fb | ||
![]() |
7092577482 | ||
![]() |
3e70050056 | ||
![]() |
1f23c814e5 | ||
![]() |
145e0a0b7b | ||
![]() |
e68e787e7a | ||
![]() |
903308d285 | ||
![]() |
a4d8388b2e | ||
![]() |
3e83f9f956 | ||
![]() |
4063221313 | ||
![]() |
c3c8d80919 | ||
![]() |
3ae71c73c4 | ||
![]() |
b3db8c9549 | ||
![]() |
596eb4a0f9 | ||
![]() |
6b0381b903 | ||
![]() |
049c8f70cd | ||
![]() |
353bf69550 | ||
![]() |
cdb989ede3 | ||
![]() |
74079e4238 | ||
![]() |
c89746214c | ||
![]() |
1d97db3ef9 | ||
![]() |
b2a5ff5f9d | ||
![]() |
f47ef2b5ea | ||
![]() |
bd7ec3b692 | ||
![]() |
52895e7b6b | ||
![]() |
a6a82c6477 | ||
![]() |
af66ed94b2 | ||
![]() |
e43fdf5ef9 | ||
![]() |
3984fc075f | ||
![]() |
ee2a159374 | ||
![]() |
57c9b29ba3 | ||
![]() |
927ea72337 | ||
![]() |
123bdbd13b | ||
![]() |
0baa5a2f04 | ||
![]() |
7d98a70028 | ||
![]() |
73b72ab01c | ||
![]() |
e8cf71f41c | ||
![]() |
5f2d2a64d2 | ||
![]() |
27bf3901de | ||
![]() |
16d4fa03a5 | ||
![]() |
bef579ec26 | ||
![]() |
0cff10e02e | ||
![]() |
4c6f7238dd | ||
![]() |
583f1476d6 | ||
![]() |
b42bef32fd | ||
![]() |
8bb85ccf19 | ||
![]() |
3d88c2a5fa | ||
![]() |
e350acaf08 | ||
![]() |
172f70bef9 | ||
![]() |
9d25c0bf8a | ||
![]() |
75b377aab3 | ||
![]() |
3706f30b44 | ||
![]() |
a9697a61ad | ||
![]() |
e16a2d7cb6 | ||
![]() |
f106e2945b | ||
![]() |
1ad7deddb1 | ||
![]() |
7b81e98581 | ||
![]() |
0cae58ce8e | ||
![]() |
7231150115 | ||
![]() |
071986a4c9 | ||
![]() |
39e7d43f10 | ||
![]() |
aa1b17ae66 | ||
![]() |
92bae88355 | ||
![]() |
067eaf363e | ||
![]() |
00efc266d9 | ||
![]() |
0b014185e3 | ||
![]() |
3eee7378de | ||
![]() |
c31428f6bc | ||
![]() |
163e561cf9 | ||
![]() |
a32ded2829 | ||
![]() |
a5b7517fbd | ||
![]() |
176d57b35a | ||
![]() |
927a1d58e2 | ||
![]() |
bbd0df08d3 | ||
![]() |
9e57195e14 | ||
![]() |
05ab54c30d | ||
![]() |
e3e2028153 | ||
![]() |
883bcc735d | ||
![]() |
158727e2f2 | ||
![]() |
899f69d120 | ||
![]() |
b575046c05 | ||
![]() |
b5c60d2be2 | ||
![]() |
631dfee763 | ||
![]() |
d7f610113e | ||
![]() |
e0e4f6db2b | ||
![]() |
c27a26c0aa | ||
![]() |
3dcd2468a2 | ||
![]() |
ea43b28f74 | ||
![]() |
a3e2a085b6 | ||
![]() |
635d51b60d | ||
![]() |
95eb1c0d95 | ||
![]() |
8aca43a7e6 | ||
![]() |
f6afe59788 | ||
![]() |
8e13161f64 | ||
![]() |
97437b8af3 | ||
![]() |
9a938093e2 | ||
![]() |
3edcc9f9fd | ||
![]() |
55db408720 | ||
![]() |
caef874814 | ||
![]() |
1622639eca | ||
![]() |
4df89f4217 | ||
![]() |
079b98ed3f | ||
![]() |
a0526d2c9c | ||
![]() |
169b1cbd32 | ||
![]() |
8968081e77 | ||
![]() |
93ba7510e1 | ||
![]() |
579bb743bb | ||
![]() |
9e5e9ea612 | ||
![]() |
2241a13cba | ||
![]() |
9c1fb0cb92 | ||
![]() |
4904514257 | ||
![]() |
6d829c26a1 | ||
![]() |
c05467fb92 | ||
![]() |
d47f7f3348 | ||
![]() |
5931a84651 | ||
![]() |
5771783d11 | ||
![]() |
aae07a60bd | ||
![]() |
462d418ee0 | ||
![]() |
ce63c2e1db | ||
![]() |
52baf8cbe5 | ||
![]() |
1779b9ee1a | ||
![]() |
eae169236c | ||
![]() |
ce0efba0d2 | ||
![]() |
87c7ac3970 | ||
![]() |
0f8d196a52 | ||
![]() |
6dc7dab154 | ||
![]() |
dd4cb23005 | ||
![]() |
0589017f8c | ||
![]() |
55027a9b2b | ||
![]() |
0a984ca8c8 | ||
![]() |
929d13bfea | ||
![]() |
375e18bec8 | ||
![]() |
b9de74f183 | ||
![]() |
08ca69507f | ||
![]() |
65ca982342 | ||
![]() |
658281a92c | ||
![]() |
a959f61367 | ||
![]() |
8e61f744ec | ||
![]() |
73d3e52e29 | ||
![]() |
49a134845c | ||
![]() |
29807f3d39 | ||
![]() |
29b79b7725 | ||
![]() |
1cdb10a040 | ||
![]() |
5f7851df72 | ||
![]() |
3d9bc05d7a | ||
![]() |
c127428c59 | ||
![]() |
7966d8403a | ||
![]() |
80cc8a8e02 | ||
![]() |
ee4e205fef | ||
![]() |
ea443dc80c | ||
![]() |
283645513d | ||
![]() |
81b99382b8 | ||
![]() |
ab74465e6c | ||
![]() |
b3eadb557b | ||
![]() |
0abd2bcba6 | ||
![]() |
9cf76a918e | ||
![]() |
ae437b1510 | ||
![]() |
1096ec1c09 | ||
![]() |
235394d96c | ||
![]() |
d25e1d801c | ||
![]() |
2dca5ab966 | ||
![]() |
89ab57b1c1 | ||
![]() |
dc66e6a4bf | ||
![]() |
5c2f2fd882 | ||
![]() |
5c3ddefbf9 | ||
![]() |
a8d3f45ea1 | ||
![]() |
cc2c41ddc8 | ||
![]() |
b990f30a09 | ||
![]() |
5c711322d4 | ||
![]() |
b7d4a4f604 | ||
![]() |
cc8874b687 | ||
![]() |
2d0bc05488 | ||
![]() |
1429774487 | ||
![]() |
2060312dc1 | ||
![]() |
8b6728480f | ||
![]() |
cecafdee29 | ||
![]() |
05f2af25af | ||
![]() |
e3d826f6c4 | ||
![]() |
02430bed90 | ||
![]() |
3f7005ed9a | ||
![]() |
586ee75833 | ||
![]() |
1d903f11a8 | ||
![]() |
578159b95c | ||
![]() |
5c95587284 | ||
![]() |
f7e9227ad2 | ||
![]() |
c11a4d6867 | ||
![]() |
6c2b0448a4 | ||
![]() |
bd0eb8cccf | ||
![]() |
09bb043952 | ||
![]() |
9ca6cfd637 | ||
![]() |
3869a66fcc | ||
![]() |
d1c94f5120 | ||
![]() |
c55e9941ec | ||
![]() |
fa9a419d73 | ||
![]() |
ab4e0da6b4 | ||
![]() |
073572681e | ||
![]() |
b630f269c4 | ||
![]() |
40b1cd82b1 | ||
![]() |
abcbdef63b | ||
![]() |
dc8d1b0993 | ||
![]() |
56d53d8805 | ||
![]() |
7433fe049c | ||
![]() |
bb2be49d3b | ||
![]() |
cd1b578e84 | ||
![]() |
c3df9b4105 | ||
![]() |
243f3e21ec | ||
![]() |
375291380c | ||
![]() |
d221194454 | ||
![]() |
6d94a54387 | ||
![]() |
910bde88c7 | ||
![]() |
72916544ce | ||
![]() |
a01975dfce | ||
![]() |
10708801ae | ||
![]() |
ac096fb4e7 | ||
![]() |
620c1397ba | ||
![]() |
5b2f2f34f6 | ||
![]() |
ae3861a29d | ||
![]() |
93e2145254 | ||
![]() |
2b6290d275 | ||
![]() |
f81af7acb3 | ||
![]() |
f0170247a4 | ||
![]() |
3430874d11 | ||
![]() |
cb5e7532ab | ||
![]() |
5b928d679c | ||
![]() |
697b9694e5 | ||
![]() |
81c3e7e7f6 | ||
![]() |
0517bba8ca | ||
![]() |
83c7244fe6 | ||
![]() |
68fd129042 | ||
![]() |
b697e8a616 | ||
![]() |
2b281fbde9 | ||
![]() |
de8c4018c4 | ||
![]() |
9e8af96bbf | ||
![]() |
b0415a5289 | ||
![]() |
ff7344438b | ||
![]() |
f5f8e5d279 | ||
![]() |
b4ddc8f96c | ||
![]() |
e556c8ee15 | ||
![]() |
2f9a0b3376 | ||
![]() |
828f07b401 | ||
![]() |
36921b3426 | ||
![]() |
3988c6491c | ||
![]() |
2cf558ec05 | ||
![]() |
6fbadbdd94 | ||
![]() |
faa1d7effb | ||
![]() |
fe73a708d4 | ||
![]() |
a5ca262faa | ||
![]() |
8ebb1e29fa | ||
![]() |
1b44dc9522 | ||
![]() |
a66d468dc2 | ||
![]() |
ca8beafc2d | ||
![]() |
639c589a4a | ||
![]() |
cd66836218 | ||
![]() |
98662baa26 | ||
![]() |
004e5794e3 | ||
![]() |
f4f4f062cf | ||
![]() |
d8d9c7e171 | ||
![]() |
ceff82732e | ||
![]() |
d94b1708a9 | ||
![]() |
46e1f16012 | ||
![]() |
bbd014d409 | ||
![]() |
d553ee7c60 | ||
![]() |
2df6ab240d | ||
![]() |
8a2b9dfd6a | ||
![]() |
1f7892d7a9 | ||
![]() |
d11c537bea | ||
![]() |
2d4d237009 | ||
![]() |
daeee6b616 | ||
![]() |
eacb0b13b2 | ||
![]() |
dc5748059a | ||
![]() |
96d75f4bcb | ||
![]() |
19bfdf3f9f | ||
![]() |
4ea273b297 | ||
![]() |
72c9845174 | ||
![]() |
77597b329e | ||
![]() |
f62f00b4ad | ||
![]() |
1975973ff2 | ||
![]() |
00262b4a49 | ||
![]() |
de6cabe408 | ||
![]() |
d65552b59f | ||
![]() |
3755f48bce | ||
![]() |
8fe75d2015 | ||
![]() |
b0c0249ce6 | ||
![]() |
17685f3d86 | ||
![]() |
30f1c71569 | ||
![]() |
137afba1b6 | ||
![]() |
b27de5cac1 | ||
![]() |
8d43ae9805 | ||
![]() |
3cebb028f4 | ||
![]() |
28ab9d3515 | ||
![]() |
f7739309e8 | ||
![]() |
2db0d63c97 | ||
![]() |
437b86d1a7 | ||
![]() |
5ba1df52e0 | ||
![]() |
04ab753b26 | ||
![]() |
bc4a598a55 | ||
![]() |
651cdec9b5 | ||
![]() |
346f9fbacd | ||
![]() |
0f493ae808 | ||
![]() |
a07f143759 | ||
![]() |
0ec22c7a6e | ||
![]() |
73611004a0 | ||
![]() |
776ddddc83 | ||
![]() |
f60cce54ea | ||
![]() |
63087a4311 | ||
![]() |
5a193d50f6 | ||
![]() |
08a6e999b9 | ||
![]() |
e33cdca1ef | ||
![]() |
9ede7a3c42 | ||
![]() |
430d4e1ccd | ||
![]() |
de4d6037d3 | ||
![]() |
fc1fc6842b | ||
![]() |
0649b297f6 | ||
![]() |
9a470b9d41 | ||
![]() |
47d1ab356d | ||
![]() |
1ea5787486 | ||
![]() |
1d4695c109 | ||
![]() |
b673f9dd7f | ||
![]() |
a1dd03472f | ||
![]() |
497e545024 | ||
![]() |
6892fdb70b | ||
![]() |
aa1cc32d17 | ||
![]() |
b22398ae6c | ||
![]() |
e6eddaff73 | ||
![]() |
cd53518897 | ||
![]() |
8e9b1b7213 | ||
![]() |
7a88fae2e2 | ||
![]() |
f066da23c5 | ||
![]() |
34aa3d3e00 | ||
![]() |
715119fd45 | ||
![]() |
bde34fc4c4 | ||
![]() |
07b4aa89d4 | ||
![]() |
d60351114c | ||
![]() |
c932a70bef | ||
![]() |
4641d7ee8c | ||
![]() |
d4b3ee50f2 | ||
![]() |
5392daa3ff | ||
![]() |
a70e366fb4 | ||
![]() |
dff14268db | ||
![]() |
5517e157ad | ||
![]() |
bdf4ffc36b | ||
![]() |
71455c63c1 | ||
![]() |
b1ae2b1a41 | ||
![]() |
8a31732ce2 | ||
![]() |
e79aed7792 | ||
![]() |
973fc08f2d | ||
![]() |
00211e1fb2 | ||
![]() |
ce7286a72a | ||
![]() |
db335d5cec | ||
![]() |
ee5ce0c809 | ||
![]() |
b8efef7c7a | ||
![]() |
e2cbf40957 | ||
![]() |
d7d45fb8e2 | ||
![]() |
63afacc067 | ||
![]() |
3175199787 | ||
![]() |
1d0c3de65f | ||
![]() |
fe1646caa0 | ||
![]() |
72710f075b | ||
![]() |
c7c01aedc2 | ||
![]() |
c2e2e76fd8 | ||
![]() |
f30a87e4e2 | ||
![]() |
7a84cfd510 | ||
![]() |
7a5a773b07 | ||
![]() |
cf1488f6ce | ||
![]() |
b02badba0c | ||
![]() |
772d84ea5a | ||
![]() |
ddaa66f080 | ||
![]() |
8fd75833f0 | ||
![]() |
1967d60813 | ||
![]() |
f38f265cf7 | ||
![]() |
79f37ffee0 | ||
![]() |
d4b2a3c696 | ||
![]() |
39ec365821 | ||
![]() |
bc423c471d | ||
![]() |
a790f43566 | ||
![]() |
9fbdc950d2 | ||
![]() |
8319963cbb | ||
![]() |
4341219497 | ||
![]() |
835504270d | ||
![]() |
daed42d208 | ||
![]() |
850f51a156 | ||
![]() |
d37b195708 | ||
![]() |
54ceb85ebe | ||
![]() |
ef7a5bc753 | ||
![]() |
b7ef60eedd | ||
![]() |
70ede70ea8 | ||
![]() |
d1d942f3fd | ||
![]() |
53b3bda909 | ||
![]() |
ac5571a363 | ||
![]() |
c42f5eca87 | ||
![]() |
9cb6816b3c | ||
![]() |
feab633e60 | ||
![]() |
a50e430cd9 | ||
![]() |
46918ee907 | ||
![]() |
fe1889653e | ||
![]() |
9487b5367d | ||
![]() |
6b47df75a7 | ||
![]() |
bd9b2d54aa | ||
![]() |
506d1dc1f2 | ||
![]() |
90f9819cbd | ||
![]() |
9bbd03c14e | ||
![]() |
2852815e1a | ||
![]() |
41a100613f | ||
![]() |
63e489f134 | ||
![]() |
914d3c4a66 | ||
![]() |
2b47a1b06a | ||
![]() |
625419a7db | ||
![]() |
2710d9de5b | ||
![]() |
e51314b104 | ||
![]() |
4c128d837c | ||
![]() |
c392804f47 | ||
![]() |
cc7a25d9ce | ||
![]() |
36b2bea25f | ||
![]() |
913796ff0f | ||
![]() |
a1b9892c77 | ||
![]() |
03de4b29ea | ||
![]() |
35a706f745 | ||
![]() |
65cd9751d8 | ||
![]() |
ff9a1ebb1b | ||
![]() |
b5df000e9d | ||
![]() |
655522a3e5 | ||
![]() |
e4a4af34c5 | ||
![]() |
b047e562ca | ||
![]() |
1600233c48 | ||
![]() |
55c8bcd0e3 | ||
![]() |
2d0dadbd34 | ||
![]() |
49879bc9db | ||
![]() |
2c453c7691 | ||
![]() |
5166c22ce9 | ||
![]() |
225b9e1b15 | ||
![]() |
7a9d2c9a74 | ||
![]() |
3855e488cb | ||
![]() |
ce75747887 | ||
![]() |
c462766cb8 | ||
![]() |
bb905b70df | ||
![]() |
5c8b9f6b4c | ||
![]() |
c726639484 | ||
![]() |
100c7b8360 | ||
![]() |
5502df89bb | ||
![]() |
4491b66872 | ||
![]() |
9bc24728b4 | ||
![]() |
a3a00ea052 | ||
![]() |
1b1534add5 | ||
![]() |
a54c8d4f55 | ||
![]() |
0cddd15203 | ||
![]() |
5653d443d9 | ||
![]() |
a5a497c4ea | ||
![]() |
d60feb466c | ||
![]() |
a435167619 | ||
![]() |
99c823c763 | ||
![]() |
aebed13a40 | ||
![]() |
1347bdd545 | ||
![]() |
562754c0b9 | ||
![]() |
ec52e144e8 | ||
![]() |
3e383a9f57 | ||
![]() |
3a2444db0d | ||
![]() |
14d01ae358 | ||
![]() |
1f4b147ddd | ||
![]() |
12405f4059 | ||
![]() |
8d6965713c | ||
![]() |
fe2858bc75 | ||
![]() |
99dd6ae6aa | ||
![]() |
cb7ed4079f | ||
![]() |
89fbc055f4 | ||
![]() |
df12b838ad | ||
![]() |
055fa19c9b | ||
![]() |
d1b661506e | ||
![]() |
180ddcceaa | ||
![]() |
512fad207b | ||
![]() |
82d514d857 | ||
![]() |
037fac7cd4 | ||
![]() |
ebad85664d | ||
![]() |
4b626c39fe | ||
![]() |
81c539f150 | ||
![]() |
0e74d82777 | ||
![]() |
5ea34a3c07 | ||
![]() |
4f8c5c3c0a | ||
![]() |
37e45e0984 | ||
![]() |
5683ad6666 | ||
![]() |
92ca1e6e09 | ||
![]() |
6571fdbaa2 | ||
![]() |
9c3f138b8e | ||
![]() |
0ac2865b74 | ||
![]() |
98fc88dec6 | ||
![]() |
8cab790030 | ||
![]() |
954399b255 | ||
![]() |
66c95f901d | ||
![]() |
8265922d68 | ||
![]() |
2403184845 | ||
![]() |
15a53d299d | ||
![]() |
24a1a5d680 | ||
![]() |
c1cfff1502 | ||
![]() |
8b2599297b | ||
![]() |
1ed387dd54 | ||
![]() |
9c795895ba | ||
![]() |
3c193dca58 | ||
![]() |
ce2a8fbfab | ||
![]() |
4bbcf44351 | ||
![]() |
a9a43538be | ||
![]() |
905e4f16e2 | ||
![]() |
008489361d | ||
![]() |
dfa7fb53b2 | ||
![]() |
dc6604bcda | ||
![]() |
63194ff292 | ||
![]() |
53a727955f | ||
![]() |
a8fca89045 | ||
![]() |
1eff727722 | ||
![]() |
d9c6f7acb6 | ||
![]() |
faefe957b0 | ||
![]() |
2fb8467673 | ||
![]() |
401422deb3 | ||
![]() |
b52ed8e4c9 | ||
![]() |
41061d0289 | ||
![]() |
fed9197d23 | ||
![]() |
282d3dbf8c | ||
![]() |
b6c6dc7282 | ||
![]() |
45194061b3 | ||
![]() |
55480c8290 | ||
![]() |
63bcc04eff | ||
![]() |
fda5405e48 | ||
![]() |
819e52cab3 | ||
![]() |
ea917c82b6 | ||
![]() |
65d5303765 | ||
![]() |
08d37a4bef | ||
![]() |
da2b059802 | ||
![]() |
62d934dd8e | ||
![]() |
96086b7733 | ||
![]() |
182fc104bb | ||
![]() |
06a897fba0 | ||
![]() |
ff4b13245c | ||
![]() |
00a8906128 | ||
![]() |
8b73d2d39f | ||
![]() |
e976b3e43e | ||
![]() |
1585ca7c85 | ||
![]() |
f7697007e5 | ||
![]() |
ba151a8b83 | ||
![]() |
a5153f5375 | ||
![]() |
4899f01d6e | ||
![]() |
e6b3107997 | ||
![]() |
053440c4a8 | ||
![]() |
249e9c0b52 | ||
![]() |
099d5570f4 | ||
![]() |
6a84f433ea | ||
![]() |
12bf409e10 | ||
![]() |
a01f1e64fe | ||
![]() |
5f549a8fc6 | ||
![]() |
dd682013f9 | ||
![]() |
7f21975971 | ||
![]() |
bcd77031f3 | ||
![]() |
505a689268 | ||
![]() |
3c3848d4f8 | ||
![]() |
949150f9ff | ||
![]() |
7c72f17fad | ||
![]() |
b4cabe23e3 | ||
![]() |
40de014732 | ||
![]() |
f9b718f1eb | ||
![]() |
d051df9599 | ||
![]() |
4dc28989c8 | ||
![]() |
f133bbf499 | ||
![]() |
eb144af0b9 | ||
![]() |
0d020d3a54 | ||
![]() |
e1042e326d | ||
![]() |
f085e7d362 | ||
![]() |
b995f39206 | ||
![]() |
713bf58c44 | ||
![]() |
bbd8751f62 | ||
![]() |
a7af21958f | ||
![]() |
8fed3df681 | ||
![]() |
d8e83dabc6 | ||
![]() |
0be78b1204 | ||
![]() |
0a67ecbc3a | ||
![]() |
c57b4ee965 | ||
![]() |
d4db7b3fc1 | ||
![]() |
e9db964a70 | ||
![]() |
90c8a714fc | ||
![]() |
d958c0c68a | ||
![]() |
377d02ab1a | ||
![]() |
2c0ad89a07 | ||
![]() |
101a8adbc2 | ||
![]() |
5009fa461c | ||
![]() |
f48f6ae5df | ||
![]() |
be504212d0 | ||
![]() |
0f075137c9 | ||
![]() |
8714664e00 | ||
![]() |
bfaf938543 | ||
![]() |
b605bc086c | ||
![]() |
e394b16335 | ||
![]() |
0457423498 | ||
![]() |
91d30dbb83 | ||
![]() |
63642a4d3e | ||
![]() |
1b64900c14 | ||
![]() |
2660178658 | ||
![]() |
3a0271cd4d | ||
![]() |
76e2a2f032 | ||
![]() |
932de969f0 | ||
![]() |
9082ab6ff7 | ||
![]() |
2461173e26 | ||
![]() |
48c2f8b91b | ||
![]() |
6766b25414 | ||
![]() |
aacaf1b3fe | ||
![]() |
4cc154cbe1 | ||
![]() |
ca030dd5ed | ||
![]() |
f000409a90 | ||
![]() |
697f0659e2 | ||
![]() |
5169ef1f00 | ||
![]() |
10faa45182 | ||
![]() |
c6eaed76f3 | ||
![]() |
6ce338b2d0 | ||
![]() |
aa87f10b6a | ||
![]() |
9a980f9341 | ||
![]() |
544751895e | ||
![]() |
082b7fa0ec | ||
![]() |
4d23cf7746 | ||
![]() |
c687d832fa | ||
![]() |
4cd5afa3fb | ||
![]() |
39bb0f4c3e | ||
![]() |
aef673abd1 | ||
![]() |
c4f58cb6e2 | ||
![]() |
6e3170f5c7 | ||
![]() |
782b983354 | ||
![]() |
89dc5cec59 | ||
![]() |
1994dad972 | ||
![]() |
8168445b4a | ||
![]() |
838f8cb2e2 | ||
![]() |
2e3f240ac6 | ||
![]() |
c6de6e53b5 | ||
![]() |
edff3c35f2 | ||
![]() |
55c577e76e | ||
![]() |
93b75b6013 | ||
![]() |
452f258b17 | ||
![]() |
5f940c40ed | ||
![]() |
a19be79891 | ||
![]() |
60252bbda8 | ||
![]() |
6ac52f241d | ||
![]() |
6eeb22926a | ||
![]() |
329047836b | ||
![]() |
4524a69f99 | ||
![]() |
5a8b565199 | ||
![]() |
da5369e902 | ||
![]() |
a433e5b65f | ||
![]() |
ebb1389133 | ||
![]() |
b31fbc380f | ||
![]() |
a86912c8e7 | ||
![]() |
3e348f8c71 | ||
![]() |
bb91b16863 | ||
![]() |
8d068b339a | ||
![]() |
c54ac32732 | ||
![]() |
47c5008871 | ||
![]() |
0a412e2abb | ||
![]() |
27156d74da | ||
![]() |
50fd10ecd6 | ||
![]() |
cab104a60a | ||
![]() |
37f4469503 | ||
![]() |
60bcd70718 | ||
![]() |
ac9057bd23 | ||
![]() |
565a5abb55 | ||
![]() |
8b45256725 | ||
![]() |
b4a5f29cd1 | ||
![]() |
4d4fb9f435 | ||
![]() |
49c6aa2d74 | ||
![]() |
fb3290e870 | ||
![]() |
27fc0d5900 | ||
![]() |
85e16afaa0 | ||
![]() |
0ae4d1369d | ||
![]() |
d0f2a02277 | ||
![]() |
b1c72bacc4 | ||
![]() |
02ef0b0818 | ||
![]() |
e83e755fe1 | ||
![]() |
c73f7dd2f8 | ||
![]() |
436b08ab05 | ||
![]() |
ce15697ceb | ||
![]() |
95883b1e3c | ||
![]() |
0f96f3bd43 | ||
![]() |
df2a3837a9 | ||
![]() |
be5654dbd7 | ||
![]() |
0ab4b6d63d | ||
![]() |
c4a601b6f6 | ||
![]() |
eacd21b230 | ||
![]() |
3a611adc11 | ||
![]() |
381b491845 | ||
![]() |
6aca344bf7 | ||
![]() |
373ec96051 | ||
![]() |
0876cdd697 | ||
![]() |
fcc806615e | ||
![]() |
0486ccb0d4 | ||
![]() |
dc1312d58a | ||
![]() |
878a5dba60 | ||
![]() |
f8cc3180e8 | ||
![]() |
97f5490c13 | ||
![]() |
a4babc10c0 | ||
![]() |
512046e300 | ||
![]() |
6a9a0f1e73 | ||
![]() |
ac44ed0862 | ||
![]() |
b62142db82 | ||
![]() |
f01e40e671 | ||
![]() |
d8b9d353aa | ||
![]() |
98c65d8ddb | ||
![]() |
597859eb23 | ||
![]() |
34082c40d3 | ||
![]() |
d1d5f6821f | ||
![]() |
50714c3006 | ||
![]() |
18a40168d9 | ||
![]() |
2c783ff911 | ||
![]() |
3f32573638 | ||
![]() |
5ea323ce02 | ||
![]() |
b2f317ab7c | ||
![]() |
2948e4190b | ||
![]() |
f05b8c9542 | ||
![]() |
8b87893248 | ||
![]() |
a93e2cdc30 | ||
![]() |
f69b6c85f8 | ||
![]() |
20a4bb0936 | ||
![]() |
e8ab5aacc7 | ||
![]() |
0e2f062148 | ||
![]() |
d247d32221 | ||
![]() |
89e3292ced | ||
![]() |
c2535d7764 | ||
![]() |
200121477c | ||
![]() |
d23b63ca83 | ||
![]() |
9f91043131 | ||
![]() |
c668620c97 | ||
![]() |
0ee78769a1 | ||
![]() |
95f0e60343 | ||
![]() |
c35b13b3e2 | ||
![]() |
1f42491284 | ||
![]() |
ca8f8e0ee9 | ||
![]() |
9cb3cf250c | ||
![]() |
1cc5a67d82 | ||
![]() |
fa6823599a | ||
![]() |
f7822a448e | ||
![]() |
29edb8c8a1 | ||
![]() |
d2403d1b34 | ||
![]() |
c296634168 | ||
![]() |
ead22fa325 | ||
![]() |
3265cdc3e5 | ||
![]() |
8806981e64 | ||
![]() |
04c7a66eb4 | ||
![]() |
0a32314156 | ||
![]() |
6cdf97dfed | ||
![]() |
17c140c03d | ||
![]() |
dcdabe4551 | ||
![]() |
a0823b2fda | ||
![]() |
afcda3774c | ||
![]() |
f895e225d4 | ||
![]() |
d0a5f757ad | ||
![]() |
b43bc7f8e3 | ||
![]() |
c09e833627 | ||
![]() |
33475ef403 | ||
![]() |
73e14af1e3 | ||
![]() |
158cd83d17 | ||
![]() |
d1b1b77a4c | ||
![]() |
398cbe9284 | ||
![]() |
bc6ecd4101 | ||
![]() |
9c0d44ed9c | ||
![]() |
ed5e99cfee | ||
![]() |
6ef75b3645 | ||
![]() |
8143783cc5 | ||
![]() |
454efa5426 | ||
![]() |
51e3905cd4 | ||
![]() |
b61c8d5a9e | ||
![]() |
583451ee02 | ||
![]() |
8e779c9ad1 | ||
![]() |
b0c631709f | ||
![]() |
225d7dca7e | ||
![]() |
5c5f4ad29f | ||
![]() |
cb2cb2eab5 | ||
![]() |
64c289c014 | ||
![]() |
f2526ed5a8 | ||
![]() |
8fa29ffc19 | ||
![]() |
029758fdff | ||
![]() |
9db2197be1 | ||
![]() |
3e1e07e468 | ||
![]() |
c6b062a698 | ||
![]() |
ecb1b45280 | ||
![]() |
55d7be0b2f | ||
![]() |
4e37a762d2 | ||
![]() |
2ca580dc16 | ||
![]() |
83c7c4a68e | ||
![]() |
1ae8a72ba6 | ||
![]() |
7da11206da | ||
![]() |
4cd9e0f97e | ||
![]() |
5c559e4cc6 | ||
![]() |
371280ff76 | ||
![]() |
ebdf48899f | ||
![]() |
6962882e75 | ||
![]() |
e1fb8831de | ||
![]() |
e421d47b23 | ||
![]() |
9b65b000db | ||
![]() |
d5c29bf1b5 | ||
![]() |
4bb6a146e8 | ||
![]() |
f7ef7a18ac | ||
![]() |
0a87f13ceb | ||
![]() |
efb67b0fd4 | ||
![]() |
e3fff4356a | ||
![]() |
7d3b21582c | ||
![]() |
6a42714326 | ||
![]() |
288a61895c | ||
![]() |
4463804338 | ||
![]() |
57504acd00 | ||
![]() |
3f118a7239 | ||
![]() |
d265382ddf | ||
![]() |
08dffad160 | ||
![]() |
afebd9b724 | ||
![]() |
840bb29c54 | ||
![]() |
c79f09c119 | ||
![]() |
124340175a | ||
![]() |
07d1faf544 | ||
![]() |
92ee51b8db | ||
![]() |
92f4010e8e | ||
![]() |
667a52427e | ||
![]() |
e7063b2c69 | ||
![]() |
add08ead14 | ||
![]() |
5d7eba30a6 | ||
![]() |
7e2bec85ee | ||
![]() |
ca2e9d4afa | ||
![]() |
deafe93e6c | ||
![]() |
5257c5a0a8 | ||
![]() |
a6fcb70d12 | ||
![]() |
4674431829 | ||
![]() |
2b9c7fee20 | ||
![]() |
ee75909c80 | ||
![]() |
fbab80145e | ||
![]() |
d87e488c23 | ||
![]() |
95d8b12065 | ||
![]() |
9f8b7a180f | ||
![]() |
7f62f56661 | ||
![]() |
28ecf98fa6 | ||
![]() |
68f55e6639 | ||
![]() |
83e7af4503 | ||
![]() |
fbfaa8d25f | ||
![]() |
b46d199086 | ||
![]() |
64c6aac0cf | ||
![]() |
f3c64edf6e | ||
![]() |
61673cda70 | ||
![]() |
d71e6b18c0 | ||
![]() |
19fe47f71e | ||
![]() |
720bcbf8ac | ||
![]() |
bb3b7d68c1 | ||
![]() |
eb4b6d2a7f | ||
![]() |
abc3e8d59c | ||
![]() |
9f05f360f9 | ||
![]() |
9b2dc1b263 | ||
![]() |
50777d8d2c | ||
![]() |
63e85fe4be | ||
![]() |
5c2ff9b777 | ||
![]() |
e2cb927e1f | ||
![]() |
46165f4a4f | ||
![]() |
b1eaf5616a | ||
![]() |
22aa6d16a2 | ||
![]() |
dfaa5675b6 | ||
![]() |
0400fcb106 | ||
![]() |
40f54aea53 | ||
![]() |
d9a8e4d797 | ||
![]() |
ab4e1819c1 | ||
![]() |
91aa65e717 | ||
![]() |
ec684434dc | ||
![]() |
6a3a72eb06 | ||
![]() |
56544802e8 | ||
![]() |
3b5b9d7dab | ||
![]() |
e7082baaff | ||
![]() |
6d7e37610c | ||
![]() |
1d9ffffc49 | ||
![]() |
01c1fa0393 | ||
![]() |
c4d5886059 | ||
![]() |
2a63f2a3a6 | ||
![]() |
cc559dc9ce | ||
![]() |
4415888324 | ||
![]() |
dc6a0e3eec | ||
![]() |
3434ff4d45 | ||
![]() |
030e5ab894 | ||
![]() |
1caafac89a | ||
![]() |
26e2fc6d91 | ||
![]() |
740fa67a4e | ||
![]() |
d468423db3 | ||
![]() |
84664ebcdc | ||
![]() |
d46cd265f5 | ||
![]() |
a3bce7f7ca | ||
![]() |
30f66d012e | ||
![]() |
495b495f27 | ||
![]() |
e8f28ebc43 | ||
![]() |
01dcf550cf | ||
![]() |
987078fab5 | ||
![]() |
7da28f28e5 | ||
![]() |
3c9af84ea2 | ||
![]() |
286fd19ba2 | ||
![]() |
39dce71c28 | ||
![]() |
b3b1d6d706 | ||
![]() |
c04040468e | ||
![]() |
aee7777478 | ||
![]() |
09c1e21560 | ||
![]() |
60e9f56b0f | ||
![]() |
302e4ab664 | ||
![]() |
484c3aa320 | ||
![]() |
0bc769b971 | ||
![]() |
5b98d41637 | ||
![]() |
e14b7851b1 | ||
![]() |
13d2334a45 | ||
![]() |
9864e04aae | ||
![]() |
4d6bbbf004 | ||
![]() |
44305b4ccd | ||
![]() |
7f86b13d93 | ||
![]() |
d65b8d7d18 | ||
![]() |
6968dd266a | ||
![]() |
8754cbb38f | ||
![]() |
c7b4705538 | ||
![]() |
065faf31b6 | ||
![]() |
da4b27f606 | ||
![]() |
e1cc84ab5f | ||
![]() |
533aede80f | ||
![]() |
e84d5311f9 | ||
![]() |
476b3f804b | ||
![]() |
9445e8e8a0 | ||
![]() |
e539753279 | ||
![]() |
f5f81be6fe | ||
![]() |
3b8a55f0d3 | ||
![]() |
b1dd6cbb6e | ||
![]() |
431724f637 | ||
![]() |
6e5851aea8 | ||
![]() |
30e5e58178 | ||
![]() |
40207b515d | ||
![]() |
95a6aaac76 | ||
![]() |
da43f47487 | ||
![]() |
ae5360fb27 | ||
![]() |
47d2ae5c5e | ||
![]() |
e1101dd6f1 | ||
![]() |
d460351da2 | ||
![]() |
fd076f5a58 | ||
![]() |
f7d73fc21b | ||
![]() |
5680b7c477 | ||
![]() |
9f9b53c067 | ||
![]() |
18d986a57d | ||
![]() |
61632b3d9d | ||
![]() |
f1688fb8b1 | ||
![]() |
f0e85b31aa | ||
![]() |
316871714a | ||
![]() |
12c72842ff | ||
![]() |
4230e11c4d | ||
![]() |
c76ff8d367 | ||
![]() |
831e9985e2 | ||
![]() |
9912ee8199 | ||
![]() |
91bd0be39e | ||
![]() |
55d17b556a | ||
![]() |
5495be749b | ||
![]() |
54f71c623a | ||
![]() |
e3a891688b | ||
![]() |
09d36a5dbc | ||
![]() |
ff493406cf | ||
![]() |
fbcee61e04 | ||
![]() |
e62e34fd5c | ||
![]() |
3b57135a6e | ||
![]() |
69934dee52 | ||
![]() |
51f2efd48c | ||
![]() |
4de2cfdcc6 | ||
![]() |
7845b7678d | ||
![]() |
6f9543b9cf | ||
![]() |
5b541cc9fb | ||
![]() |
ea54520e0b | ||
![]() |
00b6bd517a | ||
![]() |
9fb5aa4b46 | ||
![]() |
f089cd027e | ||
![]() |
5151c6cb54 | ||
![]() |
9407ac8c24 | ||
![]() |
6a91a3a947 | ||
![]() |
ac0bcea371 | ||
![]() |
302a6ff4e8 | ||
![]() |
0d89667428 | ||
![]() |
dbb6848a9b | ||
![]() |
a843e808d1 | ||
![]() |
67af05e504 | ||
![]() |
c995c6fda5 | ||
![]() |
3b5cf0e37c | ||
![]() |
c7a9847e66 | ||
![]() |
a47e6dd8c5 | ||
![]() |
3624f1b9a2 | ||
![]() |
aecc908152 | ||
![]() |
9f9c6eff00 | ||
![]() |
99400fa570 | ||
![]() |
17d00837bd | ||
![]() |
0882d9d66b | ||
![]() |
5bd0c701c7 | ||
![]() |
0df81409bf | ||
![]() |
a75deb6ba2 | ||
![]() |
4b8474b0ac | ||
![]() |
7478e96a15 | ||
![]() |
c1d9a253b0 | ||
![]() |
eb7d9f76e5 | ||
![]() |
ec45d4a729 | ||
![]() |
07544cd198 | ||
![]() |
3f3d1bfccf | ||
![]() |
d3cb887ff0 | ||
![]() |
88c68315f6 | ||
![]() |
2d62fa401d | ||
![]() |
3ff85c2ab7 | ||
![]() |
13f5d3b5ac | ||
![]() |
9eb55e1be5 | ||
![]() |
6adbfade2b | ||
![]() |
7568616f8e | ||
![]() |
c93be13dfe | ||
![]() |
e9dc96944b | ||
![]() |
06e536eb45 | ||
![]() |
72e90b4d57 | ||
![]() |
83d43f845f | ||
![]() |
5ed5a81708 | ||
![]() |
ce003d2683 | ||
![]() |
75248d7a12 | ||
![]() |
06eff256f3 | ||
![]() |
a476f332f7 | ||
![]() |
6d49148c32 | ||
![]() |
85acc53d40 | ||
![]() |
f319e3e75a | ||
![]() |
3abc660eb3 | ||
![]() |
4c13dda1f9 | ||
![]() |
294c35b2fb | ||
![]() |
badaff8ebc | ||
![]() |
50a2771d87 | ||
![]() |
7045f9711c | ||
![]() |
aaf5d7b89c | ||
![]() |
487952f52e | ||
![]() |
34e31807fc | ||
![]() |
e6df041613 | ||
![]() |
21184f8755 | ||
![]() |
f334a2740f | ||
![]() |
2bac66b5fe | ||
![]() |
b5f069d080 | ||
![]() |
bc393e6bcd | ||
![]() |
af411a61ae | ||
![]() |
2805850711 | ||
![]() |
0f0a367174 | ||
![]() |
7009dc574f | ||
![]() |
6941917c75 | ||
![]() |
9560cf59be | ||
![]() |
0a2374892c | ||
![]() |
5d5c2ae2ed | ||
![]() |
2cceb048e3 | ||
![]() |
ed9c85b25a | ||
![]() |
bb8bcf3c33 | ||
![]() |
b5684ee7df | ||
![]() |
2c27f784f7 | ||
![]() |
46c1155c64 | ||
![]() |
cf377c2591 | ||
![]() |
471ce4a24b | ||
![]() |
b6841158df | ||
![]() |
3372bacc62 | ||
![]() |
6da9096176 | ||
![]() |
244009a1cd | ||
![]() |
0f22833ad5 | ||
![]() |
b589ee6c26 | ||
![]() |
9f0efdd544 | ||
![]() |
07c7398a96 | ||
![]() |
a117e459b0 | ||
![]() |
7568af408a | ||
![]() |
d1801e1dbc | ||
![]() |
38d193899c | ||
![]() |
f95d51b307 | ||
![]() |
1bf55c2139 | ||
![]() |
9b09028440 | ||
![]() |
0cc890a1d1 | ||
![]() |
fe138f6d61 | ||
![]() |
4e1638f86e | ||
![]() |
daa4fd5103 | ||
![]() |
a3d8848825 | ||
![]() |
61d102dc75 | ||
![]() |
c0519d8313 | ||
![]() |
48a2d2d24b | ||
![]() |
fb0d626cb2 | ||
![]() |
766326ad8c | ||
![]() |
2a903f66dd | ||
![]() |
8712310ad9 | ||
![]() |
e8c3ab87c4 | ||
![]() |
90c20f124b | ||
![]() |
cd225eb5fe | ||
![]() |
14e852237f | ||
![]() |
d36ac7a5de | ||
![]() |
55a138e8da | ||
![]() |
c5e6bb58bc | ||
![]() |
2642d6f5f0 | ||
![]() |
bcb3cb9125 | ||
![]() |
f7203d4ac9 | ||
![]() |
6be23a0a6f | ||
![]() |
089a9f1a9c | ||
![]() |
2977de1df2 | ||
![]() |
eab3f8b3ff | ||
![]() |
d686a2c9dc | ||
![]() |
d34e5f78a9 | ||
![]() |
edc9d47da7 | ||
![]() |
0c5608506e | ||
![]() |
bda6139f42 | ||
![]() |
1ae8ca1e21 | ||
![]() |
342377e69a | ||
![]() |
0447e4e664 | ||
![]() |
fd3d61c6a0 | ||
![]() |
69bf1c5d81 | ||
![]() |
fbf6351b99 | ||
![]() |
caa1de8aff | ||
![]() |
fac13fb8cb | ||
![]() |
a78762756a | ||
![]() |
1f24c18614 | ||
![]() |
153790d80a | ||
![]() |
e98f27cb66 | ||
![]() |
c17d80948c | ||
![]() |
c486368b9b | ||
![]() |
42bb96af23 | ||
![]() |
e082976914 | ||
![]() |
156a2eb4ff | ||
![]() |
e94981e6f7 | ||
![]() |
be92921034 | ||
![]() |
94403a9c3c | ||
![]() |
b5ea61a079 | ||
![]() |
af9e2420a6 | ||
![]() |
14b3cf7ccd | ||
![]() |
9c58a07a72 | ||
![]() |
609855f774 | ||
![]() |
37409e7d90 | ||
![]() |
cc83991d8d | ||
![]() |
bf5e94fc1a | ||
![]() |
26e487c01a | ||
![]() |
52420d4bf1 | ||
![]() |
7f7bf8474e | ||
![]() |
e1145f16f2 | ||
![]() |
b430a23df1 | ||
![]() |
fa7173b3d5 | ||
![]() |
b2d78786c2 | ||
![]() |
489420e855 | ||
![]() |
5bc0d2c31b | ||
![]() |
e9fda96aa1 | ||
![]() |
64b0ccd574 | ||
![]() |
d3aadc71b1 | ||
![]() |
c21ccef7bc | ||
![]() |
2152375227 | ||
![]() |
10d57afaac | ||
![]() |
e224f8ca28 | ||
![]() |
1f975c0a3a | ||
![]() |
ce075395a1 | ||
![]() |
167653ac60 | ||
![]() |
ee0f94c232 | ||
![]() |
0ed3354cee | ||
![]() |
b8f726153f | ||
![]() |
afc362d2b6 | ||
![]() |
776d8a4406 | ||
![]() |
7718581882 | ||
![]() |
ba245c49da | ||
![]() |
cf60033424 | ||
![]() |
0e39071b5e | ||
![]() |
b6028cef5b | ||
![]() |
62906fb84a | ||
![]() |
4797cd9184 | ||
![]() |
366c55c8f4 | ||
![]() |
7e93456805 | ||
![]() |
de1a92539a | ||
![]() |
84dd1a688e | ||
![]() |
36c4063db6 | ||
![]() |
9c9a432ea0 | ||
![]() |
1c53b22239 | ||
![]() |
5dbab85505 | ||
![]() |
2873f723e8 | ||
![]() |
6b7043fb9d | ||
![]() |
9d5612d104 | ||
![]() |
e58088d290 | ||
![]() |
77aa12dd81 | ||
![]() |
8c3be2c9df | ||
![]() |
266c3d03fc | ||
![]() |
e08e724573 | ||
![]() |
b155f23d27 | ||
![]() |
a2d3e2c7e0 | ||
![]() |
ed18466c3b | ||
![]() |
845767e2f8 | ||
![]() |
a0548fdbf8 | ||
![]() |
b837912e75 | ||
![]() |
0cd9fb32a8 | ||
![]() |
cc438fdb7b | ||
![]() |
7dbb2b206c | ||
![]() |
ef90493c27 | ||
![]() |
570dded8d6 | ||
![]() |
92ff98d99a | ||
![]() |
d1609cba90 | ||
![]() |
9d8fcbbffe | ||
![]() |
590722d929 | ||
![]() |
a0ee1b1653 | ||
![]() |
b965f88eb2 | ||
![]() |
a228e702da | ||
![]() |
105981b2eb | ||
![]() |
055365a449 | ||
![]() |
f8a7aac40d | ||
![]() |
6712ea5e6f | ||
![]() |
382e69273e | ||
![]() |
9b71828b97 | ||
![]() |
00eddcb237 | ||
![]() |
49cc643dcc | ||
![]() |
42ec6f0810 | ||
![]() |
9d773d6e8a | ||
![]() |
0c394b123c | ||
![]() |
11d06dc86d | ||
![]() |
8f46432391 | ||
![]() |
421b8214cb | ||
![]() |
6fc91312d2 | ||
![]() |
22bb129bd9 | ||
![]() |
b32935a1b0 | ||
![]() |
ed9a3517c6 | ||
![]() |
e0a39efa2b | ||
![]() |
3ad0e313ca | ||
![]() |
bca547ce44 | ||
![]() |
6bc697f926 | ||
![]() |
694013c9df | ||
![]() |
4c57893312 | ||
![]() |
a2d5314cf7 | ||
![]() |
dea1e0dcb9 | ||
![]() |
e063967734 | ||
![]() |
4519dd010d | ||
![]() |
55d2637214 | ||
![]() |
bc2dc8d933 | ||
![]() |
ab7f3c7399 | ||
![]() |
fc9b63298c | ||
![]() |
c45514b989 | ||
![]() |
9f789167da | ||
![]() |
9309159c38 | ||
![]() |
8e45296826 | ||
![]() |
8c9015b57b | ||
![]() |
a0cb96abff | ||
![]() |
3f51114129 | ||
![]() |
29136d633a | ||
![]() |
20bff1389e | ||
![]() |
106e538d08 | ||
![]() |
dc7ae3917e | ||
![]() |
c0fb96a911 | ||
![]() |
a1e02f7704 | ||
![]() |
436c75ca6c | ||
![]() |
7d75950624 | ||
![]() |
5f051a9766 | ||
![]() |
5716cf8cb2 | ||
![]() |
7bb5cacb0d | ||
![]() |
9801cf50e3 | ||
![]() |
b5558a8b78 | ||
![]() |
a7c31e6bcc | ||
![]() |
6e76610f30 | ||
![]() |
6da2b399e8 | ||
![]() |
79c962fc88 | ||
![]() |
28fb864ed0 | ||
![]() |
d23227d427 | ||
![]() |
eb6d26b6a4 | ||
![]() |
a8a28294d3 | ||
![]() |
7db1ba40eb | ||
![]() |
d8bd8d87ec | ||
![]() |
d29e0aa1a7 | ||
![]() |
644ad110c0 | ||
![]() |
6791de5fc0 | ||
![]() |
1bb96ef405 | ||
![]() |
7dc4ccf144 | ||
![]() |
2b39438eba | ||
![]() |
8952e2b0cd | ||
![]() |
4806ac62ee | ||
![]() |
eaa1179572 |
39
.github/CONTRIBUTING.md
vendored
39
.github/CONTRIBUTING.md
vendored
@@ -12,57 +12,54 @@ add a comment to it. You'll see exactly what is sent, the system is 100% transpa
|
|||||||
## Issue reporting/feature requests
|
## Issue reporting/feature requests
|
||||||
|
|
||||||
* Search the [existing issues](https://github.com/TeamNewPipe/NewPipe/issues) first to make sure your issue/feature
|
* Search the [existing issues](https://github.com/TeamNewPipe/NewPipe/issues) first to make sure your issue/feature
|
||||||
hasn't been reported/requested before
|
hasn't been reported/requested before.
|
||||||
* Check whether your issue/feature is already fixed/implemented
|
* Check whether your issue/feature is already fixed/implemented.
|
||||||
* Check if the issue still exists in the latest release/beta version
|
* Check if the issue still exists in the latest release/beta version.
|
||||||
* If you are an Android/Java developer, you are always welcome to fix/implement an issue/a feature yourself. PRs welcome!
|
* If you are an Android/Java developer, you are always welcome to fix an issue or implement a feature yourself. PRs welcome!
|
||||||
* We use English for development. Issues in other languages will be closed and ignored.
|
* We use English for development. Issues in other languages will be closed and ignored.
|
||||||
* Please only add *one* issue at a time. Do not put multiple issues into one thread.
|
* Please only add *one* issue at a time. Do not put multiple issues into one thread.
|
||||||
* When reporting a bug please give us a context, and a description how to reproduce it.
|
* Follow the template! Issues or feature requests not matching the template might be closed.
|
||||||
* Issues that only contain a generated bug report, but no description might be closed.
|
|
||||||
|
|
||||||
## Bug Fixing
|
## Bug Fixing
|
||||||
* If you want to help NewPipe to become free of bugs (this is our utopic goal for NewPipe), you can send us an email to
|
* If you want to help NewPipe to become free of bugs (this is our utopic goal for NewPipe), you can send us an email to
|
||||||
tnp@newpipe.schabi.org to let me know that you intend to help. We'll send you further instructions. You may, on request,
|
<a href="mailto:tnp@newpipe.schabi.org">tnp@newpipe.schabi.org</a> to let us know that you intend to help. We'll send you further instructions. You may, on request,
|
||||||
register at our [Sentry](https://sentry.schabi.org) instance (see section "Crash reporting" for more information.
|
register at our [Sentry](https://sentry.schabi.org) instance (see section "Crash reporting" for more information).
|
||||||
|
|
||||||
## Translation
|
## Translation
|
||||||
|
|
||||||
* NewPipe can be translated via [Weblate](https://hosted.weblate.org/projects/newpipe/strings/). You can log in there
|
* NewPipe is translated via [Weblate](https://hosted.weblate.org/projects/newpipe/strings/). You can log in there
|
||||||
with your GitHub account.
|
with your GitHub account.
|
||||||
|
* If the language you want to translate is not on Weblate, you can add it: see [How to add a new language](https://github.com/TeamNewPipe/NewPipe/wiki/How-to-add-a-new-language-to-NewPipe) in the wiki.
|
||||||
|
|
||||||
## Code contribution
|
## Code contribution
|
||||||
|
|
||||||
* Stick to NewPipe's style conventions (well, just look the other code and then do it the same way :))
|
* If you want to add a feature or change one, please open an issue describing your change. This gives the team and community a chance to give feedback before you spend any time on something that could be done differently or not done at all. It also prevents two contributors from working on the same thing and one being disappointed when only one user's code can be added.
|
||||||
* Do not bring non-free software (e.g., binary blobs) into the project. Also, make sure you do not introduce Google
|
* Stick to NewPipe's style conventions: follow [checkStyle](https://github.com/checkstyle/checkstyle). It will run each time you build the project.
|
||||||
|
* Do not bring non-free software (e.g. binary blobs) into the project. Also, make sure you do not introduce Google
|
||||||
libraries.
|
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, not on the master branch. This is commonly known as *feature branch workflow*. You
|
* Make changes on a separate branch with a meaningful name, not on the master neither dev branch. This is commonly known as *feature branch workflow*. You
|
||||||
may then send your changes as a pull request on GitHub. Patches to the email address mentioned in this document might
|
may then send your changes as a pull request (PR) on GitHub.
|
||||||
not be considered, GitHub is the primary platform. (This only affects you if you are a member of TeamNewPipe)
|
|
||||||
* When submitting changes, you confirm that your code is licensed under the terms of the
|
* When submitting changes, you confirm that your code is licensed under the terms of the
|
||||||
[GNU General Public License v3](https://www.gnu.org/licenses/gpl-3.0.html).
|
[GNU General Public License v3](https://www.gnu.org/licenses/gpl-3.0.html).
|
||||||
* Please test (compile and run) your code before you submit changes! Ideally, provide test feedback in the PR
|
* Please test (compile and run) your code before you submit changes! Ideally, provide test feedback in the PR
|
||||||
description. Untested code will **not** be merged!
|
description. Untested code will **not** be merged!
|
||||||
* 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,
|
* 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 are asked to merge the master branch manually and resolve the problems on your own. That will make the
|
but if not, you are asked to 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 will make the
|
||||||
maintainers' jobs way easier.
|
maintainers' jobs way easier.
|
||||||
* Please show intention to maintain your features and code after you contributed it. Unmaintained code is a hassle for
|
* Please show intention to maintain your features and code after you contributed it. Unmaintained code is a hassle for
|
||||||
the core developers, and just adds work. If you do not intend to maintain features you contributed, please think again
|
the core developers, and just adds work. If you do not intend to maintain features you contributed, please think again
|
||||||
about submission, or clearly state that in the description of your PR.
|
about submission, or clearly state that in the description of your PR.
|
||||||
* Respond yourselves if someone requests changes or otherwise raises issues about your PRs.
|
* Respond yourselves if someone requests changes or otherwise raises issues about your PRs.
|
||||||
* Check if your contributions align with the [fdroid inclusion guidelines](https://f-droid.org/en/docs/Inclusion_Policy/).
|
|
||||||
* Check if your submission can be build with the current fdroid build server setup.
|
|
||||||
* Send PR that only cover one specific issue/solution/bug. Do not send PRs that are huge and consists of multiple
|
* Send PR that only cover one specific issue/solution/bug. Do not send PRs that are huge and consists of multiple
|
||||||
independent solutions.
|
independent solutions.
|
||||||
|
|
||||||
## Communication
|
## Communication
|
||||||
|
|
||||||
* WE DO NOW HAVE A MAILING LIST: [newpipe@list.schabi.org](https://list.schabi.org/cgi-bin/mailman/listinfo/newpipe).
|
|
||||||
* There is an IRC channel on Freenode which is regularly visited by the core team and other developers:
|
* There is an IRC channel on Freenode which is regularly visited by the core team and other developers:
|
||||||
[#newpipe](irc:irc.freenode.net/newpipe). [Click here for Webchat](https://webchat.freenode.net/?channels=newpipe)!
|
[#newpipe](irc:irc.freenode.net/newpipe). [Click here for Webchat](https://webchat.freenode.net/?channels=newpipe)!
|
||||||
* If you want to get in touch with the core team or one of our other contributors you can send an email to
|
* If you want to get in touch with the core team or one of our other contributors you can send an email to
|
||||||
tnp(at)schabi.org. Please do not send issue reports, they will be ignored and remain unanswered! Use the GitHub issue
|
<a href="mailto:tnp@newpipe.schabi.org">tnp@newpipe.schabi.org</a>. Please do not send issue reports, they will be ignored and remain unanswered! Use the GitHub issue
|
||||||
tracker described above!
|
tracker described above!
|
||||||
* Feel free to post suggestions, changes, ideas etc. on GitHub, IRC or the mailing list!
|
* Feel free to post suggestions, changes, ideas etc. on GitHub or IRC!
|
||||||
|
3
.github/ISSUE_TEMPLATE.md
vendored
3
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,3 +0,0 @@
|
|||||||
- [ ] I carefully read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md) and agree to them.
|
|
||||||
- [ ] I checked if the issue/feature exists in the latest version.
|
|
||||||
- [ ] I did use the [incredible bugreport to markdown converter](https://teamnewpipe.github.io/CrashReportToMarkdown/) to paste bug reports.
|
|
46
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
46
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a bug report to help us improve
|
||||||
|
labels: bug
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Oh no, a bug! It happens. Thanks for reporting an issue with NewPipe. If this is your first bug report, read the following information before proceeding:
|
||||||
|
|
||||||
|
Please note, we only support the latest version of NewPipe. In order to check your app version, open the left drawer and click on "About". If you don't have the latest version, upgrade to it and reproduce the problem before opening the issue. The release page (https://github.com/TeamNewPipe/NewPipe/releases/latest) is where you can get it.
|
||||||
|
|
||||||
|
P.S.: Our contribution guidelines might be a nice document to read before you fill out the report :) You can find it at https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md
|
||||||
|
|
||||||
|
To make it easier for us to help you please enter detailed information in the template we have provided below. If a section isn't relevant, just delete it, though it would be helpful to still provide as much detail as possible.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- The comments between these brackets won't show up in the submitted issue (as you can see in the preview). -->
|
||||||
|
|
||||||
|
### Version
|
||||||
|
<!-- Which version are you using? Hopefully the latest! We just told you that above! -->
|
||||||
|
-
|
||||||
|
|
||||||
|
### Steps to reproduce the bug
|
||||||
|
<!--
|
||||||
|
1. Go to '...'
|
||||||
|
2. Press on '....'
|
||||||
|
3. Swipe down to '....'
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- If you can't cause the bug to show up again reliably (and hence don't have a proper set of steps to give us), please still try to give as many details as possible on how you think you encountered the bug. -->
|
||||||
|
|
||||||
|
### Expected behavior
|
||||||
|
<!-- Tell us what you expect to happen. -->
|
||||||
|
|
||||||
|
### Actual behaviour
|
||||||
|
<!-- Tell us what happens instead. -->
|
||||||
|
|
||||||
|
### Screenshots/Screen recordings
|
||||||
|
<!-- If applicable, add screenshots or a screen recording to help explain your problem. GitHub supports uploading them directly in the issue text box. If your file is too big for Github to accept, feel free to paste a link from an image/video hoster here instead. -->
|
||||||
|
|
||||||
|
### Logs
|
||||||
|
<!-- If your bug includes a crash (where you're shown the Error Report page with a bunch of info), copy it to the clipboard (there is a share button for this), head over to our bug report to markdown converter at https://teamnewpipe.github.io/CrashReportToMarkdown/ and paste it. Copy the converted text (it is MUCH easier to read this way) from there and paste it here: -->
|
||||||
|
|
||||||
|
<!-- That's right, here! -->
|
39
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
39
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
labels: enhancement
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
<!-- Hey. Our contribution guidelines (https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md) might be an appropriate
|
||||||
|
document to read before you fill out the request :) -->
|
||||||
|
|
||||||
|
<!-- The comments between these brackets won't show up in the submitted issue (as you can see in the preview). -->
|
||||||
|
|
||||||
|
#### Describe the feature you want
|
||||||
|
<!-- A clear and concise description of what you want to happen. PLEASE MAKE SURE it is one feature ONLY. You should open separate issues for separate feature requests, because those issues will be used to track their status.
|
||||||
|
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...* -->
|
||||||
|
|
||||||
|
<!-- Write below this -->
|
||||||
|
|
||||||
|
#### Is your feature request related to a problem? Please describe it
|
||||||
|
<!-- A clear and concise description of what the problem is. Maybe the developers 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.* -->
|
||||||
|
|
||||||
|
<!-- Write below this -->
|
||||||
|
|
||||||
|
#### Additional context
|
||||||
|
<!-- Add any other context, like screenshots, about the feature request here.
|
||||||
|
Example: *Here's a photo of my cat!* -->
|
||||||
|
|
||||||
|
<!-- Write below this -->
|
||||||
|
|
||||||
|
#### 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! -->
|
||||||
|
|
||||||
|
<!-- Write below this -->
|
27
.github/PULL_REQUEST_TEMPLATE.md
vendored
27
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1 +1,28 @@
|
|||||||
|
<!-- Hey there. Thank you so much for improving NewPipe. Please take a moment to fill out the following suggestion on how to structure this PR description. Having roughly the same layout helps everyone considerably :)-->
|
||||||
|
|
||||||
|
#### What is it?
|
||||||
|
- [ ] Bug fix (user facing)
|
||||||
|
- [ ] Feature (user facing)
|
||||||
|
- [ ] Code base improvement (dev facing)
|
||||||
|
- [ ] Meta improvement to the project (dev facing)
|
||||||
|
|
||||||
|
#### Description of the changes in your PR
|
||||||
|
<!-- While bullet points are the norm in this section, feel free to write a text instead if you can't fit it in a list -->
|
||||||
|
- record videos
|
||||||
|
- create clones
|
||||||
|
- take over the world
|
||||||
|
|
||||||
|
#### Fixes the following issue(s)
|
||||||
|
<!-- Also add reddit or other links which are relevant to your change. -->
|
||||||
|
-
|
||||||
|
|
||||||
|
#### Relies on the following changes
|
||||||
|
<!-- Delete this if it doesn't apply to you. -->
|
||||||
|
-
|
||||||
|
|
||||||
|
#### Testing apk
|
||||||
|
<!-- Ensure that you have your changes on a new branch which has a meaningful name. This name will be used as a suffix for the app ID to allow installing and testing multiple versions of NewPipe. Do NOT name your branches like "patch-0" and "feature-1". For example, if your PR implements a bug fix for comments, an appropriate branch name would be "commentfix". -->
|
||||||
|
debug.zip
|
||||||
|
|
||||||
|
#### Agreement
|
||||||
- [ ] I carefully read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md) and agree to them.
|
- [ ] I carefully read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md) and agree to them.
|
||||||
|
8
.gitignore
vendored
8
.gitignore
vendored
@@ -10,3 +10,11 @@
|
|||||||
*~
|
*~
|
||||||
.weblate
|
.weblate
|
||||||
*.class
|
*.class
|
||||||
|
|
||||||
|
# vscode / eclipse files
|
||||||
|
*.classpath
|
||||||
|
*.project
|
||||||
|
*.settings
|
||||||
|
bin/
|
||||||
|
.vscode/
|
||||||
|
*.code-workspace
|
||||||
|
@@ -5,13 +5,13 @@ android:
|
|||||||
components:
|
components:
|
||||||
# The BuildTools version used by NewPipe
|
# The BuildTools version used by NewPipe
|
||||||
- tools
|
- tools
|
||||||
- build-tools-28.0.3
|
- build-tools-29.0.3
|
||||||
|
|
||||||
# The SDK version used to compile NewPipe
|
# The SDK version used to compile NewPipe
|
||||||
- android-28
|
- android-29
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- yes | sdkmanager "platforms;android-28"
|
- yes | sdkmanager "platforms;android-29"
|
||||||
script: ./gradlew -Dorg.gradle.jvmargs=-Xmx1536m assembleDebug lintDebug testDebugUnitTest
|
script: ./gradlew -Dorg.gradle.jvmargs=-Xmx1536m assembleDebug lintDebug testDebugUnitTest
|
||||||
|
|
||||||
licenses:
|
licenses:
|
||||||
|
@@ -4,16 +4,16 @@
|
|||||||
<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" 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://travis-ci.org/TeamNewPipe/NewPipe" alt="Build Status"><img src="https://travis-ci.org/TeamNewPipe/NewPipe.svg"></a>
|
<a href="https://travis-ci.org/TeamNewPipe/NewPipe" alt="Build Status"><img src="https://travis-ci.org/TeamNewPipe/NewPipe.svg"></a>
|
||||||
<a href="https://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="http://webchat.freenode.net/?channels=%23newpipe" alt="IRC channel: #newpipe"><img src="https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg"></a>
|
||||||
<a href="https://www.bountysource.com/teams/newpipe" alt="Bountysource bounties"><img src="https://img.shields.io/bountysource/team/newpipe/activity.svg?colorB=cd201f"></a>
|
<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>
|
||||||
<p align="center"><a href="#screenshots">Screenshots</a> • <a href="#description">Description</a> • <a href="#features">Features</a> • <a href="#updates">Updates</a> • <a href="#contribution">Contribution</a> • <a href="#donate">Donate</a> • <a href="#license">License</a></p>
|
<p align="center"><a href="#screenshots">Screenshots</a> • <a href="#description">Description</a> • <a href="#features">Features</a> • <a href="#updates">Updates</a> • <a href="#contribution">Contribution</a> • <a href="#donate">Donate</a> • <a href="#license">License</a></p>
|
||||||
<p align="center"><a href="https://newpipe.schabi.org">Website</a> • <a href="https://newpipe.schabi.org/blog/">Blog</a> • <a href="https://newpipe.schabi.org/press/">Press</a></p>
|
<p align="center"><a href="https://newpipe.schabi.org">Website</a> • <a href="https://newpipe.schabi.org/blog/">Blog</a> • <a href="https://newpipe.schabi.org/FAQ/">FAQ</a> • <a href="https://newpipe.schabi.org/press/">Press</a></p>
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<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>
|
||||||
|
2
app/.gitignore
vendored
2
app/.gitignore
vendored
@@ -1,3 +1,3 @@
|
|||||||
.gitignore
|
.gitignore
|
||||||
/build
|
/build
|
||||||
app.iml
|
*.iml
|
||||||
|
232
app/build.gradle
232
app/build.gradle
File diff suppressed because it is too large
Load Diff
479
app/schemas/org.schabi.newpipe.database.AppDatabase/2.json
Normal file
479
app/schemas/org.schabi.newpipe.database.AppDatabase/2.json
Normal file
File diff suppressed because it is too large
Load Diff
707
app/schemas/org.schabi.newpipe.database.AppDatabase/3.json
Normal file
707
app/schemas/org.schabi.newpipe.database.AppDatabase/3.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,119 @@
|
|||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
@@ -1,8 +1,9 @@
|
|||||||
package org.schabi.newpipe.report;
|
package org.schabi.newpipe.report;
|
||||||
|
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import androidx.test.filters.LargeTest;
|
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
import androidx.test.filters.LargeTest;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
@@ -12,20 +13,21 @@ import org.schabi.newpipe.report.ErrorActivity.ErrorInfo;
|
|||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instrumented tests for {@link ErrorInfo}
|
* Instrumented tests for {@link ErrorInfo}.
|
||||||
*/
|
*/
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
@LargeTest
|
@LargeTest
|
||||||
public class ErrorInfoTest {
|
public class ErrorInfoTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void errorInfo_testParcelable() {
|
public void errorInfoTestParcelable() {
|
||||||
ErrorInfo info = ErrorInfo.make(UserAction.USER_REPORT, "youtube", "request", R.string.general_error);
|
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:
|
// Obtain a Parcel object and write the parcelable object to it:
|
||||||
Parcel parcel = Parcel.obtain();
|
final Parcel parcel = Parcel.obtain();
|
||||||
info.writeToParcel(parcel, 0);
|
info.writeToParcel(parcel, 0);
|
||||||
parcel.setDataPosition(0);
|
parcel.setDataPosition(0);
|
||||||
ErrorInfo infoFromParcel = ErrorInfo.CREATOR.createFromParcel(parcel);
|
final ErrorInfo infoFromParcel = ErrorInfo.CREATOR.createFromParcel(parcel);
|
||||||
|
|
||||||
assertEquals(UserAction.USER_REPORT, infoFromParcel.userAction);
|
assertEquals(UserAction.USER_REPORT, infoFromParcel.userAction);
|
||||||
assertEquals("youtube", infoFromParcel.serviceName);
|
assertEquals("youtube", infoFromParcel.serviceName);
|
||||||
@@ -34,4 +36,4 @@ public class ErrorInfoTest {
|
|||||||
|
|
||||||
parcel.recycle();
|
parcel.recycle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -6,12 +6,5 @@
|
|||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".DebugApp"
|
android:name=".DebugApp"
|
||||||
android:label="NewPipe Debug"
|
tools:replace="android:name" />
|
||||||
tools:replace="android:name, android:label">
|
|
||||||
<activity
|
|
||||||
android:name=".MainActivity"
|
|
||||||
android:label="NewPipe Debug"
|
|
||||||
tools:replace="android:label"/>
|
|
||||||
</application>
|
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
@@ -1,104 +0,0 @@
|
|||||||
package org.schabi.newpipe;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.multidex.MultiDex;
|
|
||||||
|
|
||||||
import com.facebook.stetho.Stetho;
|
|
||||||
import com.facebook.stetho.okhttp3.StethoInterceptor;
|
|
||||||
import com.squareup.leakcanary.AndroidHeapDumper;
|
|
||||||
import com.squareup.leakcanary.DefaultLeakDirectoryProvider;
|
|
||||||
import com.squareup.leakcanary.HeapDumper;
|
|
||||||
import com.squareup.leakcanary.LeakCanary;
|
|
||||||
import com.squareup.leakcanary.LeakDirectoryProvider;
|
|
||||||
import com.squareup.leakcanary.RefWatcher;
|
|
||||||
|
|
||||||
import org.schabi.newpipe.extractor.downloader.Downloader;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
|
|
||||||
public class DebugApp extends App {
|
|
||||||
private static final String TAG = DebugApp.class.toString();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void attachBaseContext(Context base) {
|
|
||||||
super.attachBaseContext(base);
|
|
||||||
MultiDex.install(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate() {
|
|
||||||
super.onCreate();
|
|
||||||
initStetho();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Downloader getDownloader() {
|
|
||||||
return DownloaderImpl.init(new OkHttpClient.Builder()
|
|
||||||
.addNetworkInterceptor(new StethoInterceptor()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initStetho() {
|
|
||||||
// Create an InitializerBuilder
|
|
||||||
Stetho.InitializerBuilder initializerBuilder =
|
|
||||||
Stetho.newInitializerBuilder(this);
|
|
||||||
|
|
||||||
// Enable Chrome DevTools
|
|
||||||
initializerBuilder.enableWebKitInspector(
|
|
||||||
Stetho.defaultInspectorModulesProvider(this)
|
|
||||||
);
|
|
||||||
|
|
||||||
// Enable command line interface
|
|
||||||
initializerBuilder.enableDumpapp(
|
|
||||||
Stetho.defaultDumperPluginsProvider(getApplicationContext())
|
|
||||||
);
|
|
||||||
|
|
||||||
// Use the InitializerBuilder to generate an Initializer
|
|
||||||
Stetho.Initializer initializer = initializerBuilder.build();
|
|
||||||
|
|
||||||
// Initialize Stetho with the Initializer
|
|
||||||
Stetho.initialize(initializer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isDisposedRxExceptionsReported() {
|
|
||||||
return PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
.getBoolean(getString(R.string.allow_disposed_exceptions_key), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected RefWatcher installLeakCanary() {
|
|
||||||
return LeakCanary.refWatcher(this)
|
|
||||||
.heapDumper(new ToggleableHeapDumper(this))
|
|
||||||
// give each object 10 seconds to be gc'ed, before leak canary gets nosy on it
|
|
||||||
.watchDelay(10, TimeUnit.SECONDS)
|
|
||||||
.buildAndInstall();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ToggleableHeapDumper implements HeapDumper {
|
|
||||||
private final HeapDumper dumper;
|
|
||||||
private final SharedPreferences preferences;
|
|
||||||
private final String dumpingAllowanceKey;
|
|
||||||
|
|
||||||
ToggleableHeapDumper(@NonNull final Context context) {
|
|
||||||
LeakDirectoryProvider leakDirectoryProvider = new DefaultLeakDirectoryProvider(context);
|
|
||||||
this.dumper = new AndroidHeapDumper(context, leakDirectoryProvider);
|
|
||||||
this.preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
|
||||||
this.dumpingAllowanceKey = context.getString(R.string.allow_heap_dumping_key);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isDumpingAllowed() {
|
|
||||||
return preferences.getBoolean(dumpingAllowanceKey, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public File dumpHeap() {
|
|
||||||
return isDumpingAllowed() ? dumper.dumpHeap() : HeapDumper.RETRY_LATER;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
59
app/src/debug/java/org/schabi/newpipe/DebugApp.kt
Normal file
59
app/src/debug/java/org/schabi/newpipe/DebugApp.kt
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
package org.schabi.newpipe
|
||||||
|
|
||||||
|
import androidx.multidex.MultiDex
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
|
import com.facebook.stetho.Stetho
|
||||||
|
import com.facebook.stetho.okhttp3.StethoInterceptor
|
||||||
|
import leakcanary.AppWatcher
|
||||||
|
import leakcanary.LeakCanary
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import org.schabi.newpipe.extractor.downloader.Downloader
|
||||||
|
|
||||||
|
class DebugApp : App() {
|
||||||
|
override fun onCreate() {
|
||||||
|
super.onCreate()
|
||||||
|
initStetho()
|
||||||
|
|
||||||
|
// Give each object 10 seconds to be GC'ed, before LeakCanary gets nosy on it
|
||||||
|
AppWatcher.config = AppWatcher.config.copy(watchDurationMillis = 10000)
|
||||||
|
LeakCanary.config = LeakCanary.config.copy(dumpHeap = PreferenceManager
|
||||||
|
.getDefaultSharedPreferences(this).getBoolean(getString(
|
||||||
|
R.string.allow_heap_dumping_key), false))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getDownloader(): Downloader {
|
||||||
|
val downloader = DownloaderImpl.init(OkHttpClient.Builder()
|
||||||
|
.addNetworkInterceptor(StethoInterceptor()))
|
||||||
|
setCookiesToDownloader(downloader)
|
||||||
|
return downloader
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun initACRA() {
|
||||||
|
// install MultiDex before initializing ACRA
|
||||||
|
MultiDex.install(this)
|
||||||
|
super.initACRA()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initStetho() {
|
||||||
|
// Create an InitializerBuilder
|
||||||
|
val initializerBuilder = Stetho.newInitializerBuilder(this)
|
||||||
|
|
||||||
|
// Enable Chrome DevTools
|
||||||
|
initializerBuilder.enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this))
|
||||||
|
|
||||||
|
// Enable command line interface
|
||||||
|
initializerBuilder.enableDumpapp(
|
||||||
|
Stetho.defaultDumperPluginsProvider(applicationContext))
|
||||||
|
|
||||||
|
// Use the InitializerBuilder to generate an Initializer
|
||||||
|
val initializer = initializerBuilder.build()
|
||||||
|
|
||||||
|
// Initialize Stetho with the Initializer
|
||||||
|
Stetho.initialize(initializer)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun isDisposedRxExceptionsReported(): Boolean {
|
||||||
|
return PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
|
.getBoolean(getString(R.string.allow_disposed_exceptions_key), false)
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,24 +1,80 @@
|
|||||||
package com.google.android.material.appbar;
|
package com.google.android.material.appbar;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.graphics.Rect;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
|
import android.view.View;
|
||||||
import android.widget.OverScroller;
|
import android.widget.OverScroller;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
||||||
|
import org.schabi.newpipe.R;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
// check this https://stackoverflow.com/questions/56849221/recyclerview-fling-causes-laggy-while-appbarlayout-is-scrolling/57997489#57997489
|
// See https://stackoverflow.com/questions/56849221#57997489
|
||||||
public final class FlingBehavior extends AppBarLayout.Behavior {
|
public final class FlingBehavior extends AppBarLayout.Behavior {
|
||||||
|
private final Rect focusScrollRect = new Rect();
|
||||||
|
|
||||||
public FlingBehavior(Context context, AttributeSet attrs) {
|
public FlingBehavior(final Context context, final AttributeSet attrs) {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean allowScroll = true;
|
||||||
|
private final Rect globalRect = new Rect();
|
||||||
|
private final List<Integer> skipInterceptionOfElements = Arrays.asList(
|
||||||
|
R.id.playQueuePanel, R.id.playbackSeekBar,
|
||||||
|
R.id.playPauseButton, R.id.playPreviousButton, R.id.playNextButton);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) {
|
public boolean onRequestChildRectangleOnScreen(
|
||||||
|
@NonNull final CoordinatorLayout coordinatorLayout, @NonNull final AppBarLayout child,
|
||||||
|
@NonNull final Rect rectangle, final boolean immediate) {
|
||||||
|
focusScrollRect.set(rectangle);
|
||||||
|
|
||||||
|
coordinatorLayout.offsetDescendantRectToMyCoords(child, focusScrollRect);
|
||||||
|
|
||||||
|
final int height = coordinatorLayout.getHeight();
|
||||||
|
|
||||||
|
if (focusScrollRect.top <= 0 && focusScrollRect.bottom >= height) {
|
||||||
|
// the child is too big to fit inside ourselves completely, ignore request
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int dy;
|
||||||
|
|
||||||
|
if (focusScrollRect.bottom > height) {
|
||||||
|
dy = focusScrollRect.top;
|
||||||
|
} else if (focusScrollRect.top < 0) {
|
||||||
|
// scrolling up
|
||||||
|
dy = -(height - focusScrollRect.bottom);
|
||||||
|
} else {
|
||||||
|
// nothing to do
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int consumed = scroll(coordinatorLayout, child, dy, getMaxDragOffset(child), 0);
|
||||||
|
|
||||||
|
return consumed == dy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean onInterceptTouchEvent(final CoordinatorLayout parent, final AppBarLayout child,
|
||||||
|
final MotionEvent ev) {
|
||||||
|
for (final Integer element : skipInterceptionOfElements) {
|
||||||
|
final View view = child.findViewById(element);
|
||||||
|
if (view != null) {
|
||||||
|
final boolean visible = view.getGlobalVisibleRect(globalRect);
|
||||||
|
if (visible && globalRect.contains((int) ev.getRawX(), (int) ev.getRawY())) {
|
||||||
|
allowScroll = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
allowScroll = true;
|
||||||
switch (ev.getActionMasked()) {
|
switch (ev.getActionMasked()) {
|
||||||
case MotionEvent.ACTION_DOWN:
|
case MotionEvent.ACTION_DOWN:
|
||||||
// remove reference to old nested scrolling child
|
// remove reference to old nested scrolling child
|
||||||
@@ -32,16 +88,37 @@ public final class FlingBehavior extends AppBarLayout.Behavior {
|
|||||||
return super.onInterceptTouchEvent(parent, child, ev);
|
return super.onInterceptTouchEvent(parent, child, ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onStartNestedScroll(@NonNull final CoordinatorLayout parent,
|
||||||
|
@NonNull final AppBarLayout child,
|
||||||
|
@NonNull final View directTargetChild,
|
||||||
|
final View target,
|
||||||
|
final int nestedScrollAxes,
|
||||||
|
final int type) {
|
||||||
|
return allowScroll && super.onStartNestedScroll(
|
||||||
|
parent, child, directTargetChild, target, nestedScrollAxes, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onNestedFling(@NonNull final CoordinatorLayout coordinatorLayout,
|
||||||
|
@NonNull final AppBarLayout child,
|
||||||
|
@NonNull final View target, final float velocityX,
|
||||||
|
final float velocityY, final boolean consumed) {
|
||||||
|
return allowScroll && super.onNestedFling(
|
||||||
|
coordinatorLayout, child, target, velocityX, velocityY, consumed);
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private OverScroller getScrollerField() {
|
private OverScroller getScrollerField() {
|
||||||
try {
|
try {
|
||||||
Class<?> headerBehaviorType = this.getClass().getSuperclass().getSuperclass().getSuperclass();
|
final Class<?> headerBehaviorType = this.getClass()
|
||||||
|
.getSuperclass().getSuperclass().getSuperclass();
|
||||||
if (headerBehaviorType != null) {
|
if (headerBehaviorType != null) {
|
||||||
Field field = headerBehaviorType.getDeclaredField("scroller");
|
final Field field = headerBehaviorType.getDeclaredField("scroller");
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
return ((OverScroller) field.get(this));
|
return ((OverScroller) field.get(this));
|
||||||
}
|
}
|
||||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
} catch (final NoSuchFieldException | IllegalAccessException e) {
|
||||||
// ?
|
// ?
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@@ -50,33 +127,37 @@ public final class FlingBehavior extends AppBarLayout.Behavior {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private Field getLastNestedScrollingChildRefField() {
|
private Field getLastNestedScrollingChildRefField() {
|
||||||
try {
|
try {
|
||||||
Class<?> headerBehaviorType = this.getClass().getSuperclass().getSuperclass();
|
final Class<?> headerBehaviorType = this.getClass().getSuperclass().getSuperclass();
|
||||||
if (headerBehaviorType != null) {
|
if (headerBehaviorType != null) {
|
||||||
Field field = headerBehaviorType.getDeclaredField("lastNestedScrollingChildRef");
|
final Field field
|
||||||
|
= headerBehaviorType.getDeclaredField("lastNestedScrollingChildRef");
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
return field;
|
return field;
|
||||||
}
|
}
|
||||||
} catch (NoSuchFieldException e) {
|
} catch (final NoSuchFieldException e) {
|
||||||
// ?
|
// ?
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resetNestedScrollingChild(){
|
private void resetNestedScrollingChild() {
|
||||||
Field field = getLastNestedScrollingChildRefField();
|
final Field field = getLastNestedScrollingChildRefField();
|
||||||
if(field != null){
|
if (field != null) {
|
||||||
try {
|
try {
|
||||||
Object value = field.get(this);
|
final Object value = field.get(this);
|
||||||
if(value != null) field.set(this, null);
|
if (value != null) {
|
||||||
} catch (IllegalAccessException e) {
|
field.set(this, null);
|
||||||
|
}
|
||||||
|
} catch (final IllegalAccessException e) {
|
||||||
// ?
|
// ?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void stopAppBarLayoutFling() {
|
private void stopAppBarLayoutFling() {
|
||||||
OverScroller scroller = getScrollerField();
|
final OverScroller scroller = getScrollerField();
|
||||||
if (scroller != null) scroller.forceFinished(true);
|
if (scroller != null) {
|
||||||
|
scroller.forceFinished(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
|
@@ -23,17 +23,25 @@ package org.schabi.newpipe;
|
|||||||
/**
|
/**
|
||||||
* Singleton:
|
* Singleton:
|
||||||
* Used to send data between certain Activity/Services within the same process.
|
* Used to send data between certain Activity/Services within the same process.
|
||||||
* This can be considered as an ugly hack inside the Android universe. **/
|
* This can be considered as an ugly hack inside the Android universe.
|
||||||
|
**/
|
||||||
public class ActivityCommunicator {
|
public class ActivityCommunicator {
|
||||||
|
|
||||||
private static ActivityCommunicator activityCommunicator;
|
private static ActivityCommunicator activityCommunicator;
|
||||||
|
private volatile Class returnActivity;
|
||||||
|
|
||||||
public static ActivityCommunicator getCommunicator() {
|
public static ActivityCommunicator getCommunicator() {
|
||||||
if(activityCommunicator == null) {
|
if (activityCommunicator == null) {
|
||||||
activityCommunicator = new ActivityCommunicator();
|
activityCommunicator = new ActivityCommunicator();
|
||||||
}
|
}
|
||||||
return activityCommunicator;
|
return activityCommunicator;
|
||||||
}
|
}
|
||||||
|
|
||||||
public volatile Class returnActivity;
|
public Class getReturnActivity() {
|
||||||
|
return returnActivity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setReturnActivity(final Class returnActivity) {
|
||||||
|
this.returnActivity = returnActivity;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -2,32 +2,31 @@ package org.schabi.newpipe;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
import androidx.fragment.app.FragmentManager;
|
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
import com.nostra13.universalimageloader.core.ImageLoader;
|
||||||
import com.squareup.leakcanary.RefWatcher;
|
|
||||||
|
|
||||||
import icepick.Icepick;
|
import icepick.Icepick;
|
||||||
import icepick.State;
|
import icepick.State;
|
||||||
|
import leakcanary.AppWatcher;
|
||||||
|
|
||||||
public abstract class BaseFragment extends Fragment {
|
public abstract class BaseFragment extends Fragment {
|
||||||
|
public static final ImageLoader IMAGE_LOADER = ImageLoader.getInstance();
|
||||||
protected final String TAG = getClass().getSimpleName() + "@" + Integer.toHexString(hashCode());
|
protected final String TAG = getClass().getSimpleName() + "@" + Integer.toHexString(hashCode());
|
||||||
protected final boolean DEBUG = MainActivity.DEBUG;
|
protected final boolean DEBUG = MainActivity.DEBUG;
|
||||||
|
|
||||||
protected AppCompatActivity activity;
|
protected AppCompatActivity activity;
|
||||||
public static final ImageLoader imageLoader = ImageLoader.getInstance();
|
//These values are used for controlling fragments when they are part of the frontpage
|
||||||
|
|
||||||
//These values are used for controlling framgents when they are part of the frontpage
|
|
||||||
@State
|
@State
|
||||||
protected boolean useAsFrontPage = false;
|
protected boolean useAsFrontPage = false;
|
||||||
protected boolean mIsVisibleToUser = false;
|
private boolean mIsVisibleToUser = false;
|
||||||
|
|
||||||
public void useAsFrontPage(boolean value) {
|
public void useAsFrontPage(final boolean value) {
|
||||||
useAsFrontPage = value;
|
useAsFrontPage = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,7 +35,7 @@ public abstract class BaseFragment extends Fragment {
|
|||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAttach(Context context) {
|
public void onAttach(final Context context) {
|
||||||
super.onAttach(context);
|
super.onAttach(context);
|
||||||
activity = (AppCompatActivity) context;
|
activity = (AppCompatActivity) context;
|
||||||
}
|
}
|
||||||
@@ -48,43 +47,49 @@ public abstract class BaseFragment extends Fragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(final Bundle savedInstanceState) {
|
||||||
if (DEBUG) Log.d(TAG, "onCreate() called with: savedInstanceState = [" + savedInstanceState + "]");
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "onCreate() called with: "
|
||||||
|
+ "savedInstanceState = [" + savedInstanceState + "]");
|
||||||
|
}
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
Icepick.restoreInstanceState(this, savedInstanceState);
|
Icepick.restoreInstanceState(this, savedInstanceState);
|
||||||
if (savedInstanceState != null) onRestoreInstanceState(savedInstanceState);
|
if (savedInstanceState != null) {
|
||||||
|
onRestoreInstanceState(savedInstanceState);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onViewCreated(View rootView, Bundle savedInstanceState) {
|
public void onViewCreated(final View rootView, final Bundle savedInstanceState) {
|
||||||
super.onViewCreated(rootView, savedInstanceState);
|
super.onViewCreated(rootView, savedInstanceState);
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "onViewCreated() called with: rootView = [" + rootView + "], savedInstanceState = [" + savedInstanceState + "]");
|
Log.d(TAG, "onViewCreated() called with: "
|
||||||
|
+ "rootView = [" + rootView + "], "
|
||||||
|
+ "savedInstanceState = [" + savedInstanceState + "]");
|
||||||
}
|
}
|
||||||
initViews(rootView, savedInstanceState);
|
initViews(rootView, savedInstanceState);
|
||||||
initListeners();
|
initListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSaveInstanceState(Bundle outState) {
|
public void onSaveInstanceState(final Bundle outState) {
|
||||||
super.onSaveInstanceState(outState);
|
super.onSaveInstanceState(outState);
|
||||||
Icepick.saveInstanceState(this, outState);
|
Icepick.saveInstanceState(this, outState);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
|
protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
|
|
||||||
RefWatcher refWatcher = App.getRefWatcher(getActivity());
|
AppWatcher.INSTANCE.getObjectWatcher().watch(this);
|
||||||
if (refWatcher != null) refWatcher.watch(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setUserVisibleHint(boolean isVisibleToUser) {
|
public void setUserVisibleHint(final boolean isVisibleToUser) {
|
||||||
super.setUserVisibleHint(isVisibleToUser);
|
super.setUserVisibleHint(isVisibleToUser);
|
||||||
mIsVisibleToUser = isVisibleToUser;
|
mIsVisibleToUser = isVisibleToUser;
|
||||||
}
|
}
|
||||||
@@ -93,7 +98,7 @@ public abstract class BaseFragment extends Fragment {
|
|||||||
// Init
|
// Init
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
protected void initViews(View rootView, Bundle savedInstanceState) {
|
protected void initViews(final View rootView, final Bundle savedInstanceState) {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void initListeners() {
|
protected void initListeners() {
|
||||||
@@ -103,10 +108,12 @@ public abstract class BaseFragment extends Fragment {
|
|||||||
// Utils
|
// Utils
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
public void setTitle(String title) {
|
public void setTitle(final String title) {
|
||||||
if (DEBUG) Log.d(TAG, "setTitle() called with: title = [" + title + "]");
|
if (DEBUG) {
|
||||||
if((!useAsFrontPage || mIsVisibleToUser)
|
Log.d(TAG, "setTitle() called with: title = [" + title + "]");
|
||||||
&& (activity != null && activity.getSupportActionBar() != null)) {
|
}
|
||||||
|
if ((!useAsFrontPage || mIsVisibleToUser)
|
||||||
|
&& (activity != null && activity.getSupportActionBar() != null)) {
|
||||||
activity.getSupportActionBar().setDisplayShowTitleEnabled(true);
|
activity.getSupportActionBar().setDisplayShowTitleEnabled(true);
|
||||||
activity.getSupportActionBar().setTitle(title);
|
activity.getSupportActionBar().setTitle(title);
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
package org.schabi.newpipe;
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
@@ -27,22 +26,8 @@ import android.os.Bundle;
|
|||||||
|
|
||||||
public class ExitActivity extends Activity {
|
public class ExitActivity extends Activity {
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
public static void exitAndRemoveFromRecentApps(final Activity activity) {
|
||||||
@Override
|
final Intent intent = new Intent(activity, ExitActivity.class);
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= 21) {
|
|
||||||
finishAndRemoveTask();
|
|
||||||
} else {
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
|
|
||||||
System.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void exitAndRemoveFromRecentApps(Activity activity) {
|
|
||||||
Intent intent = new Intent(activity, ExitActivity.class);
|
|
||||||
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
|
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
|
||||||
@@ -51,4 +36,18 @@ public class ExitActivity extends Activity {
|
|||||||
|
|
||||||
activity.startActivity(intent);
|
activity.startActivity(intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("NewApi")
|
||||||
|
@Override
|
||||||
|
protected void onCreate(final Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
finishAndRemoveTask();
|
||||||
|
} else {
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4,7 +4,7 @@ import android.annotation.SuppressLint;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
|
|
||||||
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
|
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ public class ImageDownloader extends BaseImageDownloader {
|
|||||||
private final SharedPreferences preferences;
|
private final SharedPreferences preferences;
|
||||||
private final String downloadThumbnailKey;
|
private final String downloadThumbnailKey;
|
||||||
|
|
||||||
public ImageDownloader(Context context) {
|
public ImageDownloader(final Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
this.resources = context.getResources();
|
this.resources = context.getResources();
|
||||||
this.preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
this.preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
@@ -31,7 +31,7 @@ public class ImageDownloader extends BaseImageDownloader {
|
|||||||
|
|
||||||
@SuppressLint("ResourceType")
|
@SuppressLint("ResourceType")
|
||||||
@Override
|
@Override
|
||||||
public InputStream getStream(String imageUri, Object extra) throws IOException {
|
public InputStream getStream(final String imageUri, final Object extra) throws IOException {
|
||||||
if (isDownloadingThumbnail()) {
|
if (isDownloadingThumbnail()) {
|
||||||
return super.getStream(imageUri, extra);
|
return super.getStream(imageUri, extra);
|
||||||
} else {
|
} else {
|
||||||
@@ -39,7 +39,8 @@ public class ImageDownloader extends BaseImageDownloader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException {
|
protected InputStream getStreamFromNetwork(final String imageUri, final Object extra)
|
||||||
|
throws IOException {
|
||||||
final DownloaderImpl downloader = (DownloaderImpl) NewPipe.getDownloader();
|
final DownloaderImpl downloader = (DownloaderImpl) NewPipe.getDownloader();
|
||||||
return downloader.stream(imageUri);
|
return downloader.stream(imageUri);
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,42 +1,54 @@
|
|||||||
package org.schabi.newpipe;
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
import androidx.room.Room;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.database.Cursor;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.room.Room;
|
||||||
|
|
||||||
import org.schabi.newpipe.database.AppDatabase;
|
import org.schabi.newpipe.database.AppDatabase;
|
||||||
|
|
||||||
import static org.schabi.newpipe.database.AppDatabase.DATABASE_NAME;
|
import static org.schabi.newpipe.database.AppDatabase.DATABASE_NAME;
|
||||||
import static org.schabi.newpipe.database.Migrations.MIGRATION_11_12;
|
import static org.schabi.newpipe.database.Migrations.MIGRATION_1_2;
|
||||||
|
import static org.schabi.newpipe.database.Migrations.MIGRATION_2_3;
|
||||||
|
|
||||||
public final class NewPipeDatabase {
|
public final class NewPipeDatabase {
|
||||||
|
|
||||||
private static volatile AppDatabase databaseInstance;
|
private static volatile AppDatabase databaseInstance;
|
||||||
|
|
||||||
private NewPipeDatabase() {
|
private NewPipeDatabase() {
|
||||||
//no instance
|
//no instance
|
||||||
}
|
}
|
||||||
|
|
||||||
private static AppDatabase getDatabase(Context context) {
|
private static AppDatabase getDatabase(final Context context) {
|
||||||
return Room
|
return Room
|
||||||
.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME)
|
.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME)
|
||||||
.addMigrations(MIGRATION_11_12)
|
.addMigrations(MIGRATION_1_2, MIGRATION_2_3)
|
||||||
.fallbackToDestructiveMigration()
|
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public static AppDatabase getInstance(@NonNull Context context) {
|
public static AppDatabase getInstance(@NonNull final Context context) {
|
||||||
AppDatabase result = databaseInstance;
|
AppDatabase result = databaseInstance;
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
synchronized (NewPipeDatabase.class) {
|
synchronized (NewPipeDatabase.class) {
|
||||||
result = databaseInstance;
|
result = databaseInstance;
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
databaseInstance = (result = getDatabase(context));
|
databaseInstance = getDatabase(context);
|
||||||
|
result = databaseInstance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void checkpoint() {
|
||||||
|
if (databaseInstance == null) {
|
||||||
|
throw new IllegalStateException("database is not initialized");
|
||||||
|
}
|
||||||
|
final Cursor c = databaseInstance.query("pragma wal_checkpoint(full)", null);
|
||||||
|
if (c.moveToFirst() && c.getInt(0) == 1) {
|
||||||
|
throw new RuntimeException("Checkpoint was blocked from completing");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
package org.schabi.newpipe;
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
@@ -26,21 +25,22 @@ import android.os.Bundle;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public class PanicResponderActivity extends Activity {
|
public class PanicResponderActivity extends Activity {
|
||||||
|
|
||||||
public static final String PANIC_TRIGGER_ACTION = "info.guardianproject.panic.action.TRIGGER";
|
public static final String PANIC_TRIGGER_ACTION = "info.guardianproject.panic.action.TRIGGER";
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(final Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
Intent intent = getIntent();
|
final Intent intent = getIntent();
|
||||||
if (intent != null && PANIC_TRIGGER_ACTION.equals(intent.getAction())) {
|
if (intent != null && PANIC_TRIGGER_ACTION.equals(intent.getAction())) {
|
||||||
// TODO explicitly clear the search results once they are restored when the app restarts
|
// TODO: Explicitly clear the search results
|
||||||
// or if the app reloads the current video after being killed, that should be cleared also
|
// once they are restored when the app restarts
|
||||||
|
// or if the app reloads the current video after being killed,
|
||||||
|
// that should be cleared also
|
||||||
ExitActivity.exitAndRemoveFromRecentApps(this);
|
ExitActivity.exitAndRemoveFromRecentApps(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= 21) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
finishAndRemoveTask();
|
finishAndRemoveTask();
|
||||||
} else {
|
} else {
|
||||||
finish();
|
finish();
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user