Compare commits
942 Commits
docker-sta
...
906f7b237e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
906f7b237e | ||
|
|
28e4ffb4eb | ||
|
|
9747dc7f47 | ||
|
|
9f1a52d840 | ||
|
|
461cec77b2 | ||
|
|
73278c70ee | ||
|
|
953ee0daaf | ||
|
|
e5e55ce26e | ||
|
|
5104cbc3c7 | ||
|
|
de0afd6266 | ||
|
|
4c6f21c5ee | ||
|
|
b42ad79716 | ||
|
|
a9339ff5ae | ||
|
|
1ff9b80fdd | ||
|
|
07bf8bc42d | ||
|
|
64e258bb5b | ||
|
|
ad3ca4635e | ||
|
|
1331fb4c43 | ||
|
|
f9c22c8bf8 | ||
|
|
46a2763802 | ||
|
|
49d399e388 | ||
|
|
0fd7ea8849 | ||
|
|
16dabbd087 | ||
|
|
a638c930cc | ||
|
|
22e804850b | ||
|
|
a28f8e2536 | ||
|
|
d477b56af0 | ||
|
|
fce3396c30 | ||
|
|
85cee23ab0 | ||
|
|
96b01e74b9 | ||
|
|
84fdbb5c40 | ||
|
|
7cdfdb9359 | ||
|
|
f50386a94f | ||
|
|
9e7240ecdb | ||
|
|
bc7ffd16e3 | ||
|
|
663cbe3cde | ||
|
|
b4264b7bf3 | ||
|
|
6f96374fa4 | ||
|
|
8ca00ef881 | ||
|
|
cad92a9ad2 | ||
|
|
dfe5608681 | ||
|
|
a931643afc | ||
|
|
fef0cc3edc | ||
|
|
faad2b4d80 | ||
|
|
001a22e325 | ||
|
|
9d62bb5a88 | ||
|
|
e9d140876c | ||
|
|
36b447ed3a | ||
|
|
c06c1ddb0e | ||
|
|
78b42e1de4 | ||
|
|
b997f4a9ba | ||
|
|
6fcc6e0b40 | ||
|
|
aff56b1e10 | ||
|
|
610d58390d | ||
|
|
5b9da606fd | ||
|
|
bbc27dc37f | ||
|
|
d622ed4f38 | ||
|
|
ae1ef1f057 | ||
|
|
4adf09b4c9 | ||
|
|
38a7d7c3af | ||
|
|
b601d2354e | ||
|
|
7ed5e35be8 | ||
|
|
60f4c2adfa | ||
|
|
edb1f1a4c8 | ||
|
|
3872e7cb64 | ||
|
|
1cde1c23ef | ||
|
|
de98d86101 | ||
|
|
a0191ae39a | ||
|
|
9a9d00e73f | ||
|
|
2fd11f9679 | ||
|
|
fca41df817 | ||
|
|
35d175e2d5 | ||
|
|
5a476089b4 | ||
|
|
bcd634e683 | ||
|
|
e3b68cb658 | ||
|
|
4827e9c626 | ||
|
|
9b4660da5c | ||
|
|
002ca6a4b4 | ||
|
|
f2c9a99245 | ||
|
|
8a10da5a24 | ||
|
|
d94933dd25 | ||
|
|
69decd0db9 | ||
|
|
f871564712 | ||
|
|
981d23bc4a | ||
|
|
42feec4d78 | ||
|
|
373b915a79 | ||
|
|
b94a57d1fa | ||
|
|
3f323d5d40 | ||
|
|
c0d847250a | ||
|
|
df4d228861 | ||
|
|
8228907bfe | ||
|
|
1462834ad2 | ||
|
|
82b141717d | ||
|
|
53b75a10fb | ||
|
|
65219997c9 | ||
|
|
1fae26c530 | ||
|
|
2c4f30a813 | ||
|
|
4fc34f1a4f | ||
|
|
d8e56cf530 | ||
|
|
4314ae9b01 | ||
|
|
cd6eac25a8 | ||
|
|
3796095cbb | ||
|
|
d8f93dedd1 | ||
|
|
aeddb5e612 | ||
|
|
a298fd5e4a | ||
|
|
2702071e11 | ||
|
|
ebb1bf369b | ||
|
|
53cb8665ff | ||
|
|
4e4dee2879 | ||
|
|
7e98929101 | ||
|
|
19f43779b1 | ||
|
|
ffab316b42 | ||
|
|
e0e0200568 | ||
|
|
c393cd3ca7 | ||
|
|
2e763de66b | ||
|
|
b0e760325f | ||
|
|
d2bcde4944 | ||
|
|
d6e35c5aa3 | ||
|
|
c21f028786 | ||
|
|
fec30d4d92 | ||
|
|
737da26f6f | ||
|
|
5ad8f63563 | ||
|
|
0b0aa6326c | ||
|
|
b742f91764 | ||
|
|
67a98c9d5d | ||
|
|
f207ea4998 | ||
|
|
8b5d3fa0cc | ||
|
|
e7d3b07130 | ||
|
|
0cd5c523f9 | ||
|
|
28dd44c91e | ||
|
|
93f3efdb3e | ||
|
|
df6bfafedb | ||
|
|
8b0134bb11 | ||
|
|
af49f2c4ae | ||
|
|
f9199b1d5d | ||
|
|
b783cfaab1 | ||
|
|
2be1cf2d95 | ||
|
|
c930e55c46 | ||
|
|
72fe45cb9e | ||
|
|
3635d37245 | ||
|
|
c91b1423a4 | ||
|
|
7f9933ae16 | ||
|
|
e4f33378bd | ||
|
|
d4c24d7241 | ||
|
|
1403c2ab24 | ||
|
|
7d8b4945d3 | ||
|
|
6a9f35dae1 | ||
|
|
2aa943f141 | ||
|
|
06d1770c0e | ||
|
|
3ddc1e072d | ||
|
|
0a35ab0cf0 | ||
|
|
9cdc85ca91 | ||
|
|
3c2564f170 | ||
|
|
786704bcde | ||
|
|
27ae6acc87 | ||
|
|
d5dd9303b8 | ||
|
|
3e75a28a12 | ||
|
|
5d9880304a | ||
|
|
ed06fcb92c | ||
|
|
2d78a1a7f6 | ||
|
|
4e8af0337a | ||
|
|
ddbb533e6d | ||
|
|
c1faf2bbcd | ||
|
|
8e6cade155 | ||
|
|
59b746fd1c | ||
|
|
4b1765757f | ||
|
|
5bb5dacd30 | ||
|
|
f5f88fe072 | ||
|
|
b4d566f41f | ||
|
|
038b44cf98 | ||
|
|
8d3d4961e5 | ||
|
|
4a821d700d | ||
|
|
1df1b8af2d | ||
|
|
fa8038f001 | ||
|
|
9de47441af | ||
|
|
76a6f4b101 | ||
|
|
1a19f51072 | ||
|
|
4bb8d742da | ||
|
|
c92caf80c5 | ||
|
|
f5e98c8fe2 | ||
|
|
4a6c62f68b | ||
|
|
e1be2a6979 | ||
|
|
98f80c3ced | ||
|
|
4a55d5c92c | ||
|
|
adc02ed151 | ||
|
|
00a7738a1d | ||
|
|
5bf3da0dc0 | ||
|
|
4c2001ceee | ||
|
|
0082765bf6 | ||
|
|
2008aabb74 | ||
|
|
c33916b5db | ||
|
|
3cee9ae5b5 | ||
|
|
cf6420cde1 | ||
|
|
dc66c4582f | ||
|
|
48c00ce59f | ||
|
|
e9c9cac4fd | ||
|
|
75d05d3c85 | ||
|
|
2941fa7b86 | ||
|
|
308518f6cd | ||
|
|
2e02fd3e23 | ||
|
|
8bd284f67e | ||
|
|
5887f05fe6 | ||
|
|
0183286bb2 | ||
|
|
0f54d186d1 | ||
|
|
6cb5ea0ba1 | ||
|
|
ae06025b0e | ||
|
|
8b596806a5 | ||
|
|
bda8921b34 | ||
|
|
e5bf497462 | ||
|
|
3612e5e837 | ||
|
|
96ece4f570 | ||
|
|
727a6a6727 | ||
|
|
db26363c95 | ||
|
|
50eaf51c5f | ||
|
|
5727480778 | ||
|
|
4d1080fcd2 | ||
|
|
1f457865df | ||
|
|
a2177f2c3d | ||
|
|
6692cc525b | ||
|
|
5a486263e1 | ||
|
|
0c628a9cd0 | ||
|
|
809a0d57c9 | ||
|
|
750dc09ef6 | ||
|
|
56fa4b8993 | ||
|
|
aea2181389 | ||
|
|
bb8c50df8e | ||
|
|
1ce1ae5837 | ||
|
|
4e2f1b052e | ||
|
|
f5c31e24a9 | ||
|
|
9d8de3d898 | ||
|
|
5dc6a9e435 | ||
|
|
a771300e84 | ||
|
|
c2a693abb2 | ||
|
|
ba73e43725 | ||
|
|
2f0da0e6cc | ||
|
|
0c033002d4 | ||
|
|
0956a9b66e | ||
|
|
bf2af710c3 | ||
|
|
e59d1c0e1c | ||
|
|
878cca2760 | ||
|
|
6ffcbb1683 | ||
|
|
49de19ca5f | ||
|
|
c2682cdeac | ||
|
|
feb3242638 | ||
|
|
b25841a667 | ||
|
|
fdb2c1d12e | ||
|
|
d477c04ce4 | ||
|
|
9f1cbd77d8 | ||
|
|
aa3de021c7 | ||
|
|
54b92b1e29 | ||
|
|
93898da514 | ||
|
|
f3a5c690e3 | ||
|
|
75affcf7c7 | ||
|
|
4000c2d5ad | ||
|
|
43581eaa59 | ||
|
|
442ae884a3 | ||
|
|
a4223a2772 | ||
|
|
670343d2ff | ||
|
|
38dec52081 | ||
|
|
f792fe9172 | ||
|
|
d66d6fc0ff | ||
|
|
d7ca2fd473 | ||
|
|
9665d8c79f | ||
|
|
79ce4dc835 | ||
|
|
102ba2b9be | ||
|
|
1a6accc21b | ||
|
|
b86af7ec97 | ||
|
|
8d59e75054 | ||
|
|
2f56a1cc9a | ||
|
|
9602febccb | ||
|
|
ae7ad7bb31 | ||
|
|
a6961fb849 | ||
|
|
4a0513ff53 | ||
|
|
6cc78e33d3 | ||
|
|
09ddd96d95 | ||
|
|
12be559b2f | ||
|
|
9d5a3db53a | ||
|
|
bdca2bc4c6 | ||
|
|
e2388890a8 | ||
|
|
70f02e3162 | ||
|
|
f30f724bac | ||
|
|
93da9b7078 | ||
|
|
5f7321e96d | ||
|
|
134a9d9e0e | ||
|
|
61428f2c5d | ||
|
|
524715b393 | ||
|
|
eccd7ded4c | ||
|
|
3956897066 | ||
|
|
8f5d7de44d | ||
|
|
0d08532765 | ||
|
|
e90976a2a4 | ||
|
|
62702ef128 | ||
|
|
deedb165e7 | ||
|
|
be66d1aafc | ||
|
|
a2fd10382b | ||
|
|
77be7688e5 | ||
|
|
58405cfeaf | ||
|
|
0898586a70 | ||
|
|
bb95c21a78 | ||
|
|
690f6eaf94 | ||
|
|
4a9f666624 | ||
|
|
eb7f0e6019 | ||
|
|
79ba510788 | ||
|
|
f97b582260 | ||
|
|
2bfdb92de1 | ||
|
|
211d0f6305 | ||
|
|
bfa34ebe74 | ||
|
|
d74c9cb2e0 | ||
|
|
d1aca04dfb | ||
|
|
9183634701 | ||
|
|
2d6ccb5cf6 | ||
|
|
c0bb5d7179 | ||
|
|
c3f1f485e8 | ||
|
|
8069c21f94 | ||
|
|
291f4eed43 | ||
|
|
5aca984206 | ||
|
|
97d706f60b | ||
|
|
df50735df7 | ||
|
|
7df849531e | ||
|
|
9b9f42837a | ||
|
|
2c9b109c74 | ||
|
|
fbbf9a46db | ||
|
|
450b3900eb | ||
|
|
9cfdfde9a9 | ||
|
|
03fb903de7 | ||
|
|
f20efd8b16 | ||
|
|
055e64ba5d | ||
|
|
513e028a73 | ||
|
|
8d3e3ff5fc | ||
|
|
d5e5c49f38 | ||
|
|
ac408b3dfa | ||
|
|
97eee7f1e3 | ||
|
|
73d728650b | ||
|
|
23ab483a7d | ||
|
|
d66de07e20 | ||
|
|
6a73db8ab3 | ||
|
|
7b61bb3b4e | ||
|
|
fb9f5a5cd4 | ||
|
|
b828caa86e | ||
|
|
d01a34f9b5 | ||
|
|
1370c899fa | ||
|
|
9e3eeb277e | ||
|
|
cb67431323 | ||
|
|
c3b0209489 | ||
|
|
9e5dd4f5f1 | ||
|
|
1642b99e1b | ||
|
|
bf7073597c | ||
|
|
ab61946366 | ||
|
|
587132d85a | ||
|
|
8d62e93d50 | ||
|
|
4d0a66bcbd | ||
|
|
13b34adc6b | ||
|
|
3e0af4d807 | ||
|
|
86be21db2c | ||
|
|
76e90c109e | ||
|
|
5b7ed14da8 | ||
|
|
78802224c5 | ||
|
|
9278f62c3b | ||
|
|
31933b9199 | ||
|
|
780963cbbe | ||
|
|
f124787087 | ||
|
|
d648f1242b | ||
|
|
8c0332cbd5 | ||
|
|
dcaa51a303 | ||
|
|
6b1a1008ea | ||
|
|
a215c19082 | ||
|
|
3b9cff1c24 | ||
|
|
c2866de248 | ||
|
|
5e982b7301 | ||
|
|
9901c091bc | ||
|
|
28767cb850 | ||
|
|
599b5cac54 | ||
|
|
acb2cd0db3 | ||
|
|
37745ccd05 | ||
|
|
24810b4cfe | ||
|
|
6bf345e94f | ||
|
|
8a67797707 | ||
|
|
1ce1bfa7aa | ||
|
|
df04819b26 | ||
|
|
49cf22446c | ||
|
|
36f750fd11 | ||
|
|
11c3e561e9 | ||
|
|
4f901e602a | ||
|
|
ad28847a67 | ||
|
|
db151c1ec2 | ||
|
|
18785ff8c7 | ||
|
|
adecc668f1 | ||
|
|
8d43e65e5b | ||
|
|
826e4dfc1a | ||
|
|
7be4184ac0 | ||
|
|
3dad202d86 | ||
|
|
2ad1df61a8 | ||
|
|
2fd231f1d9 | ||
|
|
47009054da | ||
|
|
1db888809c | ||
|
|
0b8f307632 | ||
|
|
f74efd2db0 | ||
|
|
c53d1a57c9 | ||
|
|
9c77e01076 | ||
|
|
05b753c210 | ||
|
|
e9fbc65755 | ||
|
|
b17f7f9548 | ||
|
|
70254d8965 | ||
|
|
d3d6f6a91c | ||
|
|
83f24de9dd | ||
|
|
7849af14f6 | ||
|
|
872ba191b3 | ||
|
|
93243ed7db | ||
|
|
79b209fabe | ||
|
|
ffa846d96d | ||
|
|
6ca3d6a716 | ||
|
|
3eba5ec6f5 | ||
|
|
455d93b15b | ||
|
|
0e1d3b2961 | ||
|
|
be142c3695 | ||
|
|
55cdded315 | ||
|
|
50f0345f91 | ||
|
|
20d6128206 | ||
|
|
a60ce8a9d9 | ||
|
|
90f5f08160 | ||
|
|
13b28550e9 | ||
|
|
819533f0a2 | ||
|
|
4c00425f66 | ||
|
|
ed2620e44f | ||
|
|
4006cf9c93 | ||
|
|
4a94d4b290 | ||
|
|
5f5fe6d555 | ||
|
|
e410bdc95a | ||
|
|
8badc1dab5 | ||
|
|
2eb634d12e | ||
|
|
3b6c9789f9 | ||
|
|
cd811ba381 | ||
|
|
f183ee0c18 | ||
|
|
7019791f44 | ||
|
|
12604c4a46 | ||
|
|
430d27d303 | ||
|
|
0a415383a9 | ||
|
|
0a29a4de21 | ||
|
|
4f3ae7ca61 | ||
|
|
b2d5f7ef05 | ||
|
|
4fc92bb6bd | ||
|
|
d8bf3d83df | ||
|
|
aba0ca0986 | ||
|
|
9bd369b553 | ||
|
|
5fe05620cc | ||
|
|
9275d6cfe8 | ||
|
|
7dc7180870 | ||
|
|
5fc2a56b17 | ||
|
|
73ad994113 | ||
|
|
e0d9a74907 | ||
|
|
0f6f9d4ee8 | ||
|
|
92fd9c8f0f | ||
|
|
84057e8649 | ||
|
|
00e8afb72e | ||
|
|
50475cc654 | ||
|
|
c1a77f2076 | ||
|
|
47fa155aa7 | ||
|
|
ee73dd6770 | ||
|
|
8da7fd6030 | ||
|
|
653de060c5 | ||
|
|
f204c94415 | ||
|
|
d1d83c2dea | ||
|
|
cfd9e0636f | ||
|
|
54ad94ed13 | ||
|
|
eeafcef5c9 | ||
|
|
0be7e45bf8 | ||
|
|
29c16b386c | ||
|
|
a05d27f34f | ||
|
|
8147eb8a00 | ||
|
|
a617d8e887 | ||
|
|
8dfaf532d8 | ||
|
|
adbf2784fc | ||
|
|
56e66dbf10 | ||
|
|
15e1d7e237 | ||
|
|
7f8edf6b55 | ||
|
|
e38f3dea87 | ||
|
|
1d0d76832d | ||
|
|
fa6a64c5f3 | ||
|
|
2950cfb808 | ||
|
|
890aec6a30 | ||
|
|
87eeac58a3 | ||
|
|
c7b01a6af3 | ||
|
|
eda2b4f887 | ||
|
|
5a1555f93e | ||
|
|
e4c3aab9ee | ||
|
|
c40c1de959 | ||
|
|
9d1a5c3e66 | ||
|
|
eaacf84ea9 | ||
|
|
4bc351de27 | ||
|
|
1a9278bb49 | ||
|
|
2720bd1c23 | ||
|
|
def048716a | ||
|
|
0f26c1904b | ||
|
|
7e702d93c5 | ||
|
|
7ea1d89495 | ||
|
|
4ac19500e3 | ||
|
|
c264af305d | ||
|
|
d383c1ec2f | ||
|
|
a43fbf5dfc | ||
|
|
fb8b797891 | ||
|
|
92b398809f | ||
|
|
7452a2c18e | ||
|
|
cef4b4c97d | ||
|
|
33838c0b1d | ||
|
|
84c49a0007 | ||
|
|
063d83d851 | ||
|
|
e0aa8cd3d5 | ||
|
|
538222e1a1 | ||
|
|
8166cf6f3c | ||
|
|
b0d58a61cb | ||
|
|
99a59740ae | ||
|
|
2496c9efc3 | ||
|
|
6c0a84fc99 | ||
|
|
f9474cb95e | ||
|
|
fceb1f9622 | ||
|
|
db5685e54f | ||
|
|
8068a207ce | ||
|
|
6349ccf0aa | ||
|
|
34dcf5b91f | ||
|
|
a0daea7b6b | ||
|
|
837e1d159f | ||
|
|
ef4c2af36b | ||
|
|
1f8d6c394c | ||
|
|
d7f5808467 | ||
|
|
5b57061be1 | ||
|
|
deeec99d62 | ||
|
|
63af6b4abf | ||
|
|
4723a36649 | ||
|
|
abed47554c | ||
|
|
6847ee37ce | ||
|
|
50d2ff9955 | ||
|
|
5529ea0727 | ||
|
|
220e3bdea0 | ||
|
|
7b634e9fe3 | ||
|
|
2ac328dcd0 | ||
|
|
4b1b5e9dd1 | ||
|
|
0faf254338 | ||
|
|
27827f2576 | ||
|
|
3d23f2c18d | ||
|
|
943307177a | ||
|
|
6639fafbcc | ||
|
|
cbdfed5eb1 | ||
|
|
7267e706b5 | ||
|
|
fe1bed37df | ||
|
|
e71322bf0d | ||
|
|
769a6dea2d | ||
|
|
edf8991914 | ||
|
|
5dd37cc23e | ||
|
|
0b48788174 | ||
|
|
8054805054 | ||
|
|
64b52c36d9 | ||
|
|
29aea0be35 | ||
|
|
dbde6dbfb9 | ||
|
|
b5307ddfc8 | ||
|
|
eb26dbd0e2 | ||
|
|
6842c3c622 | ||
|
|
98a0799e27 | ||
|
|
319bdd20c8 | ||
|
|
0b2917e40d | ||
|
|
98dd3d1135 | ||
|
|
49429389ad | ||
|
|
dae6282b85 | ||
|
|
e5ec4e6679 | ||
|
|
dac8758fb8 | ||
|
|
dd96734ffd | ||
|
|
e6075e7c56 | ||
|
|
e39f50c930 | ||
|
|
d7f76f3a2c | ||
|
|
29bd9352a0 | ||
|
|
2e99413e48 | ||
|
|
0b1d2c6b0e | ||
|
|
c762d55946 | ||
|
|
bf03245830 | ||
|
|
7260558276 | ||
|
|
098c13b966 | ||
|
|
740a5d82e1 | ||
|
|
431d458cb5 | ||
|
|
8187d5b389 | ||
|
|
c16e19eb1b | ||
|
|
2445d8fb49 | ||
|
|
cb02f8f255 | ||
|
|
8a2d8eddc9 | ||
|
|
7303b9c241 | ||
|
|
999b18e4bb | ||
|
|
e6f0591fc4 | ||
|
|
57eaae43aa | ||
|
|
eae7d4500c | ||
|
|
ac72e2ccb3 | ||
|
|
ccf32b9b43 | ||
|
|
da5bafacd4 | ||
|
|
8354108df7 | ||
|
|
6c7f16f66f | ||
|
|
27c9168f85 | ||
|
|
581137ec02 | ||
|
|
2fa69f81ca | ||
|
|
d659e388fd | ||
|
|
1d2fdc3ea2 | ||
|
|
c89ba51f57 | ||
|
|
40a8e92e80 | ||
|
|
51a2f042c1 | ||
|
|
7767c69ad1 | ||
|
|
e01174182c | ||
|
|
cd27910117 | ||
|
|
1b2e86f5f8 | ||
|
|
867bb45e42 | ||
|
|
40095fe64e | ||
|
|
d449d412f1 | ||
|
|
4b76c5187b | ||
|
|
e2120319f4 | ||
|
|
505e9c1c61 | ||
|
|
5606cd7684 | ||
|
|
7ddbe0641a | ||
|
|
cd9786f699 | ||
|
|
d4a7a2cded | ||
|
|
dafaedef2e | ||
|
|
f2fd62dce0 | ||
|
|
5e4097b88c | ||
|
|
75164fce6f | ||
|
|
798688d105 | ||
|
|
a62433c6f9 | ||
|
|
153416e458 | ||
|
|
80403f650e | ||
|
|
37ec1f248c | ||
|
|
4b21f43ba9 | ||
|
|
e3ab50216c | ||
|
|
3e85cf91a8 | ||
|
|
5b7762f2cb | ||
|
|
96c61f26d0 | ||
|
|
47833803b2 | ||
|
|
f124efc8e3 | ||
|
|
fc08e94049 | ||
|
|
90910bfee4 | ||
|
|
913ccef4a7 | ||
|
|
97bb31f304 | ||
|
|
8990672e62 | ||
|
|
673142052e | ||
|
|
692fbf1d5d | ||
|
|
c2625bd79d | ||
|
|
9484df8780 | ||
|
|
70221f1f41 | ||
|
|
5be52a9d7b | ||
|
|
8d60655fa7 | ||
|
|
b765e8eb06 | ||
|
|
34c7b787e7 | ||
|
|
5c62905ce5 | ||
|
|
8cc53b114b | ||
|
|
9f52dbf33c | ||
|
|
2a59d97d62 | ||
|
|
63ac519d60 | ||
|
|
e28361bab3 | ||
|
|
38d4913834 | ||
|
|
184c935251 | ||
|
|
f7d614007a | ||
|
|
8071330fc6 | ||
|
|
61db054304 | ||
|
|
41486bf8a3 | ||
|
|
8b5bd59420 | ||
|
|
9b7a612bc4 | ||
|
|
f6f0614d1f | ||
|
|
a5596afc4c | ||
|
|
57d19f5326 | ||
|
|
8f28bc4842 | ||
|
|
ab3b30d618 | ||
|
|
c64c800024 | ||
|
|
99cc288726 | ||
|
|
6658fdc5a7 | ||
|
|
be0fd4ae31 | ||
|
|
7da7d37c00 | ||
|
|
a05ab40086 | ||
|
|
6fce8fde00 | ||
|
|
5adb35ad94 | ||
|
|
b6dda9ac2d | ||
|
|
75a6333f96 | ||
|
|
ccd1eab93c | ||
|
|
dd517abe97 | ||
|
|
f875214bee | ||
|
|
1e0d1f77f9 | ||
|
|
e21718181e | ||
|
|
f903092531 | ||
|
|
3ddbf9eed0 | ||
|
|
9f42bcc8c6 | ||
|
|
174e0564a7 | ||
|
|
ac1cf91adc | ||
|
|
f16ebe8aa3 | ||
|
|
113fbd91f8 | ||
|
|
6dafa572a4 | ||
|
|
4d31a08fef | ||
|
|
08271eb2b4 | ||
|
|
6826788925 | ||
|
|
a3bd8ec957 | ||
|
|
678e30c89a | ||
|
|
70243b5b76 | ||
|
|
00d21afbc5 | ||
|
|
f7c961ae93 | ||
|
|
0fdbeea5d5 | ||
|
|
cf7cf98dd5 | ||
|
|
8ae73e932f | ||
|
|
bbff542938 | ||
|
|
a1e1c3e33f | ||
|
|
b7e6d55fcc | ||
|
|
2adf9231a8 | ||
|
|
7fbd295c87 | ||
|
|
bd6337cc5c | ||
|
|
a5e9c3089b | ||
|
|
8a0f821eb3 | ||
|
|
b9fe538feb | ||
|
|
052547350a | ||
|
|
b91601209d | ||
|
|
03cc26622a | ||
|
|
bbd409d28f | ||
|
|
ab16327c4b | ||
|
|
771eaeeb8a | ||
|
|
d06ac6a18e | ||
|
|
904d6e79b2 | ||
|
|
0f0e142daf | ||
|
|
3c5710e192 | ||
|
|
177d5f7a63 | ||
|
|
daf8e56e8d | ||
|
|
bcb14824d7 | ||
|
|
de9a688f08 | ||
|
|
66ef437a98 | ||
|
|
ceae76f50e | ||
|
|
568a8dc53a | ||
|
|
5d4e5024ab | ||
|
|
269b02f0fc | ||
|
|
7ec38a9933 | ||
|
|
faa535bd0b | ||
|
|
8b1e2bc26b | ||
|
|
038b1f610f | ||
|
|
bccb0a3928 | ||
|
|
e979a3eaa4 | ||
|
|
941ade3d26 | ||
|
|
c5b0107746 | ||
|
|
15fadaad41 | ||
|
|
2301392ba4 | ||
|
|
a41df78164 | ||
|
|
9527c91e98 | ||
|
|
12f43c3acf | ||
|
|
e1a38eba0e | ||
|
|
ea7ca735a0 | ||
|
|
482b9ff833 | ||
|
|
cb34181115 | ||
|
|
06cf3cd7d6 | ||
|
|
ddad3663cf | ||
|
|
ae741e1c30 | ||
|
|
5ef6b6bfcd | ||
|
|
64096ff275 | ||
|
|
efc2a5d468 | ||
|
|
0fc44971a1 | ||
|
|
ccd7f8e14b | ||
|
|
8203cc8f81 | ||
|
|
d46e1dfb80 | ||
|
|
f1029b0b93 | ||
|
|
024fad830a | ||
|
|
7aa8181f6f | ||
|
|
9edfb9c216 | ||
|
|
9e79555951 | ||
|
|
dcb80d6a51 | ||
|
|
a9e0acbd0a | ||
|
|
9adc242445 | ||
|
|
93ffc6ea42 | ||
|
|
165c6a53ae | ||
|
|
8b52cddd22 | ||
|
|
463cad66e6 | ||
|
|
2658ca8fdf | ||
|
|
ca63841dee | ||
|
|
8449a2ea60 | ||
|
|
7fcf4647cc | ||
|
|
ddb1bf189e | ||
|
|
13477769fb | ||
|
|
cf048ce7d8 | ||
|
|
4d3e63970d | ||
|
|
4515b3ca13 | ||
|
|
de4343a001 | ||
|
|
6214f1a0a1 | ||
|
|
76dae85866 | ||
|
|
358a4d8311 | ||
|
|
43682f2a87 | ||
|
|
ba9820aee4 | ||
|
|
32753be835 | ||
|
|
b47f66773b | ||
|
|
733a99cdc4 | ||
|
|
99ef160678 | ||
|
|
ea60a07202 | ||
|
|
b10d91e1c0 | ||
|
|
0b86cb9a1f | ||
|
|
06a9e61330 | ||
|
|
54da43668d | ||
|
|
5ee8a6f847 | ||
|
|
77248156a5 | ||
|
|
81e74bdfa3 | ||
|
|
79111259f6 | ||
|
|
e4263b18f3 | ||
|
|
f23f9cfd20 | ||
|
|
e3b35a4426 | ||
|
|
996221f39e | ||
|
|
7df79c7da8 | ||
|
|
9e2b8e39c4 | ||
|
|
efc7e8a687 | ||
|
|
8ec890dea1 | ||
|
|
c540ff27df | ||
|
|
a74dea4fb4 | ||
|
|
0d128656b7 | ||
|
|
b1f011f907 | ||
|
|
1735f548d6 | ||
|
|
c49abee128 | ||
|
|
d7ef10b65e | ||
|
|
75e4e37789 | ||
|
|
913a43e0cb | ||
|
|
284ca61bb9 | ||
|
|
2349a5f67f | ||
|
|
f78344e756 | ||
|
|
667abd4764 | ||
|
|
6134c84047 | ||
|
|
1d07846314 | ||
|
|
d25f416411 | ||
|
|
0d5494bff2 | ||
|
|
87ceaf1a8a | ||
|
|
93edc7411c | ||
|
|
026a060c3c | ||
|
|
3bdf5a5254 | ||
|
|
a897c79243 | ||
|
|
a58a01e1df | ||
|
|
e35d806f51 | ||
|
|
1caa2c150d | ||
|
|
d9ac3f21d0 | ||
|
|
78de660963 | ||
|
|
adf09e5dfa | ||
|
|
62d7def602 | ||
|
|
fd26924324 | ||
|
|
3a3cacb6d0 | ||
|
|
c6cb1334b2 | ||
|
|
bcdab77856 | ||
|
|
ba5fa3f4e8 | ||
|
|
8aaa41de3d | ||
|
|
43cf7dc468 | ||
|
|
cdcec542d0 | ||
|
|
00e6597265 | ||
|
|
0f025be830 | ||
|
|
44f6697b02 | ||
|
|
8a31d194fa | ||
|
|
bc917b4727 | ||
|
|
ab96d0fa34 | ||
|
|
ae935825f4 | ||
|
|
8c3692d94a | ||
|
|
19fa78253c | ||
|
|
b7907c8459 | ||
|
|
bc9643c5e7 | ||
|
|
a0cebd409c | ||
|
|
d4521153b1 | ||
|
|
d451a834a2 | ||
|
|
27b7a248e9 | ||
|
|
fa5a1b9a37 | ||
|
|
35b89add2f | ||
|
|
b041062c6a | ||
|
|
94a1e3d4c0 | ||
|
|
e2adc76b7d | ||
|
|
98b310342e | ||
|
|
def705d37a | ||
|
|
4ba2b7c466 | ||
|
|
10ef769b6c | ||
|
|
66ee2e0a8d | ||
|
|
3e5ba0da0b | ||
|
|
c46d95c196 | ||
|
|
83d06e8584 | ||
|
|
7db35edfda | ||
|
|
1938f35856 | ||
|
|
c8b1c644d1 | ||
|
|
d56e224f3b | ||
|
|
a8b35495f6 | ||
|
|
6f1af7c36d | ||
|
|
7a6a1e99a5 | ||
|
|
1077a5ef60 | ||
|
|
35b9412e7c | ||
|
|
f5d8863236 | ||
|
|
f941957dea | ||
|
|
ff45b70bcd | ||
|
|
b8dad3e52b | ||
|
|
477ba74e83 | ||
|
|
1ed3fe20b1 | ||
|
|
11e0cf2580 | ||
|
|
21ae44ca15 | ||
|
|
aa9daac6f4 | ||
|
|
1f4d9c3282 | ||
|
|
98c1d4a638 | ||
|
|
b634646d4b | ||
|
|
d85f362544 | ||
|
|
cc3b9fd5d6 | ||
|
|
82a5cb5e3a | ||
|
|
f64e1d21df | ||
|
|
c488771d5d | ||
|
|
24c51c85a3 | ||
|
|
6822e5fc1e | ||
|
|
cdd0cbf72b | ||
|
|
c80793cb2e | ||
|
|
312f717713 | ||
|
|
2e7a43ad7c | ||
|
|
e2dd39b5e3 | ||
|
|
82e838438d | ||
|
|
f0fd776104 | ||
|
|
a6383824b2 | ||
|
|
9f3ec29813 | ||
|
|
4b7d4d2f43 | ||
|
|
8a5d09e7d6 | ||
|
|
0180cc7ab0 | ||
|
|
9b10540fb9 | ||
|
|
6da10df705 | ||
|
|
1640f7e66c | ||
|
|
c611d23b3d | ||
|
|
5b4b454f92 | ||
|
|
3cbdec493b | ||
|
|
7eea8c3cc0 | ||
|
|
81fcbe2be0 | ||
|
|
1231ddb1b3 | ||
|
|
ffd18e8629 | ||
|
|
952c1f453c | ||
|
|
49c03bf3c0 | ||
|
|
35e06ef2e8 | ||
|
|
d445e462c5 | ||
|
|
23e742697a | ||
|
|
38a624bd48 | ||
|
|
b5e34674eb | ||
|
|
1c6673f62e | ||
|
|
fe86bf06ca | ||
|
|
3270d2b5a0 | ||
|
|
b9992fc0df | ||
|
|
043406f0d5 | ||
|
|
68d54e7ea1 | ||
|
|
a4df679439 | ||
|
|
2b35a27252 | ||
|
|
a68fcde7f9 | ||
|
|
61fb7ee345 | ||
|
|
6a83a1343e | ||
|
|
32924854b6 | ||
|
|
d019ad69ed | ||
|
|
1f5a286195 | ||
|
|
743229525a | ||
|
|
928a686cf5 | ||
|
|
614e38600b | ||
|
|
e54eb5c764 | ||
|
|
38481ef63d | ||
|
|
6f660d5bff |
18
.drone.yml
@@ -1,19 +1,19 @@
|
|||||||
kind: pipeline
|
kind: pipeline
|
||||||
type: exec
|
type: exec
|
||||||
name: Build and Push Docker Image (Quay)
|
name: Build and Push Docker Image
|
||||||
|
|
||||||
platform:
|
platform:
|
||||||
os: linux
|
os: linux
|
||||||
arch: amd64
|
arch: arm64
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Build
|
- name: Build
|
||||||
environment:
|
environment:
|
||||||
QUAY_USERNAME:
|
CODEBERG_USERNAME:
|
||||||
from_secret: QUAY_USERNAME
|
from_secret: CODEBERG_USERNAME
|
||||||
QUAY_PASSWORD:
|
CODEBERG_PASSWORD:
|
||||||
from_secret: QUAY_PASSWORD
|
from_secret: CODEBERG_PASSWORD
|
||||||
commands:
|
commands:
|
||||||
- echo $QUAY_PASSWORD | docker login quay.io --username $QUAY_USERNAME --password-stdin
|
- echo $CODEBERG_PASSWORD | docker login codeberg.org --username $CODEBERG_USERNAME --password-stdin
|
||||||
- docker build -t quay.io/sudovanilla/poketube .
|
- docker build -t codeberg.org/korbs/poke:arm64 .
|
||||||
- docker push quay.io/sudovanilla/poketube
|
- docker push codeberg.org/korbs/poke:arm64
|
||||||
13
LICENSE-APPSTORE.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
The developers are aware that the terms of service that apply to apps distributed via Apple's App Store services and similar app stores may conflict
|
||||||
|
with rights granted under the Poke license, the GNU General
|
||||||
|
Public License, version 3.
|
||||||
|
|
||||||
|
The copyright holders of the Poke project do not wish this conflict to prevent the otherwise-compliant distribution of derived apps via the App Store and similar app stores.
|
||||||
|
|
||||||
|
Therefore, we have committed not to pursue any license
|
||||||
|
violation that results solely from the conflict between the GNU GPLv3
|
||||||
|
and the Apple App Store terms of service or similar app stores. In
|
||||||
|
other words, as long as you comply with the GPL in all other respects,
|
||||||
|
including its requirements to provide users with source code and the
|
||||||
|
text of the license, we will not object to your distribution of the
|
||||||
|
Poke project through the App Store.
|
||||||
206
README.md
@@ -1,165 +1,89 @@
|
|||||||
|
|
||||||
<h1 align="center">
|
<h1 align="center">
|
||||||
<a href="https://poketube.fun/watch?v=9sJUDx7iEJw&quality=medium&=sjohgteojgytrueugtye4jhtytjrjnyıı">
|
<a href="https://poketube.fun/watch?v=9sJUDx7iEJw&quality=medium&=sjohgteojgytrueugtye4jhtytjrjnyıı">
|
||||||
<img src="https://poketube.fun/css/logo-poke.svg" width="400">
|
<img src="https://poketube.fun/css/logo-poke.svg" width="400">
|
||||||
<a href="http://www.defectivebydesign.org/drm-free">
|
</a>
|
||||||
<img src="https://static.fsf.org/dbd/label/DRM-free%20label%20120.en.png"
|
<a href="http://www.defectivebydesign.org/drm-free">
|
||||||
alt="DefectiveByDesign.org"
|
<img src="https://static.fsf.org/dbd/label/DRM-free%20label%20120.en.png"
|
||||||
width="65" height="65" border="0" align="middle" /></a>
|
alt="DRM Free" width="65" height="65" border="0" align="middle" />
|
||||||
</a>
|
</a>
|
||||||
<p>The Ultimate Privacy App</p>
|
<p>THE PRIVACY APP OF YOUR DREAMS! :3</p>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
<p>Be anonymous while watching (cat falling) videos, searching the web, and listening to music on Poke - the free privacy front-end!</p>
|
||||||
<span> Be Anonymous watching epic videos, searching thingys on the interwebs and listening to music on poke - the free privacy front end!</span>
|
|
||||||
|
|
||||||
<span>"Since you work on poke, Are you in touch with its lead developer "Jose marchasi"? <br>
|
|
||||||
-RMS
|
|
||||||
|
|
||||||
Stallman though poke was GNU poke lmaoooo
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
[Welcome!](#welcome) | [Features](#features) | [No non-free codec needed](#no-non-free-codec-needed-3) | [Hosting Poke~](#hosting-poketube) | [Poke community!](#poketube-community) | [The Legal Stuff (boring tbh)](#the-legal-stuff-boring-tbh)
|
|
||||||
|
|
||||||
<a href="https://status.poketube.fun" target="_blank">
|
|
||||||
<img
|
|
||||||
width="170"
|
|
||||||
src="https://api.netweak.com/status-badges/K2LY9"
|
|
||||||
alt="Netweak status badge"
|
|
||||||
/>
|
|
||||||
</a><br>
|
|
||||||
<a href="https://tosdr.org/en/service/7114">
|
|
||||||
<img src="https://shields.tosdr.org/en_7114.svg"/>
|
|
||||||
</a>
|
|
||||||
<img src="https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg"> <a href="./LICENSE"><img src="https://img.shields.io/badge/License-GPL--3-FF6666" alt="License - GPL-3"></a>
|
|
||||||
|
|
||||||
<a href="https://ci.poketube.fun/ashley/poke">
|
|
||||||
<img src="https://ci.poketube.fun/api/badges/ashley/poke/status.svg" />
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<a href="#welcome">Welcome!</a> | <a href="#features">Features</a> | <a href="#no-non-free-codec-needed">No Non-Free Codec</a> | <a href="#hosting-poke">Hosting</a> | <a href="#poke-community">Community</a> | <a href="#legal">Legal</a>
|
||||||
|
<br><br>
|
||||||
|
<img src="https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg" alt="Stand with Ukraine">
|
||||||
|
<a href="./LICENSE">
|
||||||
|
<img src="https://img.shields.io/badge/License-GPL--3-FF6666" alt="GPL-3-or-later License">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## Welcome!
|
## Welcome!
|
||||||
|
|
||||||
This is the source code of Poke (formerly PokeTube), the privacy-friendly youtube front-end built with the InnerTube API!
|
Welcome to Poke (formerly PokeTube), the privacy-friendly YouTube front-end built with the invidious API! Imagine paying for YouTube Premium just to download videos - couldn't be us (literally).
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
<h1>Features</h1>
|
| <img width="100%" style="border-radius: 24px" src="./css/README_RYD.png"> | <div style="text-align: left"><h3>🔙 Built-In Return YouTube Dislikes</h3>See the dislikes from *returnyoutubedislike* - because sometimes you need to know how bad that video really is :3</div> |
|
||||||
<h3>Return Youtube Dislikes Built-in </h3>
|
| - | - |
|
||||||
<img src="https://autumn.revolt.chat/attachments/0JlGwlnJdMcQwc6qzoo2qpmMAOWbrYMZ9vDX50l80r/resim.png">
|
| <div style="text-align: right"><h3>📱 PWA Support</h3>With PWA Support, you can install Poke on your mobile device. Now you can pretend to be productive while watching cat videos on the go, mreoww! :3</div> | <img width="100%" style="border-radius: 24px" src="./css/README_PWA.jpg"> |
|
||||||
<p>See the dislikes from returnyoutubedislike!</p>
|
| <h3>🎨 Customize</h3>Customize Poke however you want. Make it as unique as your taste in memes. | <h3>📥 Accounts</h3>Suscribe (yes Suscribe hehe sussy baka) to whaever channel you want! </div> |
|
||||||
|
| <h3>🔍 Web Search</h3>Search the web privately on PokeTube. Incognito mode who? | <h3>🎶 And...</h3>Ambient mode, HQ audio, and even more! :3 |
|
||||||
|
|
||||||
<h3>Customize</h3>
|
## No Non-Free Codec Needed
|
||||||
Customize Poketube However you want :3
|
|
||||||
|
|
||||||
<h3>PWA</h3>
|
Poke uses OpenH264, which is free software! No non-free components included :3 View the source code of OpenH264 [here](https://github.com/cisco/openh264.git). Because who wants to deal with non-free stuff? Not us!~
|
||||||
Install PokeTube as a pwa on your mobile device :3
|
|
||||||
|
|
||||||
<h3>Accounts </h3>
|
## Hosting Poke
|
||||||
Suscribe (yes Suscribe hehe sussy baka) to whaever channel you want!
|
|
||||||
|
|
||||||
<h3>Web Search </h3>
|
### NodeJS
|
||||||
Search the web privatly on poketube :3
|
|
||||||
|
|
||||||
<br>
|
1. **Install Packages**
|
||||||
<h3>And... </h3>
|
- Fedora/RHEL GNU/linux: `$ sudo dnf install git make gcc libcurl nodejs python libcurl g++ curl-config`
|
||||||
<p>
|
- Debian/Ubuntu GNU/linux: `$ sudo apt install git make gcc libcurl4-openssl-dev nodejs npm python g++`
|
||||||
Ambient mode, HQ audio And Even more!!!!!
|
- Alpine Linux (non-gnu): `$ apk add git nodejs npm python make gcc g++ libcurl curl-dev`
|
||||||
</p>
|
|
||||||
|
|
||||||
## Written by humans - not gpt
|
(we dont know if it works on non-gnu systems)
|
||||||
poke is made by hard-working hoomans - not gpt :3<br>
|
|
||||||
<a href="https://notbyai.fyi"><img src="https://cdn.glitch.global/d68d17bb-f2c0-4bc3-993f-50902734f652/Written-By-Human-Not-By-AI-Badge-white.svg?v=1696672202901" alt="Written by Humanss, Not by AI"></a>
|
|
||||||
|
|
||||||
## No Non-free codec needed :3
|
2. **Clone Repo**
|
||||||
|
- Codeberg: `$ git clone https://codeberg.org/ashley/poke.git`
|
||||||
|
- GitHub: `$ git clone https://github.com/ashley0143/poke.git`
|
||||||
|
|
||||||
Poke uses openh264 which is free software! poketube does not inculude non free stuff owowowoow!!!!
|
reccomended unoffical mirrors:
|
||||||
|
- code.lgbt: `$ git clone https://code.lgbt/mirror/poke.git` [sync every 10mins]
|
||||||
|
- git.lgbt: `$ git clone https://git.lgbt/mirror/poke.git` [sync every 10mins]
|
||||||
|
- nin0git :`$ git clone https://git.nin0.dev/mirrors/poke.git` [sync every 10mins]
|
||||||
|
|
||||||
you can view the source code of the openh264 codec in this repo :3 --> https://github.com/cisco/openh264.git
|
not reccomended, unstable
|
||||||
|
- SudoVanilla: `$ git clone https://ark.sudovanilla.org/Korbs/poke.git` [sync every week]
|
||||||
|
|
||||||
PLEASE NOTE THAT THIS SOFTWARE MAY INCULUDE CODECS THAT IN CERTAIN COUNTRIES MAY BE COVERED BY PATENTS OR HAVE LEGAL ISSUES. PATENT AND COPYRIGHT LAWS OPERATE DIFFERENTLY DEPENDING ON WHICH COUNTRY YOU ARE IN. PLEASE OBTAIN LEGAL ADVICE IF YOU ARE UNSURE WHETHER A PARTICULAR PATENT OR RESTRICTION APPLIES TO A CODEC YOU WISH TO USE IN YOUR COUNTRY.
|
3. **Install Dependencies**
|
||||||
|
- `$ cd poke`
|
||||||
|
- `$ npm install`
|
||||||
|
|
||||||
## Hosting Poke~
|
4. **Start Server**
|
||||||
|
- `$ node server.js`
|
||||||
|
|
||||||
### IMPORTANT
|
Congrats! Poke should now be running on `localhost:6003`! 🎉
|
||||||
Before you host, if ur server is in usa, set the proxylocation to `USA` (which is the default) - if you use any eu server set it to `EU` instead to make videos load faster
|
|
||||||
|
|
||||||
### With NodeJS
|
## Poke Community
|
||||||
- To self host your own Poke instance, you'll need the following:
|
|
||||||
|
|
||||||
- [Node.js](https://nodejs.org/en/download/)
|
Join us on [Discord](https://discord.poketube.fun/) or [Matrix](https://matrix.to/#/#poke:vern.cc)! I promise we're cool! <3
|
||||||
- [npm](http://npmjs.com) (Included with Node.js)
|
|
||||||
|
|
||||||
Once you have everything, clone our repo:
|
or if u like fedi, we host [PokeSocial](https://social.poketube.fun) as well :3
|
||||||
|
|
||||||
```
|
|
||||||
git clone https://codeberg.org/ashley/poke.git
|
|
||||||
```
|
|
||||||
|
|
||||||
You can also clone using our Github mirror if you'd prefer:
|
|
||||||
|
|
||||||
```
|
|
||||||
git clone https://github.com/ashley0143/poke.git
|
|
||||||
```
|
|
||||||
|
|
||||||
Or you can use our forgejo instance:
|
|
||||||
|
|
||||||
```
|
|
||||||
git clone https://git.poketube.fun/ashley/poke.git
|
|
||||||
```
|
|
||||||
|
|
||||||
Now, install the needed dependencies within the Poke folder:
|
|
||||||
( go to the folder by running cd poke)
|
|
||||||
```
|
|
||||||
npm install
|
|
||||||
```
|
|
||||||
|
|
||||||
Once everythings installed, start your server with the following command:
|
|
||||||
|
|
||||||
```
|
|
||||||
node server.js
|
|
||||||
```
|
|
||||||
|
|
||||||
Congrats, Poketube should now be running on `localhost:6003`!
|
|
||||||
|
|
||||||
### With Docker
|
|
||||||
Create a new directory for PokeTube:
|
|
||||||
```
|
|
||||||
mkdir poketube && cd poketube
|
|
||||||
```
|
|
||||||
|
|
||||||
Download the docker compose and config file:
|
|
||||||
```
|
|
||||||
curl -O https://codeberg.org/Ashley/poke/raw/branch/main/docker-compose.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
Run PokeTube:
|
|
||||||
```
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
PokeTube should be running on `http://localhost:6003`.
|
|
||||||
|
|
||||||
The port can be changed with the config file you downloaded, just change the `server_port` option.
|
|
||||||
|
|
||||||
## Hosting Image Proxy
|
|
||||||
|
|
||||||
see [here](https://codeberg.org/Ashley/poke/src/branch/main/january) :3
|
|
||||||
just uhh change the url in config.json to ur image proxy
|
|
||||||
|
|
||||||
## Poke community!
|
|
||||||
|
|
||||||
Join the community on [revolt](https://rvlt.gg/poketube) or [matrix](https://matrix.to/#/#poke:vern.cc) :3
|
|
||||||
|
|
||||||
## The Legal Stuff (boring tbh)
|
## The Legal Stuff (boring tbh)
|
||||||
the main parts of the project is Under GPL-3.0-OR-LATER :3
|
the main parts of the project is Under GPL-3.0-OR-LATER :3
|
||||||
|
|
||||||
see the each sections LICENSE tho!!
|
see the each sections LICENSE tho!!
|
||||||
Copyleft 2021-202x Poke Project
|
|
||||||
|
Copyleft 2021-202x Poke Project, mostly ashley0143 - poke does not support the ["source first"](https://sourcefirst.com/) or ["open source"](https://opensource.org) movement :3 - we support the free software movement (fsf.org)
|
||||||
|
|
||||||
|
|
||||||
[Code Of conduct](https://codeberg.org/Ashley/poke/src/branch/main/CODE_OF_CONDUCT.md)
|
[Code Of conduct](https://codeberg.org/Ashley/poke/src/branch/main/CODE_OF_CONDUCT.md)
|
||||||
@@ -168,11 +92,17 @@ Copyleft 2021-202x Poke Project
|
|||||||
|
|
||||||
TL;DR: we dont collect or share your personal info, that's it lol.
|
TL;DR: we dont collect or share your personal info, that's it lol.
|
||||||
|
|
||||||
We additionally use the GNU Coding Standard, see [this link.](https://www.gnu.org/prep/standards)
|
We use the GNU Coding Standard Thingy, see [this link.](https://www.gnu.org/prep/standards)
|
||||||
|
|
||||||
<div>
|
|
||||||
<h3>some parts of poketube.fun is proudly hosted on glitch.com since <i>2020</i> </h3>
|
<div align="center">
|
||||||
<a href="https://glitch.com/"><img src="https://cdn.glitch.global/d68d17bb-f2c0-4bc3-993f-50902734f652/glitch-fastly-lock-up.svg?v=1696671148266"></a><br><hr>
|
<p>Parts of Poke are hosted on Glitch.com since <i>2020</i>.</p>
|
||||||
<a href="https://gnu.org/not-open-source"><img width="200" src="https://autumn.revolt.chat/attachments/eNpfwV2C1_wudONe43YCvWr-4vbvLpG78HbuXgOYfO"></a>
|
<a href="https://glitch.com/">
|
||||||
|
<img src="https://cdn.glitch.global/d68d17bb-f2c0-4bc3-993f-50902734f652/glitch-fastly-lock-up.svg">
|
||||||
|
</a>
|
||||||
|
<br><hr>
|
||||||
|
<p> this software does not support <a href="https://opensource.org">"OSI"</a> - <a href="https://rationalwiki.org/wiki/Eric_S._Raymond#Open_Source">they are terrible people </a> - pls support the FSF/GNU (<a href="https://fsf.org">fsf.org</a> or <a href="https://gnu.org">gnu.org</a>) instead :3 </p>
|
||||||
|
<a href="https://gnu.org/not-open-source">
|
||||||
|
<img width="200" src="https://autumn.revolt.chat/attachments/eNpfwV2C1_wudONe43YCvWr-4vbvLpG78HbuXgOYfO">
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
25
ascii_txt.txt
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
|
||||||
|
_____ _______ _____ _____
|
||||||
|
/\ \ /::\ \ /\ \ /\ \
|
||||||
|
/::\ \ /::::\ \ /::\____\ /::\ \
|
||||||
|
/::::\ \ /::::::\ \ /:::/ / /::::\ \
|
||||||
|
/::::::\ \ /::::::::\ \ /:::/ / /::::::\ \
|
||||||
|
/:::/\:::\ \ /:::/~~\:::\ \ /:::/ / /:::/\:::\ \
|
||||||
|
/:::/__\:::\ \ /:::/ \:::\ \ /:::/____/ /:::/__\:::\ \
|
||||||
|
/::::\ \:::\ \ /:::/ / \:::\ \ /::::\ \ /::::\ \:::\ \
|
||||||
|
/::::::\ \:::\ \ /:::/____/ \:::\____\ /::::::\____\________ /::::::\ \:::\ \
|
||||||
|
/:::/\:::\ \:::\____\ |:::| | |:::| | /:::/\:::::::::::\ \ /:::/\:::\ \:::\ \
|
||||||
|
/:::/ \:::\ \:::| ||:::|____| |:::| |/:::/ |:::::::::::\____\/:::/__\:::\ \:::\____\
|
||||||
|
\::/ \:::\ /:::|____| \:::\ \ /:::/ / \::/ |::|~~~|~~~~~ \:::\ \:::\ \::/ /
|
||||||
|
\/_____/\:::\/:::/ / \:::\ \ /:::/ / \/____|::| | \:::\ \:::\ \/____/
|
||||||
|
\::::::/ / \:::\ /:::/ / |::| | \:::\ \:::\ \
|
||||||
|
\::::/ / \:::\__/:::/ / |::| | \:::\ \:::\____\
|
||||||
|
\::/____/ \::::::::/ / |::| | \:::\ \::/ /
|
||||||
|
~~ \::::::/ / |::| | \:::\ \/____/
|
||||||
|
\::::/ / |::| | \:::\ \
|
||||||
|
\::/____/ \::| | \:::\____\
|
||||||
|
~~ \:| | \::/ /
|
||||||
|
\|___| \/____/
|
||||||
|
|
||||||
|
|
||||||
1
backend-services/README.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
haii!! these files are made for the poke's server - if u wanna use them on ur server u might have to change the directories :p
|
||||||
40
backend-services/scripts/inv-refresh-token.sh
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (C) 2024-20xx Poke! (https://codeberg.org/ashley/poke)
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
scriptDir=$(dirname "$(readlink -f "$0")")
|
||||||
|
|
||||||
|
output=$(docker run quay.io/invidious/youtube-trusted-session-generator)
|
||||||
|
|
||||||
|
visitor_data=$(echo "$output" | grep -oP '(?<=visitor_data: )[^ ]+')
|
||||||
|
po_token=$(echo "$output" | grep -oP '(?<=po_token: )[^ ]+')
|
||||||
|
|
||||||
|
if [ -z "$visitor_data" ] || [ -z "$po_token" ]; then
|
||||||
|
echo "Error: Could not generate visitor_data or po_token."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
sed -i "s/visitor_data: .*/visitor_data: $visitor_data/g" $scriptDir/../services/invidious/docker-compose.yml
|
||||||
|
sed -i "s/po_token: .*/po_token: $po_token/g" $scriptDir/../services/invidious/docker-compose.yml
|
||||||
|
|
||||||
|
cd $scriptDir/../services/invidious
|
||||||
|
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
echo "Successfully updated visitor_data and po_token on Invidious."
|
||||||
|
|
||||||
164
backend-services/scripts/inv-restart-docker.sh
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (C) 2024-20xx Poke! (https://codeberg.org/ashley/poke)
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Function to generate a random Chrome version
|
||||||
|
generate_random_chrome_version() {
|
||||||
|
major=$((RANDOM % 100 + 1)) # Major version 1-99
|
||||||
|
minor=$((RANDOM % 100)) # Minor version 0-99
|
||||||
|
build=$((RANDOM % 10000)) # Build version 0-9999
|
||||||
|
patch=$((RANDOM % 100)) # Patch version 0-99
|
||||||
|
echo "$major.$minor.$build.$patch"
|
||||||
|
}
|
||||||
|
|
||||||
|
restart_services() {
|
||||||
|
echo "Restarting services..."
|
||||||
|
|
||||||
|
# Navigate to the script directory
|
||||||
|
scriptDir=$(dirname "$(readlink -f "$0")")
|
||||||
|
|
||||||
|
cd "$scriptDir/../services/invidious" || { echo "Error: Failed to navigate to $scriptDir/../services/invidious"; exit 1; }
|
||||||
|
|
||||||
|
docker compose down
|
||||||
|
echo "Services stopped. Restarting..."
|
||||||
|
|
||||||
|
docker compose up -d
|
||||||
|
echo "Services restarted successfully."
|
||||||
|
|
||||||
|
/home/qt/globe/scripts/inv-update-token.sh
|
||||||
|
}
|
||||||
|
|
||||||
|
fetch_playlist() {
|
||||||
|
local playlist_id="$1"
|
||||||
|
response=$(curl -s -w "%{http_code}" -o /tmp/playlist_data.json "https://invid-api.poketube.fun/api/v1/playlists/${playlist_id}")
|
||||||
|
|
||||||
|
if [ "$response" -eq 502 ] || [ "$response" -eq 500 ] || [ "$response" -eq 403 ]; then
|
||||||
|
echo "Error: Failed to fetch playlist data. HTTP Status: $response"
|
||||||
|
restart_services
|
||||||
|
return 1
|
||||||
|
elif [ "$response" -ne 200 ]; then
|
||||||
|
echo "Error: Failed to fetch playlist data. HTTP Status: $response"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
extract_video_ids() {
|
||||||
|
local json_data="$1"
|
||||||
|
video_ids=$(jq -r '.videos[].videoId' "$json_data")
|
||||||
|
if [ -z "$video_ids" ]; then
|
||||||
|
echo "Error: Failed to extract video IDs from the playlist data."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo "$video_ids"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Playlist IDs to fetch
|
||||||
|
playlist_ids=("PLMws9SCqJ1JCeVMVPsdamuUM0HK0MbA6g")
|
||||||
|
|
||||||
|
# Base URL for the API
|
||||||
|
base_url="http://localhost:54301/latest_version?id="
|
||||||
|
|
||||||
|
# Pick a random playlist (without using invalid options in shuf)
|
||||||
|
random_playlist_id="PLMC9KNkIncKvYin_USF1qoJQnIyMAfRxl"
|
||||||
|
echo "Randomly selected playlist: $random_playlist_id"
|
||||||
|
|
||||||
|
# Fetch playlist JSON data
|
||||||
|
fetch_playlist "$random_playlist_id"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Error: Playlist fetch failed. Restarting services..."
|
||||||
|
restart_services # Restart services before exiting
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extract video IDs from the playlist
|
||||||
|
video_ids=($(extract_video_ids "/tmp/playlist_data.json"))
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Error: Failed to extract video IDs. Exiting..."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Shuffle video IDs and pick 4 random videos
|
||||||
|
shuffled_video_ids=($(shuf -e "${video_ids[@]}" | head -n 4))
|
||||||
|
|
||||||
|
error_count=0
|
||||||
|
all_errors=(500 502 403)
|
||||||
|
|
||||||
|
for video_id in "${shuffled_video_ids[@]}"; do
|
||||||
|
# Add a cache buster query (unique random number)
|
||||||
|
unique_param=$RANDOM
|
||||||
|
url="${base_url}${video_id}&itag=18&local=true&_=${unique_param}"
|
||||||
|
|
||||||
|
# Generate a random Chrome version
|
||||||
|
chrome_version=$(generate_random_chrome_version)
|
||||||
|
|
||||||
|
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/$chrome_version Safari/537.36"
|
||||||
|
|
||||||
|
response_headers=$(curl -s -D - -H "Cache-Control: no-cache, no-store, must-revalidate" \
|
||||||
|
-H "Pragma: no-cache" -H "Expires: 0" -A "$user_agent" "$url" -o /dev/null)
|
||||||
|
|
||||||
|
# Extract ETag and last modified info (if available)
|
||||||
|
etag=$(echo "$response_headers" | grep -i ETag | awk '{print $2}' | tr -d '"')
|
||||||
|
last_modified=$(echo "$response_headers" | grep -i Last-Modified | cut -d' ' -f2-)
|
||||||
|
|
||||||
|
# Use conditional request if ETag is present
|
||||||
|
if [ -n "$etag" ]; then
|
||||||
|
status_code=$(curl -s -o /dev/null -w "%{http_code}" -H "If-None-Match: $etag" \
|
||||||
|
-H "Cache-Control: no-cache, no-store, must-revalidate" -A "$user_agent" "$url")
|
||||||
|
else
|
||||||
|
status_code=$(curl -s -o /dev/null -w "%{http_code}" -A "$user_agent" "$url")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Echo the status code for visibility
|
||||||
|
echo "Checking URL: $url"
|
||||||
|
echo "User Agent: $user_agent"
|
||||||
|
echo "HTTP Status Code for ID $video_id: $status_code"
|
||||||
|
|
||||||
|
if [[ " ${all_errors[@]} " =~ " ${status_code} " ]]; then
|
||||||
|
echo "Error: Received $status_code for ID $video_id."
|
||||||
|
error_count=$((error_count + 1))
|
||||||
|
|
||||||
|
# Run the token refresh script
|
||||||
|
echo "Running inv-update-token.sh for ID $video_id..."
|
||||||
|
/home/qt/globe/scripts/inv-update-token.sh
|
||||||
|
/home/qt/globe/scripts/inv-update-token.sh
|
||||||
|
echo "inv-update-token.sh script executed successfully."
|
||||||
|
|
||||||
|
# Fetch the video again after token refresh
|
||||||
|
status_code=$(curl -s -o /dev/null -w "%{http_code}" -A "$user_agent" "$url")
|
||||||
|
echo "Post-token-refresh Status Code for ID $video_id: $status_code"
|
||||||
|
|
||||||
|
# Check if it still results in 500/502/403 after refresh
|
||||||
|
if [[ " ${all_errors[@]} " =~ " ${status_code} " ]]; then
|
||||||
|
echo "Error: Received $status_code for ID $video_id after token refresh."
|
||||||
|
else
|
||||||
|
echo "Token refresh succeeded for ID $video_id."
|
||||||
|
fi
|
||||||
|
elif [ "$status_code" -eq 304 ]; then
|
||||||
|
echo "Content is still fresh for ID $video_id. No action required."
|
||||||
|
else
|
||||||
|
echo "we are so barack (Status code for ID $video_id is neither 502, 500, nor 403.)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "----------------****************----------------" # Separator for readability
|
||||||
|
done
|
||||||
|
|
||||||
|
# If all videos still resulted in 500/502/403 errors even after running inv-update-token.sh, try restaring
|
||||||
|
if [ "$error_count" -eq "${#shuffled_video_ids[@]}" ]; then
|
||||||
|
echo "All videos failed to load after running inv-update-token.sh. Restarting services..."
|
||||||
|
restart_services
|
||||||
|
fi
|
||||||
10
backend-services/services/yt-block-protect.service
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=YouTube anti-block
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/home/qt/globe/scripts/inv-restart-docker.sh
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
10
backend-services/services/yt-block-protect.timer
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Make yt anti-block Run every Minute
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnUnitActiveSec=1min
|
||||||
|
Unit=yt-block-protect.service
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
|
|
||||||
@@ -1,17 +1,19 @@
|
|||||||
{
|
{
|
||||||
"tubeApi": "https://inner-api.poketube.fun/api/",
|
"tubeApi": "https://inner-api.poketube.fun/api/",
|
||||||
"invapi": "https://invid-api.poketube.fun/api/v1",
|
"invapi": "https://invid-api.poketube.fun/bHj665PpYhUdPWuKPfZuQGoX/api/v1",
|
||||||
"dislikes": "https://returnyoutubedislikeapi.com/votes?videoId=",
|
"dislikes": "https://returnyoutubedislikeapi.com/votes?videoId=",
|
||||||
"invchannel": "https://invid-api.poketube.fun/api/v1",
|
"invchannel": "https://invid-api.poketube.fun/api/v1",
|
||||||
"p_url":"https://p.poketube.fun",
|
"p_url":"https://p.poketube.fun",
|
||||||
"media_proxy": "https://image-proxy.poketube.fun",
|
"media_proxy": "https://image-proxy.poketube.fun",
|
||||||
"videourl":"https://eu-proxy.poketube.fun",
|
"videourl":"https://eu-proxy.poketube.fun",
|
||||||
"email_main_url":"https://email-server.poketube.fun",
|
"email_main_url":"https://email-server.poketube.fun",
|
||||||
"mastodon_client_url":"https://fediverse.poketube.fun",
|
"mastodon_client_url":"https://social.poketube.fun",
|
||||||
|
"mastodon_client_server_name":"PokeSocial",
|
||||||
"libreoffice_online_url":"https://office.poketube.fun",
|
"libreoffice_online_url":"https://office.poketube.fun",
|
||||||
"cacher_max_age": "864000",
|
"cacher_max_age": "86400",
|
||||||
"enablealwayshttps": false,
|
"enablealwayshttps": false,
|
||||||
"proxylocation":"USA",
|
"proxylocation":"USA",
|
||||||
|
"banner":"welcome to poke!",
|
||||||
"t_url": "https://t.poketube.fun/",
|
"t_url": "https://t.poketube.fun/",
|
||||||
"server_port": "6003"
|
"server_port": "6003"
|
||||||
}
|
}
|
||||||
BIN
css/Pepe_party_4_transparent.gif
Normal file
|
After Width: | Height: | Size: 4.4 MiB |
BIN
css/Poke-Mobile.jpg
Normal file
|
After Width: | Height: | Size: 670 KiB |
BIN
css/README_PWA.jpg
Normal file
|
After Width: | Height: | Size: 236 KiB |
BIN
css/README_Preview.png
Normal file
|
After Width: | Height: | Size: 1000 KiB |
BIN
css/README_RYD.png
Normal file
|
After Width: | Height: | Size: 489 KiB |
160
css/app.js
@@ -17,26 +17,14 @@ d)).finalize(c)}}});var w=f.algo={};return f}(Math);
|
|||||||
c[d+n]|0;else{var r=a[n-15],g=a[n-2];a[n]=((r<<25|r>>>7)^(r<<14|r>>>18)^r>>>3)+a[n-7]+((g<<15|g>>>17)^(g<<13|g>>>19)^g>>>10)+a[n-16]}r=l+((p<<26|p>>>6)^(p<<21|p>>>11)^(p<<7|p>>>25))+(p&j^~p&k)+q[n]+a[n];g=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&m^f&m);l=k;k=j;j=p;p=h+r|0;h=m;m=f;f=e;e=r+g|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+m|0;b[3]=b[3]+h|0;b[4]=b[4]+p|0;b[5]=b[5]+j|0;b[6]=b[6]+k|0;b[7]=b[7]+l|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;
|
c[d+n]|0;else{var r=a[n-15],g=a[n-2];a[n]=((r<<25|r>>>7)^(r<<14|r>>>18)^r>>>3)+a[n-7]+((g<<15|g>>>17)^(g<<13|g>>>19)^g>>>10)+a[n-16]}r=l+((p<<26|p>>>6)^(p<<21|p>>>11)^(p<<7|p>>>25))+(p&j^~p&k)+q[n]+a[n];g=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&m^f&m);l=k;k=j;j=p;p=h+r|0;h=m;m=f;f=e;e=r+g|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+m|0;b[3]=b[3]+h|0;b[4]=b[4]+p|0;b[5]=b[5]+j|0;b[6]=b[6]+k|0;b[7]=b[7]+l|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;
|
||||||
d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=g.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=g._createHelper(f);s.HmacSHA256=g._createHmacHelper(f)})(Math);
|
d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=g.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=g._createHelper(f);s.HmacSHA256=g._createHmacHelper(f)})(Math);
|
||||||
|
|
||||||
// Get the current URL
|
const video = document.getElementById('video');
|
||||||
|
|
||||||
|
// Replaces the current URL without the 'fx' parameter
|
||||||
const url = new URL(window.location.href);
|
const url = new URL(window.location.href);
|
||||||
|
|
||||||
// Remove the 'fx' query parameter
|
|
||||||
url.searchParams.delete('fx');
|
url.searchParams.delete('fx');
|
||||||
|
|
||||||
// Replace the current URL without the 'fx' parameter
|
|
||||||
history.replaceState(null, '', url.toString());
|
history.replaceState(null, '', url.toString());
|
||||||
|
|
||||||
|
|
||||||
// Retrieve volume from local storage or set to max if not available
|
|
||||||
const initialVolume = localStorage.getItem('playerVolume') || 1;
|
|
||||||
const video = document.getElementById('video');
|
|
||||||
video.volume = initialVolume;
|
|
||||||
|
|
||||||
// Save volume to local storage whenever it changes
|
|
||||||
video.addEventListener('volumechange', function() {
|
|
||||||
localStorage.setItem('playerVolume', this.volume);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Get the progress bar and container elements
|
// Get the progress bar and container elements
|
||||||
const progressBar = document.querySelector(".progress-bar");
|
const progressBar = document.querySelector(".progress-bar");
|
||||||
const progressContainer = document.querySelector(".progress-container");
|
const progressContainer = document.querySelector(".progress-container");
|
||||||
@@ -82,6 +70,14 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
window.addEventListener('resize', lazyLoadBg);
|
window.addEventListener('resize', lazyLoadBg);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const htmlContent = `<!DOCTYPE html><html><head><title>Browser is not supported :p</title><style>body{margin-left:auto;margin-right:auto;display:flex;max-width:43em;font-family:sans-serif;background-color:white;}</style></head><body><h1>Heyo :3</h1><br><p style="margin-top:4em;margin-left:-7.4em;">hoi - poke does and <b>will not work</b> on Internet Explorer :p<br>if u wanna use poke try using Firefox (firefox.com) or Chromium :3<br>love u :3</p></body></html>`;
|
||||||
|
|
||||||
|
if (/MSIE \d|Trident.*rv:/.test(navigator.userAgent)) {
|
||||||
|
document.open();
|
||||||
|
document.write(htmlContent);
|
||||||
|
document.close();
|
||||||
|
}
|
||||||
|
|
||||||
// Fade in elements on scroll or fullscreen change
|
// Fade in elements on scroll or fullscreen change
|
||||||
function fadeInElements() {
|
function fadeInElements() {
|
||||||
const elements = document.querySelectorAll('.fade-in');
|
const elements = document.querySelectorAll('.fade-in');
|
||||||
@@ -103,12 +99,19 @@ function jumpToTime(e) {
|
|||||||
const video = document.getElementById('video');
|
const video = document.getElementById('video');
|
||||||
const time = link.dataset.jumpTime;
|
const time = link.dataset.jumpTime;
|
||||||
|
|
||||||
|
const qualityforaudiostuff = new URLSearchParams(window.location.search).get("quality") || "";
|
||||||
|
|
||||||
|
if (qualityforaudiostuff !== "medium") {
|
||||||
|
var audiojumptotime = document.getElementById('aud');
|
||||||
|
audiojumptotime.currentTime = time;
|
||||||
|
}
|
||||||
|
|
||||||
video.currentTime = time;
|
video.currentTime = time;
|
||||||
|
|
||||||
window.location.hash = 'top'; // Add #video to the URL
|
window.location.hash = 'top'; // Add #top to the URL
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
history.replaceState(null, null, ' '); // Remove #video after 1 second
|
history.replaceState(null, null, ' '); // Remove #top after 250MS
|
||||||
}, 250);
|
}, 250);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,10 +136,8 @@ const videoPlayer = document.getElementById('video');
|
|||||||
function time(seconds) {
|
function time(seconds) {
|
||||||
videoPlayer.currentTime = seconds;
|
videoPlayer.currentTime = seconds;
|
||||||
|
|
||||||
// Add #video to the URL
|
|
||||||
window.location.hash = 'top';
|
window.location.hash = 'top';
|
||||||
|
|
||||||
// Remove #video after a short delay
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
history.replaceState(null, null, ' ');
|
history.replaceState(null, null, ' ');
|
||||||
}, 250);
|
}, 250);
|
||||||
@@ -161,44 +162,9 @@ function time(seconds) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Save and resume video progress
|
|
||||||
const videoId = new URLSearchParams(window.location.search).get('v');
|
|
||||||
const localStorageKey = `progress-${videoId}`;
|
|
||||||
|
|
||||||
function saveProgress() {
|
|
||||||
localStorage.setItem(localStorageKey, video.currentTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeProgress() {
|
|
||||||
localStorage.removeItem(localStorageKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
function resumeProgress() {
|
|
||||||
const progress = localStorage.getItem(localStorageKey);
|
|
||||||
if (progress) {
|
|
||||||
video.currentTime = progress;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
window.addEventListener('beforeunload', () => {
|
|
||||||
saveProgress();
|
|
||||||
});
|
|
||||||
|
|
||||||
video.addEventListener('ended', () => {
|
|
||||||
removeProgress();
|
|
||||||
});
|
|
||||||
|
|
||||||
window.addEventListener('load', () => {
|
|
||||||
resumeProgress();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Adjust video element style on fullscreen change
|
|
||||||
const videoElement = document.getElementById("video");
|
const videoElement = document.getElementById("video");
|
||||||
videoElement.addEventListener("fullscreenchange", () => {
|
videoElement.addEventListener("fullscreenchange", () => {
|
||||||
videoElement.style.borderRadius = document.fullscreenElement === videoElement ? "0em" : "16px";
|
videoElement.style.borderRadius = document.fullscreenElement === videoElement ? "0em !important" : "16px";
|
||||||
});
|
});
|
||||||
|
|
||||||
function fetchUrls(urls) {
|
function fetchUrls(urls) {
|
||||||
@@ -336,50 +302,60 @@ video.addEventListener("contextmenu", function(event) {
|
|||||||
|
|
||||||
loopedIndicator.style.display = "none"; // Initially hide the indicator
|
loopedIndicator.style.display = "none"; // Initially hide the indicator
|
||||||
|
|
||||||
loopOption.addEventListener("click", function() {
|
loopOption.addEventListener("click", function() {
|
||||||
var looped = video.loop;
|
const quaindt = new URLSearchParams(window.location.search).get("quality") || "";
|
||||||
video.loop = !looped;
|
|
||||||
|
|
||||||
|
var looped = video.loop;
|
||||||
|
video.loop = !looped;
|
||||||
|
|
||||||
// Update the looped indicator popup
|
if (quaindt !== "medium") {
|
||||||
var displaySpecialText = Math.random() < 0.5;
|
var loopedaudioelement = document.getElementById("aud");
|
||||||
|
if (loopedaudioelement) {
|
||||||
|
loopedaudioelement.loop = !looped;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Update the looped indicator popup
|
var displaySpecialText = Math.random() < 0.5;
|
||||||
if (displaySpecialText) {
|
|
||||||
var specialText = looped ? "Unlooped >.<" : "Looped~ :3 >~<";
|
|
||||||
loopedIndicator.textContent = specialText;
|
|
||||||
} else {
|
|
||||||
loopedIndicator.textContent = looped ? "Unlooped!" : "Looped!";
|
|
||||||
}
|
|
||||||
loopedIndicator.style.display = "block";
|
|
||||||
|
|
||||||
// Hide the indicator after 2 seconds
|
if (displaySpecialText) {
|
||||||
setTimeout(function() {
|
var specialText = looped ? "Unlooped >.<" : "Looped~ :3 >~<";
|
||||||
loopedIndicator.style.display = "none";
|
loopedIndicator.textContent = specialText;
|
||||||
}, 2000);
|
} else {
|
||||||
|
loopedIndicator.textContent = looped ? "Unlooped!" : "Looped!";
|
||||||
|
}
|
||||||
|
loopedIndicator.style.display = "block";
|
||||||
|
|
||||||
});
|
// Hide the indicator after 2 seconds
|
||||||
|
setTimeout(function() {
|
||||||
|
loopedIndicator.style.display = "none";
|
||||||
|
}, 2000);
|
||||||
|
});
|
||||||
|
|
||||||
speedOption.addEventListener("click", function() {
|
speedOption.addEventListener("click", function() {
|
||||||
var currentSpeed = video.playbackRate;
|
var currentSpeed = video.playbackRate;
|
||||||
var newSpeed = getNextSpeed(currentSpeed);
|
var newSpeed = getNextSpeed(currentSpeed);
|
||||||
video.playbackRate = newSpeed;
|
|
||||||
speedOption.innerHTML = "<i class='fa-light fa-gauge'></i> Speed: " + newSpeed.toFixed(2) + "x";
|
video.playbackRate = newSpeed;
|
||||||
});
|
document.getElementById("aud").playbackRate = newSpeed;
|
||||||
|
speedOption.innerHTML = "<i class='fa-light fa-gauge'></i> Speed: " + newSpeed.toFixed(2) + "x";
|
||||||
|
});
|
||||||
|
|
||||||
|
function getNextSpeed(currentSpeed) {
|
||||||
|
var maxSpeed = (navigator.hardwareConcurrency < 3) ? 1 : 2; // Limit max speed based on CPU cores - for optimization
|
||||||
|
|
||||||
|
if (currentSpeed === maxSpeed) {
|
||||||
|
return 0.25;
|
||||||
|
} else if (currentSpeed === 0.25) {
|
||||||
|
return 0.5;
|
||||||
|
} else if (currentSpeed === 0.5) {
|
||||||
|
return 0.75;
|
||||||
|
} else if (currentSpeed === 0.75) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return maxSpeed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function getNextSpeed(currentSpeed) {
|
|
||||||
if (currentSpeed === 2) {
|
|
||||||
return 0.25;
|
|
||||||
} else if (currentSpeed === 0.25) {
|
|
||||||
return 0.5;
|
|
||||||
} else if (currentSpeed === 0.5) {
|
|
||||||
return 0.75;
|
|
||||||
} else if (currentSpeed === 0.75) {
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const GoogleTranslateEndpoint = "https://translate.google.com/_/TranslateWebserverUi/data/batchexecute?rpcids=MkEWBc&rt=c"
|
const GoogleTranslateEndpoint = "https://translate.google.com/_/TranslateWebserverUi/data/batchexecute?rpcids=MkEWBc&rt=c"
|
||||||
// @license-end
|
// @license-end
|
||||||
BIN
css/bg-720.webm
BIN
css/bg-full.webm
26
css/chatgptlogo.svg
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<svg
|
||||||
|
width="16"
|
||||||
|
height="16"
|
||||||
|
viewBox="0 0 16 16"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<style>
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
.favicon-stroke {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
.favicon-bg {
|
||||||
|
fill: #0d0d0d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<rect class="favicon-bg" width="16" height="16" rx="4" fill="white" />
|
||||||
|
<g>
|
||||||
|
<path
|
||||||
|
class="favicon-stroke"
|
||||||
|
d="M12.9851 6.93777C13.1163 6.54364 13.1618 6.12607 13.1186 5.71295C13.0754 5.29983 12.9444 4.90072 12.7344 4.54231C12.4232 4.00021 11.9478 3.57101 11.3768 3.31664C10.8058 3.06227 10.1687 2.99589 9.55751 3.12706C9.28184 2.81639 8.943 2.56818 8.56362 2.39905C8.18425 2.22993 7.77314 2.14379 7.3578 2.1464C6.73292 2.1449 6.1237 2.34187 5.61797 2.70892C5.11225 3.07598 4.73616 3.59415 4.54391 4.18873C4.13684 4.27206 3.75225 4.44139 3.41591 4.68539C3.07957 4.92938 2.79924 5.24241 2.59368 5.60352C2.27994 6.14413 2.14602 6.77039 2.21123 7.39205C2.27644 8.01367 2.5374 8.59851 2.95649 9.06224C2.82527 9.45637 2.77975 9.87394 2.82297 10.2871C2.8662 10.7002 2.99718 11.0993 3.20713 11.4577C3.51841 11.9998 3.99385 12.4289 4.56484 12.6833C5.13584 12.9377 5.77289 13.0041 6.38407 12.8729C6.65975 13.1836 6.99862 13.4318 7.37796 13.601C7.75734 13.7701 8.16844 13.8562 8.58379 13.8536C9.20899 13.8552 9.81853 13.6582 10.3244 13.2909C10.8304 12.9236 11.2065 12.4051 11.3986 11.8101C11.8057 11.7268 12.1903 11.5575 12.5266 11.3135C12.8629 11.0695 13.1433 10.7564 13.3488 10.3953C13.6622 9.85477 13.7958 9.22866 13.7304 8.60726C13.6651 7.98587 13.4041 7.40129 12.9851 6.93777ZM8.58472 13.0883C8.0715 13.089 7.57441 12.9093 7.18031 12.5805C7.19808 12.5708 7.22925 12.5537 7.24956 12.5413L9.58061 11.1948C9.63911 11.1615 9.6877 11.1133 9.72136 11.055C9.75505 10.9967 9.77258 10.9305 9.77217 10.8632V7.57684L10.7575 8.14576C10.7626 8.14834 10.7671 8.15214 10.7704 8.15685C10.7738 8.16157 10.7759 8.16704 10.7766 8.17275V10.8943C10.7759 11.4756 10.5448 12.0329 10.1339 12.4441C9.72308 12.8554 9.16599 13.087 8.58472 13.0883ZM3.87091 11.075C3.61385 10.6309 3.5212 10.1105 3.60918 9.60485C3.62649 9.61524 3.65673 9.6337 3.67842 9.64617L6.00947 10.9926C6.06756 11.0266 6.13365 11.0445 6.20094 11.0445C6.2682 11.0445 6.33428 11.0266 6.39238 10.9926L9.23834 9.34936V10.4872C9.23867 10.493 9.23755 10.4988 9.23509 10.5041C9.23264 10.5094 9.22892 10.5139 9.22427 10.5174L6.86782 11.878C6.36379 12.1683 5.76516 12.2467 5.20333 12.0962C4.64148 11.9457 4.1623 11.5784 3.87091 11.075ZM3.25768 5.98617C3.51363 5.54141 3.91789 5.2009 4.39966 5.02421C4.39966 5.04429 4.39851 5.07985 4.39851 5.10452V7.79747C4.3981 7.86473 4.41561 7.93087 4.44924 7.98915C4.48287 8.04739 4.5314 8.09563 4.58984 8.1289L7.4358 9.77197L6.45054 10.3409C6.44568 10.3441 6.44009 10.346 6.43429 10.3465C6.4285 10.3471 6.42265 10.3462 6.41729 10.3439L4.06062 8.98216C3.55747 8.69077 3.19039 8.21176 3.03987 7.65013C2.88935 7.08853 2.96768 6.49014 3.25768 5.98617ZM11.3527 7.86994L8.50669 6.22667L9.49198 5.65799C9.49684 5.6548 9.50243 5.65283 9.50823 5.65231C9.51402 5.65178 9.51985 5.65272 9.5252 5.655L11.8819 7.01554C12.2429 7.2241 12.5371 7.53119 12.7299 7.90087C12.9228 8.27056 13.0063 8.68752 12.9707 9.10295C12.9351 9.51839 12.7819 9.91509 12.5291 10.2466C12.2762 10.5781 11.9341 10.8307 11.5428 10.9749C11.5428 10.9546 11.5428 10.919 11.5428 10.8943V8.20137C11.5434 8.13423 11.5261 8.06814 11.4926 8.0099C11.4592 7.95165 11.4109 7.90336 11.3527 7.86994ZM12.3333 6.394C12.316 6.38337 12.2858 6.36514 12.2641 6.3527L9.93303 5.00621C9.87493 4.97232 9.80887 4.95444 9.74158 4.95444C9.67432 4.95444 9.60824 4.97232 9.55014 5.00621L6.70418 6.64951V5.51167C6.70386 5.50585 6.70497 5.50005 6.70743 5.49479C6.70988 5.48952 6.7136 5.48492 6.71826 5.48144L9.0747 4.12203C9.4357 3.91387 9.84853 3.81281 10.2649 3.83068C10.6812 3.84856 11.0838 3.98462 11.4257 4.22296C11.7675 4.46129 12.0344 4.79204 12.1951 5.17652C12.3559 5.56099 12.4038 5.98327 12.3333 6.394ZM6.16851 8.42203L5.18299 7.85311C5.17784 7.85053 5.17336 7.84673 5.17002 7.84202C5.16668 7.8373 5.16455 7.83183 5.16385 7.82609V5.10452C5.16411 4.6877 5.28311 4.27956 5.5069 3.9279C5.73071 3.57623 6.05006 3.29559 6.42756 3.11883C6.80507 2.94206 7.22509 2.87649 7.63851 2.92977C8.05195 2.98306 8.44163 3.153 8.76197 3.41971C8.74421 3.42941 8.71327 3.44649 8.69272 3.45895L6.36168 4.80542C6.30317 4.83867 6.25462 4.8869 6.22093 4.94516C6.18727 5.0034 6.16974 5.06958 6.17012 5.13683L6.16851 8.42203ZM6.70371 7.26803L7.97126 6.53595L9.23878 7.26757V8.73127L7.97126 9.46292L6.70371 8.73127V7.26803Z"
|
||||||
|
fill="#0D0D0D"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.4 KiB |
131
css/landing.css
@@ -719,76 +719,12 @@ li > a {cursor: var(--pointer-cursor)}
|
|||||||
.btn {cursor: var(--pointer-cursor) !important}
|
.btn {cursor: var(--pointer-cursor) !important}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "PokeTube Flex";
|
|
||||||
src: url("https://p.poketube.fun/https://cdn.glitch.global/43b6691a-c8db-41d4-921c-8cf6aa0d9108/robotoflex.ttf?v=16683434286881");
|
src: url("https://p.poketube.fun/https://cdn.glitch.global/43b6691a-c8db-41d4-921c-8cf6aa0d9108/robotoflex.ttf?v=16683434286881");
|
||||||
|
font-family: "PokeTube Flex";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-stretch: 1% 800%;
|
font-stretch: 1% 800%;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
blockquote {
|
|
||||||
background: #f2dda8;
|
|
||||||
margin: 0;
|
|
||||||
padding: 6px 12px;
|
|
||||||
border-radius: 4px;
|
|
||||||
color: #000;
|
|
||||||
position: sticky;
|
|
||||||
top: 12px;
|
|
||||||
z-index: 5;
|
|
||||||
}
|
|
||||||
.header-content {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
height: 100px;
|
|
||||||
}
|
|
||||||
.header-content-start img {
|
|
||||||
width: 140px;
|
|
||||||
}
|
|
||||||
.header-content-end a {
|
|
||||||
color: #fff;
|
|
||||||
padding: 10px 12px;
|
|
||||||
border-radius: 50px;
|
|
||||||
}
|
|
||||||
.header-content-end a:hover {
|
|
||||||
background: #ffffff2e;
|
|
||||||
}
|
|
||||||
#fname {
|
|
||||||
background: #331a22;
|
|
||||||
border: 2px #612153 solid;
|
|
||||||
padding: 8px 16px;
|
|
||||||
border-radius: 24px;
|
|
||||||
color: #fff;
|
|
||||||
margin-right: 6px;
|
|
||||||
}
|
|
||||||
#fname:focus {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
button[type="submit"] {
|
|
||||||
color: #fff;
|
|
||||||
background: #331a22;
|
|
||||||
border: 2px #612153 solid;
|
|
||||||
border-radius: 24px;
|
|
||||||
padding: 8px 10px;
|
|
||||||
cursor: var(--pointer-cursor);
|
|
||||||
}
|
|
||||||
button[type="submit"]:hover {
|
|
||||||
background: #ffffff2e;
|
|
||||||
}
|
|
||||||
.footer {
|
|
||||||
border-top: 1px #ffffff1f solid;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
height: 100px;
|
|
||||||
margin-top: auto;
|
|
||||||
}
|
|
||||||
.footer a {
|
|
||||||
color: #fff;
|
|
||||||
margin-left: 12px;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
@media only screen and (max-width: 1328px) {
|
@media only screen and (max-width: 1328px) {
|
||||||
body {
|
body {
|
||||||
padding: 0 48px !important;
|
padding: 0 48px !important;
|
||||||
@@ -823,20 +759,20 @@ button[type="submit"]:hover {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.landing {
|
.landing {
|
||||||
text-align: center;
|
|
||||||
margin: auto;
|
margin: auto;
|
||||||
|
position: relative;
|
||||||
|
margin-top: 240px;
|
||||||
|
max-width: 1200px;
|
||||||
}
|
}
|
||||||
.landing h1 {
|
.landing h1 {
|
||||||
font-size: xxx-large;
|
font-size: xxx-large;
|
||||||
font-family: "PokeTube flex";
|
font-family: "PokeTube flex";
|
||||||
font-stretch: ultra-expanded;
|
font-stretch: ultra-expanded;
|
||||||
font-weight: 1000;
|
font-weight: 1000;
|
||||||
text-align: center;
|
|
||||||
}
|
}
|
||||||
.landing img {
|
.landing img {
|
||||||
width: 100%;
|
|
||||||
margin-top: 48px;
|
margin-top: 48px;
|
||||||
height: 700px;
|
height: 503px;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
object-position: top;
|
object-position: top;
|
||||||
mask-image: linear-gradient(#5315ff,#0000);
|
mask-image: linear-gradient(#5315ff,#0000);
|
||||||
@@ -854,7 +790,6 @@ button[type="submit"]:hover {
|
|||||||
}
|
}
|
||||||
.features {
|
.features {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
|
||||||
}
|
}
|
||||||
.features p {
|
.features p {
|
||||||
border-radius: 48px;
|
border-radius: 48px;
|
||||||
@@ -870,6 +805,53 @@ button[type="submit"]:hover {
|
|||||||
border-radius: 24px;
|
border-radius: 24px;
|
||||||
margin: -10px 10px -10px -24px;
|
margin: -10px 10px -10px -24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
img[src="/static/poke-chan-outfit-a.png"] {
|
||||||
|
height: 400px;
|
||||||
|
width: 369px;
|
||||||
|
mask-image: none;
|
||||||
|
z-index: 5;
|
||||||
|
transform: scaleX(1);
|
||||||
|
float: right;
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
right: 10px;
|
||||||
|
margin: -237px -60px 0px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.new-feature-set {
|
||||||
|
display: grid;
|
||||||
|
margin: 54px 0px 24px 0px;
|
||||||
|
max-width: 1200px;
|
||||||
|
grid-template-columns: repeat(auto-fit,minmax(350px,1fr));
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.feature-set {
|
||||||
|
padding: 32px;
|
||||||
|
}
|
||||||
|
.feature-set p {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-set svg {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
border-radius: 5rem;
|
||||||
|
padding: 6px;
|
||||||
|
}
|
||||||
|
.feature-set-title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
justify-content: left;
|
||||||
|
}
|
||||||
|
.feature-set-title h2 {
|
||||||
|
font-family: "PokeTube flex";
|
||||||
|
font-stretch: ultra-expanded;
|
||||||
|
font-weight: 1000;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: 1420px) {
|
@media only screen and (max-width: 1420px) {
|
||||||
.landing {
|
.landing {
|
||||||
width: calc(100% - 24px);
|
width: calc(100% - 24px);
|
||||||
@@ -911,3 +893,12 @@ video {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.adaptive-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit,minmax(350px,1fr));
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: auto;
|
||||||
|
grid-gap: 12px;
|
||||||
|
}
|
||||||
|
|||||||
33
css/maps.js
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
var bbox = "?bbox=-165.76171875000003%2C-3.864254615721396%2C30.410156250000004%2C72.44879155730672&layer=mapnik"
|
||||||
|
var iframe = document.getElementById('myFrame');
|
||||||
|
iframe.src=`https://www.openstreetmap.org/export/embed.html${bbox}`
|
||||||
|
iframe.addEventListener('load', function() {
|
||||||
|
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
|
||||||
|
var links = iframeDocument.getElementsByTagName('a');
|
||||||
|
for (var i = 0; i < links.length; i++) {
|
||||||
|
links[i].addEventListener('click', function(event) {
|
||||||
|
var url = event.target.href;
|
||||||
|
if (url.includes('www.openstreetmap.org')) {
|
||||||
|
event.preventDefault();
|
||||||
|
iframe.src = url;
|
||||||
|
window.history.pushState(null, '', url);
|
||||||
|
} else {
|
||||||
|
window.location.href = url;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onpopstate = function(event) {
|
||||||
|
iframe.src = window.location.href;
|
||||||
|
};
|
||||||
|
|
||||||
|
iframe.addEventListener('load', function() {
|
||||||
|
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
|
||||||
|
var elements = iframeDocument.querySelectorAll('[style*="//dka575ofm4ao0.cloudfront.net"]');
|
||||||
|
for (var i = 0; i < elements.length; i++) {
|
||||||
|
var style = elements[i].style.backgroundImage;
|
||||||
|
var newStyle = style.replace('//dka575ofm4ao0.cloudfront.net', 'https://p.poketube.fun/https://dka575ofm4ao0.cloudfront.net');
|
||||||
|
elements[i].style.backgroundImage = newStyle;
|
||||||
|
}
|
||||||
|
});
|
||||||
1464
css/player-base.js
Normal file
BIN
css/poke-chan-v2.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
css/poke-screnshot-v2.png
Normal file
|
After Width: | Height: | Size: 1020 KiB |
@@ -73,8 +73,8 @@
|
|||||||
|
|
||||||
:root {
|
:root {
|
||||||
/* text */
|
/* text */
|
||||||
--text-link: #0ab7f0;
|
--text-link: #f08;
|
||||||
--text-link-visited: #00c0ff;
|
--text-link-visited: #f08;
|
||||||
--text-color: #ffffff;
|
--text-color: #ffffff;
|
||||||
--text-font-primary: "PokeTube Flex";
|
--text-font-primary: "PokeTube Flex";
|
||||||
--text-header-weight: 1000;
|
--text-header-weight: 1000;
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
#623aa2 100%,
|
#623aa2 100%,
|
||||||
#8e6f7e 100%
|
#8e6f7e 100%
|
||||||
);
|
);
|
||||||
--div-border-color: #7c44a0;
|
--div-border-color: #df03a8;
|
||||||
--div-prim-bg: #1c1c1c;
|
--div-prim-bg: #1c1c1c;
|
||||||
--div-second-bg: #1a1a1a;
|
--div-second-bg: #1a1a1a;
|
||||||
--div-transparent-bg: #0009;
|
--div-transparent-bg: #0009;
|
||||||
@@ -414,7 +414,7 @@ a.avatar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.subscribe-button {
|
.subscribe-button {
|
||||||
color: red;
|
color: #ff0033;
|
||||||
margin: auto;
|
margin: auto;
|
||||||
background: white;
|
background: white;
|
||||||
border-radius: 2em;
|
border-radius: 2em;
|
||||||
@@ -426,7 +426,7 @@ a.avatar {
|
|||||||
color: black !important;
|
color: black !important;
|
||||||
font-family: var(--text-font-primary);
|
font-family: var(--text-font-primary);
|
||||||
font-stretch: ultra-expanded;
|
font-stretch: ultra-expanded;
|
||||||
font-weight: 900;
|
font-weight: 1000;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -437,7 +437,7 @@ a.avatar {
|
|||||||
padding: 2px;
|
padding: 2px;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
font-family: var(--text-font-primary);
|
font-family: var(--text-font-primary);
|
||||||
font-stretch: 100%;
|
font-stretch: extra-expanded;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -497,7 +497,7 @@ a.avatar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.video:hover > .thumbnail {
|
.video:hover > .thumbnail {
|
||||||
border: 1px var(--text-link) solid;
|
border: 1px #ff0033 solid;
|
||||||
transition-duration: 150ms;
|
transition-duration: 150ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -576,6 +576,14 @@ a.avatar {
|
|||||||
background-color: var(--context-menu-background);
|
background-color: var(--context-menu-background);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media (min-height: 1079px) {
|
||||||
|
.dropdown__menu {
|
||||||
|
background-color: #222022d6;
|
||||||
|
backdrop-filter: blur(20px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.dropdown__item {
|
.dropdown__item {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
@@ -591,6 +599,7 @@ a.avatar {
|
|||||||
|
|
||||||
.dropdown__item:hover {
|
.dropdown__item:hover {
|
||||||
background-color: var(--chip-background-hover);
|
background-color: var(--chip-background-hover);
|
||||||
|
border-radius: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dropdown__item:active {
|
.dropdown__item:active {
|
||||||
@@ -731,30 +740,30 @@ a.new-button:hover {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.v:checked ~ .div_box {
|
.v:checked~.div_box {
|
||||||
display: flex;
|
display:flex;
|
||||||
margin-top: -51em;
|
margin-top:-51em;
|
||||||
text-align: left;
|
text-align:left;
|
||||||
background: #0009;
|
background:#0009;
|
||||||
border-radius: 10px;
|
border-radius:10px;
|
||||||
height: fit-content;
|
height:fit-content;
|
||||||
padding: 10px;
|
padding:10px;
|
||||||
font-family: "ubuntu", sans-serif;
|
font-family:ubuntu,sans-serif;
|
||||||
margin-left: -11em;
|
width:43em;
|
||||||
width: 43em;
|
position:absolute;
|
||||||
position: absolute;
|
white-space:-moz-pre-wrap!important;
|
||||||
white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
|
white-space:-pre-wrap;
|
||||||
white-space: -pre-wrap; /* Opera 4-6 */
|
white-space:-o-pre-wrap;
|
||||||
white-space: -o-pre-wrap; /* Opera 7 */
|
white-space:pre-wrap;
|
||||||
white-space: pre-wrap; /* css-3 */
|
word-wrap:break-word;
|
||||||
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
white-space:-webkit-pre-wrap;
|
||||||
white-space: -webkit-pre-wrap; /* Newer versions of Chrome/Safari*/
|
word-break:break-all;
|
||||||
word-break: break-all;
|
white-space:normal;
|
||||||
white-space: normal;
|
height:-moz-fit-content;
|
||||||
height: -moz-fit-content;
|
height:-webkit-fit-content;
|
||||||
height: -webkit-fit-content;
|
max-width:708px;
|
||||||
max-width: 708px;
|
max-height:185.6px;
|
||||||
max-height: 185.6px;
|
margin-right: 13em;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 1400px) {
|
@media screen and (min-width: 1400px) {
|
||||||
@@ -783,6 +792,23 @@ a.new-button:hover {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.pwp {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: end;
|
||||||
|
gap: 6px;
|
||||||
|
padding: 16px 0px;
|
||||||
|
}
|
||||||
|
.pwp a, .fnt {
|
||||||
|
background: #452f37;
|
||||||
|
border-radius: 6px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
padding: 6px 12px;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
.hj:checked ~ .flying_cmnt {
|
.hj:checked ~ .flying_cmnt {
|
||||||
display: grid;
|
display: grid;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@@ -813,8 +839,14 @@ marquee {
|
|||||||
display:none;
|
display:none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media screen and (max-height: 840px) {
|
||||||
|
.theatermodeon {
|
||||||
|
max-height: 10% !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#video:target {
|
#video:target {
|
||||||
object-fit:none;
|
object-fit:contain;
|
||||||
}
|
}
|
||||||
|
|
||||||
#secret-theme:target{
|
#secret-theme:target{
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 2.4 MiB |
BIN
css/red-tape.png
Normal file
|
After Width: | Height: | Size: 263 KiB |
@@ -1035,3 +1035,10 @@ a.icon-button > img {
|
|||||||
width: 500px;
|
width: 500px;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
}
|
}
|
||||||
|
.search-options {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-evenly;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 855px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
BIN
css/twitter-logo.jpeg
Normal file
|
After Width: | Height: | Size: 44 KiB |
440
css/videojs-plugin-hotkeys.js
Normal file
@@ -0,0 +1,440 @@
|
|||||||
|
/*
|
||||||
|
* Video.js Hotkeys For Poke
|
||||||
|
* https://github.com/ctd1500/videojs-hotkeys
|
||||||
|
*
|
||||||
|
* forked for poke - non-fork version copyright:
|
||||||
|
* Copyright (c) 2015 Chris Dougherty
|
||||||
|
* Licensed under the Apache-2.0 license.
|
||||||
|
*
|
||||||
|
* fork copy(left)right:
|
||||||
|
* Copyleft (c) 2024 Poke (Ashley)
|
||||||
|
* Licensed under the GNU GPL 3.0 or later license.
|
||||||
|
*/
|
||||||
|
|
||||||
|
;(function(root, factory) {
|
||||||
|
if (typeof window !== 'undefined' && window.videojs) {
|
||||||
|
factory(window.videojs);
|
||||||
|
} else if (typeof define === 'function' && define.amd) {
|
||||||
|
define('videojs-hotkeys', ['video.js'], function (module) {
|
||||||
|
return factory(module.default || module);
|
||||||
|
});
|
||||||
|
} else if (typeof module !== 'undefined' && module.exports) {
|
||||||
|
var videojs = require('video.js');
|
||||||
|
module.exports = factory(videojs.default || videojs);
|
||||||
|
}
|
||||||
|
}(this, function (videojs) {
|
||||||
|
"use strict";
|
||||||
|
if (typeof window !== 'undefined') {
|
||||||
|
window['videojs_hotkeys'] = { version: "0.2.29-poke" };
|
||||||
|
}
|
||||||
|
|
||||||
|
var hotkeys = function(options) {
|
||||||
|
var player = this;
|
||||||
|
var pEl = player.el();
|
||||||
|
var doc = document;
|
||||||
|
var def_options = {
|
||||||
|
volumeStep: 0.1,
|
||||||
|
seekStep: 5,
|
||||||
|
enableMute: false,
|
||||||
|
enableVolumeScroll: false,
|
||||||
|
enableHoverScroll: false,
|
||||||
|
enableFullscreen: true,
|
||||||
|
enableNumbers: true,
|
||||||
|
enableJogStyle: false,
|
||||||
|
alwaysCaptureHotkeys: false,
|
||||||
|
captureDocumentHotkeys: false,
|
||||||
|
documentHotkeysFocusElementFilter: function () { return false },
|
||||||
|
enableModifiersForNumbers: true,
|
||||||
|
enableInactiveFocus: true,
|
||||||
|
skipInitialFocus: false,
|
||||||
|
playPauseKey: playPauseKey,
|
||||||
|
rewindKey: rewindKey,
|
||||||
|
forwardKey: forwardKey,
|
||||||
|
volumeUpKey: volumeUpKey,
|
||||||
|
volumeDownKey: volumeDownKey,
|
||||||
|
muteKey: muteKey,
|
||||||
|
fullscreenKey: fullscreenKey,
|
||||||
|
customKeys: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
var cPlay = 1,
|
||||||
|
cRewind = 2,
|
||||||
|
cForward = 3,
|
||||||
|
cVolumeUp = 4,
|
||||||
|
cVolumeDown = 5,
|
||||||
|
cMute = 6,
|
||||||
|
cFullscreen = 7;
|
||||||
|
|
||||||
|
// Use built-in merge function from Video.js v5.0+ or v4.4.0+
|
||||||
|
var mergeOptions = videojs.mergeOptions || videojs.util.mergeOptions;
|
||||||
|
options = mergeOptions(def_options, options || {});
|
||||||
|
|
||||||
|
var volumeStep = options.volumeStep,
|
||||||
|
seekStep = options.seekStep,
|
||||||
|
enableMute = options.enableMute,
|
||||||
|
enableVolumeScroll = options.enableVolumeScroll,
|
||||||
|
enableHoverScroll = options.enableHoverScroll,
|
||||||
|
enableFull = options.enableFullscreen,
|
||||||
|
enableNumbers = options.enableNumbers,
|
||||||
|
enableJogStyle = options.enableJogStyle,
|
||||||
|
alwaysCaptureHotkeys = options.alwaysCaptureHotkeys,
|
||||||
|
captureDocumentHotkeys = options.captureDocumentHotkeys,
|
||||||
|
documentHotkeysFocusElementFilter = options.documentHotkeysFocusElementFilter,
|
||||||
|
enableModifiersForNumbers = options.enableModifiersForNumbers,
|
||||||
|
enableInactiveFocus = options.enableInactiveFocus,
|
||||||
|
skipInitialFocus = options.skipInitialFocus;
|
||||||
|
|
||||||
|
var videojsVer = videojs.VERSION;
|
||||||
|
|
||||||
|
// Set default player tabindex to handle keydown and doubleclick events
|
||||||
|
if (!pEl.hasAttribute('tabIndex')) {
|
||||||
|
pEl.setAttribute('tabIndex', '-1');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove player outline to fix video performance issue
|
||||||
|
pEl.style.outline = "none";
|
||||||
|
|
||||||
|
if (alwaysCaptureHotkeys || !player.autoplay()) {
|
||||||
|
if (!skipInitialFocus) {
|
||||||
|
player.one('play', function() {
|
||||||
|
pEl.focus(); // Fixes the .vjs-big-play-button handing focus back to body instead of the player
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (enableInactiveFocus) {
|
||||||
|
player.on('userinactive', function() {
|
||||||
|
// When the control bar fades, re-apply focus to the player if last focus was a control button
|
||||||
|
var cancelFocusingPlayer = function() {
|
||||||
|
clearTimeout(focusingPlayerTimeout);
|
||||||
|
};
|
||||||
|
var focusingPlayerTimeout = setTimeout(function() {
|
||||||
|
player.off('useractive', cancelFocusingPlayer);
|
||||||
|
var activeElement = doc.activeElement;
|
||||||
|
var controlBar = pEl.querySelector('.vjs-control-bar');
|
||||||
|
if (activeElement && activeElement.parentElement == controlBar) {
|
||||||
|
pEl.focus();
|
||||||
|
}
|
||||||
|
}, 10);
|
||||||
|
|
||||||
|
player.one('useractive', cancelFocusingPlayer);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
player.on('play', function() {
|
||||||
|
// Fix allowing the YouTube plugin to have hotkey support.
|
||||||
|
var ifblocker = pEl.querySelector('.iframeblocker');
|
||||||
|
if (ifblocker && ifblocker.style.display === '') {
|
||||||
|
ifblocker.style.display = "block";
|
||||||
|
ifblocker.style.bottom = "39px";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var keyDown = function keyDown(event) {
|
||||||
|
var ewhich = event.which, wasPlaying, seekTime;
|
||||||
|
var ePreventDefault = event.preventDefault.bind(event);
|
||||||
|
var duration = player.duration();
|
||||||
|
// When controls are disabled, hotkeys will be disabled as well
|
||||||
|
if (player.controls()) {
|
||||||
|
|
||||||
|
// Don't catch keys if any control buttons are focused, unless alwaysCaptureHotkeys is true
|
||||||
|
var activeEl = doc.activeElement;
|
||||||
|
if (
|
||||||
|
alwaysCaptureHotkeys ||
|
||||||
|
(captureDocumentHotkeys && documentHotkeysFocusElementFilter(activeEl)) ||
|
||||||
|
|
||||||
|
activeEl == pEl ||
|
||||||
|
activeEl == pEl.querySelector('.vjs-tech') ||
|
||||||
|
activeEl == pEl.querySelector('.vjs-control-bar') ||
|
||||||
|
activeEl == pEl.querySelector('.iframeblocker')
|
||||||
|
) {
|
||||||
|
|
||||||
|
switch (checkKeys(event, player)) {
|
||||||
|
// Spacebar toggles play/pause
|
||||||
|
case cPlay:
|
||||||
|
ePreventDefault();
|
||||||
|
if (alwaysCaptureHotkeys || captureDocumentHotkeys) {
|
||||||
|
// Prevent control activation with space
|
||||||
|
event.stopPropagation();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player.paused()) {
|
||||||
|
silencePromise(player.play());
|
||||||
|
} else {
|
||||||
|
player.pause();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Seeking with the left/right arrow keys
|
||||||
|
case cRewind: // Seek Backward
|
||||||
|
wasPlaying = !player.paused();
|
||||||
|
ePreventDefault();
|
||||||
|
if (wasPlaying) {
|
||||||
|
player.pause();
|
||||||
|
}
|
||||||
|
seekTime = player.currentTime() - seekStepD(event);
|
||||||
|
// The flash player tech will allow you to seek into negative
|
||||||
|
// numbers and break the seekbar, so try to prevent that.
|
||||||
|
if (seekTime <= 0) {
|
||||||
|
seekTime = 0;
|
||||||
|
}
|
||||||
|
player.currentTime(seekTime);
|
||||||
|
if (wasPlaying) {
|
||||||
|
silencePromise(player.play());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case cForward: // Seek Forward
|
||||||
|
wasPlaying = !player.paused();
|
||||||
|
ePreventDefault();
|
||||||
|
if (wasPlaying) {
|
||||||
|
player.pause();
|
||||||
|
}
|
||||||
|
seekTime = player.currentTime() + seekStepD(event);
|
||||||
|
// Fixes the player not sending the end event if you
|
||||||
|
// try to seek past the duration on the seekbar.
|
||||||
|
if (seekTime >= duration) {
|
||||||
|
seekTime = wasPlaying ? duration - .001 : duration;
|
||||||
|
}
|
||||||
|
player.currentTime(seekTime);
|
||||||
|
if (wasPlaying) {
|
||||||
|
silencePromise(player.play());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Volume control with the up/down arrow keys
|
||||||
|
case cVolumeDown:
|
||||||
|
ePreventDefault();
|
||||||
|
if (!enableJogStyle) {
|
||||||
|
player.volume(player.volume() - volumeStep);
|
||||||
|
} else {
|
||||||
|
seekTime = player.currentTime() - 1;
|
||||||
|
if (player.currentTime() <= 1) {
|
||||||
|
seekTime = 0;
|
||||||
|
}
|
||||||
|
player.currentTime(seekTime);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case cVolumeUp:
|
||||||
|
ePreventDefault();
|
||||||
|
if (!enableJogStyle) {
|
||||||
|
player.volume(player.volume() + volumeStep);
|
||||||
|
} else {
|
||||||
|
seekTime = player.currentTime() + 1;
|
||||||
|
if (seekTime >= duration) {
|
||||||
|
seekTime = duration;
|
||||||
|
}
|
||||||
|
player.currentTime(seekTime);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Toggle Mute with the M key
|
||||||
|
case cMute:
|
||||||
|
if (enableMute) {
|
||||||
|
player.muted(!player.muted());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Toggle Fullscreen with the F key
|
||||||
|
case cFullscreen:
|
||||||
|
if (enableFull) {
|
||||||
|
if (player.isFullscreen()) {
|
||||||
|
player.exitFullscreen();
|
||||||
|
} else {
|
||||||
|
player.requestFullscreen();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Number keys from 0-9 skip to a percentage of the video. 0 is 0% and 9 is 90%
|
||||||
|
if ((ewhich > 47 && ewhich < 59) || (ewhich > 95 && ewhich < 106)) {
|
||||||
|
// Do not handle if enableModifiersForNumbers set to false and keys are Ctrl, Cmd or Alt
|
||||||
|
if (enableModifiersForNumbers || !(event.metaKey || event.ctrlKey || event.altKey)) {
|
||||||
|
if (enableNumbers) {
|
||||||
|
var sub = 48;
|
||||||
|
if (ewhich > 95) {
|
||||||
|
sub = 96;
|
||||||
|
}
|
||||||
|
var number = ewhich - sub;
|
||||||
|
ePreventDefault();
|
||||||
|
player.currentTime(player.duration() * number * 0.1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle any custom hotkeys
|
||||||
|
for (var customKey in options.customKeys) {
|
||||||
|
var customHotkey = options.customKeys[customKey];
|
||||||
|
// Check for well formed custom keys
|
||||||
|
if (customHotkey && customHotkey.key && customHotkey.handler) {
|
||||||
|
// Check if the custom key's condition matches
|
||||||
|
if (customHotkey.key(event)) {
|
||||||
|
ePreventDefault();
|
||||||
|
customHotkey.handler(player, options, event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var doubleClick = function doubleClick(event) {
|
||||||
|
// Video.js added double-click fullscreen in 7.1.0
|
||||||
|
if (videojsVer != null && videojsVer <= "7.1.0") {
|
||||||
|
// When controls are disabled, hotkeys will be disabled as well
|
||||||
|
if (player.controls()) {
|
||||||
|
|
||||||
|
// Don't catch clicks if any control buttons are focused
|
||||||
|
var activeEl = event.relatedTarget || event.toElement || doc.activeElement;
|
||||||
|
if (activeEl == pEl ||
|
||||||
|
activeEl == pEl.querySelector('.vjs-tech') ||
|
||||||
|
activeEl == pEl.querySelector('.iframeblocker')) {
|
||||||
|
|
||||||
|
if (enableFull) {
|
||||||
|
if (player.isFullscreen()) {
|
||||||
|
player.exitFullscreen();
|
||||||
|
} else {
|
||||||
|
player.requestFullscreen();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var volumeHover = false;
|
||||||
|
var volumeSelector = pEl.querySelector('.vjs-volume-menu-button') || pEl.querySelector('.vjs-volume-panel');
|
||||||
|
if (volumeSelector != null) {
|
||||||
|
volumeSelector.onmouseover = function() { volumeHover = true; };
|
||||||
|
volumeSelector.onmouseout = function() { volumeHover = false; };
|
||||||
|
}
|
||||||
|
|
||||||
|
var mouseScroll = function mouseScroll(event) {
|
||||||
|
if (enableHoverScroll) {
|
||||||
|
// If we leave this undefined then it can match non-existent elements below
|
||||||
|
var activeEl = 0;
|
||||||
|
} else {
|
||||||
|
var activeEl = doc.activeElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When controls are disabled, hotkeys will be disabled as well
|
||||||
|
if (player.controls()) {
|
||||||
|
if (alwaysCaptureHotkeys ||
|
||||||
|
activeEl == pEl ||
|
||||||
|
activeEl == pEl.querySelector('.vjs-tech') ||
|
||||||
|
activeEl == pEl.querySelector('.iframeblocker') ||
|
||||||
|
activeEl == pEl.querySelector('.vjs-control-bar') ||
|
||||||
|
volumeHover) {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var checkKeys = function checkKeys(e, player) {
|
||||||
|
// Allow some modularity in defining custom hotkeys
|
||||||
|
|
||||||
|
// Play/Pause check
|
||||||
|
if (options.playPauseKey(e, player)) {
|
||||||
|
return cPlay;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Seek Backward check
|
||||||
|
if (options.rewindKey(e, player)) {
|
||||||
|
return cRewind;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Seek Forward check
|
||||||
|
if (options.forwardKey(e, player)) {
|
||||||
|
return cForward;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Volume Up check
|
||||||
|
if (options.volumeUpKey(e, player)) {
|
||||||
|
return cVolumeUp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Volume Down check
|
||||||
|
if (options.volumeDownKey(e, player)) {
|
||||||
|
return cVolumeDown;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mute check
|
||||||
|
if (options.muteKey(e, player)) {
|
||||||
|
return cMute;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fullscreen check
|
||||||
|
if (options.fullscreenKey(e, player)) {
|
||||||
|
return cFullscreen;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function playPauseKey(e) {
|
||||||
|
// Space bar or MediaPlayPause
|
||||||
|
return (e.which === 32 || e.which === 179);
|
||||||
|
}
|
||||||
|
|
||||||
|
function rewindKey(e) {
|
||||||
|
// Left Arrow or MediaRewind
|
||||||
|
return (e.which === 37 || e.which === 177);
|
||||||
|
}
|
||||||
|
|
||||||
|
function forwardKey(e) {
|
||||||
|
// Right Arrow or MediaForward
|
||||||
|
return (e.which === 39 || e.which === 176);
|
||||||
|
}
|
||||||
|
|
||||||
|
function volumeUpKey(e) {
|
||||||
|
// Up Arrow
|
||||||
|
return (e.which === 38);
|
||||||
|
}
|
||||||
|
|
||||||
|
function volumeDownKey(e) {
|
||||||
|
// Down Arrow
|
||||||
|
return (e.which === 40);
|
||||||
|
}
|
||||||
|
|
||||||
|
function muteKey(e) {
|
||||||
|
// M key
|
||||||
|
return (e.which === 77);
|
||||||
|
}
|
||||||
|
|
||||||
|
function fullscreenKey(e) {
|
||||||
|
// F key
|
||||||
|
return (e.which === 70);
|
||||||
|
}
|
||||||
|
|
||||||
|
function seekStepD(e) {
|
||||||
|
// SeekStep caller, returns an int, or a function returning an int
|
||||||
|
return (typeof seekStep === "function" ? seekStep(e) : seekStep);
|
||||||
|
}
|
||||||
|
|
||||||
|
function silencePromise(value) {
|
||||||
|
if (value != null && typeof value.then === 'function') {
|
||||||
|
value.then(null, function(e) {});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (captureDocumentHotkeys) {
|
||||||
|
var capDocHK = function (event) { keyDown(event) };
|
||||||
|
document.addEventListener('keydown', capDocHK);
|
||||||
|
|
||||||
|
this.dispose = function () {
|
||||||
|
document.removeEventListener('keydown', capDocHK);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
player.on('keydown', keyDown);
|
||||||
|
}
|
||||||
|
|
||||||
|
player.on('dblclick', doubleClick);
|
||||||
|
player.on('mousewheel', mouseScroll);
|
||||||
|
player.on("DOMMouseScroll", mouseScroll);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
var registerPlugin = videojs.registerPlugin || videojs.plugin;
|
||||||
|
registerPlugin('hotkeys', hotkeys);
|
||||||
|
}));
|
||||||
1950
css/videojs-v8.16.0.css
Normal file
52
css/vjs.min.js
vendored
Normal file
@@ -1,15 +1,15 @@
|
|||||||
<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<circle cx="75" cy="75" r="75" fill="url(#paint0_linear_9_5)"/>
|
<circle cx="75" cy="75" r="75" fill="url(#paint0_linear_9_5)"/>
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M39.782 41.7207C19.7853 64.3135 20.6858 121.023 38.805 121.023C51.3927 121.023 53.2571 120.788 57.4558 120.258C59.3009 120.025 61.5967 119.735 65.4512 119.384C77.2615 118.306 74.1768 109.697 70.9345 100.649C68.8197 94.7472 66.6379 88.6583 68.4777 84.3493C70.2767 80.1359 79.7085 81.0823 90.1072 82.1258C99.6126 83.0796 109.926 84.1144 115.956 81.3634C128.582 75.6028 127.434 46.3292 115.956 35.9601C104.477 25.591 56.0977 23.2867 39.782 41.7207ZM83.6404 68.2196C88.3063 68.2196 95.0174 66.3534 95.5883 59.8216C95.6171 59.4918 95.647 59.1604 95.6769 58.8279C96.3266 51.6169 97.0214 43.9039 88.2357 41.1593C76.2878 37.4269 70.7734 52.3093 70.7734 59.8216C70.7734 66.3534 78.9744 68.2196 83.6404 68.2196Z" fill="url(#paint1_linear_9_5)"/>
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M39.782 41.7207C19.7853 64.3135 20.6858 121.023 38.805 121.023C51.3927 121.023 53.2571 120.788 57.4558 120.258C59.3009 120.025 61.5967 119.735 65.4512 119.384C77.2615 118.306 74.1768 109.697 70.9345 100.649C68.8197 94.7472 66.6379 88.6583 68.4777 84.3493C70.2767 80.1359 79.7085 81.0823 90.1072 82.1258C99.6126 83.0796 109.926 84.1144 115.956 81.3634C128.582 75.6028 127.434 46.3292 115.956 35.9601C104.477 25.591 56.0977 23.2867 39.782 41.7207ZM83.6404 68.2196C88.3063 68.2196 95.0174 66.3534 95.5883 59.8216C95.6171 59.4918 95.647 59.1604 95.6769 58.8279C96.3266 51.6169 97.0214 43.9039 88.2357 41.1593C76.2878 37.4269 70.7734 52.3093 70.7734 59.8216C70.7734 66.3534 78.9744 68.2196 83.6404 68.2196Z" fill="url(#paint1_linear_9_5)"/>
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M39.782 41.7207C19.7853 64.3135 20.6858 121.023 38.805 121.023C51.3927 121.023 53.2571 120.788 57.4558 120.258C59.3009 120.025 61.5967 119.735 65.4512 119.384C77.2615 118.306 74.1768 109.697 70.9345 100.649C68.8197 94.7472 66.6379 88.6583 68.4777 84.3493C70.2767 80.1359 79.7085 81.0823 90.1072 82.1258C99.6126 83.0796 109.926 84.1144 115.956 81.3634C128.582 75.6028 127.434 46.3292 115.956 35.9601C104.477 25.591 56.0977 23.2867 39.782 41.7207ZM83.6404 68.2196C88.3063 68.2196 95.0174 66.3534 95.5883 59.8216C95.6171 59.4918 95.647 59.1604 95.6769 58.8279C96.3266 51.6169 97.0214 43.9039 88.2357 41.1593C76.2878 37.4269 70.7734 52.3093 70.7734 59.8216C70.7734 66.3534 78.9744 68.2196 83.6404 68.2196Z" fill="black"/>
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M39.782 41.7207C19.7853 64.3135 20.6858 121.023 38.805 121.023C51.3927 121.023 53.2571 120.788 57.4558 120.258C59.3009 120.025 61.5967 119.735 65.4512 119.384C77.2615 118.306 74.1768 109.697 70.9345 100.649C68.8197 94.7472 66.6379 88.6583 68.4777 84.3493C70.2767 80.1359 79.7085 81.0823 90.1072 82.1258C99.6126 83.0796 109.926 84.1144 115.956 81.3634C128.582 75.6028 127.434 46.3292 115.956 35.9601C104.477 25.591 56.0977 23.2867 39.782 41.7207ZM83.6404 68.2196C88.3063 68.2196 95.0174 66.3534 95.5883 59.8216C95.6171 59.4918 95.647 59.1604 95.6769 58.8279C96.3266 51.6169 97.0214 43.9039 88.2357 41.1593C76.2878 37.4269 70.7734 52.3093 70.7734 59.8216C70.7734 66.3534 78.9744 68.2196 83.6404 68.2196Z" fill="black" style=""/>
|
||||||
<defs>
|
<defs>
|
||||||
<linearGradient id="paint0_linear_9_5" x1="0" y1="0" x2="150" y2="150" gradientUnits="userSpaceOnUse">
|
<linearGradient id="paint0_linear_9_5" x1="0" y1="0" x2="150" y2="150" gradientUnits="userSpaceOnUse">
|
||||||
<stop stop-color="#8EDDFF"/>
|
<stop stop-color="#f08"/>
|
||||||
<stop offset="1" stop-color="#EE85FF"/>
|
<stop offset="1" stop-color="#ff9aa2"/>
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<linearGradient id="paint1_linear_9_5" x1="25" y1="28" x2="117.781" y2="127.739" gradientUnits="userSpaceOnUse">
|
<linearGradient id="paint1_linear_9_5" x1="25" y1="28" x2="117.781" y2="127.739" gradientUnits="userSpaceOnUse">
|
||||||
<stop stop-color="#8EDDFF"/>
|
<stop stop-color="#f08"/>
|
||||||
<stop offset="1" stop-color="#EE85FF"/>
|
<stop offset="1" stop-color="#ff9aa2"/>
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
</defs>
|
</defs>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
@@ -1,7 +1,11 @@
|
|||||||
# To run, please do either docker compose up -d (for docker's own version) or docker-compose up -d (for your OSes package managers verison)
|
# To run, please do either docker compose up -d (for docker's own version) or docker-compose up -d (for your OSes package managers verison)
|
||||||
services:
|
services:
|
||||||
poketube:
|
poke:
|
||||||
image: quay.io/sudovanilla/poketube
|
# image: soon!!!
|
||||||
|
|
||||||
|
# do not use
|
||||||
|
# image: codeberg.org/poketube/poke:amd64
|
||||||
|
# image: codeberg.org/poketube/poke:arm64 # Works with ARM64/v8, not ARM64/v7
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- ./config.json:/poketube/config.json
|
- ./config.json:/poketube/config.json
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<%- include('error.ejs', {
|
<%- include('./layouts/error.ejs', {
|
||||||
error: "404",
|
error: "404 ER_ROR",
|
||||||
description: "Very 1984 Innit? I dont think this webpage exist :p"
|
description: "you are in violation. thEy mustn't know you were here. no one should ever find out About this. you can never tell anyone about thiS -- for The sake of the others' survIval, you muSt keep this silent. we mUst keeP silent. no one can know. no one can know. no o ne c an kn ow_ (Violation Code. 15398642_14)"
|
||||||
}) %>
|
}) %>
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<%- include('error.ejs', {
|
<%- include('./layouts/error.ejs', {
|
||||||
error: "502",
|
error: "502",
|
||||||
description: "An error has occurred. Try again or come back later."
|
description: "An error has occurred. Try again or come back later."
|
||||||
}) %>
|
}) %>
|
||||||
@@ -63,10 +63,10 @@ var apiurl = "https://poketube.fun/api"
|
|||||||
if(!localStorage.getItem("UserID")) {
|
if(!localStorage.getItem("UserID")) {
|
||||||
localStorage.setItem('UserID', `<%- userid %>`);
|
localStorage.setItem('UserID', `<%- userid %>`);
|
||||||
<% db.set(`user.${userid}`, userid) %>
|
<% db.set(`user.${userid}`, userid) %>
|
||||||
location.href = "/my-acc?ID=" + `<%- userid %>`
|
location.href = "/my-acc?ID=" + `<%- userid %>` + "&rparam=1"
|
||||||
}
|
}
|
||||||
|
|
||||||
if(localStorage.getItem("UserID")) {
|
if(localStorage.getItem("UserID")) {
|
||||||
location.href = "/my-acc?ID=" + localStorage.getItem("UserID")
|
location.href = "/my-acc?ID=" + localStorage.getItem("UserID") + "&rparam=1"
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -125,10 +125,12 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a href="/game-hub" class="poke-app-btn"><i class="fa-light fa-gamepad"></i>Games</a>
|
<a href="/game-hub" class="poke-app-btn"><i class="fa-light fa-gamepad"></i>Games</a>
|
||||||
<a href="/web" class="poke-app-btn"><i class="fa-light fa-search"></i>Web Search</a>
|
<a href="/search" class="poke-app-btn"><i class="fa-light fa-search"></i>Search</a>
|
||||||
<a href="/translate" class="poke-app-btn"><i class="fa-light fa-language"></i>Translate</a>
|
<a href="/translate" class="poke-app-btn"><i class="fa-light fa-language"></i>Translate</a>
|
||||||
<a href="/map" class="poke-app-btn"><i class="fa-light fa-map-marker-alt"></i>Maps</a>
|
<a href="/map" class="poke-app-btn"><i class="fa-light fa-map-marker-alt"></i>Maps</a>
|
||||||
<a href="/app" class="poke-app-btn"><i class="fa-light fa-play"></i>PokeTube</a>
|
<a href="https://social.poketube.fun" class="poke-app-btn"><i class="fa-brands fa-mastodon"></i>Fediverse</a>
|
||||||
|
<a href="/calendar" class="poke-app-btn"><i class="fa-light fa-calendar"></i>Calendar</a>
|
||||||
|
<a href="/app" class="poke-app-btn"><i class="fa-light fa-play"></i>Watch</a>
|
||||||
<a href="/settings" class="poke-app-btn"><i class="fa-light fa-cogs"></i>Settings</a>
|
<a href="/settings" class="poke-app-btn"><i class="fa-light fa-cogs"></i>Settings</a>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
188
html/calendar.ejs
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<link rel="manifest" href="/manifest.json">
|
||||||
|
<link href="css/yt-ukraine.svg" rel="icon">
|
||||||
|
<title>Poke! Calendar</title>
|
||||||
|
<meta content="PokeCalendar" property="og:title">
|
||||||
|
<meta content="Worlds first no js web calendar :3" property="twitter:description">
|
||||||
|
<meta content="https://cdn.glitch.global/d68d17bb-f2c0-4bc3-993f-50902734f652/aa70111e-5bcd-4379-8b23-332a33012b78.image.png?v=1701898829884" property="og:image" />
|
||||||
|
<meta content=summary_large_image name=twitter:card>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'">
|
||||||
|
<meta name="referrer" content="no-referrer">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background-color: #121212;
|
||||||
|
color: #ffffff;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar {
|
||||||
|
background-color: #333333;
|
||||||
|
padding: 10px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center; /* Center items vertically */
|
||||||
|
justify-content: space-between; /* Space items evenly */
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar h1 {
|
||||||
|
margin: 0;
|
||||||
|
color: #bb86fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar .years {
|
||||||
|
color: #bb86fc; /* Year text color */
|
||||||
|
display: flex; /* Use flexbox for alignment */
|
||||||
|
gap: 20px; /* Space between year elements */
|
||||||
|
flex-wrap: wrap; /* Allow wrapping on smaller screens */
|
||||||
|
justify-content: center; /* Center items on smaller screens */
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
text-align: center;
|
||||||
|
padding: 20px;
|
||||||
|
background-color: #1e1e1e;
|
||||||
|
border-radius: 10px;
|
||||||
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
||||||
|
width: 90%;
|
||||||
|
max-width: 800px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2, h3 {
|
||||||
|
color: #bb86fc;
|
||||||
|
margin: 10px 0; /* Margin between h2 elements */
|
||||||
|
}
|
||||||
|
|
||||||
|
.month-title {
|
||||||
|
font-size: 1.5em; /* Adjust the size as needed */
|
||||||
|
margin: 20px 0; /* Spacing above and below */
|
||||||
|
color: #bb86fc; /* Month title color */
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-table th, .calendar-table td {
|
||||||
|
padding: 15px;
|
||||||
|
text-align: center;
|
||||||
|
border: 1px solid #333333;
|
||||||
|
font-size: 0.9em; /* Smaller font size for better fit */
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-table th {
|
||||||
|
background-color: #333333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-table td {
|
||||||
|
background-color: #2c2c2c;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #ffffff;
|
||||||
|
background-color: #bb86fc;
|
||||||
|
padding: 10px 20px;
|
||||||
|
border-radius: 5px;
|
||||||
|
margin: 0 10px;
|
||||||
|
transition: background-color 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button:hover {
|
||||||
|
background-color: #9c62f3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Responsive styles */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.navbar {
|
||||||
|
flex-direction: column; /* Stack navbar items vertically on small screens */
|
||||||
|
align-items: center; /* Center items horizontally */
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
width: 100%; /* Full width on small screens */
|
||||||
|
height: 100vh; /* Full height of the viewport */
|
||||||
|
border-radius: 0; /* Remove border-radius for full-screen effect */
|
||||||
|
box-shadow: none; /* Remove shadow for a flatter design */
|
||||||
|
padding: 10px; /* Adjust padding for mobile */
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-table th, .calendar-table td {
|
||||||
|
padding: 10px; /* Reduced padding for smaller screens */
|
||||||
|
font-size: 0.8em; /* Smaller font size */
|
||||||
|
}
|
||||||
|
|
||||||
|
.month-title {
|
||||||
|
font-size: 1.2em; /* Smaller month title */
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
padding: 8px 15px; /* Smaller button size */
|
||||||
|
margin: 5px 0; /* Vertical spacing */
|
||||||
|
display: block; /* Stack buttons vertically */
|
||||||
|
width: 100%; /* Full width */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="navbar">
|
||||||
|
<a class="class" href="/143" style="font-family: Inter, sans-serif; color: #fff">
|
||||||
|
<img style="transform: scale(1.3); padding-left: 0.9em; width: 8.5em; display: block; margin-left: auto; margin-right: auto;" src="/css/logo-poke.svg?v=5">
|
||||||
|
</a>
|
||||||
|
<div class="years">
|
||||||
|
<h2>Gregorian Year: <%= year %></h2>
|
||||||
|
<h2>Islamic Year: <%= islamicYear %></h2>
|
||||||
|
<h2>Persian Year: <%= persianYear %></h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container" style="margin-top: 1em;">
|
||||||
|
<h2 class="month-title"><%= queryDate.toLocaleString('default', { month: 'long' }) %> <%= year %></h2> <!-- Month and Year Display -->
|
||||||
|
|
||||||
|
<table class="calendar-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Sunday</th>
|
||||||
|
<th>Monday</th>
|
||||||
|
<th>Tuesday</th>
|
||||||
|
<th>Wednesday</th>
|
||||||
|
<th>Thursday</th>
|
||||||
|
<th>Friday</th>
|
||||||
|
<th>Saturday</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<% for (let i = 0; i < 6; i++) { %>
|
||||||
|
<tr>
|
||||||
|
<% for (let j = 0; j < 7; j++) { %>
|
||||||
|
<td>
|
||||||
|
<% const day = days[i * 7 + j]; %>
|
||||||
|
<%= day ? day.getDate() : '' %>
|
||||||
|
</td>
|
||||||
|
<% } %>
|
||||||
|
</tr>
|
||||||
|
<% } %>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div class="nav-links">
|
||||||
|
<a href="/calendar?date=<%= new Date(currentDate.getFullYear(), month - 1, 1).toISOString() %>" class="button">Previous Month</a>
|
||||||
|
<a href="/calendar?date=<%= new Date(currentDate.getFullYear(), month + 1, 1).toISOString() %>" class="button">Next Month</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
158
html/channel.ejs
@@ -22,21 +22,18 @@
|
|||||||
<!-- 🐷 🎗️ -->
|
<!-- 🐷 🎗️ -->
|
||||||
|
|
||||||
<% if (ID === "UCFAiFyGs6oDiF1Nf-rRJpZA") { %>
|
<% if (ID === "UCFAiFyGs6oDiF1Nf-rRJpZA") { %>
|
||||||
<title>Technoblade Never Dies! - PokeTube</title>
|
<title>Technoblade Never Dies! | Poke</title>
|
||||||
<% } %>
|
<% } %>
|
||||||
<title><%=j.Channel?.Metadata.Name%> - PokeTube</title>
|
<title><%=j.Channel?.Metadata.Name%> | Poke</title>
|
||||||
<link rel="manifest" href="/manifest.json">
|
<link rel="manifest" href="/manifest.json">
|
||||||
<link href="css/yt-ukraine.svg" rel=icon>
|
<link href="css/yt-ukraine.svg?v=7" rel=icon>
|
||||||
<meta content=website property=og:type>
|
<meta content=website property=og:type>
|
||||||
<link rel="alternate" type="application/rss+xml" href="/feeds/videos.xml?channel_id=<%=ID%>">
|
<link rel="alternate" type="application/rss+xml" href="/feeds/videos.xml?channel_id=<%=ID%>">
|
||||||
<meta content="<%=j.Channel?.Metadata.Name%> - PokeTube" property=og:title>
|
<meta content="<%=j.Channel?.Metadata.Name%> - Poke" property=og:title>
|
||||||
<meta content="<%- cinv.description %>" property=twitter:description>
|
<meta content="<%- cinv?.description %>" property=twitter:description>
|
||||||
<meta name="darkreader-lock"> <!-- tells dark reader that the site has a dark theme and to turn itself off -->
|
<meta name="darkreader-lock"> <!-- tells dark reader that the site has a dark theme and to turn itself off -->
|
||||||
<% if (j.Channel?.Metadata.Banners.Thumbnail) { %>
|
<meta content="<%=j.Channel?.Metadata.Avatars.Thumbnail?.$t%>" property=og:image>
|
||||||
<meta content="<%=j.Channel?.Metadata?.Banners.Thumbnail[2].$t%>" property=og:image>
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<% } %>
|
|
||||||
<meta content=summary_large_image name=twitter:card>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<style>
|
<style>
|
||||||
* {
|
* {
|
||||||
color:#fff
|
color:#fff
|
||||||
@@ -198,6 +195,22 @@ padding-bottom: 32px;
|
|||||||
<!-- STYLES START -->
|
<!-- STYLES START -->
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
|
||||||
|
.tags-channel {
|
||||||
|
display:flex;
|
||||||
|
flex-direction:row;
|
||||||
|
overflow-x:auto;
|
||||||
|
column-gap:3px
|
||||||
|
}
|
||||||
|
.tag-channel {
|
||||||
|
background:#333;
|
||||||
|
padding:5px;
|
||||||
|
border-radius:4px;
|
||||||
|
word-break:break-all;
|
||||||
|
white-space:nowrap;
|
||||||
|
font-family:PokeTube Flex,sans-serif
|
||||||
|
}
|
||||||
|
|
||||||
a.class:hover {
|
a.class:hover {
|
||||||
text-decoration:underline;
|
text-decoration:underline;
|
||||||
font-weight:bold
|
font-weight:bold
|
||||||
@@ -561,7 +574,7 @@ color:#ea9999 !important;
|
|||||||
<div class="search" style="margin-right: 5em;">
|
<div class="search" style="margin-right: 5em;">
|
||||||
|
|
||||||
<form action="/search">
|
<form action="/search">
|
||||||
<input class="search-bar" autocomplete="on" id="fname" name="query" placeholder="" style="color:#fff;font-family:Inter,sans-serif;border-radius: 8px;" data-ddg-inputtype="identities.firstName">
|
<input class="search-bar" autocomplete="on" id="fname" name="query" value="channel:<%=ID%>" style="color:#fff;font-family:Inter,sans-serif;border-radius: 8px;" data-ddg-inputtype="identities.firstName">
|
||||||
|
|
||||||
|
|
||||||
<button class="btn btn-success" type="submit"><i class="fa-light fa-search"></i></button>
|
<button class="btn btn-success" type="submit"><i class="fa-light fa-search"></i></button>
|
||||||
@@ -632,7 +645,11 @@ height: 100%;
|
|||||||
|
|
||||||
</style>
|
</style>
|
||||||
<img class="banned-user" src="<%- media_proxy_url %>/proxy?url=https://yt3.googleusercontent.com/a/default-user=s100-c-k-c0x00ffffff-no-rj">
|
<img class="banned-user" src="<%- media_proxy_url %>/proxy?url=https://yt3.googleusercontent.com/a/default-user=s100-c-k-c0x00ffffff-no-rj">
|
||||||
<p class="ban-reason"> <%- cinv.error %> - literally 1984 lmao</p>
|
<p class="ban-reason"> <%- cinv.error %> </p>
|
||||||
|
|
||||||
|
<% if (cinv.error == "Could not get channel info.") { %>
|
||||||
|
<meta http-equiv="refresh" content="1">
|
||||||
|
<% } %>
|
||||||
|
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
@@ -646,20 +663,20 @@ height: 100%;
|
|||||||
<% if (!isMobile) { %>
|
<% if (!isMobile) { %>
|
||||||
<div class="channel-info-container" style="text-align: center;">
|
<div class="channel-info-container" style="text-align: center;">
|
||||||
|
|
||||||
<% if (j?.Channel?.Metadata?.Banners.Thumbnail) { %>
|
<% if (cinv?.authorBanners) { %>
|
||||||
<% let thumbnailFound = false; %>
|
<% let bannerFound = false; %>
|
||||||
<% for (let i = 5; i >= 1; i--) { %>
|
<% for (let i = 0; i < cinv.authorBanners.length; i++) { %>
|
||||||
<% if (j.Channel.Metadata.Banners.Thumbnail[i]?.['$t']) { %>
|
<% if (cinv.authorBanners[i]?.url) { %>
|
||||||
<img src="<%- media_proxy_url %>/proxy?url=<%= j.Channel.Metadata.Banners.Thumbnail[i].$t %>" style="height: 30em; object-fit: cover; pointer-events: none;" id="thumbnail_version_<%= i %>">
|
<img src="<%- media_proxy_url %>/proxy?url=<%= cinv.authorBanners[i].url %>" style="height: 30em; object-fit: cover; pointer-events: none;" id="banner_version_<%= i %>">
|
||||||
<% thumbnailFound = true; %>
|
<% bannerFound = true; %>
|
||||||
<% break; %>
|
<% break; %>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% if (!thumbnailFound) { %>
|
<% if (!bannerFound) { %>
|
||||||
<img src="/static/shapes-dark.png" style="height: 30em; object-fit: cover; pointer-events: none;" id="default_thumbnail">
|
<img src="/static/shapes-dark.png" style="height: 30em; object-fit: cover; pointer-events: none;" id="default_banner">
|
||||||
<% } %>
|
<% } %>
|
||||||
<% } else { %>
|
<% } else { %>
|
||||||
<img src="/static/shapes-dark.png" style="height: 30em; object-fit: cover; pointer-events: none;" id="default_thumbnail">
|
<img src="/static/shapes-dark.png" style="height: 30em; object-fit: cover; pointer-events: none;" id="default_banner">
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
|
|
||||||
@@ -685,7 +702,7 @@ height: 100%;
|
|||||||
<div class="name" style="background: #333;border-radius: 12px;padding: 17px;height: 7em;margin-left: 4em;margin-top: 7px;gap: 3px;">
|
<div class="name" style="background: #333;border-radius: 12px;padding: 17px;height: 7em;margin-left: 4em;margin-top: 7px;gap: 3px;">
|
||||||
<p style="font-family:PokeTube Flex,sans-serif;font-weight:1000;font-stretch: ultra-expanded;margin-top: 16px;margin-bottom: 15px;"><%=j.Channel?.Metadata.Name%>
|
<p style="font-family:PokeTube Flex,sans-serif;font-weight:1000;font-stretch: ultra-expanded;margin-top: 16px;margin-bottom: 15px;"><%=j.Channel?.Metadata.Name%>
|
||||||
|
|
||||||
<% if (cinv?.authorVerified) { %>
|
<% if (firstVideo?.authorVerified) { %>
|
||||||
<span style="padding: 1px;padding-top: 2.5px !important;display: inline-flex;border-radius: 3px;">
|
<span style="padding: 1px;padding-top: 2.5px !important;display: inline-flex;border-radius: 3px;">
|
||||||
|
|
||||||
|
|
||||||
@@ -695,7 +712,7 @@ height: 100%;
|
|||||||
<% } %>
|
<% } %>
|
||||||
<span style="font-size: 10px;color: gray;">@<%- cinv.authorId %>@youtube.com</span>
|
<span style="font-size: 10px;color: gray;">@<%- cinv.authorId %>@youtube.com</span>
|
||||||
</p>
|
</p>
|
||||||
<p style="margin-bottom: -17px;" class="subs"><%=subs%> subscribers - <%- pronoun %></p>
|
<p style="margin-bottom: -17px;" class="subs"><%= subs %> subscribers - <%- pronoun %></p>
|
||||||
|
|
||||||
<p style="padding:0;font-weight:bold;max-inline-size: 37em;display: -webkit-box;-webkit-line-clamp: 3;-webkit-box-orient: vertical;">
|
<p style="padding:0;font-weight:bold;max-inline-size: 37em;display: -webkit-box;-webkit-line-clamp: 3;-webkit-box-orient: vertical;">
|
||||||
|
|
||||||
@@ -751,7 +768,7 @@ white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<
|
|||||||
|
|
||||||
<% if (c.comments.length != "0") { %>
|
<% if (c.comments.length != "0") { %>
|
||||||
|
|
||||||
<a href="/channel?id=<%=ID%>&tab=community" class="tab" style="color:pink">Community</a>
|
<a href="/channel?id=<%=ID%>&tab=community" class="tab" style="color:pink">Posts</a>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
@@ -796,7 +813,7 @@ white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<
|
|||||||
|
|
||||||
<% if (c.comments.length != "0") { %>
|
<% if (c.comments.length != "0") { %>
|
||||||
|
|
||||||
<a href="/channel?id=<%=ID%>&tab=community" class="tab" style="color:pink">Community</a>
|
<a href="/channel?id=<%=ID%>&tab=community" class="tab" style="color:pink">Posts</a>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
@@ -838,7 +855,7 @@ white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<
|
|||||||
|
|
||||||
<% if (c?.comments?.length != "0") { %>
|
<% if (c?.comments?.length != "0") { %>
|
||||||
|
|
||||||
<a href="/channel?id=<%=ID%>&tab=community" class="tab" style="color:pink">Community</a>
|
<a href="/channel?id=<%=ID%>&tab=community" class="tab" style="color:pink">Posts</a>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
<% } %>
|
<% } %>
|
||||||
@@ -866,7 +883,7 @@ white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<
|
|||||||
|
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
<a href="/channel?id=<%=ID%>&tab=community" class="tab active" style="color:pink">Community</a>
|
<a href="/channel?id=<%=ID%>&tab=community" class="tab active" style="color:pink">Posts</a>
|
||||||
|
|
||||||
|
|
||||||
<% if (Array.isArray(playlist?.playlists)) { %>
|
<% if (Array.isArray(playlist?.playlists)) { %>
|
||||||
@@ -880,8 +897,15 @@ white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<
|
|||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
<% if (tab === "shorts") { %>
|
<% if (tab === "shorts") { %>
|
||||||
|
<% if (Array?.isArray(tj?.videos)) { %>
|
||||||
|
<% if (tj?.videos[0]) { %>
|
||||||
|
<% if (turntomins(tj?.videos[0]?.lengthSeconds) != "aN:aN" ) { %>
|
||||||
|
|
||||||
<a href="/channel?id=<%=ID%>" class="tab" style="color:#cfe2f3;">Videos</a>
|
<a href="/channel?id=<%=ID%>" class="tab" style="color:#cfe2f3;">Videos</a>
|
||||||
|
<% } %>
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
<% } %>
|
||||||
<% if (Array?.isArray(shorts?.videos)) { %>
|
<% if (Array?.isArray(shorts?.videos)) { %>
|
||||||
|
|
||||||
<a href="/channel?id=<%=ID%>&tab=shorts" class="tab active shr">Shorts</a>
|
<a href="/channel?id=<%=ID%>&tab=shorts" class="tab active shr">Shorts</a>
|
||||||
@@ -900,7 +924,7 @@ white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<
|
|||||||
|
|
||||||
<% if (c?.comments?.length != "0") { %>
|
<% if (c?.comments?.length != "0") { %>
|
||||||
|
|
||||||
<a href="/channel?id=<%=ID%>&tab=community" class="tab" style="color:pink">Community</a>
|
<a href="/channel?id=<%=ID%>&tab=community" class="tab" style="color:pink">Posts</a>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
@@ -935,7 +959,7 @@ white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<
|
|||||||
|
|
||||||
<% if (c?.comments?.length != "0") { %>
|
<% if (c?.comments?.length != "0") { %>
|
||||||
|
|
||||||
<a href="/channel?id=<%=ID%>&tab=community" class="tab" style="color:pink">Community</a>
|
<a href="/channel?id=<%=ID%>&tab=community" class="tab" style="color:pink">Posts</a>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
@@ -980,7 +1004,7 @@ width: fit-content;
|
|||||||
<div class="name">
|
<div class="name">
|
||||||
<p style="font-family:PokeTube Flex,sans-serif;font-weight:1000;font-stretch: ultra-expanded;white-space:yes;"> <%=j.Channel?.Metadata.Name%> </p>
|
<p style="font-family:PokeTube Flex,sans-serif;font-weight:1000;font-stretch: ultra-expanded;white-space:yes;"> <%=j.Channel?.Metadata.Name%> </p>
|
||||||
<p style="margin: -9px;">
|
<p style="margin: -9px;">
|
||||||
<%=subs%> subscribers - <%- pronoun %>
|
<%= subs %> subscribers - <%- pronoun %>
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -1014,7 +1038,7 @@ width: fit-content;
|
|||||||
|
|
||||||
<% if (c.comments.length != "0") { %>
|
<% if (c.comments.length != "0") { %>
|
||||||
|
|
||||||
<a href="/channel?id=<%=ID%>&tab=community" class="tab">Community</a>
|
<a href="/channel?id=<%=ID%>&tab=community" class="tab">Posts</a>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% if (Array?.isArray(shorts?.videos)) { %>
|
<% if (Array?.isArray(shorts?.videos)) { %>
|
||||||
@@ -1045,7 +1069,7 @@ width: fit-content;
|
|||||||
<a href="/channel?id=<%=ID%>&tab=shorts" class="tab">Shorts</a>
|
<a href="/channel?id=<%=ID%>&tab=shorts" class="tab">Shorts</a>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% } %>
|
<% } %>
|
||||||
<a href="/channel?id=<%=ID%>&tab=community" class="tab active">Community</a>
|
<a href="/channel?id=<%=ID%>&tab=community" class="tab active">Posts</a>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% if (tab ==="shorts") { %>
|
<% if (tab ==="shorts") { %>
|
||||||
|
|
||||||
@@ -1057,7 +1081,7 @@ width: fit-content;
|
|||||||
<a href="/channel?id=<%=ID%>&tab=shorts" class="tab active">Shorts</a>
|
<a href="/channel?id=<%=ID%>&tab=shorts" class="tab active">Shorts</a>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% } %>
|
<% } %>
|
||||||
<a href="/channel?id=<%=ID%>&tab=community" class="tab">Community</a>
|
<a href="/channel?id=<%=ID%>&tab=community" class="tab">Posts</a>
|
||||||
<% } %>
|
<% } %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -1224,13 +1248,16 @@ width: fit-content;
|
|||||||
|
|
||||||
|
|
||||||
<div class="video-grid" >
|
<div class="video-grid" >
|
||||||
|
<% if (!Array.isArray( tj?.videos)) { %>
|
||||||
|
<p> No content on this channel :c <% if (Array?.isArray( shorts.videos)) { %> try <a href="/channel?id=<%=ID%>&tab=shorts"> Try Looking at shorts maybe lol :p</a> </p>
|
||||||
|
<% } %>
|
||||||
|
<% } %>
|
||||||
|
|
||||||
<% if (Array.isArray( tj?.videos)) { %>
|
<% if (Array.isArray( tj?.videos)) { %>
|
||||||
|
|
||||||
<% tj.videos.forEach (x => { %>
|
<% tj.videos.forEach (x => { %>
|
||||||
<a href="/watch?v=<%- x.videoId %>" class="video">
|
<a href="/watch?v=<%- x.videoId %>" class="video">
|
||||||
<div class="thumbnail" style="background-image: url('<%- media_proxy_url %>/proxy?url=https://vid.puffyan.us/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw');border-radius: 10px;"><span class="video-length"><%- turntomins(x.lengthSeconds) %></span></div>
|
<div class="thumbnail" style="background-image: url('<%- media_proxy_url %>/proxy?url=https://i.ytimg.com/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw');border-radius: 10px;"><span class="video-length"><%- turntomins(x.lengthSeconds) %></span></div>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<span class="title max-lines-2" style="font-family:PokeTube flex,sans-serif;font-weight: 1000;font-stretch: ultra-expanded;"><%- x.title %></span>
|
<span class="title max-lines-2" style="font-family:PokeTube flex,sans-serif;font-weight: 1000;font-stretch: ultra-expanded;"><%- x.title %></span>
|
||||||
|
|
||||||
@@ -1244,12 +1271,33 @@ width: fit-content;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<% if (tj?.continuation) { %>
|
<% if (tj?.continuation) { %>
|
||||||
<div class="pagination-buttons" style="border-top: none;justify-content: center">
|
<div class="pagination-buttons" style="border-top: none;justify-content: center">
|
||||||
<a style="color:#fff" href="/channel?id=<%=ID%>&continuation=<%=tj.continuation%>">Next Page</a>
|
<a style="color:#fff" href="/channel?id=<%=ID%>&continuation=<%=tj.continuation%>">Next Page</a>
|
||||||
</div>
|
</div>
|
||||||
|
<% if (!isMobile) { %>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
window.addEventListener('scroll', function() {
|
||||||
|
if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
|
||||||
|
var currentUrl = new URL(window.location.href);
|
||||||
|
var params = new URLSearchParams(currentUrl.search);
|
||||||
|
var continuationValue = '<%=tj.continuation%>';
|
||||||
|
|
||||||
|
if (params.has('continuation')) {
|
||||||
|
params.set('continuation', continuationValue);
|
||||||
|
} else {
|
||||||
|
params.append('continuation', continuationValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentUrl.search = params.toString();
|
||||||
|
window.location.href = currentUrl.toString();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script> <% } %>
|
||||||
|
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
@@ -1286,7 +1334,7 @@ width: fit-content;
|
|||||||
<% if (Array?.isArray( shorts.videos)) { %>
|
<% if (Array?.isArray( shorts.videos)) { %>
|
||||||
<% shorts.videos.forEach (x => { %>
|
<% shorts.videos.forEach (x => { %>
|
||||||
<a href="/shorts/<%- x.videoId %>" class="shorts-video" >
|
<a href="/shorts/<%- x.videoId %>" class="shorts-video" >
|
||||||
<img load="lazy" onerror="this.src=`<%- media_proxy_url %>/proxy?url=https://vid.puffyan.us/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw`" src='<%- media_proxy_url %>/proxy?url=https://vid.puffyan.us/vi/<%= x.videoId %>/maxresdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw'>
|
<img load="lazy" onerror="this.src=`<%- media_proxy_url %>/proxy?url=https://i.ytimg.com/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw`" src='<%- media_proxy_url %>/proxy?url=https://i.ytimg.com/vi/<%= x.videoId %>/maxresdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw'>
|
||||||
<span class="shorts-title"><%- x.title %></span>
|
<span class="shorts-title"><%- x.title %></span>
|
||||||
</a>
|
</a>
|
||||||
<% }) %>
|
<% }) %>
|
||||||
@@ -1387,7 +1435,7 @@ width: fit-content;
|
|||||||
|
|
||||||
<% stream.videos.forEach (x => { %>
|
<% stream.videos.forEach (x => { %>
|
||||||
<a href="/watch?v=<%- x.videoId %>" class="video">
|
<a href="/watch?v=<%- x.videoId %>" class="video">
|
||||||
<div class="thumbnail" style="background-image: url('<%- media_proxy_url %>/proxy?url=https://vid.puffyan.us/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw');border-radius: 10px;"><span class="video-length"><%- turntomins(x.lengthSeconds) %></span></div>
|
<div class="thumbnail" style="background-image: url('<%- media_proxy_url %>/proxy?url=https://i.ytimg.com/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw');border-radius: 10px;"><span class="video-length"><%- turntomins(x.lengthSeconds) %></span></div>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<span class="title max-lines-2" style="font-family:PokeTube flex,sans-serif;font-weight: 1000;font-stretch: ultra-expanded;"><%- x.title %></span>
|
<span class="title max-lines-2" style="font-family:PokeTube flex,sans-serif;font-weight: 1000;font-stretch: ultra-expanded;"><%- x.title %></span>
|
||||||
|
|
||||||
@@ -1450,6 +1498,10 @@ width: fit-content;
|
|||||||
|
|
||||||
<% if (tab === "community") { %>
|
<% if (tab === "community") { %>
|
||||||
<% if (Array?.isArray( c?.comments)) { %>
|
<% if (Array?.isArray( c?.comments)) { %>
|
||||||
|
<div style="max-width: 800px;margin: 20px auto;padding: 20px;border-radius: 8px;background: linear-gradient( 135deg, #f97794 10%, #623aa2 100%, #8e6f7e 100% );box-shadow: 0 2px 4px rgba(0,0,0,0.1);margin-bottom: -1em;">
|
||||||
|
<h1 style="color: #fff;font-family: 'PokeTube Flex';text-align: center !important;font-stretch: ultra-expanded;font-weight: 1000;">Welcoem to posts!!</h1>
|
||||||
|
<p>in the future - u will be able to do some more stuff here,,,!! like pat catgirl- i mean um yeah... for now u can only see others's posts :c </p>
|
||||||
|
</div>
|
||||||
<div class="community">
|
<div class="community">
|
||||||
|
|
||||||
<% c?.comments?.forEach (x => { %>
|
<% c?.comments?.forEach (x => { %>
|
||||||
@@ -1457,7 +1509,7 @@ width: fit-content;
|
|||||||
|
|
||||||
|
|
||||||
<h5 style="display: flex;margin-top: -1em;padding-top: 10px;margin-bottom:10px"><div class="thumb">
|
<h5 style="display: flex;margin-top: -1em;padding-top: 10px;margin-bottom:10px"><div class="thumb">
|
||||||
<a href="/channel?id=UC0n83khlA76NRfDfm7BNtkQ" class="avatar" style="width: 40px;height: 40px;">
|
<a href="/channel?id=<%- x.authorId %>" class="avatar" style="width: 40px;height: 40px;">
|
||||||
<img src="https://p.poketube.fun/<%=j.Channel?.Metadata.Avatars.Thumbnail.$t%>">
|
<img src="https://p.poketube.fun/<%=j.Channel?.Metadata.Avatars.Thumbnail.$t%>">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
@@ -1470,8 +1522,7 @@ width: fit-content;
|
|||||||
</a>
|
</a>
|
||||||
|
|
||||||
<span>
|
<span>
|
||||||
<br> <%- x.publishedText %> - <span>
|
<br> Posted <%- x.publishedText %> <span>
|
||||||
<%- convert(x.likeCount) %> likes
|
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
</span>
|
</span>
|
||||||
@@ -1497,7 +1548,7 @@ width: fit-content;
|
|||||||
<video class="player" style="border-radius: 16px;
|
<video class="player" style="border-radius: 16px;
|
||||||
" controls
|
" controls
|
||||||
|
|
||||||
poster="<%- media_proxy_url %>/proxy?url=https://vid.puffyan.us/vi/<%=x.attachment.videoId%>/maxresdefault.jpg?v=607ddcd4">
|
poster="<%- media_proxy_url %>/proxy?url=https://i.ytimg.com/vi/<%=x.attachment.videoId%>/maxresdefault.jpg?v=607ddcd4">
|
||||||
|
|
||||||
|
|
||||||
<source src="https://tube.kuylar.dev/proxy/media/<%=x.attachment.videoId%>/22" type="video/mp4; codecs="avc1.64001F, mp4a.40.2"" label="hd720" selected="false">
|
<source src="https://tube.kuylar.dev/proxy/media/<%=x.attachment.videoId%>/22" type="video/mp4; codecs="avc1.64001F, mp4a.40.2"" label="hd720" selected="false">
|
||||||
@@ -1519,7 +1570,7 @@ width: fit-content;
|
|||||||
|
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
|
<p> <i class="fa-light fa-thumbs-up"></i> <%- convert(x.likeCount) %> - <i class="fa-light fa-reply"></i> <%- convert(x.replyCount) %> </p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
@@ -1568,17 +1619,30 @@ width: fit-content;
|
|||||||
|
|
||||||
<div onclick="closePopup()" id="popup-container">
|
<div onclick="closePopup()" id="popup-container">
|
||||||
<div id="close-btn" onclick="closePopup()">X</div>
|
<div id="close-btn" onclick="closePopup()">X</div>
|
||||||
|
<div class="video-title" style=";font-stretch: extra-expanded;margin-top: 10px;margin-bottom: -10px;padding: 10px;border-top-left-radius: 11px;border-top-right-radius: 11px;font-family: "poketube flex" , sans-serif;font-weight: 850;text-align: left;">About</div>
|
||||||
<% if (cinv.descriptionHtml) { %>
|
<% if (cinv.descriptionHtml) { %>
|
||||||
|
|
||||||
<p style="color:#fff;margin-left: 10px;font-weight: bold;text-align: left;"><%-cinv.descriptionHtml%></p>
|
<p style="color:#fff;margin-left: 10px;font-weight: bold;text-align: left;"><%-cinv.descriptionHtml%></p>
|
||||||
|
<% if (Array.isArray(cinv?.tags)) { %>
|
||||||
|
<div class="video-title" style=";font-stretch: extra-expanded;margin-top: 10px;margin-bottom: -10px;padding: 10px;border-top-left-radius: 11px;border-top-right-radius: 11px;font-family: "poketube flex" , sans-serif;font-weight: 1000;text-align: left;">Tags</div>
|
||||||
|
<div class="tags-channel" style="padding: 10px;background: #272727;margin-top: 10px;border-radius: 11px;">
|
||||||
|
<br>
|
||||||
|
<% cinv.tags.forEach(x => { %>
|
||||||
|
<div class="tag-channel">
|
||||||
|
<a href="/hashtag/<%=x %>" style="color:var(--text-color)">
|
||||||
|
<%=x %>
|
||||||
|
</a>
|
||||||
|
</div> <% }) %>
|
||||||
|
<% } %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
|
|
||||||
<% } %>
|
<% } %>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
<script src="/css/custom-css.js"> </script>
|
<script src="/css/custom-css.js?v=884"> </script>
|
||||||
<script>
|
<script>
|
||||||
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later
|
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later
|
||||||
|
|
||||||
@@ -1649,6 +1713,12 @@ document.getElementById('search').addEventListener('keyup', function () {
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
togglePopup();
|
togglePopup();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
document.addEventListener('keydown', function (event) {
|
||||||
|
if (event.key === 'Escape' && isPopupOpen) {
|
||||||
|
closePopup();
|
||||||
|
}
|
||||||
|
});
|
||||||
// @license-end
|
// @license-end
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -20,22 +20,21 @@
|
|||||||
|
|
||||||
<!DOCTYPE html><html>
|
<!DOCTYPE html><html>
|
||||||
<head>
|
<head>
|
||||||
<title>PokeTube - Privacy Is Your Right</title>
|
<title>Poke | Discover</title>
|
||||||
<link href=/css/yt-ukraine.svg?v=6 rel=icon>
|
<link href="/css/yt-ukraine.svg?v=6" rel=icon>
|
||||||
<meta content=website property=og:type>
|
<meta content=website property=og:type>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<meta content="Poke - Discover" property=og:title>
|
<meta content="Poke - Discover" property=og:title>
|
||||||
<meta content="Discover Popular videos on poke!" property=twitter:description>
|
<meta content="Discover Popular videos on poke!" property=twitter:description>
|
||||||
<meta content="https://cdn.glitch.global/d68d17bb-f2c0-4bc3-993f-50902734f652/aa70111e-5bcd-4379-8b23-332a33012b78.image.png?v=1701898829884" property=og:image>
|
<meta content="https://cdn.glitch.global/d68d17bb-f2c0-4bc3-993f-50902734f652/aa70111e-5bcd-4379-8b23-332a33012b78.image.png?v=1701898829884" property=og:image>
|
||||||
<meta content=summary_large_image name=twitter:card>
|
<meta content=summary_large_image name=twitter:card>
|
||||||
<meta content=@PoketaleBot name=twitter:site>
|
|
||||||
<meta content=@PoketaleBot name=twitter:creator>
|
|
||||||
<link rel="manifest" href="/manifest.json">
|
<link rel="manifest" href="/manifest.json">
|
||||||
<meta name="darkreader-lock"> <!-- tells dark reader that the site has a dark theme and to turn itself off -->
|
<meta name="darkreader-lock"> <!-- tells dark reader that the site has a dark theme and to turn itself off -->
|
||||||
<link href=/css/app-cdn.min.css rel=stylesheet>
|
|
||||||
<link href=/css/app-cdn.min.css rel=stylesheet>
|
<link href="/css/app-cdn.min.css" rel=stylesheet>
|
||||||
<link href=/css/app.main.css?v=44600 rel=stylesheet>
|
<link href="/css/app-cdn.min.css" rel=stylesheet>
|
||||||
<link href=/css/search.main.css?v=57 rel=stylesheet>
|
<link href="/css/app.main.css?v=44600" rel=stylesheet>
|
||||||
|
<link href="/css/search.main.css?v=57" rel=stylesheet>
|
||||||
<link href=/css/watch.main.css rel=stylesheet>
|
<link href=/css/watch.main.css rel=stylesheet>
|
||||||
<meta content="#1a1a1a" name="theme-color">
|
<meta content="#1a1a1a" name="theme-color">
|
||||||
</head>
|
</head>
|
||||||
@@ -56,7 +55,8 @@
|
|||||||
src:url('https://p.poketube.fun/https://cdn.statically.io/gh/brecert/discord-quote-generator/main/Ginto-Nord-800.woff') format("woff");
|
src:url('https://p.poketube.fun/https://cdn.statically.io/gh/brecert/discord-quote-generator/main/Ginto-Nord-800.woff') format("woff");
|
||||||
}
|
}
|
||||||
|
|
||||||
</style> <style nonce="IJD3y0awTwA2dd0pWOP+ZQ">
|
</style>
|
||||||
|
<style nonce="IJD3y0awTwA2dd0pWOP+ZQ">
|
||||||
#yt-masthead{line-height:0;margin:15px auto;width:440px;margin-top:25px}#logo-container{margin-right:5px;float:left;cursor:pointer;text-decoration:none}.logo{background:no-repeat url("//www.gstatic.com/youtube/img/branding/youtubelogo/1x/youtubelogo_30.png");width:125px;height:30px;cursor:pointer;display:inline-block}#masthead-search{display:flex;margin-top:3px;max-width:650px;overflow:hidden;padding:0;position:relative}.search-button{border-left:0;-moz-border-radius-topleft:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;float:right;height:29px;padding:0;border:solid 1px transparent;border-color:#ffff;background:#999;;color:#333;cursor:pointer}.search-button:hover{border-color:#c6c6c6;background:#f0f0f0;box-shadow:0 1px 0 rgba(0,0,0,0.0)}.search-button-content{border:none;display:block;opacity:.6;padding:0;text-indent:-10000px;background:no-repeat url(//www.gstatic.com/youtube/src/web/htdocs/img/search.png);background-size:auto;width:15px;height:15px;box-shadow:none;margin:0 25px}#masthead-search-terms-border{flex:1 1 auto;border:1px solid #ccc;box-shadow:inset 0 1px 2px #eee;background-color:#fff;font-size:14px;height:29px;line-height:30px;margin:0 0 2px;overflow:hidden;position:relative;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color .2s ease;transition:border-color .2s ease}#masthead-search-terms{background:#2c2f33;border:0;font-size:16px;height:100%;left:0;margin:0;outline:none;padding:2px 6px;position:absolute;width:100%;-moz-box-sizing:border-box;box-sizing:border-box}
|
#yt-masthead{line-height:0;margin:15px auto;width:440px;margin-top:25px}#logo-container{margin-right:5px;float:left;cursor:pointer;text-decoration:none}.logo{background:no-repeat url("//www.gstatic.com/youtube/img/branding/youtubelogo/1x/youtubelogo_30.png");width:125px;height:30px;cursor:pointer;display:inline-block}#masthead-search{display:flex;margin-top:3px;max-width:650px;overflow:hidden;padding:0;position:relative}.search-button{border-left:0;-moz-border-radius-topleft:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;float:right;height:29px;padding:0;border:solid 1px transparent;border-color:#ffff;background:#999;;color:#333;cursor:pointer}.search-button:hover{border-color:#c6c6c6;background:#f0f0f0;box-shadow:0 1px 0 rgba(0,0,0,0.0)}.search-button-content{border:none;display:block;opacity:.6;padding:0;text-indent:-10000px;background:no-repeat url(//www.gstatic.com/youtube/src/web/htdocs/img/search.png);background-size:auto;width:15px;height:15px;box-shadow:none;margin:0 25px}#masthead-search-terms-border{flex:1 1 auto;border:1px solid #ccc;box-shadow:inset 0 1px 2px #eee;background-color:#fff;font-size:14px;height:29px;line-height:30px;margin:0 0 2px;overflow:hidden;position:relative;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color .2s ease;transition:border-color .2s ease}#masthead-search-terms{background:#2c2f33;border:0;font-size:16px;height:100%;left:0;margin:0;outline:none;padding:2px 6px;position:absolute;width:100%;-moz-box-sizing:border-box;box-sizing:border-box}
|
||||||
</style>
|
</style>
|
||||||
<body>
|
<body>
|
||||||
@@ -80,65 +80,12 @@ summary:hover{
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<!-- WIGGLE WIGGLE WIGGLE -->
|
<style>
|
||||||
<style>
|
|
||||||
body{
|
body{
|
||||||
overflow-x: hidden; /* Hide horizontal scrollbar */
|
overflow-x: hidden; /* Hide horizontal scrollbar */
|
||||||
color:#111111
|
color:#111111
|
||||||
}
|
}
|
||||||
|
|
||||||
.animated {
|
|
||||||
-webkit-animation-duration: 10s;
|
|
||||||
animation-duration: 10s;
|
|
||||||
-webkit-animation-fill-mode: both;
|
|
||||||
animation-fill-mode: both;
|
|
||||||
animation-iteration-count: infinite;
|
|
||||||
-moz-animation-iteration-count: infinite;
|
|
||||||
-webkit-animation-iteration-count: infinite;
|
|
||||||
-o-animation-iteration-count: infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@-webkit-keyframes wiggle {
|
|
||||||
0% { -webkit-transform: skewX(9deg); }
|
|
||||||
10% { -webkit-transform: skewX(-8deg); }
|
|
||||||
20% { -webkit-transform: skewX(7deg); }
|
|
||||||
30% { -webkit-transform: skewX(-6deg); }
|
|
||||||
40% { -webkit-transform: skewX(5deg); }
|
|
||||||
50% { -webkit-transform: skewX(-4deg); }
|
|
||||||
60% { -webkit-transform: skewX(3deg); }
|
|
||||||
70% { -webkit-transform: skewX(-2deg); }
|
|
||||||
80% { -webkit-transform: skewX(1deg); }
|
|
||||||
90% { -webkit-transform: skewX(0deg); }
|
|
||||||
100% { -webkit-transform: skewX(0deg); }
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes wiggle {
|
|
||||||
0% { transform: skewX(9deg); }
|
|
||||||
10% { transform: skewX(-8deg); }
|
|
||||||
20% { transform: skewX(7deg); }
|
|
||||||
30% { transform: skewX(-6deg); }
|
|
||||||
40% { transform: skewX(5deg); }
|
|
||||||
50% { transform: skewX(-4deg); }
|
|
||||||
60% { transform: skewX(3deg); }
|
|
||||||
70% { transform: skewX(-2deg); }
|
|
||||||
80% { transform: skewX(1deg); }
|
|
||||||
90% { transform: skewX(0deg); }
|
|
||||||
100% { transform: skewX(0deg); }
|
|
||||||
}
|
|
||||||
|
|
||||||
.wiggle {
|
|
||||||
-webkit-animation-name: wiggle;
|
|
||||||
animation-name: wiggle;
|
|
||||||
-webkit-animation-timing-function: ease-in;
|
|
||||||
animation-timing-function: ease-in;
|
|
||||||
}
|
|
||||||
|
|
||||||
.animated.wiggle {
|
|
||||||
-webkit-animation-duration: 0.75s;
|
|
||||||
animation-duration: 0.75s;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--text-primary: #fff;
|
--text-primary: #fff;
|
||||||
--text-secondary: #fff;
|
--text-secondary: #fff;
|
||||||
@@ -187,14 +134,19 @@ summary:hover{
|
|||||||
}
|
}
|
||||||
|
|
||||||
.progress-bar {
|
.progress-bar {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
width: 0%;
|
width: 0%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background-color: purple;
|
background-image: linear-gradient(to right,
|
||||||
|
#ff0045,
|
||||||
|
#ff0e55,
|
||||||
|
#ff1d79
|
||||||
|
);
|
||||||
transition: width 0.5s ease-in-out;
|
transition: width 0.5s ease-in-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
.video > .info > .title {
|
.video > .info > .title {
|
||||||
color: var(--text-primary) !important;
|
color: var(--text-primary) !important;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@@ -234,8 +186,7 @@ margin-right: auto;
|
|||||||
color: black;
|
color: black;
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
section p {
|
||||||
<style>section p {
|
|
||||||
font-family:Whitney, Helvetica Neue, Helvetica, Arial, sans-serif;
|
font-family:Whitney, Helvetica Neue, Helvetica, Arial, sans-serif;
|
||||||
font-weight:400;
|
font-weight:400;
|
||||||
color:#fff;
|
color:#fff;
|
||||||
@@ -327,11 +278,9 @@ margin-left: auto;
|
|||||||
background: var(--not-quite-black);
|
background: var(--not-quite-black);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
border-radius: 1em;
|
border-radius: 1em;
|
||||||
} </style>
|
}
|
||||||
|
|
||||||
|
|
||||||
<style>
|
|
||||||
|
|
||||||
@keyframes gradient {
|
@keyframes gradient {
|
||||||
0% {
|
0% {
|
||||||
background-position: 0 50%;
|
background-position: 0 50%;
|
||||||
@@ -352,8 +301,9 @@ margin-left: auto;
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
.video-grid > .video:hover{
|
.video-grid > .video:hover{
|
||||||
border:solid;
|
border:solid #ff0033;
|
||||||
}
|
}
|
||||||
|
|
||||||
.video-grid > .video {
|
.video-grid > .video {
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
background: black;
|
background: black;
|
||||||
@@ -413,12 +363,10 @@ border:solid;
|
|||||||
<div class="channel-page" >
|
<div class="channel-page" >
|
||||||
<audio id="audio" style="display:none;" loop autoplay></audio>
|
<audio id="audio" style="display:none;" loop autoplay></audio>
|
||||||
|
|
||||||
<img src="https://t.poketube.fun/t/rep.gif" style="width: 0;visibility: hidden;display:none;" id="discover_main">
|
|
||||||
|
|
||||||
|
|
||||||
<h1 style="font-size: 2em;margin-left: auto;margin-right: auto;text-align: center;font-family: poketube flex;font-weight: 1000;font-stretch: ultra-expanded;color: #fff;margin-bottom: 7px;margin-top: 31px;">
|
<h1 style="font-size: 2em;margin-left: auto;margin-right: auto;text-align: center;font-family: poketube flex;font-weight: 1000;font-stretch: ultra-expanded;color: #fff;margin-bottom: 7px;margin-top: 31px;">
|
||||||
Discover Popular videos on poketube!
|
Popular Videos On Poke :3 </h1>
|
||||||
</h1>
|
|
||||||
<% if (!tab) { %>
|
<% if (!tab) { %>
|
||||||
|
|
||||||
<div class="tabs tabs-center">
|
<div class="tabs tabs-center">
|
||||||
@@ -492,9 +440,9 @@ Discover Popular videos on poketube!
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="video-grid" style="border-radius:12px">
|
<div class="video-grid" style="border-top-left-radius:2em;width: 80em;border-top-right-radius: 2em;border: solid 1px #df03a8;">
|
||||||
<% inv.forEach(x => { %>
|
<% inv.forEach(x => { %>
|
||||||
<a href="/watch?v=<%- x.videoId %>" class="video">
|
<a href="/watch?v=<%- x.videoId %>" class="video canloadhd" data-author="<%- x.author %>" >
|
||||||
<div class="thumbnail" style="background-image: url('/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw');border-radius: 10px;"><span class="video-length"><%- turntomins(x.lengthSeconds) %></span></div>
|
<div class="thumbnail" style="background-image: url('/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw');border-radius: 10px;"><span class="video-length"><%- turntomins(x.lengthSeconds) %></span></div>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<span class="title max-lines-2" title="<%- x.title %>" style="font-family:Inter,sans-serif;"><%- x.title %></span>
|
<span class="title max-lines-2" title="<%- x.title %>" style="font-family:Inter,sans-serif;"><%- x.title %></span>
|
||||||
@@ -507,7 +455,6 @@ Discover Popular videos on poketube!
|
|||||||
|
|
||||||
<% }) %>
|
<% }) %>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -518,9 +465,6 @@ Discover Popular videos on poketube!
|
|||||||
<script>
|
<script>
|
||||||
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later
|
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later
|
||||||
|
|
||||||
if ('serviceWorker' in navigator) {
|
|
||||||
navigator.serviceWorker.register('service-worker.js');
|
|
||||||
}
|
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
let bgs = document.querySelectorAll('[data-bg]');
|
let bgs = document.querySelectorAll('[data-bg]');
|
||||||
@@ -614,7 +558,6 @@ element.addEventListener('mouseleave', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
element.addEventListener('wheel', (e) => {
|
element.addEventListener('wheel', (e) => {
|
||||||
// You can also handle mouse wheel events for kinetic scrolling
|
|
||||||
// Adjust the scrollTop based on e.deltaY
|
// Adjust the scrollTop based on e.deltaY
|
||||||
element.scrollTop += e.deltaY;
|
element.scrollTop += e.deltaY;
|
||||||
});
|
});
|
||||||
@@ -1063,7 +1006,7 @@ margin-left: auto;
|
|||||||
<div class="app" >
|
<div class="app" >
|
||||||
<nav>
|
<nav>
|
||||||
|
|
||||||
<div class=left><a class="class" href="/" style=font-family:Inter,sans-serif;color:#fff> <img style="width: 8.5em;display: block;margin-left: auto;margin-right: auto;" src="/css/logo-mobile.svg"> </a>
|
<div class=left><a class="class" href="/" style=font-family:Inter,sans-serif;color:#fff> <img style="width: 8.5em;display: block;margin-left: auto;margin-right: auto;" src="/css/logo-poke.svg"> </a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
@@ -1097,7 +1040,7 @@ margin-left: auto;
|
|||||||
|
|
||||||
<div class="tabs tabs-center" style="margin: 0px;">
|
<div class="tabs tabs-center" style="margin: 0px;">
|
||||||
|
|
||||||
<a href="?tab=popular" class="tab">Popular</a>
|
<a href="?tab=popular" style="display:none" class="tab">Popular</a>
|
||||||
|
|
||||||
<a class="tab active">Trends</a>
|
<a class="tab active">Trends</a>
|
||||||
|
|
||||||
@@ -1111,7 +1054,7 @@ margin-left: auto;
|
|||||||
|
|
||||||
<a class="tab active">Popular</a>
|
<a class="tab active">Popular</a>
|
||||||
|
|
||||||
<a href="/app" class="tab Activw">Trends</a>
|
<a href="/app" class="tab active">Trends</a>
|
||||||
</div>
|
</div>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% if (!tab) { %>
|
<% if (!tab) { %>
|
||||||
@@ -1195,9 +1138,9 @@ Privacy
|
|||||||
|
|
||||||
|
|
||||||
<% if (tab == "search") { %>
|
<% if (tab == "search") { %>
|
||||||
<a href="/app"><-- </a><br>
|
<a href="/app"><-- go back to trendsz </a><br>
|
||||||
<span>
|
<br> <span>
|
||||||
Search morbillion amount of videos from poketube !!
|
Search videos on poke! poke is a youtube front end so all of the videos on youtube should workm!!
|
||||||
</span>
|
</span>
|
||||||
<div class=search>
|
<div class=search>
|
||||||
|
|
||||||
@@ -1207,7 +1150,7 @@ Privacy
|
|||||||
<input class="search-bar" autocomplete="on" id="fname" name="mobilesearch" placeholder="Search some videos lol "style="color:#fff;font-family:Inter,sans-serif;border-radius: 8px;">
|
<input class="search-bar" autocomplete="on" id="fname" name="mobilesearch" placeholder="Search some videos lol "style="color:#fff;font-family:Inter,sans-serif;border-radius: 8px;">
|
||||||
|
|
||||||
|
|
||||||
<button class="btn btn-success" type=submit>
|
<button class="btn btn-success" style="border-radius:1em" type=submit>
|
||||||
<i class="fa-light fa-search" style="margin: auto;"></i></button></form>
|
<i class="fa-light fa-search" style="margin: auto;"></i></button></form>
|
||||||
<img src="https://t.poketube.fun/t/rep.gif" style="border:0;width: 0;visibility: hidden;">
|
<img src="https://t.poketube.fun/t/rep.gif" style="border:0;width: 0;visibility: hidden;">
|
||||||
|
|
||||||
@@ -1232,7 +1175,7 @@ Privacy
|
|||||||
|
|
||||||
<div class="video-grid" style="background-color: var(--app-background);margin-top: -4em;">
|
<div class="video-grid" style="background-color: var(--app-background);margin-top: -4em;">
|
||||||
<span style="margin-bottom: -8em;margin-top: 8px;">
|
<span style="margin-bottom: -8em;margin-top: 8px;">
|
||||||
<%=j.Search.estimatedResults.toLocaleString()%> Results (estimated)
|
<%=j.Search.estimatedResults.toLocaleString()%> Results
|
||||||
</span>
|
</span>
|
||||||
<% j.Search.Results.Video.forEach(x => { %>
|
<% j.Search.Results.Video.forEach(x => { %>
|
||||||
|
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
along with this program. If not, see https://www.gnu.org/licenses/.
|
along with this program. If not, see https://www.gnu.org/licenses/.
|
||||||
--><!DOCTYPE html><html>
|
--><!DOCTYPE html><html>
|
||||||
<head>
|
<head>
|
||||||
<title>PokeTube | Download Video </title>
|
<title>Poke | Download Video </title>
|
||||||
<meta content="<%=color%>" name="theme-color">
|
<meta content="<%=color%>" name="theme-color">
|
||||||
<link href=/css/yt-ukraine.svg?v=6 rel=icon>
|
<link href=/css/yt-ukraine.svg?v=7 rel=icon>
|
||||||
<link rel="manifest" href="/manifest.json">
|
<link rel="manifest" href="/manifest.json">
|
||||||
<meta content=website property=og:type>
|
<meta content=website property=og:type>
|
||||||
<meta name="viewport" content="width=device-1200px, initial-scale=1.0, shrink-to-fit=yes, viewport-fit=cover">
|
<meta name="viewport" content="width=device-1200px, initial-scale=1.0, shrink-to-fit=yes, viewport-fit=cover">
|
||||||
@@ -173,7 +173,9 @@ font-family:Ubuntu
|
|||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
background: #333;
|
background: #333;
|
||||||
height: 56em;
|
height: fit-content;
|
||||||
|
height: -moz-fit-content;
|
||||||
|
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
margin-top: 2em;
|
margin-top: 2em;
|
||||||
}
|
}
|
||||||
@@ -183,9 +185,9 @@ font-family:Ubuntu
|
|||||||
<body>
|
<body>
|
||||||
<% if (!isMobile) { %>
|
<% if (!isMobile) { %>
|
||||||
|
|
||||||
<div class="app" style="background:linear-gradient(135deg, #820622 10%, #4e2e82 100%, #725965 100%);height: 67em;">
|
<div class="app" style="background:linear-gradient(135deg, #820622 10%, #4e2e82 100%, #725965 100%);height: 162em;">
|
||||||
<nav>
|
<nav>
|
||||||
<div class=left><a class="class" href="/143" style=font-family:Inter,sans-serif;color:#fff><img style="transform: scale(1.3);padding-left:0.9em;width: 8.5em;display: block;margin-left: auto;margin-right: auto;" src="/css/logo.svg?v=5"> </a> </div>
|
<div class=left><a class="class" href="/143" style=font-family:Inter,sans-serif;color:#fff><img style="transform: scale(1.3);padding-left:0.9em;width: 8.5em;display: block;margin-left: auto;margin-right: auto;" src="/css/logo-poke.svg?v=5"> </a> </div>
|
||||||
<div class="middle">
|
<div class="middle">
|
||||||
<form action="/search"><input class="search-bar" autocomplete="on" id="fname" name="query" style="color:var(--text-color);font-family:poketube flex,sans-serif;border-radius: 2em;font-weight: 850;font-stretch: extra-expanded;" data-ddg-inputtype="identities.firstName">
|
<form action="/search"><input class="search-bar" autocomplete="on" id="fname" name="query" style="color:var(--text-color);font-family:poketube flex,sans-serif;border-radius: 2em;font-weight: 850;font-stretch: extra-expanded;" data-ddg-inputtype="identities.firstName">
|
||||||
<button class="btn btn-success" type="submit" style="transform: translate(21em, -1.25em);"><i class="fa-light fa-search"></i></button>
|
<button class="btn btn-success" type="submit" style="transform: translate(21em, -1.25em);"><i class="fa-light fa-search"></i></button>
|
||||||
@@ -237,17 +239,8 @@ font-family:Ubuntu
|
|||||||
|
|
||||||
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;/*! text-align: center; */"><div style="font-family:"PokeTube flex";font-stretch: ultra-expanded;font-weight: 700;">
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;/*! text-align: center; */"><div style="font-family:"PokeTube flex";font-stretch: ultra-expanded;font-weight: 700;">
|
||||||
<% } %>
|
<% } %>
|
||||||
3GPP
|
|
||||||
</div>
|
|
||||||
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=17">
|
|
||||||
<i class="fa-light fa-download"></i>
|
|
||||||
Download
|
|
||||||
</a>
|
|
||||||
<br>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;/*! text-align: center; */"><div style="font-family:"PokeTube flex";font-stretch: ultra-expanded;font-weight: 700;">
|
MP4 - 480p
|
||||||
MP4 (480p)
|
|
||||||
</div>
|
</div>
|
||||||
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=18">
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=18">
|
||||||
<i class="fa-light fa-download"></i>
|
<i class="fa-light fa-download"></i>
|
||||||
@@ -256,24 +249,33 @@ font-family:Ubuntu
|
|||||||
<br>
|
<br>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;/*! text-align: center; */"> <div style="font-family:"PokeTube flex";font-stretch: ultra-expanded;font-weight: 700;"> MP4 (720p)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="format-list" style="margin-top: 2em;">
|
||||||
|
|
||||||
|
<h2>Audio-Only formats</h2>
|
||||||
|
|
||||||
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;/*! text-align: center; */"> <div style="font-family:"PokeTube flex";font-stretch: ultra-expanded;font-weight: 700;"> m4a (low)
|
||||||
</div>
|
</div>
|
||||||
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>">
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=139&f=webm">
|
||||||
<i class="fa-light fa-download"></i>
|
<i class="fa-light fa-download"></i>
|
||||||
Download
|
Download
|
||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- ignore this -->
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;/*! text-align: center; */"> <div style="font-family:"PokeTube flex";font-stretch: ultra-expanded;font-weight: 700;"> m4a (high)
|
||||||
<p style="visibility: hidden;">
|
</div>
|
||||||
we dont see the videos that you are downloading :P
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=140&f=webm">
|
||||||
</p>
|
<i class="fa-light fa-download"></i>
|
||||||
</div>
|
Download
|
||||||
|
</a>
|
||||||
<div class="format-list" style="margin-top: -2em;">
|
<br>
|
||||||
|
</div>
|
||||||
<h2>Audio-Only formats</h2>
|
|
||||||
|
|
||||||
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;/*! text-align: center; */"> <div style="font-family:"PokeTube flex";font-stretch: ultra-expanded;font-weight: 700;"> webm (low)
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;/*! text-align: center; */"> <div style="font-family:"PokeTube flex";font-stretch: ultra-expanded;font-weight: 700;"> webm (low)
|
||||||
</div>
|
</div>
|
||||||
@@ -293,6 +295,117 @@ font-family:Ubuntu
|
|||||||
<br>
|
<br>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="format-list" style="margin-top: 2em;">
|
||||||
|
<h2>Video-Only formats</h2>
|
||||||
|
|
||||||
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;">
|
||||||
|
<div style="font-family:'PokeTube flex';font-stretch: ultra-expanded;font-weight: 700;">144p - MP4</div>
|
||||||
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=160&f=mp4">
|
||||||
|
<i class="fa-light fa-download"></i>
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;">
|
||||||
|
<div style="font-family:'PokeTube flex';font-stretch: ultra-expanded;font-weight: 700;">144p - WEBM</div>
|
||||||
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=278&f=webm">
|
||||||
|
<i class="fa-light fa-download"></i>
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;">
|
||||||
|
<div style="font-family:'PokeTube flex';font-stretch: ultra-expanded;font-weight: 700;">240p - MP4</div>
|
||||||
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=133&f=mp4">
|
||||||
|
<i class="fa-light fa-download"></i>
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;">
|
||||||
|
<div style="font-family:'PokeTube flex';font-stretch: ultra-expanded;font-weight: 700;">240p - WEBM</div>
|
||||||
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=242&f=webm">
|
||||||
|
<i class="fa-light fa-download"></i>
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;">
|
||||||
|
<div style="font-family:'PokeTube flex';font-stretch: ultra-expanded;font-weight: 700;">360p - MP4</div>
|
||||||
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=134&f=mp4">
|
||||||
|
<i class="fa-light fa-download"></i>
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;">
|
||||||
|
<div style="font-family:'PokeTube flex';font-stretch: ultra-expanded;font-weight: 700;">360p - WEBM</div>
|
||||||
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=243&f=webm">
|
||||||
|
<i class="fa-light fa-download"></i>
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;">
|
||||||
|
<div style="font-family:'PokeTube flex';font-stretch: ultra-expanded;font-weight: 700;">480p - MP4</div>
|
||||||
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=135&f=mp4">
|
||||||
|
<i class="fa-light fa-download"></i>
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;">
|
||||||
|
<div style="font-family:'PokeTube flex';font-stretch: ultra-expanded;font-weight: 700;">480p - WEBM</div>
|
||||||
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=244&f=webm">
|
||||||
|
<i class="fa-light fa-download"></i>
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;">
|
||||||
|
<div style="font-family:'PokeTube flex';font-stretch: ultra-expanded;font-weight: 700;">720p - MP4</div>
|
||||||
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=136&f=mp4">
|
||||||
|
<i class="fa-light fa-download"></i>
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;">
|
||||||
|
<div style="font-family:'PokeTube flex';font-stretch: ultra-expanded;font-weight: 700;">720p - WEBM</div>
|
||||||
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=247&f=webm">
|
||||||
|
<i class="fa-light fa-download"></i>
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;">
|
||||||
|
<div style="font-family:'PokeTube flex';font-stretch: ultra-expanded;font-weight: 700;">1080p - MP4</div>
|
||||||
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=137&f=mp4">
|
||||||
|
<i class="fa-light fa-download"></i>
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;">
|
||||||
|
<div style="font-family:'PokeTube flex';font-stretch: ultra-expanded;font-weight: 700;">1080p - WEBM</div>
|
||||||
|
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=248&f=webm">
|
||||||
|
<i class="fa-light fa-download"></i>
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- ignore this -->
|
<!-- ignore this -->
|
||||||
<p style="visibility: hidden;">
|
<p style="visibility: hidden;">
|
||||||
gfhefdhgrdfhdfshfgddfsfdgdfsds gfhefdhgrdfhdfshfgddfsfdgdfsds
|
gfhefdhgrdfhdfshfgddfsfdgdfsds gfhefdhgrdfhdfshfgddfsfdgdfsds
|
||||||
@@ -305,7 +418,7 @@ font-family:Ubuntu
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="/css/custom-css.js"> </script><script src="/css/data-mobile.js"> </script>
|
<script src="/css/custom-css.js?v=54"> </script><script src="/css/data-mobile.js?v=549"> </script>
|
||||||
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -139,7 +139,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script src="/static/data-mobile.js"></script
|
<script src="/static/data-mobile.js?v=5459"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|||||||
205
html/landing.ejs
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This Source Code Form is subject to the terms of the GNU General Public License:
|
This Source Code Form is subject to the terms of the GNU General Public License:
|
||||||
|
|
||||||
Copyright (C) 2021-2024 POKETUBE (https://codeberg.org/Ashley/poketube)
|
Copyright (C) 2021-2024 Poke (https://codeberg.org/Ashley/poke)
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -10,34 +10,43 @@
|
|||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see https://www.gnu.org/licenses/.
|
along with this program. If not, see https://www.gnu.org/licenses/.
|
||||||
--->
|
--->
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title>Poke | The Ultimate Privacy App!</title>
|
<title>Poke | The privacy app of your dreams!</title>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="theme-color" content="#414161">
|
<meta name="theme-color" content="#414161">
|
||||||
<meta http-equiv="content-language" content="en-us">
|
<meta http-equiv="content-language" content="en-us">
|
||||||
<meta name="viewport" content="width=device-1200px, initial-scale=1.0, shrink-to-fit=yes, viewport-fit=cover">
|
<meta name="viewport" content="width=device-1200px, initial-scale=1.0, shrink-to-fit=yes, viewport-fit=cover">
|
||||||
<link rel="stylesheet" href="/css/landing.css?v=244">
|
<link rel="stylesheet" href="/css/landing.css?v=2544">
|
||||||
<link rel="stylesheet" href="/css/snow.css">
|
<link rel="stylesheet" href="/css/snow.css">
|
||||||
<link href=/css/yt-ukraine.svg?v=6 rel=icon>
|
<link rel="stylesheet" href="/css/app.main.css">
|
||||||
|
<link href=/css/yt-ukraine.svg?v=7 rel=icon>
|
||||||
<link rel="manifest" href="/manifest.json">
|
<link rel="manifest" href="/manifest.json">
|
||||||
<meta name="darkreader-lock"> <!-- tells dark reader that the site has a dark theme and to turn itself off -->
|
<meta name="darkreader-lock"> <!-- tells dark reader that the site has a dark theme and to turn itself off -->
|
||||||
<meta content="▶▶ Poke - The Ultimate privacy App!" property=og:title>
|
<meta content="▶▶ Poke - The privacy app of your dreams!" property=og:title>
|
||||||
<meta content="Watch Silly videos or search the interwebs while being anonymous on poke!"
|
<% if(embedtype === "woke") { %>
|
||||||
property=twitter:description>
|
<meta content="Poke is a 𝔀𝓸𝓴𝓮 software YouTube front-end, search engine, translator, 𝔀𝓸𝓴𝓮 app, and even 𝔀𝓸𝓴𝓮!! Watch 𝔀𝓸𝓴𝓮 videos, search the internet, and do all of that and more 𝔀𝓸𝓴𝓮 in this all-in-one 𝔀𝓸𝓴𝓮 app!!!"
|
||||||
<meta
|
property="twitter:description">
|
||||||
content="https://cdn.glitch.global/d68d17bb-f2c0-4bc3-993f-50902734f652/aa70111e-5bcd-4379-8b23-332a33012b78.image.png?v=1701898829884"
|
<meta content="https://cdn.glitch.global/302c6ee0-629f-453b-9024-bad1f8d7be36/9fhFiXJ.png?v=1717357642758"
|
||||||
property="og:image" />
|
property="og:image">
|
||||||
|
<% } else { %>
|
||||||
|
<meta content="Poke is a free software YouTube front-end, search engine, translator, map app, and more!! Watch silly videos, search the internet, and do all of that and more anonymously in this all-in-one privacy app!!!"
|
||||||
|
property="twitter:description">
|
||||||
|
<meta content="https://cdn.glitch.global/302c6ee0-629f-453b-9024-bad1f8d7be36/poke.png?v=1716216428745"
|
||||||
|
property="og:image">
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
|
||||||
<meta content="summary_large_image" name="twitter:card" />
|
<meta content="summary_large_image" name="twitter:card" />
|
||||||
<% if(isOldWindows) { %>
|
<% if(isOldWindows) { %>
|
||||||
<style>
|
<style>
|
||||||
@@ -58,6 +67,26 @@
|
|||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.discover-video-button > a {
|
||||||
|
border: 2px white solid;
|
||||||
|
border-radius: 3rem;
|
||||||
|
padding: 12px 1em 12px 12px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
width: 146px;
|
||||||
|
text-align: center;
|
||||||
|
margin: auto;
|
||||||
|
color: #fff;
|
||||||
|
margin-bottom: 2em;
|
||||||
|
margin-top: 26px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.discover-video-button > a:hover {
|
||||||
|
filter: brightness(0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.subtitle {
|
.subtitle {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #FFFF00;
|
color: #FFFF00;
|
||||||
@@ -84,60 +113,108 @@
|
|||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<video id="HD-BG" playsinline autoplay muted loop><source src="/bg-full.webm" type="video/webm"/></video>
|
<div style="margin-top: 6em;margin-left: auto;margin-right: auto;margin-bottom: -7em;background: #000;padding: 1em;border-radius: 14px;font-family: ubuntu;"> <%- banner %></div>
|
||||||
<video id="SD-BG" playsinline autoplay muted loop><source src="/bg-480.webm" type="video/webm"/></video>
|
<%- include('./partials/header.ejs') %>
|
||||||
<div class="header">
|
<video playsinline muted paused><source src="/bg-480.webm" type="video/webm"/></video>
|
||||||
<div class="header-content">
|
|
||||||
<div class="header-content-start">
|
|
||||||
<a href="/" style="text-decoration:none;"><img style="width: 130px;" src="/css/logo-poke.svg" />
|
|
||||||
<p class="subtitle"> <%- random %></p>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="header-content-center" style="margin-left: -30px;">
|
|
||||||
<form action=/search><input class=search-bar autocomplete="on" id=fname name=query><button
|
|
||||||
class="btn btn-success" type=submit><i class="fa-light fa-search"></i></button></form>
|
|
||||||
</div>
|
|
||||||
<div class="header-content-end">
|
|
||||||
<a href="https://codeberg.org/Ashley/poketube/src/branch/main/instances.json"><i
|
|
||||||
class="fa-sharp fa-solid fa-server"></i></a>
|
|
||||||
<a href="/apps"><i class="fa-sharp fa-solid fa-grid-2"></i></a>
|
|
||||||
<a href="/game-hub"><i class="fa-sharp fa-solid fa-gamepad-modern"></i></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="features">
|
|
||||||
<a style="color: white; text-decoration: none;" href="https://war.ukraine.ua/donate/">
|
|
||||||
<p><i class="fa-duotone fa-handshake-angle"></i> Support Ukraine </p>
|
|
||||||
</a>
|
|
||||||
<a style="color: white; text-decoration: none;"
|
|
||||||
href="https://buildpalestine.com/2021/05/15/trusted-organizations-to-donate-to-palestine/">
|
|
||||||
<p><i class="fa-duotone fa-handshake-angle"></i> Support Palestine</p>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="landing">
|
<div class="landing">
|
||||||
<h1>The Ultimate Privacy App</h1>
|
<h1 style="text-align: center;">GUESS WHO'S BACK ...</h1>
|
||||||
<p style="max-width: 800px; text-align: center; margin: 20px auto;"> Be Anonymous watching epic videos, searching
|
<p style="max-width: 800px;text-align: center;margin: auto;margin-bottom: 3em;">...back again.. to save you from big tech and embrace the freedom of privacy!!1! :3 Poke is a free software YouTube front-end, search engine, translator, map app, and more!!1! Watch videos, search the web, and explore without a trace in this all-in-one privacy app!!1! :3</p>
|
||||||
thingys on the interwebs and listening to music on poketube - the free yt front end thats focused on ur privacy!!
|
<div style="text-align: center; padding: 10px; border-radius: 8px;margin-left: -1em;">
|
||||||
</p>
|
<details>
|
||||||
<div class="features">
|
<summary style="cursor: pointer; color: white; font-size: 18px; text-decoration: underline;">
|
||||||
<p><i class="fa-sharp fa-solid fa-eye-low-vision"></i> No Tracking & Ads</p>
|
Support Humanitarian Efforts
|
||||||
<p><i class="fa-sharp fa-solid fa-rabbit-running"></i>Very Fast</p>
|
</summary>
|
||||||
<p><i class="fa-sharp fa-solid fa-download"></i>Built-in video downloader</p>
|
<div style="margin-top: 10px;">
|
||||||
<p><i class="fa-sharp fa-solid fa-search"></i>Web Search</p>
|
<a style="color: white; text-decoration: underline; margin: 0 5px;" href="https://buildpalestine.com/2021/05/15/trusted-organizations-to-donate-to-palestine">
|
||||||
|
Support Palestine
|
||||||
|
</a>
|
||||||
|
<a style="color: white; text-decoration: underline; margin: 0px -6px;" href="https://gazaesims.com">
|
||||||
|
(or u can donate esims to Gaza!)
|
||||||
|
</a>
|
||||||
|
<span style="color: white; margin: 0 5px;"> - </span>
|
||||||
|
<a style="color: white; text-decoration: underline; margin: 0 5px;" href="https://war.ukraine.ua/donate">
|
||||||
|
Donate to 🇺🇦
|
||||||
|
</a>
|
||||||
|
<span style="color: white; margin: 0 5px;"> - </span>
|
||||||
|
<a style="color: white; text-decoration: underline; margin: 0 5px;" href="https://donate.unhcr.org/int/en/general">
|
||||||
|
Donate to other areas of military conflict
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<% if(!DisablePokeChan) { %>
|
||||||
|
<img src="/static/poke-chan-outfit-a.png" title="Poke-chan sitting :3">
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
<div style="display: flex; gap: 12px;">
|
||||||
|
<img src="/static/poke-screnshot-v2.png" />
|
||||||
|
<img src="/static/Poke-Mobile.jpg" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- source: https://picrew.me/share?cd=GD9wwCo5YY -->
|
<h1 style="margin-left: auto;margin-right: auto;text-align: center;margin-bottom: -1em;margin-top: 1em;">TOP 3 REASONS WHY POKE IZ COOL!!</h1>
|
||||||
<img src="/static/poke-chan-outfit-a.png"
|
<%
|
||||||
style="height: 400px;width: 369px;mask-image: none;margin-top: -14em;margin-left: -2em;margin-bottom: -13em;z-index: 999;position: absolute;-webkit-transform: scaleX(-1);transform: scaleX(-1);border-radius: 0px;"
|
const features = [
|
||||||
title="Poke-chan sitting :3">
|
{ title: "No Tracking and Ads", description: "Poke Has no Trackers or ads - we dont and we wont see the vids ur watching :3", icon: "<svg style='background: #ea6d6d;' width='24px' height='24px' viewBox='0 0 24 24' stroke-width='1.5' fill='none' xmlns='http://www.w3.org/2000/svg' color='#ffffff'><path d='M19.5 16L17.0248 12.6038' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M12 17.5V14' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M4.5 16L6.96895 12.6124' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M3 8C6.6 16 17.4 16 21 8' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/></svg>" },
|
||||||
<img src="/static/poke-screnshot-a.png" />
|
{ title: "Very Fast", description: "Poke is really ligthweight (both on server and client :3) so you can still use it on poor connections :3", icon: "<svg style='background: #6d8cea;' width='24px' height='24px' stroke-width='1.5' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg' color='#ffffff'><path d='M15 7C16.1046 7 17 6.10457 17 5C17 3.89543 16.1046 3 15 3C13.8954 3 13 3.89543 13 5C13 6.10457 13.8954 7 15 7Z' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M12.6133 8.26691L9.30505 12.4021L13.4403 16.5374L11.3727 21.0861' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M6.4104 9.5075L9.79728 6.19931L12.6132 8.26692L15.508 11.5752H19.2297' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M8.89152 15.7103L7.65095 16.5374H4.34277' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/></svg>" },
|
||||||
<style>
|
{ title: "Downloader", description: "You wouldnt download a car - welp i would :D u can download videos from poke for 0$!", icon: "<svg style='background: #519355;' width='24px' height='24px' stroke-width='1.5' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg' color='#ffffff'><path d='M12 8V16M12 16L15.5 12.5M12 16L8.5 12.5' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/></svg>" },
|
||||||
@import url(https://ka-p.fontawesome.com/releases/v6.4.2/css/pro.min.css?token=fe06fc099b);
|
{ title: "DRM Free", description: "Poke comes without digital restrictions management - poke is free software :3", icon: "<svg style='background: #b7a358;' width='24px' height='24px' stroke-width='1.5' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg' color='#ffffff'><path d='M4.62323 5.24841C2.99408 7.02743 2 9.39765 2 12C2 17.5229 6.47715 22 12 22C14.5361 22 16.8517 21.0559 18.6146 19.5' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M21.3021 15.6775C21.7525 14.5392 22 13.2985 22 12C22 6.47715 17.5228 2 12 2C10.7687 2 9.58934 2.22255 8.5 2.62961' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M9 15C9.64448 15.8593 10.8428 16.3494 12 16.391C13.1141 16.431 14.1901 16.0554 14.6973 15.1933' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M12 16.391V18.5' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M9.5 9.5C9.5 10.6811 10.3525 11.1647 11.3862 11.5' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M15 8.5C14.315 7.81501 13.1087 7.33855 12 7.30872V5.5' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M3 3L21 21' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/></svg>" },
|
||||||
@import url(https://ka-p.fontawesome.com/releases/v6.4.2/css/pro-v4-shims.min.css?token=fe06fc099b);
|
{ title: "Games Included", description: "U can play funnie games on poke!", icon: "<svg style='background: #886dea;' width='24px' height='24px' viewBox='0 0 24 24' stroke-width='1.5' fill='none' xmlns='http://www.w3.org/2000/svg' color='#ffffff'><path d='M17.5 17.5C20 21 23.9486 18.4151 23 15C21.5753 9.87113 20.8001 7.01556 20.3969 5.50793C20.1597 4.62136 19.3562 4 18.4384 4L5.56155 4C4.64382 4 3.844 4.62481 3.62085 5.515C2.7815 8.86349 2.0326 11.8016 1.14415 15C0.195501 18.4151 4.14415 21 6.64415 17.5' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M16 4V6C16 7.10457 15.1046 8 14 8H10C8.89543 8 8 7.10457 8 6L8 4' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M8 16C9.10457 16 10 15.1046 10 14C10 12.8954 9.10457 12 8 12C6.89543 12 6 12.8954 6 14C6 15.1046 6.89543 16 8 16Z' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/><path d='M16 16C17.1046 16 18 15.1046 18 14C18 12.8954 17.1046 12 16 12C14.8954 12 14 12.8954 14 14C14 15.1046 14.8954 16 16 16Z' stroke='#ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/></svg>" }
|
||||||
@import url(https://ka-p.fontawesome.com/releases/v6.4.2/css/pro-v5-font-face.min.css?token=fe06fc099b);
|
];
|
||||||
@import url(https://ka-p.fontawesome.com/releases/v6.4.2/css/pro-v4-font-face.min.css?token=fe06fc099b);
|
|
||||||
@import url(https://ka-p.fontawesome.com/assets/fe06fc099b/108504408/custom-icons.css?token=fe06fc099b);
|
const randomFeatures = features.sort(() => 0.5 - Math.random()).slice(0, 3);
|
||||||
</style>
|
%>
|
||||||
|
<div class="new-feature-set">
|
||||||
|
<% randomFeatures.forEach(feature => { %>
|
||||||
|
<div class="feature-set">
|
||||||
|
|
||||||
|
<div class="feature-set-title"><%- feature.icon %>
|
||||||
|
<h2><%- feature.title %></h2>
|
||||||
|
</div>
|
||||||
|
<p><%- feature.description %></p></div>
|
||||||
|
|
||||||
|
<% }) %>
|
||||||
|
</div>
|
||||||
|
<div class="adaptive-grid">
|
||||||
|
<%- include('./partials/card',
|
||||||
|
icon_background='transparent',
|
||||||
|
icon="none",
|
||||||
|
title='Join Us',
|
||||||
|
description='join our community if you want to! :3',
|
||||||
|
actions='true',
|
||||||
|
|
||||||
|
has_secondary_action='true',
|
||||||
|
secondary_icon='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M524.5 69.8a1.5 1.5 0 0 0 -.8-.7A485.1 485.1 0 0 0 404.1 32a1.8 1.8 0 0 0 -1.9 .9 337.5 337.5 0 0 0 -14.9 30.6 447.8 447.8 0 0 0 -134.4 0 309.5 309.5 0 0 0 -15.1-30.6 1.9 1.9 0 0 0 -1.9-.9A483.7 483.7 0 0 0 116.1 69.1a1.7 1.7 0 0 0 -.8 .7C39.1 183.7 18.2 294.7 28.4 404.4a2 2 0 0 0 .8 1.4A487.7 487.7 0 0 0 176 479.9a1.9 1.9 0 0 0 2.1-.7A348.2 348.2 0 0 0 208.1 430.4a1.9 1.9 0 0 0 -1-2.6 321.2 321.2 0 0 1 -45.9-21.9 1.9 1.9 0 0 1 -.2-3.1c3.1-2.3 6.2-4.7 9.1-7.1a1.8 1.8 0 0 1 1.9-.3c96.2 43.9 200.4 43.9 295.5 0a1.8 1.8 0 0 1 1.9 .2c2.9 2.4 6 4.9 9.1 7.2a1.9 1.9 0 0 1 -.2 3.1 301.4 301.4 0 0 1 -45.9 21.8 1.9 1.9 0 0 0 -1 2.6 391.1 391.1 0 0 0 30 48.8 1.9 1.9 0 0 0 2.1 .7A486 486 0 0 0 610.7 405.7a1.9 1.9 0 0 0 .8-1.4C623.7 277.6 590.9 167.5 524.5 69.8zM222.5 337.6c-29 0-52.8-26.6-52.8-59.2S193.1 219.1 222.5 219.1c29.7 0 53.3 26.8 52.8 59.2C275.3 311 251.9 337.6 222.5 337.6zm195.4 0c-29 0-52.8-26.6-52.8-59.2S388.4 219.1 417.9 219.1c29.7 0 53.3 26.8 52.8 59.2C470.7 311 447.5 337.6 417.9 337.6z"/></svg>',
|
||||||
|
secondary_text='Discord',
|
||||||
|
secondary_link='https://discord.poketube.fun',
|
||||||
|
|
||||||
|
primary_icon='<svg version="1.1" viewBox="0 0 27.9 32" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><g transform="translate(-.095 .005)" fill="#040404"><path d="m27.1 31.2v-30.5h-2.19v-0.732h3.04v32h-3.04v-0.732z"/><path d="m8.23 10.4v1.54h0.044c0.385-0.564 0.893-1.03 1.49-1.37 0.58-0.323 1.25-0.485 1.99-0.485 0.72 0 1.38 0.14 1.97 0.42 0.595 0.279 1.05 0.771 1.36 1.48 0.338-0.5 0.796-0.941 1.38-1.32 0.58-0.383 1.27-0.574 2.06-0.574 0.602 0 1.16 0.074 1.67 0.22 0.514 0.148 0.954 0.383 .32 0.707 0.366 0.323 0.653 0.746 0.859 1.27 0.205 0.522 0.308 1.15 0.308 1.89v7.63h-3.13v-6.46c0-0.383-0.015-0.743-0.044-1.08-0.0209-0.307-0.103-0.607-0.242-0.882-0.133-0.251-0.336-0.458-0.584-0.596-0.257-0.146-0.606-0.22-1.05-0.22-0.44 0-0.796 0.085-1.07 0.253-0.272 0.17-0.485 0.39-0.639 0.662-0.159 0.287-0.264 0.602-0.308 0.927-0.052 0.347-0.078 0.697-0.078 1.05v6.35h-3.13v-6.4c0-0.338-7e-3 -0.673-0.021-1-0.0114-0.314-0.0749-0.623-0.188-0.916-0.108-0.277-0.3-0.512-0.55-0.673-0.258-0.168-0.636-0.253-1.14-0.253-0.198 0.0083-0.394 0.042-0.584 0.1-0.258 0.0745-0.498 0.202-0.705 0.374-0.228 0.184-0.422 0.449-0.584 0.794-0.161 0.346-0.242 0.798-0.242 1.36v6.62h-3.13v-11.4z"/><path d="m0.936 0.732v30.5h2.19v0.732h-3.04v-32h3.03v0.732z"/></g></svg>',
|
||||||
|
primary_text='Matrix',
|
||||||
|
primary_link='https://matrix.to/#/%23poke:vern.cc'
|
||||||
|
)%>
|
||||||
|
|
||||||
|
<%- include('./partials/card',
|
||||||
|
icon_background='transparent',
|
||||||
|
icon="none",
|
||||||
|
title='Free and libre',
|
||||||
|
description='Poke is free and libre software! u can view, edit and redistribute under GNU GPL 3 or later :3',
|
||||||
|
actions='true',
|
||||||
|
|
||||||
|
has_secondary_action='true',
|
||||||
|
secondary_icon='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3 .3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5 .3-6.2 2.3zm44.2-1.7c-2.9 .7-4.9 2.6-4.6 4.9 .3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3 .7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3 .3 2.9 2.3 3.9 1.6 1 3.6 .7 4.3-.7 .7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3 .7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3 .7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>',
|
||||||
|
secondary_text='GitHub',
|
||||||
|
secondary_link='https://github.com/ashley0143/poke',
|
||||||
|
|
||||||
|
primary_icon='<svg xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="svg1468" version="1.1" viewBox="0 0 4.233 4.233"><title id="title16">Codeberg logo</title><defs id="defs1462"><linearGradient id="linearGradient6918" x1="42519.285" x2="42575.336" y1="-7078.789" y2="-6966.931" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient6924"></linearGradient><linearGradient id="linearGradient6924"><stop style="stop-color:#2185d0;stop-opacity:0" id="stop6920" offset="0"></stop><stop id="stop6926" offset=".495" style="stop-color:#000000;stop-opacity:.48923996"></stop><stop style="stop-color:#000000;stop-opacity:.63279623" id="stop6922" offset="1"></stop></linearGradient><linearGradient id="linearGradient6918-3" x1="42519.285" x2="42575.336" y1="-7078.789" y2="-6966.931" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient6924-6"></linearGradient><linearGradient id="linearGradient6924-6"><stop style="stop-color:#000000;stop-opacity:0" id="stop6920-7" offset="0"></stop><stop id="stop6926-5" offset=".495" style="stop-color:#000000;stop-opacity:.30000001"></stop><stop style="stop-color:#000000;stop-opacity:.30000001" id="stop6922-3" offset="1"></stop></linearGradient></defs><metadata id="metadata1465"></metadata><g id="g370484" transform="matrix(0.06551432,0,0,0.06551432,-2.232417,-1.431776)"><path id="path6733-5" style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:url(#linearGradient6918-3);fill-opacity:1;stroke:none;stroke-width:3.67846;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;stop-color:#000;stop-opacity:1" d="m 42519.285,-7078.7891 a 0.76086879,0.56791688 0 0 0 -0.738,0.6739 l 33.586,125.8886 a 87.182358,87.182358 0 0 0 39.381,-33.7636 l -71.565,-92.5196 a 0.76086879,0.56791688 0 0 0 -0.664,-0.2793 z" transform="matrix(0.37058478,0,0,0.37058478,-15690.065,2662.0533)"></path><path id="path360787" style="opacity:1;fill:#000000;fill-opacity:1;stroke-width:17.0055;paint-order:markers fill stroke;stop-color:#000" d="m 11249.461,-1883.6961 c -12.74,0 -23.067,10.3275 -23.067,23.0671 0,4.3335 1.22,8.5795 3.522,12.2514 l 19.232,-24.8636 c 0.138,-0.1796 0.486,-0.1796 0.624,0 l 19.233,24.8646 c 2.302,-3.6721 3.523,-7.9185 3.523,-12.2524 0,-12.7396 -10.327,-23.0671 -23.067,-23.0671 z" transform="matrix(1.4006354,0,0,1.4006354,-15690.065,2662.0533)"></path></g></svg>',
|
||||||
|
primary_text='Codeberg',
|
||||||
|
primary_link='https://codeberg.org/ashley/poke'
|
||||||
|
)%>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h1 style="font-size: xx-large;text-align: center;">So, wha ru waiting 4? </h1>
|
||||||
|
<div class="discover-video-button">
|
||||||
|
<a href="/app">Start Discovering! :3</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later
|
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later
|
||||||
@@ -158,7 +235,7 @@
|
|||||||
}
|
}
|
||||||
// @license-end
|
// @license-end
|
||||||
</script>
|
</script>
|
||||||
<script src="/static/data-mobile.js"></script>
|
<script src="/static/data-mobile.js?v=454545"></script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
109
html/layouts/error-video.ejs
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Poke - <%=error%> !!!</title>
|
||||||
|
<meta content="#111111" name="theme-color" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no, viewport-fit=cover" />
|
||||||
|
<meta name="darkreader-lock" />
|
||||||
|
<% if (description == "This helps protect our community. Learn more (TRYING AGAIN....)") { %>
|
||||||
|
<meta http-equiv="refresh" content="5">
|
||||||
|
<% } %>
|
||||||
|
<link href="/css/yt-ukraine.svg?v=3" rel="icon" />
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
margin: auto;
|
||||||
|
background: #111111;
|
||||||
|
color: white;
|
||||||
|
font-family: arial;
|
||||||
|
max-width: 600px;
|
||||||
|
}
|
||||||
|
body::before {
|
||||||
|
background: linear-gradient(0deg, rgba(115, 32, 67, 1), rgba(17, 17, 17, 1));
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
content: "";
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0px;
|
||||||
|
left: 0px;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
z-index: -1;
|
||||||
|
pointer-events: none;
|
||||||
|
transition: 1s height;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 42px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p#abstract {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
font-size: 500px;
|
||||||
|
margin: 0px;
|
||||||
|
font-weight: bold;
|
||||||
|
opacity: 0.005;
|
||||||
|
pointer-events: none;
|
||||||
|
transition: 1s transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 790px) {
|
||||||
|
p#abstract {
|
||||||
|
transform: translate(-50%, -50%) rotate(90deg) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
text-align: center;
|
||||||
|
cursor: default;
|
||||||
|
max-width: 600px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-footer {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 24px;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 600px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.error-footer a {
|
||||||
|
color: #ac8fa5;
|
||||||
|
text-decoration: none;
|
||||||
|
margin: 0px 12px;
|
||||||
|
}
|
||||||
|
.error-footer a:hover {
|
||||||
|
color: #d69cc8;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<% if (description == "This helps protect our community. Learn more (TRYING AGAIN....)") { %>
|
||||||
|
|
||||||
|
<p id="abstract">502</p>
|
||||||
|
<% } else if (description !== "This helps protect our community. Learn more (TRYING AGAIN....)") { %>
|
||||||
|
<p id="abstract">404</p>
|
||||||
|
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
<div class="error">
|
||||||
|
<h2><%=error%></h2>
|
||||||
|
<p><%=description%></p>
|
||||||
|
</div>
|
||||||
|
<div class="error-footer">
|
||||||
|
<a href="https://codeberg.org/ashley/poke/issues/new/choose">Create issue</a>
|
||||||
|
<a href="https://discord.poketube.fun">Report on our Discord</a>
|
||||||
|
<% if (description == "This helps protect our community. Learn more (TRYING AGAIN....)") { %>
|
||||||
|
|
||||||
|
<a href="https://github.com/iv-org/invidious/issues">See Invidious issues</a>
|
||||||
|
<a href="">Refresh Page</a>
|
||||||
|
<% } %>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
36
html/map.ejs
@@ -44,40 +44,6 @@
|
|||||||
|
|
||||||
//--><!]]>
|
//--><!]]>
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script src="/static/maps.js"></script><script src="/static/data-mobile.js"></script>
|
||||||
var bbox = "?bbox=-165.76171875000003%2C-3.864254615721396%2C30.410156250000004%2C72.44879155730672&layer=mapnik"
|
|
||||||
var iframe = document.getElementById('myFrame');
|
|
||||||
iframe.src=`https://www.openstreetmap.org/export/embed.html${bbox}`
|
|
||||||
iframe.addEventListener('load', function() {
|
|
||||||
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
|
|
||||||
var links = iframeDocument.getElementsByTagName('a');
|
|
||||||
for (var i = 0; i < links.length; i++) {
|
|
||||||
links[i].addEventListener('click', function(event) {
|
|
||||||
var url = event.target.href;
|
|
||||||
if (url.includes('www.openstreetmap.org')) {
|
|
||||||
event.preventDefault();
|
|
||||||
iframe.src = url;
|
|
||||||
window.history.pushState(null, '', url);
|
|
||||||
} else {
|
|
||||||
window.location.href = url;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
window.onpopstate = function(event) {
|
|
||||||
iframe.src = window.location.href;
|
|
||||||
};
|
|
||||||
|
|
||||||
iframe.addEventListener('load', function() {
|
|
||||||
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
|
|
||||||
var elements = iframeDocument.querySelectorAll('[style*="//dka575ofm4ao0.cloudfront.net"]');
|
|
||||||
for (var i = 0; i < elements.length; i++) {
|
|
||||||
var style = elements[i].style.backgroundImage;
|
|
||||||
var newStyle = style.replace('//dka575ofm4ao0.cloudfront.net', 'https://p.poketube.fun/https://dka575ofm4ao0.cloudfront.net');
|
|
||||||
elements[i].style.backgroundImage = newStyle;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
71
html/partials/card.ejs
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
<div class="card">
|
||||||
|
<div class="card-title">
|
||||||
|
<div class="card-icon" style="background: <%= icon_background %>;">
|
||||||
|
<% if(icon="none"){ %><% } else{ %> <%- icon %><% } %>
|
||||||
|
</div>
|
||||||
|
<h2><%= title %></h2>
|
||||||
|
</div>
|
||||||
|
<p><%= description %></p>
|
||||||
|
<% if (actions=="true") { %>
|
||||||
|
<div class="card-actions">
|
||||||
|
<% if (has_secondary_action=="true") { %>
|
||||||
|
<a class="card-secondary" href="<%= secondary_link %>"><%- secondary_icon %> <%= secondary_text %></a>
|
||||||
|
<% } %>
|
||||||
|
<a class="card-primary" href="<%= primary_link %>"><%- primary_icon %> <%= primary_text %></a>
|
||||||
|
</div>
|
||||||
|
<% }%>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.card {
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
.card-title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.card-title h2 {
|
||||||
|
font-family: "PokeTube flex";
|
||||||
|
font-stretch: ultra-expanded;
|
||||||
|
font-weight: 1000;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
.card-title svg {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
margin-right: 12px;
|
||||||
|
}
|
||||||
|
.card-actions {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: right;
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
.card-actions a {
|
||||||
|
color: white;
|
||||||
|
border: 2px white solid;
|
||||||
|
border-radius: 3rem;
|
||||||
|
padding: 12px 24px 12px 12px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.card-actions a:hover {
|
||||||
|
filter: brightness(0.8);
|
||||||
|
text-decoration: nones;
|
||||||
|
}
|
||||||
|
.card-actions svg {
|
||||||
|
width: 24px !important;
|
||||||
|
height: 24px !important;
|
||||||
|
margin-right: 6px;
|
||||||
|
}
|
||||||
|
.card-actions .card-primary {
|
||||||
|
background: white;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
.card-actions .card-primary svg {
|
||||||
|
fill: black;
|
||||||
|
}
|
||||||
|
.card-actions .card-secondary svg {
|
||||||
|
fill: white;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
123
html/partials/header.ejs
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
<!--
|
||||||
|
This Source Code Form is subject to the terms of the GNU General Public License:
|
||||||
|
|
||||||
|
Copyright (C) 2021-2024 Poke (https://codeberg.org/Ashley/poke)
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see https://www.gnu.org/licenses/.
|
||||||
|
--->
|
||||||
|
|
||||||
|
<!-- Global Header-->
|
||||||
|
<!-- This should be inserted as a component/partial -->
|
||||||
|
|
||||||
|
<header>
|
||||||
|
<div class="header-content">
|
||||||
|
<div class="header-start">
|
||||||
|
<a title="Poke Homepage" href="/playlist?list=PL3roRV3JHZzbatp5PvE-88ApmVishqGHN">
|
||||||
|
<img src="/css/logo-poke.svg?v=5"/>
|
||||||
|
<img src="/css/red-tape.png?v=5" style="margin-left: -8em;opacity: 0.9;height: 2em;">
|
||||||
|
<p class="subtitle"> <%- random %></p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="header-center">
|
||||||
|
<%- include('./search.ejs') %>
|
||||||
|
</div>
|
||||||
|
<div class="header-end">
|
||||||
|
<a href="https://codeberg.org/Ashley/poketube/src/branch/main/instances.json"><?xml version="1.0" encoding="UTF-8"?><svg width="24px" height="24px" stroke-width="1.5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" color="#ffffff" style="--darkreader-inline-color: #e8e6e3;" data-darkreader-inline-color=""><path d="M6 18.01L6.01 17.9989" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><path d="M6 6.01L6.01 5.99889" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><path d="M2 9.4V2.6C2 2.26863 2.26863 2 2.6 2H21.4C21.7314 2 22 2.26863 22 2.6V9.4C22 9.73137 21.7314 10 21.4 10H2.6C2.26863 10 2 9.73137 2 9.4Z" stroke="#ffffff" stroke-width="1.5" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><path d="M2 21.4V14.6C2 14.2686 2.26863 14 2.6 14H21.4C21.7314 14 22 14.2686 22 14.6V21.4C22 21.7314 21.7314 22 21.4 22H2.6C2.26863 22 2 21.7314 2 21.4Z" stroke="#ffffff" stroke-width="1.5" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path></svg></a>
|
||||||
|
<a href="/apps"><?xml version="1.0" encoding="UTF-8"?><svg width="24px" height="24px" viewBox="0 0 24 24" stroke-width="1.5" fill="none" xmlns="http://www.w3.org/2000/svg" color="#ffffff"><path d="M17.5 17.5C20 21 23.9486 18.4151 23 15C21.5753 9.87113 20.8001 7.01556 20.3969 5.50793C20.1597 4.62136 19.3562 4 18.4384 4L5.56155 4C4.64382 4 3.844 4.62481 3.62085 5.515C2.7815 8.86349 2.0326 11.8016 1.14415 15C0.195501 18.4151 4.14415 21 6.64415 17.5" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M16 4V6C16 7.10457 15.1046 8 14 8H10C8.89543 8 8 7.10457 8 6L8 4" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M8 16C9.10457 16 10 15.1046 10 14C10 12.8954 9.10457 12 8 12C6.89543 12 6 12.8954 6 14C6 15.1046 6.89543 16 8 16Z" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M16 16C17.1046 16 18 15.1046 18 14C18 12.8954 17.1046 12 16 12C14.8954 12 14 12.8954 14 14C14 15.1046 14.8954 16 16 16Z" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></a>
|
||||||
|
<a href="/account-create"><?xml version="1.0" encoding="UTF-8"?><svg width="24px" height="24px" stroke-width="1.5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" color="#ffffff"><path d="M12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2Z" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M4.271 18.3457C4.271 18.3457 6.50002 15.5 12 15.5C17.5 15.5 19.7291 18.3457 19.7291 18.3457" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M12 12C13.6569 12 15 10.6569 15 9C15 7.34315 13.6569 6 12 6C10.3431 6 9 7.34315 9 9C9 10.6569 10.3431 12 12 12Z" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg> Account</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
header {
|
||||||
|
position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
width: 100%;
|
||||||
|
padding: 12px 0px;
|
||||||
|
background: rgb(0, 0, 0, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-content {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
max-width: 1264px;
|
||||||
|
margin: auto;
|
||||||
|
height: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-start {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-start img {
|
||||||
|
height: 32px;
|
||||||
|
margin-top: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
form[action="/search"] {
|
||||||
|
display: flex
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-center #fname {
|
||||||
|
background: rgba(255, 255, 255, 0.2);
|
||||||
|
border: 1px #605e5e solid;
|
||||||
|
border-radius: 6px 0px 0px 6px;
|
||||||
|
color: white;
|
||||||
|
font-size: 14px;
|
||||||
|
padding: 6px 12px;
|
||||||
|
border-right: none;
|
||||||
|
cursor: default;
|
||||||
|
width: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-center button {
|
||||||
|
background: rgba(255, 255, 255, 0.2);
|
||||||
|
border: 1px #605e5e solid;
|
||||||
|
border-radius: 0px 6px 6px 0px;
|
||||||
|
color: white;
|
||||||
|
border-left: none;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-center #fname:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: #8a8a8a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-center button svg {
|
||||||
|
width: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-end {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-end a {
|
||||||
|
/* border: 2px #605e5e solid; */
|
||||||
|
border-radius: 3rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 6px;
|
||||||
|
color: white;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<link href="<%- proxyurl %>/https://site-assets.fontawesome.com/releases/v6.1.1/css/all.css" rel=stylesheet>
|
||||||
60
html/partials/search.ejs
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
<form action="/search">
|
||||||
|
<input type="search" class="search-bar" id="fname" name="query">
|
||||||
|
<button><?xml version="1.0" encoding="UTF-8"?><svg width="24px" height="24px" viewBox="0 0 24 24" stroke-width="1.5" fill="none" xmlns="http://www.w3.org/2000/svg" color="#ffffff"><path d="M17 17L21 21" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M3 11C3 15.4183 6.58172 19 11 19C13.213 19 15.2161 18.1015 16.6644 16.6493C18.1077 15.2022 19 13.2053 19 11C19 6.58172 15.4183 3 11 3C6.58172 3 3 6.58172 3 11Z" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></button>
|
||||||
|
</form>
|
||||||
|
<div style="opacity: 0;" class="suggestions"></div>
|
||||||
|
<script>
|
||||||
|
/*
|
||||||
|
@licstart The following is the entire license notice for the
|
||||||
|
JavaScript code in this page.
|
||||||
|
|
||||||
|
Copyright (C) 2024 Poke Project
|
||||||
|
|
||||||
|
The JavaScript code in this page is free software: you can
|
||||||
|
redistribute it and/or modify it under the terms of the GNU
|
||||||
|
General Public License (GNU GPL) as published by the Free Software
|
||||||
|
Foundation, either version 3 of the License, or (at your option)
|
||||||
|
any later version. The code is distributed WITHOUT ANY WARRANTY;
|
||||||
|
without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
|
||||||
|
|
||||||
|
As additional permission under GNU GPL version 3 section 7, you
|
||||||
|
may distribute non-source (e.g., minimized or compacted) forms of
|
||||||
|
that code without the copy of the GNU GPL normally required by
|
||||||
|
section 4, provided you include this license notice and a URL
|
||||||
|
through which recipients can access the Corresponding Source.
|
||||||
|
|
||||||
|
|
||||||
|
@licend The above is the entire license notice
|
||||||
|
for the JavaScript code in this page.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
|
||||||
|
.suggestions {
|
||||||
|
position: absolute;
|
||||||
|
display: grid;
|
||||||
|
background: #473e46d6;
|
||||||
|
border-radius: 6px;
|
||||||
|
margin-top: 10px;
|
||||||
|
width: 329px;
|
||||||
|
z-index: 5;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
gap: 4px;
|
||||||
|
padding: 4px 0px;
|
||||||
|
}
|
||||||
|
.suggestions a {
|
||||||
|
color: white;
|
||||||
|
background: transparent;
|
||||||
|
padding: 6px 12px;
|
||||||
|
border-radius: 4px;
|
||||||
|
margin: 0px 4px;
|
||||||
|
}
|
||||||
|
.suggestions a:hover {
|
||||||
|
background: #f9f9f917;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -246,8 +246,9 @@ font-family:Ubuntu
|
|||||||
<%- x.title %>
|
<%- x.title %>
|
||||||
</a>
|
</a>
|
||||||
<div>
|
<div>
|
||||||
<a href="/channel?id=<%- x.authorId %>" style="border-radius:0em"><%- x.author %></a>
|
<a href="/channel?id=<%- x.authorId %>" style="border-radius:0em"><%- x.author %></a><br>
|
||||||
</div>
|
<a href="/download?id=<%- x.videoId %>" style="border-radius:0em"> Download </a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!--
|
<!--
|
||||||
This Source Code Form is subject to the terms of the GNU General Public License:
|
This Source Code Form is subject to the terms of the GNU General Public License:
|
||||||
|
|
||||||
Copyright (C) 2021-2023 POKETUBE (https://codeberg.org/Ashley/poketube)
|
Copyright (C) 2021-2024 poke (https://codeberg.org/Ashley/poketube)
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
<% if (!isMobile) { %>
|
<% if (!isMobile) { %>
|
||||||
|
|
||||||
<!DOCTYPE html><html class="background"><head>
|
<!DOCTYPE html><html class="background"><head>
|
||||||
<title>PokeTube | Legal mumbo jumbo</title>
|
<title>Poke | Legal mumbo jumbo</title>
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
|
||||||
<link href="/css/app-cdn.min.css" rel="stylesheet">
|
<link href="/css/app-cdn.min.css" rel="stylesheet">
|
||||||
@@ -250,19 +250,20 @@ section#landing-page {
|
|||||||
transform: translateY(50%);
|
transform: translateY(50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.heading {
|
.heading {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-size: xxx-large;
|
font-size: xxx-large;
|
||||||
font-family: 'PokeTube flex';
|
font-family: 'PokeTube flex';
|
||||||
font-stretch: ultra-expanded;
|
font-stretch: ultra-expanded;
|
||||||
font-weight: 1000;
|
font-weight: 1000;
|
||||||
margin-top: -27.5em;
|
margin-top: -22.5em;
|
||||||
width: 100px;
|
width: 100px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
.i-cant-find-a-class-name-help-me {
|
.i-cant-find-a-class-name-help-me {
|
||||||
margin-top: -69em;
|
margin-top: -53.3em;
|
||||||
max-width: 39em;
|
max-width: 39em;
|
||||||
color: white;
|
color: white;
|
||||||
background: #333;
|
background: #333;
|
||||||
@@ -408,7 +409,7 @@ z-index: 10; /* Was 2 */"
|
|||||||
|
|
||||||
<div class="content-inner" style="color:#fff;">
|
<div class="content-inner" style="color:#fff;">
|
||||||
<br>
|
<br>
|
||||||
<h1 class="heading">PokeTube Privacy Policy</h1>
|
<h1 class="heading">Poke Privacy Policy</h1>
|
||||||
<div style="text-align: center;color: #fff;margin-top: 8px;margin-bottom:8px">
|
<div style="text-align: center;color: #fff;margin-top: 8px;margin-bottom:8px">
|
||||||
We dont collect or share your personal information! That's our privacy policy TL;DR lol
|
We dont collect or share your personal information! That's our privacy policy TL;DR lol
|
||||||
</div>
|
</div>
|
||||||
@@ -418,7 +419,7 @@ z-index: 10; /* Was 2 */"
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="description i-cant-find-a-class-name-help-me">
|
<div class="description i-cant-find-a-class-name-help-me">
|
||||||
Poketube does not collect or share personal information. poketube is a free software program that you can fork it yourself. you can see the repo <a href="https://codeberg.org/ashley/poketube/">here</a>.<br><br> <a href="https://codeberg.org/Ashley/poketube/commits/main/html/priv.ejs">see history of this privacy policy here</a>
|
Poke does not collect or share personal information. Poke is a free software program that you can fork it yourself. you can see the repo <a href="https://codeberg.org/ashley/poke/">here</a>.<br><br> <a href="https://codeberg.org/Ashley/poketube/commits/main/html/priv.ejs">see history of this privacy policy here</a>
|
||||||
|
|
||||||
<p style="color:#fff;">
|
<p style="color:#fff;">
|
||||||
You dont have to read this entire policy as it might put you to sleep. So in TL;DR:We dont collect or share your personal information. thats it lol
|
You dont have to read this entire policy as it might put you to sleep. So in TL;DR:We dont collect or share your personal information. thats it lol
|
||||||
@@ -432,10 +433,9 @@ z-index: 10; /* Was 2 */"
|
|||||||
<i>Please note that im not a lawyer, so dont execpt too much on this policy :P</i>
|
<i>Please note that im not a lawyer, so dont execpt too much on this policy :P</i>
|
||||||
</p>
|
</p>
|
||||||
<p style="color:#fff">
|
<p style="color:#fff">
|
||||||
Haiii! Welcome to PokeTubes Privacy Policy! We Dont collect or share your information. Ever. When we collect information, we mean, aggregated information (see "Information Collected" section for more info). The main reason that we dont collect your information is we care about your privacy. like alot (like alot alot). see; whynottrack.com<br><br>
|
Haiii! Welcome to Poke Privacy Policy! We Dont collect or share your information. Ever. When we collect information, we mean, aggregated information (see "Information Collected" section for more info). The main reason that we dont collect your information is we care about your privacy. like alot (like alot alot). see; whynottrack.com<br><br>
|
||||||
We are free software, meaning you have freedom while using PokeTube. <a href="https://www.gnu.org/philosophy/free-software-even-more-important.html">Learn why you should care about your freedom here</a>.
|
We are free software, meaning you have freedom while using PokeTube. <a href="https://www.gnu.org/philosophy/free-software-even-more-important.html">Learn why you should care about your freedom here</a>.
|
||||||
<br><br>
|
<br><br>
|
||||||
We dont use javascript on the front-end of PokeTube. Meaning that you can use PokeTube With no javascript add-ons. <a href="https://www.gnu.org/philosophy/javascript-trap.html">Learn Why here.</a>
|
|
||||||
<br><br>
|
<br><br>
|
||||||
P.S:I love you <3
|
P.S:I love you <3
|
||||||
</p>
|
</p>
|
||||||
@@ -443,52 +443,36 @@ P.S:I love you <3
|
|||||||
<p>START OF PRIVACY POLICY</p>
|
<p>START OF PRIVACY POLICY</p>
|
||||||
<a class="anchor" name="s1"></a>
|
<a class="anchor" name="s1"></a>
|
||||||
<h3 class="hd-md">
|
<h3 class="hd-md">
|
||||||
We dont collect your personal information
|
We Dont Collect Information that can indentify you
|
||||||
</h3>
|
</h3>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
(<a href="https://codeberg.org/ashley/poke/src/branch/main/css/data-mobile.js">see source</a>) <br><br>
|
||||||
|
We use Matomo (https://matomo.org/) to gather and store non-identifying information for statistical purposes. The data collected includes details such as your country (inferred from anonymized IP addresses like 111.xx.xxx.xx), operating system, browser version and name, and screen size. This information helps us understand and improve our services. <br><br>
|
||||||
|
|
||||||
we dont collect your personal information or share it. We dont collect your IP address. Your device metadata (e.g. device resolution, OS etc.) is not collected in anyway. <br>
|
The above doesn't apply if you have Do Not Track or Global Privacy Control enabled on the browser level.
|
||||||
|
<hr class="hr" />
|
||||||
|
|
||||||
|
<hr class="hr" />
|
||||||
|
|
||||||
<h3 class="hd-md">
|
<h3 class="hd-md">
|
||||||
We dont see the videos you watch
|
We dont see the videos you watch
|
||||||
</h3>
|
</h3>
|
||||||
<br>
|
<br>
|
||||||
Our servers are secured with SHA-384 Signature Algorithm; meaning we cant see the videos you watching, things you search, or things you do. Learn more <a href="https://en.wikipedia.org/wiki/Secure_Hash_Algorithms">About hash Algorithms here.</a><br><br>
|
When the Video gets sent to the matomo server, we encrypt it using SHA-256 Signature Algorithm; (<a href="https://codeberg.org/ashley/poke/src/branch/main/css/data-mobile.js#L19-L23">See source</a>) meaning we cant see the videos you watching or things you do. Learn more <a href="https://en.wikipedia.org/wiki/Secure_Hash_Algorithms">About hash Algorithms here.</a><br><br>
|
||||||
|
|
||||||
We migth use third party services on PokeTube, but third party request on PokeTube is proxied by default. no third party can see wat the hell ru doing on PokeTube. We do this by proxying the requests via a whole diffrent server, so no third party can see you.<br>
|
We migth use third party services on Poke, but third party request on Poke is proxied by default. no third party can see wat the hell ru doing on PokeTube. We do this by proxying the requests via a whole diffrent server, so no third party can see you.<br>
|
||||||
|
<hr class="hr" />
|
||||||
|
|
||||||
<h3 class="hd-md">
|
|
||||||
We dont see the videos you watch
|
|
||||||
</h3>
|
|
||||||
<br>
|
|
||||||
When you watch a video at PokeTube, we don't know who you are and there is no way to tie the things you are watching.
|
|
||||||
When you access a website, your Web browser automatically sends information about your computer. (e.g. your User agent and IP address.)<br><br>
|
|
||||||
|
|
||||||
Because this information could be used to link you to your peronsal information, we do not log (store) it at all. This is a very unusual practice, but we feel it is an important step to protect your privacy.
|
|
||||||
|
|
||||||
It is unusual for a reason. most server software auto-stores this information, so you have to go out of your way not to store it.
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<h3 class="hd-md">
|
<h3 class="hd-md">
|
||||||
We don’t track you through cookies
|
We don’t track you through cookies
|
||||||
</h3><br>
|
</h3><br>
|
||||||
|
|
||||||
on PokeTube, no cookies are used by default. PokeTube Doesnt use cookies (See the storage tab yourself!). altho we use local storage to save stuff like themes.
|
on Poke, no cookies are used by default. (<a href="https://codeberg.org/ashley/poke/src/branch/main/css/data-mobile.js#L79">see source</a>) Poke Doesnt use cookies (See the storage tab yourself!). altho we use local storage to save stuff like themes.
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<h3 class="hd-md">
|
|
||||||
We only collect your email if you want us to
|
|
||||||
</h3><br>
|
|
||||||
if you Subscribe to updates on <a href="//status.poketube.fun">PokeTube status site</a>, we may be store your email to send you email notifications whenever we create, update or resolve an incident. you can also use a alias adress such as <a href="https://duckduckgo.com/email/">Private Duck Address</a> to keep your email identity hidden <br>
|
|
||||||
|
|
||||||
<h3 class="hd-md">
|
|
||||||
We improve poketube by using anonymous methods
|
|
||||||
</h3><br>
|
|
||||||
|
|
||||||
We use a tool called Piwik (A free software Web analytics system, see piwik.org) to collect information. By information we mean, aggregated data about things such as the number of visits daily/weekly/monthly to PokeTube. <br><br> This data can't be used to identify you or your device or to learn anything about you individually. This Information thats being collected is anonymous and only analyzed in aggregate. It will never identify you or your machine.<br><br>
|
|
||||||
This Process does not use cookies in any way. If you want to opt out (for some reason, we still dont know why lol), Click the "Opt out Of Metrics" Button on the bottom rigth side of the player. No data that identifies you or that can be linked to you as an individual is collected on poketube.</p><p>We Also save searches, but again, not in a personally identifiable way, as we do not store IP addresses or unique User agent strings. We use aggregate, non-personal search data.<br>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3 class="hd-md">
|
<h3 class="hd-md">
|
||||||
|
|||||||
@@ -17,7 +17,9 @@
|
|||||||
NodeList.prototype.forEach = Array.prototype.forEach;
|
NodeList.prototype.forEach = Array.prototype.forEach;
|
||||||
</script>
|
</script>
|
||||||
<style>
|
<style>
|
||||||
|
* {
|
||||||
|
font-family: "poketube flex" !important
|
||||||
|
}
|
||||||
@keyframes gradient {
|
@keyframes gradient {
|
||||||
0% {
|
0% {
|
||||||
background-position: 0 50%;
|
background-position: 0 50%;
|
||||||
@@ -36,18 +38,27 @@
|
|||||||
background-size: 400% 400%;
|
background-size: 400% 400%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #fff;
|
||||||
|
font-weight: 686;
|
||||||
|
font-stretch: extra-expanded;
|
||||||
|
}
|
||||||
|
|
||||||
.downnav {
|
.downnav {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
padding:10px;
|
padding:10px;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
width: 100%;
|
|
||||||
margin: auto;
|
margin: auto;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
color:#fff;
|
color:#fff;
|
||||||
background-color: #0f0f0f;
|
background-color: #0007;
|
||||||
}</style>
|
border-radius: 5px;
|
||||||
|
width: calc(100% - 33px);
|
||||||
|
margin-left: 6px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<script>
|
<script>
|
||||||
<!--//--><![CDATA[//><!--
|
<!--//--><![CDATA[//><!--
|
||||||
/**
|
/**
|
||||||
@@ -219,18 +230,16 @@
|
|||||||
<input placeholder="Search the web" name="query" autocomplete="off" id="search_form_input_homepage" class="search__input" type="text" autofocus />
|
<input placeholder="Search the web" name="query" autocomplete="off" id="search_form_input_homepage" class="search__input" type="text" autofocus />
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<button class="btn btn-success" type="submit" style="margin-top: 1em;margin-left: auto;text-align: center;display: flex;flex-direction: column;background: #fff;background-color: #303134;border: 1px solid #303134;border-radius: 4px;color: #e8eaed;font-family: arial,sans-serif;font-size: 14px;padding: 0 16px;line-height: 27px;height: 36px;min-width: 54px;margin-right: 13em;text-align: center;cursor: pointer;user-select: none;">
|
<button class="btn btn-success" type="submit" style="margin-top: 1em;margin-left: auto;text-align: center;display: flex;flex-direction: column;background: #fff;background-color: #303134;border: 1px solid #303134;border-radius: 4px;color: #e8eaed;font-family: arial,sans-serif;font-size: 14px;padding: 0 16px;line-height: 27px;height: 36px;min-width: 54px;margin-right: 9em;text-align: center;cursor: pointer;user-select: none;">
|
||||||
<p style="margin-top: auto;margin-bottom: auto;font-weight: 1000;margin-left: 6px;font-stretch: ultra-expanded;font-family:"poketube flex";Poketube flex;">Search Poke</p>
|
<p style="margin-top: auto;margin-bottom: auto;font-weight: 1000;margin-left: 6px;font-stretch: ultra-expanded;font-family:"poketube flex";Poketube flex;">Search Poke</p>
|
||||||
</button>
|
</button>
|
||||||
|
<div style="margin-left: 5.5em;margin-right: auto;width: fit-content;color: #fff;font-weight: 1000;font-stretch: ultra-expanded;font-size: 33px;margin-bottom: -1em;margin-top: 6px;" id="clock"></div>
|
||||||
<button class="btn btn-success" name="lucky" value="true" type="submit" style="margin-top: 1em;margin-left: auto;text-align: center;display: flex;flex-direction: column;background: #fff;background-color: #303134;border: 1px solid #303134;border-radius: 4px;color: #e8eaed;font-family: arial,sans-serif;font-size: 14px;padding: 0 16px;line-height: 27px;height: 36px;min-width: 54px;margin-right: 9em;text-align: center;cursor: pointer;user-select: none;margin-top: -38px;margin-left: 21em;">
|
<span style="color:#fff;margin-left: auto;margin-right: 8em;text-align: center;display: flex;width: fit-content;margin-top: 2em;font-size: ;" id="weatherInfo"></span>
|
||||||
<p style="margin-top: auto;margin-bottom: auto;font-weight: 1000;margin-left: 6px;font-stretch: ultra-expanded;font-family:"poketube flex";Poketube flex;">Im feeling lucky</p>
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<div class="downnav">
|
<div class="downnav">
|
||||||
<span style="color:#fff;" id="weatherInfo"></span> - <a style="color:#fff" href="/translate"> Translate </a> - <a style="color:#fff" href="/map"> PokeMaps </a> - <a style="color:#fff" href="/account-create">My Account</a> - <a style="color:#fff" href="/privacy">Privacy</a> - <a style="color:#fff" href="https://codeberg.org/ashley/poketube">Git</a>
|
<a style="color:#fff" href="/translate"> Translate </a> - <a style="color:#fff" href="/map"> PokeMaps </a> - <a style="color:#fff" href="/account-create">My Account</a> - <a style="color:#fff" href="/privacy">Privacy</a> - <a style="color:#fff" href="https://codeberg.org/ashley/poketube">Git</a>
|
||||||
<div style="float: right;">
|
<div style="float: right;">
|
||||||
<a style="color:#fff" id="osInfo"></a> <a style="color:#fff;margin-right: 1em;" href="/license">License</a>
|
<a style="color:#fff" id="osInfo"></a> <a style="color:#fff;margin-right: 1em;" href="/license">License</a>
|
||||||
</div>
|
</div>
|
||||||
@@ -257,6 +266,27 @@ if (userAgent.includes("windows")) {
|
|||||||
|
|
||||||
const osInfoElement = document.getElementById("osInfo");
|
const osInfoElement = document.getElementById("osInfo");
|
||||||
osInfoElement.textContent = `${osName} - `;
|
osInfoElement.textContent = `${osName} - `;
|
||||||
|
|
||||||
|
function updateClock() {
|
||||||
|
var now = new Date();
|
||||||
|
var hours = now.getHours();
|
||||||
|
var minutes = now.getMinutes();
|
||||||
|
var seconds = now.getSeconds();
|
||||||
|
|
||||||
|
// Add leading zeros to minutes and seconds
|
||||||
|
minutes = (minutes < 10 ? "0" : "") + minutes;
|
||||||
|
seconds = (seconds < 10 ? "0" : "") + seconds;
|
||||||
|
|
||||||
|
// Display the time in the "clock" div
|
||||||
|
document.getElementById("clock").innerHTML = hours + ":" + minutes + ":" + seconds;
|
||||||
|
|
||||||
|
// Update the clock every second
|
||||||
|
setTimeout(updateClock, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call the function to initially display the clock
|
||||||
|
updateClock();
|
||||||
|
|
||||||
</script> <script>
|
</script> <script>
|
||||||
const css = localStorage.getItem("poke-custom-css");
|
const css = localStorage.getItem("poke-custom-css");
|
||||||
|
|
||||||
@@ -320,7 +350,7 @@ if (window.location.hostname === "poketube.fun" && config.plausible_enabled == t
|
|||||||
|
|
||||||
// Call the fetchAndDisplayWeather function when the page loads
|
// Call the fetchAndDisplayWeather function when the page loads
|
||||||
fetchAndDisplayWeather();
|
fetchAndDisplayWeather();
|
||||||
</script><script src="/static/emojis.js"></script><style> img.emoji {height: 1em;width: 1em;margin: 0 .05em 0 .1em;vertical-align: -0.1em;}</style>
|
</script><script src="/static/emojis.js"></script><script src="/static/data-mobile.js"></script><style> img.emoji {height: 1em;width: 1em;margin: 0 .05em 0 .1em;vertical-align: -0.1em;}</style>
|
||||||
<script>twemoji.parse(document.body,{ base: 'https://p.poketube.fun/https://cdn.zptr.cc/twemoji/' })</script></div>
|
<script>twemoji.parse(document.body,{ base: 'https://p.poketube.fun/https://cdn.zptr.cc/twemoji/' })</script></div>
|
||||||
</div> <!-- id="content_homepage" -->
|
</div> <!-- id="content_homepage" -->
|
||||||
</div> <!-- id="content_wrapper_homepage" -->
|
</div> <!-- id="content_wrapper_homepage" -->
|
||||||
|
|||||||
@@ -451,22 +451,22 @@ Web
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<p style="margin-top: -21px;margin-left: 62em;font-family: "Poketube flex";color: #ffacbb;display: flex;flex-direction: row;gap: 5px;">Powered by <a href="https://ark.sudovanilla.org/Korbs/NarviSearch">NarviSearch ! :3</a> </p>
|
||||||
</div>
|
</div>
|
||||||
<div class="video-list" >
|
<div class="video-list" >
|
||||||
|
|
||||||
<% results.forEach(x => { %>
|
<% results.forEach(x => { %>
|
||||||
<div class="video" style="height: 6em;">
|
<div class="video" style="height: 8em;">
|
||||||
|
|
||||||
<a style="min-width: 81em;" href="<%= x.link %>"><%= x.title %></a><br>
|
<a style="min-width: 81em;" href="<%= x.url %>"><%= x.title %></a><br>
|
||||||
<p style="color:gray;display: flex;flex-direction: column;width: 48em;margin-top: -8em;"><%= x.link %><br>
|
<p style="color:gray;display: flex;flex-direction: column;width: 48em;margin-top: -8em;"><%= x.url %><br>
|
||||||
<% if (!isMobile) { %>
|
<% if (!isMobile) { %>
|
||||||
|
|
||||||
<span style="color:white;width: 48em;display: flex;"><%= x.snippet %></span>
|
<span style="color:white;width: 48em;display: flex;"><%= x.description %></span>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% if (isMobile) { %>
|
<% if (isMobile) { %>
|
||||||
|
|
||||||
<span style="color:white;max-width: 15em;display: flex;"><%= x.snippet %></span>
|
<span style="color:white;max-width: 15em;display: flex;"><%= x.description %></span>
|
||||||
<% } %>
|
<% } %>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
660
html/search.ejs
@@ -1,7 +1,7 @@
|
|||||||
<!--
|
<!--
|
||||||
This Source Code Form is subject to the terms of the GNU General Public License:
|
This Source Code Form is subject to the terms of the GNU General Public License:
|
||||||
|
|
||||||
Copyright (C) 2021-2024 POKETUBE (https://codeberg.org/Ashley/poketube)
|
Copyright (C) 2021-2024 poke (https://codeberg.org/Ashley/poketube)
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -19,15 +19,15 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<head>
|
<head>
|
||||||
<head>
|
<head>
|
||||||
<title>Searching <%=q%> - PokeTube</title>
|
<title>Searching <%=q%> | Poke</title>
|
||||||
<link rel="manifest" href="/manifest.json">
|
<link rel="manifest" href="/manifest.json">
|
||||||
<link href=/css/yt-ukraine.svg?v=6 rel=icon>
|
<link href=/css/yt-ukraine.svg?v=8 rel=icon>
|
||||||
<link href=/css/app-cdn.min.css rel=stylesheet>
|
<link href=/css/app-cdn.min.css rel=stylesheet>
|
||||||
<link href=/css/app.main.css?v=44600 rel=stylesheet>
|
<link href=/css/app.main.css?v=44600 rel=stylesheet>
|
||||||
<link href=/css/search.main.css?v=57 rel=stylesheet>
|
<link href=/css/search.main.css?v=547 rel=stylesheet>
|
||||||
<link href=/css/watch.main.css rel=stylesheet>
|
<link href=/css/watch.main.css rel=stylesheet>
|
||||||
<meta name="darkreader-lock"> <!-- tells dark reader that the site has a dark theme and to turn itself off -->
|
<meta name="darkreader-lock"> <!-- tells dark reader that the site has a dark theme and to turn itself off -->
|
||||||
<meta content="Searching <%=q%> - Poke" property=og:title>
|
<meta content="Searching <%=q%> | Poke" property=og:title>
|
||||||
<% if (q == "do the harlem shake") { %>
|
<% if (q == "do the harlem shake") { %>
|
||||||
<meta content="DO THE HARLEM SHAKE" property=twitter:description>
|
<meta content="DO THE HARLEM SHAKE" property=twitter:description>
|
||||||
<% } %>
|
<% } %>
|
||||||
@@ -62,34 +62,32 @@ summary:hover{
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<link href=https://p.poketube.fun/https://site-assets.fontawesome.com/releases/v6.1.1/css/all.css rel=stylesheet>
|
<link href=https://p.poketube.fun/https://site-assets.fontawesome.com/releases/v6.1.1/css/all.css rel=stylesheet>
|
||||||
|
<link href="https://p.poketube.fun/https://cdn.jsdelivr.net/npm/ionicons@4.5.0-0/dist/css/ionicons.min.css" rel=stylesheet>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
|
||||||
|
|
||||||
.tags.rec {
|
.search-options {
|
||||||
font-weight: 600;
|
|
||||||
font-stretch: expanded;
|
|
||||||
overflow:hidden;
|
|
||||||
width: auto;
|
|
||||||
max-width: fit-content;
|
|
||||||
margin-right: auto;
|
|
||||||
padding-left: 1.5em;
|
|
||||||
margin-top: 7px;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 3px;
|
justify-content: space-between;
|
||||||
margin-inline: auto;
|
width: 100%;
|
||||||
margin-left: 8em;
|
max-width: 855px;
|
||||||
}
|
margin: auto;
|
||||||
|
padding: 24px 0px 12px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
.tags.rec:hover{
|
.tags.rec:hover{
|
||||||
overflow-x:auto;
|
overflow-x:auto;
|
||||||
}
|
}
|
||||||
|
.tags.rec {
|
||||||
|
display: flex;
|
||||||
|
gap: 12px;
|
||||||
|
height: max-content;
|
||||||
|
}
|
||||||
.tags.rec > .tag {
|
.tags.rec > .tag {
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
background:var(--chip-background-hover);
|
background: var(--chip-background-hover);
|
||||||
|
padding: 8px 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tag {
|
.tag {
|
||||||
@@ -100,6 +98,19 @@ summary:hover{
|
|||||||
font-family: ubuntu, sans-serif;
|
font-family: ubuntu, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#filters-collapse summary {
|
||||||
|
color: white;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
.filter-options div {
|
||||||
|
padding: 6px 12px;
|
||||||
|
}
|
||||||
|
.filter-name.underlined {
|
||||||
|
padding: 12px 0px 12px 23px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
max-width: 800px;
|
max-width: 800px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
@@ -340,7 +351,7 @@ border:solid;
|
|||||||
|
|
||||||
<% if (q == "do the harlem shake") { %>
|
<% if (q == "do the harlem shake") { %>
|
||||||
<a class="shake" href="/143" style=font-family:Inter,sans-serif;color:#fff> <img style="transform: scale(1.3);width:8.5em;display: block;margin-left: auto;margin-right: auto;" src="/css/logo.svg?v=5"></a>
|
<a class="shake" href="/143" style=font-family:Inter,sans-serif;color:#fff> <img style="transform: scale(1.3);width:8.5em;display: block;margin-left: auto;margin-right: auto;" src="/css/logo.svg?v=5"></a>
|
||||||
<audio class="player" autoplay loop controls src="https://p.poketube.fun/https://tube.kuylar.dev/proxy/media/8vJiSSAMNWw/18?e=ca0ac04022e782540e1f2fe4d6c2994949f33184ccc07568b4b1d7c93dfebd28119cb7b9e8b5db12039ba553ed861736ca0ac04022e782540e1f2fe4d6c2994949f33184ccc07568b4b1d7c93dfebd28119cb7b9e8b5db12039ba553ed861736Piwikd74c7f459daf669799074a22bcf7d79bb66e03dbd9899a2089e0bee8ed383f0c3b928c4477a42208cbd69a77549e3451
|
<audio class="player" autoplay loop controls src="https://eu-proxy.poketube.fun/latest_version?id=8vJiSSAMNWw&itag=18&local=true?e=ca0ac04022e782540e1f2fe4d6c2994949f33184ccc07568b4b1d7c93dfebd28119cb7b9e8b5db12039ba553ed861736ca0ac04022e782540e1f2fe4d6c2994949f33184ccc07568b4b1d7c93dfebd28119cb7b9e8b5db12039ba553ed861736Piwikd74c7f459daf669799074a22bcf7d79bb66e03dbd9899a2089e0bee8ed383f0c3b928c4477a42208cbd69a77549e3451
|
||||||
" style="display:none;">
|
" style="display:none;">
|
||||||
<script>
|
<script>
|
||||||
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later
|
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later
|
||||||
@@ -363,7 +374,7 @@ video[counter].classList.add("shake");
|
|||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
animation: barrelRoll 2s alternate; /* Adjust the duration as needed */
|
animation: barrelRoll 2s alternate;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@@ -493,60 +504,577 @@ video[counter].classList.add("shake");
|
|||||||
Videos
|
Videos
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="/web?query=<%=q%>" style="color:#fff;text-decoration:none;
|
<a href="/web?query=<%=q%>" style="color:#fff;text-decoration:none;display:none;
|
||||||
" class="tag c">
|
" class="tag c">
|
||||||
Web </a>
|
Web </a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<%
|
||||||
|
function isMathExpression(query) {
|
||||||
|
return /^[0-9\s\+\-\*\/\.\x]+$/.test(query);
|
||||||
|
}
|
||||||
|
|
||||||
<% if (q.includes("suicide")) { %>
|
function evaluateMathExpression(expression) {
|
||||||
|
// twenyone
|
||||||
|
if (expression.replace(/\s+/g, '') === '9+10') {
|
||||||
|
return '21';
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return eval(expression);
|
||||||
|
} catch (error) {
|
||||||
|
return 'Invalid Expression';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCurrentDate() {
|
||||||
|
const now = new Date();
|
||||||
|
return now.toLocaleDateString();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCurrentYear() {
|
||||||
|
return new Date().getFullYear();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTimeInTimezone(location) {
|
||||||
|
const timezones = {
|
||||||
|
"california": "America/Los_Angeles",
|
||||||
|
"new york": "America/New_York",
|
||||||
|
"chicago": "America/Chicago",
|
||||||
|
"denver": "America/Denver",
|
||||||
|
"phoenix": "America/Phoenix",
|
||||||
|
"anchorage": "America/Anchorage",
|
||||||
|
"honolulu": "Pacific/Honolulu",
|
||||||
|
"london": "Europe/London",
|
||||||
|
"paris": "Europe/Paris",
|
||||||
|
"berlin": "Europe/Berlin",
|
||||||
|
"madrid": "Europe/Madrid",
|
||||||
|
"rome": "Europe/Rome",
|
||||||
|
"moscow": "Europe/Moscow",
|
||||||
|
"athens": "Europe/Athens",
|
||||||
|
"sydney": "Australia/Sydney",
|
||||||
|
"melbourne": "Australia/Melbourne",
|
||||||
|
"brisbane": "Australia/Brisbane",
|
||||||
|
"perth": "Australia/Perth",
|
||||||
|
"tokyo": "Asia/Tokyo",
|
||||||
|
"osaka": "Asia/Osaka",
|
||||||
|
"seoul": "Asia/Seoul",
|
||||||
|
"beijing": "Asia/Shanghai",
|
||||||
|
"shanghai": "Asia/Shanghai",
|
||||||
|
"hong kong": "Asia/Hong_Kong",
|
||||||
|
"taipei": "Asia/Taipei",
|
||||||
|
"bangkok": "Asia/Bangkok",
|
||||||
|
"jakarta": "Asia/Jakarta",
|
||||||
|
"delhi": "Asia/Kolkata",
|
||||||
|
"mumbai": "Asia/Kolkata",
|
||||||
|
"kolkata": "Asia/Kolkata",
|
||||||
|
"karachi": "Asia/Karachi",
|
||||||
|
"lahore": "Asia/Karachi",
|
||||||
|
"dubai": "Asia/Dubai",
|
||||||
|
"abu dhabi": "Asia/Dubai",
|
||||||
|
"riyadh": "Asia/Riyadh",
|
||||||
|
"johannesburg": "Africa/Johannesburg",
|
||||||
|
"cairo": "Africa/Cairo",
|
||||||
|
"nairobi": "Africa/Nairobi",
|
||||||
|
"lagos": "Africa/Lagos",
|
||||||
|
"algiers": "Africa/Algiers",
|
||||||
|
"casablanca": "Africa/Casablanca",
|
||||||
|
"lisbon": "Europe/Lisbon",
|
||||||
|
"dublin": "Europe/Dublin",
|
||||||
|
"zurich": "Europe/Zurich",
|
||||||
|
"vienna": "Europe/Vienna",
|
||||||
|
"stockholm": "Europe/Stockholm",
|
||||||
|
"oslo": "Europe/Oslo",
|
||||||
|
"helsinki": "Europe/Helsinki"
|
||||||
|
};
|
||||||
|
|
||||||
|
const timezone = timezones[location.toLowerCase()];
|
||||||
|
if (!timezone) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const now = new Date();
|
||||||
|
const options = { timeZone: timezone, timeStyle: 'medium', hour12: false };
|
||||||
|
return now.toLocaleTimeString('en-US', options);
|
||||||
|
}
|
||||||
|
|
||||||
|
const query = q.toLowerCase().trim();
|
||||||
|
let answer = '';
|
||||||
|
|
||||||
|
if (isMathExpression(query)) {
|
||||||
|
answer = evaluateMathExpression(query);
|
||||||
|
} else if (query.includes('date') || query.includes('what date is it')) {
|
||||||
|
answer = getCurrentDate();
|
||||||
|
} else if (query.includes('year') || query.includes('what year is it')) {
|
||||||
|
answer = getCurrentYear();
|
||||||
|
} else if (query.includes('what time is it in')) {
|
||||||
|
const location = query.split('what time is it in')[1].trim();
|
||||||
|
answer = getTimeInTimezone(location);
|
||||||
|
} else if (query.includes('what time is it')) {
|
||||||
|
answer = new Date().toLocaleTimeString();
|
||||||
|
} else if (query.includes('day') || query.includes('what day is it')) {
|
||||||
|
const now = new Date();
|
||||||
|
const options = { weekday: 'long' };
|
||||||
|
answer = now.toLocaleDateString(undefined, options);
|
||||||
|
} else if (query.includes('u are cute') || query.includes('you are cute')) {
|
||||||
|
answer = "jifshfgdhjf >~< no u"
|
||||||
|
} else if (query.includes('ur cute') || query.includes('your cute')) {
|
||||||
|
answer = "efkohgefgef >///< no u"
|
||||||
|
} else if (query.includes('am i cute') || query.includes('am i a cutie?')) {
|
||||||
|
answer = "yesh :3 u are "
|
||||||
|
} else if (query.includes('am i a good girl') || query.includes('am i a good boy?')) {
|
||||||
|
answer = query.includes('girl') ? "yesh :3 u are a good girl" : "yesh :3 u are a good boy";
|
||||||
|
} else if (query.includes('ur hot') || query.includes('you are hot')) {
|
||||||
|
answer = "jrifyehgyerfgu9wdswgfsafgydwgbfwdfge >~< "
|
||||||
|
}
|
||||||
|
|
||||||
|
const upsellMessages = [
|
||||||
|
"[new] Try searching 'What's 4+4?'",
|
||||||
|
"[new] Ask 'What's the date today?'",
|
||||||
|
"[new] Try 'What time is it in California?'",
|
||||||
|
"[new] Ask 'What's the current year?'",
|
||||||
|
"[new] Try searching 'What's 7*8?'"
|
||||||
|
];
|
||||||
|
|
||||||
|
const showUpsell = !answer && Math.random() < 0.1;
|
||||||
|
const randomUpsellMessage = showUpsell ? upsellMessages[Math.floor(Math.random() * upsellMessages.length)] : '';
|
||||||
|
|
||||||
|
|
||||||
|
function extractQueryFromUpsellMessage(message) {
|
||||||
|
return message.replace("[new] Try searching '", "")
|
||||||
|
.replace("[new] Try '", "")
|
||||||
|
.replace("[new] Ask '", "")
|
||||||
|
.replace("[new] Try ", "")
|
||||||
|
.replace("'", "")
|
||||||
|
.replace("?", "")
|
||||||
|
.trim();
|
||||||
|
}
|
||||||
|
%>
|
||||||
|
%>
|
||||||
|
<% if (answer) { %>
|
||||||
|
<div class="container">
|
||||||
|
<h2 style="font-family: 'PokeTube Flex';font-size: large;text-align: left !important;font-stretch: ultra-expanded; font-weight: 1000; margin-bottom: -0.1em;">
|
||||||
|
Answer to ur question
|
||||||
|
</h2>
|
||||||
|
<h2 style="font-family: 'PokeTube Flex';font-size: large;text-align: right !important;font-stretch: ultra-expanded; font-weight: 1000; margin-bottom: -0.1em;margin-top: -1em;"><i title="PokeInstant Anwser! (not ai/LLM)" class="fa-light fa-sparkles"></i></h2>
|
||||||
|
<span style="font-size: 7em; margin-bottom: 3em; text-align: left !important; margin-right: 7em;white-space: -moz-pre-wrap !important;white-space: -pre-wrap;white-space: -o-pre-wrap;white-space: pre-wrap;word-wrap: break-word;white-space: -webkit-pre-wrap;word-break: break-all;white-space: normal;"><%= answer %></span>
|
||||||
|
</div>
|
||||||
|
<% } else if (showUpsell) { %>
|
||||||
|
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
<% if (q == "ai" || q == "aibot" || q == "chatbot") { %>
|
||||||
|
<div class="container">
|
||||||
|
<h2 style="font-family: 'PokeTube Flex'; font-size: large; text-align: center !important; font-stretch: ultra-expanded; font-weight: 1000; margin-bottom: -0.1em;">
|
||||||
|
No, POKE Will Never Have "AI" —Because It Doesn't Need It
|
||||||
|
</h2>
|
||||||
|
<span style="margin-bottom: 3em; text-align: left !important; margin-right: 7em; white-space: pre-wrap; word-break: break-word;">
|
||||||
|
POKE doesn’t need "AI." There’s no good reason for a YouTube front end to include some gimmicky AI assistant. These days, "AI" just means slapping a ChatGPT wrapper on an app, calling it innovative, and hoping no one notices the lack of actual purpose. It’s the latest fad, sure, but POKE is about simplicity, privacy, and doing things right—not just joining tech trends for the sake of it.
|
||||||
|
<br>
|
||||||
|
POKE is here to make watching videos smoother, not cluttered with unnecessary "features." Real value doesn’t come from chasing whatever big tech wants to sell you on. It’s about staying true to what actually helps users. So, yeah, no AI here, and honestly, no need for it.
|
||||||
|
<br>
|
||||||
|
If u really want a "chatbot" or "ai" : <a href="https://chatgpt.com/"> look at the chatgpt website </a> - (or search using the !ai bang - which is made by duckduckgo, not <a href="https://duckduckgo.com/duckduckgo-help-pages/features/bangs/">us</a>)
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
<!-- self harm -->
|
||||||
|
<%
|
||||||
|
const searchStrings = [
|
||||||
|
"\\bsuicide\\b", "\\bself harm\\b", "\\bself-harm\\b", "\\bsupport\\b", "\\bmurder\\b",
|
||||||
|
"\\bhow to murder\\b", "\\bkill myself\\b", "\\bend my life\\b", "\\bdepressed\\b",
|
||||||
|
"\\bdepression\\b", "\\blonely\\b", "\\bhurt myself\\b", "\\bselfharm\\b", "\\bdying\\b",
|
||||||
|
"\\bwant to die\\b", "\\bkill\\b", "\\bdie\\b", "\\bfamily problems\\b", "\\bfamily issues\\b",
|
||||||
|
"\\babuse\\b", "\\bdomestic violence\\b", "\\babusive parents\\b", "\\bfamily conflict\\b",
|
||||||
|
"\\bestranged\\b", "\\bdisowned\\b", "\\brun away\\b", "\\brunaway\\b", "\\b.full stop punctuation.\\b"
|
||||||
|
];
|
||||||
|
if (searchStrings.some(str => new RegExp(str, 'i').test(q))) {
|
||||||
|
%>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
<span style="font-size: 7em; color: pink;margin-bottom: 3em;">❤️</span><br>
|
||||||
<h2 style="font-family: 'PokeTube Flex';font-size: large;text-align: left;font-stretch: ultra-expanded;
|
<h2 style="font-family: 'PokeTube Flex';font-size: large;text-align: left;font-stretch: ultra-expanded;
|
||||||
font-weight: 1000;">You are not alone</h2>
|
font-weight: 1000;">You are not alone</h2>
|
||||||
<p>
|
<p>
|
||||||
if you or somebody you know is having a bad time, talk to somebody today.
|
If you're having a tough time or know someone who is, reaching out and talking to someone can really help.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
if you are from the US, call 988. if you arent <a href="https://www.psychologytoday.com/us/basics/suicide/suicide-prevention-hotlines-resources-worldwide"> see this url.</a>
|
In the US? Call <strong>988</strong> for support. Not in the US? <a href="https://www.psychologytoday.com/us/basics/suicide/suicide-prevention-hotlines-resources-worldwide">Check out this link</a> for worldwide help.
|
||||||
<br> <br> dont worry, ur not alone <3 and you are really important btw!
|
</p>
|
||||||
</p>
|
<p>
|
||||||
|
LGBTQ+ and need someone to talk to? Try the <a href="https://www.thetrevorproject.org/">Trevor Project</a> at <strong>1-866-488-7386</strong> or text <strong>START</strong> to <strong>678-678</strong>. For more options, <a href="https://www.imalive.org/">IMAlive</a> is also available.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Remember, ur not alone. u matter, and there's always someone who cares. and you are really important btw! <span style="font-family: 'PokeTube Flex';">❤️</span>
|
||||||
|
</p>
|
||||||
|
<p>wrong filter? <a href="https://codeberg.org/ashley/poke/issues/new?template=issue_template%2fsearch-filter.yml">Report :3</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
<%
|
||||||
|
const fakeNewsSources = {
|
||||||
|
"InfoWars": {
|
||||||
|
category: "conspiracy",
|
||||||
|
reason: "InfoWars has been widely criticized for promoting conspiracy theories and false information, such as falsely claiming that the Sandy Hook Elementary School shooting was a hoax.",
|
||||||
|
search: "Is it true that InfoWars promotes conspiracy theories and false information?"
|
||||||
|
},
|
||||||
|
"Breitbart": {
|
||||||
|
category: "conservative",
|
||||||
|
reason: "Breitbart is known for its extreme political bias and spreading misleading information, including downplaying the severity of COVID-19.",
|
||||||
|
search: "Is it true that Breitbart spreads misleading information about COVID-19?"
|
||||||
|
},
|
||||||
|
"Daily Mail": {
|
||||||
|
category: "tabloid",
|
||||||
|
reason: "The Daily Mail is frequently criticized for sensationalism and misinformation, such as publishing misleading health and science stories.",
|
||||||
|
search: "Is it true that the Daily Mail publishes misleading health and science stories?"
|
||||||
|
},
|
||||||
|
"Natural News": {
|
||||||
|
category: "pseudoscience",
|
||||||
|
reason: "Natural News promotes pseudoscience and conspiracy theories, including false vaccine claims and unverified health information.",
|
||||||
|
search: "Is it true that Natural News promotes pseudoscience and false vaccine claims?"
|
||||||
|
},
|
||||||
|
"RT news": {
|
||||||
|
category: "state-sponsored",
|
||||||
|
reason: "RT is a state-funded media outlet known for promoting Russian government perspectives and biased reporting on international issues.",
|
||||||
|
search: "Is it true that RT promotes Russian government perspectives and biased reporting?"
|
||||||
|
},
|
||||||
|
"Sputnik": {
|
||||||
|
category: "state-sponsored",
|
||||||
|
reason: "Sputnik spreads Russian state propaganda and publishes misleading information about Western countries.",
|
||||||
|
search: "Is it true that Sputnik spreads Russian state propaganda?"
|
||||||
|
},
|
||||||
|
"Before It's News": {
|
||||||
|
category: "conspiracy",
|
||||||
|
reason: "Before It's News is known for spreading conspiracy theories and fake news, including fabricated stories about global events.",
|
||||||
|
search: "Is it true that Before It's News spreads conspiracy theories and fake news?"
|
||||||
|
},
|
||||||
|
"Your News Wire": {
|
||||||
|
category: "conspiracy",
|
||||||
|
reason: "Your News Wire publishes false information and conspiracy theories, including fabricated reports on various topics.",
|
||||||
|
search: "Is it true that Your News Wire publishes false information and conspiracy theories?"
|
||||||
|
},
|
||||||
|
"WorldTruth.TV": {
|
||||||
|
category: "conspiracy",
|
||||||
|
reason: "WorldTruth.TV spreads conspiracy theories and pseudoscience, including false health information and other dubious claims.",
|
||||||
|
search: "Is it true that WorldTruth.TV spreads conspiracy theories and pseudoscience?"
|
||||||
|
},
|
||||||
|
"NewsPunch": {
|
||||||
|
category: "conspiracy",
|
||||||
|
reason: "NewsPunch publishes false information and conspiracy theories, including unsubstantiated claims about political figures.",
|
||||||
|
search: "Is it true that NewsPunch publishes false information and conspiracy theories?"
|
||||||
|
},
|
||||||
|
"Civic Tribune": {
|
||||||
|
category: "fake-news",
|
||||||
|
reason: "Civic Tribune is known for hoaxes and misinformation, including fabricated stories about political events.",
|
||||||
|
search: "Is it true that Civic Tribune is known for hoaxes and misinformation?"
|
||||||
|
},
|
||||||
|
"The Daily Stormer": {
|
||||||
|
category: "extremist",
|
||||||
|
reason: "The Daily Stormer promotes hate speech and extremist views, including anti-Semitic and other hateful content.",
|
||||||
|
search: "Is it true that The Daily Stormer promotes hate speech and extremist views?"
|
||||||
|
},
|
||||||
|
"Times of Israel": {
|
||||||
|
category: "state-sponsored",
|
||||||
|
reason: "Times of Israel has faced criticism for biased reporting and spreading propaganda, especially regarding the Israel-Palestine conflict.",
|
||||||
|
search: "Is it true that Times of Israel has biased reporting on the Israel-Palestine conflict?"
|
||||||
|
},
|
||||||
|
"Zero Hedge": {
|
||||||
|
category: "conspiracy",
|
||||||
|
reason: "Zero Hedge promotes conspiracy theories and financial misinformation, including false claims about market events.",
|
||||||
|
search: "Is it true that Zero Hedge promotes conspiracy theories and financial misinformation?"
|
||||||
|
},
|
||||||
|
"Pravda": {
|
||||||
|
category: "state-sponsored",
|
||||||
|
reason: "Pravda is a state-run media outlet known for spreading Russian government propaganda with a history of biased reporting on international events.",
|
||||||
|
search: "Is it true that Pravda spreads Russian government propaganda?"
|
||||||
|
},
|
||||||
|
"Press TV": {
|
||||||
|
category: "state-sponsored",
|
||||||
|
reason: "Press TV promotes Iranian government propaganda and often spreads biased information about Western countries.",
|
||||||
|
search: "Is it true that Press TV promotes Iranian government propaganda?"
|
||||||
|
},
|
||||||
|
"Fox News": {
|
||||||
|
category: "conservative",
|
||||||
|
reason: "Fox News is often criticized for extreme political bias and misinformation, such as its reporting on the 2020 US election.",
|
||||||
|
search: "Is it true that Fox News has extreme political bias and misinformation?"
|
||||||
|
},
|
||||||
|
"The Blaze": {
|
||||||
|
category: "conservative",
|
||||||
|
reason: "The Blaze promotes right-wing viewpoints and sometimes misleading information, including false claims about political figures.",
|
||||||
|
search: "Is it true that The Blaze promotes misleading information?"
|
||||||
|
},
|
||||||
|
"OANN": {
|
||||||
|
category: "conservative",
|
||||||
|
reason: "OANN spreads far-right viewpoints and conspiracy theories, including false claims about election fraud.",
|
||||||
|
search: "Is it true that OANN spreads far-right viewpoints and conspiracy theories?"
|
||||||
|
},
|
||||||
|
"Newsmax": {
|
||||||
|
category: "conservative",
|
||||||
|
reason: "Newsmax promotes extreme right-wing perspectives and misinformation, including false claims about the COVID-19 pandemic.",
|
||||||
|
search: "Is it true that Newsmax promotes extreme right-wing perspectives and misinformation?"
|
||||||
|
},
|
||||||
|
"Al Jazeera": {
|
||||||
|
category: "state-sponsored",
|
||||||
|
reason: "Al Jazeera, a Qatar state-funded media outlet, has a history of promoting government viewpoints and biased reporting on Middle Eastern conflicts.",
|
||||||
|
search: "Is it true that Al Jazeera promotes government viewpoints and biased reporting?"
|
||||||
|
},
|
||||||
|
"The Sun": {
|
||||||
|
category: "tabloid",
|
||||||
|
reason: "The Sun is known for sensationalism and often publishes exaggerated or false stories, particularly about celebrities and high-profile topics.",
|
||||||
|
search: "Is it true that The Sun publishes exaggerated or false stories?"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const normalizedQuery = q.toLowerCase().replace(/\s+/g, '');
|
||||||
|
const matchedSource = Object.keys(fakeNewsSources).find(source => normalizedQuery.includes(source.toLowerCase().replace(/\s+/g, '')));
|
||||||
|
|
||||||
|
if (q.includes('-debug-news')) {
|
||||||
|
%>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<h2 class="debug-title">
|
||||||
|
<span class="debug-icon">🔍</span> Debug Info
|
||||||
|
</h2>
|
||||||
|
<p class="debug-intro">
|
||||||
|
Here are all the sources and their details:
|
||||||
|
</p>
|
||||||
|
<ul class="debug-list">
|
||||||
|
<% Object.keys(fakeNewsSources).forEach(source => { %>
|
||||||
|
<li class="debug-item">
|
||||||
|
<strong><%= source %></strong> - <%= fakeNewsSources[source].reason %> <br>
|
||||||
|
<a class="debug-link" href="https://www.google.com/search?q=<%= fakeNewsSources[source].search %>">Find more info</a>
|
||||||
|
</li>
|
||||||
|
<% }); %>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<% } else if (matchedSource) { %>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<h2 class="warning-title">
|
||||||
|
<span class="warning-icon">🚫</span>
|
||||||
|
<br> Be Cautious with This Source
|
||||||
|
</h2>
|
||||||
|
<p class="warning-intro">
|
||||||
|
Hai there! It looks like you might be looking at info from <strong><%= matchedSource %></strong>, which is known for spreading fake news or propaganda.
|
||||||
|
</p>
|
||||||
|
<p class="warning-tips">
|
||||||
|
Here are some tips to check if what you're reading is legit:
|
||||||
|
</p>
|
||||||
|
<ul class="tips-list">
|
||||||
|
<li class="tips-item"><strong>Check the source's rep:</strong> Reliable sites usually have a good track record for being accurate and fair.</li>
|
||||||
|
<li class="tips-item"><strong>See if other reputable sites are reporting the same news:</strong> If it's just one place, be cautious.</li>
|
||||||
|
<li class="tips-item"><strong>Use fact-checking sites:</strong> Try <a href="https://www.snopes.com/" class="fact-check-link">Snopes</a> or <a href="https://www.factcheck.org/" class="fact-check-link">FactCheck.org</a>.</li>
|
||||||
|
<li class="tips-item"><strong>Look at the publication date:</strong> Make sure it's current and not out of context.</li>
|
||||||
|
<li class="tips-item"><strong>Check for links and citations:</strong> Good articles usually back up their claims with evidence.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>wrong filter? <a href="https://codeberg.org/ashley/poke/issues/new?template=issue_template%2fsearch-filter.yml">Report :3</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.container {
|
||||||
|
max-width: 800px;
|
||||||
|
margin: 20px auto;
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 8px;
|
||||||
|
background: #1a1a1a;
|
||||||
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.debug-title, .warning-title {
|
||||||
|
font-family: 'PokeTube Flex';
|
||||||
|
font-size: large;
|
||||||
|
text-align: left;
|
||||||
|
font-stretch: ultra-expanded;
|
||||||
|
font-weight: 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.debug-icon, .warning-icon {
|
||||||
|
font-size: 7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.debug-intro, .warning-intro, .warning-tips, .warning-info {
|
||||||
|
font-size: 16px;
|
||||||
|
color: #fff;
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.debug-list, .tips-list, .warning-links {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.debug-item, .tips-item, .warning-link {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.debug-link, .fact-check-link, .warning-link {
|
||||||
|
color: #007bff;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.debug-link:hover, .fact-check-link:hover, .warning-link:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tips-list {
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<% if (q.includes("whats your eta")) { %>
|
||||||
|
<a href="/watch?v=mREOvIgImmo" style="text-align: center;margin-left: auto;margin-right: auto;font-family: 'PokeTube Flex';font-stretch: ultra-expanded;font-weight: 1000;color: #fff;"><h1 style="font-family: 'PokeTube Flex';font-stretch: ultra-expanded;
|
||||||
|
font-weight: 1000;">2 MINUTES!</h1></a>
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
<% if (q.includes("fish")) { %>
|
||||||
|
<a style="text-align: center;margin-left: auto;margin-right: auto;font-family: 'PokeTube Flex';font-stretch: ultra-expanded;font-weight: 1000;color: #fff;"><h1 style="font-family: 'PokeTube Flex';font-stretch: ultra-expanded;
|
||||||
|
font-weight: 1000;">🐟</h1></a>
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
<% if (q.includes("how to be racist?")) { %>
|
||||||
|
<a style="text-align: center;margin-left: auto;margin-right: auto;font-family: 'PokeTube Flex';font-stretch: ultra-expanded;font-weight: 1000;color: #fff;"><h1 style="font-family: 'PokeTube Flex';font-stretch: ultra-expanded;
|
||||||
|
font-weight: 1000;">dont.</h1></a>
|
||||||
|
<% } %>
|
||||||
<% if (!tab) { %>
|
<% if (!tab) { %>
|
||||||
|
<style>
|
||||||
|
.thumbnail {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
<% invresults.forEach (x => { %>
|
.thumbnail .hover-text {
|
||||||
<div class="video-list" >
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
color: white;
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
background-color: rgba(0, 0, 0, 0.5);
|
||||||
|
padding: 5px 10px;
|
||||||
|
border-radius: 5px;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thumbnail:hover .hover-text {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thumbnail .video-length {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 10px;
|
||||||
|
right: 10px;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thumbnail:hover .video-length {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<% if (invresults?.length < 1) { %>
|
||||||
|
<style>
|
||||||
|
#filters {
|
||||||
|
display:none
|
||||||
|
}
|
||||||
|
.tag {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div style="margin-left:auto;margin-right:auto;padding: 1em;width: fit-content;background: #1a1a1a;border-radius: 1em;border: 1px solid #ccc;">
|
||||||
|
<img style="height: 10em; color: pink;margin-bottom: -17px;text-align:center;align-self: center;margin-left: 7em;" src="/static/Pepe_party_4_transparent.gif"> <p>
|
||||||
|
no results found :c u can try <a href="https://youtube.com/results?search_query=<%=q%>">YouTube</a> to find the video ur wanting!!! ^_^
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
<% if (invresults?.results) { %>
|
||||||
|
<% invresults.results.forEach(x => { %>
|
||||||
|
<div class="video-list">
|
||||||
<div class="video">
|
<div class="video">
|
||||||
<a
|
<a href="/watch?v=<%= x.videoId %>"
|
||||||
href="/watch?v=<%= x.videoId %>"
|
|
||||||
class="thumbnail"
|
class="thumbnail"
|
||||||
style="background-image: url('<%- media_proxy_url %>/proxy?url=https://yt.miruku.cafe/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBmAOZV7CM3NdDKlEFxGX7PpI5UWQ');border-radius: 10px;"
|
style="background-image: url('<%- media_proxy_url %>/proxy?url=https://i.ytimg.com/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBmAOZV7CM3NdDKlEFxGX7PpI5UWQ');border-radius: 10px;">
|
||||||
><span class="video-length"><%=turntomins(x.lengthSeconds) %></span></a>
|
<span class="hover-text">Watch :3</span>
|
||||||
<div class="info" style="color:#fff;text-align: left;font-weight: 1000;">
|
<span class="video-length"><%= turntomins(x.lengthSeconds) %></span>
|
||||||
|
</a>
|
||||||
|
<div class="info" style="color:#fff;text-align: left;font-weight: 1000;">
|
||||||
<a style="font-family: 'PokeTube Flex';font-size: large;text-align: left;font-stretch: extra-expanded;
|
<a style="font-family: 'PokeTube Flex';font-size: large;text-align: left;font-stretch: extra-expanded;
|
||||||
font-weight: 1000;
|
font-weight: 1000;" href="/watch?v=<%= x.videoId %>" class="title max-lines-2"><%= x.title %></a>
|
||||||
" href="/watch?v=<%= x.videoId %>" class="title max-lines-2"
|
|
||||||
><%= x.title %></a>
|
|
||||||
<div style="display: flex; flex-direction: column; row-gap: 8px;font-weight:bold">
|
<div style="display: flex; flex-direction: column; row-gap: 8px;font-weight:bold">
|
||||||
<a href="/watch?v=<%= x.videoId %>"><span><%= x.viewCountText %></span> <span>•</span> <span><%= x.publishedText %></span></a>
|
<a href="/watch?v=<%= x.videoId %>"><span><%= x.viewCountText %></span> <span>•</span> <span><%= x.publishedText %></span></a>
|
||||||
<a href="/channel?id=<%= x.authorId %>"><%=x.author %></a>
|
<img src="<%= x.authorThumbnails[1].url %>">
|
||||||
|
<a href="/channel?id=<%= x.authorId %>"><%= x.author %><% if (x?.authorVerified) { %>
|
||||||
|
<i class="icon ion ion-md-checkmark-circle" title="verified channel"></i><% } %></a>
|
||||||
|
<div style="display: inline-flex;flex-direction: row;min-width: 6em;gap: 4px;">
|
||||||
|
<a href="/download?v=<%= x.videoId %>" style="background: #333;width: 7.6em;border-radius: 18px;">
|
||||||
|
<div style="display: flex;">
|
||||||
|
<i class="fa-light fa-download" style="display: flex;font-size: 16px;padding: 5px;border-radius: 18px;margin-left: 2px;"></i><span style="margin-top: 6px;">Download</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<a href="https://youtube.com/watch?v=<%= x.videoId %>" style="background: #333;width: 7.6em;border-radius: 18px;height: 2em;width: 12.5em;">
|
||||||
|
<div style="display: flex;">
|
||||||
|
<i class="fa-brands fa-youtube" style="display: flex;font-size: 16px;padding: 5px;border-radius: 18px;margin-left: 2px;"></i><span style="margin-top: 6px;">Open on YouTube :/</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<% }) %>
|
||||||
|
<% } else if (invresults) { %>
|
||||||
|
<% invresults.forEach(x => { %>
|
||||||
|
<div class="video-list">
|
||||||
|
<div class="video">
|
||||||
|
<a href="/watch?v=<%= x.videoId %>"
|
||||||
|
class="thumbnail"
|
||||||
|
style="background-image: url('<%- media_proxy_url %>/proxy?url=https://i.ytimg.com/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBmAOZV7CM3NdDKlEFxGX7PpI5UWQ');border-radius: 10px;">
|
||||||
|
<span class="hover-text">Watch :3</span>
|
||||||
|
<span class="video-length"><%= turntomins(x.lengthSeconds) %></span>
|
||||||
|
</a>
|
||||||
|
<div class="info" style="color:#fff;text-align: left;font-weight: 1000;">
|
||||||
|
<a style="font-family: 'PokeTube Flex';font-size: large;text-align: left;font-stretch: extra-expanded;
|
||||||
|
font-weight: 1000;" href="/watch?v=<%= x.videoId %>" class="title max-lines-2"><%= x.title %></a>
|
||||||
|
<div style="display: flex; flex-direction: column; row-gap: 8px;font-weight:bold">
|
||||||
|
<a href="/watch?v=<%= x.videoId %>"><span><%= x.viewCountText %></span> <span>•</span> <span><%= x.publishedText %></span></a>
|
||||||
|
<div style="display: flex;margin-bottom: 6px;">
|
||||||
|
<img src="<%= x.authorThumbnails[1].url %>" style="width: fit-content;height: 23px;border-radius: 1em;">
|
||||||
|
<a href="/channel?id=<%= x.authorId %>" style="margin:4px"><%= x.author %><% if (x?.authorVerified) { %>
|
||||||
|
<i class="icon ion ion-md-checkmark-circle" title="verified channel"></i><% } %></a>
|
||||||
|
</div>
|
||||||
|
<div style="display: inline-flex;flex-direction: row;min-width: 6em;gap: 4px;">
|
||||||
|
<a href="/download?v=<%= x.videoId %>" style="background: #333;width: 7.6em;border-radius: 18px;">
|
||||||
|
<div style="display: flex;">
|
||||||
|
<i class="fa-light fa-download" style="display: flex;font-size: 16px;padding: 5px;border-radius: 18px;margin-left: 2px;"></i><span style="margin-top: 6px;">Download</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<a href="https://youtube.com/watch?v=<%= x.videoId %>" style="background: #333;width: 7.6em;border-radius: 18px;height: 2em;width: 12.5em;">
|
||||||
|
<div style="display: flex;">
|
||||||
|
<i class="fa-brands fa-youtube" style="display: flex;font-size: 16px;padding: 5px;border-radius: 18px;margin-left: 2px;"></i><span style="margin-top: 6px;">Open on YouTube :/</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% }) %>
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<% }) %>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<audio id="audio" style="display:none;" loop autoplay></audio>
|
<audio id="audio" style="display:none;" loop autoplay></audio>
|
||||||
@@ -554,7 +1082,11 @@ font-weight: 1000;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<center> <hr style="clear: both;display: block;border: none;border-bottom: 0.5px solid #2f2f2f;margin: 0 16em;/*! width: 4.5em; */height: 0;margin-top: 1em;">
|
<% if (invresults?.length >= 1) { %>
|
||||||
|
|
||||||
|
<center>
|
||||||
|
|
||||||
|
<hr style="clear: both;display: block;border: none;border-bottom: 0.5px solid #2f2f2f;margin: 0 16em;/*! width: 4.5em; */height: 0;margin-top: 1em;">
|
||||||
|
|
||||||
<div style="border-top: 1px solid var(--border-color);width: 100%;display: flex;gap: 43em;padding: 0;margin: 0;">
|
<div style="border-top: 1px solid var(--border-color);width: 100%;display: flex;gap: 43em;padding: 0;margin: 0;">
|
||||||
|
|
||||||
@@ -578,29 +1110,9 @@ font-weight: 1000;
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
</center>
|
</center>
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
|
||||||
<% if (!Array.isArray(invresults)) { %>
|
|
||||||
<br>
|
|
||||||
<center>
|
|
||||||
<h1 style="font-family:'Ginto nord';font-weight:900;white-space:yes;">
|
|
||||||
<img src="https://p.poketube.fun/https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Ftse2.explicit.bing.net%2Fth%3Fid%3DOIP.GUMY7MavfJyrfhjKbPKB9wHaDt%26pid%3DApi&f=1">
|
|
||||||
</h1>
|
|
||||||
<p>A error occured while searching. perhaps try refresing the page lol</p>
|
|
||||||
<p>
|
|
||||||
You can try other alternatives to access this resource such as:
|
|
||||||
<b>
|
|
||||||
<a href="https://invidio.us/results?q=<%=q%>">Invidious</a>
|
|
||||||
</b>
|
|
||||||
or
|
|
||||||
<b>
|
|
||||||
<a href="https://tube.kuylar.dev/results?search_query=<%=q%>">lighttube</a>
|
|
||||||
</b>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
This page will be refreshed after 10 seconds
|
|
||||||
</p>
|
|
||||||
<meta http-equiv="refresh" content="10">
|
|
||||||
<% } %>
|
|
||||||
</center>
|
</center>
|
||||||
|
|
||||||
<% } %>
|
<% } %>
|
||||||
@@ -623,7 +1135,7 @@ font-weight: 1000;
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="/css/custom-css.js"> </script>
|
<script src="/static/custom-css.js?v=45485"> </script>
|
||||||
<script>
|
<script>
|
||||||
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later
|
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later
|
||||||
if ('serviceWorker' in navigator) {
|
if ('serviceWorker' in navigator) {
|
||||||
|
|||||||
@@ -16,23 +16,22 @@
|
|||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see https://www.gnu.org/licenses/.
|
along with this program. If not, see https://www.gnu.org/licenses/.
|
||||||
-->
|
-->
|
||||||
<!doctype html>
|
<!doctype html>
|
||||||
|
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
|
||||||
<title>PokeTranslate</title>
|
<head>
|
||||||
<link rel="icon" href="/static/yt-ukraine.svg">
|
<title>PokeTranslate</title>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<link rel="icon" href="/static/yt-ukraine.svg">
|
||||||
<meta content="PokeTranslate" property=og:title>
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<meta content="Translate text - Anonymously!" property=twitter:description>
|
<meta content="PokeTranslate" property=og:title>
|
||||||
<meta content="https://cdn.glitch.global/d68d17bb-f2c0-4bc3-993f-50902734f652/aa70111e-5bcd-4379-8b23-332a33012b78.image.png?v=1701898829884" property="og:image" />
|
<meta content="Translate text - Anonymously!" property=twitter:description>
|
||||||
<meta content=summary_large_image name=twitter:card>
|
<meta content="https://cdn.glitch.global/d68d17bb-f2c0-4bc3-993f-50902734f652/aa70111e-5bcd-4379-8b23-332a33012b78.image.png?v=1701898829884" property="og:image" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta content=summary_large_image name=twitter:card>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'">
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'">
|
||||||
<meta name="referrer" content="no-referrer">
|
<meta name="referrer" content="no-referrer">
|
||||||
<link rel="manifest" href="/manifest.json">
|
<link rel="manifest" href="/manifest.json">
|
||||||
<style>
|
<style>
|
||||||
.center {
|
.center {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
@@ -41,43 +40,96 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
margin: 10px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wrap.languages {
|
.wrap.languages {
|
||||||
flex-wrap: nowrap;
|
margin-bottom: 30px;
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#could_not_switch_languages_text {
|
|
||||||
color: red;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.item {
|
.item {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 150px;
|
height: 150px;
|
||||||
border-radius:1em;
|
border-radius: 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-wrapper {
|
.item-wrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
width: 450px;
|
width: 450px;
|
||||||
margin: 5px 10px;
|
margin: 5px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
button,
|
||||||
.language,
|
select,
|
||||||
.switch_languages {
|
input,
|
||||||
display: flex;
|
textarea {
|
||||||
|
border-radius: 1em;
|
||||||
|
padding: 10px;
|
||||||
|
background-color: #131618;
|
||||||
|
border: 2px solid #495057;
|
||||||
|
color: #f8f9fa;
|
||||||
}
|
}
|
||||||
|
|
||||||
.language {
|
body {
|
||||||
margin: 0px 10px;
|
justify-content: center;
|
||||||
|
font-family: sans-serif;
|
||||||
|
background-color: #2c2f33;
|
||||||
|
color: #f8f9fa;
|
||||||
}
|
}
|
||||||
|
|
||||||
.switch_languages {
|
#translation-form {
|
||||||
margin: 0px 5px;
|
background-color: #1f2023;
|
||||||
|
border-radius: 1em;
|
||||||
|
padding: 20px;
|
||||||
|
width: 90%;
|
||||||
|
max-width: 800px;
|
||||||
|
margin: auto;
|
||||||
|
box-shadow: 0 0 15px rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: #5bc0de;
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
#definitions_and_translations {
|
||||||
|
display: grid;
|
||||||
|
width: 100%;
|
||||||
|
grid-template-areas: "definitions translations";
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 1200px) {
|
||||||
|
#definitions_and_translations {
|
||||||
|
display: grid;
|
||||||
|
grid-template-areas:
|
||||||
|
"definitions definitions"
|
||||||
|
"translations translations";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
div.definitions,
|
||||||
|
div.translations {
|
||||||
|
padding: 10px;
|
||||||
|
background-color: #3a3f44;
|
||||||
|
border-radius: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea:focus,
|
||||||
|
input:focus,
|
||||||
|
button:focus {
|
||||||
|
border-color: #478061;
|
||||||
|
outline: 1px solid #478061;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #599bf6;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Additional styles to match the calendar page */
|
||||||
|
header {
|
||||||
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#switchbutton {
|
#switchbutton {
|
||||||
@@ -86,163 +138,50 @@
|
|||||||
|
|
||||||
button {
|
button {
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
padding: 4px 10px;
|
|
||||||
border: 2px solid #888888;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
input,
|
.center button {
|
||||||
select,
|
margin-top: 15px;
|
||||||
textarea {
|
|
||||||
width: 100%;
|
|
||||||
font-size: 1rem;
|
|
||||||
padding: 4px;
|
|
||||||
border: 2px solid #888888;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
textarea {
|
/* Responsive design */
|
||||||
resize: vertical;
|
@media screen and (max-width: 768px) {
|
||||||
height: 5rem;
|
#translation-form {
|
||||||
font-family: sans-serif;
|
padding: 10px;
|
||||||
width: 100%;
|
}
|
||||||
|
|
||||||
|
.wrap {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-wrapper {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
input:focus,
|
<% if (isMobile) { %>
|
||||||
select:focus,
|
<style>
|
||||||
textarea:focus,
|
|
||||||
button:focus {
|
|
||||||
border-color: #478061;
|
|
||||||
outline: 1px solid #478061;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
body {
|
body {
|
||||||
justify-content: center;
|
overflow: auto;
|
||||||
font-family: sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
#definitions_and_translations {
|
|
||||||
display: grid;
|
|
||||||
margin: auto;
|
|
||||||
width: 1100px;
|
|
||||||
gap: 10px;
|
|
||||||
grid-template-areas: "definitions translations";
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.def_type {
|
|
||||||
color: #007979;
|
|
||||||
text-transform: capitalize;
|
|
||||||
}
|
|
||||||
|
|
||||||
.syn {
|
|
||||||
color: #804700;
|
|
||||||
}
|
|
||||||
|
|
||||||
.syn_type {
|
|
||||||
color: #007979;
|
|
||||||
}
|
|
||||||
|
|
||||||
.use_in_sentence {
|
|
||||||
color: #009902;
|
|
||||||
}
|
|
||||||
|
|
||||||
.definitions li:not(:last-child) {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 1200px) {
|
|
||||||
#definitions_and_translations {
|
|
||||||
display: grid;
|
|
||||||
width: 90vw;
|
|
||||||
grid-template-areas:
|
|
||||||
"definitions definitions"
|
|
||||||
"translations translations";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
div.definitions {
|
|
||||||
grid-area: definitions;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.translations {
|
|
||||||
grid-area: translations;
|
|
||||||
}
|
}
|
||||||
|
</style>
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
<% if (!isMobile) { %>
|
||||||
|
<style>
|
||||||
body {
|
body {
|
||||||
background-color: #212529;
|
overflow: hidden;
|
||||||
color: #f8f9fa;
|
}
|
||||||
}
|
</style>
|
||||||
|
<% } %>
|
||||||
|
</head>
|
||||||
|
|
||||||
#could_not_switch_languages_text {
|
<body>
|
||||||
color: #F13333;
|
<div id="translation-form">
|
||||||
}
|
<header class="center">
|
||||||
|
<h1>PokeTranslate</h1>
|
||||||
a:visited {
|
</header>
|
||||||
color: #9759f6;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: #599bf6;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
input,
|
|
||||||
select,
|
|
||||||
button,
|
|
||||||
textarea {
|
|
||||||
background-color: #131618;
|
|
||||||
border-color: #495057;
|
|
||||||
color: #f8f9fa;
|
|
||||||
}
|
|
||||||
|
|
||||||
.def_type {
|
|
||||||
color: cyan;
|
|
||||||
text-transform: capitalize;
|
|
||||||
}
|
|
||||||
|
|
||||||
.syn {
|
|
||||||
color: burlywood;
|
|
||||||
}
|
|
||||||
|
|
||||||
.syn_type {
|
|
||||||
color: cyan;
|
|
||||||
}
|
|
||||||
|
|
||||||
.use_in_sentence {
|
|
||||||
color: yellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<% if (isMobile) { %>
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<% } %>
|
|
||||||
|
|
||||||
<% if (!isMobile) { %>
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<% } %>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<div style="border-radius: 3em;background: #1a1a1a;padding: 1em;display: flex;flex-direction: column;height: fit-content;align-self: center;margin-top: 6em;">
|
|
||||||
|
|
||||||
<header class="center"><h1>PokeTranslate</h1></header>
|
|
||||||
|
|
||||||
<form action="/translate" method="GET" id="translation-form">
|
|
||||||
|
|
||||||
<!-- from and to language -->
|
|
||||||
<div class="wrap languages">
|
|
||||||
<div class="language">
|
|
||||||
|
|
||||||
<% const languageOptions = [
|
<% const languageOptions = [
|
||||||
{ code: 'autodetect', name: 'Autodetect' },
|
{ code: 'autodetect', name: 'Autodetect' },
|
||||||
@@ -307,7 +246,7 @@
|
|||||||
{ code: 'km', name: 'Khmer' },
|
{ code: 'km', name: 'Khmer' },
|
||||||
{ code: 'rw', name: 'Kinyarwanda' },
|
{ code: 'rw', name: 'Kinyarwanda' },
|
||||||
{ code: 'kok', name: 'Konkani' },
|
{ code: 'kok', name: 'Konkani' },
|
||||||
{ code: 'ko', name: 'Korean' },
|
{ code: 'ko', name: 'Korean (PROK)' },
|
||||||
{ code: 'kri', name: 'Krio' },
|
{ code: 'kri', name: 'Krio' },
|
||||||
{ code: 'ku', name: 'Kurdish (Kurmanji)' },
|
{ code: 'ku', name: 'Kurdish (Kurmanji)' },
|
||||||
{ code: 'sd', name: 'Sindhi' },
|
{ code: 'sd', name: 'Sindhi' },
|
||||||
@@ -340,92 +279,70 @@
|
|||||||
{ code: 'yo', name: 'Yoruba' },
|
{ code: 'yo', name: 'Yoruba' },
|
||||||
{ code: 'zu', name: 'Zulu' }
|
{ code: 'zu', name: 'Zulu' }
|
||||||
]; %>
|
]; %>
|
||||||
|
<form action="/translate" method="GET" id="translation-form">
|
||||||
|
<!-- from and to language -->
|
||||||
|
<div class="wrap languages">
|
||||||
|
<div class="language">
|
||||||
|
<select name="from_language" id="from_language">
|
||||||
|
<% languageOptions.forEach(language => { %>
|
||||||
|
<option value="<%= language.code %>" <%= language.code === (from_language || 'autodetect') ? 'selected' : '' %>>
|
||||||
|
<%= language.name %>
|
||||||
|
</option>
|
||||||
|
<% }); %>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select name="to_language" id="to_language">
|
||||||
<!-- Source language select -->
|
<% languageOptions.slice(1).forEach(language => { %>
|
||||||
<select name="from_language" id="from_language" style="margin-right: 1em;border-radius: 1em;padding: 7px;" aria-label="Source language">
|
<option value="<%= language.code %>" <%= language.code === to_language ? 'selected' : '' %>>
|
||||||
<% languageOptions.forEach(language => { %>
|
<%= language.name %>
|
||||||
<option value="<%= language.code %>" <%= language.code === (from_language || 'autodetect') ? 'selected' : '' %>><%= language.name %></option>
|
</option>
|
||||||
<% }); %>
|
<% }); %>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|
||||||
<!-- Target language select -->
|
|
||||||
<select name="to_language" id="to_language" style="margin-right: 1em;border-radius: 1em;padding: 7px;" aria-label="Target language">
|
|
||||||
<% languageOptions.slice(1).forEach(language => { %>
|
|
||||||
<option value="<%= language.code %>" <%= language.code === to_language ? 'selected' : '' %>><%= language.name %></option>
|
|
||||||
<% }); %>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- text boxes -->
|
<!-- text boxes -->
|
||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
<div class="item-wrapper">
|
<div class="item-wrapper">
|
||||||
<textarea autofocus class="item" id="input" name="input" dir="auto" placeholder="<%- text %>"><%- text %>
|
<textarea autofocus class="item" id="input" name="input" dir="auto" placeholder="<%- text %>">
|
||||||
</textarea>
|
<%- text %>
|
||||||
</div>
|
</textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="item-wrapper">
|
<div class="item-wrapper">
|
||||||
<textarea id="output" class="translation item" dir="auto" placeholder="Translation" readonly> <%- translation %> </textarea>
|
<textarea id="output" class="translation item" dir="auto" placeholder="Translation" readonly>
|
||||||
</div>
|
<%- translation %>
|
||||||
|
</textarea>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<div class="center">
|
<div class="center">
|
||||||
<!-- translate button -->
|
<button type="submit">Translate :3</button>
|
||||||
<button type="submit" style="border-radius: 1em;padding: 7px;">Translate :3</button>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.getElementById("input").addEventListener("keydown", function (event) {
|
||||||
|
if (event.keyCode === 13 && (event.metaKey || event.ctrlKey)) {
|
||||||
|
document.getElementById("translation-form").submit();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
<br>
|
var input = document.getElementById("input");
|
||||||
<br>
|
var output = document.getElementById("output");
|
||||||
<br>
|
input.setAttribute("style", "height:" + output.scrollHeight + "px;overflow-y:scroll;");
|
||||||
|
output.setAttribute("style", "height:" + output.scrollHeight + "px;overflow-y:scroll;");
|
||||||
|
input.addEventListener("input", function (e) {
|
||||||
|
this.style.height = 150 + "px";
|
||||||
|
this.style.height = this.scrollHeight + "px";
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script src="/static/custom-css.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script>
|
|
||||||
// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0
|
|
||||||
// this code submits the translation form when pressing Ctrl/Meta+Enter while focussed on the input text field
|
|
||||||
document.getElementById("input").addEventListener("keydown", function(event) {
|
|
||||||
if (event.keyCode === 13 && (event.metaKey || event.ctrlKey)) {
|
|
||||||
document.getElementById("translation-form").submit();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Auto resize textarea to fit words inside it without need to scroll -- Thanks to: https://stackoverflow.com/a/25621277
|
|
||||||
var input = document.getElementById("input");
|
|
||||||
var output = document.getElementById("output");
|
|
||||||
input.setAttribute("style", "height:" + output.scrollHeight + "px;overflow-y:scroll;");
|
|
||||||
output.setAttribute("style", "height:" + output.scrollHeight + "px;overflow-y:scroll;");
|
|
||||||
input.addEventListener("input", function(e) {
|
|
||||||
this.style.height = 150 + "px";
|
|
||||||
this.style.height = this.scrollHeight + "px";
|
|
||||||
});
|
|
||||||
|
|
||||||
// @license-end
|
|
||||||
</script>
|
|
||||||
<script src="/static/custom-css.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
24
html/video-error.ejs
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<%
|
||||||
|
function isValidYouTubeID(v) {
|
||||||
|
return /^[a-zA-Z0-9_-]{11}$/.test(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isLetterSpam(v) {
|
||||||
|
return /^(.)\1+$/.test(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
let reason;
|
||||||
|
|
||||||
|
if (!isValidYouTubeID(v) || isLetterSpam(v)) {
|
||||||
|
reason = "Video not found >~<";
|
||||||
|
} else {
|
||||||
|
reason = "This helps protect our community. Learn more (TRYING AGAIN....)";
|
||||||
|
}
|
||||||
|
%>
|
||||||
|
|
||||||
|
<%- include('./layouts/error-video.ejs', {
|
||||||
|
error: "loading failed :c",
|
||||||
|
description: `${reason}`
|
||||||
|
}) %>
|
||||||
|
|
||||||
|
|
||||||
6
infocards.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"Open Source":{
|
||||||
|
"infocard":"<i>Open Source</i> is a wrong terminology",
|
||||||
|
"more_info":"https://gnu.org/not-open-source"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,80 +8,38 @@
|
|||||||
"proxy": true,
|
"proxy": true,
|
||||||
"official": true,
|
"official": true,
|
||||||
"DEFAULT": true,
|
"DEFAULT": true,
|
||||||
"region": "🇺🇸",
|
"region": "🇩🇪",
|
||||||
"software": {
|
"software": {
|
||||||
"name": "poketube",
|
"name": "poke",
|
||||||
"version": "lastest",
|
"version": "latest",
|
||||||
"branch": "dev"
|
"branch": "dev"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"poketube.sudovanilla.com",
|
"pt.sudovanilla.org",
|
||||||
{
|
{
|
||||||
"uri": "https://poketube.sudovanilla.com",
|
"uri": "https://pt.sudovanilla.org",
|
||||||
"CLOUDFLARE": true,
|
|
||||||
"piwik": false,
|
|
||||||
"region": "🇺🇸",
|
|
||||||
"software": {
|
|
||||||
"name": "poketube",
|
|
||||||
"version": "lastest",
|
|
||||||
"branch": "dev"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"poke.vern.cc",
|
|
||||||
{
|
|
||||||
"uri": "https://poke.vern.cc",
|
|
||||||
"CLOUDFLARE": false,
|
"CLOUDFLARE": false,
|
||||||
"piwik": false,
|
"piwik": false,
|
||||||
"region": "🇺🇸",
|
"region": "🇺🇸",
|
||||||
"software": {
|
"software": {
|
||||||
"name": "poketube",
|
"name": "poke",
|
||||||
"version": "latest",
|
"version": "latest",
|
||||||
"branch": "dev"
|
"branch": "dev"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"poke.ashley0143.xyz",
|
"nyc1.poke.ggtyler.dev",
|
||||||
{
|
{
|
||||||
"uri": "https://poke.ashley0143.xyz",
|
"uri": "https://nyc1.poke.ggtyler.dev",
|
||||||
"CLOUDFLARE": true,
|
|
||||||
"piwik": false,
|
|
||||||
"region": "🇺🇸",
|
|
||||||
"software": {
|
|
||||||
"name": "poketube",
|
|
||||||
"version": "latest",
|
|
||||||
"branch": "dev"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"poke.alphexo.dev",
|
|
||||||
{
|
|
||||||
"uri": "https://poke.alphexo.dev",
|
|
||||||
"CLOUDFLARE": true,
|
|
||||||
"piwik": false,
|
|
||||||
"region": "🇬🇧",
|
|
||||||
"software": {
|
|
||||||
"name": "poketube",
|
|
||||||
"version": "latest",
|
|
||||||
"branch": "dev"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"poke.ggtyler.dev",
|
|
||||||
{
|
|
||||||
"uri": "https://poke.ggtyler.dev",
|
|
||||||
"CLOUDFLARE": false,
|
"CLOUDFLARE": false,
|
||||||
"piwik": false,
|
"piwik": false,
|
||||||
"proxy": false,
|
"proxy": false,
|
||||||
"region": "🇺🇸",
|
"region": "🇺🇸",
|
||||||
"software": {
|
"software": {
|
||||||
"name": "poketube",
|
"name": "poke",
|
||||||
"version": "latest",
|
"version": "latest",
|
||||||
"branch": "dev"
|
"branch": "dev"
|
||||||
}
|
}
|
||||||
@@ -96,36 +54,37 @@
|
|||||||
"proxy": false,
|
"proxy": false,
|
||||||
"region": "🇺🇸",
|
"region": "🇺🇸",
|
||||||
"software": {
|
"software": {
|
||||||
"name": "poketube",
|
"name": "poke",
|
||||||
"version": "latest",
|
"version": "latest",
|
||||||
"branch": "dev"
|
"branch": "dev"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"poke.am1.shiggy.cloud",
|
"pol1.poke.ggtyler.dev",
|
||||||
{
|
{
|
||||||
"uri": "https://poke.am1.shiggy.cloud",
|
"uri": "https://pol1.ggtyler.dev",
|
||||||
"CLOUDFLARE": false,
|
"CLOUDFLARE": false,
|
||||||
"piwik": false,
|
"piwik": false,
|
||||||
"proxy": false,
|
"proxy": false,
|
||||||
"region": "🇳🇱",
|
"region": "🇵🇱",
|
||||||
"software": {
|
"software": {
|
||||||
"name": "poketube",
|
"name": "poke",
|
||||||
"version": "latest",
|
"version": "latest",
|
||||||
"branch": "dev"
|
"branch": "dev"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
], [
|
],
|
||||||
"poke.am2.shiggy.cloud",
|
[
|
||||||
|
"poke.blahai.gay",
|
||||||
{
|
{
|
||||||
"uri": "https://poke.am2.shiggy.cloud",
|
"uri": "https://poke.blahai.gay/",
|
||||||
"CLOUDFLARE": false,
|
"CLOUDFLARE": true,
|
||||||
"piwik": false,
|
"piwik": false,
|
||||||
"proxy": false,
|
"proxy": false,
|
||||||
"region": "🇳🇱",
|
"region": "🇩🇪",
|
||||||
"software": {
|
"software": {
|
||||||
"name": "poketube",
|
"name": "poke",
|
||||||
"version": "latest",
|
"version": "latest",
|
||||||
"branch": "dev"
|
"branch": "dev"
|
||||||
}
|
}
|
||||||
|
|||||||
19
issue_template/enhancement.yml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
name: Enhancement
|
||||||
|
description: This is an enhancement/feature you would like to see in Poke
|
||||||
|
title: "[Bug]: "
|
||||||
|
labels: ["bug"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
> [!WARNING]
|
||||||
|
> The following will never be added:
|
||||||
|
> * iOS app (use the PWA)
|
||||||
|
> * non-free codecs
|
||||||
|
- type: textarea
|
||||||
|
id: describe
|
||||||
|
attributes:
|
||||||
|
label: Describe the enhancement
|
||||||
|
placeholder: What would you like to see being added?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
31
issue_template/general-issue.yml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
name: General issue
|
||||||
|
description: This is an issue with Poke not related to the video player
|
||||||
|
title: "[Bug]: "
|
||||||
|
labels: ["bug"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
> [!WARNING]
|
||||||
|
> Please check if the issue already exists before creating it! [u will explod if it already exists]
|
||||||
|
- type: textarea
|
||||||
|
id: describe
|
||||||
|
attributes:
|
||||||
|
label: Describe the issue
|
||||||
|
placeholder: In detail, what happened?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: browser
|
||||||
|
attributes:
|
||||||
|
label: What browser and OS are you using?
|
||||||
|
description: eg. Chrome on Windows 10, Firefox on Fedora GNU/Linux 40
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
render: true
|
||||||
|
attributes:
|
||||||
|
render: true
|
||||||
|
label: Error logs
|
||||||
|
placeholder: If any, are there error logs in your browser console?
|
||||||
55
issue_template/player-bug.yml
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
name: Player bug
|
||||||
|
description: This is an issue with the Poke video player
|
||||||
|
title: "[Bug]: "
|
||||||
|
labels: ["player-bug"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
> [!CAUTION]
|
||||||
|
> If your issue matches **all of** the 3 points below:
|
||||||
|
> * JavaScript is disabled;
|
||||||
|
> * AND playback is high-resolution;
|
||||||
|
> * AND audio isn't working;
|
||||||
|
>
|
||||||
|
> **DO NOT open an issue.** Hi-res audio will not work without JavaScript enabled.
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
> [!CAUTION]
|
||||||
|
> Your bug might be a Video.js bug, the player Poke uses.
|
||||||
|
>
|
||||||
|
> Look through [Video.js issues](https://github.com/videojs/video.js/issues?q=sort%3Aupdated-desc+is%3Aissue+is%3Aopen+label%3Abug) to see if the issue is actually with Poke, or if this is just a Video.js issue out of our control. DO NOT open an issue here if the latter applies.
|
||||||
|
- type: textarea
|
||||||
|
id: describe
|
||||||
|
attributes:
|
||||||
|
label: Describe the issue
|
||||||
|
placeholder: In detail, what happened?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: js
|
||||||
|
attributes:
|
||||||
|
label: JavaScript and resolution
|
||||||
|
description: Choose one of the 4 options below.
|
||||||
|
options:
|
||||||
|
- JS enabled, high res
|
||||||
|
- JS enabled, low res
|
||||||
|
- JS disabled, high res
|
||||||
|
- JS disabled, low res
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: browser
|
||||||
|
attributes:
|
||||||
|
label: What browser and OS are you using?
|
||||||
|
description: eg. Chrome on Windows 10, Firefox on Fedora 40
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
render: true
|
||||||
|
attributes:
|
||||||
|
render: true
|
||||||
|
label: Error logs
|
||||||
|
placeholder: If any, are there error logs in your browser console?
|
||||||
29
issue_template/search-filter.yml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
name: Search filter issue
|
||||||
|
description: This is for issues related to the self-harm and misinfo search filters
|
||||||
|
title: "[Bug]: "
|
||||||
|
labels: ["search-issue"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
> [!CAUTION]
|
||||||
|
> This form isn't to request the removal of a source. Do not use it for that
|
||||||
|
- type: input
|
||||||
|
id: search
|
||||||
|
attributes:
|
||||||
|
label: What was your exact search?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: flag
|
||||||
|
attributes:
|
||||||
|
label: What was it flagged as?
|
||||||
|
placeholder: Self-harm, or the name of the news source
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: describe
|
||||||
|
attributes:
|
||||||
|
label: Anything else worthy to know?
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
@@ -16,8 +16,4 @@ server {
|
|||||||
proxy_ssl_session_reuse off;
|
proxy_ssl_session_reuse off;
|
||||||
proxy_set_header Host $http_host;
|
proxy_set_header Host $http_host;
|
||||||
}
|
}
|
||||||
|
|
||||||
location /manifest.json {
|
|
||||||
root /path/to/poketube/pwa/;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -73,6 +73,7 @@ const proxy = async (req, res) => {
|
|||||||
return res.status(400).send("Malformed URL");
|
return res.status(400).send("Malformed URL");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sanity check, to avoid being used as an open proxy
|
||||||
if (!URL_WHITELIST.includes(url.host)) {
|
if (!URL_WHITELIST.includes(url.host)) {
|
||||||
console.log(`==> Refusing to proxy host ${url.host}`);
|
console.log(`==> Refusing to proxy host ${url.host}`);
|
||||||
res.status(401).send(`Hostname '${url.host}' is not permitted`);
|
res.status(401).send(`Hostname '${url.host}' is not permitted`);
|
||||||
|
|||||||
@@ -28,17 +28,17 @@
|
|||||||
"node-libcurl": "^3.0.0",
|
"node-libcurl": "^3.0.0",
|
||||||
"uglify-js": "^3.17.4",
|
"uglify-js": "^3.17.4",
|
||||||
"ping": "^0.4.4",
|
"ping": "^0.4.4",
|
||||||
"undici": "^5.25.2",
|
"undici": "^6.14.0",
|
||||||
"express-rate-limit": "^7.0.2",
|
"express-rate-limit": "^7.0.2",
|
||||||
"toobusy-js": "^0.5.1",
|
"toobusy-js": "^0.5.1",
|
||||||
"quick.db": "^7.1.3",
|
"quick.db": "^7.1.3",
|
||||||
"activitypub-express": "^4.4.1",
|
"activitypub-express": "^4.4.1",
|
||||||
"duck-duck-scrape": "^2.2.5",
|
"duck-duck-scrape": "^2.2.5",
|
||||||
"google-it": "^1.6.4",
|
"google-it": "^1.6.4",
|
||||||
"youtubei.js": "^9.2.0"
|
"youtubei.js": "^9.3.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "16.x"
|
"node": ">=18"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"url": "https://codeberg.org/Ashley/poketube"
|
"url": "https://codeberg.org/Ashley/poketube"
|
||||||
|
|||||||
196
server.js
@@ -32,9 +32,19 @@
|
|||||||
const media_proxy = require("./src/libpoketube/libpoketube-video.js");
|
const media_proxy = require("./src/libpoketube/libpoketube-video.js");
|
||||||
const { sinit } = require("./src/libpoketube/init/superinit.js");
|
const { sinit } = require("./src/libpoketube/init/superinit.js");
|
||||||
const innertube = require("./src/libpoketube/libpoketube-youtubei-objects.json");
|
const innertube = require("./src/libpoketube/libpoketube-youtubei-objects.json");
|
||||||
|
const fs = require("fs");
|
||||||
const config = require("./config.json");
|
const config = require("./config.json");
|
||||||
const u = await media_proxy();
|
const u = await media_proxy();
|
||||||
|
|
||||||
|
fs.readFile("ascii_txt.txt", "utf8", (err, data) => {
|
||||||
|
if (err) {
|
||||||
|
console.error("Error reading the file:", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log the ASCII art to the console
|
||||||
|
console.log(data);
|
||||||
|
});
|
||||||
initlog("Loading...");
|
initlog("Loading...");
|
||||||
initlog(
|
initlog(
|
||||||
"[Welcome] Welcome To Poke - The ultimate privacy app - :3 " +
|
"[Welcome] Welcome To Poke - The ultimate privacy app - :3 " +
|
||||||
@@ -65,11 +75,10 @@
|
|||||||
const sha384 = modules.hash;
|
const sha384 = modules.hash;
|
||||||
const rateLimit = require("express-rate-limit");
|
const rateLimit = require("express-rate-limit");
|
||||||
|
|
||||||
|
const limiter = rateLimit({
|
||||||
const limiter = rateLimit({
|
windowMs: 30 * 1000, // 30 second window
|
||||||
windowMs:45 * 1000, // 45 Seconds
|
max: 200, // limit each IP to 200 requests per 30 seconds
|
||||||
max: 886, // limit each IP to 866 requests per windowMs
|
});
|
||||||
});
|
|
||||||
|
|
||||||
var app = modules.express();
|
var app = modules.express();
|
||||||
app.use(limiter);
|
app.use(limiter);
|
||||||
@@ -79,7 +88,7 @@
|
|||||||
app.use(modules.useragent.express());
|
app.use(modules.useragent.express());
|
||||||
app.use(modules.express.json()); // for parsing application/json
|
app.use(modules.express.json()); // for parsing application/json
|
||||||
app.enable("trust proxy");
|
app.enable("trust proxy");
|
||||||
var toobusy = require('toobusy-js')
|
var toobusy = require("toobusy-js");
|
||||||
|
|
||||||
const renderTemplate = async (res, req, template, data = {}) => {
|
const renderTemplate = async (res, req, template, data = {}) => {
|
||||||
res.render(
|
res.render(
|
||||||
@@ -88,37 +97,131 @@
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set check interval to a faster value. This will catch more latency spikes
|
// Set check interval to a faster value. This will catch more latency spikes
|
||||||
// but may cause the check to be too sensitive.
|
// but may cause the check to be too sensitive.
|
||||||
toobusy.interval(110);
|
toobusy.interval(110);
|
||||||
|
|
||||||
toobusy.maxLag(3500);
|
toobusy.maxLag(3500);
|
||||||
|
|
||||||
app.use(function(req, res, next) {
|
app.use(function (req, res, next) {
|
||||||
if (toobusy()) {
|
if (toobusy()) {
|
||||||
res.send(503, "I'm busy right now, sorry.");
|
res.send(503, "I'm busy right now, sorry.");
|
||||||
} else {
|
} else {
|
||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
toobusy.onLag(function(currentLag) {
|
|
||||||
process.exit(1);
|
|
||||||
console.log("Event loop lag detected! Latency: " + currentLag + "ms");
|
|
||||||
});
|
|
||||||
|
|
||||||
|
toobusy.onLag(function (currentLag) {
|
||||||
|
process.exit(1);
|
||||||
|
console.log("Event loop lag detected! Latency: " + currentLag + "ms");
|
||||||
|
});
|
||||||
|
|
||||||
const random_words = [
|
const random_words = [
|
||||||
"banana pie",
|
"Woke!",
|
||||||
"how to buy an atom bomb",
|
"Gay gay homosexaul gay!",
|
||||||
"is love just an illusion",
|
"free Palestine!",
|
||||||
"things to do if ur face becomes benjamin frenklin",
|
"free software!",
|
||||||
"how do defeat an pasta",
|
"im... stuff!",
|
||||||
"can you go to space?",
|
"frick capitalism!",
|
||||||
"how to become a god?",
|
"still calling it twitter btw!",
|
||||||
"is a panda a panda if pandas???",
|
"boop!",
|
||||||
"Minecraft movie trailer",
|
"no way!",
|
||||||
"monke",
|
"traaaa rightssss!",
|
||||||
|
"XD!",
|
||||||
|
"nya!",
|
||||||
|
"say gex!",
|
||||||
|
"ur valid :3",
|
||||||
|
"gay space communism!",
|
||||||
|
"doesnt have AI!",
|
||||||
|
"no web3!",
|
||||||
|
"keemstar is a bald ___!",
|
||||||
|
"No One calls it 'X'! ",
|
||||||
|
"Eat the rich!",
|
||||||
|
"Does Not include Nazis!",
|
||||||
|
"also try piped!",
|
||||||
|
"not alt-right!",
|
||||||
|
"coke zero > coke classic!",
|
||||||
|
"poke & chill!",
|
||||||
|
"can play HD!",
|
||||||
|
"also try invidious!",
|
||||||
|
"also try vencord!",
|
||||||
|
"rms <3!",
|
||||||
|
"du hast",
|
||||||
|
"can u belive no one bought this?",
|
||||||
|
"reee",
|
||||||
|
"1.000.000€!",
|
||||||
|
"pika!",
|
||||||
|
"fsf.org",
|
||||||
|
"ssfffssfssfffaassssfsdf!",
|
||||||
|
"they not like us!",
|
||||||
|
"to pimp a butterfly!",
|
||||||
|
"king kunta!",
|
||||||
|
"HUMBLE.",
|
||||||
|
"can you save my hds?",
|
||||||
|
"sahlo folina!",
|
||||||
|
"we come for you!",
|
||||||
|
"no chances!",
|
||||||
|
"dema dont control us!",
|
||||||
|
"i see your problem is, your proctologist",
|
||||||
|
"got both hands on your shoulder",
|
||||||
|
"while ur bottomless!",
|
||||||
|
"you should bounce bounce bounce man!",
|
||||||
|
"its lavish!",
|
||||||
|
"im vibin, vibin!",
|
||||||
|
"i would swim the paladin strait",
|
||||||
|
"hello clancy!",
|
||||||
|
"NO NOT ME,ITS FOR A FRIEND",
|
||||||
|
"im fairly local!",
|
||||||
|
"i dont wanna go like this!",
|
||||||
|
"east is up!",
|
||||||
|
"not done, josh dun!",
|
||||||
|
"your the judge, oh no!",
|
||||||
|
"I dont wanna backslide",
|
||||||
|
"welcome back to trench!",
|
||||||
|
"sai is propaganda!",
|
||||||
|
" •|i|• Ø i+! ].[",
|
||||||
|
"stay alive! |-/",
|
||||||
|
"the few, the proud, the Emotional!",
|
||||||
|
"ill morph into someone else",
|
||||||
|
"still alive",
|
||||||
|
"follow the torches",
|
||||||
|
"i created this world!",
|
||||||
|
"to feel some control!",
|
||||||
|
"destory it if i want!",
|
||||||
|
"o7 keons",
|
||||||
|
"at least let me clean my room",
|
||||||
|
"100+ stars on gh!",
|
||||||
|
"let the vibe slide over me!",
|
||||||
|
"sip a capri sun like its don peregon",
|
||||||
|
"now even gayer!",
|
||||||
|
"its joever..",
|
||||||
|
"lesbiam,,,",
|
||||||
|
"poke!!!",
|
||||||
|
"discord.poketube.fun!",
|
||||||
|
"women are pretty!",
|
||||||
|
"men are handsome!",
|
||||||
|
"enbys are cute!",
|
||||||
|
"you are cute :3",
|
||||||
|
"read if cute!",
|
||||||
|
"this shit awesome!",
|
||||||
|
"ur pawsome!",
|
||||||
|
"meows at u",
|
||||||
|
"hai i am gay",
|
||||||
|
"yay, GEX!",
|
||||||
|
"say gex..,,",
|
||||||
|
"wha if we um erm",
|
||||||
|
"turkey is literally 1984!",
|
||||||
|
"turkey is literally 1984!",
|
||||||
|
"turkey is literally 1984!",
|
||||||
|
"turkey is literally 1984!",
|
||||||
|
"turkey is literally 1984!",
|
||||||
|
"turkey is literally 1984!",
|
||||||
|
"awesome screen!",
|
||||||
|
"awesome camera!",
|
||||||
|
"long lasting battery life",
|
||||||
|
"stallmansupport.org!!!",
|
||||||
|
"does include nya~!!!",
|
||||||
|
"actually stable! :3",
|
||||||
];
|
];
|
||||||
|
|
||||||
const initPokeTube = function () {
|
const initPokeTube = function () {
|
||||||
@@ -140,8 +243,8 @@ toobusy.maxLag(3500);
|
|||||||
res.header("secure-poketube-instance", "1");
|
res.header("secure-poketube-instance", "1");
|
||||||
|
|
||||||
// opt out of googles "FLOC" bullcrap :p See https://spreadprivacy.com/block-floc-with-duckduckgo/
|
// opt out of googles "FLOC" bullcrap :p See https://spreadprivacy.com/block-floc-with-duckduckgo/
|
||||||
res.header("Permissions-Policy", "interest-cohort=()")
|
res.header("Permissions-Policy", "interest-cohort=()");
|
||||||
res.header("software-name", "poke")
|
res.header("software-name", "poke");
|
||||||
next();
|
next();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -162,10 +265,25 @@ toobusy.maxLag(3500);
|
|||||||
});
|
});
|
||||||
|
|
||||||
app.use(function (req, res, next) {
|
app.use(function (req, res, next) {
|
||||||
res.header("X-PokeTube-Youtube-Client-Name", innertube.innertube.CONTEXT_CLIENT.INNERTUBE_CONTEXT_CLIENT_NAME);
|
const random = random_words[Math.floor(Math.random() * random_words.length)];
|
||||||
res.header("Hey-there", "Do u wanna help poke? contributons are welcome :3 https://codeberg.org/Ashley/poke")
|
|
||||||
res.header("X-PokeTube-Youtube-Client-Version", innertube.innertube.CLIENT.clientVersion);
|
res.header(
|
||||||
res.header("X-PokeTube-Client-name", innertube.innertube.CLIENT.projectClientName);
|
"X-PokeTube-Youtube-Client-Name",
|
||||||
|
innertube.innertube.CONTEXT_CLIENT.INNERTUBE_CONTEXT_CLIENT_NAME
|
||||||
|
);
|
||||||
|
res.header(
|
||||||
|
"Hey-there",
|
||||||
|
"Do u wanna help poke? contributions are welcome :3 https://codeberg.org/Ashley/poke"
|
||||||
|
);
|
||||||
|
|
||||||
|
res.header(
|
||||||
|
"X-PokeTube-Youtube-Client-Version",
|
||||||
|
innertube.innertube.CLIENT.clientVersion
|
||||||
|
);
|
||||||
|
res.header(
|
||||||
|
"X-PokeTube-Client-name",
|
||||||
|
innertube.innertube.CLIENT.projectClientName
|
||||||
|
);
|
||||||
res.header("X-PokeTube-Speeder", "3 seconds no cache, 280ms w/cache");
|
res.header("X-PokeTube-Speeder", "3 seconds no cache, 280ms w/cache");
|
||||||
res.header("X-HOSTNAME", req.hostname);
|
res.header("X-HOSTNAME", req.hostname);
|
||||||
if (req.url.match(/^\/(css|js|img|font)\/.+/)) {
|
if (req.url.match(/^\/(css|js|img|font)\/.+/)) {
|
||||||
|
|||||||
@@ -38,7 +38,21 @@ const splash = [
|
|||||||
"XD!",
|
"XD!",
|
||||||
"nya!",
|
"nya!",
|
||||||
"say gex!",
|
"say gex!",
|
||||||
|
"ur valid :3",
|
||||||
|
"gay space communism!",
|
||||||
|
"doesnt have AI!",
|
||||||
|
"no web3!",
|
||||||
|
"keemstar is a bald ___!",
|
||||||
|
"No One calls it 'X'! ",
|
||||||
|
"Eat the rich!",
|
||||||
|
"Does Not include Nazis!",
|
||||||
|
"also try piped!",
|
||||||
|
"not alt-right!",
|
||||||
|
"coke zero > coke classic!",
|
||||||
|
"poke & chill!",
|
||||||
|
"can play HD!",
|
||||||
"also try invidious!",
|
"also try invidious!",
|
||||||
|
"also try vencord!",
|
||||||
"rms <3!",
|
"rms <3!",
|
||||||
"du hast",
|
"du hast",
|
||||||
"can u belive no one bought this?",
|
"can u belive no one bought this?",
|
||||||
@@ -47,15 +61,76 @@ const splash = [
|
|||||||
"pika!",
|
"pika!",
|
||||||
"fsf.org",
|
"fsf.org",
|
||||||
"ssfffssfssfffaassssfsdf!",
|
"ssfffssfssfffaassssfsdf!",
|
||||||
|
"𝓯𝓻𝓮𝓪𝓴𝔂poke",
|
||||||
|
"they not like us!",
|
||||||
|
"to pimp a butterfly!",
|
||||||
|
"king kunta!",
|
||||||
|
"HUMBLE.",
|
||||||
|
"can you save my hds?",
|
||||||
|
"sahlo folina!",
|
||||||
|
"we come for you!",
|
||||||
|
"no chances!",
|
||||||
|
"dema dont control us!",
|
||||||
|
"i see your problem is, your proctologist",
|
||||||
|
"got both hands on your shoulder",
|
||||||
|
"while ur bottomless!",
|
||||||
|
"you should bounce bounce bounce man!",
|
||||||
|
"its lavish!",
|
||||||
|
"im vibin, vibin!",
|
||||||
|
"i would swim the paladin strait",
|
||||||
|
"hello clancy!",
|
||||||
|
"NO NOT ME,ITS FOR A FRIEND",
|
||||||
|
"im fairly local!",
|
||||||
|
"i dont wanna go like this!",
|
||||||
|
"east is up!",
|
||||||
|
"not done, josh dun!",
|
||||||
|
"your the judge, oh no!",
|
||||||
|
"I dont wanna backslide",
|
||||||
|
"welcome back to trench!",
|
||||||
|
"sai is propaganda!",
|
||||||
|
" •|i|• Ø i+! ].[",
|
||||||
|
"stay alive! |-/",
|
||||||
|
"the few, the proud, the Emotional!",
|
||||||
|
"ill morph into someone else",
|
||||||
|
"still alive",
|
||||||
|
"follow the torches",
|
||||||
|
"i created this world!",
|
||||||
|
"to feel some control!",
|
||||||
|
"destory it if i want!",
|
||||||
|
"o7 keons",
|
||||||
|
"at least let me clean my room",
|
||||||
"100+ stars on gh!",
|
"100+ stars on gh!",
|
||||||
|
"let the vibe slide over me!",
|
||||||
|
"sip a capri sun like its don peregon",
|
||||||
"now even gayer!",
|
"now even gayer!",
|
||||||
"poketube!!!",
|
"its joever..",
|
||||||
"rvlt.gg/poke!",
|
"lesbiam,,,",
|
||||||
|
"poke!!!",
|
||||||
|
"discord.poketube.fun!",
|
||||||
"women are pretty!",
|
"women are pretty!",
|
||||||
"men are handsome!",
|
"men are handsome!",
|
||||||
"enbys are cute!",
|
"enbys are cute!",
|
||||||
"you are cute :3",
|
"you are cute :3",
|
||||||
"stallmansupport.org!!!"
|
"read if cute!",
|
||||||
|
"this shit awesome!",
|
||||||
|
"ur pawsome!",
|
||||||
|
"meows at u",
|
||||||
|
"hai i am gay",
|
||||||
|
"yay, GEX!",
|
||||||
|
"say gex..,,",
|
||||||
|
"wha if we um erm",
|
||||||
|
"turkey is literally 1984!",
|
||||||
|
"turkey is literally 1984!",
|
||||||
|
"turkey is literally 1984!",
|
||||||
|
"turkey is literally 1984!",
|
||||||
|
"turkey is literally 1984!",
|
||||||
|
"turkey is literally 1984!",
|
||||||
|
"awesome screen!",
|
||||||
|
"awesome camera!",
|
||||||
|
"long lasting battery life",
|
||||||
|
"stallmansupport.org!!!",
|
||||||
|
"does include nya~!!!",
|
||||||
|
"actually stable! :3",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@@ -84,7 +159,7 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
const t = getJson(await invtrend.text());
|
const t = getJson(await invtrend.text());
|
||||||
|
|
||||||
const invpopular = await fetch(
|
const invpopular = await fetch(
|
||||||
`https://invid-api.poketube.fun/api/v1/popular`
|
`https://invid-api.poketube.fun/bHj665PpYhUdPWuKPfZuQGoX/api/v1/popular`
|
||||||
);
|
);
|
||||||
const p = getJson(await invpopular.text());
|
const p = getJson(await invpopular.text());
|
||||||
|
|
||||||
@@ -116,6 +191,17 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
const random = splash[Math.floor(Math.random() * splash.length)];
|
const random = splash[Math.floor(Math.random() * splash.length)];
|
||||||
const browser = req.useragent.browser;
|
const browser = req.useragent.browser;
|
||||||
const isOldWindows = (uaos === "Windows 7" || uaos === "Windows 8") && browser === "Firefox";
|
const isOldWindows = (uaos === "Windows 7" || uaos === "Windows 8") && browser === "Firefox";
|
||||||
|
var proxyurl = config.p_url;
|
||||||
|
|
||||||
|
const secure = [
|
||||||
|
"poketube.fun",
|
||||||
|
"localhost" //
|
||||||
|
].includes(req.hostname);
|
||||||
|
const verify = [
|
||||||
|
"poketube.fun",
|
||||||
|
"poke.ashley0143.xyz",
|
||||||
|
"localhost"
|
||||||
|
].includes(req.hostname);
|
||||||
|
|
||||||
const rendermainpage = () => {
|
const rendermainpage = () => {
|
||||||
if (req.useragent.isMobile) {
|
if (req.useragent.isMobile) {
|
||||||
@@ -123,7 +209,13 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return renderTemplate(res, req, "landing.ejs", {
|
return renderTemplate(res, req, "landing.ejs", {
|
||||||
|
secure,
|
||||||
|
embedtype:req.query.embedtype,
|
||||||
|
banner:config.banner,
|
||||||
|
DisablePokeChan:req.query.DisablePokeChan,
|
||||||
|
verify,
|
||||||
isOldWindows,
|
isOldWindows,
|
||||||
|
proxyurl,
|
||||||
random
|
random
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -133,7 +225,8 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
if (isvld && req.params.v.length >= 10) {
|
if (isvld && req.params.v.length >= 10) {
|
||||||
return res.redirect(`/watch?v=${req.params.v}`);
|
return res.redirect(`/watch?v=${req.params.v}`);
|
||||||
} else {
|
} else {
|
||||||
return renderTemplate(res, req, "404.ejs", {
|
res.status(404)
|
||||||
|
return renderTemplate(res, req, "404.ejs", {
|
||||||
isOldWindows,
|
isOldWindows,
|
||||||
random
|
random
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -70,17 +70,17 @@ app.get("/api/set-channel-subs", async function (req, res) {
|
|||||||
channelName: channelToSubName,
|
channelName: channelToSubName,
|
||||||
avatar: avatar, // Store the avatar URL along with the subscription
|
avatar: avatar, // Store the avatar URL along with the subscription
|
||||||
});
|
});
|
||||||
res.json("user subbed");
|
res.redirect("/account-create")
|
||||||
} else if (!db.get(`user.${userid}.subs.${channelToSub}`)) {
|
} else if (!db.get(`user.${userid}.subs.${channelToSub}`)) {
|
||||||
// If the user has 'subs' but not this particular subscription, add it
|
// If the user has 'subs' but not this particular subscription, add it
|
||||||
db.set(`user.${userid}.subs.${channelToSub}`, {
|
db.set(`user.${userid}.subs.${channelToSub}`, {
|
||||||
channelName: channelToSubName,
|
channelName: channelToSubName,
|
||||||
avatar: avatar, // Store the avatar URL along with the subscription
|
avatar: avatar, // Store the avatar URL along with the subscription
|
||||||
});
|
});
|
||||||
res.json("user subbed");
|
res.redirect("/account-create")
|
||||||
} else {
|
} else {
|
||||||
// If the user is already subscribed to this channel, send a message indicating so
|
// If the user is already subscribed to this channel, send a message indicating so
|
||||||
res.json("user already subscribed");
|
res.json("ur already subscribed");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -104,10 +104,17 @@ app.get("/account-create", async function (req, res) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get("/my-acc", async function (req, res) {
|
app.get("/my-acc", async function (req, res) {
|
||||||
var userid = req.query.ID
|
var userid = req.query.ID;
|
||||||
var userSubs = db.get(`user.${userid}.subs`)
|
|
||||||
renderTemplate(res, req, "account-me.ejs", { userid, userSubs });
|
|
||||||
|
|
||||||
|
// Check if userid is more than 7 characters
|
||||||
|
if (userid.length > 7) {
|
||||||
|
return res.status(400).json({ error: "IDs can be 7 characters max silly :3" });
|
||||||
|
}
|
||||||
|
|
||||||
|
var userSubs = db.get(`user.${userid}.subs`);
|
||||||
|
|
||||||
|
renderTemplate(res, req, "account-me.ejs", { userid, userSubs });
|
||||||
});
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -30,31 +30,21 @@ const pkg = require("../../../package.json");
|
|||||||
const os = require('os');
|
const os = require('os');
|
||||||
const cnf = require("../../../config.json");
|
const cnf = require("../../../config.json");
|
||||||
const innertube = require("../libpoketube-youtubei-objects.json");
|
const innertube = require("../libpoketube-youtubei-objects.json");
|
||||||
|
const { execSync } = require('child_process');
|
||||||
|
|
||||||
const verfull = "v24.2801-JeSsIcA-MAJOR-stable-dev-nonLTS-git-MTcwNjQzMTc0OQ==";
|
const verfull = "v24.1906-sho-MAJOR_UPDATE-stable-dev-nonLTS-git-MTcxODc5NDY3NQ==";
|
||||||
const versmol = "v24.2801-JeSsIcA"
|
const versmol = "v24.1906-sho"
|
||||||
const branch = "dev/master";
|
const branch = "dev/master";
|
||||||
const codename = "jessica";
|
const codename = "sho";
|
||||||
const versionnumber = "273";
|
const versionnumber = "293";
|
||||||
const relaseunixdate = "MTcwNjQzMTc0OQ=="
|
const relaseunixdate = "MTcxODc5NDY3NQ=="
|
||||||
const updatequote = "Empty your cup so that it may be filled; become devoid to gain totality. - Bruce Lee"
|
const updatequote = "pls fund vennie plush -Bims"
|
||||||
|
|
||||||
|
|
||||||
module.exports = function (app, config, renderTemplate) {
|
module.exports = function (app, config, renderTemplate) {
|
||||||
app.get("/embed/:v", async function (req, res) {
|
|
||||||
res.send("Disabled until Q1 2024");
|
|
||||||
});
|
|
||||||
|
|
||||||
app.get("/admin", async function (req, res) {
|
|
||||||
if(req.hostname === "poketube.fun") {
|
|
||||||
res.redirect("https://console.sudovanilla.com/")
|
|
||||||
} else {
|
|
||||||
res.redirect("/sex")
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
app.get("/vi/:v/:t", async function (req, res) {
|
app.get("/vi/:v/:t", async function (req, res) {
|
||||||
var url = `https://vid.puffyan.us/vi/${req.params.v}/${req.params.t}`
|
var url = `https://i.ytimg.com/vi/${req.params.v}/${req.params.t}`
|
||||||
|
|
||||||
let f = await modules.fetch(url + `?cachefixer=${btoa(Date.now())}`, {
|
let f = await modules.fetch(url + `?cachefixer=${btoa(Date.now())}`, {
|
||||||
method: req.method,
|
method: req.method,
|
||||||
@@ -108,15 +98,10 @@ app.get("/avatars/:v", async function (req, res) {
|
|||||||
app.get("/api/video/download", async function (req, res) {
|
app.get("/api/video/download", async function (req, res) {
|
||||||
var v = req.query.v;
|
var v = req.query.v;
|
||||||
|
|
||||||
var format = "mp4";
|
var q = "18";
|
||||||
var q = "22";
|
|
||||||
if (req.query.q) q = req.query.q;
|
if (req.query.q) q = req.query.q;
|
||||||
|
|
||||||
if (req.query.f) {
|
const url = `https://eu-proxy.poketube.fun/latest_version?id=${v}&itag=${q}&local=true`;
|
||||||
var format = "mp3";
|
|
||||||
}
|
|
||||||
|
|
||||||
const url = `https://tube.kuylar.dev/proxy/media/${v}/${q}`;
|
|
||||||
|
|
||||||
res.redirect(url);
|
res.redirect(url);
|
||||||
});
|
});
|
||||||
@@ -128,7 +113,7 @@ app.get("/avatars/:v", async function (req, res) {
|
|||||||
const l = req.query.h;
|
const l = req.query.h;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let url = `https://invid-api.poketube.fun/api/v1/captions/${id}?label=${l}`;
|
let url = `https://eu-proxy.poketube.fun/api/v1/captions/${id}?label=${l}`;
|
||||||
|
|
||||||
let f = await fetch(url);
|
let f = await fetch(url);
|
||||||
const body = await f.text();
|
const body = await f.text();
|
||||||
@@ -137,11 +122,112 @@ app.get("/avatars/:v", async function (req, res) {
|
|||||||
} catch {}
|
} catch {}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
app.get("/api/getEngagementData", async (req, res) => {
|
||||||
|
const { fetch } = await import("undici");
|
||||||
|
|
||||||
|
const id = req.query.v;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (id) {
|
||||||
|
const apiUrl = `https://ryd-proxy.kavin.rocks/votes/${id}&hash=d0550b6e28c8f93533a569c314d5b4e2`;
|
||||||
|
|
||||||
|
const response = await fetch(apiUrl);
|
||||||
|
|
||||||
|
if (response.status === 400) {
|
||||||
|
const error = await response.json();
|
||||||
|
return res.status(400).send(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
const engagement = await response.json();
|
||||||
|
|
||||||
|
const likes = parseInt(engagement.likes) || 0;
|
||||||
|
const dislikes = parseInt(engagement.dislikes) || 0;
|
||||||
|
const total = likes + dislikes;
|
||||||
|
|
||||||
|
const likePercentage = total > 0 ? ((likes / total) * 100).toFixed(2) : 0;
|
||||||
|
const dislikePercentage = total > 0 ? ((dislikes / total) * 100).toFixed(2) : 0;
|
||||||
|
|
||||||
|
const getLikePercentageColor = (percentage) => {
|
||||||
|
if (percentage >= 80) {
|
||||||
|
return "green";
|
||||||
|
} else if (percentage >= 50) {
|
||||||
|
return "orange";
|
||||||
|
} else {
|
||||||
|
return "red";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const getDislikePercentageColor = (percentage) => {
|
||||||
|
if (percentage >= 50) {
|
||||||
|
return "red";
|
||||||
|
} else if (percentage >= 20) {
|
||||||
|
return "orange";
|
||||||
|
} else {
|
||||||
|
return "green";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const likeColor = getLikePercentageColor(likePercentage);
|
||||||
|
const dislikeColor = getDislikePercentageColor(dislikePercentage);
|
||||||
|
|
||||||
|
const userScore = (
|
||||||
|
parseFloat(likePercentage) -
|
||||||
|
parseFloat(dislikePercentage) / 2
|
||||||
|
).toFixed(2);
|
||||||
|
|
||||||
|
const getUserScoreLabel = (score) => {
|
||||||
|
if (score >= 98) {
|
||||||
|
return "Masterpiece Video";
|
||||||
|
} else if (score >= 80) {
|
||||||
|
return "Overwhelmingly Positive";
|
||||||
|
} else if (score >= 60) {
|
||||||
|
return "Positive";
|
||||||
|
} else if (score >= 40) {
|
||||||
|
return "Mixed";
|
||||||
|
} else if (score >= 20) {
|
||||||
|
return "Negative";
|
||||||
|
} else {
|
||||||
|
return "Overwhelmingly Negative";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const userScoreLabel = getUserScoreLabel(userScore);
|
||||||
|
const userScoreColor =
|
||||||
|
userScore >= 80 ? "green" : userScore >= 50 ? "orange" : "red";
|
||||||
|
|
||||||
|
const respon = {
|
||||||
|
like_count: likes,
|
||||||
|
dislike_count: dislikes,
|
||||||
|
rating: engagement.rating,
|
||||||
|
userScore: {
|
||||||
|
label: userScoreLabel,
|
||||||
|
score: userScore,
|
||||||
|
color: userScoreColor,
|
||||||
|
},
|
||||||
|
engagement: {
|
||||||
|
likeColor: likeColor,
|
||||||
|
dislikeColor: dislikeColor,
|
||||||
|
percentage: {
|
||||||
|
likePercentage: `${likePercentage}%`,
|
||||||
|
dislikePercentage: `${dislikePercentage}%`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ReturnYouTubeDislikesApiRawResponse: engagement,
|
||||||
|
};
|
||||||
|
|
||||||
|
res.send(respon);
|
||||||
|
} else {
|
||||||
|
res.status(400).json("pls gib ID :3");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
res.status(500).json("whoops (error 500) >~<");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
app.use("/sb/i/:v/:imagePath/:img", async function (req, res) {
|
app.use("/sb/i/:v/:imagePath/:img", async function (req, res) {
|
||||||
const { v, imagePath, img } = req.params;
|
const { v, imagePath, img } = req.params;
|
||||||
const { sqp, xywh } = req.query;
|
const { sqp, xywh } = req.query;
|
||||||
const sighMatch = req.url.match(/&sigh=([^&#]+)/);
|
const sighMatch = req.url.match(/&sigh=([^&#]+)/);
|
||||||
const sigh = sighMatch ? sighMatch[1] : undefined;
|
const sigh = sighMatch ? sighMatch[1] : undefined;
|
||||||
|
|
||||||
|
|
||||||
@@ -192,6 +278,20 @@ app.use("/sb/i/:v/:imagePath/:img", async function (req, res) {
|
|||||||
f.body.pipe(res);
|
f.body.pipe(res);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
app.get("/api/manifest/dash/id/:id", async (req, res) => {
|
||||||
|
const id = req.params.id;
|
||||||
|
|
||||||
|
let url = `https://invid-api.poketube.fun/bHj665PpYhUdPWuKPfZuQGoX/api/manifest/dash/id/${id}`;
|
||||||
|
|
||||||
|
let f = await modules.fetch(url, {
|
||||||
|
method: req.method,
|
||||||
|
});
|
||||||
|
|
||||||
|
f.body.pipe(res);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
app.get("/api/redirect", async (req, res) => {
|
app.get("/api/redirect", async (req, res) => {
|
||||||
const red_url = atob(req.query.u);
|
const red_url = atob(req.query.u);
|
||||||
|
|
||||||
@@ -211,8 +311,10 @@ app.use("/sb/i/:v/:imagePath/:img", async function (req, res) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
app.get("/api/version.json", async (req, res) => {
|
app.get("/api/version.json", async (req, res) => {
|
||||||
|
let latestCommitHash;
|
||||||
|
|
||||||
const invidious = await modules
|
const invidious = await modules
|
||||||
.fetch("https://invid-api.poketube.fun/api/v1/stats")
|
.fetch("https://invid-api.poketube.fun/bHj665PpYhUdPWuKPfZuQGoX/api/v1/stats")
|
||||||
.then((res) => res.text())
|
.then((res) => res.text())
|
||||||
.then((txt) => getJson(txt));
|
.then((txt) => getJson(txt));
|
||||||
|
|
||||||
@@ -220,10 +322,20 @@ app.use("/sb/i/:v/:imagePath/:img", async function (req, res) {
|
|||||||
const totalMemory = os.totalmem() / (1024 * 1024 * 1024);
|
const totalMemory = os.totalmem() / (1024 * 1024 * 1024);
|
||||||
const roundedMemory = totalMemory.toFixed(2);
|
const roundedMemory = totalMemory.toFixed(2);
|
||||||
|
|
||||||
|
execSync('git rev-list HEAD -n 1 --abbrev-commit', (error, stdout, stderr) => {
|
||||||
|
if (error || stderr) {
|
||||||
|
console.error(`Error executing command: ${error || stderr}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
latestCommitHash = stdout.trim();
|
||||||
|
});
|
||||||
|
|
||||||
const response = {
|
const response = {
|
||||||
pt_version: {
|
pt_version: {
|
||||||
version:versmol,
|
version:versmol,
|
||||||
version_full:verfull
|
version_full:verfull,
|
||||||
|
commit: latestCommitHash
|
||||||
},
|
},
|
||||||
branch,
|
branch,
|
||||||
updatequote,
|
updatequote,
|
||||||
@@ -260,7 +372,7 @@ app.use("/sb/i/:v/:imagePath/:img", async function (req, res) {
|
|||||||
const { fetch } = await import("undici");
|
const { fetch } = await import("undici");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const url = `https://codeberg.org/Ashley/poketube/raw/branch/main/instances.json`;
|
const url = `https://raw.githubusercontent.com/ashley0143/poke/main/instances.json`;
|
||||||
|
|
||||||
let f = await fetch(url)
|
let f = await fetch(url)
|
||||||
.then((res) => res.text())
|
.then((res) => res.text())
|
||||||
|
|||||||
@@ -57,20 +57,22 @@ const ChannelTabs = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function (app, config, renderTemplate) {
|
module.exports = function (app, config, renderTemplate) {
|
||||||
app.get("/download", async function (req, res) {
|
app.get("/download", async (req, res) => {
|
||||||
try {
|
try {
|
||||||
var v = req.query.v;
|
const v = req.query.v;
|
||||||
|
|
||||||
renderTemplate(res, req, "download.ejs", {
|
const thumbnailUrl = `https://i.ytimg.com/vi/${v}/maxresdefault.jpg`;
|
||||||
v,
|
const colors = await modules.getColors(thumbnailUrl);
|
||||||
color: await modules
|
const color = colors[0].hex();
|
||||||
.getColors(`https://i.ytimg.com/vi/${v}/maxresdefault.jpg`)
|
|
||||||
.then((colors) => colors[0].hex()),
|
renderTemplate(res, req, "download.ejs", {
|
||||||
isMobile: req.useragent.isMobile,
|
v,
|
||||||
});
|
color,
|
||||||
} catch {
|
isMobile: req.useragent.isMobile,
|
||||||
res.redirect("/");
|
});
|
||||||
}
|
} catch (error) {
|
||||||
|
res.redirect("/");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get("/old/watch", async function (req, res) {
|
app.get("/old/watch", async function (req, res) {
|
||||||
@@ -86,7 +88,7 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
app.get("/search", async (req, res) => {
|
app.get("/search", async (req, res) => {
|
||||||
const query = req.query.query;
|
const query = req.query.query ? req.query.query.replace("ohio", "things to do in ohio") : '';
|
||||||
const tab = req.query.tab;
|
const tab = req.query.tab;
|
||||||
const { fetch } = await import("undici");
|
const { fetch } = await import("undici");
|
||||||
|
|
||||||
@@ -106,15 +108,26 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
IsOldWindows = false;
|
IsOldWindows = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const poketube_universe_value = "poketube_smart_search";
|
if (query) {
|
||||||
|
let redirectTo = null;
|
||||||
|
let splitParam = ":";
|
||||||
|
|
||||||
if (query?.includes("youtube.com/watch?v=")) {
|
if (query.includes("youtube.com/watch?v=")) {
|
||||||
try {
|
redirectTo = "/watch";
|
||||||
var videoid = query?.split("v=");
|
splitParam = "?v=";
|
||||||
|
} else if (query.includes("channel")) {
|
||||||
|
redirectTo = "/channel?id=";
|
||||||
|
} else if (query.includes("video")) {
|
||||||
|
redirectTo = "/watch?v=";
|
||||||
|
}
|
||||||
|
|
||||||
res.redirect("/watch?v=" + videoid[1]);
|
if (redirectTo) {
|
||||||
} catch {
|
try {
|
||||||
return;
|
const id = query.split(splitParam)[1];
|
||||||
|
res.redirect(`${redirectTo}${splitParam}${id}`);
|
||||||
|
} catch {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,6 +135,11 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
res.redirect("https://lite.duckduckgo.com/lite/?q=" + query);
|
res.redirect("https://lite.duckduckgo.com/lite/?q=" + query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (query && query.startsWith("Hey ChatGPT,") && query.length > 2) {
|
||||||
|
res.redirect("https://chatgpt.com/?q=" + query + "- sent using pokeAI features");
|
||||||
|
}
|
||||||
|
|
||||||
if (!query) {
|
if (!query) {
|
||||||
return res.redirect("/");
|
return res.redirect("/");
|
||||||
}
|
}
|
||||||
@@ -135,15 +153,17 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
try {
|
try {
|
||||||
const headers = {};
|
const headers = {};
|
||||||
|
|
||||||
const xmlData = await fetch(
|
let searchUrl;
|
||||||
`${config.invapi}/search?q=${encodeURIComponent(
|
if (req.query.from === 'hashtag') {
|
||||||
query
|
searchUrl = `${config.invapi}/hashtag/${query}?hl=en-gb`;
|
||||||
)}&page=${encodeURIComponent(
|
} else {
|
||||||
continuation
|
searchUrl = `${config.invapi}/search?q=${encodeURIComponent(query)}&page=${encodeURIComponent(continuation)}&date=${date}&type=${type}&duration=${duration}&sort=${sort}&hl=en+gb`;
|
||||||
)}&date=${date}&type=${type}&duration=${duration}&sort=${sort}&hl=en+gb`
|
}
|
||||||
)
|
|
||||||
.then((res) => res.text())
|
const xmlData = await fetch(searchUrl)
|
||||||
.then((txt) => getJson(txt));
|
.then((res) => res.text())
|
||||||
|
.then((txt) => getJson(txt));
|
||||||
|
|
||||||
|
|
||||||
renderTemplate(res, req, "search.ejs", {
|
renderTemplate(res, req, "search.ejs", {
|
||||||
invresults: xmlData,
|
invresults: xmlData,
|
||||||
@@ -161,7 +181,7 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
summary: "",
|
summary: "",
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`Error while searching for '${query}':`, error);
|
console.log(`Error while searching for '${query}':`, error);
|
||||||
res.redirect("/");
|
res.redirect("/");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -171,70 +191,7 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
app.get("/web", async (req, res) => {
|
app.get("/web", async (req, res) => {
|
||||||
const query = req.query.query;
|
res.redirect("/");
|
||||||
const tab = req.query.tab;
|
|
||||||
|
|
||||||
const { fetch } = await import("undici");
|
|
||||||
|
|
||||||
const search = await fetch(
|
|
||||||
`https://librex.uk.to/api.php?q=${query}&p=1&t=0`
|
|
||||||
);
|
|
||||||
const web = getJson(await search.text());
|
|
||||||
|
|
||||||
if (req.query.lucky === "true") {
|
|
||||||
res.redirect("/im-feeling-lucky?query=" + query);
|
|
||||||
}
|
|
||||||
var uaos = req.useragent.os;
|
|
||||||
var IsOldWindows;
|
|
||||||
|
|
||||||
if (uaos == "Windows 7" && req.useragent.browser == "Firefox") {
|
|
||||||
IsOldWindows = true;
|
|
||||||
} else if (uaos == "Windows 8" && req.useragent.browser == "Firefox") {
|
|
||||||
IsOldWindows = true;
|
|
||||||
} else {
|
|
||||||
IsOldWindows = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const poketube_universe_value = "poketube_smart_search";
|
|
||||||
|
|
||||||
if (query?.includes("youtube.com/watch?v=")) {
|
|
||||||
try {
|
|
||||||
var videoid = query?.split("v=");
|
|
||||||
|
|
||||||
res.redirect("/watch?v=" + videoid[1]);
|
|
||||||
} catch {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (query && query.startsWith("!") && query.length > 2) {
|
|
||||||
res.redirect("https://lite.duckduckgo.com/lite/?q=" + query);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!query) {
|
|
||||||
return renderTemplate(res, req, "search-web-main.ejs");
|
|
||||||
}
|
|
||||||
|
|
||||||
let continuation = req.query.continuation || "";
|
|
||||||
|
|
||||||
try {
|
|
||||||
const results = Object.entries(web);
|
|
||||||
|
|
||||||
renderTemplate(res, req, "search-web.ejs", {
|
|
||||||
j: "",
|
|
||||||
IsOldWindows,
|
|
||||||
h: "",
|
|
||||||
tab,
|
|
||||||
continuation,
|
|
||||||
isMobile: req.useragent.isMobile,
|
|
||||||
results: results,
|
|
||||||
q: query,
|
|
||||||
summary: "",
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
console.error(`Error while searching for '${query}':`, error);
|
|
||||||
res.redirect("/");
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get("/channel/", async (req, res) => {
|
app.get("/channel/", async (req, res) => {
|
||||||
@@ -255,6 +212,7 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
if (ID.endsWith("@poketube.fun")) {
|
if (ID.endsWith("@poketube.fun")) {
|
||||||
ID = ID.slice(0, -"@poketube.fun".length);
|
ID = ID.slice(0, -"@poketube.fun".length);
|
||||||
}
|
}
|
||||||
|
|
||||||
const tab = req.query.tab;
|
const tab = req.query.tab;
|
||||||
const cache = {};
|
const cache = {};
|
||||||
|
|
||||||
@@ -289,25 +247,29 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const apiUrl = config.invapi + "/channels/";
|
const apiUrl = config.invapi + "/channels/";
|
||||||
const channelUrl = `${apiUrl}${atob(
|
const channelUrl = `${apiUrl}${ID}/${atob(
|
||||||
ChannelTabs.videos
|
ChannelTabs.videos
|
||||||
)}/${ID}/?sort_by=${sort_by}${continuation}`;
|
)}?sort_by=${sort_by}${continuation}`;
|
||||||
const shortsUrl = `${apiUrl}${ID}/${atob(
|
|
||||||
ChannelTabs.shorts
|
const shortsUrl = `${apiUrl}${ID}/${atob(
|
||||||
)}?sort_by=${sort_by}${continuations}`;
|
ChannelTabs.shorts
|
||||||
const streamUrl = `${apiUrl}${ID}/${atob(
|
)}?sort_by=${sort_by}${continuation}`;
|
||||||
ChannelTabs.streams
|
|
||||||
)}?sort_by=${sort_by}${continuationl}`;
|
const streamUrl = `${apiUrl}${ID}/${atob(
|
||||||
const communityUrl = `${apiUrl}${atob(
|
ChannelTabs.streams
|
||||||
ChannelTabs.community
|
)}?sort_by=${sort_by}${continuation}`;
|
||||||
)}/${ID}/?hl=en-US`;
|
|
||||||
const PlaylistUrl = `${apiUrl}${atob(
|
const communityUrl = `${apiUrl}${ID}/${atob(
|
||||||
ChannelTabs.playlist
|
ChannelTabs.community
|
||||||
)}/${ID}/?hl=en-US`;
|
)}?hl=en-US`;
|
||||||
|
|
||||||
|
const PlaylistUrl = `${apiUrl}${ID}/${atob(
|
||||||
|
ChannelTabs.playlist
|
||||||
|
)}?hl=en-US`;
|
||||||
|
|
||||||
const channelINVUrl = `${apiUrl}${ID}/`;
|
const channelINVUrl = `${apiUrl}${ID}/`;
|
||||||
const checkPronoun = async (id) => (await (await fetch('https://codeberg.org/ashley/poke-pronouns-db/raw/branch/main/pronouns.json')).json())[id] || `no pronouns set`;
|
|
||||||
const pronoun = await checkPronoun(ID);
|
const pronoun = "no pronouns :c";
|
||||||
|
|
||||||
var [tj, shorts, playlist, stream, c, cinv] = await Promise.all([
|
var [tj, shorts, playlist, stream, c, cinv] = await Promise.all([
|
||||||
getChannelData(channelUrl),
|
getChannelData(channelUrl),
|
||||||
@@ -318,6 +280,23 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
getChannelData(channelINVUrl),
|
getChannelData(channelINVUrl),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
var bannedchannels = ["UC1okSIA8UEY8OqvtjGHFvzA", "UClsVg5LkK2COQRo1mVS4taA", "UCIr4vkCsn0tdTW2xZ1jRG1g"];
|
||||||
|
var bypassQuery = "cG9rZXR1YmVjaGFubmVsYnlwYXNzbG9scGVvcGxldGhpbmt0aGlzaXNjZW5zb3JzaGlwLTQ1OTBh";
|
||||||
|
|
||||||
|
var bypassExists = req.query.bypass === bypassQuery;
|
||||||
|
var tabExists = 'tab' in req.query;
|
||||||
|
var continuationExists = 'continuation' in req.query;
|
||||||
|
|
||||||
|
|
||||||
|
if (bannedchannels.some(channel => channel === ID) && !bypassExists && !tabExists && !continuationExists) {
|
||||||
|
var cinv = {
|
||||||
|
error:`this channel may include disinformation. If you still wanna view content <a href="/channel?id=${ID}&bypass=${bypassQuery}">click here</a> to bypass this restriction.`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function getThumbnailUrl(video) {
|
function getThumbnailUrl(video) {
|
||||||
const maxresDefaultThumbnail = video.videoThumbnails.find(
|
const maxresDefaultThumbnail = video.videoThumbnails.find(
|
||||||
(thumbnail) => thumbnail.quality === "maxresdefault"
|
(thumbnail) => thumbnail.quality === "maxresdefault"
|
||||||
@@ -346,7 +325,7 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
var { tj, shorts, stream, c, boutJson } = cache[ID].result;
|
var { tj, shorts, stream, c, boutJson } = cache[ID].result;
|
||||||
}
|
}
|
||||||
|
|
||||||
const subscribers = boutJson.Channel?.Metadata.Subscribers;
|
const subscribers = convert(cinv?.subCount || 0);
|
||||||
const about = boutJson?.Channel?.Contents?.ItemSection?.About;
|
const about = boutJson?.Channel?.Contents?.ItemSection?.About;
|
||||||
const description = about?.Description.toString().replace(
|
const description = about?.Description.toString().replace(
|
||||||
/\n/g,
|
/\n/g,
|
||||||
@@ -354,10 +333,18 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
);
|
);
|
||||||
const dnoreplace = about?.Description.toString();
|
const dnoreplace = about?.Description.toString();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let ChannelFirstVideoObject = {
|
||||||
|
subCountText: "0",
|
||||||
|
authorVerified: false,
|
||||||
|
};
|
||||||
|
|
||||||
renderTemplate(res, req, "channel.ejs", {
|
renderTemplate(res, req, "channel.ejs", {
|
||||||
ID,
|
ID,
|
||||||
tab,
|
tab,
|
||||||
shorts,
|
shorts,
|
||||||
|
firstVideo: ChannelFirstVideoObject,
|
||||||
j: boutJson,
|
j: boutJson,
|
||||||
sort: sort_by,
|
sort: sort_by,
|
||||||
stream,
|
stream,
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
app.get("/gaming", (req, res) => {
|
app.get("/gaming", (req, res) => {
|
||||||
res.redirect("/discover?tab=gaming");
|
res.redirect("/app?tab=gaming");
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get("/custom-theme", (req, res) => {
|
app.get("/custom-theme", (req, res) => {
|
||||||
|
|||||||
@@ -153,6 +153,56 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
renderTemplate(res, req, "content-settings.ejs");
|
renderTemplate(res, req, "content-settings.ejs");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function gregorianToIslamic(gDate) {
|
||||||
|
const jd = Math.floor((gDate - new Date(1970, 0, 1)) / (24 * 60 * 60 * 1000)) + 2440588;
|
||||||
|
const islamicYear = Math.floor((30 * (jd - 1948440) + 10646) / 10631);
|
||||||
|
return islamicYear;
|
||||||
|
}
|
||||||
|
|
||||||
|
function gregorianToPersian(gDate) {
|
||||||
|
const persianEpoch = 226895; // Julian Day of Persian Epoch
|
||||||
|
const jd = Math.floor((gDate - new Date(1970, 0, 1)) / (24 * 60 * 60 * 1000)) + 2440588;
|
||||||
|
const persianYear = Math.floor((jd - persianEpoch) / 365.2421985) + 1;
|
||||||
|
return persianYear;
|
||||||
|
}
|
||||||
|
|
||||||
|
app.get('/calendar', (req, res) => {
|
||||||
|
// Get the date from query or default to today
|
||||||
|
const queryDate = req.query.date ? new Date(req.query.date) : new Date();
|
||||||
|
|
||||||
|
// Extract the year and month from the date
|
||||||
|
const year = queryDate.getFullYear();
|
||||||
|
const month = queryDate.getMonth(); // 0 (January) to 11 (December)
|
||||||
|
|
||||||
|
const monthOffset = parseInt(req.query.month) || 0;
|
||||||
|
const newDate = new Date(year, month + monthOffset, 1);
|
||||||
|
const newYear = newDate.getFullYear();
|
||||||
|
const newMonth = newDate.getMonth();
|
||||||
|
|
||||||
|
const firstDay = new Date(newYear, newMonth, 1);
|
||||||
|
const firstDayWeekday = firstDay.getDay(); // Day of the week (0-6)
|
||||||
|
|
||||||
|
const days = Array.from({ length: 42 }, (_, i) => {
|
||||||
|
const day = new Date(newYear, newMonth, i - firstDayWeekday + 1);
|
||||||
|
return (day.getMonth() === newMonth) ? day : null;
|
||||||
|
});
|
||||||
|
|
||||||
|
const islamicYear = gregorianToIslamic(newDate);
|
||||||
|
const persianYear = gregorianToPersian(newDate);
|
||||||
|
|
||||||
|
renderTemplate(res, req, "calendar.ejs", {
|
||||||
|
year: newYear,
|
||||||
|
islamicYear,
|
||||||
|
persianYear,
|
||||||
|
currentDate: newDate,
|
||||||
|
days,
|
||||||
|
month: newMonth,
|
||||||
|
queryDate,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
app.get("/offline", function (req, res) {
|
app.get("/offline", function (req, res) {
|
||||||
res.sendFile("offline.html", { root: location_pwa });
|
res.sendFile("offline.html", { root: location_pwa });
|
||||||
});
|
});
|
||||||
@@ -210,11 +260,20 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get("/game-hub", function (req, res) {
|
app.get("/game-hub", function (req, res) {
|
||||||
renderTemplate(res, req, "gamehub.ejs", {
|
var gameslist = ["pong", "tic-tac-toe", "sudoku", "snake"];
|
||||||
game: req.query.game,
|
var requestedGame = req.query.game;
|
||||||
});
|
|
||||||
|
if (req.query.game && !gameslist.includes(requestedGame)) {
|
||||||
|
return renderTemplate(res, req, "404.ejs");
|
||||||
|
}
|
||||||
|
|
||||||
|
renderTemplate(res, req, "gamehub.ejs", {
|
||||||
|
game: requestedGame,
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
app.get("/static/:id", (req, res) => {
|
app.get("/static/:id", (req, res) => {
|
||||||
const id = req.params.id;
|
const id = req.params.id;
|
||||||
|
|
||||||
|
|||||||
@@ -141,8 +141,8 @@ function lightOrDark(color) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function isDntEnabled(req) {
|
function isDntEnabled(req) {
|
||||||
const dntHeader = req.header('DNT');
|
const dntHeader = req.header("DNT");
|
||||||
return dntHeader && (dntHeader === '1' || dntHeader === 'true');
|
return dntHeader && (dntHeader === "1" || dntHeader === "true");
|
||||||
}
|
}
|
||||||
|
|
||||||
function IsInArray(array, id) {
|
function IsInArray(array, id) {
|
||||||
@@ -164,11 +164,18 @@ function getJson(str) {
|
|||||||
const PATREON_REGEX = /https:\/\/(?:www\.)?patreon.com\/(?<name>[\w\d_-]+)/;
|
const PATREON_REGEX = /https:\/\/(?:www\.)?patreon.com\/(?<name>[\w\d_-]+)/;
|
||||||
|
|
||||||
/* connections */
|
/* connections */
|
||||||
const X_REGEX = /https:\/\/twitter.com\/(?<name>[\w\d_-]+)/;
|
const TWITTER_REGEX = /https:\/\/twitter.com\/(?<name>[\w\d_-]+)/;
|
||||||
const CORD_REGEX = /https:\/\/discord.gg\/(?<name>[\w\d_-]+)/;
|
const CORD_REGEX = /https:\/\/discord.gg\/(?<name>[\w\d_-]+)/;
|
||||||
const TWITCH_REGEX = /https:\/\/twitch.tv\/(?<name>[\w\d_-]+)/;
|
const TWITCH_REGEX = /https:\/\/twitch.tv\/(?<name>[\w\d_-]+)/;
|
||||||
const REDDIT_REGEX = /https:\/\/reddit\.com\/r\/(?<name>[\w\d_-]+)/;
|
const REDDIT_REGEX = /https:\/\/reddit\.com\/r\/(?<name>[\w\d_-]+)/;
|
||||||
|
|
||||||
|
/* meta software */
|
||||||
const INSTAGRAM_REGEX = /https:\/\/www.instagram.com\/(?<name>[\w\d_-]+)/;
|
const INSTAGRAM_REGEX = /https:\/\/www.instagram.com\/(?<name>[\w\d_-]+)/;
|
||||||
|
const THREADS_BY_INSTAGRAM_REGEX = /https:\/\/www.threads.net\/(?<name>[\w\d_-]+)/;
|
||||||
|
const FACEBOOK_REGEX = /https:\/\/www.facebook.com\/(?<name>[\w\d_-]+)/;
|
||||||
|
|
||||||
|
/* music */
|
||||||
|
const LNKTO_REGEX = /https:\/\/(?<subdomain>\w+).lnk.to\/(?<path>\S*)/;
|
||||||
|
|
||||||
module.exports = function (app, config, renderTemplate) {
|
module.exports = function (app, config, renderTemplate) {
|
||||||
app.get("/encryption", async function (req, res) {
|
app.get("/encryption", async function (req, res) {
|
||||||
@@ -190,6 +197,13 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
return res.redirect("/");
|
return res.redirect("/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const regex = new RegExp("^([a-zA-Z0-9_-]{11})");
|
||||||
|
const isMatch = regex.test(v);
|
||||||
|
|
||||||
|
if (!isMatch) {
|
||||||
|
return res.redirect("/");
|
||||||
|
}
|
||||||
|
|
||||||
var contentlang = hl || "en-US";
|
var contentlang = hl || "en-US";
|
||||||
var contentregion = region || "US";
|
var contentregion = region || "US";
|
||||||
|
|
||||||
@@ -203,148 +217,179 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
const secure = ["poketube.fun"].includes(req.hostname);
|
const secure = ["poketube.fun"].includes(req.hostname);
|
||||||
const verify = req.hostname === "poketube.sudovanilla.com";
|
const verify = req.hostname === "poketube.sudovanilla.com";
|
||||||
|
|
||||||
INNERTUBE.getYouTubeApiVideo(f, v, contentlang, contentregion).then((data) => {
|
|
||||||
try {
|
|
||||||
const k = data?.video;
|
|
||||||
const channel_uploads = data?.channel_uploads
|
|
||||||
const json = data?.json;
|
|
||||||
const engagement = data?.engagement;
|
|
||||||
const inv_comments = data?.comments || "Disabled";
|
|
||||||
const inv_vid = data?.vid;
|
|
||||||
const desc = data?.desc || "";
|
|
||||||
|
|
||||||
let d = false;
|
|
||||||
if (desc !== "[object Object]") {
|
|
||||||
d = desc.toString().replace(/\n/g, " <br> ");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const descriptionString = String(inv_vid?.description);
|
|
||||||
|
|
||||||
function extractInfo(regex) {
|
|
||||||
return descriptionString !== "[object Object]"
|
|
||||||
? (regex.exec(descriptionString) ?? {}).groups
|
|
||||||
: undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
const support = extractInfo(PATREON_REGEX);
|
|
||||||
const twitter = extractInfo(X_REGEX);
|
|
||||||
const discord = extractInfo(CORD_REGEX);
|
|
||||||
const twitch = extractInfo(TWITCH_REGEX);
|
|
||||||
const reddit = extractInfo(REDDIT_REGEX);
|
|
||||||
const instagram = extractInfo(INSTAGRAM_REGEX);
|
|
||||||
|
|
||||||
|
|
||||||
var proxyurl = config.p_url;
|
|
||||||
var vidurl = u.url;
|
|
||||||
var isvidious = u.isInvidiousURL;
|
|
||||||
var mediaproxy = config.media_proxy
|
|
||||||
|
|
||||||
|
|
||||||
if (inv_vid?.genre === "Music") {
|
|
||||||
var vidurl = u.losslessurl;
|
|
||||||
}
|
|
||||||
|
|
||||||
var vidurl = config.videourl;
|
|
||||||
var isvidious = true;
|
|
||||||
|
|
||||||
if (req.useragent.source.includes("Pardus")) {
|
|
||||||
var vidurl = "https://iv.ggtyler.dev";
|
|
||||||
var mediaproxy = "https://media-proxy.ashley0143.xyz"
|
|
||||||
var isvidious = true;
|
|
||||||
var isSchoolProxy = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// unused
|
|
||||||
let badges = "";
|
|
||||||
let comments = "";
|
|
||||||
let nnn = "";
|
|
||||||
|
|
||||||
const dnt_val = isDntEnabled(req)
|
|
||||||
|
|
||||||
if (
|
|
||||||
inv_vid?.error ===
|
|
||||||
"The uploader has not made this video available in your country" ||
|
|
||||||
inv_vid?.error === "This video is not available"
|
|
||||||
) {
|
|
||||||
res.send(
|
|
||||||
"error: " + inv_vid.error + " please refresh the page please qt"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
var uaos = req.useragent.os;
|
|
||||||
const browser = req.useragent.browser;
|
|
||||||
const IsOldWindows =
|
|
||||||
(uaos === "Windows 7" || uaos === "Windows 8") &&
|
|
||||||
browser === "Firefox";
|
|
||||||
|
|
||||||
if (uaos === "Windows XP" || uaos === "Windows Vista")
|
|
||||||
res.redirect("/lite?v=" + req.query.v);
|
|
||||||
|
|
||||||
if (req.query.from === "short") var shortsui = true;
|
|
||||||
|
|
||||||
|
INNERTUBE.getYouTubeApiVideo(f, v, contentlang, contentregion).then(
|
||||||
|
(data) => {
|
||||||
try {
|
try {
|
||||||
renderTemplate(res, req, "poketube.ejs", {
|
const k = data?.video;
|
||||||
color: data.color,
|
const channel_uploads = data?.channel_uploads;
|
||||||
color2: data.color2,
|
const json = data?.json;
|
||||||
linkify,
|
const engagement = data?.engagement;
|
||||||
engagement,
|
const inv_comments = data?.comments || "Disabled";
|
||||||
IsOldWindows,
|
const inv_vid = data?.vid;
|
||||||
channelurlfixer,
|
const desc = data?.desc || "";
|
||||||
support,
|
|
||||||
shortsui,
|
|
||||||
u: vidurl,
|
let d = false;
|
||||||
isvidious: isvidious,
|
if (desc !== "[object Object]") {
|
||||||
video: json,
|
d = desc.toString().replace(/\n/g, " <br> ");
|
||||||
date: k.Video.uploadDate,
|
}
|
||||||
e,
|
|
||||||
a,
|
const descriptionString = String(inv_vid?.description).replace(/\bx.com\b/, "twitter.com")
|
||||||
twitter,
|
|
||||||
k,
|
function extractInfo(regex) {
|
||||||
dm,
|
return descriptionString !== "[object Object]"
|
||||||
proxyurl,
|
? (regex.exec(descriptionString) ?? {}).groups
|
||||||
media_proxy_url: mediaproxy,
|
: undefined;
|
||||||
instagram,
|
}
|
||||||
useragent: req.useragent,
|
|
||||||
verify,
|
const support = extractInfo(PATREON_REGEX);
|
||||||
discord,
|
const STUPID_ELON_MUSK_WEBSITE_HE_IS_TRYING_TO_CALL_IT_X_FOR_SOME_REASON_WHICH_IS_A_STUPID_NAME_WE_WILL_FOREVER_CALL_IT_TWITTER_AND_HE_CAN_DO_NOTHING_ABOUT_IT_LOL_FUCK_YOU_ELON_TRANS_RIGHTS_BTW = extractInfo(TWITTER_REGEX);
|
||||||
turntomins,
|
const linkto = extractInfo(LNKTO_REGEX);
|
||||||
twitch,
|
const discord = extractInfo(CORD_REGEX);
|
||||||
dnt_val,
|
const twitch = extractInfo(TWITCH_REGEX);
|
||||||
reddit,
|
const reddit = extractInfo(REDDIT_REGEX);
|
||||||
channel_uploads,
|
|
||||||
secure,
|
/* meta software */
|
||||||
process,
|
const instagram = extractInfo(INSTAGRAM_REGEX);
|
||||||
isSchoolProxy,
|
const threads_by_instagram = extractInfo(THREADS_BY_INSTAGRAM_REGEX);
|
||||||
sha384,
|
|
||||||
lightOrDark,
|
const videoObject = inv_vid?.adaptiveFormats;
|
||||||
isMobile: req.useragent.isMobile,
|
function findItag(adaptiveFormats) {
|
||||||
tj: data.channel,
|
|
||||||
r,
|
|
||||||
qua: q,
|
|
||||||
inv: inv_comments,
|
|
||||||
convert,
|
|
||||||
universe,
|
|
||||||
wiki: data.wiki,
|
|
||||||
escapeHtml,
|
|
||||||
f,
|
|
||||||
t: config.t_url,
|
|
||||||
optout: m,
|
|
||||||
badges,
|
|
||||||
desc,
|
|
||||||
comments,
|
|
||||||
n: nnn,
|
|
||||||
inv_vid,
|
|
||||||
lyrics: "",
|
|
||||||
});
|
|
||||||
} catch {
|
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const itag_hd = findItag(videoObject);
|
||||||
|
var proxyurl = config.p_url;
|
||||||
|
var vidurl = u.url;
|
||||||
|
var isvidious = u.isInvidiousURL;
|
||||||
|
var mediaproxy = config.media_proxy;
|
||||||
|
|
||||||
|
if (inv_vid?.genre === "Music") {
|
||||||
|
var vidurl = u.losslessurl;
|
||||||
|
}
|
||||||
|
|
||||||
|
var vidurl = config.videourl;
|
||||||
|
var isvidious = true;
|
||||||
|
|
||||||
|
if (req.useragent.source.includes("Pardus")) {
|
||||||
|
var vidurl = "https://iv.ggtyler.dev";
|
||||||
|
var mediaproxy = "https://nyc1.pokejan.ggtyler.dev/";
|
||||||
|
var isvidious = true;
|
||||||
|
var isSchoolProxy = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// unused
|
||||||
|
let badges = "";
|
||||||
|
let comments = "";
|
||||||
|
let nnn = "";
|
||||||
|
|
||||||
|
const dnt_val = isDntEnabled(req);
|
||||||
|
|
||||||
|
if (
|
||||||
|
inv_vid?.error ===
|
||||||
|
"The uploader has not made this video available in your country" ||
|
||||||
|
inv_vid?.error === "This video is not available"
|
||||||
|
) {
|
||||||
|
res.send(
|
||||||
|
"error: " + inv_vid.error + " please refresh the page please qt"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inv_vid?.error) {
|
||||||
|
renderTemplate(res, req, "404.ejs", {
|
||||||
|
v,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var uaos = req.useragent.os;
|
||||||
|
const browser = req.useragent.browser;
|
||||||
|
const IsOldWindows =
|
||||||
|
(uaos === "Windows 7" || uaos === "Windows 8") &&
|
||||||
|
browser === "Firefox";
|
||||||
|
|
||||||
|
if (uaos === "Windows XP" || uaos === "Windows Vista")
|
||||||
|
res.redirect("/lite?v=" + req.query.v);
|
||||||
|
|
||||||
|
if (req.useragent.source.includes("Nintendo WiiU"))
|
||||||
|
res.redirect("/lite?v=" + req.query.v);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (req.query.from === "short") var shortsui = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
renderTemplate(res, req, "watch.ejs", {
|
||||||
|
color: data.color,
|
||||||
|
color2: data.color2,
|
||||||
|
linkify,
|
||||||
|
engagement,
|
||||||
|
linkto,
|
||||||
|
IsOldWindows,
|
||||||
|
channelurlfixer,
|
||||||
|
itag_hd,
|
||||||
|
support,
|
||||||
|
shortsui,
|
||||||
|
u: vidurl,
|
||||||
|
isvidious: isvidious,
|
||||||
|
video: json,
|
||||||
|
date: k.Video.uploadDate,
|
||||||
|
e,
|
||||||
|
a,
|
||||||
|
twitter:STUPID_ELON_MUSK_WEBSITE_HE_IS_TRYING_TO_CALL_IT_X_FOR_SOME_REASON_WHICH_IS_A_STUPID_NAME_WE_WILL_FOREVER_CALL_IT_TWITTER_AND_HE_CAN_DO_NOTHING_ABOUT_IT_LOL_FUCK_YOU_ELON_TRANS_RIGHTS_BTW,
|
||||||
|
k,
|
||||||
|
dm,
|
||||||
|
proxyurl,
|
||||||
|
media_proxy_url: mediaproxy,
|
||||||
|
instagram,
|
||||||
|
useragent: req.useragent,
|
||||||
|
config,
|
||||||
|
verify,
|
||||||
|
discord,
|
||||||
|
turntomins,
|
||||||
|
twitch,
|
||||||
|
dnt_val,
|
||||||
|
reddit,
|
||||||
|
channel_uploads,
|
||||||
|
secure,
|
||||||
|
process,
|
||||||
|
isSchoolProxy,
|
||||||
|
sha384,
|
||||||
|
lightOrDark,
|
||||||
|
isMobile: req.useragent.isMobile,
|
||||||
|
tj: data.channel,
|
||||||
|
r,
|
||||||
|
threads:threads_by_instagram,
|
||||||
|
hostname:req.hostname,
|
||||||
|
qua: q,
|
||||||
|
inv: inv_comments,
|
||||||
|
convert,
|
||||||
|
universe,
|
||||||
|
wiki: data.wiki,
|
||||||
|
escapeHtml,
|
||||||
|
f,
|
||||||
|
t: config.t_url,
|
||||||
|
optout: m,
|
||||||
|
badges,
|
||||||
|
desc,
|
||||||
|
comments,
|
||||||
|
n: nnn,
|
||||||
|
inv_vid,
|
||||||
|
lyrics: "",
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
res.status(500);
|
||||||
|
renderTemplate(res, req, "video-error.ejs", {
|
||||||
|
v,
|
||||||
|
err_reason:err
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
return res.redirect(`/watch?v=${req.query.v}&fx=1&err=${error}`);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
|
||||||
console.error(error);
|
|
||||||
return res.redirect(`/watch?v=${req.query.v}&fx=1&err=${error}`);
|
|
||||||
}
|
}
|
||||||
});
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get("/lite", async (req, res) => {
|
app.get("/lite", async (req, res) => {
|
||||||
@@ -367,144 +412,143 @@ module.exports = function (app, config, renderTemplate) {
|
|||||||
const secure = ["poketube.fun"].includes(req.hostname);
|
const secure = ["poketube.fun"].includes(req.hostname);
|
||||||
const verify = req.hostname === "poketube.sudovanilla.com";
|
const verify = req.hostname === "poketube.sudovanilla.com";
|
||||||
|
|
||||||
INNERTUBE.getYouTubeApiVideo(f, v, contentlang, contentregion).then((data) => {
|
INNERTUBE.getYouTubeApiVideo(f, v, contentlang, contentregion).then(
|
||||||
try {
|
(data) => {
|
||||||
const k = data?.video;
|
|
||||||
const channel_uploads = data?.channel_uploads
|
|
||||||
const json = data?.json;
|
|
||||||
const engagement = data?.engagement;
|
|
||||||
const inv_comments = data?.comments || "Disabled";
|
|
||||||
const inv_vid = data?.vid;
|
|
||||||
const desc = data?.desc || "";
|
|
||||||
|
|
||||||
let d = false;
|
|
||||||
if (desc !== "[object Object]") {
|
|
||||||
d = desc.toString().replace(/\n/g, " <br> ");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const descriptionString = String(inv_vid?.description);
|
|
||||||
|
|
||||||
function extractInfo(regex) {
|
|
||||||
return descriptionString !== "[object Object]"
|
|
||||||
? (regex.exec(descriptionString) ?? {}).groups
|
|
||||||
: undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
const support = extractInfo(PATREON_REGEX);
|
|
||||||
const twitter = extractInfo(X_REGEX);
|
|
||||||
const discord = extractInfo(CORD_REGEX);
|
|
||||||
const twitch = extractInfo(TWITCH_REGEX);
|
|
||||||
const reddit = extractInfo(REDDIT_REGEX);
|
|
||||||
const instagram = extractInfo(INSTAGRAM_REGEX);
|
|
||||||
|
|
||||||
|
|
||||||
var proxyurl = config.p_url;
|
|
||||||
var vidurl = u.url;
|
|
||||||
var isvidious = u.isInvidiousURL;
|
|
||||||
var mediaproxy = config.media_proxy
|
|
||||||
|
|
||||||
|
|
||||||
if (inv_vid?.genre === "Music") {
|
|
||||||
var vidurl = u.losslessurl;
|
|
||||||
}
|
|
||||||
|
|
||||||
var vidurl = "https://eu-proxy.poketube.fun";
|
|
||||||
var isvidious = true;
|
|
||||||
|
|
||||||
if (req.useragent.source.includes("Pardus")) {
|
|
||||||
var vidurl = "https://iv.ggtyler.dev";
|
|
||||||
var mediaproxy = "https://media-proxy.ashley0143.xyz"
|
|
||||||
var isvidious = true;
|
|
||||||
var isSchoolProxy = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// unused
|
|
||||||
let badges = "";
|
|
||||||
let comments = "";
|
|
||||||
let nnn = "";
|
|
||||||
|
|
||||||
const dnt_val = isDntEnabled(req)
|
|
||||||
|
|
||||||
if (
|
|
||||||
inv_vid?.error ===
|
|
||||||
"The uploader has not made this video available in your country" ||
|
|
||||||
inv_vid?.error === "This video is not available"
|
|
||||||
) {
|
|
||||||
res.send(
|
|
||||||
"error: " + inv_vid.error + " please refresh the page please qt"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
var uaos = req.useragent.os;
|
|
||||||
const browser = req.useragent.browser;
|
|
||||||
const IsOldWindows =
|
|
||||||
(uaos === "Windows 7" || uaos === "Windows 8") &&
|
|
||||||
browser === "Firefox";
|
|
||||||
|
|
||||||
if (req.query.from === "short") var shortsui = true;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
renderTemplate(res, req, "lite.ejs", {
|
const k = data?.video;
|
||||||
color: data.color,
|
const channel_uploads = data?.channel_uploads;
|
||||||
color2: data.color2,
|
const json = data?.json;
|
||||||
linkify,
|
const engagement = data?.engagement;
|
||||||
engagement,
|
const inv_comments = data?.comments || "Disabled";
|
||||||
IsOldWindows,
|
const inv_vid = data?.vid;
|
||||||
channelurlfixer,
|
const desc = data?.desc || "";
|
||||||
support,
|
|
||||||
shortsui,
|
let d = false;
|
||||||
u: vidurl,
|
if (desc !== "[object Object]") {
|
||||||
isvidious: isvidious,
|
d = desc.toString().replace(/\n/g, " <br> ");
|
||||||
video: json,
|
}
|
||||||
date: k.Video.uploadDate,
|
|
||||||
e,
|
const descriptionString = String(inv_vid?.description);
|
||||||
a,
|
|
||||||
twitter,
|
function extractInfo(regex) {
|
||||||
k,
|
return descriptionString !== "[object Object]"
|
||||||
dm,
|
? (regex.exec(descriptionString) ?? {}).groups
|
||||||
proxyurl,
|
: undefined;
|
||||||
media_proxy_url: mediaproxy,
|
}
|
||||||
instagram,
|
|
||||||
useragent: req.useragent,
|
const support = extractInfo(PATREON_REGEX);
|
||||||
verify,
|
const twitter = extractInfo(TWITTER_REGEX);
|
||||||
discord,
|
const discord = extractInfo(CORD_REGEX);
|
||||||
turntomins,
|
const twitch = extractInfo(TWITCH_REGEX);
|
||||||
twitch,
|
const reddit = extractInfo(REDDIT_REGEX);
|
||||||
dnt_val,
|
const instagram = extractInfo(INSTAGRAM_REGEX);
|
||||||
reddit,
|
|
||||||
channel_uploads,
|
var proxyurl = config.p_url;
|
||||||
secure,
|
var vidurl = u.url;
|
||||||
process,
|
var isvidious = u.isInvidiousURL;
|
||||||
isSchoolProxy,
|
var mediaproxy = config.media_proxy;
|
||||||
sha384,
|
|
||||||
lightOrDark,
|
if (inv_vid?.genre === "Music") {
|
||||||
isMobile: req.useragent.isMobile,
|
var vidurl = u.losslessurl;
|
||||||
tj: data.channel,
|
}
|
||||||
r,
|
|
||||||
qua: q,
|
var vidurl = "https://eu-proxy.poketube.fun";
|
||||||
inv: inv_comments,
|
var isvidious = true;
|
||||||
convert,
|
|
||||||
universe,
|
if (req.useragent.source.includes("Pardus")) {
|
||||||
wiki: data.wiki,
|
var vidurl = "https://iv.ggtyler.dev";
|
||||||
f,
|
var mediaproxy = "https://media-proxy.ashley0143.xyz";
|
||||||
t: config.t_url,
|
var isvidious = true;
|
||||||
optout: m,
|
var isSchoolProxy = "";
|
||||||
badges,
|
}
|
||||||
desc,
|
|
||||||
comments,
|
// unused
|
||||||
n: nnn,
|
let badges = "";
|
||||||
inv_vid,
|
let comments = "";
|
||||||
lyrics: "",
|
let nnn = "";
|
||||||
});
|
|
||||||
} catch {
|
const dnt_val = isDntEnabled(req);
|
||||||
return;
|
|
||||||
|
if (
|
||||||
|
inv_vid?.error ===
|
||||||
|
"The uploader has not made this video available in your country" ||
|
||||||
|
inv_vid?.error === "This video is not available"
|
||||||
|
) {
|
||||||
|
res.send(
|
||||||
|
"error: " + inv_vid.error + " please refresh the page please qt"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
var uaos = req.useragent.os;
|
||||||
|
const browser = req.useragent.browser;
|
||||||
|
const IsOldWindows =
|
||||||
|
(uaos === "Windows 7" || uaos === "Windows 8") &&
|
||||||
|
browser === "Firefox";
|
||||||
|
|
||||||
|
if (req.query.from === "short") var shortsui = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
renderTemplate(res, req, "lite.ejs", {
|
||||||
|
color: data.color,
|
||||||
|
color2: data.color2,
|
||||||
|
linkify,
|
||||||
|
engagement,
|
||||||
|
IsOldWindows,
|
||||||
|
channelurlfixer,
|
||||||
|
support,
|
||||||
|
shortsui,
|
||||||
|
u: vidurl,
|
||||||
|
isvidious: isvidious,
|
||||||
|
video: json,
|
||||||
|
date: k.Video.uploadDate,
|
||||||
|
e,
|
||||||
|
a,
|
||||||
|
twitter,
|
||||||
|
k,
|
||||||
|
dm,
|
||||||
|
proxyurl,
|
||||||
|
media_proxy_url: mediaproxy,
|
||||||
|
instagram,
|
||||||
|
useragent: req.useragent,
|
||||||
|
verify,
|
||||||
|
discord,
|
||||||
|
turntomins,
|
||||||
|
twitch,
|
||||||
|
dnt_val,
|
||||||
|
reddit,
|
||||||
|
channel_uploads,
|
||||||
|
secure,
|
||||||
|
process,
|
||||||
|
isSchoolProxy,
|
||||||
|
sha384,
|
||||||
|
lightOrDark,
|
||||||
|
isMobile: req.useragent.isMobile,
|
||||||
|
tj: data.channel,
|
||||||
|
r,
|
||||||
|
qua: q,
|
||||||
|
inv: inv_comments,
|
||||||
|
convert,
|
||||||
|
universe,
|
||||||
|
wiki: data.wiki,
|
||||||
|
f,
|
||||||
|
t: config.t_url,
|
||||||
|
optout: m,
|
||||||
|
badges,
|
||||||
|
desc,
|
||||||
|
comments,
|
||||||
|
n: nnn,
|
||||||
|
inv_vid,
|
||||||
|
lyrics: "",
|
||||||
|
});
|
||||||
|
} catch {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
return res.redirect(`/watch?v=${req.query.v}&fx=1&err=${error}`);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
|
||||||
console.error(error);
|
|
||||||
return res.redirect(`/watch?v=${req.query.v}&fx=1&err=${error}`);
|
|
||||||
}
|
}
|
||||||
});
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get("/music", async function (req, res) {
|
app.get("/music", async function (req, res) {
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ function init(app, config, rendertemplate) {
|
|||||||
|
|
||||||
}, 100);
|
}, 100);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
initlog("[FAILED] Load pages \n" + err);
|
initlog("[POKE SEGFAULT] Load pages \n" + err);
|
||||||
console.error(err);
|
console.error(err);
|
||||||
}
|
}
|
||||||
}, 100);
|
}, 100);
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ const { curly } = require("node-libcurl");
|
|||||||
const getdislikes = require("../libpoketube/libpoketube-dislikes.js");
|
const getdislikes = require("../libpoketube/libpoketube-dislikes.js");
|
||||||
const getColors = require("get-image-colors");
|
const getColors = require("get-image-colors");
|
||||||
const config = require("../../config.json")
|
const config = require("../../config.json")
|
||||||
const { Innertube, UniversalCache } = require('youtubei.js');
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -31,7 +30,13 @@ class InnerTubePokeVidious {
|
|||||||
this.config = config;
|
this.config = config;
|
||||||
this.cache = {};
|
this.cache = {};
|
||||||
this.language = "hl=en-US";
|
this.language = "hl=en-US";
|
||||||
|
this.param = "2AMB"
|
||||||
|
this.param_legacy = "CgIIAdgDAQ%3D%3D"
|
||||||
this.apikey = "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8"
|
this.apikey = "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8"
|
||||||
|
this.ANDROID_API_KEY = "AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w"
|
||||||
|
this.ANDROID_APP_VERSION = "19.14.42"
|
||||||
|
this.ANDROID_VERSION = "13"
|
||||||
|
this.useragent = "com.google.android.youtube/19.14.42 (Linux; U; Android 12; US) gzip"
|
||||||
this.INNERTUBE_CONTEXT_CLIENT_VERSION = "1"
|
this.INNERTUBE_CONTEXT_CLIENT_VERSION = "1"
|
||||||
this.region = "region=US";
|
this.region = "region=US";
|
||||||
this.sqp = "-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw";
|
this.sqp = "-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw";
|
||||||
@@ -71,7 +76,6 @@ class InnerTubePokeVidious {
|
|||||||
async getYouTubeApiVideo(f, v, contentlang, contentregion) {
|
async getYouTubeApiVideo(f, v, contentlang, contentregion) {
|
||||||
|
|
||||||
const { fetch } = await import("undici");
|
const { fetch } = await import("undici");
|
||||||
const yt = await Innertube.create({ cache: new UniversalCache(false), generate_session_locally: true });
|
|
||||||
|
|
||||||
if (v == null) return "Gib ID";
|
if (v == null) return "Gib ID";
|
||||||
|
|
||||||
@@ -83,9 +87,22 @@ class InnerTubePokeVidious {
|
|||||||
|
|
||||||
let desc = "";
|
let desc = "";
|
||||||
|
|
||||||
|
const fetchWithRetry = async (url, options = {}, retries = 3) => {
|
||||||
|
for (let attempt = 0; attempt < retries; attempt++) {
|
||||||
|
const res = await fetch(url, options);
|
||||||
|
if (res.status === 500 && attempt < retries - 1) {
|
||||||
|
continue; // retry on 500
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
// If all retries fail, return last response
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const [videoInfo, videoData] = await Promise.all([
|
const [invComments, videoInfo, videoData] = await Promise.all([
|
||||||
fetch(`${this.config.invapi}/videos/${v}?hl=${contentlang}®ion=${contentregion}&h=${btoa(Date.now())}`).then((res) => res.text()),
|
fetchWithRetry(`${this.config.invapi}/comments/${v}?hl=${contentlang}®ion=${contentregion}&h=${btoa(Date.now())}`).then((res) => res.text()),
|
||||||
|
fetchWithRetry(`${this.config.invapi}/videos/${v}?hl=${contentlang}®ion=${contentregion}&h=${btoa(Date.now())}`).then((res) => res.text()),
|
||||||
curly
|
curly
|
||||||
.get(`${this.config.tubeApi}video?v=${v}`, {
|
.get(`${this.config.tubeApi}video?v=${v}`, {
|
||||||
httpHeader: Object.entries(headers).map(([k, v]) => `${k}: ${v}`),
|
httpHeader: Object.entries(headers).map(([k, v]) => `${k}: ${v}`),
|
||||||
@@ -98,7 +115,7 @@ class InnerTubePokeVidious {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
const comments = await yt.getComments(v);
|
const comments = await this.getJson(invComments);
|
||||||
|
|
||||||
const vid = await this.getJson(videoInfo);
|
const vid = await this.getJson(videoInfo);
|
||||||
const { json, video } = videoData;
|
const { json, video } = videoData;
|
||||||
@@ -135,10 +152,10 @@ class InnerTubePokeVidious {
|
|||||||
wiki: "",
|
wiki: "",
|
||||||
desc: "",
|
desc: "",
|
||||||
color: await getColors(
|
color: await getColors(
|
||||||
`https://vid.puffyan.us/vi/${v}/hqdefault.jpg?sqp=${this.sqp}`
|
`https://i.ytimg.com/vi/${v}/hqdefault.jpg?sqp=${this.sqp}`
|
||||||
).then((colors) => colors[0].hex()),
|
).then((colors) => colors[0].hex()),
|
||||||
color2: await getColors(
|
color2: await getColors(
|
||||||
`https://vid.puffyan.us/vi/${v}/hqdefault.jpg?sqp=${this.sqp}`
|
`https://i.ytimg.com/vi/${v}/hqdefault.jpg?sqp=${this.sqp}`
|
||||||
).then((colors) => colors[1].hex()),
|
).then((colors) => colors[1].hex()),
|
||||||
},
|
},
|
||||||
timestamp: Date.now(),
|
timestamp: Date.now(),
|
||||||
@@ -162,7 +179,9 @@ class InnerTubePokeVidious {
|
|||||||
*/
|
*/
|
||||||
isvalidvideo(v) {
|
isvalidvideo(v) {
|
||||||
if (v != "assets" && v != "cdn-cgi" && v != "404") {
|
if (v != "assets" && v != "cdn-cgi" && v != "404") {
|
||||||
return true;
|
const regex = new RegExp("^([a-zA-Z0-9_-]{11})");
|
||||||
|
const isMatch = regex.test(v);
|
||||||
|
return isMatch;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -181,7 +200,7 @@ class InnerTubePokeVidious {
|
|||||||
// Create an instance of InnerTubePokeVidious with the provided config
|
// Create an instance of InnerTubePokeVidious with the provided config
|
||||||
const pokeTubeApiCore = new InnerTubePokeVidious({
|
const pokeTubeApiCore = new InnerTubePokeVidious({
|
||||||
tubeApi: "https://inner-api.poketube.fun/api/",
|
tubeApi: "https://inner-api.poketube.fun/api/",
|
||||||
invapi: "https://invid-api.poketube.fun/api/v1",
|
invapi: "https://invid-api.poketube.fun/bHj665PpYhUdPWuKPfZuQGoX/api/v1",
|
||||||
invapi_alt: config.proxylocation === "EU" ? "https://invid-api.poketube.fun/api/v1" : "https://iv.ggtyler.dev/api/v1",
|
invapi_alt: config.proxylocation === "EU" ? "https://invid-api.poketube.fun/api/v1" : "https://iv.ggtyler.dev/api/v1",
|
||||||
dislikes: "https://returnyoutubedislikeapi.com/votes?videoId=",
|
dislikes: "https://returnyoutubedislikeapi.com/votes?videoId=",
|
||||||
t_url: "https://t.poketube.fun/",
|
t_url: "https://t.poketube.fun/",
|
||||||
|
|||||||
@@ -42,12 +42,10 @@ class PokeTubeDislikesAPIManager {
|
|||||||
*/
|
*/
|
||||||
async _getEngagementData() {
|
async _getEngagementData() {
|
||||||
const apiUrl = `https://ryd-proxy.kavin.rocks/votes/${this.videoId}&hash=d0550b6e28c8f93533a569c314d5b4e2`;
|
const apiUrl = `https://ryd-proxy.kavin.rocks/votes/${this.videoId}&hash=d0550b6e28c8f93533a569c314d5b4e2`;
|
||||||
const fallbackUrl = `https://returnyoutubedislikeapi.com/votes?videoId=${this.videoId}`;
|
|
||||||
|
|
||||||
const { fetch } = await import("undici");
|
const { fetch } = await import("undici");
|
||||||
|
|
||||||
const engagement = await fetch(apiUrl).then((res) => res.json());
|
const engagement = await fetch(apiUrl).then((res) => res.json());
|
||||||
engagement.viewCount = this.videoId === "cc2-4ci4G84" ? 1406988074 : engagement.viewCount;
|
|
||||||
return engagement;
|
return engagement;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
"INNERTUBE_CONTEXT_CLIENT_NAME": "1",
|
"INNERTUBE_CONTEXT_CLIENT_NAME": "1",
|
||||||
"INNERTUBE_CONTEXT_CLIENT_VERSION": "2.20240214.05.00",
|
"INNERTUBE_CONTEXT_CLIENT_VERSION": "2.20240214.05.00",
|
||||||
"INNERTUBE_CONTEXT_GL": "US",
|
"INNERTUBE_CONTEXT_GL": "US",
|
||||||
"INNERTUBE_CONTEXT_HL": "en-US"
|
"INNERTUBE_CONTEXT_HL": "en"
|
||||||
},
|
},
|
||||||
"LATEST_ECATCHER_SERVICE_PARAMS": { "client.name": "WEB" },
|
"LATEST_ECATCHER_SERVICE_PARAMS": { "client.name": "WEB" },
|
||||||
"INNERTUBE_API_KEYS": {
|
"INNERTUBE_API_KEYS": {
|
||||||
|
|||||||