1030 Commits

Author SHA1 Message Date
ashley
10a18905ec Update html/watch.ejs 2025-05-27 02:41:59 +02:00
Ashley ////
f661ee76a9 hai 2025-05-27 02:27:31 +02:00
Ashley ////
024bea2b33 hai 2025-05-27 02:24:52 +02:00
ashley
488d98d1f1 update versions 2025-05-27 01:51:47 +02:00
ashley
9ec1a3a718 fix download pages 2025-05-27 01:47:57 +02:00
ashley
bb28ed0de6 Update html/discover.ejs 2025-05-27 01:42:09 +02:00
ashley
43c2b1111e Update html/discover.ejs 2025-05-27 01:41:09 +02:00
ashley
3f471059f8 Update html/discover.ejs 2025-05-27 01:38:30 +02:00
ashley
46dc456562 Update html/discover.ejs 2025-05-27 01:34:52 +02:00
ashley
0c346781b8 oops 2025-05-27 01:31:03 +02:00
ashley
6824df229b try 2025-05-27 01:28:19 +02:00
ashley
00749f907d Update html/discover.ejs 2025-05-27 01:23:06 +02:00
ashley
e50e7b730a Add bg 2025-05-27 01:19:30 +02:00
ashley
dcf3b20fac Update html/map.ejs 2025-04-30 21:40:49 +00:00
ashley
b91128ff11 Update html/map.ejs 2025-04-30 21:38:53 +00:00
ashley
46abf16976 Update html/map.ejs 2025-04-30 21:34:37 +00:00
ashley
f9d434903d Update html/map.ejs 2025-04-30 21:27:46 +00:00
ashley
dd5aea5304 Update html/map.ejs 2025-04-30 21:24:37 +00:00
ashley
84b92ae3ac Update html/map.ejs 2025-04-30 21:18:07 +00:00
ashley
f05f3e5b3a Update html/translate.ejs 2025-04-30 17:47:21 +00:00
ashley
b4d7b3da11 stuff 2025-04-30 17:09:01 +00:00
ashley
bb1d09ea20 oops 2025-04-30 16:36:31 +00:00
ashley
d708f964eb add stuff 2025-04-30 16:35:26 +00:00
ashley
e4da5d48d4 Update src/libpoketube/init/pages-api.js 2025-04-30 16:08:06 +00:00
ashley
ac979c3bdc Update src/libpoketube/libpoketube-core.js 2025-04-29 19:55:15 +00:00
ashley
f31ff98a0b Update src/libpoketube/libpoketube-core.js 2025-04-29 19:52:34 +00:00
ashley
cc3922ad0e Update src/libpoketube/libpoketube-core.js 2025-04-29 19:50:23 +00:00
ashley
6e1aecaeb4 Update src/libpoketube/libpoketube-core.js 2025-04-29 19:48:46 +00:00
ashley
c9e8b8f85d Update src/libpoketube/libpoketube-core.js 2025-04-29 19:47:04 +00:00
ashley
99f4d03bbb Update src/libpoketube/libpoketube-core.js 2025-04-29 19:39:14 +00:00
ashley
efd3c59df7 Update package.json 2025-04-29 19:32:33 +00:00
ashley
a5a18ba383 use youtubei 2025-04-29 19:31:18 +00:00
ashley
c531678a18 add stuff 2025-04-27 17:13:14 +00:00
ashley
c9bd527527 Update html/gamehub.ejs 2025-04-27 13:59:24 +00:00
ashley
495367eace Update html/layouts/error-video.ejs 2025-04-27 13:13:34 +00:00
ashley
547f68c882 oops 2025-04-27 12:52:28 +00:00
ashley
6268bdebfb new and improved snake 2025-04-27 12:50:08 +00:00
ashley
7527e49c9c stuff 2025-04-27 11:39:29 +00:00
ashley
7125ecc36e Update html/video-error.ejs 2025-04-27 11:12:17 +00:00
ashley
4058e8ef11 Update html/layouts/error-video.ejs 2025-04-27 11:11:49 +00:00
ashley
0527a9e52f remove 2025-04-27 11:10:19 +00:00
ashley
230d371ced fix this :3 2025-04-27 11:05:37 +00:00
ashley
4a8070e65c Update html/gamehub.ejs 2025-04-26 23:43:29 +00:00
ashley
556285a8d1 fix game 2025-04-26 23:38:32 +00:00
ashley
3076fb9393 fix stuff stuff 2025-04-26 23:36:34 +00:00
ashley
777e8522b2 Update html/gamehub.ejs 2025-04-26 23:32:25 +00:00
ashley
efe0f7d758 Update html/gamehub.ejs 2025-04-26 23:28:37 +00:00
ashley
38094732ba Update html/gamehub.ejs 2025-04-26 23:23:23 +00:00
ashley
b8ce39698a oopsie 2025-04-26 23:19:40 +00:00
ashley
4519933c9e Update html/gamehub.ejs 2025-04-26 23:16:33 +00:00
ashley
18635eca02 Update src/libpoketube/init/pages-api.js 2025-04-26 22:55:49 +00:00
ashley
2202193d23 remove unused imports 2025-04-26 22:46:59 +00:00
ashley
b1de0358a7 new stuff 2025-04-26 22:45:40 +00:00
ashley
739d64f684 Update html/watch.ejs 2025-04-26 21:57:04 +00:00
ashley
d539547fd3 Update html/watch.ejs 2025-04-26 21:54:06 +00:00
ashley
c5e67b7f05 Update html/watch.ejs 2025-04-26 21:52:43 +00:00
ashley
d31253551c Update html/partials/card.ejs 2025-04-26 21:41:55 +00:00
ashley
0f40a4a152 add replies 2025-04-26 21:37:42 +00:00
ashley
6e627b48a7 addcool stuff 2025-04-26 21:01:06 +00:00
ashley
704b7bc806 Update html/search.ejs 2025-04-23 20:55:15 +00:00
ashley
f77d5e0260 human friendly reason :3 2025-04-23 20:48:27 +00:00
ashley
5ab4cc30a5 Update html/layouts/error-video.ejs 2025-04-23 20:48:07 +00:00
ashley
afa738f8c2 Update html/search.ejs 2025-04-22 23:55:06 +00:00
ashley
3f19854798 Update html/search.ejs 2025-04-22 23:54:03 +00:00
ashley
6801889f64 Update html/search.ejs 2025-04-22 23:51:16 +00:00
ashley
ce5428eccb a 2025-04-22 23:48:28 +00:00
ashley
3f66e88dae fix stuff stuff 2025-04-22 23:42:32 +00:00
ashley
7ef352f3cb fix stuff 2025-04-22 23:39:39 +00:00
ashley
38871bba36 Update html/search.ejs 2025-04-22 23:29:48 +00:00
ashley
e755ef3f4c oops 2025-04-22 23:28:23 +00:00
ashley
64433797f3 add alot of cool stuff :3 2025-04-22 23:24:35 +00:00
ashley
3f69953875 add error here :3 2025-04-22 18:48:41 +00:00
ashley
b69b2a590e Update css/maps.js 2025-04-22 18:42:37 +00:00
ashley
3558b47301 update
Signed-off-by: ashley <iamashley@duck.com>
2025-04-19 22:53:48 +00:00
ashley
acef288683 sorry for weird formatting mobile 2025-04-19 22:47:39 +00:00
ashley
27becd05a6 test1 2025-04-08 17:24:30 +00:00
ashley
0347a9ab94 update :3 2025-04-08 16:57:17 +00:00
ashley
e775e617ed :3 2025-04-08 16:49:38 +00:00
ashley
59dd95fa39 add error here :3 2025-04-07 14:38:31 +00:00
ashley
fd1f3ea864 Update src/libpoketube/init/pages-static.js 2025-04-06 19:40:09 +00:00
ashley
310ffb643c Update src/libpoketube/init/pages-channel-and-download.js 2025-04-06 19:36:45 +00:00
ashley
4bf687b4a3 Update src/libpoketube/init/pages-channel-and-download.js 2025-04-06 19:33:16 +00:00
ashley
4acf840d80 Update src/libpoketube/init/pages-api.js 2025-04-06 19:27:37 +00:00
ashley
4b33b38e1f p2 2025-04-06 19:22:36 +00:00
ashley
7188bfdf03 Update .gitignore 2025-04-06 19:16:39 +00:00
ashley
440431abbd Update config.json.example 2025-04-06 19:16:18 +00:00
ashley
172a7175ec add useragent to config 2025-04-06 19:02:54 +00:00
ashley
b5e09f60eb add useragent : p1 2025-04-06 19:02:08 +00:00
ashley
906f7b237e Update src/libpoketube/libpoketube-dislikes.js 2025-02-16 19:08:37 +00:00
ashley
28e4ffb4eb add some cool stuff 2025-02-06 05:21:02 +00:00
ashley
9747dc7f47 new stuff 2025-02-06 05:13:47 +00:00
Ashley ////
9f1a52d840 Merge pull request 'Update README | Install Instructions and Mirrors' (#122) from Korbs/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/122
2025-02-06 04:53:37 +00:00
Korbs
461cec77b2 Update install instructiosn for Fedora/RHEL, add line for Alpine Linux 2025-01-22 06:30:28 +00:00
ashley
73278c70ee ehe 2024-12-18 21:36:22 +00:00
ashley
953ee0daaf fix stuff 2024-12-18 21:33:20 +00:00
ashley
e5e55ce26e ehe 2024-12-18 21:32:10 +00:00
ashley
5104cbc3c7 poketube.ejs ---> watch.ejs, 2024-12-18 21:15:28 +00:00
ashley
de0afd6266 poketube.ejs ---> watch.ejs 2024-12-18 21:14:17 +00:00
ashley
4c6f21c5ee fix stuff - make stuff good 2024-12-14 15:13:22 +00:00
ashley
b42ad79716 oops lmao 2024-12-09 04:02:08 +00:00
ashley
a9339ff5ae Update src/libpoketube/libpoketube-dislikes.js 2024-12-05 20:25:55 +00:00
ashley
1ff9b80fdd remove stuff 2024-11-19 17:49:04 +00:00
ashley
07bf8bc42d bump bundle version :3 2024-11-19 17:35:30 +00:00
ashley
64e258bb5b update base player 2024-11-19 17:33:35 +00:00
ashley
ad3ca4635e lol 2024-11-18 20:14:03 +00:00
ashley
1331fb4c43 add margin 2024-11-17 17:21:37 +00:00
ashley
f9c22c8bf8 aaaaaaaa 2024-11-17 17:19:28 +00:00
ashley
46a2763802 oopsie 2024-11-17 17:12:30 +00:00
ashley
49d399e388 aaaü 2024-11-17 17:07:58 +00:00
ashley
0fd7ea8849 add thumns 2024-11-17 17:00:45 +00:00
ashley
16dabbd087 oops sorry 2024-11-12 20:14:28 +00:00
ashley
a638c930cc should fix channels 2024-11-12 20:07:04 +00:00
ashley
22e804850b remove the header because it makes stuff bad 2024-11-12 09:55:28 +00:00
ashley
a28f8e2536 addcool stuff 2024-11-03 15:22:38 +00:00
ashley
d477b56af0 add config. 2024-11-03 15:16:08 +00:00
ashley
fce3396c30 oops 2024-11-03 09:59:48 +00:00
ashley
85cee23ab0 lol sorry 2024-11-02 19:03:53 +00:00
ashley
96b01e74b9 add smth 2024-11-02 19:01:26 +00:00
ashley
84fdbb5c40 fix stuff 2024-11-02 18:12:53 +00:00
ashley
7cdfdb9359 add chatbot 2024-11-02 18:08:31 +00:00
ashley
f50386a94f add license for apple 2024-10-29 13:42:32 +00:00
ashley
9e7240ecdb fix typo and add splash text!! 2024-10-28 19:25:27 +00:00
ashley
bc7ffd16e3 actually use 404 LOL 2024-10-28 19:15:11 +00:00
ashley
663cbe3cde add branding here too!! :3 2024-10-28 19:10:14 +00:00
ashley
b4264b7bf3 fix stuff - make stuff good 2024-10-28 18:59:06 +00:00
ashley
6f96374fa4 o 2024-10-28 05:17:07 +00:00
ashley
8ca00ef881 add alot of cool stuff :3 2024-10-28 04:29:07 +00:00
ashley
cad92a9ad2 add h2 2024-10-25 23:03:09 +00:00
ashley
dfe5608681 fix 2024-10-25 23:02:13 +00:00
ashley
a931643afc use set instead 2024-10-25 23:00:22 +00:00
ashley
fef0cc3edc forgor 2024-10-25 22:58:54 +00:00
ashley
faad2b4d80 oops 2024-10-25 22:57:15 +00:00
ashley
001a22e325 lol 2024-10-25 22:55:28 +00:00
ashley
9d62bb5a88 oops 2024-10-25 22:21:04 +00:00
ashley
e9d140876c test a 2024-10-25 22:18:39 +00:00
ashley
36b447ed3a add stuff :3 2024-10-24 20:35:52 +00:00
ashley
c06c1ddb0e rtyhrgdg sorry again 2024-10-24 19:55:19 +00:00
ashley
78b42e1de4 REFDGHFDG AM STUPID 2024-10-24 19:54:54 +00:00
ashley
b997f4a9ba oops 2024-10-24 19:53:34 +00:00
ashley
6fcc6e0b40 oops 2024-10-24 19:51:14 +00:00
ashley
aff56b1e10 Update html/layouts/error-video.ejs 2024-10-24 19:46:28 +00:00
ashley
610d58390d bump bundle version :3 2024-10-24 19:42:55 +00:00
ashley
5b9da606fd add limit speed cpu 2024-10-24 19:41:07 +00:00
ashley
bbc27dc37f add alot of cool stuff :3 2024-10-24 19:39:53 +00:00
ashley
d622ed4f38 add a better reason :3 2024-10-24 19:36:04 +00:00
ashley
ae1ef1f057 add alot of cool stuff :3 2024-10-24 19:33:40 +00:00
ashley
4adf09b4c9 :3 2024-10-24 19:23:14 +00:00
ashley
38a7d7c3af a 2024-10-24 14:10:14 +00:00
ashley
b601d2354e sorry 2024-10-24 14:09:30 +00:00
ashley
7ed5e35be8 lol 2024-10-24 14:06:58 +00:00
ashley
60f4c2adfa a 2024-10-24 14:04:12 +00:00
ashley
edb1f1a4c8 test a 2024-10-24 14:00:28 +00:00
ashley
3872e7cb64 oops 2024-10-24 13:55:49 +00:00
ashley
1cde1c23ef test 2024-10-24 13:47:30 +00:00
ashley
de98d86101 oops :p 2024-10-23 17:15:59 +00:00
ashley
a0191ae39a make it 500 lol 2024-10-23 15:39:37 +00:00
ashley
9a9d00e73f add 502 2024-10-23 15:35:52 +00:00
ashley
2fd11f9679 :p 2024-10-23 15:33:17 +00:00
ashley
fca41df817 add video-title lol 2024-10-23 15:30:59 +00:00
ashley
35d175e2d5 fix css 2024-10-23 15:30:08 +00:00
ashley
5a476089b4 lol 2024-10-23 15:22:07 +00:00
ashley
bcd634e683 add license 2024-10-23 15:02:39 +00:00
ashley
e3b68cb658 add stuff :3 2024-10-22 13:54:47 +00:00
ashley
4827e9c626 bump version :3 2024-10-21 20:07:36 +00:00
ashley
9b4660da5c oops sorry 2024-10-21 20:07:06 +00:00
ashley
002ca6a4b4 bump version!! :3 2024-10-21 20:06:23 +00:00
ashley
f2c9a99245 bump version :3 2024-10-21 20:05:49 +00:00
ashley
8a10da5a24 bump version :3 2024-10-21 20:05:08 +00:00
ashley
d94933dd25 Update css/yt-ukraine.svg 2024-10-21 19:59:39 +00:00
ashley
69decd0db9 lol 2024-10-21 18:41:54 +00:00
ashley
f871564712 new color stuff :3 2024-10-21 18:41:18 +00:00
ashley
981d23bc4a add stuff :3 2024-10-21 18:38:37 +00:00
ashley
42feec4d78 Update html/poketube.ejs 2024-10-20 20:44:35 +00:00
ashley
373b915a79 add a br 2024-10-20 20:41:46 +00:00
ashley
b94a57d1fa awa 2024-10-20 20:40:05 +00:00
ashley
3f323d5d40 bump bundle version :3 2024-10-20 20:36:13 +00:00
ashley
c0d847250a cool stuff :3 2024-10-20 20:35:11 +00:00
ashley
df4d228861 alot fof cool stuff 2024-10-20 20:34:01 +00:00
ashley
8228907bfe cool stuff 2024-10-20 18:37:42 +00:00
ashley
1462834ad2 test 2024-10-20 18:12:10 +00:00
ashley
82b141717d cool stuff 2024-10-20 17:58:27 +00:00
ashley
53b75a10fb add alot of cool stuff 2024-10-20 17:53:07 +00:00
ashley
65219997c9 add license 2024-10-20 09:15:16 +00:00
ashley
1fae26c530 add the timer 2024-10-20 09:14:34 +00:00
ashley
2c4f30a813 remove spaces lol 2024-10-20 09:13:48 +00:00
ashley
4fc34f1a4f Add backend-services/services/yt-block-protect.service 2024-10-20 09:13:31 +00:00
ashley
d8e56cf530 Add backend-services/scripts/inv-restart-docker.sh 2024-10-20 09:12:36 +00:00
ashley
4314ae9b01 add refresh token 2024-10-20 09:10:10 +00:00
ashley
cd6eac25a8 Add backend-services/README.md 2024-10-20 09:09:04 +00:00
ashley
3796095cbb make ratelimit more 2024-10-19 19:13:47 +00:00
ashley
d8f93dedd1 change logo lol 2024-10-19 15:01:12 +00:00
ashley
aeddb5e612 Update html/download.ejs 2024-10-19 14:58:57 +00:00
ashley
a298fd5e4a Update css/chatgptlogo.svg 2024-10-19 12:41:02 +00:00
ashley
2702071e11 Update css/chatgptlogo.svg 2024-10-19 12:36:05 +00:00
ashley
ebb1bf369b Add css/chatgptlogo.svg 2024-10-19 12:35:37 +00:00
ashley
53cb8665ff add ask gpt 2024-10-19 12:20:37 +00:00
ashley
4e4dee2879 remove 2024-10-18 18:23:47 +00:00
ashley
7e98929101 Update README.md 2024-10-17 19:08:38 +00:00
ashley
19f43779b1 test a 2024-10-17 18:22:30 +00:00
ashley
ffab316b42 add stuff 2024-10-17 18:07:18 +00:00
ashley
e0e0200568 stuff fixes 2024-10-17 18:04:09 +00:00
ashley
c393cd3ca7 a 2024-10-17 17:59:39 +00:00
ashley
2e763de66b hm 2024-10-17 17:59:00 +00:00
ashley
b0e760325f test 2024-10-17 17:57:19 +00:00
ashley
d2bcde4944 add stuff 2024-10-17 17:55:11 +00:00
ashley
d6e35c5aa3 refresh lol 2024-10-12 13:53:44 +00:00
ashley
c21f028786 Update html/video-error.ejs 2024-10-12 13:52:48 +00:00
ashley
fec30d4d92 add fetchWithRetry 2024-10-12 10:16:58 +00:00
ashley
737da26f6f Update README.md 2024-10-11 15:19:28 +00:00
ashley
5ad8f63563 Update docker-compose.yml 2024-10-11 15:15:21 +00:00
ashley
0b0aa6326c add new splashes ehe 2024-10-09 19:36:25 +00:00
ashley
b742f91764 oops 2024-10-06 20:42:57 +00:00
ashley
67a98c9d5d add share button :3 2024-10-06 20:35:11 +00:00
ashley
f207ea4998 awa 2024-10-06 12:42:56 +00:00
ashley
8b5d3fa0cc last update trust 2024-10-06 12:36:10 +00:00
ashley
e7d3b07130 ehe 2024-10-06 12:34:46 +00:00
ashley
0cd5c523f9 sorry qwq 2024-10-06 12:30:55 +00:00
ashley
28dd44c91e wawa 2024-10-06 12:28:21 +00:00
ashley
93f3efdb3e add this ehe 2024-10-06 12:23:17 +00:00
ashley
df6bfafedb add gif 2024-10-06 12:21:57 +00:00
Ashley ////
8b0134bb11 Merge pull request 'Update instances.json' (#119) from Binzy_Boi/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/119
2024-10-05 20:32:37 +00:00
Binzy_Boi
af49f2c4ae Merge branch 'main' into main 2024-10-05 20:30:18 +00:00
Binzy_Boi
f9199b1d5d Update instances.json
Removed ashley0143 instance
2024-10-05 20:28:04 +00:00
Binzy_Boi
b783cfaab1 Update instances.json 2024-10-05 16:34:47 +00:00
Binzy_Boi
2be1cf2d95 Update instances.json
Removing alphexo.dev instance, as it is no longer online.
2024-10-05 15:21:36 +00:00
ashley
c930e55c46 fix goober bug 2024-10-04 19:39:11 +00:00
ashley
72fe45cb9e stuff :3 2024-10-04 19:33:00 +00:00
ashley
3635d37245 stuff :3 2024-10-04 19:30:20 +00:00
ashley
c91b1423a4 test2 2024-10-04 19:15:11 +00:00
ashley
7f9933ae16 update css stuff :3 2024-10-04 19:07:49 +00:00
ashley
e4f33378bd css stuff 2024-10-04 16:42:55 +00:00
ashley
d4c24d7241 responsive stuff 2024-10-04 15:24:28 +00:00
ashley
1403c2ab24 sorry qwq 2024-10-04 15:18:45 +00:00
ashley
7d8b4945d3 add month stuff 2024-10-04 15:15:48 +00:00
ashley
6a9f35dae1 p 2024-10-04 14:59:06 +00:00
ashley
2aa943f141 awa 2024-10-04 14:58:35 +00:00
ashley
06d1770c0e work 2024-10-04 14:54:44 +00:00
ashley
3ddc1e072d pls work 2024-10-04 14:52:57 +00:00
ashley
0a35ab0cf0 stuff stuff 2024-10-04 14:51:31 +00:00
ashley
9cdc85ca91 :3 2024-10-04 14:48:10 +00:00
ashley
3c2564f170 silly 2024-10-04 14:45:23 +00:00
ashley
786704bcde make it months instead wawa :3 2024-10-04 14:43:35 +00:00
ashley
27ae6acc87 woaw stuff 2024-10-04 14:42:22 +00:00
ashley
d5dd9303b8 Update html/calendar.ejs 2024-10-04 14:35:33 +00:00
ashley
3e75a28a12 cool stuff 2024-10-04 14:33:46 +00:00
ashley
5d9880304a cool stuff 2024-10-04 14:27:08 +00:00
Binzy_Boi
ed06fcb92c Update instances.json
This change does the following:

* Removes offline instances
* Corrects URL of existing instance
* Adds new instance hosted in Poland
* Changes typos of "lastest" to "latest"
* Renames "uri" fields to "url"
* Changes one mention of "PokeTube" to "Poke"
2024-10-04 03:30:22 +00:00
ashley
2d78a1a7f6 update some stuff :3 2024-10-03 19:05:39 +00:00
ashley
4e8af0337a bump version!! :3 2024-10-02 19:52:21 +00:00
ashley
ddbb533e6d add formats lol 2024-10-02 19:51:24 +00:00
ashley
c1faf2bbcd bump bundle version :3 2024-10-02 19:26:06 +00:00
ashley
8e6cade155 add alot of stuff :3 2024-10-02 19:24:41 +00:00
ashley
59b746fd1c fix download yayaya 2024-10-02 18:35:52 +00:00
ashley
4b1765757f Update config.json 2024-09-28 17:48:22 +00:00
ashley
5bb5dacd30 bump 2024-09-28 13:19:35 +00:00
ashley
f5f88fe072 stuff stuff 2024-09-28 13:19:14 +00:00
ashley
b4d566f41f Update config.json 2024-09-27 04:19:24 +00:00
ashley
038b44cf98 Update config.json 2024-09-26 18:29:45 +00:00
ashley
8d3d4961e5 lol 2024-09-26 17:58:48 +00:00
ashley
4a821d700d test a 2024-09-26 17:56:50 +00:00
ashley
1df1b8af2d raah korea 2024-09-25 18:49:24 +00:00
ashley
fa8038f001 test c 2024-09-25 18:40:28 +00:00
ashley
9de47441af test commit tbh 2024-09-25 18:38:16 +00:00
ashley
76a6f4b101 hehe 2024-09-25 14:18:38 +00:00
ashley
1a19f51072 bwa 2024-09-25 14:16:53 +00:00
Ashley ////
4bb8d742da fix stuff 2024-09-25 09:10:32 +00:00
ashley
c92caf80c5 bwa 2024-09-25 04:32:53 +00:00
ashley
f5e98c8fe2 bwa 2024-09-24 20:35:00 +00:00
ashley
4a6c62f68b add canplay 2024-09-24 20:30:39 +00:00
ashley
e1be2a6979 Update html/poketube.ejs 2024-09-24 19:49:04 +00:00
ashley
98f80c3ced bwa 2024-09-24 19:46:25 +00:00
ashley
4a55d5c92c awa 2024-09-24 19:37:44 +00:00
ashley
adc02ed151 test 1 2024-09-24 19:31:18 +00:00
ashley
00a7738a1d ehe 2024-09-24 18:46:11 +00:00
ashley
5bf3da0dc0 add syuff 2024-09-24 18:33:10 +00:00
ashley
4c2001ceee usa proxy 2 : electric boogallo 2024-09-24 15:12:26 +00:00
ashley
0082765bf6 add stuff 2024-09-24 13:48:22 +00:00
ashley
2008aabb74 lol 2024-09-23 13:20:16 +00:00
ashley
c33916b5db add qucik escape 2024-09-23 13:16:27 +00:00
ashley
3cee9ae5b5 awa 2024-09-22 11:15:54 +00:00
ashley
cf6420cde1 use usa 2 now 2024-09-22 11:15:38 +00:00
ashley
dc66c4582f add banner config 2024-09-21 16:03:15 +00:00
ashley
48c00ce59f add banner 2024-09-21 16:00:23 +00:00
ashley
e9c9cac4fd Update config.json 2024-09-21 15:57:10 +00:00
ashley
75d05d3c85 log it 2024-09-21 09:17:36 +00:00
ashley
2941fa7b86 remoev 2024-09-21 05:06:43 +00:00
ashley
308518f6cd Update html/poketube.ejs 2024-09-20 22:19:07 +00:00
ashley
2e02fd3e23 test 2024-09-20 22:15:34 +00:00
ashley
8bd284f67e use eu 2024-09-20 04:18:27 +00:00
ashley
5887f05fe6 qwq 2024-09-19 19:15:54 +00:00
ashley
0183286bb2 sorry qwq 2024-09-19 19:11:21 +00:00
ashley
0f54d186d1 add mastodon qwq 2024-09-19 19:09:03 +00:00
ashley
6cb5ea0ba1 hostname qwq 2024-09-19 19:03:11 +00:00
ashley
ae06025b0e < 2024-09-18 17:03:01 +00:00
ashley
8b596806a5 pol1 moment 2024-09-18 17:01:01 +00:00
ashley
bda8921b34 stuff 2024-09-18 16:01:07 +00:00
ashley
e5bf497462 lol 2024-09-18 14:47:17 +00:00
ashley
3612e5e837 bump version!! :3 2024-09-17 18:18:16 +00:00
ashley
96ece4f570 add annations 2024-09-17 18:16:22 +00:00
ashley
727a6a6727 do the thing 2024-09-16 20:24:10 +00:00
ashley
db26363c95 add this lol 2024-09-16 19:40:16 +00:00
ashley
50eaf51c5f qwq 2024-09-16 14:13:55 +00:00
Ashley ////
5727480778 fix url 2024-09-16 09:04:43 +00:00
Ashley ////
4d1080fcd2 remove old url 2024-09-16 09:03:21 +00:00
Ashley ////
1f457865df fix url 2024-09-16 09:01:49 +00:00
ashley
a2177f2c3d awa 2024-09-15 12:49:53 +00:00
ashley
6692cc525b fix stuff 2024-09-15 12:44:39 +00:00
ashley
5a486263e1 awa 2024-09-15 12:10:55 +00:00
ashley
0c628a9cd0 add invite here qwq 2024-09-15 12:10:20 +00:00
ashley
809a0d57c9 lol 2024-09-15 12:08:56 +00:00
ashley
750dc09ef6 add reason for fail 2024-09-15 12:08:28 +00:00
ashley
56fa4b8993 fix css :3 2024-09-14 22:05:46 +00:00
ashley
aea2181389 add other url 2024-09-14 22:03:23 +00:00
ashley
bb8c50df8e add notice here 2024-09-14 21:43:39 +00:00
ashley
1ce1ae5837 use korea 2024-09-14 16:15:33 +00:00
ashley
4e2f1b052e use eu proxy instead 2024-09-14 15:26:16 +00:00
ashley
f5c31e24a9 add kr proxy instead 2024-09-14 09:20:42 +00:00
ashley
9d8de3d898 bwaa 2024-09-14 07:30:18 +00:00
ashley
5dc6a9e435 remove suggesttions for now ig 2024-09-14 07:20:13 +00:00
ashley
a771300e84 u dont need this 😭
see https://codeberg.org/ashley/poke/src/branch/main/src/libpoketube/init/pages-static.js#L160 oh my god.............
2024-09-12 19:52:41 +00:00
ashley
c2a693abb2 awa 2024-09-11 20:26:25 +00:00
ashley
ba73e43725 add new stuff :3 2024-09-11 20:24:49 +00:00
ashley
2f0da0e6cc add video error layour :3 2024-09-11 20:22:54 +00:00
ashley
0c033002d4 add video time :4 2024-09-11 20:02:56 +00:00
ashley
0956a9b66e url change 2024-09-11 19:19:12 +00:00
ashley
bf2af710c3 add refresh here :3 2024-09-11 16:19:42 +00:00
ashley
e59d1c0e1c :p 2024-09-11 15:54:26 +00:00
ashley
878cca2760 wa 2024-09-11 15:52:42 +00:00
ashley
6ffcbb1683 oops 2024-09-11 15:51:34 +00:00
ashley
49de19ca5f add err here 2024-09-11 15:48:32 +00:00
ashley
c2682cdeac add video error 2024-09-11 15:47:36 +00:00
ashley
feb3242638 add cool stuff :3 2024-09-08 00:02:27 +00:00
ashley
b25841a667 add cpu warning 2024-09-07 23:56:41 +00:00
ashley
fdb2c1d12e return 404 if errors 2024-09-07 12:54:03 +00:00
ashley
d477c04ce4 Update src/libpoketube/init/pages-video.js 2024-09-07 12:51:27 +00:00
ashley
9f1cbd77d8 test b 2024-09-07 12:50:37 +00:00
ashley
aa3de021c7 Update src/libpoketube/init/pages-video.js 2024-09-07 12:47:55 +00:00
ashley
54b92b1e29 a 2024-09-07 12:46:11 +00:00
ashley
93898da514 Update src/libpoketube/init/pages-video.js 2024-09-07 12:43:01 +00:00
ashley
f3a5c690e3 test a 2024-09-07 12:39:25 +00:00
ashley
75affcf7c7 lol 2 2024-09-07 10:56:28 +00:00
ashley
4000c2d5ad lol 2024-09-07 10:56:07 +00:00
ashley
43581eaa59 fix bug :3 2024-09-06 03:44:03 +00:00
ashley
442ae884a3 Update src/libpoketube/libpoketube-dislikes.js 2024-09-05 22:53:56 +00:00
ashley
a4223a2772 new url 2024-09-05 22:51:32 +00:00
ashley
670343d2ff change url 2024-09-05 22:50:54 +00:00
ashley
38dec52081 move up code.lgbt 2024-09-05 19:59:06 +00:00
Ashley ////
f792fe9172 Merge pull request 'add: code.lgbt as an unofficial mirror' (#116) from ryanamay/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/116
2024-09-05 19:23:31 +00:00
ryanamay
d66d6fc0ff add: code.lgbt an an unofficial mirror 2024-09-05 19:20:15 +00:00
ashley
d7ca2fd473 add alot of quality of life improvements!! 2024-09-04 12:02:38 +00:00
ashley
9665d8c79f add new banned channels 2024-09-02 23:13:16 +00:00
ashley
79ce4dc835 bump version - move location 2024-09-02 22:32:00 +00:00
ashley
102ba2b9be add window.pokeplayer object :3 2024-09-02 22:31:03 +00:00
ashley
1a6accc21b Update html/channel.ejs 2024-09-02 22:19:24 +00:00
ashley
b86af7ec97 Update html/search.ejs 2024-09-02 22:18:56 +00:00
nin0dev
8d59e75054 Update issue_template/player-bug.yml 2024-09-02 18:49:28 +00:00
ashley
2f56a1cc9a Update html/poketube.ejs 2024-09-02 13:21:40 +00:00
ashley
9602febccb aaaaa sorry 2024-09-02 13:20:16 +00:00
ashley
ae7ad7bb31 add href here :3 2024-09-02 12:39:52 +00:00
ashley
a6961fb849 Update html/search.ejs 2024-09-02 10:56:14 +00:00
ashley
4a0513ff53 Update html/search.ejs 2024-09-02 10:55:32 +00:00
ashley
6cc78e33d3 Update html/search.ejs 2024-09-02 10:53:04 +00:00
ashley
09ddd96d95 oopsies 2024-09-02 10:52:29 +00:00
ashley
12be559b2f add a lil guy 2024-09-02 10:51:39 +00:00
ashley
9d5a3db53a change api url :3 2024-09-01 23:57:26 +00:00
ashley
bdca2bc4c6 Update html/poketube.ejs 2024-09-01 23:55:57 +00:00
ashley
e2388890a8 Update html/poketube.ejs 2024-09-01 23:54:20 +00:00
ashley
70f02e3162 add no tags 2024-09-01 23:49:45 +00:00
ashley
f30f724bac make it lowercase 2024-09-01 23:02:16 +00:00
ashley
93da9b7078 a 2024-09-01 22:48:38 +00:00
ashley
5f7321e96d doesnt work revert 2024-09-01 22:48:23 +00:00
ashley
134a9d9e0e bump bundle version :3 2024-09-01 22:44:39 +00:00
ashley
61428f2c5d double-click 2024-09-01 22:43:07 +00:00
ashley
524715b393 oopsies 2024-09-01 22:19:41 +00:00
ashley
eccd7ded4c add translate 2024-09-01 22:17:31 +00:00
ashley
3956897066 add ?. 2024-09-01 22:14:27 +00:00
ashley
8f5d7de44d fix stuff 2024-09-01 21:36:43 +00:00
ashley
0d08532765 fix css stuff 2024-09-01 21:35:31 +00:00
ashley
e90976a2a4 a 2024-09-01 21:33:33 +00:00
ashley
62702ef128 final commmit hopefull 2024-09-01 21:30:56 +00:00
ashley
deedb165e7 add a div 2024-09-01 21:26:34 +00:00
ashley
be66d1aafc move 2024-09-01 21:23:49 +00:00
ashley
a2fd10382b test 2 2024-09-01 21:22:27 +00:00
ashley
77be7688e5 1 a 2024-09-01 21:20:33 +00:00
ashley
58405cfeaf change poster quality 2024-09-01 20:14:39 +00:00
ashley
0898586a70 bwa 2024-08-31 15:58:41 +00:00
ashley
bb95c21a78 ehe 2024-08-31 12:47:02 +00:00
ashley
690f6eaf94 add no id warning 2024-08-31 12:45:50 +00:00
ashley
4a9f666624 add "userScore" 2024-08-31 12:36:18 +00:00
ashley
eb7f0e6019 api changes 2024-08-31 12:30:22 +00:00
ashley
79ba510788 test 1 2024-08-31 12:16:20 +00:00
ashley
f97b582260 add t flag 2024-08-31 11:22:01 +00:00
ashley
2bfdb92de1 change url 2024-08-31 10:35:22 +00:00
ashley
211d0f6305 oops 2024-08-30 22:23:06 +00:00
ashley
bfa34ebe74 fix twitter logo 2024-08-30 22:21:19 +00:00
ashley
d74c9cb2e0 add twitter logo 2024-08-30 22:18:42 +00:00
ashley
d1aca04dfb make it 24h 2024-08-30 12:01:24 +00:00
ashley
9183634701 Update html/landing.ejs 2024-08-30 01:53:10 +00:00
ashley
2d6ccb5cf6 Update html/gamehub.ejs 2024-08-30 01:52:27 +00:00
ashley
c0bb5d7179 Update html/channel.ejs 2024-08-30 01:51:34 +00:00
ashley
c3f1f485e8 Update html/download.ejs 2024-08-30 01:48:39 +00:00
ashley
8069c21f94 :p 2024-08-30 01:47:48 +00:00
ashley
291f4eed43 stuff p1 2024-08-30 01:46:57 +00:00
Korbs
5aca984206 Update README.md 2024-08-29 19:44:46 +00:00
nin0dev
97d706f60b changed nin0git sync duration to 10m 2024-08-29 17:29:37 +00:00
ashley
df50735df7 remove this div :3 2024-08-29 10:34:07 +00:00
ashley
7df849531e :p 2024-08-29 09:59:31 +00:00
ashley
9b9f42837a new stuff :3 2024-08-29 09:56:33 +00:00
ashley
2c9b109c74 Update html/poketube.ejs 2024-08-28 21:27:01 +00:00
ashley
fbbf9a46db fix typo 2024-08-28 21:04:38 +00:00
ashley
450b3900eb add nin0git 2024-08-28 21:02:57 +00:00
ashley
9cfdfde9a9 h 2024-08-28 20:56:23 +00:00
ashley
03fb903de7 add git.lgbt mirror 2024-08-28 19:17:34 +00:00
ashley
f20efd8b16 add DisablePokeChan :3 2024-08-28 17:40:18 +00:00
ashley
055e64ba5d add DisablePokeChan :3 2024-08-28 17:38:39 +00:00
ashley
513e028a73 remove unneeded stuff :3 2024-08-28 17:28:43 +00:00
ashley
8d3e3ff5fc fix typo 2024-08-28 14:57:24 +00:00
ashley
d5e5c49f38 fix stuff :3 2024-08-28 14:53:03 +00:00
ashley
ac408b3dfa lol 2024-08-28 14:47:08 +00:00
ashley
97eee7f1e3 fix this :3 2024-08-28 14:44:41 +00:00
ashley
73d728650b add the discover button :3 2024-08-28 14:23:31 +00:00
ashley
23ab483a7d add spacing ehe 2024-08-28 08:21:23 +00:00
ashley
d66de07e20 fix stuff 2024-08-28 08:20:21 +00:00
ashley
6a73db8ab3 nop 2024-08-28 08:19:11 +00:00
ashley
7b61bb3b4e add comment count :3 2024-08-28 08:17:14 +00:00
ashley
fb9f5a5cd4 Update html/poketube.ejs 2024-08-27 23:16:33 +00:00
ashley
b828caa86e Update html/poketube.ejs 2024-08-27 23:15:01 +00:00
ashley
d01a34f9b5 awa 2024-08-27 23:11:07 +00:00
ashley
1370c899fa awa 2024-08-27 23:08:56 +00:00
ashley
9e3eeb277e test 4 2024-08-27 22:58:25 +00:00
ashley
cb67431323 test 3 2024-08-27 22:55:15 +00:00
ashley
c3b0209489 awa 2024-08-27 22:47:46 +00:00
ashley
9e5dd4f5f1 test commit 1 2024-08-27 22:43:57 +00:00
ashley
1642b99e1b add to here 2024-08-27 22:19:12 +00:00
ashley
bf7073597c Add css/player-base.js 2024-08-27 22:18:13 +00:00
ashley
ab61946366 ehe 2024-08-27 22:15:05 +00:00
ashley
587132d85a stuff 2024-08-27 22:07:53 +00:00
ashley
8d62e93d50 :p 2024-08-27 22:06:12 +00:00
ashley
4d0a66bcbd bwa 2024-08-27 22:03:21 +00:00
ashley
13b34adc6b css is homofobic 2024-08-27 22:01:52 +00:00
ashley
3e0af4d807 add blur optimization :3 2024-08-27 21:46:33 +00:00
ashley
86be21db2c bump version!! :3 2024-08-27 21:35:59 +00:00
ashley
76e90c109e add blur optimization :3 2024-08-27 21:35:35 +00:00
ashley
5b7ed14da8 add blur optimization :3 2024-08-27 21:32:47 +00:00
ashley
78802224c5 lol 2024-08-27 17:07:40 +00:00
ashley
9278f62c3b optimize stuff 2024-08-27 16:35:31 +00:00
ashley
31933b9199 oops 2024-08-27 09:58:11 +00:00
ashley
780963cbbe add the thing 2024-08-27 09:55:58 +00:00
ashley
f124787087 gwa 2024-08-26 20:56:09 +00:00
ashley
d648f1242b remove unneeded stuff :3 2024-08-26 15:24:23 +00:00
ashley
8c0332cbd5 improvments 2024-08-26 09:17:48 +00:00
ashley
dcaa51a303 awa 2024-08-24 00:13:56 +00:00
ashley
6b1a1008ea oops 2024-08-24 00:11:11 +00:00
ashley
a215c19082 test ignore 2024-08-23 23:12:41 +00:00
ashley
3b9cff1c24 Update src/libpoketube/init/pages-api.js 2024-08-23 22:39:47 +00:00
ashley
c2866de248 fix brainrot stuff 2024-08-22 21:24:02 +00:00
ashley
5e982b7301 i am le stupid and this is my message 2024-08-21 20:20:41 +00:00
ashley
9901c091bc Update src/libpoketube/init/pages-api.js 2024-08-21 13:10:52 +00:00
ashley
28767cb850 oops lol 2024-08-21 12:54:21 +00:00
ashley
599b5cac54 change api url :3 2024-08-21 12:24:34 +00:00
ashley
acb2cd0db3 remove censorship :3 2024-08-21 12:22:40 +00:00
Ashley ////
37745ccd05 Merge pull request 'main' (#115) from Shavix/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/115
2024-08-21 10:04:30 +00:00
Shavix
24810b4cfe add letter "n" to fix a grammar mistake lol 2024-08-21 09:54:05 +00:00
Shavix
6bf345e94f update margin-bottom in the comment section
this fixes the "Go To Top" almost overlapping a bit with another text when there are no comments under a video.
2024-08-21 09:52:13 +00:00
ashley
8a67797707 Update src/libpoketube/init/pages-channel-and-download.js 2024-08-20 22:39:42 +00:00
ashley
1ce1bfa7aa lol 2024-08-20 22:37:46 +00:00
ashley
df04819b26 Update html/channel.ejs 2024-08-20 22:14:03 +00:00
ashley
49cf22446c lol 2024-08-20 21:49:49 +00:00
ashley
36f750fd11 lol 2024-08-20 21:46:41 +00:00
ashley
11c3e561e9 ehe 2024-08-20 19:36:35 +00:00
ashley
4f901e602a Update html/poketube.ejs 2024-08-19 22:18:23 +00:00
ashley
ad28847a67 test commit ignore pls 2024-08-19 22:12:04 +00:00
ashley
db151c1ec2 Update html/poketube.ejs 2024-08-19 22:05:55 +00:00
ashley
18785ff8c7 :3 2024-08-19 16:04:37 +00:00
ashley
adecc668f1 add more splash texts :3 2024-08-18 21:19:31 +00:00
ashley
8d43e65e5b bwa 2024-08-18 13:48:27 +00:00
ashley
826e4dfc1a try 500 2024-08-18 13:41:53 +00:00
ashley
7be4184ac0 stuff 2024-08-17 22:43:22 +00:00
ashley
3dad202d86 lol 2024-08-17 22:39:09 +00:00
ashley
2ad1df61a8 remove plugin 2024-08-17 20:04:21 +00:00
ashley
2fd231f1d9 propaganda --> disinformation 2024-08-17 19:22:42 +00:00
ashley
47009054da oops 2024-08-17 19:19:33 +00:00
ashley
1db888809c Update src/libpoketube/init/pages-channel-and-download.js 2024-08-17 19:18:25 +00:00
ashley
0b8f307632 . 2024-08-17 19:17:42 +00:00
ashley
f74efd2db0 Update src/libpoketube/init/pages-channel-and-download.js 2024-08-17 19:16:43 +00:00
ashley
c53d1a57c9 Update src/libpoketube/init/pages-channel-and-download.js 2024-08-17 19:13:24 +00:00
ashley
9c77e01076 add banned channels :3 2024-08-17 18:40:21 +00:00
ashley
05b753c210 make the css gud :3 2024-08-15 11:21:02 +00:00
ashley
e9fbc65755 Update html/channel.ejs 2024-08-15 11:11:12 +00:00
ashley
b17f7f9548 Update html/channel.ejs 2024-08-15 10:55:36 +00:00
ashley
70254d8965 test smth 2024-08-15 10:46:11 +00:00
ashley
d3d6f6a91c make it segfault :blobcatcozy: 2024-08-12 08:21:42 +00:00
ashley
83f24de9dd Update html/poketube.ejs 2024-08-11 09:29:58 +00:00
ashley
7849af14f6 remove enableModifiersForNumbers 2024-08-11 09:29:36 +00:00
ashley
872ba191b3 Update html/poketube.ejs 2024-08-11 09:22:48 +00:00
ashley
93243ed7db Update html/poketube.ejs 2024-08-11 09:21:23 +00:00
ashley
79b209fabe Update html/poketube.ejs 2024-08-11 09:18:20 +00:00
ashley
ffa846d96d Update html/poketube.ejs 2024-08-11 08:27:51 +00:00
ashley
6ca3d6a716 Update html/poketube.ejs 2024-08-11 08:25:47 +00:00
ashley
3eba5ec6f5 use video instead lol 2024-08-11 08:24:28 +00:00
ashley
455d93b15b oops 2024-08-11 08:22:40 +00:00
ashley
0e1d3b2961 try this :3 2024-08-11 08:21:27 +00:00
ashley
be142c3695 gwa 2024-08-11 08:07:39 +00:00
ashley
55cdded315 remove for nome 2024-08-11 08:06:16 +00:00
ashley
50f0345f91 use iytimg 2024-08-10 19:24:42 +00:00
ashley
20d6128206 Update src/libpoketube/libpoketube-core.js 2024-08-10 18:47:10 +00:00
ashley
a60ce8a9d9 try this
Signed-off-by: ashley <iamashley@duck.com>
2024-08-10 18:43:50 +00:00
ashley
90f5f08160 bump bundle version :3 2024-08-10 17:52:22 +00:00
ashley
13b28550e9 re-license :3 2024-08-10 17:51:42 +00:00
ashley
819533f0a2 awa 2024-08-09 15:01:34 +00:00
ashley
4c00425f66 fix stuff :3 2024-08-09 14:58:20 +00:00
ashley
ed2620e44f Update html/poketube.ejs 2024-08-09 13:28:17 +00:00
ashley
4006cf9c93 bwa 2024-08-09 13:26:54 +00:00
ashley
4a94d4b290 .. 2024-08-09 13:25:44 +00:00
ashley
5f5fe6d555 bwa 2024-08-09 13:23:43 +00:00
ashley
e410bdc95a Update html/poketube.ejs 2024-08-09 13:19:10 +00:00
ashley
8badc1dab5 bump bundle version :3 2024-08-09 13:15:47 +00:00
ashley
2eb634d12e remove unneeded stuff :3 2024-08-09 13:14:52 +00:00
ashley
3b6c9789f9 add vjs version 2024-08-09 11:54:50 +00:00
ashley
cd811ba381 fix audio :3 2024-08-09 11:54:21 +00:00
ashley
f183ee0c18 bump bundle version :3 2024-08-09 11:48:29 +00:00
ashley
7019791f44 ehe 2024-08-09 11:34:00 +00:00
ashley
12604c4a46 Update html/poketube.ejs 2024-08-09 11:10:54 +00:00
ashley
430d27d303 add videojs-plugin-hotkeys.js 2024-08-09 11:08:42 +00:00
ashley
0a415383a9 add videojs-hotkeys 2024-08-09 11:06:29 +00:00
ashley
0a29a4de21 add threads :3 2024-08-08 22:33:49 +00:00
ashley
4f3ae7ca61 add threads :3 2024-08-08 22:32:05 +00:00
ashley
b2d5f7ef05 X --> twitter :blobcatcozy: 2024-08-08 22:00:40 +00:00
ashley
4fc92bb6bd sorry qwq 2024-08-07 11:07:13 +00:00
ashley
d8bf3d83df Update html/search.ejs 2024-08-07 11:00:47 +00:00
ashley
aba0ca0986 bwa 2024-08-07 10:56:19 +00:00
ashley
9bd369b553 stuff :3 2024-08-07 10:52:40 +00:00
ashley
5fe05620cc Update html/search.ejs 2024-08-07 10:22:33 +00:00
ashley
9275d6cfe8 :3 2024-08-07 10:20:54 +00:00
ashley
7dc7180870 makeadd compliments :3 2024-08-07 10:12:48 +00:00
ashley
5fc2a56b17 ehe 2024-08-06 19:53:18 +00:00
ashley
73ad994113 ehe ^_^ 2024-08-05 22:55:15 +00:00
ashley
e0d9a74907 solve racism 2024-08-05 18:36:59 +00:00
ashley
0f6f9d4ee8 idk what to commit name so umm use vencord ig https://vencord.dev ^_^ 2024-08-05 18:33:32 +00:00
ashley
92fd9c8f0f add media control stuff :3 2024-08-05 17:43:18 +00:00
ashley
84057e8649 twenyone 2024-08-05 10:39:25 +00:00
ashley
00e8afb72e change classname 2024-08-05 06:31:57 +00:00
ashley
50475cc654 nwaa 2024-08-05 05:27:16 +00:00
ashley
c1a77f2076 bundle 2024-08-05 05:23:57 +00:00
ashley
47fa155aa7 bump bundle version :3 2024-08-05 05:12:18 +00:00
ashley
ee73dd6770 add vjs to here :3 2024-08-05 05:10:54 +00:00
ashley
8da7fd6030 fix stuff :3 2024-08-04 20:34:11 +00:00
ashley
653de060c5 sorry 2024-08-04 20:25:28 +00:00
ashley
f204c94415 upsell test 2024-08-04 20:23:19 +00:00
ashley
d1d83c2dea ehe 2024-08-04 19:38:06 +00:00
ashley
cfd9e0636f add questions n stuff 2024-08-04 19:32:48 +00:00
ashley
54ad94ed13 fix 2024-08-04 16:01:03 +00:00
ashley
eeafcef5c9 fish 2024-08-04 13:19:25 +00:00
ashley
0be7e45bf8 added fish 2024-08-04 13:17:10 +00:00
ashley
29c16b386c make what bignutty said 2024-08-04 13:04:25 +00:00
ashley
a05d27f34f br go brr 2024-08-04 12:25:39 +00:00
ashley
8147eb8a00 add warning for dislikes lol 2024-08-04 12:20:56 +00:00
ashley
a617d8e887 gwa gwa 2024-08-04 09:21:09 +00:00
ashley
8dfaf532d8 fix stuff :3 2024-08-04 08:23:18 +00:00
ashley
adbf2784fc remove useless buttons :^ 2024-08-03 23:09:15 +00:00
ashley
56e66dbf10 add vjs to here :3 2024-08-03 23:07:36 +00:00
ashley
15e1d7e237 add vjs to here :3 2024-08-03 23:01:08 +00:00
ashley
7f8edf6b55 add vjs to here :3 2024-08-03 22:59:58 +00:00
ashley
e38f3dea87 fix this 2024-08-03 19:46:37 +00:00
ashley
1d0d76832d . 2024-08-03 19:28:32 +00:00
ashley
fa6a64c5f3 fix audio 2024-08-03 19:03:20 +00:00
nin0dev
2950cfb808 remove revolt off readme 2024-08-03 18:54:41 +00:00
ashley
890aec6a30 stuff stuff stuff 2024-08-03 18:22:48 +00:00
ashley
87eeac58a3 1 2024-08-03 17:56:49 +00:00
ashley
c7b01a6af3 ehe 2024-08-03 17:54:19 +00:00
ashley
eda2b4f887 oooooooops 2024-08-03 17:47:30 +00:00
ashley
5a1555f93e bwa 2024-08-03 17:46:18 +00:00
ashley
e4c3aab9ee bwaa :^ 2024-08-03 17:23:00 +00:00
ashley
c40c1de959 a 2024-08-03 17:15:49 +00:00
ashley
9d1a5c3e66 oops 2024-08-03 17:12:26 +00:00
ashley
eaacf84ea9 test if this works (DO NOT PULL) 2024-08-03 17:05:58 +00:00
ashley
4bc351de27 update issue template 2024-08-02 18:34:31 +00:00
ashley
1a9278bb49 :3 2024-08-02 16:38:32 +00:00
ashley
2720bd1c23 add error report link :3 2024-08-02 16:35:23 +00:00
nin0dev
def048716a removed videobundler 2024-08-02 10:38:51 -04:00
nin0dev
0f26c1904b Merge branch 'main' of https://codeberg.org/ashley/poke 2024-08-02 10:37:28 -04:00
nin0dev
7e702d93c5 added issue templates 2024-08-02 10:37:01 -04:00
ashley
7ea1d89495 ehe 2024-08-02 11:12:28 +00:00
ashley
4ac19500e3 Update html/search.ejs 2024-08-02 10:54:38 +00:00
ashley
c264af305d lmao 2024-08-02 10:53:59 +00:00
ashley
d383c1ec2f ehe :3 2024-08-02 10:52:52 +00:00
ashley
a43fbf5dfc fix css stuff 2024-08-02 10:48:18 +00:00
ashley
fb8b797891 a 2024-08-02 10:43:40 +00:00
ashley
92b398809f :3 2024-08-02 10:40:50 +00:00
ashley
7452a2c18e [IN TESTING] news source check 2024-08-02 10:32:08 +00:00
ashley
cef4b4c97d remove stufff 2024-08-01 15:03:59 +00:00
nin0dev
33838c0b1d Merge branch 'main' of https://codeberg.org/ashley/poke 2024-08-01 10:43:15 -04:00
nin0dev
84c49a0007 a 2024-08-01 10:43:12 -04:00
ashley
063d83d851 bwa 2024-08-01 14:42:42 +00:00
ashley
e0aa8cd3d5 1 2024-08-01 14:25:29 +00:00
ashley
538222e1a1 ehe 2024-08-01 14:23:12 +00:00
ashley
8166cf6f3c . 2024-08-01 13:51:08 +00:00
ashley
b0d58a61cb test commit ignore pls 2024-08-01 13:49:13 +00:00
ashley
99a59740ae a 2024-08-01 12:30:27 +00:00
ashley
2496c9efc3 test ignore 2024-08-01 12:06:35 +00:00
ashley
6c0a84fc99 bwa 2024-08-01 11:48:30 +00:00
ashley
f9474cb95e 1 2024-08-01 11:41:44 +00:00
ashley
fceb1f9622 1a1a1 2024-08-01 11:39:13 +00:00
ashley
db5685e54f 1a 2024-08-01 11:34:15 +00:00
ashley
8068a207ce . 2024-08-01 11:26:08 +00:00
ashley
6349ccf0aa h 2024-08-01 11:23:17 +00:00
ashley
34dcf5b91f Update html/poketube.ejs 2024-08-01 11:21:41 +00:00
ashley
a0daea7b6b Update html/poketube.ejs 2024-08-01 11:15:43 +00:00
ashley
837e1d159f ehe 2024-08-01 11:12:56 +00:00
ashley
ef4c2af36b Update html/poketube.ejs 2024-08-01 11:08:22 +00:00
ashley
1f8d6c394c h 2024-08-01 11:06:51 +00:00
ashley
d7f5808467 . 2024-08-01 10:59:20 +00:00
ashley
5b57061be1 Update html/poketube.ejs 2024-08-01 10:56:43 +00:00
ashley
deeec99d62 1a 2024-08-01 10:53:34 +00:00
ashley
63af6b4abf aaaaaaaaaaaaaaaaaaaaaaa 2024-07-31 21:30:16 +00:00
ashley
4723a36649 videojs )test 2024-07-31 21:14:04 +00:00
ashley
abed47554c ehe 2024-07-31 16:41:11 +00:00
ashley
6847ee37ce add funny easter egg :3 2024-07-31 16:37:45 +00:00
ashley
50d2ff9955 gwa gwa 2024-07-31 15:29:58 +00:00
ashley
5529ea0727 make the sh filter and stuff better :3 2024-07-31 15:25:46 +00:00
ashley
220e3bdea0 add hr clasesssssssssssssss 2024-07-31 11:36:48 +00:00
ashley
7b634e9fe3 o 2024-07-31 11:32:29 +00:00
ashley
2ac328dcd0 gwa 2024-07-31 11:30:53 +00:00
ashley
4b1b5e9dd1 bwa v3 2024-07-31 11:27:10 +00:00
ashley
0faf254338 bwa v1 2024-07-31 11:24:29 +00:00
ashley
27827f2576 privacy policy update 2 2024-07-31 11:17:34 +00:00
ashley
3d23f2c18d privacy policy update 1 2024-07-31 11:11:15 +00:00
ashley
943307177a gwagwa 2024-07-28 14:07:38 +00:00
ashley
6639fafbcc embed test a 2024-07-28 13:53:43 +00:00
ashley
cbdfed5eb1 require 18 and above 2024-07-28 12:27:39 +00:00
ashley
7267e706b5 add facebook and threads regex 2024-07-28 11:33:51 +00:00
ashley
fe1bed37df revert teh thing 2024-07-27 11:27:59 +00:00
ashley
e71322bf0d [IN TESTING] attempt to fix #106 2024-07-27 11:26:12 +00:00
ashley
769a6dea2d [IN TESTING] attempt to fix #106 2024-07-27 11:23:38 +00:00
ashley
edf8991914 test ignore 2024-07-27 11:21:39 +00:00
ashley
5dd37cc23e gwa gwa 2024-07-27 11:12:37 +00:00
ashley
0b48788174 [IN TESTING] attempt to fix #106 2024-07-26 21:37:58 +00:00
ashley
8054805054 [IN TESTING] attempt to fix #103 2024-07-26 20:40:10 +00:00
ashley
64b52c36d9 add gaza esims link :3 2024-07-26 17:57:01 +00:00
ashley
29aea0be35 bwa bwa 2024-07-25 22:22:01 +00:00
ashley
dbde6dbfb9 ehe 2024-07-25 20:54:19 +00:00
ashley
b5307ddfc8 bwa! 2024-07-25 17:02:44 +00:00
ashley
eb26dbd0e2 oopsie 2024-07-24 14:41:12 +00:00
ashley
6842c3c622 add blur owo :3 2024-07-24 14:39:26 +00:00
ashley
98a0799e27 bwa 2024-07-24 14:25:22 +00:00
ashley
319bdd20c8 add blur bg :3 2024-07-24 14:05:38 +00:00
ashley
0b2917e40d fix the contunation bug :p 2024-07-24 12:49:18 +00:00
ashley
98dd3d1135 bump version!! :3 2024-07-24 10:42:55 +00:00
ashley
49429389ad add blur owo :3 2024-07-24 10:41:18 +00:00
ashley
dae6282b85 remove channelfirstvideoobject :3 2024-07-24 10:12:48 +00:00
ashley
e5ec4e6679 bwa 2024-07-23 19:39:38 +00:00
ashley
dac8758fb8 bwaa!!! 2024-07-23 14:27:36 +00:00
ashley
dd96734ffd bwa 2024-07-23 12:41:05 +00:00
ashley
e6075e7c56 add stuff 2024-07-23 12:40:30 +00:00
ashley
e39f50c930 add background color and radius!!! 2024-07-23 10:18:35 +00:00
ashley
d7f76f3a2c test commit ignore pls 2024-07-23 10:12:43 +00:00
ashley
29bd9352a0 add open on youtube link 2024-07-23 09:48:37 +00:00
ashley
2e99413e48 ehe 2024-07-22 20:10:34 +00:00
ashley
0b1d2c6b0e bwa!!! 2024-07-22 20:09:06 +00:00
ashley
c762d55946 remove broken code 2024-07-22 10:43:48 +00:00
ashley
bf03245830 new splash texts!! - 21J2024 2024-07-21 20:33:04 +00:00
ashley
7260558276 Update html/poketube.ejs 2024-07-20 15:36:47 +00:00
ashley
098c13b966 test if this works (DO NOT PULL) 2024-07-20 14:02:06 +00:00
ashley
740a5d82e1 bwa 2024-07-19 12:43:48 +00:00
ashley
431d458cb5 remove these 2024-07-18 14:10:36 +00:00
ashley
8187d5b389 oh my god lmafo 2024-07-18 13:59:27 +00:00
ashley
c16e19eb1b aaa 2024-07-18 13:56:59 +00:00
ashley
2445d8fb49 Update src/libpoketube/init/pages-video.js 2024-07-18 13:53:00 +00:00
ashley
cb02f8f255 last commit today trust 2024-07-18 13:46:11 +00:00
ashley
8a2d8eddc9 fix height :3 2024-07-18 13:42:46 +00:00
ashley
7303b9c241 gwa 2024-07-18 13:40:26 +00:00
ashley
999b18e4bb new splashes :3 2024-07-17 23:38:54 +00:00
ashley
e6f0591fc4 make it funnier 2024-07-17 15:24:08 +00:00
ashley
57eaae43aa lol 2024-07-17 15:20:42 +00:00
ashley
eae7d4500c test commit ignore pls 2024-07-17 10:22:23 +00:00
ashley
ac72e2ccb3 wdfgefjıtgfu 2024-07-16 20:31:42 +00:00
ashley
ccf32b9b43 Update html/poketube.ejs 2024-07-16 20:30:02 +00:00
ashley
da5bafacd4 Update html/poketube.ejs 2024-07-16 20:28:47 +00:00
ashley
8354108df7 add stuff 2024-07-16 20:26:24 +00:00
ashley
6c7f16f66f bwaa 2024-07-16 19:52:03 +00:00
ashley
27c9168f85 Update html/poketube.ejs 2024-07-16 19:51:19 +00:00
ashley
581137ec02 FIX: skill issue :3 2024-07-16 19:48:16 +00:00
ashley
2fa69f81ca add stream music button !!!!!! 2024-07-16 19:45:55 +00:00
ashley
d659e388fd update regex ^_^ 2024-07-16 19:44:19 +00:00
ashley
1d2fdc3ea2 Update src/libpoketube/init/pages-video.js 2024-07-16 19:38:05 +00:00
ashley
c89ba51f57 Update html/poketube.ejs 2024-07-16 12:40:42 +00:00
ashley
40a8e92e80 fix shitcode :3 2024-07-15 20:54:14 +00:00
ashley
51a2f042c1 Update src/libpoketube/init/pages-channel-and-download.js 2024-07-15 20:21:59 +00:00
ashley
7767c69ad1 Update src/libpoketube/init/pages-channel-and-download.js 2024-07-15 20:09:54 +00:00
ashley
e01174182c hm 2024-07-15 20:07:20 +00:00
ashley
cd27910117 bwa 2024-07-15 20:04:43 +00:00
ashley
1b2e86f5f8 mv 2024-07-15 20:02:58 +00:00
ashley
867bb45e42 test ignore 2024-07-15 20:00:18 +00:00
ashley
40095fe64e Update src/libpoketube/init/pages-channel-and-download.js 2024-07-15 17:55:56 +00:00
ashley
d449d412f1 remove j :3 2024-07-15 17:50:51 +00:00
ashley
4b76c5187b make the channel pages faster,, 2024-07-15 17:47:55 +00:00
ashley
e2120319f4 bwa 2024-07-15 15:41:52 +00:00
ashley
505e9c1c61 :3 2024-07-15 15:41:18 +00:00
ashley
5606cd7684 use the channel avatar :3 2024-07-15 15:17:33 +00:00
ashley
7ddbe0641a fix channel pages :3 2024-07-15 14:58:32 +00:00
ashley
cd9786f699 use ChannelFirstVideoObject 2024-07-15 14:53:00 +00:00
ashley
d4a7a2cded add the firstvideo thing :3 2024-07-15 14:46:53 +00:00
ashley
dafaedef2e stuff 2024-07-15 10:19:35 +00:00
ashley
f2fd62dce0 Update src/libpoketube/init/pages-channel-and-download.js 2024-07-14 11:07:59 +00:00
ashley
5e4097b88c Update src/libpoketube/init/pages-404-and-main.js 2024-07-14 11:03:51 +00:00
ashley
75164fce6f use the api key 2024-07-14 11:01:45 +00:00
ashley
798688d105 use the api key 2024-07-14 11:00:19 +00:00
ashley
a62433c6f9 Update config.json 2024-07-14 10:59:22 +00:00
ashley
153416e458 add version information :3 2024-07-13 12:23:30 +00:00
ashley
80403f650e add 60fps indicator :3 2024-07-13 12:02:19 +00:00
ashley
37ec1f248c Update html/poketube.ejs 2024-07-13 11:03:26 +00:00
ashley
4b21f43ba9 add volume :3 2024-07-12 15:37:07 +00:00
ashley
e3ab50216c use data-channel instead ^_^ 2024-07-10 12:23:12 +00:00
ashley
3e85cf91a8 use data-author instead ^_^ 2024-07-10 12:17:22 +00:00
ashley
5b7762f2cb test commit ignore pls 2024-07-08 15:06:33 +00:00
ashley
96c61f26d0 fix stuff 2024-07-07 20:49:24 +00:00
ashley
47833803b2 fix seekbar on fulscreen 2024-07-07 19:58:53 +00:00
ashley
f124efc8e3 fix stuff :3 2024-07-07 17:56:59 +00:00
ashley
fc08e94049 try this 2024-07-06 16:31:21 +00:00
ashley
90910bfee4 Update html/poketube.ejs 2024-07-06 14:27:58 +00:00
ashley
913ccef4a7 remove broken code 2024-07-06 14:14:54 +00:00
ashley
97bb31f304 fix stuff 2024-07-06 14:11:16 +00:00
ashley
8990672e62 fix : use readystate 2024-07-06 13:44:53 +00:00
ashley
673142052e fix: remove autosync for now 2024-07-06 11:16:02 +00:00
ashley
692fbf1d5d fix some stuff :3 2024-07-06 09:48:02 +00:00
ashley
c2625bd79d fix issue 2024-07-06 09:20:55 +00:00
ashley
9484df8780 FIX: Medium videoplayback having a skill issue :3 2024-07-05 18:59:54 +00:00
ashley
70221f1f41 fix some autosync issue lol 2024-07-05 17:18:38 +00:00
ashley
5be52a9d7b add error notices :3 2024-07-05 13:59:13 +00:00
ashley
8d60655fa7 oops 2024-07-03 23:14:01 +00:00
ashley
b765e8eb06 add masterpiece video :3 2024-07-03 23:11:22 +00:00
ashley
34c7b787e7 revert #91 bwaaaaa 2024-07-03 21:04:48 +00:00
ashley
5c62905ce5 Update src/libpoketube/init/pages-video.js 2024-07-03 21:00:40 +00:00
ashley
8cc53b114b put it to pt_version 2024-07-03 20:56:58 +00:00
ashley
9f52dbf33c bwa 2024-07-03 20:54:59 +00:00
ashley
2a59d97d62 use execSync instead of exec 2024-07-03 20:52:22 +00:00
ashley
63ac519d60 bwa 2024-07-03 20:36:31 +00:00
ashley
e28361bab3 Update html/poketube.ejs 2024-07-03 13:15:09 +00:00
ashley
38d4913834 oops 2024-07-03 10:49:12 +00:00
ashley
184c935251 test commit ignore pls 2024-07-03 10:47:56 +00:00
ashley
f7d614007a Update html/poketube.ejs 2024-07-03 10:32:42 +00:00
ashley
8071330fc6 Update src/libpoketube/init/pages-video.js 2024-07-03 10:30:50 +00:00
ashley
61db054304 bwa :3 2024-07-03 10:30:11 +00:00
ashley
41486bf8a3 oops 2024-07-03 10:22:46 +00:00
ashley
8b5bd59420 add itag_hd 2024-07-03 10:20:01 +00:00
ashley
9b7a612bc4 mb lmao 2024-07-03 08:52:10 +00:00
ashley
f6f0614d1f ehe 2024-07-03 08:51:19 +00:00
ashley
a5596afc4c add sugesstion api :3 2024-07-03 08:49:11 +00:00
ashley
57d19f5326 change api url :3 2024-07-03 08:47:01 +00:00
ashley
8f28bc4842 re-add videos :3 2024-07-03 08:06:38 +00:00
ashley
ab3b30d618 fix stuff :3 2024-07-03 08:05:43 +00:00
ashley
c64c800024 fix url :3 2024-07-03 07:00:30 +00:00
ashley
99cc288726 bwa 2024-07-02 22:09:57 +00:00
ashley
6658fdc5a7 add hd video!! 2024-07-02 22:09:19 +00:00
ashley
be0fd4ae31 Update html/poketube.ejs 2024-06-29 15:47:15 +00:00
ashley
7da7d37c00 Update html/poketube.ejs 2024-06-29 15:45:41 +00:00
ashley
a05ab40086 Update html/poketube.ejs 2024-06-26 14:59:19 +00:00
ashley
6fce8fde00 lol 2024-06-26 14:58:25 +00:00
ashley
5adb35ad94 TEST IGNORE 2024-06-26 14:54:34 +00:00
Ashley ////
b6dda9ac2d Merge pull request 'merger: Fix f string bug' (#96) from nin0dev/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/96
2024-06-26 11:04:59 +00:00
nin0dev
75a6333f96 Update videobundler/README.md 2024-06-26 10:21:53 +00:00
nin0dev
ccd1eab93c Merge branch 'main' into main 2024-06-26 10:20:30 +00:00
nin0dev
dd517abe97 Fix f string bug 2024-06-26 06:17:04 -04:00
Ashley ////
f875214bee Merge pull request '(videobundler) implement streaming and fix unknown var issue' (#95) from nin0dev/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/95
2024-06-26 07:59:30 +00:00
Ashley ////
1e0d1f77f9 Merge branch 'main' into main 2024-06-26 07:59:20 +00:00
nin0dev
e21718181e edited cmdline 2024-06-25 14:34:41 -04:00
Korbs
f903092531 Merge pull request 'Update instances.json' (#91) from blade10101/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/91
2024-06-25 03:13:45 +00:00
blade10101
3ddbf9eed0 Merge branch 'main' into main 2024-06-25 01:25:56 +00:00
blade10101
9f42bcc8c6 Update instances.json 2024-06-25 01:24:19 +00:00
nin0dev
174e0564a7 apparently there are things to commit 2024-06-24 03:55:25 -04:00
nin0dev
ac1cf91adc Added separate browser handling
Chromium shits itself if i give it a streamed output from ffmpeg, so i just do old behavior of downloading file if its not a firefox browser
2024-06-24 03:54:37 -04:00
nin0dev
f16ebe8aa3 Merge branch 'main' into main 2024-06-24 07:20:16 +00:00
nin0dev
113fbd91f8 Added video streaming 2024-06-24 00:26:57 -04:00
nin0dev
6dafa572a4 stop writing bundler output to disk 2024-06-23 23:28:08 -04:00
Korbs
4d31a08fef Rename to "Poke", use PokeTube org's package, and note about ARM64/v7 2024-06-24 02:50:05 +00:00
nin0dev
08271eb2b4 nothing more 2024-06-23 16:11:12 -04:00
nin0dev
6826788925 Merge branch 'main' into main 2024-06-23 18:36:11 +00:00
nin0dev
a3bd8ec957 Fixed bug where video would get corrupted over not correctly getting id 2024-06-23 14:34:36 -04:00
Ashley ////
678e30c89a Merge pull request 'improve videobundler' (#93) from nin0dev/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/93
2024-06-23 16:22:42 +00:00
nin0dev
70243b5b76 Updated videobundler to add concurrency and caching 2024-06-23 12:21:01 -04:00
nin0dev
00d21afbc5 Merge branch 'main' into main 2024-06-23 15:37:28 +00:00
Ashley ////
f7c961ae93 Merge pull request 'Add: Suggestions for Search Bar' (#94) from Korbs/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/94
2024-06-23 11:50:08 +00:00
Korbs
0fdbeea5d5 Add suggestions to search bar (Landing) 2024-06-23 04:17:34 -04:00
Korbs
cf7cf98dd5 Merge pull request 'main' (#7) from ashley/poke:main into main
Reviewed-on: https://codeberg.org/Korbs/poke/pulls/7
2024-06-23 07:57:23 +00:00
blade10101
8ae73e932f Update instances.json 2024-06-23 02:00:33 +00:00
nin0dev
bbff542938 Added concurrency 2024-06-22 18:02:30 -04:00
nin0dev
a1e1c3e33f Merge branch 'main' into main 2024-06-22 21:59:42 +00:00
ashley
b7e6d55fcc o7 2024-06-22 21:12:05 +00:00
nin0dev
2adf9231a8 Merge branch 'main' into main 2024-06-22 19:31:40 +00:00
nin0dev
7fbd295c87 Fixed f string error 2024-06-22 15:30:35 -04:00
Ashley ////
bd6337cc5c Merge pull request 'Add videobundler' (#92) from nin0dev/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/92
2024-06-22 19:03:56 +00:00
nin0dev
a5e9c3089b Added videobundler 2024-06-22 14:58:11 -04:00
blade10101
8a0f821eb3 Update instances.json 2024-06-22 02:41:52 +00:00
ashley
b9fe538feb Update README.md 2024-06-21 20:57:15 +00:00
ashley
052547350a Upload files to "css" 2024-06-20 21:57:57 +00:00
ashley
b91601209d bump version 2024-06-19 11:01:01 +00:00
ashley
03cc26622a revert teh thing 2024-06-17 15:39:51 +00:00
ashley
bbd409d28f block videos from tom macdonald in discover 2024-06-17 15:29:31 +00:00
ashley
ab16327c4b add author :3 2024-06-17 15:26:56 +00:00
ashley
771eaeeb8a new discover page :3 2024-06-17 15:17:09 +00:00
ashley
d06ac6a18e :3 2024-06-17 13:53:54 +00:00
ashley
904d6e79b2 add credits for narvi :3 2024-06-16 20:28:22 +00:00
ashley
0f0e142daf change api url :3 2024-06-15 11:52:43 +00:00
ashley
3c5710e192 woo :3 2024-06-15 11:49:13 +00:00
ashley
177d5f7a63 add discord link :3 2024-06-13 22:46:49 +00:00
ashley
daf8e56e8d oops 2024-06-13 22:25:08 +00:00
ashley
bcb14824d7 test new ui 2024-06-13 22:22:13 +00:00
ashley
de9a688f08 o7 2024-06-13 16:32:39 +00:00
Korbs
66ef437a98 Update link to SudoVanilla instance 2024-06-13 01:57:19 +00:00
ashley
ceae76f50e change api url :3 2024-06-11 22:12:49 +00:00
ashley
568a8dc53a mb sorry 2024-06-11 22:09:38 +00:00
ashley
5d4e5024ab test 2024-06-11 22:07:18 +00:00
ashley
269b02f0fc add user score!! to mobile 2024-06-11 22:02:58 +00:00
ashley
7ec38a9933 fix some issues :3 2024-06-10 22:27:48 +00:00
ashley
faa535bd0b mb lmao 2024-06-10 22:26:05 +00:00
ashley
8b1e2bc26b add user score!! 2024-06-10 22:24:47 +00:00
ashley
038b1f610f add dislikePercentage :3 2024-06-10 22:20:12 +00:00
ashley
bccb0a3928 ok am stupid 2024-06-10 21:43:06 +00:00
ashley
e979a3eaa4 rsufjgdujfgfdjghrf 2024-06-10 21:42:36 +00:00
ashley
941ade3d26 bleh 2024-06-10 21:41:53 +00:00
ashley
c5b0107746 mb 2024-06-10 21:34:25 +00:00
ashley
15fadaad41 ehe 2024-06-10 21:33:40 +00:00
ashley
2301392ba4 add likePercentage :3 2024-06-10 21:29:10 +00:00
ashley
a41df78164 new splash texts!! 2024-06-09 19:06:29 +00:00
ashley
9527c91e98 add discord server shortcut :3 2024-06-09 08:40:00 +00:00
ashley
12f43c3acf fix download :3 2024-06-09 08:32:16 +00:00
ashley
e1a38eba0e add search on web button to search :^ 2024-06-09 08:30:35 +00:00
ashley
ea7ca735a0 Update html/search.ejs 2024-06-09 08:26:19 +00:00
ashley
482b9ff833 testing 2024-06-09 08:24:07 +00:00
ashley
cb34181115 add discord link instead 2024-06-07 11:32:23 +00:00
ashley
06cf3cd7d6 mb sorry 2024-06-05 17:34:51 +00:00
ashley
ddad3663cf add girls 2024-06-02 19:50:06 +00:00
ashley
ae741e1c30 use github user content for instance fetch (related: #87) 2024-06-01 22:24:55 +00:00
Korbs
5ef6b6bfcd Convert to Codeberg and use ARM64 2024-06-01 21:18:14 +00:00
ashley
64096ff275 add embedtype :3 2024-06-01 05:44:11 +00:00
ashley
efc2a5d468 add this :3 2024-06-01 05:42:02 +00:00
ashley
0fc44971a1 check if param exists 2024-05-31 11:42:39 +00:00
ashley
ccd7f8e14b im sorry lol 2024-05-31 11:41:01 +00:00
ashley
8203cc8f81 add a 404 to games if it doesnt exist :3 2024-05-31 11:40:18 +00:00
ashley
d46e1dfb80 fix a > issue :3 2024-05-31 11:35:34 +00:00
ashley
f1029b0b93 oops lmao 2024-05-31 11:20:43 +00:00
ashley
024fad830a lets test this :3 2024-05-31 11:16:44 +00:00
ashley
7aa8181f6f add a check for artists 2024-05-31 11:08:45 +00:00
Ashley ////
9edfb9c216 Merge pull request 'Replace "poke.am1.shiggy.cloud" and "poke.am2.shiggy.cloud" with online instances.' (#88) from anotherkai/poke:replace-instances into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/88
2024-05-30 19:21:03 +00:00
anotherkai
9e79555951 Replace "poke.am1.shiggy.cloud" and "poke.am2.shiggy.cloud" with online instances. 2024-05-29 19:19:04 +00:00
ashley
dcb80d6a51 test ignore 2024-05-26 20:40:10 +00:00
ashley
a9e0acbd0a oops 2024-05-26 20:37:47 +00:00
ashley
9adc242445 fix the contunation bug :p 2024-05-26 20:34:06 +00:00
ashley
93ffc6ea42 bye 2024-05-25 23:08:48 +00:00
ashley
165c6a53ae fix height :3 2024-05-25 23:04:52 +00:00
ashley
8b52cddd22 add x.authorId 2024-05-25 05:46:31 +00:00
ashley
463cad66e6 Update html/playlist.ejs 2024-05-24 14:54:09 +00:00
ashley
2658ca8fdf my sorry 2024-05-24 14:50:18 +00:00
ashley
ca63841dee OOOPS SORRY 2024-05-24 14:49:00 +00:00
ashley
8449a2ea60 lol 2024-05-24 14:46:10 +00:00
ashley
7fcf4647cc add red-tape lol 2024-05-24 14:19:20 +00:00
ashley
ddb1bf189e add red tape lol 2024-05-24 14:11:54 +00:00
Korbs
13477769fb Switch to Codeberg for image host and provide arm64 build
https://codeberg.org/Korbs/-/packages/container/poke/amd64
https://codeberg.org/Korbs/-/packages/container/poke/arm64
2024-05-24 03:30:54 +00:00
Korbs
cf048ce7d8 Merge pull request 'main' (#6) from ashley/poke:main into main
Reviewed-on: https://codeberg.org/Korbs/poke/pulls/6
2024-05-24 03:26:58 +00:00
ashley
4d3e63970d test commit ignore pls 2024-05-23 20:12:24 +00:00
ashley
4515b3ca13 oops lmao 2024-05-23 20:09:45 +00:00
ashley
de4343a001 add warning for dis lol 2024-05-23 20:06:05 +00:00
ashley
6214f1a0a1 test commit ignore pls 2024-05-22 20:07:45 +00:00
ashley
76dae85866 remove vidoes if theres none duh 2024-05-22 20:03:55 +00:00
ashley
358a4d8311 redirect to shorts if theres no videos :3 2024-05-22 19:59:42 +00:00
ashley
43682f2a87 add verified checkmark :3 2024-05-22 13:47:26 +00:00
ashley
ba9820aee4 add new download button :3 2024-05-22 09:10:13 +00:00
ashley
32753be835 new banner :3 2024-05-20 14:47:46 +00:00
ashley
b47f66773b Fix search 2024-05-18 11:13:17 +00:00
ashley
733a99cdc4 add the discover button :3 2024-05-16 18:57:21 +00:00
ashley
99ef160678 add the discover button :3 2024-05-15 23:57:40 +00:00
ashley
ea60a07202 OOOPS SORRY 2024-05-15 23:53:21 +00:00
ashley
b10d91e1c0 add new header 2024-05-15 23:48:34 +00:00
ashley
0b86cb9a1f bump bundle version :3 2024-05-13 16:05:04 +00:00
ashley
06a9e61330 add toggleTheaterMode :3 2024-05-13 16:04:04 +00:00
ashley
54da43668d use theatermodeon 2024-05-13 16:00:39 +00:00
ashley
5ee8a6f847 oops 2024-05-13 15:50:20 +00:00
ashley
77248156a5 bump bundle version :3 2024-05-13 04:35:00 +00:00
Ashley ////
81e74bdfa3 Merge pull request 'Optimize Landing and Improve Theather Mode' (#87) from Korbs/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/87
2024-05-13 04:30:47 +00:00
Korbs
79111259f6 Remove HD videos and keep 480p version on landing background 2024-05-12 18:26:57 -04:00
Korbs
e4263b18f3 Strink height of theather mode for 720p screens 2024-05-12 18:25:55 -04:00
Korbs
f23f9cfd20 Add error template to layouts folder 2024-05-12 18:25:33 -04:00
Korbs
e3b35a4426 Merge pull request 'main' (#5) from ashley/poke:main into main
Reviewed-on: https://codeberg.org/Korbs/poke/pulls/5
2024-05-12 19:27:39 +00:00
ashley
996221f39e oops 2024-05-12 18:47:09 +00:00
ashley
7df79c7da8 lol 2024-05-12 18:46:09 +00:00
ashley
9e2b8e39c4 mb lol 2024-05-11 20:49:15 +00:00
ashley
efc7e8a687 use javascript file 2024-05-11 20:48:52 +00:00
ashley
8ec890dea1 add a file for maps instead 2024-05-11 20:46:47 +00:00
ashley
c540ff27df add clock :3 2024-05-11 19:40:35 +00:00
ashley
a74dea4fb4 oops 2024-05-11 16:02:12 +00:00
ashley
0d128656b7 add funny easter egg :3 2024-05-11 16:00:06 +00:00
ashley
b1f011f907 add a rparamm 2024-05-11 02:54:08 +00:00
ashley
1735f548d6 AM DUMB SORRY 2024-05-11 02:40:23 +00:00
ashley
c49abee128 redirect to the account page :3 2024-05-11 02:37:03 +00:00
ashley
d7ef10b65e fix the XSS in user pages 2024-05-11 02:33:43 +00:00
ashley
75e4e37789 add download button to search :3 2024-05-11 01:20:51 +00:00
ashley
913a43e0cb final commmit hopefull 2024-05-11 00:12:22 +00:00
ashley
284ca61bb9 lets try this 2024-05-11 00:11:16 +00:00
ashley
2349a5f67f test commit ignore pls 2024-05-11 00:09:34 +00:00
ashley
f78344e756 make it 1.5 2024-05-11 00:06:11 +00:00
ashley
667abd4764 OOOPS SORRY 2024-05-11 00:04:47 +00:00
ashley
6134c84047 save every 5 seconds instead 2024-05-11 00:00:36 +00:00
ashley
1d07846314 lol 2024-05-10 23:17:49 +00:00
ashley
d25f416411 added read if cute splah 2024-05-10 23:16:31 +00:00
ashley
0d5494bff2 lol sorry 2024-05-10 21:41:46 +00:00
ashley
87ceaf1a8a fix stuff 2024-05-10 21:36:08 +00:00
ashley
93edc7411c hmm 2024-05-10 21:27:51 +00:00
ashley
026a060c3c mb lmao 2024-05-10 21:24:38 +00:00
ashley
3bdf5a5254 test ignore 2024-05-10 21:22:58 +00:00
ashley
a897c79243 test ignore 2024-05-10 21:09:09 +00:00
ashley
a58a01e1df revert teh thing 2024-05-10 19:59:34 +00:00
Ashley ////
e35d806f51 Merge pull request 'Format Poketube.ejs with Beautify' (#86) from Korbs/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/86
2024-05-10 19:44:00 +00:00
Korbs
1caa2c150d Format with Beautify 2024-05-10 15:37:49 -04:00
ashley
d9ac3f21d0 add regex :3 2024-05-10 10:55:04 +00:00
ashley
78de660963 add regex for vid ids 2024-05-10 10:48:31 +00:00
Korbs
adf09e5dfa Merge pull request 'main' (#4) from ashley/poke:main into main
Reviewed-on: https://codeberg.org/Korbs/poke/pulls/4
2024-05-10 07:09:15 +00:00
ashley
62d7def602 test commit ignore pls 2024-05-09 15:03:50 +00:00
ashley
fd26924324 add commmit field 2024-05-09 14:58:20 +00:00
ashley
3a3cacb6d0 add poke.blahai.gay 2024-05-09 14:37:29 +00:00
ashley
c6cb1334b2 oops 2024-05-09 13:43:29 +00:00
ashley
bcdab77856 more poketube --> poke 2024-05-08 21:19:47 +00:00
ashley
ba5fa3f4e8 bump bundle version :3 2024-05-08 13:57:37 +00:00
ashley
8aaa41de3d remove IE support :p 2024-05-08 13:56:04 +00:00
Korbs
43cf7dc468 Merge pull request 'main' (#3) from ashley/poke:main into main
Reviewed-on: https://codeberg.org/Korbs/poke/pulls/3
2024-05-08 05:56:03 +00:00
ashley
cdcec542d0 bump version!! :3 2024-05-06 15:36:09 +00:00
ashley
00e6597265 lol mb 2024-05-05 18:21:24 +00:00
ashley
0f025be830 ad stuff :.3 2024-05-05 18:13:56 +00:00
ashley
44f6697b02 mb 2024-05-05 15:46:56 +00:00
ashley
8a31d194fa oops 2024-05-05 15:45:57 +00:00
ashley
bc917b4727 bump version!! :3 2024-05-05 15:45:33 +00:00
ashley
ab96d0fa34 fix video search 2024-05-05 12:57:16 +00:00
ashley
ae935825f4 add stuff 2024-05-05 12:19:28 +00:00
ashley
8c3692d94a add ascii txt :3 2024-05-04 16:41:41 +00:00
ashley
19fa78253c add poke logo 2024-05-04 16:33:55 +00:00
ashley
b7907c8459 add info cards api 2024-05-04 10:10:42 +00:00
ashley
bc9643c5e7 lint code :3 2024-05-04 05:31:35 +00:00
ashley
a0cebd409c return 404 if errors 2024-05-04 05:28:55 +00:00
ashley
d4521153b1 lint code :3 2024-05-04 05:28:05 +00:00
ashley
d451a834a2 new 404 string 2024-05-04 05:16:16 +00:00
ashley
27b7a248e9 am dumb 2024-05-02 22:17:19 +00:00
ashley
fa5a1b9a37 change to eu proxy 2024-05-02 22:03:26 +00:00
ashley
35b89add2f add new splash hehe 2024-05-02 03:48:30 +00:00
ashley
b041062c6a add new screenshot :3 2024-05-02 03:33:38 +00:00
ashley
94a1e3d4c0 add new screenshot :3 2024-05-02 03:32:49 +00:00
ashley
e2adc76b7d bump bundle version :3 2024-05-02 02:13:04 +00:00
ashley
98b310342e fix stats for nerds :p 2024-05-02 02:12:44 +00:00
ashley
def705d37a fix january in school 2024-05-02 02:06:22 +00:00
ashley
4ba2b7c466 bump bundle version :3 2024-05-02 02:03:15 +00:00
ashley
10ef769b6c bump bundle version :3 2024-05-02 02:02:02 +00:00
ashley
66ee2e0a8d dont display theather mode without js 2024-05-02 02:00:23 +00:00
Ashley ////
3e5ba0da0b Merge pull request 'Minor UI Improvements' (#82) from Korbs/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/82
2024-05-02 01:53:27 +00:00
Korbs
c46d95c196 Clean up area above searched videos 2024-05-01 17:32:37 -04:00
Korbs
83d06e8584 Clean up area under video and add Theater toggle 2024-05-01 17:32:08 -04:00
Korbs
7db35edfda Merge pull request 'main' (#2) from ashley/poke:main into main
Reviewed-on: https://codeberg.org/Korbs/poke/pulls/2
2024-05-01 21:31:28 +00:00
ashley
1938f35856 fix silly issues 2024-05-01 16:11:56 +00:00
ashley
c8b1c644d1 my sorry 2024-05-01 16:10:31 +00:00
ashley
d56e224f3b fix result 2024-05-01 16:08:14 +00:00
ashley
a8b35495f6 make search work again!! 2024-05-01 16:05:41 +00:00
ashley
6f1af7c36d oops 2024-05-01 13:46:00 +00:00
ashley
7a6a1e99a5 add more splash texts :3 2024-05-01 13:45:11 +00:00
ashley
1077a5ef60 remove old icons :3 2024-05-01 12:02:11 +00:00
ashley
35b9412e7c my bad lmao- 2024-05-01 09:33:43 +00:00
ashley
f5d8863236 add more splash texts :3 2024-05-01 09:32:28 +00:00
ashley
f941957dea remove icons lol 2024-05-01 09:00:01 +00:00
ashley
ff45b70bcd add proxyurl 2024-05-01 06:41:06 +00:00
ashley
b8dad3e52b add fontawsome :3 2024-05-01 06:40:12 +00:00
ashley
477ba74e83 Update html/landing.ejs 2024-05-01 06:31:56 +00:00
ashley
1ed3fe20b1 change parts of readme 2024-05-01 06:27:27 +00:00
Ashley ////
11e0cf2580 Merge pull request 'Update Landing and README' (#81) from Korbs/poke:main into main
Reviewed-on: https://codeberg.org/ashley/poke/pulls/81
2024-05-01 06:25:18 +00:00
ashley
21ae44ca15 add splash text :3 2024-05-01 06:24:48 +00:00
ashley
aa9daac6f4 add text lol :3 2024-05-01 06:22:58 +00:00
Korbs
1f4d9c3282 Add links to bottom cards 2024-04-30 23:12:50 -04:00
Korbs
98c1d4a638 Merge pull request 'main' (#1) from ashley/poke:main into main
Reviewed-on: https://codeberg.org/Korbs/poke/pulls/1
2024-05-01 03:10:00 +00:00
Korbs
b634646d4b Update parts of README 2024-04-30 23:07:06 -04:00
Korbs
d85f362544 Remove old file 2024-04-30 23:06:54 -04:00
Korbs
cc3b9fd5d6 Add header partial 2024-04-30 23:06:19 -04:00
Korbs
82a5cb5e3a Add cart partial 2024-04-30 23:06:09 -04:00
Korbs
f64e1d21df Update landing page 2024-04-30 23:05:57 -04:00
Korbs
c488771d5d Add secure and verify to landing 2024-04-30 23:04:20 -04:00
ashley
24c51c85a3 use value instead lol 2024-04-30 13:47:11 +00:00
ashley
6822e5fc1e add channel search placeholder 2024-04-30 13:40:37 +00:00
ashley
cdd0cbf72b add more redirects :3 2024-04-29 21:11:50 +00:00
Ashley ////
c80793cb2e test this 2024-04-27 18:47:23 +00:00
Ashley ////
312f717713 add escape buttono to close the popup 2024-04-27 18:31:05 +00:00
Ashley ////
2e7a43ad7c oops 2024-04-27 15:12:42 +00:00
Ashley ////
e2dd39b5e3 css fixes 2024-04-27 15:11:23 +00:00
Ashley ////
82e838438d add the div 2024-04-27 15:07:51 +00:00
Ashley ////
f0fd776104 mb agaij 2024-04-27 15:06:01 +00:00
Ashley ////
a6383824b2 oops 2024-04-27 15:04:21 +00:00
Ashley ////
9f3ec29813 add tags for channels 2024-04-27 15:01:21 +00:00
Ashley ////
4b7d4d2f43 add margin 2024-04-27 08:52:02 +00:00
Ashley ////
8a5d09e7d6 test commit ignore pls 2024-04-27 08:50:28 +00:00
Ashley ////
0180cc7ab0 test ignore 2024-04-27 08:48:13 +00:00
Ashley ////
9b10540fb9 test commit ignore pls 2024-04-27 08:45:37 +00:00
Ashley ////
6da10df705 test commit ignore pls 2024-04-27 08:42:20 +00:00
Ashley ////
1640f7e66c test author verified,, 2024-04-27 08:39:10 +00:00
Ashley ////
c611d23b3d use usa proxy :3 2024-04-27 08:01:15 +00:00
Ashley ////
5b4b454f92 set to invidious proxy 2024-04-27 08:00:26 +00:00
Ashley ////
3cbdec493b lol 2024-04-26 18:50:10 +00:00
Ashley ////
7eea8c3cc0 use kuylars proxy for now 2024-04-26 18:40:53 +00:00
Ashley ////
81fcbe2be0 OOOPS SORRY 2024-04-26 18:34:23 +00:00
Ashley ////
1231ddb1b3 Update src/libpoketube/libpoketube-dislikes.js 2024-04-26 18:29:53 +00:00
Ashley ////
ffd18e8629 oops 2024-04-26 18:24:58 +00:00
Ashley ////
952c1f453c fix videoplayback 2024-04-26 18:23:10 +00:00
Ashley ////
49c03bf3c0 mhm 2024-04-26 15:50:27 +00:00
Ashley ////
35e06ef2e8 lets ee 2024-04-26 15:46:52 +00:00
Ashley ////
d445e462c5 fix videos :3 2024-04-26 15:42:06 +00:00
Ashley ////
23e742697a h 2024-04-25 18:37:22 +00:00
Ashley ////
38a624bd48 Update src/libpoketube/libpoketube-core.js 2024-04-25 18:20:06 +00:00
Ashley ////
b5e34674eb Update src/libpoketube/libpoketube-core.js 2024-04-25 18:15:11 +00:00
Ashley ////
1c6673f62e use config.invidapi instead 2024-04-25 18:05:45 +00:00
Ashley ////
fe86bf06ca do 2 2024-04-25 17:58:49 +00:00
Ashley ////
3270d2b5a0 mb 2024-04-25 17:53:54 +00:00
Ashley ////
b9992fc0df try this 2024-04-25 17:48:30 +00:00
Ashley ////
043406f0d5 lets see 2024-04-25 17:37:00 +00:00
Ashley ////
68d54e7ea1 do 2 2024-04-25 17:35:05 +00:00
Ashley ////
a4df679439 test commit ignore pls 2024-04-25 17:33:36 +00:00
Korbs
2b35a27252 Remove Vern's instance 2024-04-24 23:59:57 +00:00
Ashley ////
a68fcde7f9 test ignore 2024-04-24 15:44:33 +00:00
Ashley ////
61fb7ee345 lol 2024-04-24 14:20:08 +00:00
Ashley ////
6a83a1343e fix a issue :3 2024-04-23 19:53:28 +00:00
Ashley ////
32924854b6 mb 2024-04-23 15:36:36 +00:00
Ashley ////
d019ad69ed o7 2024-04-23 15:02:59 +00:00
Ashley ////
1f5a286195 mb lmao 2024-04-23 14:13:32 +00:00
Ashley ////
743229525a use invidious comments 2024-04-23 14:08:44 +00:00
Ashley ////
928a686cf5 bring back invidious comments 2024-04-23 14:06:02 +00:00
Ashley ////
614e38600b oops 2024-04-23 13:48:21 +00:00
Ashley ////
e54eb5c764 bunp undici 2024-04-23 13:44:57 +00:00
Ashley ////
38481ef63d test commit ignore pls 2024-04-23 10:48:11 +00:00
Ashley ////
6f660d5bff use the url instead 2024-04-23 10:27:33 +00:00
96 changed files with 11114 additions and 4562 deletions

View File

@@ -3,13 +3,8 @@
.git
.gitignore
node_modules
invidious-source
json.sqlite
*.md
/docker-compose.yml
/Dockerfile
/config.json
/january
/pokevidious
/p
/t
/sdk
docker-compose.yml
Dockerfile

View File

@@ -1,19 +1,19 @@
kind: pipeline
type: exec
name: Build and Push Docker Image (Quay)
name: Build and Push Docker Image
platform:
os: linux
arch: amd64
arch: arm64
steps:
- name: Build
environment:
QUAY_USERNAME:
from_secret: QUAY_USERNAME
QUAY_PASSWORD:
from_secret: QUAY_PASSWORD
CODEBERG_USERNAME:
from_secret: CODEBERG_USERNAME
CODEBERG_PASSWORD:
from_secret: CODEBERG_PASSWORD
commands:
- echo $QUAY_PASSWORD | docker login quay.io --username $QUAY_USERNAME --password-stdin
- docker build -t quay.io/sudovanilla/poketube .
- docker push quay.io/sudovanilla/poketube
- echo $CODEBERG_PASSWORD | docker login codeberg.org --username $CODEBERG_USERNAME --password-stdin
- docker build -t codeberg.org/korbs/poke:arm64 .
- docker push codeberg.org/korbs/poke:arm64

1
.gitignore vendored
View File

@@ -3,3 +3,4 @@ yarn.lock
package-lock.json
.env
json.sqlite
config.json

View File

@@ -2,14 +2,10 @@
## docker build -t poketube .
## To run the image, run:
## docker run -p 6003:6003 -v ./config.json:/poketube/config.json:ro poketube
## but preferably, use the docker-compose.yml file
## docker run -d -p 6003:6003 poketube
# Base
FROM node:16-alpine
# Install dependencies
RUN apk add --no-cache git build-base python3
# Base (Debian)
FROM debian
# Set Work Directory
WORKDIR /poketube
@@ -18,8 +14,21 @@ COPY . /poketube
# Expose Ports
EXPOSE 6003
# Install Dependencies
# Install Requirements
RUN apt-get update && apt-get -y install \
libcurl4-openssl-dev make g++ ca-certificates curl gnupg
# Install NodeJS v18
RUN mkdir -p /etc/apt/keyrings
RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_16.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
RUN apt-get update
RUN apt-get -y install nodejs npm
# Install Packages
RUN npm install
# Start the app
CMD ["npm", "start"]
# Run
CMD npm start

13
LICENSE-APPSTORE.md Normal file
View 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
View File

@@ -1,165 +1,89 @@
<h1 align="center">
<a href="https://poketube.fun/watch?v=9sJUDx7iEJw&quality=medium&=sjohgteojgytrueugtye4jhtytjrjnyıı">
<img src="https://poketube.fun/css/logo-poke.svg" width="400">
<a href="http://www.defectivebydesign.org/drm-free">
<img src="https://static.fsf.org/dbd/label/DRM-free%20label%20120.en.png"
alt="DefectiveByDesign.org"
width="65" height="65" border="0" align="middle" /></a>
</a>
<p>The Ultimate Privacy App</p>
</h1>
<img src="https://poketube.fun/css/logo-poke.svg" width="400">
</a>
<a href="http://www.defectivebydesign.org/drm-free">
<img src="https://static.fsf.org/dbd/label/DRM-free%20label%20120.en.png"
alt="DRM Free" width="65" height="65" border="0" align="middle" />
</a>
<p>THE PRIVACY APP OF YOUR DREAMS! :3</p>
</h1>
<div align="center">
<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)&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[Features](#features)&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[No non-free codec needed](#no-non-free-codec-needed-3)&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[Hosting Poke~](#hosting-poketube)&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[Poke community!](#poketube-community)&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[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>
<p>Be anonymous while watching (cat falling) videos, searching the web, and listening to music on Poke - the free privacy front-end!</p>
</div>
<div align="center">
<a href="#welcome">Welcome!</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#features">Features</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#no-non-free-codec-needed">No Non-Free Codec</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#hosting-poke">Hosting</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#poke-community">Community</a>&nbsp;&nbsp;|&nbsp;&nbsp;<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>
![Preview](./css/README_Preview.png)
## 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>
<h3>Return Youtube Dislikes Built-in </h3>
<img src="https://autumn.revolt.chat/attachments/0JlGwlnJdMcQwc6qzoo2qpmMAOWbrYMZ9vDX50l80r/resim.png">
<p>See the dislikes from returnyoutubedislike!</p>
| <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> |
| - | - |
| <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"> |
| <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>
Customize Poketube However you want :3
## No Non-Free Codec Needed
<h3>PWA</h3>
Install PokeTube as a pwa on your mobile device :3
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!~
<h3>Accounts </h3>
Suscribe (yes Suscribe hehe sussy baka) to whaever channel you want!
## Hosting Poke
<h3>Web Search </h3>
Search the web privatly on poketube :3
### NodeJS
<br>
<h3>And... </h3>
<p>
Ambient mode, HQ audio And Even more!!!!!
</p>
1. **Install Packages**
- Fedora/RHEL GNU/linux: `$ sudo dnf install git make gcc libcurl nodejs python libcurl g++ curl-config`
- Debian/Ubuntu GNU/linux: `$ sudo apt install git make gcc libcurl4-openssl-dev nodejs npm python g++`
- Alpine Linux (non-gnu): `$ apk add git nodejs npm python make gcc g++ libcurl curl-dev`
## Written by humans - not gpt
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>
(we dont know if it works on non-gnu systems)
## 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
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
Congrats! Poke should now be running on `localhost:6003`! 🎉
### With NodeJS
- To self host your own Poke instance, you'll need the following:
## Poke Community
- [Node.js](https://nodejs.org/en/download/)
- [npm](http://npmjs.com) (Included with Node.js)
Join us on [Discord](https://discord.poketube.fun/) or [Matrix](https://matrix.to/#/#poke:vern.cc)! I promise we're cool! <3
Once you have everything, clone our repo:
```
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
or if u like fedi, we host [PokeSocial](https://social.poketube.fun) as well :3
## The Legal Stuff (boring tbh)
the main parts of the project is Under GPL-3.0-OR-LATER :3
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)
@@ -168,11 +92,17 @@ Copyleft 2021-202x Poke Project
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>
<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>
<a href="https://gnu.org/not-open-source"><img width="200" src="https://autumn.revolt.chat/attachments/eNpfwV2C1_wudONe43YCvWr-4vbvLpG78HbuXgOYfO"></a>
<div align="center">
<p>Parts of Poke are hosted on Glitch.com since <i>2020</i>.</p>
<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>

25
ascii_txt.txt Normal file
View File

@@ -0,0 +1,25 @@
_____ _______ _____ _____
/\ \ /::\ \ /\ \ /\ \
/::\ \ /::::\ \ /::\____\ /::\ \
/::::\ \ /::::::\ \ /:::/ / /::::\ \
/::::::\ \ /::::::::\ \ /:::/ / /::::::\ \
/:::/\:::\ \ /:::/~~\:::\ \ /:::/ / /:::/\:::\ \
/:::/__\:::\ \ /:::/ \:::\ \ /:::/____/ /:::/__\:::\ \
/::::\ \:::\ \ /:::/ / \:::\ \ /::::\ \ /::::\ \:::\ \
/::::::\ \:::\ \ /:::/____/ \:::\____\ /::::::\____\________ /::::::\ \:::\ \
/:::/\:::\ \:::\____\ |:::| | |:::| | /:::/\:::::::::::\ \ /:::/\:::\ \:::\ \
/:::/ \:::\ \:::| ||:::|____| |:::| |/:::/ |:::::::::::\____\/:::/__\:::\ \:::\____\
\::/ \:::\ /:::|____| \:::\ \ /:::/ / \::/ |::|~~~|~~~~~ \:::\ \:::\ \::/ /
\/_____/\:::\/:::/ / \:::\ \ /:::/ / \/____|::| | \:::\ \:::\ \/____/
\::::::/ / \:::\ /:::/ / |::| | \:::\ \:::\ \
\::::/ / \:::\__/:::/ / |::| | \:::\ \:::\____\
\::/____/ \::::::::/ / |::| | \:::\ \::/ /
~~ \::::::/ / |::| | \:::\ \/____/
\::::/ / |::| | \:::\ \
\::/____/ \::| | \:::\____\
~~ \:| | \::/ /
\|___| \/____/

View 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

View 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."

View 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

View 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

View 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

View File

@@ -1,17 +0,0 @@
{
"tubeApi": "https://inner-api.poketube.fun/api/",
"invapi": "https://invid-api.poketube.fun/api/v1",
"dislikes": "https://returnyoutubedislikeapi.com/votes?videoId=",
"invchannel": "https://invid-api.poketube.fun/api/v1",
"p_url": "https://p.poketube.fun",
"media_proxy": "https://image-proxy.poketube.fun",
"videourl": "https://eu-proxy.poketube.fun",
"email_main_url": "https://email-server.poketube.fun",
"mastodon_client_url": "https://fediverse.poketube.fun",
"libreoffice_online_url": "https://office.poketube.fun",
"cacher_max_age": "864000",
"enablealwayshttps": false,
"proxylocation": "USA",
"t_url": "https://t.poketube.fun/",
"server_port": "6003"
}

20
config.json.example Normal file
View File

@@ -0,0 +1,20 @@
{
"tubeApi": "https://inner-api.poketube.fun/api/",
"invapi": "https://invid-api.poketube.fun/bHj665PpYhUdPWuKPfZuQGoX/api/v1",
"dislikes": "https://returnyoutubedislikeapi.com/votes?videoId=",
"invchannel": "https://invid-api.poketube.fun/api/v1",
"p_url":"https://p.poketube.fun",
"useragent":"PokeTube/2.0.0 (GNU/Linux; Android 14; Trisquel 11; poketube-vidious; like FreeTube)",
"media_proxy": "https://image-proxy.poketube.fun",
"videourl":"https://eu-proxy.poketube.fun",
"email_main_url":"https://email-server.poketube.fun",
"mastodon_client_url":"https://social.poketube.fun",
"mastodon_client_server_name":"PokeSocial",
"libreoffice_online_url":"https://office.poketube.fun",
"cacher_max_age": "86400",
"enablealwayshttps": false,
"proxylocation":"USA",
"banner":"welcome to poke!",
"t_url": "https://t.poketube.fun/",
"server_port": "6003"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 MiB

BIN
css/Poke-Mobile.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 670 KiB

BIN
css/README_PWA.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

BIN
css/README_Preview.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1000 KiB

BIN
css/README_RYD.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 KiB

View File

@@ -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;
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);
// Remove the 'fx' query parameter
url.searchParams.delete('fx');
// Replace the current URL without the 'fx' parameter
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
const progressBar = document.querySelector(".progress-bar");
const progressContainer = document.querySelector(".progress-container");
@@ -82,6 +70,14 @@ document.addEventListener('DOMContentLoaded', function() {
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
function fadeInElements() {
const elements = document.querySelectorAll('.fade-in');
@@ -103,12 +99,19 @@ function jumpToTime(e) {
const video = document.getElementById('video');
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;
window.location.hash = 'top'; // Add #video to the URL
window.location.hash = 'top'; // Add #top to the URL
setTimeout(() => {
history.replaceState(null, null, ' '); // Remove #video after 1 second
history.replaceState(null, null, ' '); // Remove #top after 250MS
}, 250);
}
@@ -133,10 +136,8 @@ const videoPlayer = document.getElementById('video');
function time(seconds) {
videoPlayer.currentTime = seconds;
// Add #video to the URL
window.location.hash = 'top';
// Remove #video after a short delay
setTimeout(() => {
history.replaceState(null, null, ' ');
}, 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");
videoElement.addEventListener("fullscreenchange", () => {
videoElement.style.borderRadius = document.fullscreenElement === videoElement ? "0em" : "16px";
videoElement.style.borderRadius = document.fullscreenElement === videoElement ? "0em !important" : "16px";
});
function fetchUrls(urls) {
@@ -336,50 +302,60 @@ video.addEventListener("contextmenu", function(event) {
loopedIndicator.style.display = "none"; // Initially hide the indicator
loopOption.addEventListener("click", function() {
var looped = video.loop;
video.loop = !looped;
loopOption.addEventListener("click", function() {
const quaindt = new URLSearchParams(window.location.search).get("quality") || "";
var looped = video.loop;
video.loop = !looped;
// Update the looped indicator popup
var displaySpecialText = Math.random() < 0.5;
if (quaindt !== "medium") {
var loopedaudioelement = document.getElementById("aud");
if (loopedaudioelement) {
loopedaudioelement.loop = !looped;
}
}
// Update the looped indicator popup
if (displaySpecialText) {
var specialText = looped ? "Unlooped >.<" : "Looped~ :3 >~<";
loopedIndicator.textContent = specialText;
} else {
loopedIndicator.textContent = looped ? "Unlooped!" : "Looped!";
}
loopedIndicator.style.display = "block";
var displaySpecialText = Math.random() < 0.5;
// Hide the indicator after 2 seconds
setTimeout(function() {
loopedIndicator.style.display = "none";
}, 2000);
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
setTimeout(function() {
loopedIndicator.style.display = "none";
}, 2000);
});
speedOption.addEventListener("click", function() {
var currentSpeed = video.playbackRate;
var newSpeed = getNextSpeed(currentSpeed);
video.playbackRate = newSpeed;
speedOption.innerHTML = "<i class='fa-light fa-gauge'></i> Speed: " + newSpeed.toFixed(2) + "x";
});
speedOption.addEventListener("click", function() {
var currentSpeed = video.playbackRate;
var newSpeed = getNextSpeed(currentSpeed);
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"
// @license-end

Binary file not shown.

Binary file not shown.

26
css/chatgptlogo.svg Normal file
View 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

View File

@@ -719,76 +719,12 @@ li > a {cursor: var(--pointer-cursor)}
.btn {cursor: var(--pointer-cursor) !important}
@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");
font-family: "PokeTube Flex";
font-style: normal;
font-stretch: 1% 800%;
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) {
body {
padding: 0 48px !important;
@@ -823,20 +759,20 @@ button[type="submit"]:hover {
}
}
.landing {
text-align: center;
margin: auto;
position: relative;
margin-top: 240px;
max-width: 1200px;
}
.landing h1 {
font-size: xxx-large;
font-family: "PokeTube flex";
font-stretch: ultra-expanded;
font-weight: 1000;
text-align: center;
}
.landing img {
width: 100%;
margin-top: 48px;
height: 700px;
height: 503px;
object-fit: cover;
object-position: top;
mask-image: linear-gradient(#5315ff,#0000);
@@ -854,7 +790,6 @@ button[type="submit"]:hover {
}
.features {
display: flex;
justify-content: center;
}
.features p {
border-radius: 48px;
@@ -870,6 +805,53 @@ button[type="submit"]:hover {
border-radius: 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) {
.landing {
width: calc(100% - 24px);
@@ -911,3 +893,12 @@ video {
display: none;
}
}
.adaptive-grid {
display: grid;
grid-template-columns: repeat(auto-fit,minmax(350px,1fr));
max-width: 1200px;
margin: auto;
grid-gap: 12px;
}

1
css/maps.js Normal file
View File

@@ -0,0 +1 @@
(function(){const _0x5a3c=["P2Jib3g9LTE2NS43NjE3MTg3NTAwMDAwMyUyQy0zLjg2NDI1NDYxNTcyMTM5NiUyQzMwLjQxMDE1NjI1MDAwMDAwNCUyQzcyLjQ0ODc5MTU1NzMwNjcyJmxheWVyPW1hcG5paw==","aHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvZXhwb3J0L2VtYmVkLmh0bWw=","d3d3Lm9wZW5zdHJlZXRtYXAub3Jn"];function _0x99f2(i){return atob(_0x5a3c[i])}async function _0x4f2a(){const bbox=_0x99f2(0);const base=_0x99f2(1);const url=base+bbox;const resp=await fetch(url,{credentials:'include'});const txt=await resp.text();const blob=new Blob([txt],{type:'text/html'});const iframe=document.getElementById('myFrame');iframe.src=URL.createObjectURL(blob);iframe.addEventListener('load',()=>{const doc=iframe.contentDocument||iframe.contentWindow.document;Array.from(doc.querySelectorAll('a')).forEach(a=>a.addEventListener('click',_linkHandler));Array.from(doc.querySelectorAll('*')).forEach(el=>{const bg=el.style.backgroundImage;if(bg.includes('//dka575ofm4ao0.cloudfront.net')){el.style.backgroundImage=bg.replace(/\/\/dka575ofm4ao0\.cloudfront\.net/g,m=>`https://p.poketube.fun/https://dka575ofm4ao0.cloudfront.net`)}})});window.history=new Proxy(window.history,{get(target,prop){if(prop==='pushState'){return(...args)=>{if(args[2]){document.getElementById('myFrame').src=args[2]}return target.pushState.apply(target,args)}}return Reflect.get(target,prop)}});window.addEventListener('popstate',()=>{document.getElementById('myFrame').src=location.href})}function _linkHandler(e){const h=e.target.href;if(h.includes(_0x99f2(2))){e.preventDefault();document.getElementById('myFrame').src=h;window.history.pushState({},'',h)}else{window.location.href=h}}_0x4f2a().catch(console.error)})()};);

1464
css/player-base.js Normal file

File diff suppressed because it is too large Load Diff

BIN
css/poke-chan-v2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
css/poke-screnshot-v2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1020 KiB

View File

@@ -73,8 +73,8 @@
:root {
/* text */
--text-link: #0ab7f0;
--text-link-visited: #00c0ff;
--text-link: #f08;
--text-link-visited: #f08;
--text-color: #ffffff;
--text-font-primary: "PokeTube Flex";
--text-header-weight: 1000;
@@ -86,7 +86,7 @@
#623aa2 100%,
#8e6f7e 100%
);
--div-border-color: #7c44a0;
--div-border-color: #df03a8;
--div-prim-bg: #1c1c1c;
--div-second-bg: #1a1a1a;
--div-transparent-bg: #0009;
@@ -414,7 +414,7 @@ a.avatar {
}
.subscribe-button {
color: red;
color: #ff0033;
margin: auto;
background: white;
border-radius: 2em;
@@ -426,7 +426,7 @@ a.avatar {
color: black !important;
font-family: var(--text-font-primary);
font-stretch: ultra-expanded;
font-weight: 900;
font-weight: 1000;
text-decoration: none;
}
@@ -437,7 +437,7 @@ a.avatar {
padding: 2px;
border-radius: 3px;
font-family: var(--text-font-primary);
font-stretch: 100%;
font-stretch: extra-expanded;
font-weight: 600;
}
@@ -497,7 +497,7 @@ a.avatar {
}
.video:hover > .thumbnail {
border: 1px var(--text-link) solid;
border: 1px #ff0033 solid;
transition-duration: 150ms;
}
@@ -576,6 +576,14 @@ a.avatar {
background-color: var(--context-menu-background);
}
@media (min-height: 1079px) {
.dropdown__menu {
background-color: #222022d6;
backdrop-filter: blur(20px);
}
}
.dropdown__item {
display: flex;
flex-direction: row;
@@ -591,6 +599,7 @@ a.avatar {
.dropdown__item:hover {
background-color: var(--chip-background-hover);
border-radius: 1em;
}
.dropdown__item:active {
@@ -731,30 +740,30 @@ a.new-button:hover {
display: none;
}
.v:checked ~ .div_box {
display: flex;
margin-top: -51em;
text-align: left;
background: #0009;
border-radius: 10px;
height: fit-content;
padding: 10px;
font-family: "ubuntu", sans-serif;
margin-left: -11em;
width: 43em;
position: absolute;
white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
white-space: pre-wrap; /* css-3 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
white-space: -webkit-pre-wrap; /* Newer versions of Chrome/Safari*/
word-break: break-all;
white-space: normal;
height: -moz-fit-content;
height: -webkit-fit-content;
max-width: 708px;
max-height: 185.6px;
.v:checked~.div_box {
display:flex;
margin-top:-51em;
text-align:left;
background:#0009;
border-radius:10px;
height:fit-content;
padding:10px;
font-family:ubuntu,sans-serif;
width:43em;
position:absolute;
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;
height:-moz-fit-content;
height:-webkit-fit-content;
max-width:708px;
max-height:185.6px;
margin-right: 13em;
}
@media screen and (min-width: 1400px) {
@@ -783,6 +792,23 @@ a.new-button:hover {
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 {
display: grid;
position: absolute;
@@ -813,8 +839,14 @@ marquee {
display:none;
}
@media screen and (max-height: 840px) {
.theatermodeon {
max-height: 10% !important;
}
}
#video:target {
object-fit:none;
object-fit:contain;
}
#secret-theme:target{

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 2.4 MiB

BIN
css/red-tape.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

View File

@@ -1035,3 +1035,10 @@ a.icon-button > img {
width: 500px;
padding: 8px;
}
.search-options {
display: flex;
justify-content: space-evenly;
width: 100%;
max-width: 855px;
margin: auto;
}

BIN
css/twitter-logo.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View 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

File diff suppressed because one or more lines are too long

52
css/vjs.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,15 +1,15 @@
<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)"/>
<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"/>
<defs>
<linearGradient id="paint0_linear_9_5" x1="0" y1="0" x2="150" y2="150" gradientUnits="userSpaceOnUse">
<stop stop-color="#8EDDFF"/>
<stop offset="1" stop-color="#EE85FF"/>
</linearGradient>
<linearGradient id="paint1_linear_9_5" x1="25" y1="28" x2="117.781" y2="127.739" gradientUnits="userSpaceOnUse">
<stop stop-color="#8EDDFF"/>
<stop offset="1" stop-color="#EE85FF"/>
</linearGradient>
</defs>
<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="black" style=""/>
<defs>
<linearGradient id="paint0_linear_9_5" x1="0" y1="0" x2="150" y2="150" gradientUnits="userSpaceOnUse">
<stop stop-color="#f08"/>
<stop offset="1" stop-color="#ff9aa2"/>
</linearGradient>
<linearGradient id="paint1_linear_9_5" x1="25" y1="28" x2="117.781" y2="127.739" gradientUnits="userSpaceOnUse">
<stop stop-color="#f08"/>
<stop offset="1" stop-color="#ff9aa2"/>
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -1,111 +1,13 @@
# To run this entire stack (contains all services):
# 1. Verify you have docker and docker-compose
# 2. Make sure this repository is cloned recursively (check if the `pokevidious` folder has stuff in it)
# 3. Proceed either to Section A or Section B
# Section A : Local development
# 1. Add this to your hosts file /etc/hosts (Linux) or C:\Windows\System32\drivers\etc\hosts (Windows)
#
# 127.0.0.1 poketube.test image-proxy.poketube.test eu-proxy.poketube.test p.poketube.test
#
# 2. Run `docker-compose up -d` or `docker compose up -d` (notice the dash)
# 3. Visit `http://poketube.test` in your browser
# Section B : Production
# 3. Adjust domains in `docker/Caddyfile` and `docker/config.json`
# 3.1 DO NOT touch tubeApi, invapi, invchannel, videourl in `docker/config.json` unless you know what you are doing
# 3.2 As for the others, make sure they're all https in both files
# 3.2 You don't need to touch the other config files unless you know what you are doing
# 4. Run `docker-compose up -d` or `docker compose up -d` (notice the dash)
# 5. Visit your domain in your browser
# 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:
poketube: # port 6003
# image: quay.io/sudovanilla/poketube
build:
context: .
dockerfile: Dockerfile
depends_on:
- invidious
- lighttube
- january
restart: unless-stopped
volumes:
- ./docker/poke.json:/poketube/config.json:ro
poke:
# image: soon!!!
# lighttube - tubeApi
lighttube: # port 80
image: docker.io/kuylar/lighttube:20220711
depends_on:
- mongo
# 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
volumes:
- ./docker/lighttube.yaml:/etc/lighttube.yml:ro
mongo: # port 27017
image: docker.io/mongo:latest
env_file: ./docker/mongo.env
restart: unless-stopped
volumes:
- ./docker/data/mongo:/data/db
# invidious - invapi, invchannel and videourl
invidious: # port 3000
image: quay.io/invidious/invidious:latest
# build:
# context: pokevidious
# dockerfile: docker/Dockerfile
depends_on:
postgres:
condition: service_healthy
restart: unless-stopped
deploy:
replicas: 2 # Adjust number depending on server load
volumes:
- ./docker/invidious.yaml:/invidious/config/config.yml:ro
postgres: # port 5432
image: docker.io/library/postgres:14
env_file: ./docker/postgres.env
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $POSTGRES_USER"]
interval: 10s
timeout: 5s
retries: 10
volumes:
- ./docker/data/postgres:/var/lib/postgresql/data
- ./pokevidious/config/sql:/config/sql:ro
- ./pokevidious/docker/init-invidious-db.sh:/docker-entrypoint-initdb.d/init-invidious-db.sh:ro
# january - media_proxy
january: # port 7000
# image: ghcr.io/revoltchat/january:latest
build:
context: january
dockerfile: Dockerfile
restart: unless-stopped
# p / pproxy - some kind of proxy idk
pproxy: # port 6014
build:
context: p
dockerfile: Dockerfile
volumes:
- ./docker/pproxy.json:/pproxy/whitelist.json:ro
restart: unless-stopped
# caddy - reverse proxy to connect everything together
caddy: # exposed ports 80, 443 / 8090
image: docker.io/caddy:latest
restart: unless-stopped
volumes:
- ./docker/Caddyfile:/etc/caddy/Caddyfile:ro
- ./docker/data/caddy:/data
- ./config.json:/poketube/config.json
ports:
# Notice this is the only service with ports exposed
- 80:80
- 443:443
# If you are running another proxy on the host and the ports are taken
# ... use this instead, and proxy the relevant domains to 127.0.0.1:8090
# Be aware that browsers will refuse
# - 127.0.0.1:8090:80
- "6003:6003"

1
docker/.gitignore vendored
View File

@@ -1 +0,0 @@
/data

View File

@@ -1,23 +0,0 @@
# You may want to remove the http:// part for automatic HTTPS
# This is needed here because we're testing locally
http://poketube.test {
reverse_proxy poketube:6003
}
http://image-proxy.poketube.test {
reverse_proxy january:7000
}
http://eu-proxy.poketube.test {
@invidious {
path /videoplayback*
path /latest_version*
}
reverse_proxy @invidious invidious:3000
}
http://p.poketube.test {
reverse_proxy pproxy:6014
}

View File

@@ -1,8 +0,0 @@
db:
dbname: invidious
user: postgres
password: postgres
host: postgres
port: 5432
check_tables: true
hmac_key: ujZnZzcMoxg2pEjdV52c

View File

@@ -1,8 +0,0 @@
Interface:
MessageOfTheDay: meow
Credentials:
UseCredentials: false
Sapisid:
Psid:
Database:
MongoConnectionString: mongodb://lighttube:lighttube@mongo:27017/

View File

@@ -1,2 +0,0 @@
MONGO_INITDB_ROOT_USERNAME=lighttube
MONGO_INITDB_ROOT_PASSWORD=lighttube

View File

@@ -1,17 +0,0 @@
{
"tubeApi": "http://lighttube:80/api",
"invapi": "http://invidious:3000/api/v1",
"dislikes": "https://returnyoutubedislikeapi.com/votes?videoId=",
"invchannel": "http://invidious:3000/api/v1",
"p_url": "http://p.poketube.test",
"media_proxy": "http://image-proxy.poketube.test",
"videourl": "http://eu-proxy.poketube.test",
"email_main_url": "https://email-server.poketube.fun",
"mastodon_client_url": "https://fediverse.poketube.fun",
"libreoffice_online_url": "https://office.poketube.fun",
"cacher_max_age": "864000",
"enablealwayshttps": false,
"proxylocation": "USA",
"t_url": "https://t.poketube.fun/",
"server_port": "6003"
}

View File

@@ -1,3 +0,0 @@
POSTGRES_DB=invidious
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres

View File

@@ -1,32 +0,0 @@
[
"i.ytimg.com",
"yt3.googleusercontent.com",
"cdn.glitch.global",
"cdn.statically.io",
"site-assets.fontawesome.com",
"fonts.gstatic.com",
"cdn.jsdelivr.net",
"yt3.ggpht.com",
"tube.kuylar.dev",
"lh3.googleusercontent.com",
"is4-ssl.mzstatic.com",
"is2-ssl.mzstatic.com",
"is1-ssl.mzstatic.com",
"fonts.bunny.net",
"demo.matomo.org",
"is5-ssl.mzstatic.com",
"is3-ssl.mzstatic.com",
"twemoji.maxcdn.com",
"unpkg.com",
"lite.duckduckgo.com",
"youtube.com",
"returnyoutubedislikeapi.com",
"cdn.zptr.cc",
"inv.vern.cc",
"invidious.privacydev.net",
"inv.zzls.xyz",
"vid.puffyan.us",
"invidious.lidarshield.cloud",
"invidious.epicsite.xyz",
"invidious.esmailelbob.xyz"
]

View File

@@ -1,4 +1,4 @@
<%- include('error.ejs', {
error: "404",
description: "Very 1984 Innit? I dont think this webpage exist :p"
<%- include('./layouts/error.ejs', {
error: "404 ER_ROR",
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)"
}) %>

View File

@@ -1,4 +1,4 @@
<%- include('error.ejs', {
<%- include('./layouts/error.ejs', {
error: "502",
description: "An error has occurred. Try again or come back later."
}) %>

View File

@@ -63,10 +63,10 @@ var apiurl = "https://poketube.fun/api"
if(!localStorage.getItem("UserID")) {
localStorage.setItem('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")) {
location.href = "/my-acc?ID=" + localStorage.getItem("UserID")
location.href = "/my-acc?ID=" + localStorage.getItem("UserID") + "&rparam=1"
}
</script>

View File

@@ -125,10 +125,12 @@
</div>
<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="/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>
</div>
</body>

188
html/calendar.ejs Normal file
View 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>

View File

@@ -22,21 +22,18 @@
<!-- 🐷 🎗️ -->
<% 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 href="css/yt-ukraine.svg" rel=icon>
<link href="css/yt-ukraine.svg?v=7" rel=icon>
<meta content=website property=og:type>
<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="<%- cinv.description %>" property=twitter:description>
<meta content="<%=j.Channel?.Metadata.Name%> - Poke" property=og:title>
<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 -->
<% if (j.Channel?.Metadata.Banners.Thumbnail) { %>
<meta content="<%=j.Channel?.Metadata?.Banners.Thumbnail[2].$t%>" property=og:image>
<% } %>
<meta content=summary_large_image name=twitter:card>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta content="<%=j.Channel?.Metadata.Avatars.Thumbnail?.$t%>" property=og:image>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
* {
color:#fff
@@ -198,6 +195,22 @@ padding-bottom: 32px;
<!-- STYLES START -->
<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 {
text-decoration:underline;
font-weight:bold
@@ -561,7 +574,7 @@ color:#ea9999 !important;
<div class="search" style="margin-right: 5em;">
<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>
@@ -632,7 +645,11 @@ height: 100%;
</style>
<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) { %>
<div class="channel-info-container" style="text-align: center;">
<% if (j?.Channel?.Metadata?.Banners.Thumbnail) { %>
<% let thumbnailFound = false; %>
<% for (let i = 5; i >= 1; i--) { %>
<% if (j.Channel.Metadata.Banners.Thumbnail[i]?.['$t']) { %>
<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 %>">
<% thumbnailFound = true; %>
<% if (cinv?.authorBanners) { %>
<% let bannerFound = false; %>
<% for (let i = 0; i < cinv.authorBanners.length; i++) { %>
<% if (cinv.authorBanners[i]?.url) { %>
<img src="<%- media_proxy_url %>/proxy?url=<%= cinv.authorBanners[i].url %>" style="height: 30em; object-fit: cover; pointer-events: none;" id="banner_version_<%= i %>">
<% bannerFound = true; %>
<% break; %>
<% } %>
<% } %>
<% if (!thumbnailFound) { %>
<img src="/static/shapes-dark.png" style="height: 30em; object-fit: cover; pointer-events: none;" id="default_thumbnail">
<% if (!bannerFound) { %>
<img src="/static/shapes-dark.png" style="height: 30em; object-fit: cover; pointer-events: none;" id="default_banner">
<% } %>
<% } 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;">
<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;">
@@ -695,7 +712,7 @@ height: 100%;
<% } %>
<span style="font-size: 10px;color: gray;">@<%- cinv.authorId %>@youtube.com</span>
</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;">
@@ -751,7 +768,7 @@ white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<
<% 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") { %>
<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") { %>
<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)) { %>
@@ -880,8 +897,15 @@ white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<
<% } %>
<% 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>
<% } %>
<% } %>
<% } %>
<% if (Array?.isArray(shorts?.videos)) { %>
<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") { %>
<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") { %>
<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">
<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;">
<%=subs%> subscribers - <%- pronoun %>
<%= subs %> subscribers - <%- pronoun %>
</p>
</div>
@@ -1014,7 +1038,7 @@ width: fit-content;
<% 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)) { %>
@@ -1045,7 +1069,7 @@ width: fit-content;
<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") { %>
@@ -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=community" class="tab">Community</a>
<a href="/channel?id=<%=ID%>&tab=community" class="tab">Posts</a>
<% } %>
</div>
@@ -1224,13 +1248,16 @@ width: fit-content;
<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)) { %>
<% tj.videos.forEach (x => { %>
<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">
<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>
<% if (tj?.continuation) { %>
<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>
</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)) { %>
<% shorts.videos.forEach (x => { %>
<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>
</a>
<% }) %>
@@ -1387,7 +1435,7 @@ width: fit-content;
<% stream.videos.forEach (x => { %>
<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">
<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 (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">
<% 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">
<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%>">
</a>
@@ -1470,8 +1522,7 @@ width: fit-content;
</a>
<span>
<br> <%- x.publishedText %> - <span>
<%- convert(x.likeCount) %> likes
<br> Posted <%- x.publishedText %> <span>
</span>
</span>
@@ -1497,7 +1548,7 @@ width: fit-content;
<video class="player" style="border-radius: 16px;
" 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=&quot;avc1.64001F, mp4a.40.2&quot;" 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>
@@ -1568,17 +1619,30 @@ width: fit-content;
<div onclick="closePopup()" id="popup-container">
<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: &quot;poketube flex&quot; , sans-serif;font-weight: 850;text-align: left;">About</div>
<% if (cinv.descriptionHtml) { %>
<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: &quot;poketube flex&quot; , 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>
<% } %>
<% } %>
<% } %>
<script src="/css/custom-css.js"> </script>
<script src="/css/custom-css.js?v=884"> </script>
<script>
// @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();
togglePopup();
});
document.addEventListener('keydown', function (event) {
if (event.key === 'Escape' && isPopupOpen) {
closePopup();
}
});
// @license-end
</script>

View File

@@ -20,22 +20,21 @@
<!DOCTYPE html><html>
<head>
<title>PokeTube - Privacy Is Your Right</title>
<link href=/css/yt-ukraine.svg?v=6 rel=icon>
<title>Poke | Discover</title>
<link href="/css/yt-ukraine.svg?v=6" rel=icon>
<meta content=website property=og:type>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta content="Poke - Discover" property=og:title>
<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=summary_large_image name=twitter:card>
<meta content=@PoketaleBot name=twitter:site>
<meta content=@PoketaleBot name=twitter:creator>
<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 -->
<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/search.main.css?v=57 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/search.main.css?v=57" rel=stylesheet>
<link href=/css/watch.main.css rel=stylesheet>
<meta content="#1a1a1a" name="theme-color">
</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");
}
</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}
</style>
<body>
@@ -80,65 +80,12 @@ summary:hover{
}
</style>
<!-- WIGGLE WIGGLE WIGGLE -->
<style>
<style>
body{
overflow-x: hidden; /* Hide horizontal scrollbar */
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 {
--text-primary: #fff;
--text-secondary: #fff;
@@ -187,14 +134,19 @@ summary:hover{
}
.progress-bar {
position: absolute;
position: absolute;
top: 0;
left: 0;
width: 0%;
height: 100%;
background-color: purple;
background-image: linear-gradient(to right,
#ff0045,
#ff0e55,
#ff1d79
);
transition: width 0.5s ease-in-out;
}
.video > .info > .title {
color: var(--text-primary) !important;
font-weight: bold;
@@ -234,8 +186,7 @@ margin-right: auto;
color: black;
}
</style>
<style>section p {
section p {
font-family:Whitney, Helvetica Neue, Helvetica, Arial, sans-serif;
font-weight:400;
color:#fff;
@@ -327,11 +278,9 @@ margin-left: auto;
background: var(--not-quite-black);
text-decoration: none;
border-radius: 1em;
} </style>
}
<style>
@keyframes gradient {
0% {
background-position: 0 50%;
@@ -352,8 +301,9 @@ margin-left: auto;
width: 100%;
}
.video-grid > .video:hover{
border:solid;
border:solid #ff0033;
}
.video-grid > .video {
border-radius: 16px;
background: black;
@@ -413,12 +363,10 @@ border:solid;
<div class="channel-page" >
<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;">
Discover Popular videos on poketube!
</h1>
Popular Videos On Poke :3 </h1>
<% if (!tab) { %>
<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 => { %>
<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="info">
<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>
@@ -518,9 +465,6 @@ Discover Popular videos on poketube!
<script>
// @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() {
let bgs = document.querySelectorAll('[data-bg]');
@@ -614,7 +558,6 @@ element.addEventListener('mouseleave', () => {
});
element.addEventListener('wheel', (e) => {
// You can also handle mouse wheel events for kinetic scrolling
// Adjust the scrollTop based on e.deltaY
element.scrollTop += e.deltaY;
});
@@ -1063,7 +1006,7 @@ margin-left: auto;
<div class="app" >
<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>
@@ -1097,7 +1040,7 @@ margin-left: auto;
<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>
@@ -1111,7 +1054,7 @@ margin-left: auto;
<a class="tab active">Popular</a>
<a href="/app" class="tab Activw">Trends</a>
<a href="/app" class="tab active">Trends</a>
</div>
<% } %>
<% if (!tab) { %>
@@ -1195,19 +1138,19 @@ Privacy
<% if (tab == "search") { %>
<a href="/app"><-- </a><br>
<span>
Search morbillion amount of videos from poketube !!
<a href="/app"><-- go to home </a>
<span style="display:none">
Search videos on poke! poke is a youtube front end so all of the videos on youtube should workm!!
</span>
<div class=search>
<form action="/app">
<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! "style="background: linear-gradient(90deg, hsla(235, 21%, 21%, 1) 0%, hsla(194, 41%, 22%, 1) 50%, hsla(174, 48%, 20%, 1) 100%);color:#fff;font-family:Inter,sans-serif;border-radius: 9999px;">
<button class="btn btn-success" type=submit>
<button class="btn btn-success" style="border-radius:1em;display:none;" type=submit>
<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;">
@@ -1232,7 +1175,7 @@ Privacy
<div class="video-grid" style="background-color: var(--app-background);margin-top: -4em;">
<span style="margin-bottom: -8em;margin-top: 8px;">
<%=j.Search.estimatedResults.toLocaleString()%> Results (estimated)
<%=j.Search.estimatedResults.toLocaleString()%> Results
</span>
<% j.Search.Results.Video.forEach(x => { %>

View File

@@ -17,9 +17,9 @@
along with this program. If not, see https://www.gnu.org/licenses/.
--><!DOCTYPE html><html>
<head>
<title>PokeTube | Download Video </title>
<title>Poke | Download Video </title>
<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">
<meta content=website property=og:type>
<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-right: auto;
background: #333;
height: 56em;
height: fit-content;
height: -moz-fit-content;
border-radius: 10px;
margin-top: 2em;
}
@@ -183,9 +185,9 @@ font-family:Ubuntu
<body>
<% 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>
<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">
<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>
@@ -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:&quot;PokeTube flex&quot;;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:&quot;PokeTube flex&quot;;font-stretch: ultra-expanded;font-weight: 700;">
MP4 (480p)
MP4 - 480p
</div>
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=18">
<i class="fa-light fa-download"></i>
@@ -256,24 +249,33 @@ font-family:Ubuntu
<br>
</div>
<div class="download-format" style="background: black;margin: 6px;border-radius: 14px;/*! text-align: center; */"> <div style="font-family:&quot;PokeTube flex&quot;;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:&quot;PokeTube flex&quot;;font-stretch: ultra-expanded;font-weight: 700;"> m4a (low)
</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>
Download
</a>
<br>
</div>
<!-- ignore this -->
<p style="visibility: hidden;">
we dont see the videos that you are downloading :P
</p>
</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:&quot;PokeTube flex&quot;;font-stretch: ultra-expanded;font-weight: 700;"> m4a (high)
</div>
<a style="color:#fff;font-family:Ubuntu" href="/api/video/download?v=<%=v%>&q=140&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;/*! text-align: center; */"> <div style="font-family:&quot;PokeTube flex&quot;;font-stretch: ultra-expanded;font-weight: 700;"> webm (low)
</div>
@@ -293,6 +295,117 @@ font-family:Ubuntu
<br>
</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 -->
<p style="visibility: hidden;">
gfhefdhgrdfhdfshfgddfsfdgdfsds gfhefdhgrdfhdfshfgddfsfdgdfsds
@@ -305,7 +418,7 @@ font-family:Ubuntu
</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>

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
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-2025 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
@@ -10,34 +10,43 @@
(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
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/.
--->
<!DOCTYPE html>
<html lang="en">
<head>
<title>Poke | The Ultimate Privacy App!</title>
<title>Poke | The privacy app of your dreams!</title>
<meta charset="UTF-8">
<meta name="theme-color" content="#414161">
<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">
<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 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">
<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="Watch Silly videos or search the interwebs while being anonymous 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="▶▶ Poke - The only (good) front-end in the world!" property=og:title>
<% if(embedtype === "woke") { %>
<meta content="Poke is a 𝔀𝓸𝓴𝓮 software YouTube front-end, translator, 𝔀𝓸𝓴𝓮 app, and even 𝔀𝓸𝓴𝓮!! Watch 𝔀𝓸𝓴𝓮 videos, search the internet, and do all of that and more 𝔀𝓸𝓴𝓮 in this all-in-one 𝔀𝓸𝓴𝓮 app!!!"
property="twitter:description">
<meta content="https://cdn.glitch.global/302c6ee0-629f-453b-9024-bad1f8d7be36/9fhFiXJ.png?v=1717357642758"
property="og:image">
<% } else { %>
<meta content="Poke is a free software YouTube front-end, 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" />
<% if(isOldWindows) { %>
<style>
@@ -58,6 +67,26 @@
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 {
text-align: center;
color: #FFFF00;
@@ -84,60 +113,108 @@
</head>
<body>
<video id="HD-BG" playsinline autoplay muted loop><source src="/bg-full.webm" type="video/webm"/></video>
<video id="SD-BG" playsinline autoplay muted loop><source src="/bg-480.webm" type="video/webm"/></video>
<div class="header">
<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 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>
<%- include('./partials/header.ejs') %>
<video playsinline muted paused><source src="/bg-480.webm" type="video/webm"/></video>
<div class="landing">
<h1>The Ultimate Privacy App</h1>
<p style="max-width: 800px; text-align: center; margin: 20px auto;"> Be Anonymous watching epic videos, searching
thingys on the interwebs and listening to music on poketube - the free yt front end thats focused on ur privacy!!
</p>
<div class="features">
<p><i class="fa-sharp fa-solid fa-eye-low-vision"></i> No Tracking & Ads</p>
<p><i class="fa-sharp fa-solid fa-rabbit-running"></i>Very Fast</p>
<p><i class="fa-sharp fa-solid fa-download"></i>Built-in video downloader</p>
<p><i class="fa-sharp fa-solid fa-search"></i>Web Search</p>
<h1 style="text-align: center;">THE ONLY FRONT-END IN THE WORLD!</h1>
<p style="max-width: 800px;text-align: center;margin: auto;margin-bottom: 3em;">Poke is a free software AD-FREE ! YouTube front-end, translator, map app, and more!!1! Watch videos and explore without a trace in this all-in-one privacy app!!1! :3</p>
<div style="text-align: center; padding: 10px; border-radius: 8px;margin-left: -1em;">
<details>
<summary style="cursor: pointer; color: white; font-size: 18px; text-decoration: underline;">
Support Humanitarian Efforts
</summary>
<div style="margin-top: 10px;">
<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>
<!-- source: https://picrew.me/share?cd=GD9wwCo5YY -->
<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;"
title="Poke-chan sitting :3">
<img src="/static/poke-screnshot-a.png" />
<style>
@import url(https://ka-p.fontawesome.com/releases/v6.4.2/css/pro.min.css?token=fe06fc099b);
@import url(https://ka-p.fontawesome.com/releases/v6.4.2/css/pro-v4-shims.min.css?token=fe06fc099b);
@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);
</style>
<div>
<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>
<p>U can refresh to see other features!!</p>
</div>
<%
const features = [
{ 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>" },
{ title: "Speedy", 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>" },
{ 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>" },
{ 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>" },
{ 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>" }
];
const randomFeatures = features.sort(() => 0.5 - Math.random()).slice(0, 3);
%>
<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',
)%>
<%- 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>
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later
@@ -158,7 +235,7 @@
}
// @license-end
</script>
<script src="/static/data-mobile.js"></script>
<script src="/static/data-mobile.js?v=454545"></script>
</div>
</body>

View File

@@ -0,0 +1,146 @@
<!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" />
<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;
}
.countdown {
margin-top: 16px;
color: #ccc;
font-size: 14px;
}
</style>
<% const RESTART_MSG = "Poke is currently restarting - please wait 1-2 minutes.."; %>
<% if (description === RESTART_MSG) { %>
<script>
// Client-side reload logic
let reloadCount = parseInt(localStorage.getItem('reloadCount') || '0', 10);
reloadCount++;
localStorage.setItem('reloadCount', reloadCount);
let seconds = reloadCount > 5 ? 30 : 10;
function updateCountdown() {
const el = document.getElementById('countdown');
if (el) {
if (reloadCount > 5) {
document.querySelector('.error p').textContent = "This is taking so long...";
}
el.textContent = "Trying again in " + seconds + " seconds...";
}
if (seconds <= 0) {
location.reload();
} else {
seconds--;
setTimeout(updateCountdown, 1000);
}
}
window.addEventListener('DOMContentLoaded', updateCountdown);
</script>
<% } else { %>
<script>
// Clear reload count on non-restart errors
localStorage.removeItem('reloadCount');
</script>
<% } %>
</head>
<body>
<% if (description === RESTART_MSG) { %>
<p id="abstract">502</p>
<% } else { %>
<p id="abstract">404</p>
<% } %>
<div class="error">
<h2><%= error %></h2>
<p><%= description %></p>
<% if (description === RESTART_MSG) { %>
<div class="countdown" id="countdown"></div>
<% } %>
</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 === RESTART_MSG) { %>
<a href="https://github.com/iv-org/invidious/issues">See Invidious issues</a>
<a href="">Refresh Page</a>
<% } %>
</div>
</body>
</html>

View File

@@ -22,7 +22,7 @@
* @licstart The following is the entire license notice for the JavaScript
* code in this page.
*
* Copyright (C) 2021-2023 POKETUBE (https://github.com/iamashley0/poketube)
* Copyright (C) 2021-2025 POKETUBE (https://github.com/iamashley0/poketube)
*
* 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
@@ -44,40 +44,178 @@
//--><!]]>
</script>
<script>
var bbox = "?bbox=-165.76171875000003%2C-3.864254615721396%2C30.410156250000004%2C72.44879155730672&amp;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;
<script>(function(){
const _0x5a3c=[
"P2Jib3g9LTE2NS43NjE3MTg3NTAwMDAwMyUyQy0zLjg2NDI1NDYxNTcyMTM5NiUyQzMwLjQxMDE1NjI1MDAwMDAwNCUyQzcyLjQ0ODc5MTU1NzMwNjcyJmxheWVyPW1hcG5paw==",
"aHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvZXhwb3J0L2VtYmVkLmh0bWw=",
"d3d3Lm9wZW5zdHJlZXRtYXAub3Jn"
];
function _0x99f2(i){ return atob(_0x5a3c[i]); }
function updateMap(lat, lon) {
const delta = 0.25;
const bbox = `?bbox=${lon-delta},${lat-delta},${lon+delta},${lat+delta}&layer=mapnik`;
const newURL = _0x99f2(1) + bbox;
const iframe = document.querySelector('iframe');
if (iframe) {
iframe.src = newURL;
window.history.pushState({}, '', newURL);
}
const marker = document.getElementById('map-marker');
if (marker) marker.remove();
const newMarker = document.createElement('div');
newMarker.id = 'map-marker';
newMarker.style = 'position:absolute;width:20px;height:20px;background:red;border-radius:50%;transform:translate(-50%,-50%);z-index:9998;pointer-events:none;left:50%;top:50%';
document.body.appendChild(newMarker);
}
function copyCoordinates() {
const marker = document.getElementById('map-marker');
if (!marker) return alert('No coordinates to copy.');
navigator.clipboard.writeText(window.location.href).then(() => {
alert('Current map link copied to clipboard!');
});
}
function locateAndUpdate() {
if (!navigator.geolocation) {
alert('Geolocation is not supported by your browser.');
return;
}
navigator.geolocation.getCurrentPosition(
pos => {
updateMap(pos.coords.latitude, pos.coords.longitude);
},
err => {
alert('Unable to retrieve location: ' + err.message);
},
{ enableHighAccuracy: true, timeout: 10000, maximumAge: 0 }
);
}
function _0x4f2a(){
const bbox = _0x99f2(0);
const base = _0x99f2(1);
const url = base + bbox;
const iframe = document.querySelector('iframe');
if (!iframe) return setTimeout(_0x4f2a, 100);
iframe.src = url;
iframe.addEventListener('load',()=>{
try {
const doc = iframe.contentDocument || iframe.contentWindow.document;
Array.from(doc.querySelectorAll('a')).forEach(a=>a.addEventListener('click',_linkHandler));
Array.from(doc.querySelectorAll('*')).forEach(el=>{
const bg = el.style.backgroundImage;
if(bg.includes('//dka575ofm4ao0.cloudfront.net')){
el.style.backgroundImage = bg.replace(/\/\/dka575ofm4ao0\.cloudfront\.net/g,
m=>`https://p.poketube.fun/https://dka575ofm4ao0.cloudfront.net`);
}
});
} catch(e) {
console.warn('Cross-origin access denied, skipping DOM manipulation.');
}
});
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;
window.history = new Proxy(window.history,{
get(target, prop){
if(prop === 'pushState') return (...args)=>{
const iframe = document.querySelector('iframe');
if(iframe && args[2]) iframe.src = args[2];
return target.pushState.apply(target, args);
};
return Reflect.get(target, prop);
}
});
</script>
window.addEventListener('popstate',()=>{
const iframe = document.querySelector('iframe');
if (iframe) iframe.src = location.href;
});
}
function _linkHandler(e){
const h = e.target.href;
const iframe = document.querySelector('iframe');
if(!iframe) return;
if(h.includes(_0x99f2(2))){
e.preventDefault();
iframe.src = h;
window.history.pushState({}, '', h);
} else {
window.location.href = h;
}
}
const form = document.createElement('form');
form.style = 'position:absolute;top:10px;right:10px;z-index:9999;background:rgba(0,0,0,0.5);backdrop-filter:blur(12px);padding:10px 12px;border-radius:12px;box-shadow:0 4px 10px rgba(0,0,0,0.4);font-family:sans-serif;min-width:220px;';
form.innerHTML = `
<input id="searchBox" type="text" placeholder="Search..." style="padding:6px 10px;width:180px;font-size:14px;border:1px solid #444;border-radius:6px;background:#222;color:#fff">
<ul id="suggestions" style="list-style:none;margin:6px 0 0;padding:0;max-height:180px;overflow:auto;background:#111;border:1px solid #333;border-radius:6px;display:none;position:relative;z-index:10000;color:#fff;"></ul>
<div style="margin-top:10px;display:flex;gap:6px;flex-wrap:wrap">
<button id="locate-btn" type="button" style="flex:1;padding:4px 6px;font-size:12px;background:#333;color:#fff;border:none;border-radius:6px">📍 Locate</button>
<button type="button" style="flex:1;padding:4px 6px;font-size:12px;background:#333;color:#fff;border:none;border-radius:6px" onclick="copyCoordinates()">📋 Copy</button>
<button type="button" style="flex:1;padding:4px 6px;font-size:12px;background:#333;color:#fff;border:none;border-radius:6px" onclick="location.reload()">🔁 Reset</button>
</div>
`;
document.body.appendChild(form);
document.getElementById('locate-btn').addEventListener('click', locateAndUpdate);
const input = form.querySelector('#searchBox');
const suggestions = form.querySelector('#suggestions');
input.addEventListener('input', () => {
const query = input.value.trim();
if (!query) return suggestions.style.display = 'none';
fetch(`https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(query)}&format=json&limit=5`)
.then(res => res.json())
.then(data => {
suggestions.innerHTML = '';
data.forEach(place => {
const li = document.createElement('li');
li.textContent = place.display_name;
li.style = 'padding:6px 10px;cursor:pointer;border-bottom:1px solid #222;font-size:13px;background:#111';
li.addEventListener('click', () => {
input.value = place.display_name;
suggestions.style.display = 'none';
updateMap(parseFloat(place.lat), parseFloat(place.lon));
});
suggestions.appendChild(li);
});
suggestions.style.display = 'block';
});
});
form.addEventListener('submit', e => {
e.preventDefault();
const q = input.value.trim();
if(!q) return;
fetch(`https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(q)}&format=json&limit=1`)
.then(res => res.json())
.then(data => {
if(data[0]){
updateMap(parseFloat(data[0].lat), parseFloat(data[0].lon));
}
});
});
const fab = document.createElement('button');
fab.textContent = '+';
fab.style = 'position:fixed;bottom:20px;right:20px;width:48px;height:48px;font-size:24px;background:#111;color:#fff;border:none;border-radius:50%;box-shadow:0 2px 10px rgba(0,0,0,0.4);cursor:pointer;z-index:9999';
fab.title = 'More Tools';
fab.onclick = () => alert('More features coming soon!');
document.body.appendChild(fab);
const branding = document.createElement('div');
branding.textContent = 'PokeMaps';
branding.style = 'position: absolute; bottom: 10px; left: 10px; padding: 6px 10px; font-size: 31px; font-weight: 500; background: rgba(0, 0, 0, 0.6); color: white; border-radius: 6px; font-family: sans-serif; backdrop-filter: blur(6px); z-index: 9999; pointer-events: none;display: block;';
document.body.appendChild(branding);
_0x4f2a();
})();
</script><script src="/static/data-mobile.js"></script>
</body>
</html>

70
html/partials/card.ejs Normal file
View File

@@ -0,0 +1,70 @@
<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>
<% } %>
</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
View 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
View 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>

View File

@@ -246,8 +246,9 @@ font-family:Ubuntu
<%- x.title %>
</a>
<div>
<a href="/channel?id=<%- x.authorId %>" style="border-radius:0em"><%- x.author %></a>
</div>
<a href="/channel?id=<%- x.authorId %>" style="border-radius:0em"><%- x.author %></a><br>
<a href="/download?id=<%- x.videoId %>" style="border-radius:0em"> Download </a>
</div>
</div>
</div>

View File

@@ -1,7 +1,7 @@
<!--
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
it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
<% if (!isMobile) { %>
<!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">
<link href="/css/app-cdn.min.css" rel="stylesheet">
@@ -250,19 +250,20 @@ section#landing-page {
transform: translateY(50%);
}
.heading {
color: #fff;
font-size: xxx-large;
font-family: 'PokeTube flex';
font-stretch: ultra-expanded;
font-weight: 1000;
margin-top: -27.5em;
margin-top: -22.5em;
width: 100px;
text-align: left;
}
.i-cant-find-a-class-name-help-me {
margin-top: -69em;
margin-top: -53.3em;
max-width: 39em;
color: white;
background: #333;
@@ -408,7 +409,7 @@ z-index: 10; /* Was 2 */"
<div class="content-inner" style="color:#fff;">
<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">
We dont collect or share your personal information! That's our privacy policy TL;DR lol
</div>
@@ -418,7 +419,7 @@ z-index: 10; /* Was 2 */"
</div>
<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;">
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>
</p>
<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>.
<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>
P.S:I love you <3
</p>
@@ -443,52 +443,36 @@ P.S:I love you <3
<p>START OF PRIVACY POLICY</p>
<a class="anchor" name="s1"></a>
<h3 class="hd-md">
We dont collect your personal information
We Dont Collect Information that can indentify you
</h3>
<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">
We dont see the videos you watch
</h3>
<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">
We dont track you through cookies
</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>
<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">

View File

@@ -17,7 +17,9 @@
NodeList.prototype.forEach = Array.prototype.forEach;
</script>
<style>
* {
font-family: "poketube flex" !important
}
@keyframes gradient {
0% {
background-position: 0 50%;
@@ -36,18 +38,27 @@
background-size: 400% 400%;
}
a {
color: #fff;
font-weight: 686;
font-stretch: extra-expanded;
}
.downnav {
position: fixed;
padding:10px;
bottom: 0;
left: 0;
width: 100%;
margin: auto;
overflow: hidden;
z-index: 1;
color:#fff;
background-color: #0f0f0f;
}</style>
background-color: #0007;
border-radius: 5px;
width: calc(100% - 33px);
margin-left: 6px;
}
</style>
<script>
<!--//--><![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 />
<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:&quot;poketube flex&quot;;Poketube flex;">Search Poke</p>
</button>
<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;">
<p style="margin-top: auto;margin-bottom: auto;font-weight: 1000;margin-left: 6px;font-stretch: ultra-expanded;font-family:&quot;poketube flex&quot;;Poketube flex;">Im feeling lucky</p>
</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>
<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>
</div>
</form>
<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;">
<a style="color:#fff" id="osInfo"></a> <a style="color:#fff;margin-right: 1em;" href="/license">License</a>
</div>
@@ -257,6 +266,27 @@ if (userAgent.includes("windows")) {
const osInfoElement = document.getElementById("osInfo");
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>
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
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>
</div> <!-- id="content_homepage" -->
</div> <!-- id="content_wrapper_homepage" -->

View File

@@ -451,22 +451,22 @@ Web
</div>
<p style="margin-top: -21px;margin-left: 62em;font-family: &quot;Poketube flex&quot;;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 class="video-list" >
<% 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>
<p style="color:gray;display: flex;flex-direction: column;width: 48em;margin-top: -8em;"><%= x.link %><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.url %><br>
<% 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) { %>
<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>
</div>

File diff suppressed because it is too large Load Diff

View File

@@ -16,235 +16,8 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see https://www.gnu.org/licenses/.
-->
<!doctype html>
<html lang="en">
<head>
<title>PokeTranslate</title>
<link rel="icon" href="/static/yt-ukraine.svg">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta content="PokeTranslate" property=og:title>
<meta content="Translate text - Anonymously!" 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 name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'">
<meta name="referrer" content="no-referrer">
<link rel="manifest" href="/manifest.json">
<style>
.center {
text-align: center;
}
.wrap {
display: flex;
flex-wrap: wrap;
justify-content: center;
}
.wrap.languages {
flex-wrap: nowrap;
margin-bottom: 20px;
}
#could_not_switch_languages_text {
color: red;
}
.item {
width: 100%;
height: 150px;
border-radius:1em;
}
.item-wrapper {
display: flex;
flex-wrap: wrap;
justify-content: center;
width: 450px;
margin: 5px 10px;
}
.language,
.switch_languages {
display: flex;
}
.language {
margin: 0px 10px;
}
.switch_languages {
margin: 0px 5px;
}
#switchbutton {
white-space: nowrap;
}
button {
font-size: 1rem;
padding: 4px 10px;
border: 2px solid #888888;
}
input,
select,
textarea {
width: 100%;
font-size: 1rem;
padding: 4px;
border: 2px solid #888888;
}
textarea {
resize: vertical;
height: 5rem;
font-family: sans-serif;
width: 100%;
}
input:focus,
select:focus,
textarea:focus,
button:focus {
border-color: #478061;
outline: 1px solid #478061;
}
body {
justify-content: center;
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;
}
body {
background-color: #212529;
color: #f8f9fa;
}
#could_not_switch_languages_text {
color: #F13333;
}
a:visited {
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: 'af', name: 'Afrikaans' },
{ code: 'sq', name: 'Albanian' },
@@ -307,7 +80,7 @@
{ code: 'km', name: 'Khmer' },
{ code: 'rw', name: 'Kinyarwanda' },
{ code: 'kok', name: 'Konkani' },
{ code: 'ko', name: 'Korean' },
{ code: 'ko', name: 'Korean (PROK)' },
{ code: 'kri', name: 'Krio' },
{ code: 'ku', name: 'Kurdish (Kurmanji)' },
{ code: 'sd', name: 'Sindhi' },
@@ -341,91 +114,283 @@
{ code: 'zu', name: 'Zulu' }
]; %>
<!doctype html>
<html lang="en">
<head>
<title>PokeTranslate</title>
<link rel="icon" href="/static/yt-ukraine.svg">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta content="PokeTranslate" property=og:title>
<meta content="Translate text - Anonymously!" 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 charset="UTF-8">
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'">
<meta name="referrer" content="no-referrer">
<link rel="manifest" href="/manifest.json">
<link href="https://fonts.bunny.net/css?family=poppins:400,500,600" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<!-- Source language select -->
<select name="from_language" id="from_language" style="margin-right: 1em;border-radius: 1em;padding: 7px;" aria-label="Source language">
<% languageOptions.forEach(language => { %>
<option value="<%= language.code %>" <%= language.code === (from_language || 'autodetect') ? 'selected' : '' %>><%= language.name %></option>
<% }); %>
</select>
<style>
:root {
--accent-1: #ff6b6b;
--accent-2: #f7d794;
--bg-light: #fafafa;
--bg-dark: #202027;
--card-light: rgba(255,255,255,0.55);
--card-dark: rgba(18,18,24,0.55);
--radius: 20px;
--transition: 0.3s ease;
}
* { margin:0; padding:0; box-sizing:border-box; }
body {
font-family:'Poppins',sans-serif;
background: var(--bg-light);
color: #fff;
display:flex; align-items:center; justify-content:center;
min-height:100vh; padding:20px;
transition: background var(--transition), color var(--transition);
overflow:hidden;
}
@media (prefers-color-scheme: dark) {
body { background: var(--bg-dark); }
}
.glass {
position: relative;
background: var(--card-light);
backdrop-filter: blur(30px) saturate(200%);
border-radius: var(--radius);
box-shadow: 0 8px 32px rgba(0,0,0,0.1);
width:100%; max-width:840px; overflow:hidden;
transition: background var(--transition), box-shadow var(--transition);
}
@media (prefers-color-scheme: dark) {
.glass {
background: var(--card-dark);
box-shadow: 0 8px 32px rgba(0,0,0,0.7);
}
}
<!-- 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>
.blob {
position:absolute; width:300px; height:300px;
background: linear-gradient(45deg,var(--accent-1),var(--accent-2));
border-radius: 45% 55% 70% 30%/30% 60% 40% 70%;
animation: blobMove 8s infinite; opacity:0.3; z-index:0;
}
.blob:nth-child(1){ top:-80px; left:-60px; }
.blob:nth-child(2){ bottom:-100px; right:-80px; animation-duration:10s; }
@keyframes blobMove {
0%,100% { transform:translate(0,0) scale(1); }
50% { transform:translate(20px,20px) scale(1.1); }
}
header {
position:relative; padding:28px; text-align:center;
background: linear-gradient(60deg,var(--accent-1),var(--accent-2));
background-size:200% 200%; animation:gradientAnimation 6s ease infinite;
z-index:1;
}
@keyframes gradientAnimation {
0%{ background-position:0% 50%; }
50%{ background-position:100% 50%; }
100%{ background-position:0% 50%; }
}
</div>
</div>
/* Rainbow title unless user prefers reduced motion */
@media (prefers-reduced-motion: no-preference) {
header h1 {
font-size:2.4rem; font-weight:600; letter-spacing:1.5px;
background: conic-gradient(red,orange,yellow,green,blue,indigo,violet,red);
background-size:300%;
-webkit-background-clip:text;
-webkit-text-fill-color:transparent;
animation: rainbow 4s linear infinite;
}
@keyframes rainbow {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
}
@media (prefers-reduced-motion: reduce) {
header h1 {
font-size:2.4rem; font-weight:600; letter-spacing:1.5px;
color:#fff;
}
}
form { position:relative; z-index:2; }
.language-bar { display:flex; align-items:center; gap:12px; padding:16px 24px; }
.language-select { flex:1; }
.language-select select {
width:100%; padding:14px 18px; border-radius:var(--radius);
border:1px solid rgba(255,255,255,0.5); background:transparent;
font-size:1rem; appearance:none; cursor:pointer; color:#fff;
transition:border-color var(--transition);
}
.language-select select:focus { border-color:var(--accent-1); outline:none; }
.swap-button {
font-size:2rem; color:var(--accent-1); text-decoration:none;
transition:transform var(--transition),color var(--transition);
}
.swap-button:hover {
transform:rotate(180deg) scale(1.1);
color:var(--accent-2);
}
.panels {
display:grid; grid-template-columns:1fr 1fr; gap:20px;
padding:0 24px 24px;
}
.panel { position:relative; }
.panel label {
display:block; margin-bottom:8px; font-weight:500; font-size:0.95rem;
color:#fff;
}
.panel textarea {
width:100%; min-height:160px; padding:16px; border-radius:var(--radius);
border:1px solid rgba(255,255,255,0.5); resize:vertical; font-size:1rem;
line-height:1.5; background:rgba(255,255,255,0.2); color:#fff;
transition:border-color var(--transition),box-shadow var(--transition);
}
.panel textarea::placeholder { color:rgba(255,255,255,0.7); }
@media (prefers-color-scheme: dark) {
.panel textarea { background:rgba(20,20,25,0.5); }
}
.panel textarea:focus {
border-color:var(--accent-1);
box-shadow:0 0 8px var(--accent-1);
outline:none;
}
<!-- text boxes -->
<div class="wrap">
<div class="item-wrapper">
<textarea autofocus class="item" id="input" name="input" dir="auto" placeholder="<%- text %>"><%- text %>
</textarea>
</div>
.actions { display:flex; justify-content:center; padding-bottom:24px; }
.actions button {
padding:16px 36px; font-size:1.1rem; font-weight:600; border:none;
border-radius:var(--radius); cursor:pointer;
background:linear-gradient(60deg,var(--accent-1),var(--accent-2));
background-size:200% 200%; animation:gradientAnimation 6s ease infinite;
color:#fff; box-shadow:0 4px 14px rgba(0,0,0,0.2);
transition:transform var(--transition),opacity var(--transition);
}
.actions button:hover { transform:scale(1.03); opacity:0.9; }
@media (max-width:768px) { .panels { grid-template-columns:1fr; } }
</style>
</head>
<body>
<div class="glass">
<div class="blob"></div>
<div class="blob"></div>
<header><h1>PokeTranslate</h1></header>
<div class="item-wrapper">
<textarea id="output" class="translation item" dir="auto" placeholder="Translation" readonly> <%- translation %> </textarea>
</div>
</div>
<form action="/translate" method="GET">
<div class="language-bar">
<div class="language-select">
<select name="from_language" id="from_language">
<% languageOptions.forEach(lang => { %>
<option value="<%= lang.code %>" <%= lang.code === (from_language||'autodetect')?'selected':''%>>
<%= lang.name %>
</option>
<% }); %>
</select>
</div>
<br>
<a
href="?from_language=<%= to_language %>&to_language=<%= from_language %>&input=<%= encodeURIComponent(text) %>"
id="swapBtn"
class="material-icons swap-button"
>swap_horiz</a>
<div class="center">
<!-- translate button -->
<button type="submit" style="border-radius: 1em;padding: 7px;">Translate :3</button>
</div>
<div class="language-select">
<select name="to_language" id="to_language">
<% languageOptions.slice(1).forEach(lang => { %>
<option value="<%= lang.code %>" <%= lang.code===to_language?'selected':''%>>
<%= lang.name %>
</option>
<% }); %>
</select>
</div>
</div>
<br>
<div class="panels">
<div class="panel input">
<label for="input">Input</label>
<textarea id="input" name="input" placeholder="Enter text…"><%= text %></textarea>
</div>
<div class="panel output">
<label for="output">Translation</label>
<textarea id="output" readonly placeholder="Translated text…"><%= translation %></textarea>
</div>
</div>
<div class="actions">
<button type="submit">Translate :3</button>
</div>
</form>
</div>
<script>
(function(){
// swap button
const swapBtn = document.getElementById('swapBtn');
if(swapBtn){
swapBtn.addEventListener('click', function(e){
e.preventDefault();
const from = document.getElementById('from_language');
const to = document.getElementById('to_language');
const inp = document.getElementById('input');
const out = document.getElementById('output');
[from.value, to.value] = [to.value, from.value];
[inp.value, out.value] = [out.value, inp.value];
});
}
<br>
// auto-resize all textareas
document.querySelectorAll('textarea').forEach(el=>{
const resize = ()=>{ el.style.height='auto'; el.style.height=el.scrollHeight+'px'; };
el.addEventListener('input', resize);
resize();
});
// live-translate if JS available
if(window.fetch){
const from = document.getElementById('from_language');
const to = document.getElementById('to_language');
const input = document.getElementById('input');
const output= document.getElementById('output');
let timer;
function translateNow(){
const q = new URLSearchParams({
from_language: from.value,
to_language: to.value,
input: input.value
});
fetch(`/translate?${q}`)
.then(r => r.text())
.then(html => {
const doc = new DOMParser().parseFromString(html, 'text/html');
const newOut = doc.getElementById('output');
if(newOut){
output.value = newOut.value;
output.dispatchEvent(new Event('input'));
}
})
.catch(() => {/* ignore */});
}
</div>
</form>
</div>
<br>
<br>
<br>
<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>
// debounce on typing
input.addEventListener('input', ()=>{
clearTimeout(timer);
timer = setTimeout(translateNow, 500);
});
// re-translate on language change
from.addEventListener('change', translateNow);
to.addEventListener('change', translateNow);
}
})();
</script>
</body>
</html>

24
html/video-error.ejs Normal file
View 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 = "Poke is currently restarting - please wait 1-2 minutes..";
}
%>
<%- include('./layouts/error-video.ejs', {
error: "loading failed :c",
description: `${reason}`
}) %>

File diff suppressed because it is too large Load Diff

6
infocards.json Normal file
View File

@@ -0,0 +1,6 @@
{
"Open Source":{
"infocard":"<i>Open Source</i> is a wrong terminology",
"more_info":"https://gnu.org/not-open-source"
}
}

View File

@@ -8,80 +8,38 @@
"proxy": true,
"official": true,
"DEFAULT": true,
"region": "🇺🇸",
"region": "🇩🇪",
"software": {
"name": "poketube",
"version": "lastest",
"name": "poke",
"version": "latest",
"branch": "dev"
}
}
],
[
"poketube.sudovanilla.com",
"pt.sudovanilla.org",
{
"uri": "https://poketube.sudovanilla.com",
"CLOUDFLARE": true,
"piwik": false,
"region": "🇺🇸",
"software": {
"name": "poketube",
"version": "lastest",
"branch": "dev"
}
}
],
[
"poke.vern.cc",
{
"uri": "https://poke.vern.cc",
"uri": "https://pt.sudovanilla.org",
"CLOUDFLARE": false,
"piwik": false,
"region": "🇺🇸",
"software": {
"name": "poketube",
"name": "poke",
"version": "latest",
"branch": "dev"
}
}
],
[
"poke.ashley0143.xyz",
"nyc1.poke.ggtyler.dev",
{
"uri": "https://poke.ashley0143.xyz",
"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",
"uri": "https://nyc1.poke.ggtyler.dev",
"CLOUDFLARE": false,
"piwik": false,
"proxy": false,
"region": "🇺🇸",
"software": {
"name": "poketube",
"name": "poke",
"version": "latest",
"branch": "dev"
}
@@ -96,36 +54,37 @@
"proxy": false,
"region": "🇺🇸",
"software": {
"name": "poketube",
"name": "poke",
"version": "latest",
"branch": "dev"
}
}
],
[
"poke.am1.shiggy.cloud",
"pol1.poke.ggtyler.dev",
{
"uri": "https://poke.am1.shiggy.cloud",
"uri": "https://pol1.ggtyler.dev",
"CLOUDFLARE": false,
"piwik": false,
"proxy": false,
"region": "🇳🇱",
"region": "🇵🇱",
"software": {
"name": "poketube",
"name": "poke",
"version": "latest",
"branch": "dev"
}
}
], [
"poke.am2.shiggy.cloud",
],
[
"poke.blahai.gay",
{
"uri": "https://poke.am2.shiggy.cloud",
"CLOUDFLARE": false,
"uri": "https://poke.blahai.gay/",
"CLOUDFLARE": true,
"piwik": false,
"proxy": false,
"region": "🇳🇱",
"region": "🇩🇪",
"software": {
"name": "poketube",
"name": "poke",
"version": "latest",
"branch": "dev"
}

View 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

View 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?

View 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?

View 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

964
january/Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -6,7 +6,7 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
actix-web = "4.4.1"
actix-web = "4.0"
lazy_static = "1.4"
imagesize = "0.8"
reqwest = "0.11"

View File

@@ -1,19 +1,17 @@
# Build Stage
FROM rustlang/rust:nightly-bullseye-slim AS builder
FROM rustlang/rust:nightly-slim AS builder
USER 0:0
WORKDIR /home/rust/src
RUN apt-get update && apt-get install -y libssl-dev pkg-config
RUN USER=root cargo new --bin january
WORKDIR /home/rust/src/january
COPY Cargo.toml Cargo.lock ./
COPY src ./src
RUN cargo install --locked --path .
RUN apt-get update && apt-get install -y libssl-dev pkg-config && cargo install --locked --path .
# Bundle Stage
FROM debian:bullseye-slim
RUN apt-get update && apt-get install -y ca-certificates ffmpeg libssl-dev
FROM debian:buster-slim
RUN apt-get update && apt-get install -y ca-certificates ffmpeg
COPY --from=builder /usr/local/cargo/bin/january ./
EXPOSE 7000
ENV JANUARY_HOST 0.0.0.0:7000

View File

@@ -16,8 +16,4 @@ server {
proxy_ssl_session_reuse off;
proxy_set_header Host $http_host;
}
location /manifest.json {
root /path/to/poketube/pwa/;
}
}

View File

@@ -1,21 +1,99 @@
# docker build -t pproxy .
# docker run -p 6003:6003 -v ./whitelist.json:/pproxy/whitelist.json:ro pproxy
#################################################################################
# INSTALLERS #
# These images provide the dependencies required to build the other images. #
#################################################################################
# Base
FROM node:18-alpine
FROM quay.io/almalinuxorg/9-base AS builder-installer
# Install dependencies
RUN apk add --no-cache git build-base python3
# Needed for node 18+
# RUN dnf module --assumeyes enable nodejs
# Set Work Directory
WORKDIR /pproxy
RUN --mount=type=cache,target=/var/cache/dnf \
dnf install --assumeyes --nodocs nodejs ca-certificates jq make gcc g++
# Install dependencies
# Honestly less effort this way
RUN yarn add express undici
RUN npm install -g \
npm@$(curl "https://release-monitoring.org/api/v2/versions/?project_id=190206" | jq --raw-output '.stable_versions[0]')
# Copy files
COPY server.js .
# Entrypoint
# Runtime dependencies
FROM quay.io/almalinuxorg/9-base AS installer
COPY --from=quay.io/almalinuxorg/9-micro / /rpms
RUN --mount=type=cache,target=/var/cache/dnf \
dnf install --assumeyes \
--installroot /rpms \
--releasever=9 \
--setopt=install_weak_deps=false \
--nodocs \
nodejs ca-certificates
RUN dnf clean all \
--installroot /rpms
# Proxy + certbot
FROM quay.io/almalinuxorg/9-base AS proxy-installer
RUN dnf install epel-release --assumeyes
COPY --from=quay.io/almalinuxorg/9-micro / /rpms
RUN --mount=type=cache,target=/var/cache/dnf \
dnf install --assumeyes \
--installroot /rpms \
--releasever=9 \
--setopt=install_weak_deps=false \
--setopt=reposdir=/etc/yum.repos.d \
--nodocs \
nginx-core certbot python3-certbot-nginx
RUN dnf clean all \
--installroot /rpms
#################################################################################
# BUILDER #
#################################################################################
FROM builder-installer AS builder
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json ./
RUN npm install --frozen-lockfile
# COPY ./ ./
COPY p/server.js ./
#################################################################################
# FINAL IMAGE #
#################################################################################
FROM quay.io/almalinuxorg/9-micro AS release-base
# Grab npm
COPY --from=installer /rpms /
# Grab site
COPY --from=builder /usr/src/app /app
WORKDIR /app
ENV NODE_ENV production
# Final image
FROM release-base as release
# EXPOSE 3000/tcp
CMD [ "node", "server.js" ]
# Final image with extras
FROM release-base AS release-aio
# Grab nginx and certbot
COPY --from=proxy-installer /rpms /
COPY entrypoint.sh entrypoint.sh
RUN chmod +x entrypoint.sh
COPY nginx.conf.example /etc/nginx/conf.d/poketube.conf
# EXPOSE 80/tcp
# EXPOSE 443/tcp
ENTRYPOINT [ "/usr/bin/bash", "./entrypoint.sh" ]
CMD [ "node", "server.js" ]

View File

@@ -1,10 +1,41 @@
const express = require("express");
// const fetch = require("node-fetch");
const fetch = require("node-fetch");
const { URL } = require("url");
const { Readable } = require("node:stream");
// Array of hostnames that will be proxied
const URL_WHITELIST = require("./whitelist.json");
const URL_WHITELIST = [
"i.ytimg.com",
"yt3.googleusercontent.com",
"cdn.glitch.global",
"cdn.statically.io",
"site-assets.fontawesome.com",
"fonts.gstatic.com",
"cdn.jsdelivr.net",
"yt3.ggpht.com",
"tube.kuylar.dev",
"lh3.googleusercontent.com",
"is4-ssl.mzstatic.com",
"is2-ssl.mzstatic.com",
"is1-ssl.mzstatic.com",
"fonts.bunny.net",
"demo.matomo.org",
"is5-ssl.mzstatic.com",
"is3-ssl.mzstatic.com",
"twemoji.maxcdn.com",
"unpkg.com",
"lite.duckduckgo.com",
"youtube.com",
"returnyoutubedislikeapi.com",
"cdn.zptr.cc",
"inv.vern.cc",
"invidious.privacydev.net",
"inv.zzls.xyz",
"vid.puffyan.us",
"invidious.lidarshield.cloud",
"invidious.epicsite.xyz",
"invidious.esmailelbob.xyz",
];
const app = express();
@@ -42,6 +73,7 @@ const proxy = async (req, res) => {
return res.status(400).send("Malformed URL");
}
// Sanity check, to avoid being used as an open proxy
if (!URL_WHITELIST.includes(url.host)) {
console.log(`==> Refusing to proxy host ${url.host}`);
res.status(401).send(`Hostname '${url.host}' is not permitted`);
@@ -131,7 +163,6 @@ const { fetch } = await import("undici")
});
app.get("/bangs", async (req, res) => {
const { fetch } = await import("undici")
let f = await fetch("https://lite.duckduckgo.com/lite/?q=" + req.query.q, {
method: req.method,

View File

@@ -1,32 +0,0 @@
[
"i.ytimg.com",
"yt3.googleusercontent.com",
"cdn.glitch.global",
"cdn.statically.io",
"site-assets.fontawesome.com",
"fonts.gstatic.com",
"cdn.jsdelivr.net",
"yt3.ggpht.com",
"tube.kuylar.dev",
"lh3.googleusercontent.com",
"is4-ssl.mzstatic.com",
"is2-ssl.mzstatic.com",
"is1-ssl.mzstatic.com",
"fonts.bunny.net",
"demo.matomo.org",
"is5-ssl.mzstatic.com",
"is3-ssl.mzstatic.com",
"twemoji.maxcdn.com",
"unpkg.com",
"lite.duckduckgo.com",
"youtube.com",
"returnyoutubedislikeapi.com",
"cdn.zptr.cc",
"inv.vern.cc",
"invidious.privacydev.net",
"inv.zzls.xyz",
"vid.puffyan.us",
"invidious.lidarshield.cloud",
"invidious.epicsite.xyz",
"invidious.esmailelbob.xyz"
]

View File

@@ -28,17 +28,17 @@
"node-libcurl": "^3.0.0",
"uglify-js": "^3.17.4",
"ping": "^0.4.4",
"undici": "^5.25.2",
"undici": "^6.14.0",
"express-rate-limit": "^7.0.2",
"toobusy-js": "^0.5.1",
"quick.db": "^7.1.3",
"activitypub-express": "^4.4.1",
"duck-duck-scrape": "^2.2.5",
"google-it": "^1.6.4",
"youtubei.js": "^9.2.0"
"youtubei.js": "^13.4.0"
},
"engines": {
"node": "16.x"
"node": ">=18"
},
"repository": {
"url": "https://codeberg.org/Ashley/poketube"

196
server.js
View File

@@ -32,9 +32,19 @@
const media_proxy = require("./src/libpoketube/libpoketube-video.js");
const { sinit } = require("./src/libpoketube/init/superinit.js");
const innertube = require("./src/libpoketube/libpoketube-youtubei-objects.json");
const fs = require("fs");
const config = require("./config.json");
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(
"[Welcome] Welcome To Poke - The ultimate privacy app - :3 " +
@@ -65,11 +75,10 @@
const sha384 = modules.hash;
const rateLimit = require("express-rate-limit");
const limiter = rateLimit({
windowMs:45 * 1000, // 45 Seconds
max: 886, // limit each IP to 866 requests per windowMs
});
const limiter = rateLimit({
windowMs: 30 * 1000, // 30 second window
max: 200, // limit each IP to 200 requests per 30 seconds
});
var app = modules.express();
app.use(limiter);
@@ -79,7 +88,7 @@
app.use(modules.useragent.express());
app.use(modules.express.json()); // for parsing application/json
app.enable("trust proxy");
var toobusy = require('toobusy-js')
var toobusy = require("toobusy-js");
const renderTemplate = async (res, req, template, data = {}) => {
res.render(
@@ -88,37 +97,131 @@
);
};
// Set check interval to a faster value. This will catch more latency spikes
// but may cause the check to be too sensitive.
toobusy.interval(110);
// Set check interval to a faster value. This will catch more latency spikes
// but may cause the check to be too sensitive.
toobusy.interval(110);
toobusy.maxLag(3500);
toobusy.maxLag(3500);
app.use(function(req, res, next) {
if (toobusy()) {
res.send(503, "I'm busy right now, sorry.");
} else {
next();
}
});
toobusy.onLag(function(currentLag) {
process.exit(1);
console.log("Event loop lag detected! Latency: " + currentLag + "ms");
});
app.use(function (req, res, next) {
if (toobusy()) {
res.send(503, "I'm busy right now, sorry.");
} else {
next();
}
});
toobusy.onLag(function (currentLag) {
process.exit(1);
console.log("Event loop lag detected! Latency: " + currentLag + "ms");
});
const random_words = [
"banana pie",
"how to buy an atom bomb",
"is love just an illusion",
"things to do if ur face becomes benjamin frenklin",
"how do defeat an pasta",
"can you go to space?",
"how to become a god?",
"is a panda a panda if pandas???",
"Minecraft movie trailer",
"monke",
"Woke!",
"Gay gay homosexaul gay!",
"free Palestine!",
"free software!",
"im... stuff!",
"frick capitalism!",
"still calling it twitter btw!",
"boop!",
"no way!",
"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 () {
@@ -140,8 +243,8 @@ toobusy.maxLag(3500);
res.header("secure-poketube-instance", "1");
// opt out of googles "FLOC" bullcrap :p See https://spreadprivacy.com/block-floc-with-duckduckgo/
res.header("Permissions-Policy", "interest-cohort=()")
res.header("software-name", "poke")
res.header("Permissions-Policy", "interest-cohort=()");
res.header("software-name", "poke");
next();
});
@@ -162,10 +265,25 @@ toobusy.maxLag(3500);
});
app.use(function (req, res, next) {
res.header("X-PokeTube-Youtube-Client-Name", innertube.innertube.CONTEXT_CLIENT.INNERTUBE_CONTEXT_CLIENT_NAME);
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("X-PokeTube-Client-name", innertube.innertube.CLIENT.projectClientName);
const random = random_words[Math.floor(Math.random() * random_words.length)];
res.header(
"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-HOSTNAME", req.hostname);
if (req.url.match(/^\/(css|js|img|font)\/.+/)) {

View File

@@ -23,43 +23,114 @@ var ping = require("ping");
const sha384 = modules.hash;
const splash = [
"Woke!",
"Gay gay homosexaul gay!",
"free Palestine!",
"free software!",
"im... stuff!",
"frick capitalism!",
"still calling it twitter btw!",
"boop!",
"no way!",
"traaaa rightssss!",
"XD!",
"nya!",
"say gex!",
"also try invidious!",
"rms <3!",
"du hast",
"can u belive no one bought this?",
"reee",
"1.000.000€!",
"pika!",
"fsf.org",
"ssfffssfssfffaassssfsdf!",
"100+ stars on gh!",
"now even gayer!",
"poketube!!!",
"rvlt.gg/poke!",
"women are pretty!",
"men are handsome!",
"enbys are cute!",
"you are cute :3",
"stallmansupport.org!!!"
]
"Woke!",
"Gay gay homosexaul gay!",
"free Palestine!",
"free software!",
"im... stuff!",
"frick capitalism!",
"still calling it twitter btw!",
"boop!",
"no way!",
"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!",
"𝓯𝓻𝓮𝓪𝓴𝔂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!",
"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",
];
function getJson(str) {
try {
@@ -71,20 +142,23 @@ function getJson(str) {
module.exports = function (app, config, renderTemplate) {
app.get("/app", async function (req, res) {
const { fetch } = await import("undici");
const { fetch } = await import("undici");
let tab = "";
if (req.query.tab) {
tab = `/?type=${capitalizeFirstLetter(req.query.tab)}`;
}
const invtrend = await fetch(
`${config.invapi}/trending${tab}`
);
const invtrend = await fetch(`${config.invapi}/trending${tab}`, {
headers: { "User-Agent": config.useragent },
});
const t = getJson(await invtrend.text());
const invpopular = await fetch(
`https://invid-api.poketube.fun/api/v1/popular`
`https://invid-api.poketube.fun/bHj665PpYhUdPWuKPfZuQGoX/api/v1/popular`,
{
headers: { "User-Agent": config.useragent },
}
);
const p = getJson(await invpopular.text());
@@ -115,7 +189,15 @@ module.exports = function (app, config, renderTemplate) {
const uaos = req.useragent.os;
const random = splash[Math.floor(Math.random() * splash.length)];
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 = () => {
if (req.useragent.isMobile) {
@@ -123,8 +205,14 @@ module.exports = function (app, config, renderTemplate) {
}
return renderTemplate(res, req, "landing.ejs", {
secure,
embedtype: req.query.embedtype,
banner: config.banner,
DisablePokeChan: req.query.DisablePokeChan,
verify,
isOldWindows,
random
proxyurl,
random,
});
};
@@ -133,10 +221,11 @@ module.exports = function (app, config, renderTemplate) {
if (isvld && req.params.v.length >= 10) {
return res.redirect(`/watch?v=${req.params.v}`);
} else {
return renderTemplate(res, req, "404.ejs", {
isOldWindows,
random
});
res.status(404);
return renderTemplate(res, req, "404.ejs", {
isOldWindows,
random,
});
}
}

View File

@@ -1,22 +1,5 @@
const {
fetcher,
core,
wiki,
musicInfo,
modules,
version,
initlog,
init,
} = require("../libpoketube-initsys.js");
const {
IsJsonString,
convert,
getFirstLine,
capitalizeFirstLetter,
turntomins,
getRandomInt,
getRandomArbitrary,
} = require("../ptutils/libpt-coreutils.js");
const { modules } = require("../libpoketube-initsys.js");
var http = require("https");
var ping = require("ping");
@@ -70,17 +53,17 @@ app.get("/api/set-channel-subs", async function (req, res) {
channelName: channelToSubName,
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}`)) {
// If the user has 'subs' but not this particular subscription, add it
db.set(`user.${userid}.subs.${channelToSub}`, {
channelName: channelToSubName,
avatar: avatar, // Store the avatar URL along with the subscription
});
res.json("user subbed");
res.redirect("/account-create")
} else {
// 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 +87,17 @@ app.get("/account-create", async function (req, res) {
}
});
app.get("/my-acc", async function (req, res) {
var userid = req.query.ID
var userSubs = db.get(`user.${userid}.subs`)
renderTemplate(res, req, "account-me.ejs", { userid, userSubs });
app.get("/my-acc", async function (req, res) {
var userid = req.query.ID;
// 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 });
});
};

View File

@@ -1,22 +1,4 @@
const {
fetcher,
core,
wiki,
musicInfo,
modules,
version,
initlog,
init,
} = require("../libpoketube-initsys.js");
const {
IsJsonString,
convert,
getFirstLine,
capitalizeFirstLetter,
turntomins,
getRandomInt,
getRandomArbitrary,
} = require("../ptutils/libpt-coreutils.js");
const { modules, version } = require("../libpoketube-initsys.js");
function getJson(str) {
try {
@@ -29,46 +11,43 @@ function getJson(str) {
const pkg = require("../../../package.json");
const os = require('os');
const cnf = require("../../../config.json");
const innertube = require("../libpoketube-youtubei-objects.json");
const verfull = "v24.2801-JeSsIcA-MAJOR-stable-dev-nonLTS-git-MTcwNjQzMTc0OQ==";
const versmol = "v24.2801-JeSsIcA"
const branch = "dev/master";
const codename = "jessica";
const versionnumber = "273";
const relaseunixdate = "MTcwNjQzMTc0OQ=="
const updatequote = "Empty your cup so that it may be filled; become devoid to gain totality. - Bruce Lee"
const { execSync } = require('child_process'); // DO NOT ABBRV THIS :SOB:
const verfull = "v25.2705-luna-MAJOR_UPDATE-stable-dev-nonLTS-git-MTc0NTcwNjc4MA==";
const versmol = "v25.2705-luna";
const branch = "dev/master";
const codename = "luna";
const versionnumber = "294";
const relaseunixdate = "MTc0NTcwNjc4MA==";
const updatequote = "i created this world.....to feel some control...";
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")
}
});
const headers = {
'User-Agent': config.useragent,
};
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,
headers: headers,
});
f.body.pipe(res);
});
app.get("/avatars/:v", async function (req, res) {
app.get("/avatars/:v", async function (req, res) {
var url = `https://vid.puffyan.us/ggpht/${req.params.v}`;
let f = await modules.fetch(url + `?cachefixer=${btoa(Date.now())}`, {
method: req.method,
headers: headers,
});
f.body.pipe(res);
@@ -79,44 +58,30 @@ app.get("/avatars/:v", async function (req, res) {
let f = await modules.fetch(url + `?cachefixer=${btoa(Date.now())}`, {
method: req.method,
headers: headers,
});
f.body.pipe(res);
});
app.get("/avatars/ytc/:v", async function (req, res) {
var url = `https://vid.puffyan.us/ggpht/ytc/${req.params.v.replace("ytc", "")}`;
let f = await modules.fetch(url + `?cachefixer=${btoa(Date.now())}`, {
method: req.method,
headers: headers,
});
f.body.pipe(res);
});
app.get("/api/search", async (req, res) => {
const query = req.query.query;
if (!query) {
return res.redirect("/");
}
return res.redirect(`/search?query=${query}`);
});
app.get("/api/video/download", async function (req, res) {
var v = req.query.v;
var format = "mp4";
var q = "22";
var q = "18";
if (req.query.q) q = req.query.q;
if (req.query.f) {
var format = "mp3";
}
const url = `https://tube.kuylar.dev/proxy/media/${v}/${q}`;
const url = `${config.videourl}/latest_version?id=${v}&itag=${q}&local=true`;
res.redirect(url);
});
@@ -128,57 +93,121 @@ app.get("/avatars/:v", async function (req, res) {
const l = req.query.h;
try {
let url = `https://invid-api.poketube.fun/api/v1/captions/${id}?label=${l}`;
let url = `${config.videourl}/api/v1/captions/${id}?label=${l}`;
let f = await fetch(url, {
headers: headers,
});
let f = await fetch(url);
const body = await f.text();
res.send(body);
} catch {}
});
app.use("/sb/i/:v/:imagePath/:img", async function (req, res) {
const { v, imagePath, img } = req.params;
const { sqp, xywh } = req.query;
const sighMatch = req.url.match(/&amp;sigh=([^&#]+)/);
const sigh = sighMatch ? sighMatch[1] : undefined;
const url = `https://yt.miruku.cafe/sb/i/${v}/${imagePath}/${img}?sqp=${sqp}&sigh=${sigh}&xywh=${req.query.xywh}`;
try {
let f = await modules.fetch(url + `?cachefixer=${btoa(Date.now())}`, {
method: req.method,
});
f.body.pipe(res);
console.log(url)
} catch (error) {
console.error("Error fetching image:", error);
res.status(500).send("Error fetching image");
}
});
app.get("/api/storyboards", async (req, res) => {
app.get("/api/getEngagementData", async (req, res) => {
const { fetch } = await import("undici");
const id = req.query.v;
const l = req.query.h;
try {
let url = `https://yt.miruku.cafe/api/v1/storyboards/${id}?width=320&height=180`;
if (id) {
const apiUrl = `https://ryd-proxy.kavin.rocks/votes/${id}&hash=d0550b6e28c8f93533a569c314d5b4e2`;
let f = await fetch(url);
let body = await f.text();
body = body.replace(/#xywh=(\d+),(\d+),(\d+),(\d+)/g, (match, x, y, w, h) => {
return `&xywh=${x},${y},${w},${h}`;
const response = await fetch(apiUrl, {
headers: headers,
});
res.send(body);
} catch {}
});
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.get("/feeds/videos.xml", async (req, res) => {
const id = req.query.channel_id;
@@ -187,6 +216,20 @@ app.use("/sb/i/:v/:imagePath/:img", async function (req, res) {
let f = await modules.fetch(url, {
method: req.method,
headers: headers, // Add headers to the fetch request
});
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,
headers: headers,
});
f.body.pipe(res);
@@ -211,29 +254,44 @@ app.use("/sb/i/:v/:imagePath/:img", async function (req, res) {
});
app.get("/api/version.json", async (req, res) => {
let latestCommitHash;
const invidious = await modules
.fetch("https://invid-api.poketube.fun/api/v1/stats")
.fetch("https://invid-api.poketube.fun/bHj665PpYhUdPWuKPfZuQGoX/api/v1/stats", {
headers: headers,
})
.then((res) => res.text())
.then((txt) => getJson(txt));
const cpus = os.cpus();
const totalMemory = os.totalmem() / (1024 * 1024 * 1024);
const roundedMemory = totalMemory.toFixed(2);
const cpus = os.cpus();
const totalMemory = os.totalmem() / (1024 * 1024 * 1024);
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 { useragent, ...configWithoutUA } = cnf;
const response = {
pt_version: {
version:versmol,
version_full:verfull
version: versmol,
version_full: verfull,
commit: latestCommitHash,
},
branch,
updatequote,
relaseunixdate,
vernum: versionnumber,
codename,
config:cnf,
system:{
ram:`${roundedMemory} GB`,
cpu:cpus[0].model,
config: configWithoutUA,
system: {
ram: `${roundedMemory} GB`,
cpu: cpus[0].model,
},
packages: {
libpt: version,
@@ -260,9 +318,11 @@ app.use("/sb/i/:v/:imagePath/:img", async function (req, res) {
const { fetch } = await import("undici");
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, {
headers: headers,
})
.then((res) => res.text())
.then((json) => JSON.parse(json));

View File

@@ -57,18 +57,20 @@ const ChannelTabs = {
};
module.exports = function (app, config, renderTemplate) {
app.get("/download", async function (req, res) {
app.get("/download", async (req, res) => {
try {
var v = req.query.v;
const v = req.query.v;
const thumbnailUrl = `https://i.ytimg.com/vi/${v}/maxresdefault.jpg`;
const colors = await modules.getColors(thumbnailUrl);
const color = colors[0].hex();
renderTemplate(res, req, "download.ejs", {
v,
color: await modules
.getColors(`https://i.ytimg.com/vi/${v}/maxresdefault.jpg`)
.then((colors) => colors[0].hex()),
color,
isMobile: req.useragent.isMobile,
});
} catch {
} catch (error) {
res.redirect("/");
}
});
@@ -86,7 +88,7 @@ module.exports = function (app, config, renderTemplate) {
});
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 { fetch } = await import("undici");
@@ -106,15 +108,26 @@ module.exports = function (app, config, renderTemplate) {
IsOldWindows = false;
}
const poketube_universe_value = "poketube_smart_search";
if (query) {
let redirectTo = null;
let splitParam = ":";
if (query?.includes("youtube.com/watch?v=")) {
try {
var videoid = query?.split("v=");
if (query.includes("youtube.com/watch?v=")) {
redirectTo = "/watch";
splitParam = "?v=";
} else if (query.includes("channel")) {
redirectTo = "/channel?id=";
} else if (query.includes("video")) {
redirectTo = "/watch?v=";
}
res.redirect("/watch?v=" + videoid[1]);
} catch {
return;
if (redirectTo) {
try {
const id = query.split(splitParam)[1];
res.redirect(`${redirectTo}${splitParam}${id}`);
} catch {
return;
}
}
}
@@ -122,6 +135,10 @@ module.exports = function (app, config, renderTemplate) {
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) {
return res.redirect("/");
}
@@ -135,13 +152,18 @@ module.exports = function (app, config, renderTemplate) {
try {
const headers = {};
const xmlData = await fetch(
`${config.invapi}/search?q=${encodeURIComponent(
query
)}&page=${encodeURIComponent(
continuation
)}&date=${date}&type=${type}&duration=${duration}&sort=${sort}&hl=en+gb`
)
let searchUrl;
if (req.query.from === 'hashtag') {
searchUrl = `${config.invapi}/hashtag/${query}?hl=en-gb`;
} else {
searchUrl = `${config.invapi}/search?q=${encodeURIComponent(query)}&page=${encodeURIComponent(continuation)}&date=${date}&type=${type}&duration=${duration}&sort=${sort}&hl=en+gb`;
}
const xmlData = await fetch(searchUrl, {
headers: {
'User-Agent': config.useragent,
},
})
.then((res) => res.text())
.then((txt) => getJson(txt));
@@ -161,7 +183,7 @@ module.exports = function (app, config, renderTemplate) {
summary: "",
});
} catch (error) {
console.error(`Error while searching for '${query}':`, error);
console.log(`Error while searching for '${query}':`, error);
res.redirect("/");
}
});
@@ -171,70 +193,7 @@ module.exports = function (app, config, renderTemplate) {
});
app.get("/web", async (req, res) => {
const query = req.query.query;
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("/");
}
res.redirect("/");
});
app.get("/channel/", async (req, res) => {
@@ -255,12 +214,17 @@ module.exports = function (app, config, renderTemplate) {
if (ID.endsWith("@poketube.fun")) {
ID = ID.slice(0, -"@poketube.fun".length);
}
const tab = req.query.tab;
const cache = {};
try {
// about
const bout = await fetch(config.tubeApi + `channel?id=${ID}&tab=about`);
const bout = await fetch(config.tubeApi + `channel?id=${ID}&tab=about`, {
headers: {
'User-Agent': config.useragent,
},
});
const h = await bout.text();
var boutJson = JSON.parse(modules.toJson(h));
} catch {
@@ -280,7 +244,11 @@ module.exports = function (app, config, renderTemplate) {
const getChannelData = async (url) => {
try {
return await fetch(url)
return await fetch(url, {
headers: {
'User-Agent': config.useragent,
},
})
.then((res) => res.text())
.then((txt) => getJson(txt));
} catch (error) {
@@ -289,25 +257,29 @@ module.exports = function (app, config, renderTemplate) {
};
const apiUrl = config.invapi + "/channels/";
const channelUrl = `${apiUrl}${atob(
const channelUrl = `${apiUrl}${ID}/${atob(
ChannelTabs.videos
)}/${ID}/?sort_by=${sort_by}${continuation}`;
)}?sort_by=${sort_by}${continuation}`;
const shortsUrl = `${apiUrl}${ID}/${atob(
ChannelTabs.shorts
)}?sort_by=${sort_by}${continuations}`;
)}?sort_by=${sort_by}${continuation}`;
const streamUrl = `${apiUrl}${ID}/${atob(
ChannelTabs.streams
)}?sort_by=${sort_by}${continuationl}`;
const communityUrl = `${apiUrl}${atob(
)}?sort_by=${sort_by}${continuation}`;
const communityUrl = `${apiUrl}${ID}/${atob(
ChannelTabs.community
)}/${ID}/?hl=en-US`;
const PlaylistUrl = `${apiUrl}${atob(
)}?hl=en-US`;
const PlaylistUrl = `${apiUrl}${ID}/${atob(
ChannelTabs.playlist
)}/${ID}/?hl=en-US`;
)}?hl=en-US`;
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([
getChannelData(channelUrl),
@@ -318,6 +290,19 @@ module.exports = function (app, config, renderTemplate) {
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) {
const maxresDefaultThumbnail = video.videoThumbnails.find(
(thumbnail) => thumbnail.quality === "maxresdefault"
@@ -346,7 +331,7 @@ module.exports = function (app, config, renderTemplate) {
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 description = about?.Description.toString().replace(
/\n/g,
@@ -354,10 +339,16 @@ module.exports = function (app, config, renderTemplate) {
);
const dnoreplace = about?.Description.toString();
let ChannelFirstVideoObject = {
subCountText: "0",
authorVerified: false,
};
renderTemplate(res, req, "channel.ejs", {
ID,
tab,
shorts,
firstVideo: ChannelFirstVideoObject,
j: boutJson,
sort: sort_by,
stream,
@@ -376,10 +367,9 @@ module.exports = function (app, config, renderTemplate) {
isMobile: req.useragent.isMobile,
about,
playlist,
subs:
typeof subscribers === "string"
? subscribers.replace("subscribers", "")
: "None",
subs: typeof subscribers === "string"
? subscribers.replace("subscribers", "")
: "None",
desc: dnoreplace === "[object Object]" ? "" : description,
});
} catch (error) {

View File

@@ -66,7 +66,7 @@ module.exports = function (app, config, renderTemplate) {
});
app.get("/gaming", (req, res) => {
res.redirect("/discover?tab=gaming");
res.redirect("/app?tab=gaming");
});
app.get("/custom-theme", (req, res) => {

View File

@@ -115,27 +115,22 @@ module.exports = function (app, config, renderTemplate) {
app.get("/apps", function (req, res) {
renderTemplate(res, req, "apps.ejs");
});
app.get("/playlist", async function (req, res) {
const { fetch } = await import("undici");
if (!req.query.list) res.redirect("/");
if (req.useragent.isMobile) res.redirect("/");
const playlist = await fetch(
`${config.invapi}/playlists/${req.query.list}?hl=en-us`
);
const headers = { "User-Agent": config.useragent };
const p = getJson(await playlist.text());
var mediaproxy = config.media_proxy;
app.get("/playlist", async function (req, res) {
if (!req.query.list) res.redirect("/");
if (req.useragent.isMobile) res.redirect("/");
const playlist = await fetch(`${config.invapi}/playlists/${req.query.list}?hl=en-us`, { headers });
const p = getJson(await playlist.text());
var mediaproxy = config.media_proxy;
if (req.useragent.source.includes("Pardus")) {
mediaproxy = "https://media-proxy.ashley0143.xyz";
}
renderTemplate(res, req, "playlist.ejs", { p, mediaproxy });
});
if (req.useragent.source.includes("Pardus")) {
var mediaproxy = "https://media-proxy.ashley0143.xyz";
}
renderTemplate(res, req, "playlist.ejs", {
p,
mediaproxy,
});
});
app.get("/license", function (req, res) {
renderTemplate(res, req, "license.ejs");
@@ -153,6 +148,56 @@ module.exports = function (app, config, renderTemplate) {
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) {
res.sendFile("offline.html", { root: location_pwa });
});
@@ -210,11 +255,20 @@ module.exports = function (app, config, renderTemplate) {
}
});
app.get("/game-hub", function (req, res) {
renderTemplate(res, req, "gamehub.ejs", {
game: req.query.game,
});
app.get("/game-hub", function (req, res) {
var gameslist = ["pong", "tic-tac-toe", "sudoku", "snake", "breakout", "minesweeper"];
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) => {
const id = req.params.id;

View File

@@ -141,8 +141,8 @@ function lightOrDark(color) {
}
function isDntEnabled(req) {
const dntHeader = req.header('DNT');
return dntHeader && (dntHeader === '1' || dntHeader === 'true');
const dntHeader = req.header("DNT");
return dntHeader && (dntHeader === "1" || dntHeader === "true");
}
function IsInArray(array, id) {
@@ -164,11 +164,18 @@ function getJson(str) {
const PATREON_REGEX = /https:\/\/(?:www\.)?patreon.com\/(?<name>[\w\d_-]+)/;
/* 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 TWITCH_REGEX = /https:\/\/twitch.tv\/(?<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 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) {
app.get("/encryption", async function (req, res) {
@@ -190,6 +197,13 @@ module.exports = function (app, config, renderTemplate) {
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 contentregion = region || "US";
@@ -203,148 +217,179 @@ module.exports = function (app, config, renderTemplate) {
const secure = ["poketube.fun"].includes(req.hostname);
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 {
renderTemplate(res, req, "poketube.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,
escapeHtml,
f,
t: config.t_url,
optout: m,
badges,
desc,
comments,
n: nnn,
inv_vid,
lyrics: "",
});
} catch {
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).replace(/\bx.com\b/, "twitter.com")
function extractInfo(regex) {
return descriptionString !== "[object Object]"
? (regex.exec(descriptionString) ?? {}).groups
: undefined;
}
const support = extractInfo(PATREON_REGEX);
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);
const linkto = extractInfo(LNKTO_REGEX);
const discord = extractInfo(CORD_REGEX);
const twitch = extractInfo(TWITCH_REGEX);
const reddit = extractInfo(REDDIT_REGEX);
/* meta software */
const instagram = extractInfo(INSTAGRAM_REGEX);
const threads_by_instagram = extractInfo(THREADS_BY_INSTAGRAM_REGEX);
const videoObject = inv_vid?.adaptiveFormats;
function findItag(adaptiveFormats) {
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) => {
@@ -367,144 +412,143 @@ module.exports = function (app, config, renderTemplate) {
const secure = ["poketube.fun"].includes(req.hostname);
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 = "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;
INNERTUBE.getYouTubeApiVideo(f, v, contentlang, contentregion).then(
(data) => {
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;
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(TWITTER_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 (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) {

View File

@@ -94,7 +94,7 @@ function init(app, config, rendertemplate) {
}, 100);
} catch (err) {
initlog("[FAILED] Load pages \n" + err);
initlog("[POKE SEGFAULT] Load pages \n" + err);
console.error(err);
}
}, 100);

View File

@@ -11,37 +11,24 @@ const { curly } = require("node-libcurl");
const getdislikes = require("../libpoketube/libpoketube-dislikes.js");
const getColors = require("get-image-colors");
const config = require("../../config.json")
const { Innertube, UniversalCache } = require('youtubei.js');
/**
* Class representing PokeTube's core functionality.
*/
class InnerTubePokeVidious {
/**
* Create an instance of InnerTubePokeVidious.
* @param {object} config - Configuration object for InnerTubePokeVidious.
* @param {string} config.tubeApi - Tube API URL.
* @param {string} config.invapi - Invid API URL.
* @param {string} config.invapi_alt - Invid API URL - ALT .
* @param {string} config.dislikes - Dislikes API URL.
* @param {string} config.t_url - Matomo URL.
*/
constructor(config) {
this.config = config;
this.cache = {};
this.language = "hl=en-US";
this.param = "2AMB"
this.param_legacy = "CgIIAdgDAQ%3D%3D"
this.apikey = "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8"
this.ANDROID_API_KEY = "AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w"
this.ANDROID_APP_VERSION = "20.20.41" // https://www.apkmirror.com/apk/google-inc/youtube/youtube-20-20-41-release/
this.ANDROID_VERSION = "16" // https://en.wikipedia.org/wiki/Android_version_history
this.useragent = config.useragent || "PokeTube/2.0.0 (GNU/Linux; Android 14; Trisquel 11; poketube-vidious; like FreeTube)"
this.INNERTUBE_CONTEXT_CLIENT_VERSION = "1"
this.region = "region=US";
this.sqp = "-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw";
}
/**
* Fetch JSON from API response.
* @param {string} str - String response from the API.
* @returns {object|null} Parsed JSON object or null if parsing failed.
*/
getJson(str) {
try {
return JSON.parse(str);
@@ -50,80 +37,68 @@ class InnerTubePokeVidious {
}
}
/**
* Check if the provided object has the required properties.
* @param {object} obj - Object to check.
* @returns {boolean} True if the object has the required properties, false otherwise.
*/
checkUnexistingObject(obj) {
if (obj) {
if ("authorId" in obj) {
return true;
}
}
return obj && "authorId" in obj;
}
/**
* Fetch video information.
* @param {string} v - Video ID.
* @returns {Promise<object>} Promise resolving to the video information.
*/
async getYouTubeApiVideo(f, v, contentlang, contentregion) {
const { fetch } = await import("undici");
const yt = await Innertube.create({ cache: new UniversalCache(false), generate_session_locally: true });
if (v == null) return "Gib ID";
// Check if result is already cached
if (this.cache[v] && Date.now() - this.cache[v].timestamp < 3600000) {
return this.cache[v].result;
}
const headers = {};
let desc = "";
const headers = {
"User-Agent": this.useragent,
};
const fetchWithRetry = async (url, options = {}, retries = 3) => {
for (let attempt = 0; attempt < retries; attempt++) {
const res = await fetch(url, {
...options,
headers: {
...options.headers,
...headers,
}
});
if (res.status === 500 && attempt < retries - 1) continue;
return res;
}
return null;
};
try {
const [videoInfo, videoData] = await Promise.all([
fetch(`${this.config.invapi}/videos/${v}?hl=${contentlang}&region=${contentregion}&h=${btoa(Date.now())}`).then((res) => res.text()),
curly
.get(`${this.config.tubeApi}video?v=${v}`, {
const [invComments, videoInfo, videoData] = await Promise.all([
fetchWithRetry(`${this.config.invapi}/comments/${v}?hl=${contentlang}&region=${contentregion}&h=${btoa(Date.now())}`).then(res => res.text()),
fetchWithRetry(`${this.config.invapi}/videos/${v}?hl=${contentlang}&region=${contentregion}&h=${btoa(Date.now())}`).then(res => res.text()),
curly.get(`${this.config.tubeApi}video?v=${v}`, {
httpHeader: Object.entries(headers).map(([k, v]) => `${k}: ${v}`),
})
.then((res) => {
}).then(res => {
const json = toJson(res.data);
const video = this.getJson(json);
return { json, video };
}),
]);
]);
const comments = this.getJson(invComments);
const vid = this.getJson(videoInfo);
const { json, video } = videoData;
const comments = await yt.getComments(v);
let p = {};
if (f === "true") {
const uploads = await fetchWithRetry(`${this.config.invapi}/channels/${vid.authorId}?hl=${contentlang}&region=${contentregion}`);
p = this.getJson(await uploads.text());
}
const vid = await this.getJson(videoInfo);
const { json, video } = videoData;
if (!vid) {
console.log(`Sorry nya, we couldn't find any information about that video qwq`);
}
var channel_uploads = { };
if (f == "true") {
channel_uploads = await fetch(
`${this.config.invapi}/channels/${vid.authorId}?hl=${contentlang}&region=${contentregion}`
);
var p = this.getJson(await channel_uploads.text());
}
if (this.checkUnexistingObject(vid)) {
const fe = await getdislikes(v);
if (!vid) {
console.log(
`Sorry nya, we couldn't find any information about that video qwq`
);
}
if (this.checkUnexistingObject(vid)) {
const fe = await getdislikes(v);
try {
const headers = {};
// Store result in cache
this.cache[v] = {
result: {
json: json?.video,
@@ -134,57 +109,38 @@ class InnerTubePokeVidious {
engagement: fe.engagement,
wiki: "",
desc: "",
color: await getColors(
`https://vid.puffyan.us/vi/${v}/hqdefault.jpg?sqp=${this.sqp}`
).then((colors) => colors[0].hex()),
color2: await getColors(
`https://vid.puffyan.us/vi/${v}/hqdefault.jpg?sqp=${this.sqp}`
).then((colors) => colors[1].hex()),
color: await getColors(`https://i.ytimg.com/vi/${v}/hqdefault.jpg?sqp=${this.sqp}`).then(colors => colors[0].hex()),
color2: await getColors(`https://i.ytimg.com/vi/${v}/hqdefault.jpg?sqp=${this.sqp}`).then(colors => colors[1].hex()),
},
timestamp: Date.now(),
};
return this.cache[v].result;
} catch (error) {
this.initError("Error getting video", error);
}
}
} catch {
}
}
/**
* Check if a video ID is valid.
* @param {string} v - Video ID.
* @returns {boolean} True if the video ID is valid, false otherwise.
*/
isvalidvideo(v) {
if (v != "assets" && v != "cdn-cgi" && v != "404") {
return true;
} else {
return false;
} catch (error) {
this.initError("Error getting video", error);
}
}
/**
* Initialize an error.
* @param {string} args - Error message.
* @param {Error} error - Error object.
*/
isvalidvideo(v) {
if (v != "assets" && v != "cdn-cgi" && v != "404") {
return /^([a-zA-Z0-9_-]{11})/.test(v);
}
return false;
}
initError(args, error) {
console.error("[LIBPT CORE ERROR]" + args, error);
console.error("[LIBPT CORE ERROR] " + args, error);
}
}
// Create an instance of InnerTubePokeVidious with the provided config
const pokeTubeApiCore = new InnerTubePokeVidious({
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",
dislikes: "https://returnyoutubedislikeapi.com/votes?videoId=",
t_url: "https://t.poketube.fun/",
useragent: config.useragent,
});
module.exports = pokeTubeApiCore;

View File

@@ -42,12 +42,10 @@ class PokeTubeDislikesAPIManager {
*/
async _getEngagementData() {
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 engagement = await fetch(apiUrl).then((res) => res.json());
engagement.viewCount = this.videoId === "cc2-4ci4G84" ? 1406988074 : engagement.viewCount;
return engagement;
}

View File

@@ -14,7 +14,7 @@
"INNERTUBE_CONTEXT_CLIENT_NAME": "1",
"INNERTUBE_CONTEXT_CLIENT_VERSION": "2.20240214.05.00",
"INNERTUBE_CONTEXT_GL": "US",
"INNERTUBE_CONTEXT_HL": "en-US"
"INNERTUBE_CONTEXT_HL": "en"
},
"LATEST_ECATCHER_SERVICE_PARAMS": { "client.name": "WEB" },
"INNERTUBE_API_KEYS": {