mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2025-09-25 19:40:53 +02:00
Compare commits
1732 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
97ad3c1e6d | ||
![]() |
612228bb73 | ||
![]() |
6e75d41956 | ||
![]() |
9883a38698 | ||
![]() |
07256e2e34 | ||
![]() |
43674ae80a | ||
![]() |
c066ebd76f | ||
![]() |
6e382c64a4 | ||
![]() |
81e76f260c | ||
![]() |
93571961ee | ||
![]() |
cb24347b23 | ||
![]() |
146b7be825 | ||
![]() |
50203c5f87 | ||
![]() |
b188073fb0 | ||
![]() |
91c60df0e9 | ||
![]() |
ad065e9281 | ||
![]() |
b1429366da | ||
![]() |
8bf7af2e74 | ||
![]() |
2003f51d49 | ||
![]() |
ce83fd9a10 | ||
![]() |
eacbaa3680 | ||
![]() |
98c65fb9b7 | ||
![]() |
44a71d8565 | ||
![]() |
badd4d3207 | ||
![]() |
0f517b803b | ||
![]() |
c2d11e786f | ||
![]() |
b0efe49e29 | ||
![]() |
2d029b9f76 | ||
![]() |
8ad917cff0 | ||
![]() |
4e478c65d3 | ||
![]() |
a469086915 | ||
![]() |
bf05ff6048 | ||
![]() |
a817d8cbf9 | ||
![]() |
4a19c78fa5 | ||
![]() |
e8bb7da906 | ||
![]() |
523477fc2b | ||
![]() |
c730426be0 | ||
![]() |
57d6c97203 | ||
![]() |
fce17aa1d4 | ||
![]() |
01abc244b1 | ||
![]() |
7bedacf5ad | ||
![]() |
552a1d0464 | ||
![]() |
8dde25532a | ||
![]() |
f29fa939ab | ||
![]() |
614bdb33b4 | ||
![]() |
71761675cf | ||
![]() |
d9194aa859 | ||
![]() |
f15081a474 | ||
![]() |
2f99ff4a0c | ||
![]() |
3a7d26aa46 | ||
![]() |
3f35bc593c | ||
![]() |
e5e708d781 | ||
![]() |
d694561980 | ||
![]() |
8d6d18e875 | ||
![]() |
072e27ed27 | ||
![]() |
6d64215614 | ||
![]() |
33f5ed5b14 | ||
![]() |
27f509c8e0 | ||
![]() |
890b3e13c9 | ||
![]() |
b730cb099f | ||
![]() |
fc94f184d2 | ||
![]() |
cbf6540889 | ||
![]() |
40804a7fb3 | ||
![]() |
d4101c4f43 | ||
![]() |
409bebd5bc | ||
![]() |
8e3ad69adb | ||
![]() |
c8e46d9e21 | ||
![]() |
c56241ffc1 | ||
![]() |
be62a2bfc5 | ||
![]() |
5cb7771484 | ||
![]() |
6675d3e2cd | ||
![]() |
8ecbe4c8ad | ||
![]() |
edb75c4bab | ||
![]() |
54b21c716a | ||
![]() |
4704274b87 | ||
![]() |
78547aa119 | ||
![]() |
3887231c73 | ||
![]() |
8a29cfbb7e | ||
![]() |
a01d6eaf72 | ||
![]() |
69fc571b56 | ||
![]() |
4cfd9c322b | ||
![]() |
d2dce8801b | ||
![]() |
5b8bb9f678 | ||
![]() |
2076f146cf | ||
![]() |
5d4f2b7862 | ||
![]() |
e3815e40d2 | ||
![]() |
6dccfb4774 | ||
![]() |
1ccc1f4c1a | ||
![]() |
042809620a | ||
![]() |
cb4c8abd94 | ||
![]() |
e86302f5b9 | ||
![]() |
de080d5811 | ||
![]() |
21b7045f93 | ||
![]() |
627301f83d | ||
![]() |
607ca84fcc | ||
![]() |
a7f36248d0 | ||
![]() |
d008d15167 | ||
![]() |
607dc436bd | ||
![]() |
4384948f6c | ||
![]() |
5e05e9ec93 | ||
![]() |
ac1fe66cf9 | ||
![]() |
86732b6ae4 | ||
![]() |
0713f55e9c | ||
![]() |
5c32d73409 | ||
![]() |
5e13a1735d | ||
![]() |
6a1fbb00d9 | ||
![]() |
20c3badfac | ||
![]() |
7817cfe0c1 | ||
![]() |
9ed823b5a5 | ||
![]() |
c6a5dedf0a | ||
![]() |
01c9ab36b7 | ||
![]() |
27f5bdeef1 | ||
![]() |
723898f87d | ||
![]() |
bc05cc1445 | ||
![]() |
dcf4e43e28 | ||
![]() |
3868c53908 | ||
![]() |
a71c693ca3 | ||
![]() |
691f93f01c | ||
![]() |
4cff749186 | ||
![]() |
e1ac1547fd | ||
![]() |
e53bd505fb | ||
![]() |
cfa926542e | ||
![]() |
79097eca47 | ||
![]() |
d1741e40e3 | ||
![]() |
5d0528d195 | ||
![]() |
a9ea06f753 | ||
![]() |
62e121c12c | ||
![]() |
02ef05160f | ||
![]() |
6e66c013c0 | ||
![]() |
dcb11f01e1 | ||
![]() |
8a0e4b577c | ||
![]() |
b57f420261 | ||
![]() |
7d1790abe3 | ||
![]() |
1fc494571b | ||
![]() |
e6d97bc773 | ||
![]() |
0e53323fb7 | ||
![]() |
eb4764d2b2 | ||
![]() |
298a91adbf | ||
![]() |
2cb9912039 | ||
![]() |
e52bfe4335 | ||
![]() |
761a249e05 | ||
![]() |
c42df3a0c2 | ||
![]() |
3d359b7a98 | ||
![]() |
deef6417ad | ||
![]() |
f55a8deb97 | ||
![]() |
333506e00b | ||
![]() |
bbc1642b90 | ||
![]() |
8209eda27a | ||
![]() |
b13f7a599b | ||
![]() |
cb0f700be1 | ||
![]() |
7b6d6b466a | ||
![]() |
76f97e5c2e | ||
![]() |
4669a1ab57 | ||
![]() |
b1ad0edbe1 | ||
![]() |
51a695d047 | ||
![]() |
396e2d14f3 | ||
![]() |
245479c339 | ||
![]() |
092215f47a | ||
![]() |
fcb46db718 | ||
![]() |
60c58c8b9c | ||
![]() |
124a2839b5 | ||
![]() |
ededfe10ab | ||
![]() |
81895c20d6 | ||
![]() |
46fabe065c | ||
![]() |
7ac338756a | ||
![]() |
640b8edd78 | ||
![]() |
c5d98752fa | ||
![]() |
a6a5bef447 | ||
![]() |
042885c155 | ||
![]() |
cbb9dcf7d0 | ||
![]() |
9b080800e1 | ||
![]() |
6effbf50a8 | ||
![]() |
398f9aa19a | ||
![]() |
935d89747f | ||
![]() |
21c2fbfd39 | ||
![]() |
bd337f3aac | ||
![]() |
4a673eee81 | ||
![]() |
cebf349f9a | ||
![]() |
3683deb51c | ||
![]() |
99ee076db9 | ||
![]() |
04f759041f | ||
![]() |
75f89059e7 | ||
![]() |
a81f31156d | ||
![]() |
f706452e67 | ||
![]() |
b0126afbcf | ||
![]() |
5b8393ff89 | ||
![]() |
d2235da06a | ||
![]() |
a87f6a0791 | ||
![]() |
7e7cfb79a4 | ||
![]() |
fb43a5265c | ||
![]() |
439a814133 | ||
![]() |
d9dfcc04bf | ||
![]() |
0cfac137b7 | ||
![]() |
4575ee805a | ||
![]() |
67f70ce2cc | ||
![]() |
2f641ffb13 | ||
![]() |
50f92269c2 | ||
![]() |
f220f397ae | ||
![]() |
cdb4096124 | ||
![]() |
01938af65b | ||
![]() |
47a1fca32f | ||
![]() |
321342cf6d | ||
![]() |
086e9beb59 | ||
![]() |
3519d4b219 | ||
![]() |
9034b9a9ae | ||
![]() |
90ba8440a0 | ||
![]() |
4988b37d6f | ||
![]() |
ad4799ee60 | ||
![]() |
35229f8ae5 | ||
![]() |
7a011d9e75 | ||
![]() |
3d86835979 | ||
![]() |
4073306538 | ||
![]() |
b86aa28d6a | ||
![]() |
d43cee29f2 | ||
![]() |
acad468b4a | ||
![]() |
4cbe842cfa | ||
![]() |
d93e227190 | ||
![]() |
a9cf424998 | ||
![]() |
6d8fdf46d5 | ||
![]() |
781f98ef91 | ||
![]() |
1313f685da | ||
![]() |
4779a993d3 | ||
![]() |
342b2ae5dc | ||
![]() |
ce8ae40206 | ||
![]() |
d0704f621f | ||
![]() |
c6da4043ed | ||
![]() |
1aa3761d1a | ||
![]() |
ff769caf82 | ||
![]() |
be6bc68b56 | ||
![]() |
feb3d11f63 | ||
![]() |
d2f9b063b2 | ||
![]() |
315089c361 | ||
![]() |
e95df0dbd5 | ||
![]() |
8fed029ee3 | ||
![]() |
522daf5aff | ||
![]() |
e948eebe84 | ||
![]() |
783d4e7e8a | ||
![]() |
1ce2198621 | ||
![]() |
f521def4a5 | ||
![]() |
75202921a1 | ||
![]() |
4ef8b93344 | ||
![]() |
881b191b8d | ||
![]() |
b39e071d1e | ||
![]() |
84cb3a1060 | ||
![]() |
f4ea3980c2 | ||
![]() |
ef73720a5e | ||
![]() |
d8cdc57702 | ||
![]() |
b52dee37f4 | ||
![]() |
21bd9f09da | ||
![]() |
44f24e58f6 | ||
![]() |
860c4d045a | ||
![]() |
3b0c96f654 | ||
![]() |
65b744472b | ||
![]() |
26489b0f00 | ||
![]() |
414abad05f | ||
![]() |
735d9a5391 | ||
![]() |
50571449cb | ||
![]() |
a31aacd115 | ||
![]() |
f5b57cc0da | ||
![]() |
b7006a8f2c | ||
![]() |
82bb467a2a | ||
![]() |
3a44e92432 | ||
![]() |
e60db5f928 | ||
![]() |
78485287a4 | ||
![]() |
48b6f01b13 | ||
![]() |
39e04de208 | ||
![]() |
68d5b59693 | ||
![]() |
4ef01ef745 | ||
![]() |
573fa8870c | ||
![]() |
88d354b08b | ||
![]() |
0ff65b5496 | ||
![]() |
14e0dcb085 | ||
![]() |
e008fd21a4 | ||
![]() |
4638149ad0 | ||
![]() |
e386bdd6b3 | ||
![]() |
decb167ba9 | ||
![]() |
dd9557c13e | ||
![]() |
708d7162fb | ||
![]() |
1ee1b522f1 | ||
![]() |
d5a500c037 | ||
![]() |
3e02c65bc0 | ||
![]() |
d10f9a5f25 | ||
![]() |
17e7214d25 | ||
![]() |
22774592db | ||
![]() |
7c2aa6e69d | ||
![]() |
d1dbcda88e | ||
![]() |
3e05508cf9 | ||
![]() |
1acdefd358 | ||
![]() |
23143797f9 | ||
![]() |
3364bf268b | ||
![]() |
2025d6305e | ||
![]() |
639ad7698d | ||
![]() |
4eaff51ba2 | ||
![]() |
1fb30bc3d9 | ||
![]() |
6b66f40bcb | ||
![]() |
a3cd531cc8 | ||
![]() |
55c84192be | ||
![]() |
aa9018b97b | ||
![]() |
1e79c146a7 | ||
![]() |
cb8545e33d | ||
![]() |
4a484c535b | ||
![]() |
ee417e41ea | ||
![]() |
3cdc1fcaee | ||
![]() |
0a023a61f9 | ||
![]() |
73f81c5b52 | ||
![]() |
bc4acbb7e1 | ||
![]() |
26d07ea2c6 | ||
![]() |
5380c8352d | ||
![]() |
e85e91183e | ||
![]() |
a208a22bc2 | ||
![]() |
644766b5a6 | ||
![]() |
ca679f5932 | ||
![]() |
7f7145e8de | ||
![]() |
aa1878c15a | ||
![]() |
e7d23176b7 | ||
![]() |
31218c2a8c | ||
![]() |
06374c82fd | ||
![]() |
8efcc8f80f | ||
![]() |
2d6317bd24 | ||
![]() |
157b064214 | ||
![]() |
0ece4851d2 | ||
![]() |
f1f5996975 | ||
![]() |
0a2dbc4688 | ||
![]() |
13587d7ab3 | ||
![]() |
0fcef064fb | ||
![]() |
19b8796cbc | ||
![]() |
15fb60a845 | ||
![]() |
5c202f04e7 | ||
![]() |
bc6fdf81d2 | ||
![]() |
3194a2bf2c | ||
![]() |
72d1e5131f | ||
![]() |
7721098551 | ||
![]() |
f563bc4210 | ||
![]() |
43e7be9b86 | ||
![]() |
27131d15dd | ||
![]() |
fb1a290bd9 | ||
![]() |
ef16145695 | ||
![]() |
4fbd1182c2 | ||
![]() |
2d39e65b5c | ||
![]() |
8e96b675fa | ||
![]() |
adb6943420 | ||
![]() |
eae7babf93 | ||
![]() |
7d5e18c05b | ||
![]() |
cbe001efd6 | ||
![]() |
86b783fb0f | ||
![]() |
ccc27b48df | ||
![]() |
a32391f560 | ||
![]() |
aed0348802 | ||
![]() |
1b66446c0d | ||
![]() |
2bc0c8a483 | ||
![]() |
3f7e02e305 | ||
![]() |
dd0d666003 | ||
![]() |
81859a37de | ||
![]() |
180bb581a3 | ||
![]() |
2f31779af4 | ||
![]() |
ee6d512165 | ||
![]() |
1470fdc057 | ||
![]() |
93bbaf187e | ||
![]() |
f1e43007f1 | ||
![]() |
155436b85d | ||
![]() |
f3e029c3f6 | ||
![]() |
90d6416f55 | ||
![]() |
af2a2e45af | ||
![]() |
e79eda9c5c | ||
![]() |
b338d9dbcf | ||
![]() |
7fb9345344 | ||
![]() |
77b488568b | ||
![]() |
fcf650c6eb | ||
![]() |
0c21023ad8 | ||
![]() |
8f35a56ec8 | ||
![]() |
95ba1873e4 | ||
![]() |
8b8652d44c | ||
![]() |
2515b8167f | ||
![]() |
09dd044f3d | ||
![]() |
ace0ed9667 | ||
![]() |
cf03708da2 | ||
![]() |
d4670bf6fa | ||
![]() |
feea448a24 | ||
![]() |
71ad54652b | ||
![]() |
8e1deda7b0 | ||
![]() |
752f985e13 | ||
![]() |
89e3219e06 | ||
![]() |
429dddc6c9 | ||
![]() |
981174a490 | ||
![]() |
201f7e9848 | ||
![]() |
bb0d8ad58a | ||
![]() |
29e64f7c1a | ||
![]() |
4819ebd56e | ||
![]() |
3b603b0637 | ||
![]() |
baa63249d1 | ||
![]() |
ee347e3081 | ||
![]() |
f96bc95053 | ||
![]() |
e1df4757e4 | ||
![]() |
4fc37a7321 | ||
![]() |
2a45a13f73 | ||
![]() |
067b15c300 | ||
![]() |
8a1c283542 | ||
![]() |
93d1e8b2ff | ||
![]() |
c60d5b54fa | ||
![]() |
ef180f082e | ||
![]() |
f52741cc37 | ||
![]() |
2a2661f066 | ||
![]() |
b521903138 | ||
![]() |
acbd699d95 | ||
![]() |
6b8928becb | ||
![]() |
e393bdb1e5 | ||
![]() |
bba6b96765 | ||
![]() |
740116356c | ||
![]() |
2f6e4fa4a3 | ||
![]() |
fb3f6721b2 | ||
![]() |
4e7bd21e5c | ||
![]() |
219c2030b9 | ||
![]() |
b75fdb4566 | ||
![]() |
4584b14a31 | ||
![]() |
814ddb5932 | ||
![]() |
6ea0f6290a | ||
![]() |
c796fe1fe6 | ||
![]() |
a452a164e6 | ||
![]() |
0d9dd69b19 | ||
![]() |
d7b73c18f1 | ||
![]() |
07f66c0e45 | ||
![]() |
d449acbf86 | ||
![]() |
fce416ba76 | ||
![]() |
cb6bfe8556 | ||
![]() |
d7b31e1d25 | ||
![]() |
85057376d6 | ||
![]() |
c43ac7c869 | ||
![]() |
b2657315f1 | ||
![]() |
de5ed9717c | ||
![]() |
e17a6cbb9f | ||
![]() |
8e783b774b | ||
![]() |
733663f40d | ||
![]() |
4b2a792a62 | ||
![]() |
f7aa171d01 | ||
![]() |
5eafefb683 | ||
![]() |
5d1b02a856 | ||
![]() |
4acda3d9ae | ||
![]() |
643e10ace2 | ||
![]() |
7b64a232de | ||
![]() |
d7472d837d | ||
![]() |
94b473ab4b | ||
![]() |
4a05bbb6c8 | ||
![]() |
0343659b35 | ||
![]() |
f38eadbe30 | ||
![]() |
eb29a53ac5 | ||
![]() |
bc71e260e2 | ||
![]() |
ddf23a3443 | ||
![]() |
d41b248d1c | ||
![]() |
a025b25933 | ||
![]() |
c9a52a6088 | ||
![]() |
0276dca406 | ||
![]() |
3bb95ad44c | ||
![]() |
0a6572c282 | ||
![]() |
3937067be1 | ||
![]() |
48e4eb44f2 | ||
![]() |
c78cc6f2fd | ||
![]() |
73a71e0f5c | ||
![]() |
93605774f0 | ||
![]() |
2834e5d78f | ||
![]() |
dd467b4d63 | ||
![]() |
1fa541776b | ||
![]() |
f6f67c7b0a | ||
![]() |
9b3f19c19b | ||
![]() |
f4a9ec15e8 | ||
![]() |
006c4ecb02 | ||
![]() |
1c752b0e18 | ||
![]() |
f84aff63e3 | ||
![]() |
ae8121b680 | ||
![]() |
882fbf9275 | ||
![]() |
0a1743251e | ||
![]() |
3403a127c1 | ||
![]() |
9c5ca9f09d | ||
![]() |
73eea5608a | ||
![]() |
f48aeb91f4 | ||
![]() |
0bda964ece | ||
![]() |
14f5d54b50 | ||
![]() |
105ac2f6ff | ||
![]() |
160560f1fd | ||
![]() |
deeb667d6f | ||
![]() |
78123ff6f5 | ||
![]() |
9b1fdff22f | ||
![]() |
0275502796 | ||
![]() |
8af475e319 | ||
![]() |
2202c8f09e | ||
![]() |
adf309d3a8 | ||
![]() |
3071314586 | ||
![]() |
88e1df840d | ||
![]() |
23c1b66f6c | ||
![]() |
b0318a1cce | ||
![]() |
c130a66e4d | ||
![]() |
3386ba6d1b | ||
![]() |
9275569fa6 | ||
![]() |
2b23dfd0a6 | ||
![]() |
2a13d9990e | ||
![]() |
c9669b51c6 | ||
![]() |
486c180b3c | ||
![]() |
9eb5bf9b87 | ||
![]() |
953a89f3a1 | ||
![]() |
d638fa1434 | ||
![]() |
e6d700288c | ||
![]() |
371f14cdc9 | ||
![]() |
0733ae2404 | ||
![]() |
b1731ebd49 | ||
![]() |
342b3191ac | ||
![]() |
cd39445245 | ||
![]() |
92eac67367 | ||
![]() |
0e31a0c704 | ||
![]() |
d60c117a70 | ||
![]() |
69ccad5998 | ||
![]() |
b6d22320e6 | ||
![]() |
d3bf948dba | ||
![]() |
5de3d96b31 | ||
![]() |
d30dd64322 | ||
![]() |
386df10a5a | ||
![]() |
af147de547 | ||
![]() |
23cd0e5a5e | ||
![]() |
c5a566657c | ||
![]() |
ce2018c864 | ||
![]() |
472ab46af2 | ||
![]() |
7f87d45bb5 | ||
![]() |
e9f7ab18bb | ||
![]() |
fba83a8afe | ||
![]() |
05089abddc | ||
![]() |
ccd70aac51 | ||
![]() |
5df8445d04 | ||
![]() |
8c43674fa4 | ||
![]() |
f162316a6b | ||
![]() |
670596ed88 | ||
![]() |
6b3eb716c4 | ||
![]() |
6a5180d94c | ||
![]() |
83faaedfcc | ||
![]() |
d98d790a7a | ||
![]() |
36b5833a3a | ||
![]() |
5e86781a79 | ||
![]() |
6a780504b4 | ||
![]() |
a0d8212136 | ||
![]() |
0e1e6a9d62 | ||
![]() |
812282a332 | ||
![]() |
a8a4c9e97f | ||
![]() |
24c293e335 | ||
![]() |
0a596df497 | ||
![]() |
3d66c6572b | ||
![]() |
f45769cbb2 | ||
![]() |
ef51f93c6f | ||
![]() |
35af68f148 | ||
![]() |
ff21430b43 | ||
![]() |
fcb67f5119 | ||
![]() |
0a41fbd185 | ||
![]() |
d32aaf488f | ||
![]() |
1254798013 | ||
![]() |
c72d2a2308 | ||
![]() |
703181655b | ||
![]() |
da4a1c5bf0 | ||
![]() |
1130bd502e | ||
![]() |
27ea4ee679 | ||
![]() |
56e3b66d06 | ||
![]() |
7d4768e151 | ||
![]() |
7ec1011610 | ||
![]() |
e1bbd2055c | ||
![]() |
8a19547d9f | ||
![]() |
6e6922dab8 | ||
![]() |
e009ade922 | ||
![]() |
90e15bcab9 | ||
![]() |
2a040cea4b | ||
![]() |
72f2a7f8db | ||
![]() |
8a8022afe6 | ||
![]() |
b692bec310 | ||
![]() |
536c01c70d | ||
![]() |
ec8e14e977 | ||
![]() |
85b34f8809 | ||
![]() |
22951a56a5 | ||
![]() |
46ad84b101 | ||
![]() |
5efb77e520 | ||
![]() |
76903102b8 | ||
![]() |
c8e26b429c | ||
![]() |
55c1310f74 | ||
![]() |
b8278d91e0 | ||
![]() |
b032502148 | ||
![]() |
bec1a4dd1a | ||
![]() |
4dfb9e7977 | ||
![]() |
2bfa165cdc | ||
![]() |
658666276d | ||
![]() |
62f91b9084 | ||
![]() |
719140ab78 | ||
![]() |
0471fd8145 | ||
![]() |
a079a0c901 | ||
![]() |
ac2fa74c8f | ||
![]() |
4c10ef65f5 | ||
![]() |
cfa697fab2 | ||
![]() |
a09b9d3e4d | ||
![]() |
c470909f19 | ||
![]() |
5e59cfcf9d | ||
![]() |
a099fe35d2 | ||
![]() |
bcfd8a2450 | ||
![]() |
8ed9d71e14 | ||
![]() |
004c2fa55a | ||
![]() |
3dd63d03cb | ||
![]() |
cceedab864 | ||
![]() |
b494b2ea39 | ||
![]() |
0b29cf086b | ||
![]() |
11d33097f7 | ||
![]() |
3ae61645de | ||
![]() |
4711befffa | ||
![]() |
5673d53a20 | ||
![]() |
90ca4a5e92 | ||
![]() |
ad252956ab | ||
![]() |
1b2c091c39 | ||
![]() |
9031bc0c7b | ||
![]() |
1d85e0ea63 | ||
![]() |
458774aadb | ||
![]() |
ae89f7bea3 | ||
![]() |
fd77b8552b | ||
![]() |
bae9f5e844 | ||
![]() |
e3f3d90b68 | ||
![]() |
646fa877ba | ||
![]() |
7f3bd8aec2 | ||
![]() |
4501203a7a | ||
![]() |
06292bceb2 | ||
![]() |
f94f14ab65 | ||
![]() |
7145c68e03 | ||
![]() |
d1b0cd74be | ||
![]() |
bac3825c87 | ||
![]() |
fc1d283414 | ||
![]() |
c0652daa97 | ||
![]() |
553903bd9d | ||
![]() |
a43ec25b7e | ||
![]() |
bb2a66fd02 | ||
![]() |
71ac830bfa | ||
![]() |
82bce80c62 | ||
![]() |
67ddf78e18 | ||
![]() |
8285df0f3f | ||
![]() |
bdb45295b9 | ||
![]() |
f330ee8f8d | ||
![]() |
7331e4a7f2 | ||
![]() |
51252d3b61 | ||
![]() |
dcdb2c323e | ||
![]() |
c4ac901c67 | ||
![]() |
a7ce072ca2 | ||
![]() |
a9b427b877 | ||
![]() |
67a9f3a4ad | ||
![]() |
1a4905f36a | ||
![]() |
cbb1fde7b0 | ||
![]() |
b86bd019a7 | ||
![]() |
6a0bada9d2 | ||
![]() |
a708278cf0 | ||
![]() |
119462cbc9 | ||
![]() |
0324a4928c | ||
![]() |
895a2a56b5 | ||
![]() |
d9e616beee | ||
![]() |
aa5d5d2b6d | ||
![]() |
85dc555358 | ||
![]() |
15b4a7d055 | ||
![]() |
696c94050d | ||
![]() |
b222614c4a | ||
![]() |
edff694bf3 | ||
![]() |
be430a6ac0 | ||
![]() |
937d40c5f7 | ||
![]() |
d3979676ab | ||
![]() |
6716262a28 | ||
![]() |
06d8bafce6 | ||
![]() |
f814755908 | ||
![]() |
f355fd2551 | ||
![]() |
ea84c62d76 | ||
![]() |
acda71cebb | ||
![]() |
67dcd2e5c6 | ||
![]() |
c996644613 | ||
![]() |
171c3e492d | ||
![]() |
8834195cc6 | ||
![]() |
ed57e72fa1 | ||
![]() |
7e84c3e167 | ||
![]() |
4adc33471b | ||
![]() |
31d07cc1e2 | ||
![]() |
a349a66d5a | ||
![]() |
7d427b4cc4 | ||
![]() |
6c7e54868d | ||
![]() |
9484a5e2ee | ||
![]() |
3cbd2057e3 | ||
![]() |
71ff1cf713 | ||
![]() |
c737d891bc | ||
![]() |
82a53343fc | ||
![]() |
03fdc60018 | ||
![]() |
42d19d98ad | ||
![]() |
c9915bba18 | ||
![]() |
a275d7ff50 | ||
![]() |
74199c8624 | ||
![]() |
238bff1fee | ||
![]() |
de534b58c5 | ||
![]() |
111a0f9f17 | ||
![]() |
50392ed67d | ||
![]() |
3de9da0528 | ||
![]() |
ece93cadd5 | ||
![]() |
7219c8d33c | ||
![]() |
b0a09c7876 | ||
![]() |
1d017d3cbc | ||
![]() |
5fa56f2aca | ||
![]() |
5ded1b139f | ||
![]() |
2abb0db272 | ||
![]() |
674c041c13 | ||
![]() |
03c89a69a2 | ||
![]() |
dbed5e2a62 | ||
![]() |
d7519903a1 | ||
![]() |
ab14f0d7ac | ||
![]() |
3b6e43b7ca | ||
![]() |
7d3b7af874 | ||
![]() |
2acc348062 | ||
![]() |
33ba8acd05 | ||
![]() |
0c56af7090 | ||
![]() |
4375ecaad7 | ||
![]() |
90c538d4b6 | ||
![]() |
1ffa8329d0 | ||
![]() |
b404b7974a | ||
![]() |
de44b580f9 | ||
![]() |
2a630cd745 | ||
![]() |
1ccccc5e39 | ||
![]() |
aec851acfa | ||
![]() |
ad5ac479fd | ||
![]() |
67b82a404c | ||
![]() |
f7f86a2f62 | ||
![]() |
6e42b4af27 | ||
![]() |
fe9ed8af76 | ||
![]() |
c4c3f369c0 | ||
![]() |
9b9bf40e47 | ||
![]() |
14a888a610 | ||
![]() |
f3d777c65c | ||
![]() |
d494b6c934 | ||
![]() |
7294220727 | ||
![]() |
665b9087b1 | ||
![]() |
f1691050cd | ||
![]() |
169b6acd24 | ||
![]() |
35b3bf2edb | ||
![]() |
8f73c8c98b | ||
![]() |
94ea8c21eb | ||
![]() |
b6a19c3e2d | ||
![]() |
21455d58a6 | ||
![]() |
239e9bd3db | ||
![]() |
0832171a2b | ||
![]() |
1edfcc629c | ||
![]() |
9a2a8698ef | ||
![]() |
54c31422d9 | ||
![]() |
a33464284c | ||
![]() |
4842caf426 | ||
![]() |
02b6b4d8eb | ||
![]() |
4b0d7c7d88 | ||
![]() |
559b53acc3 | ||
![]() |
4233c18dbb | ||
![]() |
adec2c9fcc | ||
![]() |
6ad2406262 | ||
![]() |
bfeb8ca104 | ||
![]() |
5614edfa2f | ||
![]() |
946f7b2305 | ||
![]() |
dfcf435f88 | ||
![]() |
0e734c267c | ||
![]() |
faadcec4d1 | ||
![]() |
eb81784818 | ||
![]() |
327010f76b | ||
![]() |
371669dcb6 | ||
![]() |
fb702b93ca | ||
![]() |
50c8453785 | ||
![]() |
14fb5ee6c4 | ||
![]() |
46c2343ec6 | ||
![]() |
f5c226362f | ||
![]() |
9114c1157d | ||
![]() |
a4f4230275 | ||
![]() |
46a6147c08 | ||
![]() |
0d26923d79 | ||
![]() |
b57c93cf03 | ||
![]() |
ec19e4bc8f | ||
![]() |
cb68a9c2ce | ||
![]() |
b51ded1580 | ||
![]() |
4b6fb5bfeb | ||
![]() |
9b8175b5be | ||
![]() |
3ecfc622e2 | ||
![]() |
d8d2ee4e09 | ||
![]() |
be478cb088 | ||
![]() |
c187b4487f | ||
![]() |
f6d21e74cb | ||
![]() |
bde4c4bd25 | ||
![]() |
d9aaceea95 | ||
![]() |
676d64a24a | ||
![]() |
8ae1768f71 | ||
![]() |
212705e7e3 | ||
![]() |
b3f6524e5c | ||
![]() |
5ca0a0adf2 | ||
![]() |
669d2c44c9 | ||
![]() |
604bc5b4c1 | ||
![]() |
88268ae569 | ||
![]() |
140fb86401 | ||
![]() |
2b281c4357 | ||
![]() |
7b6dbfb456 | ||
![]() |
b3c49ac86b | ||
![]() |
d309fd9c97 | ||
![]() |
f3a280dcb6 | ||
![]() |
43894687a2 | ||
![]() |
8dd8928dab | ||
![]() |
282a4d15c2 | ||
![]() |
83a2ffc67e | ||
![]() |
e9a6e3fae0 | ||
![]() |
97944b9793 | ||
![]() |
0b5d995b6d | ||
![]() |
1781a9fe9a | ||
![]() |
a0479bf7ca | ||
![]() |
2affa31edf | ||
![]() |
0bd040a851 | ||
![]() |
616c6a1607 | ||
![]() |
a5176fbf80 | ||
![]() |
f2b76b7582 | ||
![]() |
f4847f31ae | ||
![]() |
05adcf2c12 | ||
![]() |
ea301be3c1 | ||
![]() |
88e9785b01 | ||
![]() |
78efabfc1c | ||
![]() |
9d3e22200c | ||
![]() |
183f9701fd | ||
![]() |
ebbba134fe | ||
![]() |
c257be8176 | ||
![]() |
afb0aea660 | ||
![]() |
960bf46f44 | ||
![]() |
16db799e88 | ||
![]() |
f8f2cdcfcc | ||
![]() |
a1f7862f96 | ||
![]() |
3ff9284f2a | ||
![]() |
edf8f27c0f | ||
![]() |
a720953ff3 | ||
![]() |
f79dd26a82 | ||
![]() |
36b5fce4dd | ||
![]() |
89537322fd | ||
![]() |
2229ce1fe9 | ||
![]() |
f257b2177a | ||
![]() |
056c1fd43e | ||
![]() |
acacd3134f | ||
![]() |
1fe0ba1a6e | ||
![]() |
e639f4b5de | ||
![]() |
5a234bd989 | ||
![]() |
661227266e | ||
![]() |
e01556fd9a | ||
![]() |
5cb53ffc18 | ||
![]() |
e7178626ab | ||
![]() |
7f0948b0ed | ||
![]() |
4baee67781 | ||
![]() |
7061f38abe | ||
![]() |
2aa259c0b2 | ||
![]() |
a0f74e715a | ||
![]() |
c13e761c3f | ||
![]() |
2837e44bab | ||
![]() |
d41e3bb41e | ||
![]() |
4160bbb8c4 | ||
![]() |
404a20f280 | ||
![]() |
2241146b9f | ||
![]() |
bcb26c5721 | ||
![]() |
a681d8c1ba | ||
![]() |
0515b74f75 | ||
![]() |
7eeb96d88e | ||
![]() |
5b6c73ef06 | ||
![]() |
c70b866d16 | ||
![]() |
b84f2874dc | ||
![]() |
c372b5529b | ||
![]() |
a43156c38d | ||
![]() |
a15112febc | ||
![]() |
1c6a677a39 | ||
![]() |
9bf749a2c8 | ||
![]() |
f6c9d9df20 | ||
![]() |
5386e0ded9 | ||
![]() |
8fab405a3a | ||
![]() |
ee409f3ca9 | ||
![]() |
bda9beacaa | ||
![]() |
5d8c7e5733 | ||
![]() |
a68c763125 | ||
![]() |
31ac89d9d6 | ||
![]() |
8b258cbbe4 | ||
![]() |
53676fc0fd | ||
![]() |
42c561af9e | ||
![]() |
fae777c14c | ||
![]() |
1af6dc614a | ||
![]() |
2986004638 | ||
![]() |
d6f7b4706b | ||
![]() |
b40dd3e5c0 | ||
![]() |
2f4097ca9d | ||
![]() |
c8a91fbb25 | ||
![]() |
0ec259a5fc | ||
![]() |
2fda99bdb7 | ||
![]() |
1bb4ac4e9c | ||
![]() |
f376b98c09 | ||
![]() |
7382fdb2d2 | ||
![]() |
aead9592cf | ||
![]() |
bedacf29d9 | ||
![]() |
570e9a8307 | ||
![]() |
fcb94ec603 | ||
![]() |
69886ed58b | ||
![]() |
798235cd21 | ||
![]() |
b38b6b6f35 | ||
![]() |
2dba13c52e | ||
![]() |
ff366cb2c5 | ||
![]() |
a87861a993 | ||
![]() |
65476356c9 | ||
![]() |
8af6667f3e | ||
![]() |
b546df7b95 | ||
![]() |
20c1f12da8 | ||
![]() |
e65ff201af | ||
![]() |
4f367a3dcd | ||
![]() |
d7093bce4d | ||
![]() |
79e3e59cae | ||
![]() |
f1b292df93 | ||
![]() |
0cd383b8dd | ||
![]() |
22c404a667 | ||
![]() |
ba11a59d89 | ||
![]() |
06020851a9 | ||
![]() |
fd5cbde18c | ||
![]() |
384398a1e2 | ||
![]() |
2bdba4ba8b | ||
![]() |
db4179a530 | ||
![]() |
b905b74dc2 | ||
![]() |
ff05c36856 | ||
![]() |
40ea5eb53d | ||
![]() |
02f48ccc7f | ||
![]() |
72eaff148c | ||
![]() |
8b60397f06 | ||
![]() |
18d019c62a | ||
![]() |
27527b18e1 | ||
![]() |
ae9aa2662a | ||
![]() |
3bfb593b21 | ||
![]() |
8556e99241 | ||
![]() |
e885822a34 | ||
![]() |
8ebb564a79 | ||
![]() |
7dc176edcb | ||
![]() |
5167fe078b | ||
![]() |
bc7188c8a8 | ||
![]() |
5a05cb96be | ||
![]() |
0258726f0a | ||
![]() |
2fa9aa04f4 | ||
![]() |
a5f9927459 | ||
![]() |
61b422502b | ||
![]() |
1e57b5ea49 | ||
![]() |
12ce915e8e | ||
![]() |
a32273af91 | ||
![]() |
96a327af17 | ||
![]() |
1910e81ad9 | ||
![]() |
80593e774c | ||
![]() |
c092fc8e18 | ||
![]() |
579efa15c7 | ||
![]() |
37ff4e9aeb | ||
![]() |
4e4a7de5d4 | ||
![]() |
2d1bc6436a | ||
![]() |
65726d75cc | ||
![]() |
d63c0a32eb | ||
![]() |
e49c4162e5 | ||
![]() |
ffc5ad5ce7 | ||
![]() |
2dbfc28d69 | ||
![]() |
1ac7b2b8cb | ||
![]() |
7d047e612e | ||
![]() |
24f2999669 | ||
![]() |
b08728b645 | ||
![]() |
00dee43a1e | ||
![]() |
21e300b9f3 | ||
![]() |
158f0aa2d9 | ||
![]() |
10fb763d66 | ||
![]() |
4aa2c1c2c2 | ||
![]() |
bdf044d264 | ||
![]() |
6049a1f2f5 | ||
![]() |
a9fea9f606 | ||
![]() |
11002e9d45 | ||
![]() |
e7a0b850df | ||
![]() |
736c902f3c | ||
![]() |
a67ff564d0 | ||
![]() |
2a778383b1 | ||
![]() |
36457400e7 | ||
![]() |
1d629e7b2e | ||
![]() |
5f764ab8f5 | ||
![]() |
a8c9edbc3f | ||
![]() |
0a5bffe826 | ||
![]() |
9c9b6bc0d6 | ||
![]() |
562f7e7e41 | ||
![]() |
594c55afa6 | ||
![]() |
0abf97e999 | ||
![]() |
b811aec773 | ||
![]() |
ca47f566dc | ||
![]() |
65674f7fd4 | ||
![]() |
dcc510ff6c | ||
![]() |
a4fe43a964 | ||
![]() |
3dab4c07cf | ||
![]() |
ee3248ea5d | ||
![]() |
7be5ec0521 | ||
![]() |
04e90cc279 | ||
![]() |
ec8d488249 | ||
![]() |
41fdafac45 | ||
![]() |
d2e2622279 | ||
![]() |
9476bd6527 | ||
![]() |
24a06ea6f6 | ||
![]() |
2567f8eefb | ||
![]() |
fa5f5ce251 | ||
![]() |
728a61756a | ||
![]() |
736ccbe376 | ||
![]() |
fa2b226b9e | ||
![]() |
e8c5ae194d | ||
![]() |
cc2feab37e | ||
![]() |
83b084a90b | ||
![]() |
e2ac0722c8 | ||
![]() |
c3efb40b8e | ||
![]() |
03d7a416f3 | ||
![]() |
e6e812fdb0 | ||
![]() |
b34160eeec | ||
![]() |
d01aeab242 | ||
![]() |
9904e01252 | ||
![]() |
7f068b691b | ||
![]() |
59558efed1 | ||
![]() |
a88e19a8ed | ||
![]() |
0c17f0825b | ||
![]() |
9384d2523a | ||
![]() |
0e13172a89 | ||
![]() |
92f34452b5 | ||
![]() |
db54929584 | ||
![]() |
ba23cafb18 | ||
![]() |
a2e189767b | ||
![]() |
0d236fd678 | ||
![]() |
9979b160c7 | ||
![]() |
65b332c395 | ||
![]() |
b867ac8cc7 | ||
![]() |
9a0ff24ffe | ||
![]() |
9540a12b6f | ||
![]() |
fdfb53c05c | ||
![]() |
3ec979cc40 | ||
![]() |
9ea08c8a4b | ||
![]() |
629eada5c3 | ||
![]() |
a1220c77da | ||
![]() |
b4668367c6 | ||
![]() |
77da40e507 | ||
![]() |
b3b2748bb7 | ||
![]() |
26e8143616 | ||
![]() |
1444fe5468 | ||
![]() |
ac431e3ece | ||
![]() |
563a4137bd | ||
![]() |
19cbcd0c1d | ||
![]() |
8803b60b28 | ||
![]() |
e9f59ae769 | ||
![]() |
5cf3bee336 | ||
![]() |
060fe835c7 | ||
![]() |
2688ea8f59 | ||
![]() |
8eb61cf752 | ||
![]() |
6628901d46 | ||
![]() |
5a31882be3 | ||
![]() |
a42da09d6c | ||
![]() |
658cf5c873 | ||
![]() |
b8c752b740 | ||
![]() |
9151ae7081 | ||
![]() |
a1a894f722 | ||
![]() |
3352ee3151 | ||
![]() |
da3533a430 | ||
![]() |
0bb7f9becf | ||
![]() |
40c64ee2d8 | ||
![]() |
66651f7111 | ||
![]() |
c7d0bd5dec | ||
![]() |
9ce0a9d49d | ||
![]() |
2070b353c2 | ||
![]() |
1d91f3b91b | ||
![]() |
8b0aebfddb | ||
![]() |
467905d7b0 | ||
![]() |
cc81921bcb | ||
![]() |
8600c04ff3 | ||
![]() |
3f31445f12 | ||
![]() |
8a33371f37 | ||
![]() |
1164bd7183 | ||
![]() |
589fcd09c0 | ||
![]() |
c5d49016d4 | ||
![]() |
8886b12151 | ||
![]() |
336ffd7cf0 | ||
![]() |
3088778a9f | ||
![]() |
4c1de83b24 | ||
![]() |
ee2fbfc2d1 | ||
![]() |
dff7fe722b | ||
![]() |
eb6dac2e9f | ||
![]() |
255760de16 | ||
![]() |
a2373b817a | ||
![]() |
72a9940863 | ||
![]() |
46e088b5f3 | ||
![]() |
a3468b51e2 | ||
![]() |
34f19c4268 | ||
![]() |
1d2c616ce0 | ||
![]() |
99e0f0c3e4 | ||
![]() |
7d4c45c4c0 | ||
![]() |
1a92dfb019 | ||
![]() |
cc7f27fb53 | ||
![]() |
e8402008bc | ||
![]() |
c1a302834c | ||
![]() |
762f374f93 | ||
![]() |
e21d2bd511 | ||
![]() |
d936ca6b89 | ||
![]() |
88ac821070 | ||
![]() |
c20837d5f5 | ||
![]() |
81a4c66f92 | ||
![]() |
e4dfb02cb0 | ||
![]() |
0abaab4880 | ||
![]() |
a1aaa52c2a | ||
![]() |
b3a509ad14 | ||
![]() |
ad0f58090f | ||
![]() |
43c4e619c2 | ||
![]() |
427397ba7b | ||
![]() |
b51abf1ea6 | ||
![]() |
76e082159d | ||
![]() |
d36c371c1d | ||
![]() |
a5b2100f8a | ||
![]() |
fe19780f06 | ||
![]() |
83f1d7af82 | ||
![]() |
1916616b07 | ||
![]() |
0a6a684acc | ||
![]() |
6d9aecd500 | ||
![]() |
4d25db2e11 | ||
![]() |
77d5714059 | ||
![]() |
76c59cbdea | ||
![]() |
212f7dfc93 | ||
![]() |
9ba37ce34c | ||
![]() |
6c439bfbc4 | ||
![]() |
352d0db08b | ||
![]() |
be8ce1fce5 | ||
![]() |
f6356e576a | ||
![]() |
83a34a8ba1 | ||
![]() |
fb7a855eda | ||
![]() |
9c1d778623 | ||
![]() |
1bad2a023d | ||
![]() |
999da51e99 | ||
![]() |
ea4b965eeb | ||
![]() |
33160e83cb | ||
![]() |
3e5e7f49cc | ||
![]() |
cc02b01c2b | ||
![]() |
243e5391db | ||
![]() |
230ad5c04f | ||
![]() |
289cfaa407 | ||
![]() |
0798745c16 | ||
![]() |
094695a7ff | ||
![]() |
86f041b803 | ||
![]() |
00e65153f4 | ||
![]() |
b12f0490f3 | ||
![]() |
42a2bc8a9a | ||
![]() |
8adca3725d | ||
![]() |
b57d4b3048 | ||
![]() |
9c7aa241e4 | ||
![]() |
c3ec9b2ad7 | ||
![]() |
195070f8f5 | ||
![]() |
cbfe91f36f | ||
![]() |
738e2ac344 | ||
![]() |
ba0be665ae | ||
![]() |
0ba6f8b39f | ||
![]() |
2773f5fbc8 | ||
![]() |
263a816c3b | ||
![]() |
e7d148336b | ||
![]() |
829059ea01 | ||
![]() |
622d698ff8 | ||
![]() |
f09b04dce0 | ||
![]() |
59f8583895 | ||
![]() |
f506fc0478 | ||
![]() |
880676d670 | ||
![]() |
6485327b97 | ||
![]() |
5773152ed3 | ||
![]() |
e88312659b | ||
![]() |
c4d0ba549f | ||
![]() |
cb41afb11f | ||
![]() |
6d27aea9f2 | ||
![]() |
39e1f9cb76 | ||
![]() |
8fb7d64f79 | ||
![]() |
08fdef4870 | ||
![]() |
aa0196b9d0 | ||
![]() |
a3426f92ac | ||
![]() |
d50d4254c5 | ||
![]() |
50cdadc4a2 | ||
![]() |
5aa9b6cb12 | ||
![]() |
44fc8d80e0 | ||
![]() |
817fa57bfe | ||
![]() |
668e2da01b | ||
![]() |
7f3982d153 | ||
![]() |
f62ae930c7 | ||
![]() |
d0808ce159 | ||
![]() |
7b19dadbf5 | ||
![]() |
43ab0283d9 | ||
![]() |
c27e9d5901 | ||
![]() |
e0d21627bb | ||
![]() |
1b1dd6ef88 | ||
![]() |
10700007d5 | ||
![]() |
c5ec8d04c1 | ||
![]() |
490b250db6 | ||
![]() |
0630423c8e | ||
![]() |
c2e06517e1 | ||
![]() |
b01ae33d1e | ||
![]() |
a55ee32058 | ||
![]() |
c3941d5bec | ||
![]() |
6020dc2b2d | ||
![]() |
7ab41e0c3a | ||
![]() |
c0a75f5b98 | ||
![]() |
efd4db40ef | ||
![]() |
3c3fe7bf83 | ||
![]() |
268762166a | ||
![]() |
53a1833e26 | ||
![]() |
1ff8b5fb9f | ||
![]() |
225b43ca3c | ||
![]() |
75a58d6381 | ||
![]() |
62814f083e | ||
![]() |
6f9deea873 | ||
![]() |
d3160eed9d | ||
![]() |
9b4a07de34 | ||
![]() |
d31eeac49e | ||
![]() |
84c5d27416 | ||
![]() |
17d77aa31f | ||
![]() |
388ec3e3d3 | ||
![]() |
f0829f9ef3 | ||
![]() |
81f481833c | ||
![]() |
a74c4168f3 | ||
![]() |
776dbc34f7 | ||
![]() |
168ac91ab8 | ||
![]() |
9bd26798b6 | ||
![]() |
4ae81a2de4 | ||
![]() |
3c314ced0a | ||
![]() |
ba9d0d7707 | ||
![]() |
38946e4b0f | ||
![]() |
f71242a036 | ||
![]() |
960fd9be38 | ||
![]() |
40844dcd76 | ||
![]() |
420d28c713 | ||
![]() |
5bbd6afaf1 | ||
![]() |
77a06c7604 | ||
![]() |
1f4f87d3bd | ||
![]() |
2e8d86575e | ||
![]() |
ef0659f436 | ||
![]() |
e18e69966f | ||
![]() |
e7b4b88055 | ||
![]() |
de65d1e1fc | ||
![]() |
7ea0862f95 | ||
![]() |
efc7049dfd | ||
![]() |
629549d76f | ||
![]() |
756fb795d6 | ||
![]() |
13d1974a5b | ||
![]() |
d3168a9022 | ||
![]() |
059378eedf | ||
![]() |
e973868a90 | ||
![]() |
2a0e5d6835 | ||
![]() |
5537abe2c3 | ||
![]() |
5eae235b3c | ||
![]() |
bfc7718a21 | ||
![]() |
405d6bee78 | ||
![]() |
f65f2da890 | ||
![]() |
30ab58c33d | ||
![]() |
87ba5a7eb6 | ||
![]() |
6e8593af91 | ||
![]() |
0ab1d3fc40 | ||
![]() |
f22d13e695 | ||
![]() |
cdde61a460 | ||
![]() |
989ce126f1 | ||
![]() |
28618e822e | ||
![]() |
6772381afc | ||
![]() |
75b45beabc | ||
![]() |
56d53e9b01 | ||
![]() |
3a8b04e2d1 | ||
![]() |
1ce7d66fb1 | ||
![]() |
7b5a9b69fe | ||
![]() |
837b22ccac | ||
![]() |
7146719393 | ||
![]() |
71ee604c69 | ||
![]() |
9945a5b813 | ||
![]() |
7254387042 | ||
![]() |
3a7f2a94a6 | ||
![]() |
6bea4aa96b | ||
![]() |
fa262bbceb | ||
![]() |
3139fe0170 | ||
![]() |
ef6c5de65b | ||
![]() |
07799563b5 | ||
![]() |
b1de4b7bd6 | ||
![]() |
2b8ae9a5ea | ||
![]() |
7c52d3ec5d | ||
![]() |
aefaa7619e | ||
![]() |
ca202290bf | ||
![]() |
cbdbc4cba2 | ||
![]() |
8abf904a78 | ||
![]() |
ecf7969c46 | ||
![]() |
a473e3d623 | ||
![]() |
1f8e90858e | ||
![]() |
2c2edca8fa | ||
![]() |
50e86ff1ca | ||
![]() |
02ecc5011a | ||
![]() |
6e666a018b | ||
![]() |
66fbb2ce1e | ||
![]() |
b00722ec0a | ||
![]() |
77b1413319 | ||
![]() |
87b8d60c9d | ||
![]() |
db5203e1ff | ||
![]() |
ea022670c4 | ||
![]() |
54b009cc49 | ||
![]() |
80c3acace9 | ||
![]() |
cea9428b47 | ||
![]() |
f8ffbfabbe | ||
![]() |
836a1e652b | ||
![]() |
d8544e0b84 | ||
![]() |
4817d7fddc | ||
![]() |
e6a385a85e | ||
![]() |
3634f68364 | ||
![]() |
f17ffa94fe | ||
![]() |
d52bcd46a1 | ||
![]() |
7e58b0b6fe | ||
![]() |
f451f1f65d | ||
![]() |
4d12e71fba | ||
![]() |
66fde7a212 | ||
![]() |
86eccf219d | ||
![]() |
677865f347 | ||
![]() |
eb4b3810e9 | ||
![]() |
5f26501ddf | ||
![]() |
b33a72f864 | ||
![]() |
675f43b968 | ||
![]() |
9f117a2e59 | ||
![]() |
a0844229a3 | ||
![]() |
114fcc144c | ||
![]() |
43372ff648 | ||
![]() |
b8ebbc5404 | ||
![]() |
28309f82f3 | ||
![]() |
c70fa391b6 | ||
![]() |
caab589dce | ||
![]() |
20370054e7 | ||
![]() |
f1882cb1e1 | ||
![]() |
2ed149852d | ||
![]() |
ac7226a0df | ||
![]() |
5705650ca8 | ||
![]() |
60855ca7c5 | ||
![]() |
b8d8d181f3 | ||
![]() |
6309160fc6 | ||
![]() |
fc0e6ed273 | ||
![]() |
ada0cee656 | ||
![]() |
6dde524d2c | ||
![]() |
6a631e1915 | ||
![]() |
bb6fa343cf | ||
![]() |
7557acde6c | ||
![]() |
25ed8952f9 | ||
![]() |
b93d94b0bd | ||
![]() |
33d75fd2fb | ||
![]() |
28a9855fd2 | ||
![]() |
9aad07621c | ||
![]() |
384cde6eaa | ||
![]() |
5ae98661ad | ||
![]() |
8f4d9ceca9 | ||
![]() |
83d9a1233e | ||
![]() |
522a287d79 | ||
![]() |
e052d4660d | ||
![]() |
39b0b2f032 | ||
![]() |
0223d6d200 | ||
![]() |
808ce72078 | ||
![]() |
3a84c47176 | ||
![]() |
20c2426128 | ||
![]() |
bf11d4c9fa | ||
![]() |
783c0f79d7 | ||
![]() |
98b94bd9c4 | ||
![]() |
ff0178f965 | ||
![]() |
7f88c3d0a9 | ||
![]() |
11e8e38f2c | ||
![]() |
50c5314eaf | ||
![]() |
a7a76d4f58 | ||
![]() |
4df4f68fe1 | ||
![]() |
7db8d37137 | ||
![]() |
b7503a7d81 | ||
![]() |
9f5d4034e3 | ||
![]() |
3c941f6c4b | ||
![]() |
ec8fff421a | ||
![]() |
a47a0b5432 | ||
![]() |
96ba46f21d | ||
![]() |
90f48d5817 | ||
![]() |
7288dd097a | ||
![]() |
0119d62a35 | ||
![]() |
4d6ab73fa9 | ||
![]() |
f58c95840a | ||
![]() |
ecf24f81ec | ||
![]() |
dd3306a940 | ||
![]() |
bbb2b98f27 | ||
![]() |
bc7332780d | ||
![]() |
6f3bc3ac8f | ||
![]() |
cd04d869b7 | ||
![]() |
909e15cbdd | ||
![]() |
33fa30ab78 | ||
![]() |
44933ac17a | ||
![]() |
bb2af96deb | ||
![]() |
1fe6da14ea | ||
![]() |
b7b9653c21 | ||
![]() |
8adc5918f8 | ||
![]() |
0db593b1bb | ||
![]() |
a0c9dbeb78 | ||
![]() |
61d5546d89 | ||
![]() |
f97b7c943b | ||
![]() |
97549b633b | ||
![]() |
1949e4a9d4 | ||
![]() |
ecb5f7a5ba | ||
![]() |
6021f72cf0 | ||
![]() |
c00ef74f96 | ||
![]() |
962e070150 | ||
![]() |
221cbf5e07 | ||
![]() |
a72d37ab69 | ||
![]() |
f92227e5df | ||
![]() |
c50617452f | ||
![]() |
3957eca94d | ||
![]() |
70111cf614 | ||
![]() |
f9e03c9a40 | ||
![]() |
88fbdf1cc4 | ||
![]() |
7b76bd79e8 | ||
![]() |
f4b58e649d | ||
![]() |
91ff301d53 | ||
![]() |
f5e1c99259 | ||
![]() |
abdcd3cc30 | ||
![]() |
23615a39ac | ||
![]() |
5fa5fc39fc | ||
![]() |
01b3c7e91b | ||
![]() |
e4e364af3f | ||
![]() |
f2358692af | ||
![]() |
26ed6299e3 | ||
![]() |
3a85187111 | ||
![]() |
4261a2eed3 | ||
![]() |
fef17163a9 | ||
![]() |
9dd447a14f | ||
![]() |
ecf4407ba4 | ||
![]() |
039c0d3ee6 | ||
![]() |
5808aead55 | ||
![]() |
e797e2e7f1 | ||
![]() |
23cacbfe65 | ||
![]() |
4f94ee9b72 | ||
![]() |
0d1a26298a | ||
![]() |
8ccd0b23e9 | ||
![]() |
9d8b991354 | ||
![]() |
d273f69852 | ||
![]() |
eee3ccafc3 | ||
![]() |
3686e90e81 | ||
![]() |
f5f8371865 | ||
![]() |
1191455d37 | ||
![]() |
1a5d9da2bf | ||
![]() |
011e151c91 | ||
![]() |
54aa40eac1 | ||
![]() |
21a7a73f6d | ||
![]() |
5090b41eef | ||
![]() |
0e55aa6249 | ||
![]() |
dd2dcf4df2 | ||
![]() |
2e84b28998 | ||
![]() |
e6cbfea5a7 | ||
![]() |
641d662944 | ||
![]() |
09208e183b | ||
![]() |
fba3ece688 | ||
![]() |
f7d849a3cc | ||
![]() |
709c700cc6 | ||
![]() |
2da411c1ec | ||
![]() |
d6e4f3c809 | ||
![]() |
1bb08db8ba | ||
![]() |
2ba116b1e6 | ||
![]() |
7088de0fb9 | ||
![]() |
7084f73d6c | ||
![]() |
69374e25fe | ||
![]() |
5e16969d61 | ||
![]() |
0fe5a44e5a | ||
![]() |
98e617001d | ||
![]() |
979bd09b29 | ||
![]() |
77678b8f31 | ||
![]() |
3575cac9d7 | ||
![]() |
8cdeaf1b27 | ||
![]() |
08a8c6c414 | ||
![]() |
fa5c1b22ae | ||
![]() |
a99e7f3288 | ||
![]() |
a29506ed2f | ||
![]() |
1434b40d03 | ||
![]() |
6d6609187b | ||
![]() |
9682eaae2a | ||
![]() |
1cdb4ccc17 | ||
![]() |
2a878dffbc | ||
![]() |
49f4fb7ed7 | ||
![]() |
caa985660a | ||
![]() |
3842a1e4fb | ||
![]() |
e06d83cb93 | ||
![]() |
67df894448 | ||
![]() |
d1ec6cf21b | ||
![]() |
537c561cee | ||
![]() |
a65ddc5b36 | ||
![]() |
1fb1b3a784 | ||
![]() |
b80879765c | ||
![]() |
10919fe15b | ||
![]() |
9e5fe1edca | ||
![]() |
03ee3f3d2a | ||
![]() |
4113283069 | ||
![]() |
56c5f696df | ||
![]() |
9beb76e641 | ||
![]() |
f71403be58 | ||
![]() |
d0e5d36b1b | ||
![]() |
fdeb7543ca | ||
![]() |
90716f4f5b | ||
![]() |
54d41bc288 | ||
![]() |
d63c7a9042 | ||
![]() |
cd5b60cbed | ||
![]() |
6d60e6698a | ||
![]() |
d53cb01396 | ||
![]() |
8baaecab1b | ||
![]() |
1368f9f89e | ||
![]() |
ce36f3ae3b | ||
![]() |
cf147aa161 | ||
![]() |
7700cff5e5 | ||
![]() |
b883f313ba | ||
![]() |
b1ee22cde6 | ||
![]() |
b32f149a1b | ||
![]() |
1d136c6c35 | ||
![]() |
b8a17580c5 | ||
![]() |
87febf8679 | ||
![]() |
38b2ffd450 | ||
![]() |
01e031e7e7 | ||
![]() |
0b1eda3050 | ||
![]() |
52cdf96dfe | ||
![]() |
1f5eba59c5 | ||
![]() |
372c2f2be0 | ||
![]() |
25e0b46396 | ||
![]() |
621a1909ec | ||
![]() |
d3332583b6 | ||
![]() |
cb5cf9bb09 | ||
![]() |
6cb2c2a84e | ||
![]() |
633137fd79 | ||
![]() |
9627fdf33f | ||
![]() |
b39366c80a | ||
![]() |
ac01c49666 | ||
![]() |
80d16ea407 | ||
![]() |
4f44f26333 | ||
![]() |
a21bdb1487 | ||
![]() |
4d6a2f40d3 | ||
![]() |
e6773aac0e | ||
![]() |
997381d0c3 | ||
![]() |
ac53eeb76d | ||
![]() |
a09c8934fc | ||
![]() |
b4120c39e6 | ||
![]() |
5d6320d925 | ||
![]() |
985bf50f7f | ||
![]() |
84d21af644 | ||
![]() |
267cd99b04 | ||
![]() |
401960079c | ||
![]() |
1fbc8a2850 | ||
![]() |
16fe5a94ac | ||
![]() |
1c20a4d9eb | ||
![]() |
3a9f30d954 | ||
![]() |
856aacf8ce | ||
![]() |
441b510775 | ||
![]() |
88a10b5af1 | ||
![]() |
65205ace95 | ||
![]() |
1a4ef06ee9 | ||
![]() |
64ac631040 | ||
![]() |
4e4cabb929 | ||
![]() |
b242c86869 | ||
![]() |
d37fee346a | ||
![]() |
cc52d3b0af | ||
![]() |
d5b1bae305 | ||
![]() |
04e22faf85 | ||
![]() |
48cb3ed138 | ||
![]() |
ebdeee8b3c | ||
![]() |
6449d7d4ee | ||
![]() |
4b775d15a2 | ||
![]() |
e4d6a453b0 | ||
![]() |
9dcbcd57cb | ||
![]() |
17aa44c88b | ||
![]() |
60dc266e13 | ||
![]() |
60ed308caa | ||
![]() |
c485e7e167 | ||
![]() |
71a8361580 | ||
![]() |
666dce1b6f | ||
![]() |
7bed1c2295 | ||
![]() |
51325089f0 | ||
![]() |
90666a84ac | ||
![]() |
0c37bd3a64 | ||
![]() |
753517fb56 | ||
![]() |
b939daac2a | ||
![]() |
8f2b7b2783 | ||
![]() |
883d4b4065 | ||
![]() |
ff38ae202b | ||
![]() |
7b71302a63 | ||
![]() |
cbf8fc5bb9 | ||
![]() |
00797a7834 | ||
![]() |
de092e5357 | ||
![]() |
bba8739008 | ||
![]() |
3c5564b274 | ||
![]() |
f3ff24cfbf | ||
![]() |
975b519585 | ||
![]() |
7f1f34f812 | ||
![]() |
d5bab1006e | ||
![]() |
b52e48a355 | ||
![]() |
68a807a446 | ||
![]() |
0dc6b66825 | ||
![]() |
a9db7616aa | ||
![]() |
b71e2833d6 | ||
![]() |
56bc919866 | ||
![]() |
ac3d8cddbe | ||
![]() |
aa10b392ae | ||
![]() |
e8ea1c92b1 | ||
![]() |
b5d7b80fe9 | ||
![]() |
2a328e28da | ||
![]() |
3d5c173d61 | ||
![]() |
9a5da5199d | ||
![]() |
764a171a25 | ||
![]() |
25061ab07c | ||
![]() |
6074925102 | ||
![]() |
f8c0c449bf | ||
![]() |
26d18c588e | ||
![]() |
6f18dd26a2 | ||
![]() |
7340bc05b4 | ||
![]() |
b0948cf9fc | ||
![]() |
86c16fa5d8 | ||
![]() |
68695bbf92 | ||
![]() |
b4fdbdeb1b | ||
![]() |
1fb3774e03 | ||
![]() |
f284a799ef | ||
![]() |
c6e759a94c | ||
![]() |
052c9a9869 | ||
![]() |
0806344ffb | ||
![]() |
d0e626c6ee | ||
![]() |
9068247856 | ||
![]() |
4553850412 | ||
![]() |
21d42c92e5 | ||
![]() |
eb9770e3ba | ||
![]() |
d54a6e0b0e | ||
![]() |
a8f5cfa640 | ||
![]() |
0d3e0c201e | ||
![]() |
cc4e4a4f91 | ||
![]() |
b597774bb9 | ||
![]() |
87fca5cffe | ||
![]() |
9685456ee4 | ||
![]() |
6a9e3ef639 | ||
![]() |
b5a9f042cc | ||
![]() |
770dcc1832 | ||
![]() |
94f7baf299 | ||
![]() |
77979eddde | ||
![]() |
f1e52b8b92 | ||
![]() |
2e414cfd63 | ||
![]() |
f5b5982e1c | ||
![]() |
eebd83d6ac | ||
![]() |
a9aee21e58 | ||
![]() |
bd9ee18e56 | ||
![]() |
c75c2d0f21 | ||
![]() |
80f3e3c3b6 | ||
![]() |
86a1fcf009 | ||
![]() |
c235c647a0 | ||
![]() |
09d8ae1316 | ||
![]() |
cb7e94449c | ||
![]() |
e742091a37 | ||
![]() |
8e3be3826f | ||
![]() |
9bc95f030c | ||
![]() |
9576d5bd89 | ||
![]() |
a0ba3ce2e4 | ||
![]() |
6b816a11f7 | ||
![]() |
86c7b8522e | ||
![]() |
f9eb2a1ee5 | ||
![]() |
174d040ca3 | ||
![]() |
6b16b08712 | ||
![]() |
e9cdb28a06 | ||
![]() |
f8abf92a66 | ||
![]() |
9413856463 | ||
![]() |
c24d46cf0f | ||
![]() |
c38e4190f1 | ||
![]() |
53cec61cdf | ||
![]() |
150c3b413a | ||
![]() |
eb15c04254 | ||
![]() |
7d7a6f7ccc | ||
![]() |
b54d18d888 | ||
![]() |
705028c79d | ||
![]() |
a91ef2ce9e | ||
![]() |
73f46d3762 | ||
![]() |
1ceda017c7 | ||
![]() |
725cedab72 | ||
![]() |
40b60e8313 | ||
![]() |
5c01f04a07 | ||
![]() |
183181ee54 | ||
![]() |
74b58cae59 | ||
![]() |
b859823011 | ||
![]() |
701320b100 | ||
![]() |
dcdcf17f5e | ||
![]() |
7c9c3de644 | ||
![]() |
cbcd281784 | ||
![]() |
e70dcdc642 | ||
![]() |
391d3e7fc7 | ||
![]() |
02d986fc89 | ||
![]() |
65a6488e44 | ||
![]() |
cf703d5213 | ||
![]() |
3a8437c6f3 | ||
![]() |
640396da64 | ||
![]() |
7e005549fe | ||
![]() |
59b3362715 | ||
![]() |
9dc8e47113 | ||
![]() |
e958545230 | ||
![]() |
76f3e170d5 | ||
![]() |
a5af49dafd | ||
![]() |
736d9fe450 | ||
![]() |
bd7a520316 | ||
![]() |
7f5b5d6f03 | ||
![]() |
8d5a59e7d5 | ||
![]() |
989acce0a5 | ||
![]() |
641b4a806a | ||
![]() |
025a44b629 | ||
![]() |
dd64bf2af7 | ||
![]() |
d5b3f65076 | ||
![]() |
66de4cbead | ||
![]() |
be3d6adf77 | ||
![]() |
65e83e8fb6 | ||
![]() |
7a2be6f12c | ||
![]() |
0d6662b558 | ||
![]() |
0a2aa54508 | ||
![]() |
f6353cfb47 | ||
![]() |
fb71ba3b7c | ||
![]() |
ac6e086c26 | ||
![]() |
4c4cfb49b4 | ||
![]() |
9a073713bb | ||
![]() |
4db3bd3270 | ||
![]() |
d5d9ed7200 | ||
![]() |
0e409bb993 | ||
![]() |
89a8769399 | ||
![]() |
fdfd94b9d0 | ||
![]() |
ba56aec353 | ||
![]() |
3ac3cedc19 | ||
![]() |
7d296ee650 | ||
![]() |
ccd26b4146 | ||
![]() |
5d4269be4c | ||
![]() |
54cdfc0c16 | ||
![]() |
fd899a2e95 | ||
![]() |
d1f446aae2 | ||
![]() |
c3f04ea67d | ||
![]() |
0040ee5cb6 | ||
![]() |
d928f5759f | ||
![]() |
23eeb4353d | ||
![]() |
8e8d74b5b7 | ||
![]() |
0951f0f824 | ||
![]() |
f7534b3a0f | ||
![]() |
7fcc07805a | ||
![]() |
7f9f075147 | ||
![]() |
cbfc359a99 | ||
![]() |
6d8a361c9a | ||
![]() |
46fa9a9366 | ||
![]() |
29fee28d1d | ||
![]() |
3490273b49 | ||
![]() |
65c8b6e66a | ||
![]() |
5ebde97352 | ||
![]() |
f6c624b59a | ||
![]() |
90b9223aae | ||
![]() |
0d2296917a | ||
![]() |
74bda719a6 | ||
![]() |
25db3c2940 | ||
![]() |
442290d7f0 | ||
![]() |
a6eb871f5e | ||
![]() |
b500c3f526 |
9
.github/CONTRIBUTING.md
vendored
9
.github/CONTRIBUTING.md
vendored
@@ -11,9 +11,12 @@ Do not report crashes in the GitHub issue tracker. NewPipe has an automated cras
|
|||||||
|
|
||||||
* Search the [existing issues](https://github.com/TeamNewPipe/NewPipe/issues) first to make sure your issue/feature hasn't been reported/requested before
|
* Search the [existing issues](https://github.com/TeamNewPipe/NewPipe/issues) first to make sure your issue/feature 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
|
||||||
* 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/implement an issue/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.
|
||||||
|
* Issues that only contain a generated bug report, but no describtion 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 tnp@newpipe.schabi.org to let me 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.
|
* 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, register at our [Sentry](https://sentry.schabi.org) instance (see section "Crash reporting" for more information.
|
||||||
@@ -27,13 +30,15 @@ Do not report crashes in the GitHub issue tracker. NewPipe has an automated cras
|
|||||||
* Stick to NewPipe's style conventions (well, just look the other code and then do it the same way :))
|
* Stick to NewPipe's style conventions (well, just look the other code and then do it the same way :))
|
||||||
* Do not bring non-free software (e.g., binary blobs) into the project. Also, make sure you do not introduce Google libraries.
|
* Do not bring non-free software (e.g., binary blobs) into the project. Also, make sure you do not introduce Google libraries.
|
||||||
* Stick to [F-Droid contribution guidelines](https://f-droid.org/wiki/page/Inclusion_Policy)
|
* Stick to [F-Droid contribution guidelines](https://f-droid.org/wiki/page/Inclusion_Policy)
|
||||||
* Make changes on a separate branch, not on the master 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 not be considered, GitHub is the primary platform.
|
* Make changes on a separate branch, not on the master 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 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 [GNU General Public License v3](https://www.gnu.org/licenses/gpl-3.0.html).
|
* 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).
|
||||||
* 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!
|
* 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!
|
||||||
* Try to figure out yourself why builds on our CI fail.
|
* Try to figure out yourself why builds on our CI fail.
|
||||||
* Make sure your PR is up-to-date with the rest of the code. Often, a simple click on "Update branch" will do the job, but if not, you are asked to merge the master branch manually and resolve the problems on your own. That will make the maintainers' jobs way easier.
|
* 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 maintainers' jobs way easier.
|
||||||
* 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 about sumission, or clearly state that in the description of your PR.
|
* 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 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.
|
||||||
|
|
||||||
## Communication
|
## Communication
|
||||||
|
|
||||||
|
1
.github/ISSUE_TEMPLATE.md
vendored
1
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,2 +1,3 @@
|
|||||||
- [ ] 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.
|
||||||
- [ ] I checked if the issue/feature exists in the latest version.
|
- [ ] 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.
|
||||||
|
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1 +1 @@
|
|||||||
- [ ] I carefully reed 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.
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -10,3 +10,4 @@
|
|||||||
gradle.properties
|
gradle.properties
|
||||||
*~
|
*~
|
||||||
.weblate
|
.weblate
|
||||||
|
*.class
|
||||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,3 +0,0 @@
|
|||||||
[submodule "app/src/main/java/org/schabi/newpipe/extractor"]
|
|
||||||
path = app/src/main/java/org/schabi/newpipe/extractor
|
|
||||||
url = https://github.com/TeamNewPipe/NewPipeExtractor.git
|
|
||||||
|
@@ -5,11 +5,13 @@ android:
|
|||||||
components:
|
components:
|
||||||
# The BuildTools version used by NewPipe
|
# The BuildTools version used by NewPipe
|
||||||
- tools
|
- tools
|
||||||
- build-tools-26.0.1
|
- build-tools-27.0.3
|
||||||
|
|
||||||
# The SDK version used to compile NewPipe
|
# The SDK version used to compile NewPipe
|
||||||
- android-26
|
- android-27
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- yes | sdkmanager "platforms;android-27"
|
||||||
script: ./gradlew -Dorg.gradle.jvmargs=-Xmx1536m assembleDebug lintDebug testDebugUnitTest
|
script: ./gradlew -Dorg.gradle.jvmargs=-Xmx1536m assembleDebug lintDebug testDebugUnitTest
|
||||||
|
|
||||||
licenses:
|
licenses:
|
||||||
|
Binary file not shown.
66
README.md
66
README.md
@@ -9,24 +9,26 @@
|
|||||||
<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>
|
||||||
</p>
|
</p>
|
||||||
<hr />
|
<hr />
|
||||||
<p align="center"><a href="#screenshots">Screenshots</a> • <a href="#description">Description</a> • <a href="#features">Features</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="#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>
|
||||||
<hr />
|
<hr />
|
||||||
WARNING: PUTTING NEWPIPE OR ANY FORK OF IT INTO GOOGLE PLAYSTORE VIOLATES THEIR TERMS OF CONDITIONS.
|
WARNING: PUTTING NEWPIPE OR ANY FORK OF IT INTO GOOGLE PLAYSTORE VIOLATES THEIR TERMS OF CONDITIONS.
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||
[<img src="screenshots/shot_1.png" width=160>](screenshots/shot_1.png)
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_1.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_1.png)
|
||||||
[<img src="screenshots/shot_2.png" width=160>](screenshots/shot_2.png)
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_2.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_2.png)
|
||||||
[<img src="screenshots/shot_3.png" width=160>](screenshots/shot_3.png)
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_3.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_3.png)
|
||||||
[<img src="screenshots/shot_4.png" width=160>](screenshots/shot_4.png)
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_4.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_4.png)
|
||||||
[<img src="screenshots/shot_5.png" width=160>](screenshots/shot_5.png)
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_5.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_5.png)
|
||||||
[<img src="screenshots/shot_6.png" width=160>](screenshots/shot_6.png)
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_6.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_6.png)
|
||||||
[<img src="screenshots/shot_7.png" width=160>](screenshots/shot_7.png)
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_7.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_7.png)
|
||||||
[<img src="screenshots/shot_8.png" width=160>](screenshots/shot_8.png)
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_8.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_8.png)
|
||||||
[<img src="screenshots/shot_9.png" width=160>](screenshots/shot_9.png)
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_9.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_9.png)
|
||||||
[<img src="screenshots/shot_10.png" width=160>](screenshots/shot_10.png)
|
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png)
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
|
||||||
@@ -55,20 +57,19 @@ NewPipe does not use any Google framework libraries, or the YouTube API. It only
|
|||||||
* Subscribe to channels
|
* Subscribe to channels
|
||||||
* Search history
|
* Search history
|
||||||
* Search/Watch Playlists
|
* Search/Watch Playlists
|
||||||
|
* Watch as queues Playlists
|
||||||
|
* Queuing videos
|
||||||
|
* Local playlists
|
||||||
|
* Subtitles
|
||||||
|
* Multi-service support (eg. SoundCloud in NewPipe Beta)
|
||||||
|
|
||||||
### Coming Features
|
### Coming Features
|
||||||
|
|
||||||
* Multiservice support (eg. SoundCloud)
|
* Livestream support
|
||||||
* Bookmarks
|
* Cast to UPnP and Cast
|
||||||
* Watch as queues Playlists
|
* Show comments
|
||||||
* Queuing videos
|
|
||||||
* Subtitles support
|
|
||||||
* livestream support
|
|
||||||
* ... and many more
|
* ... and many more
|
||||||
|
|
||||||
### Multiservice support
|
|
||||||
Although NewPipe only supports YouTube at the moment, it's designed to support many more streaming services. The plan is, that NewPipe will get such support by the version 2.0.
|
|
||||||
|
|
||||||
## Contribution
|
## Contribution
|
||||||
Whether you have ideas, translations, design changes, code cleaning, or real heavy code changes, help is always welcome.
|
Whether you have ideas, translations, design changes, code cleaning, or real heavy code changes, help is always welcome.
|
||||||
The more is done the better it gets!
|
The more is done the better it gets!
|
||||||
@@ -76,19 +77,24 @@ The more is done the better it gets!
|
|||||||
If you'd like to get involved, check our [contribution notes](.github/CONTRIBUTING.md).
|
If you'd like to get involved, check our [contribution notes](.github/CONTRIBUTING.md).
|
||||||
|
|
||||||
## Donate
|
## Donate
|
||||||
If you like NewPipe we'd be happy about a donation. You can either donate via Bitcoin or BountySource. For further information about donating to NewPipe, please visit our [website](https://newpipe.schabi.org/donate/).
|
If you like NewPipe we'd be happy about a donation. You can either donate via Bitcoin, Bountysource or Liberapay. For further information about donating to NewPipe, please visit our [website](https://newpipe.schabi.org/donate).
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td><img src="https://bitcoin.org/img/icons/logotop.svg" alt="Bitcoin" /></td>
|
<td><img src="https://bitcoin.org/img/icons/logotop.svg" alt="Bitcoin" /></td>
|
||||||
<td><img src="assets/bitcoin_qr_code.png" alt="Bitcoin QR Code" width="100px"/></td>
|
<td><img src="assets/bitcoin_qr_code.png" alt="Bitcoin QR Code" width="100px"/></td>
|
||||||
<td><samp>16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh</samp></td>
|
<td><samp>16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh</samp></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><a href="https://www.bountysource.com/teams/newpipe"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Bountysource.png/320px-Bountysource.png" alz="Bountysource" width="190px" /></a></td>
|
<td><a href="https://liberapay.com/TeamNewPipe/"><img src="https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg" alt="Liberapay" width="80px" /></a></td>
|
||||||
<td><a href="https://www.bountysource.com/teams/newpipe"><img src="assets/bountysource_qr_code.png" alt="Visit NewPipe at bountysource.com" width="100px"/></a></td>
|
<td><a href="https://liberapay.com/TeamNewPipe/"><img src="assets/liberapay_qr_code.png" alt="Visit NewPipe at liberapay.com" width="100px"/></a></td>
|
||||||
<td><a href="https://www.bountysource.com/teams/newpipe/issues"><img src="https://img.shields.io/bountysource/team/newpipe/activity.svg?colorB=cd201f" height="30px" alt="Check out how many bounties you can earn." /></a></td>
|
<td><a href="https://liberapay.com/TeamNewPipe/donate"><img src="assets/liberapay_donate_button.svg" alt="Donate via Liberapay" height="35px" /></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><a href="https://www.bountysource.com/teams/newpipe"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Bountysource.png/320px-Bountysource.png" alt="Bountysource" width="190px" /></a></td>
|
||||||
|
<td><a href="https://www.bountysource.com/teams/newpipe"><img src="assets/bountysource_qr_code.png" alt="Visit NewPipe at bountysource.com" width="100px"/></a></td>
|
||||||
|
<td><a href="https://www.bountysource.com/teams/newpipe/issues"><img src="https://img.shields.io/bountysource/team/newpipe/activity.svg?colorB=cd201f" height="30px" alt="Check out how many bounties you can earn." /></a></td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
104
app/build.gradle
104
app/build.gradle
@@ -1,15 +1,15 @@
|
|||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 26
|
compileSdkVersion 27
|
||||||
buildToolsVersion '26.0.1'
|
buildToolsVersion '27.0.3'
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "org.schabi.newpipe"
|
applicationId "org.schabi.newpipe"
|
||||||
minSdkVersion 15
|
minSdkVersion 15
|
||||||
targetSdkVersion 26
|
targetSdkVersion 27
|
||||||
versionCode 40
|
versionCode 67
|
||||||
versionName "0.10.2"
|
versionName "0.14.0"
|
||||||
|
|
||||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
@@ -26,9 +26,6 @@ android {
|
|||||||
debuggable true
|
debuggable true
|
||||||
applicationIdSuffix ".debug"
|
applicationIdSuffix ".debug"
|
||||||
}
|
}
|
||||||
beta {
|
|
||||||
applicationIdSuffix ".beta"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lintOptions {
|
lintOptions {
|
||||||
@@ -38,49 +35,68 @@ android {
|
|||||||
abortOnError false
|
abortOnError false
|
||||||
}
|
}
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility JavaVersion.VERSION_1_7
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_1_7
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ext {
|
||||||
|
supportLibVersion = '27.1.1'
|
||||||
|
exoPlayerLibVersion = '2.8.2'
|
||||||
|
roomDbLibVersion = '1.1.1'
|
||||||
|
leakCanaryLibVersion = '1.5.4'
|
||||||
|
okHttpLibVersion = '3.10.0'
|
||||||
|
icepickLibVersion = '3.2.0'
|
||||||
|
stethoLibVersion = '1.5.0'
|
||||||
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2') {
|
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2') {
|
||||||
exclude module: 'support-annotations'
|
exclude module: 'support-annotations'
|
||||||
}
|
}
|
||||||
|
|
||||||
compile 'com.github.TeamNewPipe:NewPipeExtractor:b9d0941'
|
implementation 'com.github.TeamNewPipe:NewPipeExtractor:850670917fce'
|
||||||
|
|
||||||
|
testImplementation 'junit:junit:4.12'
|
||||||
|
testImplementation 'org.mockito:mockito-core:2.8.9'
|
||||||
|
|
||||||
|
implementation "com.android.support:appcompat-v7:$supportLibVersion"
|
||||||
|
implementation "com.android.support:support-v4:$supportLibVersion"
|
||||||
|
implementation "com.android.support:design:$supportLibVersion"
|
||||||
|
implementation "com.android.support:recyclerview-v7:$supportLibVersion"
|
||||||
|
implementation "com.android.support:preference-v14:$supportLibVersion"
|
||||||
|
|
||||||
|
implementation 'ch.acra:acra:4.9.2'
|
||||||
|
|
||||||
|
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
|
||||||
|
implementation 'de.hdodenhof:circleimageview:2.2.0'
|
||||||
|
implementation 'com.github.nirhart:ParallaxScroll:dd53d1f9d1'
|
||||||
|
implementation 'com.nononsenseapps:filepicker:4.2.1'
|
||||||
|
|
||||||
|
implementation "com.google.android.exoplayer:exoplayer:$exoPlayerLibVersion"
|
||||||
|
implementation "com.google.android.exoplayer:extension-mediasession:$exoPlayerLibVersion"
|
||||||
|
|
||||||
|
debugImplementation "com.facebook.stetho:stetho:$stethoLibVersion"
|
||||||
|
debugImplementation "com.facebook.stetho:stetho-urlconnection:$stethoLibVersion"
|
||||||
|
debugImplementation 'com.android.support:multidex:1.0.3'
|
||||||
|
|
||||||
|
implementation 'io.reactivex.rxjava2:rxjava:2.1.14'
|
||||||
|
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
|
||||||
|
implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1'
|
||||||
|
|
||||||
|
implementation "android.arch.persistence.room:runtime:$roomDbLibVersion"
|
||||||
|
implementation "android.arch.persistence.room:rxjava2:$roomDbLibVersion"
|
||||||
|
annotationProcessor "android.arch.persistence.room:compiler:$roomDbLibVersion"
|
||||||
|
|
||||||
|
implementation "frankiesardo:icepick:$icepickLibVersion"
|
||||||
|
annotationProcessor "frankiesardo:icepick-processor:$icepickLibVersion"
|
||||||
|
|
||||||
|
debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakCanaryLibVersion"
|
||||||
|
releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:$leakCanaryLibVersion"
|
||||||
|
|
||||||
|
|
||||||
testCompile 'junit:junit:4.12'
|
implementation "com.squareup.okhttp3:okhttp:$okHttpLibVersion"
|
||||||
testCompile 'org.mockito:mockito-core:1.10.19'
|
debugImplementation "com.facebook.stetho:stetho-okhttp3:$stethoLibVersion"
|
||||||
|
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
|
||||||
compile 'com.android.support:appcompat-v7:26.0.1'
|
implementation 'com.android.support:cardview-v7:27.1.1'
|
||||||
compile 'com.android.support:support-v4:26.0.1'
|
|
||||||
compile 'com.android.support:design:26.0.1'
|
|
||||||
compile 'com.android.support:recyclerview-v7:26.0.1'
|
|
||||||
compile 'com.android.support:preference-v14:26.0.1'
|
|
||||||
|
|
||||||
compile 'com.google.code.gson:gson:2.7'
|
|
||||||
compile 'ch.acra:acra:4.9.0'
|
|
||||||
|
|
||||||
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
|
|
||||||
compile 'de.hdodenhof:circleimageview:2.1.0'
|
|
||||||
compile 'com.github.nirhart:parallaxscroll:1.0'
|
|
||||||
compile 'com.nononsenseapps:filepicker:3.0.1'
|
|
||||||
compile 'com.google.android.exoplayer:exoplayer:r2.5.1'
|
|
||||||
|
|
||||||
debugCompile 'com.facebook.stetho:stetho:1.5.0'
|
|
||||||
debugCompile 'com.facebook.stetho:stetho-urlconnection:1.5.0'
|
|
||||||
debugCompile 'com.android.support:multidex:1.0.1'
|
|
||||||
|
|
||||||
compile 'io.reactivex.rxjava2:rxjava:2.1.2'
|
|
||||||
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
|
|
||||||
compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
|
|
||||||
|
|
||||||
compile 'android.arch.persistence.room:runtime:1.0.0-alpha8'
|
|
||||||
compile 'android.arch.persistence.room:rxjava2:1.0.0-alpha8'
|
|
||||||
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0-alpha8'
|
|
||||||
|
|
||||||
compile 'frankiesardo:icepick:3.2.0'
|
|
||||||
provided 'frankiesardo:icepick-processor:3.2.0'
|
|
||||||
}
|
}
|
||||||
|
13
app/proguard-rules.pro
vendored
13
app/proguard-rules.pro
vendored
@@ -35,3 +35,16 @@
|
|||||||
@icepick.* <fields>;
|
@icepick.* <fields>;
|
||||||
}
|
}
|
||||||
-keepnames class * { @icepick.State *;}
|
-keepnames class * { @icepick.State *;}
|
||||||
|
|
||||||
|
# Rules for OkHttp. Copy paste from https://github.com/square/okhttp
|
||||||
|
-dontwarn okhttp3.**
|
||||||
|
-dontwarn okio.**
|
||||||
|
-dontwarn javax.annotation.**
|
||||||
|
# A resource is loaded with a relative path so the package of this class must be preserved.
|
||||||
|
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
|
||||||
|
-keepclassmembers class * implements java.io.Serializable {
|
||||||
|
static final long serialVersionUID;
|
||||||
|
!static !transient <fields>;
|
||||||
|
private void writeObject(java.io.ObjectOutputStream);
|
||||||
|
private void readObject(java.io.ObjectInputStream);
|
||||||
|
}
|
||||||
|
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
|
||||||
|
|
||||||
<application
|
|
||||||
android:label="NewPipe Beta"
|
|
||||||
tools:replace="android:label">
|
|
||||||
</application>
|
|
||||||
|
|
||||||
</manifest>
|
|
Binary file not shown.
Before Width: | Height: | Size: 5.8 KiB |
Binary file not shown.
Before Width: | Height: | Size: 3.0 KiB |
Binary file not shown.
Before Width: | Height: | Size: 8.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 13 KiB |
Binary file not shown.
Before Width: | Height: | Size: 19 KiB |
@@ -1,9 +1,26 @@
|
|||||||
package org.schabi.newpipe;
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
import android.support.multidex.MultiDex;
|
import android.support.multidex.MultiDex;
|
||||||
|
|
||||||
import com.facebook.stetho.Stetho;
|
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;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
|
||||||
public class DebugApp extends App {
|
public class DebugApp extends App {
|
||||||
private static final String TAG = DebugApp.class.toString();
|
private static final String TAG = DebugApp.class.toString();
|
||||||
@@ -17,10 +34,15 @@ public class DebugApp extends App {
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
|
|
||||||
initStetho();
|
initStetho();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Downloader getDownloader() {
|
||||||
|
return org.schabi.newpipe.Downloader.init(new OkHttpClient.Builder()
|
||||||
|
.addNetworkInterceptor(new StethoInterceptor()));
|
||||||
|
}
|
||||||
|
|
||||||
private void initStetho() {
|
private void initStetho() {
|
||||||
// Create an InitializerBuilder
|
// Create an InitializerBuilder
|
||||||
Stetho.InitializerBuilder initializerBuilder =
|
Stetho.InitializerBuilder initializerBuilder =
|
||||||
@@ -42,4 +64,41 @@ public class DebugApp extends App {
|
|||||||
// Initialize Stetho with the Initializer
|
// Initialize Stetho with the Initializer
|
||||||
Stetho.initialize(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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:logo="@mipmap/ic_launcher"
|
android:logo="@mipmap/ic_launcher"
|
||||||
android:theme="@style/DarkTheme"
|
android:theme="@style/OpeningTheme"
|
||||||
tools:ignore="AllowBackup">
|
tools:ignore="AllowBackup">
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
@@ -28,15 +28,35 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<receiver android:name="android.support.v4.media.session.MediaButtonReceiver" >
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MEDIA_BUTTON" />
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".player.old.PlayVideoActivity"
|
android:name=".player.old.PlayVideoActivity"
|
||||||
android:configChanges="orientation|keyboardHidden|screenSize"
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
android:theme="@style/VideoPlayerTheme"
|
android:theme="@style/OldVideoPlayerTheme"
|
||||||
tools:ignore="UnusedAttribute"/>
|
tools:ignore="UnusedAttribute"/>
|
||||||
|
|
||||||
<service
|
<service
|
||||||
android:name=".player.BackgroundPlayer"
|
android:name=".player.BackgroundPlayer"
|
||||||
android:exported="false"/>
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MEDIA_BUTTON" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".player.BackgroundPlayerActivity"
|
||||||
|
android:launchMode="singleTask"
|
||||||
|
android:label="@string/title_activity_background_player"/>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".player.PopupVideoPlayerActivity"
|
||||||
|
android:launchMode="singleTask"
|
||||||
|
android:label="@string/title_activity_popup_player"/>
|
||||||
|
|
||||||
<service
|
<service
|
||||||
android:name=".player.PopupVideoPlayer"
|
android:name=".player.PopupVideoPlayer"
|
||||||
@@ -46,8 +66,7 @@
|
|||||||
android:name=".player.MainVideoPlayer"
|
android:name=".player.MainVideoPlayer"
|
||||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
|
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"/>
|
||||||
android:theme="@style/PlayerTheme"/>
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".settings.SettingsActivity"
|
android:name=".settings.SettingsActivity"
|
||||||
@@ -57,9 +76,8 @@
|
|||||||
android:name=".about.AboutActivity"
|
android:name=".about.AboutActivity"
|
||||||
android:label="@string/title_activity_about"/>
|
android:label="@string/title_activity_about"/>
|
||||||
|
|
||||||
<activity
|
<service android:name=".local.subscription.services.SubscriptionsImportService"/>
|
||||||
android:name=".history.HistoryActivity"
|
<service android:name=".local.subscription.services.SubscriptionsExportService"/>
|
||||||
android:label="@string/title_activity_history"/>
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".PanicResponderActivity"
|
android:name=".PanicResponderActivity"
|
||||||
@@ -100,6 +118,7 @@
|
|||||||
<activity
|
<activity
|
||||||
android:name=".ReCaptchaActivity"
|
android:name=".ReCaptchaActivity"
|
||||||
android:label="@string/reCaptchaActivity"/>
|
android:label="@string/reCaptchaActivity"/>
|
||||||
|
<activity android:name=".download.ExtSDDownloadFailedActivity" />
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="android.support.v4.content.FileProvider"
|
android:name="android.support.v4.content.FileProvider"
|
||||||
@@ -108,13 +127,17 @@
|
|||||||
android:grantUriPermissions="true">
|
android:grantUriPermissions="true">
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||||
android:resource="@xml/provider_paths"/>
|
android:resource="@xml/nnf_provider_paths"/>
|
||||||
</provider>
|
</provider>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".RouterActivity"
|
android:name=".RouterActivity"
|
||||||
|
android:excludeFromRecents="true"
|
||||||
|
android:label="@string/preferred_open_action_share_menu_title"
|
||||||
android:taskAffinity=""
|
android:taskAffinity=""
|
||||||
android:theme="@android:style/Theme.NoDisplay">
|
android:theme="@style/RouterActivityThemeDark">
|
||||||
|
|
||||||
|
<!-- Youtube filter -->
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
||||||
@@ -163,19 +186,8 @@
|
|||||||
<data android:scheme="vnd.youtube"/>
|
<data android:scheme="vnd.youtube"/>
|
||||||
<data android:scheme="vnd.youtube.launch"/>
|
<data android:scheme="vnd.youtube.launch"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.SEND"/>
|
|
||||||
|
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
<!-- Hooktube filter -->
|
||||||
|
|
||||||
<data android:mimeType="text/plain"/>
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
<activity
|
|
||||||
android:name=".RouterPopupActivity"
|
|
||||||
android:label="@string/popup_mode_share_menu_title"
|
|
||||||
android:taskAffinity=""
|
|
||||||
android:theme="@android:style/Theme.NoDisplay">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
||||||
@@ -186,15 +198,18 @@
|
|||||||
|
|
||||||
<data android:scheme="http"/>
|
<data android:scheme="http"/>
|
||||||
<data android:scheme="https"/>
|
<data android:scheme="https"/>
|
||||||
<data android:host="youtube.com"/>
|
<data android:host="hooktube.com"/>
|
||||||
<data android:host="m.youtube.com"/>
|
<data android:host="*.hooktube.com"/>
|
||||||
<data android:host="www.youtube.com"/>
|
|
||||||
<!-- video prefix -->
|
<!-- video prefix -->
|
||||||
<data android:pathPrefix="/v/"/>
|
<data android:pathPrefix="/v/"/>
|
||||||
<data android:pathPrefix="/embed/"/>
|
<data android:pathPrefix="/embed/"/>
|
||||||
<data android:pathPrefix="/watch"/>
|
<data android:pathPrefix="/watch"/>
|
||||||
<data android:pathPrefix="/attribution_link"/>
|
<!-- channel prefix -->
|
||||||
|
<data android:pathPrefix="/channel/"/>
|
||||||
|
<data android:pathPrefix="/user/"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
|
<!-- Soundcloud filter -->
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
||||||
@@ -205,25 +220,22 @@
|
|||||||
|
|
||||||
<data android:scheme="http"/>
|
<data android:scheme="http"/>
|
||||||
<data android:scheme="https"/>
|
<data android:scheme="https"/>
|
||||||
<data android:host="youtu.be"/>
|
<data android:host="soundcloud.com"/>
|
||||||
|
<data android:host="m.soundcloud.com"/>
|
||||||
|
<data android:host="www.soundcloud.com"/>
|
||||||
<data android:pathPrefix="/"/>
|
<data android:pathPrefix="/"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
|
||||||
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
|
||||||
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
|
|
||||||
|
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
<!-- Share filter -->
|
||||||
<category android:name="android.intent.category.BROWSABLE"/>
|
|
||||||
|
|
||||||
<data android:scheme="vnd.youtube"/>
|
|
||||||
<data android:scheme="vnd.youtube.launch"/>
|
|
||||||
</intent-filter>
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.SEND"/>
|
<action android:name="android.intent.action.SEND"/>
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
<data android:mimeType="text/plain"/>
|
<data android:mimeType="text/plain"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".RouterActivity$FetcherService"
|
||||||
|
android:exported="false"/>
|
||||||
</application>
|
</application>
|
||||||
</manifest>
|
</manifest>
|
@@ -15,9 +15,9 @@ Version 2, June 1991
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.<br/>
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA<br/>
|
||||||
|
<br/>
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
</pre>
|
</pre>
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
<title>Mozilla Public License, version 2.0</title>
|
<title>Mozilla Public License, version 2.0</title>
|
||||||
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1 id="mozilla-public-license-version-2.0">Mozilla Public License<br>Version 2.0</h1>
|
<h1 id="mozilla-public-license-version-2.0">Mozilla Public License<br>Version 2.0</h1>
|
||||||
<h2 id="definitions">1. Definitions</h2>
|
<h2 id="definitions">1. Definitions</h2>
|
||||||
|
@@ -5,16 +5,21 @@ import android.app.NotificationChannel;
|
|||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.nostra13.universalimageloader.cache.memory.impl.LRULimitedMemoryCache;
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
import com.nostra13.universalimageloader.core.ImageLoader;
|
||||||
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
|
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
|
||||||
|
import com.squareup.leakcanary.LeakCanary;
|
||||||
|
import com.squareup.leakcanary.RefWatcher;
|
||||||
|
|
||||||
import org.acra.ACRA;
|
import org.acra.ACRA;
|
||||||
import org.acra.config.ACRAConfiguration;
|
import org.acra.config.ACRAConfiguration;
|
||||||
import org.acra.config.ACRAConfigurationException;
|
import org.acra.config.ACRAConfigurationException;
|
||||||
import org.acra.config.ConfigurationBuilder;
|
import org.acra.config.ConfigurationBuilder;
|
||||||
import org.acra.sender.ReportSenderFactory;
|
import org.acra.sender.ReportSenderFactory;
|
||||||
|
import org.schabi.newpipe.extractor.Downloader;
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.report.AcraReportSenderFactory;
|
import org.schabi.newpipe.report.AcraReportSenderFactory;
|
||||||
import org.schabi.newpipe.report.ErrorActivity;
|
import org.schabi.newpipe.report.ErrorActivity;
|
||||||
@@ -26,9 +31,13 @@ import org.schabi.newpipe.util.StateSaver;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InterruptedIOException;
|
import java.io.InterruptedIOException;
|
||||||
import java.net.SocketException;
|
import java.net.SocketException;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import io.reactivex.annotations.NonNull;
|
import io.reactivex.annotations.NonNull;
|
||||||
import io.reactivex.exceptions.CompositeException;
|
import io.reactivex.exceptions.CompositeException;
|
||||||
|
import io.reactivex.exceptions.MissingBackpressureException;
|
||||||
|
import io.reactivex.exceptions.OnErrorNotImplementedException;
|
||||||
import io.reactivex.exceptions.UndeliverableException;
|
import io.reactivex.exceptions.UndeliverableException;
|
||||||
import io.reactivex.functions.Consumer;
|
import io.reactivex.functions.Consumer;
|
||||||
import io.reactivex.plugins.RxJavaPlugins;
|
import io.reactivex.plugins.RxJavaPlugins;
|
||||||
@@ -53,6 +62,7 @@ import io.reactivex.plugins.RxJavaPlugins;
|
|||||||
|
|
||||||
public class App extends Application {
|
public class App extends Application {
|
||||||
protected static final String TAG = App.class.toString();
|
protected static final String TAG = App.class.toString();
|
||||||
|
private RefWatcher refWatcher;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private static final Class<? extends ReportSenderFactory>[] reportSenderFactoryClasses = new Class[]{AcraReportSenderFactory.class};
|
private static final Class<? extends ReportSenderFactory>[] reportSenderFactoryClasses = new Class[]{AcraReportSenderFactory.class};
|
||||||
@@ -68,54 +78,98 @@ public class App extends Application {
|
|||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
|
|
||||||
|
if (LeakCanary.isInAnalyzerProcess(this)) {
|
||||||
|
// This process is dedicated to LeakCanary for heap analysis.
|
||||||
|
// You should not init your app in this process.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
refWatcher = installLeakCanary();
|
||||||
|
|
||||||
// Initialize settings first because others inits can use its values
|
// Initialize settings first because others inits can use its values
|
||||||
SettingsActivity.initSettings(this);
|
SettingsActivity.initSettings(this);
|
||||||
|
|
||||||
NewPipe.init(Downloader.getInstance());
|
NewPipe.init(getDownloader());
|
||||||
NewPipeDatabase.init(this);
|
|
||||||
StateSaver.init(this);
|
StateSaver.init(this);
|
||||||
initNotificationChannel();
|
initNotificationChannel();
|
||||||
|
|
||||||
// Initialize image loader
|
// Initialize image loader
|
||||||
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this).build();
|
ImageLoader.getInstance().init(getImageLoaderConfigurations(10, 50));
|
||||||
ImageLoader.getInstance().init(config);
|
|
||||||
|
|
||||||
configureRxJavaErrorHandler();
|
configureRxJavaErrorHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected Downloader getDownloader() {
|
||||||
|
return org.schabi.newpipe.Downloader.init(null);
|
||||||
|
}
|
||||||
|
|
||||||
private void configureRxJavaErrorHandler() {
|
private void configureRxJavaErrorHandler() {
|
||||||
// https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling
|
// https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling
|
||||||
RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() {
|
RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() {
|
||||||
@Override
|
@Override
|
||||||
public void accept(@NonNull Throwable throwable) throws Exception {
|
public void accept(@NonNull Throwable throwable) throws Exception {
|
||||||
Log.e(TAG, "RxJavaPlugins.ErrorHandler called with -> : throwable = [" + throwable.getClass().getName() + "]");
|
Log.e(TAG, "RxJavaPlugins.ErrorHandler called with -> : " +
|
||||||
|
"throwable = [" + throwable.getClass().getName() + "]");
|
||||||
|
|
||||||
if (throwable instanceof UndeliverableException) {
|
if (throwable instanceof UndeliverableException) {
|
||||||
// As UndeliverableException is a wrapper, get the cause of it to get the "real" exception
|
// As UndeliverableException is a wrapper, get the cause of it to get the "real" exception
|
||||||
throwable = throwable.getCause();
|
throwable = throwable.getCause();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final List<Throwable> errors;
|
||||||
if (throwable instanceof CompositeException) {
|
if (throwable instanceof CompositeException) {
|
||||||
for (Throwable element : ((CompositeException) throwable).getExceptions()) {
|
errors = ((CompositeException) throwable).getExceptions();
|
||||||
if (checkThrowable(element)) return;
|
} else {
|
||||||
|
errors = Collections.singletonList(throwable);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (final Throwable error : errors) {
|
||||||
|
if (isThrowableIgnored(error)) return;
|
||||||
|
if (isThrowableCritical(error)) {
|
||||||
|
reportException(error);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (checkThrowable(throwable)) return;
|
// Out-of-lifecycle exceptions should only be reported if a debug user wishes so,
|
||||||
|
// When exception is not reported, log it
|
||||||
|
if (isDisposedRxExceptionsReported()) {
|
||||||
|
reportException(throwable);
|
||||||
|
} else {
|
||||||
|
Log.e(TAG, "RxJavaPlugin: Undeliverable Exception received: ", throwable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isThrowableIgnored(@NonNull final Throwable throwable) {
|
||||||
|
// Don't crash the application over a simple network problem
|
||||||
|
return ExtractorHelper.hasAssignableCauseThrowable(throwable,
|
||||||
|
IOException.class, SocketException.class, // network api cancellation
|
||||||
|
InterruptedException.class, InterruptedIOException.class); // blocking code disposed
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isThrowableCritical(@NonNull final Throwable throwable) {
|
||||||
|
// Though these exceptions cannot be ignored
|
||||||
|
return ExtractorHelper.hasAssignableCauseThrowable(throwable,
|
||||||
|
NullPointerException.class, IllegalArgumentException.class, // bug in app
|
||||||
|
OnErrorNotImplementedException.class, MissingBackpressureException.class,
|
||||||
|
IllegalStateException.class); // bug in operator
|
||||||
|
}
|
||||||
|
|
||||||
|
private void reportException(@NonNull final Throwable throwable) {
|
||||||
// Throw uncaught exception that will trigger the report system
|
// Throw uncaught exception that will trigger the report system
|
||||||
Thread.currentThread().getUncaughtExceptionHandler()
|
Thread.currentThread().getUncaughtExceptionHandler()
|
||||||
.uncaughtException(Thread.currentThread(), throwable);
|
.uncaughtException(Thread.currentThread(), throwable);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkThrowable(@NonNull Throwable throwable) {
|
|
||||||
// Don't crash the application over a simple network problem
|
|
||||||
return ExtractorHelper.hasAssignableCauseThrowable(throwable,
|
|
||||||
IOException.class, SocketException.class, InterruptedException.class, InterruptedIOException.class);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ImageLoaderConfiguration getImageLoaderConfigurations(final int memoryCacheSizeMb,
|
||||||
|
final int diskCacheSizeMb) {
|
||||||
|
return new ImageLoaderConfiguration.Builder(this)
|
||||||
|
.memoryCache(new LRULimitedMemoryCache(memoryCacheSizeMb * 1024 * 1024))
|
||||||
|
.diskCacheSize(diskCacheSizeMb * 1024 * 1024)
|
||||||
|
.imageDownloader(new ImageDownloader(getApplicationContext()))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
private void initACRA() {
|
private void initACRA() {
|
||||||
try {
|
try {
|
||||||
@@ -149,4 +203,18 @@ public class App extends Application {
|
|||||||
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
mNotificationManager.createNotificationChannel(mChannel);
|
mNotificationManager.createNotificationChannel(mChannel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static RefWatcher getRefWatcher(Context context) {
|
||||||
|
final App application = (App) context.getApplicationContext();
|
||||||
|
return application.refWatcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RefWatcher installLeakCanary() {
|
||||||
|
return RefWatcher.DISABLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isDisposedRxExceptionsReported() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,20 +1,21 @@
|
|||||||
package org.schabi.newpipe;
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.TypedArray;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.AttrRes;
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
|
import android.support.v4.app.FragmentManager;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
import com.nostra13.universalimageloader.core.ImageLoader;
|
||||||
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
|
import com.squareup.leakcanary.RefWatcher;
|
||||||
|
|
||||||
|
import org.schabi.newpipe.report.UserAction;
|
||||||
|
|
||||||
import icepick.Icepick;
|
import icepick.Icepick;
|
||||||
|
import icepick.State;
|
||||||
|
|
||||||
public abstract class BaseFragment extends Fragment {
|
public abstract class BaseFragment extends Fragment {
|
||||||
protected final String TAG = getClass().getSimpleName() + "@" + Integer.toHexString(hashCode());
|
protected final String TAG = getClass().getSimpleName() + "@" + Integer.toHexString(hashCode());
|
||||||
@@ -23,6 +24,15 @@ public abstract class BaseFragment extends Fragment {
|
|||||||
protected AppCompatActivity activity;
|
protected AppCompatActivity activity;
|
||||||
public static final ImageLoader imageLoader = ImageLoader.getInstance();
|
public static final ImageLoader imageLoader = ImageLoader.getInstance();
|
||||||
|
|
||||||
|
//These values are used for controlling framgents when they are part of the frontpage
|
||||||
|
@State
|
||||||
|
protected boolean useAsFrontPage = false;
|
||||||
|
protected boolean mIsVisibleToUser = false;
|
||||||
|
|
||||||
|
public void useAsFrontPage(boolean value) {
|
||||||
|
useAsFrontPage = value;
|
||||||
|
}
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
// Fragment's Lifecycle
|
// Fragment's Lifecycle
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
@@ -67,6 +77,20 @@ public abstract class BaseFragment extends Fragment {
|
|||||||
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
|
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
|
||||||
|
RefWatcher refWatcher = App.getRefWatcher(getActivity());
|
||||||
|
if (refWatcher != null) refWatcher.watch(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUserVisibleHint(boolean isVisibleToUser) {
|
||||||
|
super.setUserVisibleHint(isVisibleToUser);
|
||||||
|
mIsVisibleToUser = isVisibleToUser;
|
||||||
|
}
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
// Init
|
// Init
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
@@ -81,41 +105,17 @@ public abstract class BaseFragment extends Fragment {
|
|||||||
// Utils
|
// Utils
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
protected final int resolveResourceIdFromAttr(@AttrRes int attr) {
|
public void setTitle(String title) {
|
||||||
TypedArray a = activity.getTheme().obtainStyledAttributes(new int[]{attr});
|
if (DEBUG) Log.d(TAG, "setTitle() called with: title = [" + title + "]");
|
||||||
int attributeResourceId = a.getResourceId(0, 0);
|
if((!useAsFrontPage || mIsVisibleToUser)
|
||||||
a.recycle();
|
&& (activity != null && activity.getSupportActionBar() != null)) {
|
||||||
return attributeResourceId;
|
activity.getSupportActionBar().setTitle(title);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
protected FragmentManager getFM() {
|
||||||
// DisplayImageOptions default configurations
|
return getParentFragment() == null
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
? getFragmentManager()
|
||||||
|
: getParentFragment().getFragmentManager();
|
||||||
public static final DisplayImageOptions BASE_OPTIONS =
|
}
|
||||||
new DisplayImageOptions.Builder().cacheInMemory(true).build();
|
|
||||||
|
|
||||||
public static final DisplayImageOptions DISPLAY_AVATAR_OPTIONS =
|
|
||||||
new DisplayImageOptions.Builder()
|
|
||||||
.cloneFrom(BASE_OPTIONS)
|
|
||||||
.showImageOnLoading(R.drawable.buddy)
|
|
||||||
.showImageForEmptyUri(R.drawable.buddy)
|
|
||||||
.showImageOnFail(R.drawable.buddy)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
public static final DisplayImageOptions DISPLAY_THUMBNAIL_OPTIONS =
|
|
||||||
new DisplayImageOptions.Builder()
|
|
||||||
.cloneFrom(BASE_OPTIONS)
|
|
||||||
.displayer(new FadeInBitmapDisplayer(250))
|
|
||||||
.showImageForEmptyUri(R.drawable.dummy_thumbnail)
|
|
||||||
.showImageOnFail(R.drawable.dummy_thumbnail)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
public static final DisplayImageOptions DISPLAY_BANNER_OPTIONS =
|
|
||||||
new DisplayImageOptions.Builder()
|
|
||||||
.cloneFrom(BASE_OPTIONS)
|
|
||||||
.showImageOnLoading(R.drawable.channel_banner)
|
|
||||||
.showImageForEmptyUri(R.drawable.channel_banner)
|
|
||||||
.showImageOnFail(R.drawable.channel_banner)
|
|
||||||
.build();
|
|
||||||
}
|
}
|
||||||
|
@@ -1,20 +1,21 @@
|
|||||||
package org.schabi.newpipe;
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
import android.util.Log;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
|
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
|
||||||
import org.schabi.newpipe.util.ExtractorHelper;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStream;
|
||||||
import java.io.InterruptedIOException;
|
import java.util.Collections;
|
||||||
import java.net.URL;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import javax.net.ssl.HttpsURLConnection;
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.Request;
|
||||||
|
import okhttp3.Response;
|
||||||
|
import okhttp3.ResponseBody;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -38,32 +39,63 @@ import javax.net.ssl.HttpsURLConnection;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public class Downloader implements org.schabi.newpipe.extractor.Downloader {
|
public class Downloader implements org.schabi.newpipe.extractor.Downloader {
|
||||||
|
|
||||||
public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0";
|
public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0";
|
||||||
private static String mCookies = "";
|
|
||||||
|
|
||||||
private static Downloader instance = null;
|
private static Downloader instance;
|
||||||
|
private String mCookies;
|
||||||
|
private OkHttpClient client;
|
||||||
|
|
||||||
private Downloader() {
|
private Downloader(OkHttpClient.Builder builder) {
|
||||||
|
this.client = builder
|
||||||
|
.readTimeout(30, TimeUnit.SECONDS)
|
||||||
|
//.cache(new Cache(new File(context.getExternalCacheDir(), "okhttp"), 16 * 1024 * 1024))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* It's recommended to call exactly once in the entire lifetime of the application.
|
||||||
|
*
|
||||||
|
* @param builder if null, default builder will be used
|
||||||
|
*/
|
||||||
|
public static Downloader init(@Nullable OkHttpClient.Builder builder) {
|
||||||
|
return instance = new Downloader(builder != null ? builder : new OkHttpClient.Builder());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Downloader getInstance() {
|
public static Downloader getInstance() {
|
||||||
if (instance == null) {
|
|
||||||
synchronized (Downloader.class) {
|
|
||||||
if (instance == null) {
|
|
||||||
instance = new Downloader();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static synchronized void setCookies(String cookies) {
|
public String getCookies() {
|
||||||
Downloader.mCookies = cookies;
|
return mCookies;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static synchronized String getCookies() {
|
public void setCookies(String cookies) {
|
||||||
return Downloader.mCookies;
|
mCookies = cookies;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the size of the content that the url is pointing by firing a HEAD request.
|
||||||
|
*
|
||||||
|
* @param url an url pointing to the content
|
||||||
|
* @return the size of the content, in bytes
|
||||||
|
*/
|
||||||
|
public long getContentLength(String url) throws IOException {
|
||||||
|
Response response = null;
|
||||||
|
try {
|
||||||
|
final Request request = new Request.Builder()
|
||||||
|
.head().url(url)
|
||||||
|
.addHeader("User-Agent", USER_AGENT)
|
||||||
|
.build();
|
||||||
|
response = client.newCall(request).execute();
|
||||||
|
|
||||||
|
return Long.parseLong(response.header("Content-Length"));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new IOException("Invalid content length", e);
|
||||||
|
} finally {
|
||||||
|
if (response != null) {
|
||||||
|
response.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -92,14 +124,44 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String download(String siteUrl, Map<String, String> customProperties) throws IOException, ReCaptchaException {
|
public String download(String siteUrl, Map<String, String> customProperties) throws IOException, ReCaptchaException {
|
||||||
URL url = new URL(siteUrl);
|
return getBody(siteUrl, customProperties).string();
|
||||||
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
|
}
|
||||||
Iterator it = customProperties.entrySet().iterator();
|
|
||||||
while (it.hasNext()) {
|
public InputStream stream(String siteUrl) throws IOException {
|
||||||
Map.Entry pair = (Map.Entry) it.next();
|
try {
|
||||||
con.setRequestProperty((String) pair.getKey(), (String) pair.getValue());
|
return getBody(siteUrl, Collections.emptyMap()).byteStream();
|
||||||
|
} catch (ReCaptchaException e) {
|
||||||
|
throw new IOException(e.getMessage(), e.getCause());
|
||||||
}
|
}
|
||||||
return dl(con);
|
}
|
||||||
|
|
||||||
|
private ResponseBody getBody(String siteUrl, Map<String, String> customProperties) throws IOException, ReCaptchaException {
|
||||||
|
final Request.Builder requestBuilder = new Request.Builder()
|
||||||
|
.method("GET", null).url(siteUrl)
|
||||||
|
.addHeader("User-Agent", USER_AGENT);
|
||||||
|
|
||||||
|
for (Map.Entry<String, String> header : customProperties.entrySet()) {
|
||||||
|
requestBuilder.addHeader(header.getKey(), header.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!TextUtils.isEmpty(mCookies)) {
|
||||||
|
requestBuilder.addHeader("Cookie", mCookies);
|
||||||
|
}
|
||||||
|
|
||||||
|
final Request request = requestBuilder.build();
|
||||||
|
final Response response = client.newCall(request).execute();
|
||||||
|
final ResponseBody body = response.body();
|
||||||
|
|
||||||
|
if (response.code() == 429) {
|
||||||
|
throw new ReCaptchaException("reCaptcha Challenge requested");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (body == null) {
|
||||||
|
response.close();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return body;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -111,57 +173,6 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String download(String siteUrl) throws IOException, ReCaptchaException {
|
public String download(String siteUrl) throws IOException, ReCaptchaException {
|
||||||
URL url = new URL(siteUrl);
|
return download(siteUrl, Collections.emptyMap());
|
||||||
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
|
|
||||||
//HttpsURLConnection con = NetCipher.getHttpsURLConnection(url);
|
|
||||||
return dl(con);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Common functionality between download(String url) and download(String url, String language)
|
|
||||||
*/
|
|
||||||
private static String dl(HttpsURLConnection con) throws IOException, ReCaptchaException {
|
|
||||||
StringBuilder response = new StringBuilder();
|
|
||||||
BufferedReader in = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
con.setReadTimeout(30 * 1000);// 30s
|
|
||||||
con.setRequestMethod("GET");
|
|
||||||
con.setRequestProperty("User-Agent", USER_AGENT);
|
|
||||||
|
|
||||||
if (getCookies().length() > 0) {
|
|
||||||
con.setRequestProperty("Cookie", getCookies());
|
|
||||||
}
|
|
||||||
|
|
||||||
in = new BufferedReader(new InputStreamReader(con.getInputStream()));
|
|
||||||
|
|
||||||
String inputLine;
|
|
||||||
while ((inputLine = in.readLine()) != null) {
|
|
||||||
response.append(inputLine);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
Log.e("Downloader", "dl() ----- Exception thrown → " + e.getClass().getName());
|
|
||||||
|
|
||||||
if (ExtractorHelper.isInterruptedCaused(e)) {
|
|
||||||
throw new InterruptedIOException(e.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* HTTP 429 == Too Many Request
|
|
||||||
* Receive from Youtube.com = ReCaptcha challenge request
|
|
||||||
* See : https://github.com/rg3/youtube-dl/issues/5138
|
|
||||||
*/
|
|
||||||
if (con.getResponseCode() == 429) {
|
|
||||||
throw new ReCaptchaException("reCaptcha Challenge requested");
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new IOException(con.getResponseCode() + " " + con.getResponseMessage(), e);
|
|
||||||
} finally {
|
|
||||||
if (in != null) {
|
|
||||||
in.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return response.toString();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
46
app/src/main/java/org/schabi/newpipe/ImageDownloader.java
Normal file
46
app/src/main/java/org/schabi/newpipe/ImageDownloader.java
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
|
||||||
|
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
|
||||||
|
|
||||||
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
public class ImageDownloader extends BaseImageDownloader {
|
||||||
|
private final Resources resources;
|
||||||
|
private final SharedPreferences preferences;
|
||||||
|
private final String downloadThumbnailKey;
|
||||||
|
|
||||||
|
public ImageDownloader(Context context) {
|
||||||
|
super(context);
|
||||||
|
this.resources = context.getResources();
|
||||||
|
this.preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
this.downloadThumbnailKey = context.getString(R.string.download_thumbnail_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isDownloadingThumbnail() {
|
||||||
|
return preferences.getBoolean(downloadThumbnailKey, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("ResourceType")
|
||||||
|
@Override
|
||||||
|
public InputStream getStream(String imageUri, Object extra) throws IOException {
|
||||||
|
if (isDownloadingThumbnail()) {
|
||||||
|
return super.getStream(imageUri, extra);
|
||||||
|
} else {
|
||||||
|
return resources.openRawResource(R.drawable.dummy_thumbnail_dark);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException {
|
||||||
|
final Downloader downloader = (Downloader) NewPipe.getDownloader();
|
||||||
|
return downloader.stream(imageUri);
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@@ -7,25 +7,36 @@ import android.support.annotation.NonNull;
|
|||||||
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;
|
||||||
|
|
||||||
public final class NewPipeDatabase {
|
public final class NewPipeDatabase {
|
||||||
|
|
||||||
private static AppDatabase databaseInstance;
|
private static volatile AppDatabase databaseInstance;
|
||||||
|
|
||||||
private NewPipeDatabase() {
|
private NewPipeDatabase() {
|
||||||
//no instance
|
//no instance
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void init(Context context) {
|
private static AppDatabase getDatabase(Context context) {
|
||||||
databaseInstance = Room.databaseBuilder(context.getApplicationContext(),
|
return Room
|
||||||
AppDatabase.class, DATABASE_NAME
|
.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME)
|
||||||
).build();
|
.addMigrations(MIGRATION_11_12)
|
||||||
|
.fallbackToDestructiveMigration()
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public static AppDatabase getInstance() {
|
public static AppDatabase getInstance(@NonNull Context context) {
|
||||||
if (databaseInstance == null) throw new RuntimeException("Database not initialized");
|
AppDatabase result = databaseInstance;
|
||||||
|
if (result == null) {
|
||||||
|
synchronized (NewPipeDatabase.class) {
|
||||||
|
result = databaseInstance;
|
||||||
|
if (result == null) {
|
||||||
|
databaseInstance = (result = getDatabase(context));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return databaseInstance;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -107,7 +107,7 @@ public class ReCaptchaActivity extends AppCompatActivity {
|
|||||||
// find cookies : s_gl & goojf and Add cookies to Downloader
|
// find cookies : s_gl & goojf and Add cookies to Downloader
|
||||||
if (find_access_cookies(cookies)) {
|
if (find_access_cookies(cookies)) {
|
||||||
// Give cookies to Downloader class
|
// Give cookies to Downloader class
|
||||||
Downloader.setCookies(mCookies);
|
Downloader.getInstance().setCookies(mCookies);
|
||||||
|
|
||||||
// Closing activity and return to parent
|
// Closing activity and return to parent
|
||||||
setResult(RESULT_OK);
|
setResult(RESULT_OK);
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,49 +0,0 @@
|
|||||||
package org.schabi.newpipe;
|
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
|
||||||
import org.schabi.newpipe.extractor.StreamingService;
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
|
||||||
import org.schabi.newpipe.player.PopupVideoPlayer;
|
|
||||||
import org.schabi.newpipe.util.Constants;
|
|
||||||
import org.schabi.newpipe.util.PermissionHelper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the url from the intent and open a popup player
|
|
||||||
*/
|
|
||||||
public class RouterPopupActivity extends RouterActivity {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void handleUrl(String url) {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
|
|
||||||
&& !PermissionHelper.checkSystemAlertWindowPermission(this)) {
|
|
||||||
Toast.makeText(this, R.string.msg_popup_permission, Toast.LENGTH_LONG).show();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
StreamingService service;
|
|
||||||
try {
|
|
||||||
service = NewPipe.getServiceByUrl(url);
|
|
||||||
} catch (ExtractionException e) {
|
|
||||||
Toast.makeText(this, R.string.url_not_supported_toast, Toast.LENGTH_LONG).show();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Intent callIntent = new Intent(this, PopupVideoPlayer.class);
|
|
||||||
switch (service.getLinkTypeByUrl(url)) {
|
|
||||||
case STREAM:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Toast.makeText(this, R.string.url_not_supported_toast, Toast.LENGTH_LONG).show();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
callIntent.putExtra(Constants.KEY_URL, url);
|
|
||||||
callIntent.putExtra(Constants.KEY_SERVICE_ID, service.getServiceId());
|
|
||||||
startService(callIntent);
|
|
||||||
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -32,7 +32,6 @@ public class AboutActivity extends AppCompatActivity {
|
|||||||
new SoftwareComponent("Giga Get", "2014", "Peter Cai", "https://github.com/PaperAirplane-Dev-Team/GigaGet", StandardLicenses.GPL2),
|
new SoftwareComponent("Giga Get", "2014", "Peter Cai", "https://github.com/PaperAirplane-Dev-Team/GigaGet", StandardLicenses.GPL2),
|
||||||
new SoftwareComponent("NewPipe Extractor", "2017", "Christian Schabesberger", "https://github.com/TeamNewPipe/NewPipeExtractor", StandardLicenses.GPL3),
|
new SoftwareComponent("NewPipe Extractor", "2017", "Christian Schabesberger", "https://github.com/TeamNewPipe/NewPipeExtractor", StandardLicenses.GPL3),
|
||||||
new SoftwareComponent("Jsoup", "2017", "Jonathan Hedley", "https://github.com/jhy/jsoup", StandardLicenses.MIT),
|
new SoftwareComponent("Jsoup", "2017", "Jonathan Hedley", "https://github.com/jhy/jsoup", StandardLicenses.MIT),
|
||||||
new SoftwareComponent("Google Gson", "2008", "Google Inc", "https://github.com/google/gson", StandardLicenses.APACHE2),
|
|
||||||
new SoftwareComponent("Rhino", "2015", "Mozilla", "https://www.mozilla.org/rhino/", StandardLicenses.MPL2),
|
new SoftwareComponent("Rhino", "2015", "Mozilla", "https://www.mozilla.org/rhino/", StandardLicenses.MPL2),
|
||||||
new SoftwareComponent("ACRA", "2013", "Kevin Gaudin", "http://www.acra.ch", StandardLicenses.APACHE2),
|
new SoftwareComponent("ACRA", "2013", "Kevin Gaudin", "http://www.acra.ch", StandardLicenses.APACHE2),
|
||||||
new SoftwareComponent("Universal Image Loader", "2011 - 2015", "Sergey Tarasevich", "https://github.com/nostra13/Android-Universal-Image-Loader", StandardLicenses.APACHE2),
|
new SoftwareComponent("Universal Image Loader", "2011 - 2015", "Sergey Tarasevich", "https://github.com/nostra13/Android-Universal-Image-Loader", StandardLicenses.APACHE2),
|
||||||
@@ -129,32 +128,31 @@ public class AboutActivity extends AppCompatActivity {
|
|||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
View rootView = inflater.inflate(R.layout.fragment_about, container, false);
|
View rootView = inflater.inflate(R.layout.fragment_about, container, false);
|
||||||
|
Context context = this.getContext();
|
||||||
|
|
||||||
TextView version = rootView.findViewById(R.id.app_version);
|
TextView version = rootView.findViewById(R.id.app_version);
|
||||||
version.setText(BuildConfig.VERSION_NAME);
|
version.setText(BuildConfig.VERSION_NAME);
|
||||||
|
|
||||||
View githubLink = rootView.findViewById(R.id.github_link);
|
View githubLink = rootView.findViewById(R.id.github_link);
|
||||||
githubLink.setOnClickListener(new OnGithubLinkClickListener());
|
githubLink.setOnClickListener(nv -> openWebsite(context.getString(R.string.github_url), context));
|
||||||
|
|
||||||
|
View donationLink = rootView.findViewById(R.id.donation_link);
|
||||||
|
donationLink.setOnClickListener(v -> openWebsite(context.getString(R.string.donation_url), context));
|
||||||
|
|
||||||
|
View websiteLink = rootView.findViewById(R.id.website_link);
|
||||||
|
websiteLink.setOnClickListener(nv -> openWebsite(context.getString(R.string.website_url), context));
|
||||||
|
|
||||||
|
View privacyPolicyLink = rootView.findViewById(R.id.privacy_policy_link);
|
||||||
|
privacyPolicyLink.setOnClickListener(v -> openWebsite(context.getString(R.string.privacy_policy_url), context));
|
||||||
|
|
||||||
View licenseLink = rootView.findViewById(R.id.app_read_license);
|
|
||||||
licenseLink.setOnClickListener(new OnReadFullLicenseClickListener());
|
|
||||||
return rootView;
|
return rootView;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class OnGithubLinkClickListener implements View.OnClickListener {
|
private void openWebsite(String url, Context context) {
|
||||||
@Override
|
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
|
||||||
public void onClick(final View view) {
|
context.startActivity(intent);
|
||||||
final Context context = view.getContext();
|
|
||||||
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(context.getString(R.string.github_url)));
|
|
||||||
context.startActivity(intent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class OnReadFullLicenseClickListener implements View.OnClickListener {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
LicenseFragment.showLicense(v.getContext(), StandardLicenses.GPL3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -50,6 +50,10 @@ public class License implements Parcelable {
|
|||||||
public String getAbbreviation() {
|
public String getAbbreviation() {
|
||||||
return abbreviation;
|
return abbreviation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getFilename() {
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int describeContents() {
|
public int describeContents() {
|
||||||
|
@@ -1,22 +1,14 @@
|
|||||||
package org.schabi.newpipe.about;
|
package org.schabi.newpipe.about;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v7.app.AlertDialog;
|
import android.view.*;
|
||||||
import android.view.ContextMenu;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.webkit.WebView;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -48,25 +40,7 @@ public class LicenseFragment extends Fragment {
|
|||||||
* @param license the license to show
|
* @param license the license to show
|
||||||
*/
|
*/
|
||||||
public static void showLicense(Context context, License license) {
|
public static void showLicense(Context context, License license) {
|
||||||
if(context == null) {
|
new LicenseFragmentHelper((Activity) context).execute(license);
|
||||||
throw new NullPointerException("context is null");
|
|
||||||
}
|
|
||||||
if(license == null) {
|
|
||||||
throw new NullPointerException("license is null");
|
|
||||||
}
|
|
||||||
AlertDialog.Builder alert = new AlertDialog.Builder(context);
|
|
||||||
alert.setTitle(license.getName());
|
|
||||||
|
|
||||||
WebView wv = new WebView(context);
|
|
||||||
wv.loadUrl(license.getContentUri().toString());
|
|
||||||
alert.setView(wv);
|
|
||||||
alert.setNegativeButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
dialog.dismiss();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
alert.show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -89,6 +63,9 @@ public class LicenseFragment extends Fragment {
|
|||||||
View rootView = inflater.inflate(R.layout.fragment_licenses, container, false);
|
View rootView = inflater.inflate(R.layout.fragment_licenses, container, false);
|
||||||
ViewGroup softwareComponentsView = rootView.findViewById(R.id.software_components);
|
ViewGroup softwareComponentsView = rootView.findViewById(R.id.software_components);
|
||||||
|
|
||||||
|
View licenseLink = rootView.findViewById(R.id.app_read_license);
|
||||||
|
licenseLink.setOnClickListener(new OnReadFullLicenseClickListener());
|
||||||
|
|
||||||
for (final SoftwareComponent component : softwareComponents) {
|
for (final SoftwareComponent component : softwareComponents) {
|
||||||
View componentView = inflater.inflate(R.layout.item_software_component, container, false);
|
View componentView = inflater.inflate(R.layout.item_software_component, container, false);
|
||||||
TextView softwareName = componentView.findViewById(R.id.name);
|
TextView softwareName = componentView.findViewById(R.id.name);
|
||||||
@@ -111,7 +88,6 @@ public class LicenseFragment extends Fragment {
|
|||||||
});
|
});
|
||||||
softwareComponentsView.addView(componentView);
|
softwareComponentsView.addView(componentView);
|
||||||
registerForContextMenu(componentView);
|
registerForContextMenu(componentView);
|
||||||
|
|
||||||
}
|
}
|
||||||
return rootView;
|
return rootView;
|
||||||
}
|
}
|
||||||
@@ -147,4 +123,11 @@ public class LicenseFragment extends Fragment {
|
|||||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(componentLink));
|
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(componentLink));
|
||||||
startActivity(browserIntent);
|
startActivity(browserIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class OnReadFullLicenseClickListener implements View.OnClickListener {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
LicenseFragment.showLicense(v.getContext(), StandardLicenses.GPL3);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user