Compare commits
5 Commits
videojs
...
docker-sta
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec6a3f6e5a | ||
|
|
16f79f9ff2 | ||
|
|
74c7e7d051 | ||
|
|
7d2776584b | ||
|
|
8d8b098d86 |
@@ -3,8 +3,13 @@
|
||||
.git
|
||||
.gitignore
|
||||
node_modules
|
||||
invidious-source
|
||||
json.sqlite
|
||||
*.md
|
||||
docker-compose.yml
|
||||
Dockerfile
|
||||
/docker-compose.yml
|
||||
/Dockerfile
|
||||
/config.json
|
||||
/january
|
||||
/pokevidious
|
||||
/p
|
||||
/t
|
||||
/sdk
|
||||
|
||||
18
.drone.yml
@@ -1,19 +1,19 @@
|
||||
kind: pipeline
|
||||
type: exec
|
||||
name: Build and Push Docker Image
|
||||
name: Build and Push Docker Image (Quay)
|
||||
|
||||
platform:
|
||||
os: linux
|
||||
arch: arm64
|
||||
arch: amd64
|
||||
|
||||
steps:
|
||||
- name: Build
|
||||
environment:
|
||||
CODEBERG_USERNAME:
|
||||
from_secret: CODEBERG_USERNAME
|
||||
CODEBERG_PASSWORD:
|
||||
from_secret: CODEBERG_PASSWORD
|
||||
QUAY_USERNAME:
|
||||
from_secret: QUAY_USERNAME
|
||||
QUAY_PASSWORD:
|
||||
from_secret: QUAY_PASSWORD
|
||||
commands:
|
||||
- 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
|
||||
- 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
|
||||
29
Dockerfile
@@ -2,10 +2,14 @@
|
||||
## docker build -t poketube .
|
||||
|
||||
## To run the image, run:
|
||||
## docker run -d -p 6003:6003 poketube
|
||||
## docker run -p 6003:6003 -v ./config.json:/poketube/config.json:ro poketube
|
||||
## but preferably, use the docker-compose.yml file
|
||||
|
||||
# Base (Debian)
|
||||
FROM debian
|
||||
# Base
|
||||
FROM node:16-alpine
|
||||
|
||||
# Install dependencies
|
||||
RUN apk add --no-cache git build-base python3
|
||||
|
||||
# Set Work Directory
|
||||
WORKDIR /poketube
|
||||
@@ -14,21 +18,8 @@ COPY . /poketube
|
||||
# Expose Ports
|
||||
EXPOSE 6003
|
||||
|
||||
# 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
|
||||
# Install Dependencies
|
||||
RUN npm install
|
||||
|
||||
# Run
|
||||
CMD npm start
|
||||
# Start the app
|
||||
CMD ["npm", "start"]
|
||||
|
||||
228
README.md
@@ -1,87 +1,159 @@
|
||||
|
||||
<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>
|
||||
<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" />
|
||||
<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>PRIVACY APP OF YOUR DREAMS! :3</p>
|
||||
</h1>
|
||||
<p>The Ultimate Privacy App</p>
|
||||
</h1>
|
||||
|
||||
<div align="center">
|
||||
<p>Be anonymous while watching (cat falling) videos, searching the web, and listening to music on Poke - the free privacy front-end!</p>
|
||||
</div>
|
||||
|
||||
<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">
|
||||
<a href="#welcome">Welcome!</a> | <a href="#features">Features</a> | <a href="#no-non-free-codec-needed">No Non-Free Codec</a> | <a href="#hosting-poke">Hosting</a> | <a href="#poke-community">Community</a> | <a href="#legal">Legal</a>
|
||||
<br><br>
|
||||
<a href="https://status.poketube.fun" target="_blank">
|
||||
<img width="170" src="https://api.netweak.com/status-badges/K2LY9" alt="Status Badge"/>
|
||||
</a>
|
||||
<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 License">
|
||||
</a>
|
||||
</div>
|
||||
|
||||

|
||||
[Welcome!](#welcome) | [Features](#features) | [No non-free codec needed](#no-non-free-codec-needed-3) | [Hosting Poke~](#hosting-poketube) | [Poke community!](#poketube-community) | [The Legal Stuff (boring tbh)](#the-legal-stuff-boring-tbh)
|
||||
|
||||
<a href="https://status.poketube.fun" target="_blank">
|
||||
<img
|
||||
width="170"
|
||||
src="https://api.netweak.com/status-badges/K2LY9"
|
||||
alt="Netweak status badge"
|
||||
/>
|
||||
</a><br>
|
||||
<a href="https://tosdr.org/en/service/7114">
|
||||
<img src="https://shields.tosdr.org/en_7114.svg"/>
|
||||
</a>
|
||||
<img src="https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg"> <a href="./LICENSE"><img src="https://img.shields.io/badge/License-GPL--3-FF6666" alt="License - GPL-3"></a>
|
||||
|
||||
<a href="https://ci.poketube.fun/ashley/poke">
|
||||
<img src="https://ci.poketube.fun/api/badges/ashley/poke/status.svg" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
## Welcome!
|
||||
|
||||
Welcome to Poke (formerly PokeTube), the privacy-friendly YouTube front-end built with the InnerTube API! Imagine paying for YouTube Premium just to download videos - couldn't be us (literally).
|
||||
|
||||
## Features
|
||||
|
||||
| <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 |
|
||||
|
||||
## No Non-Free Codec Needed
|
||||
|
||||
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!~
|
||||
|
||||
## Hosting Poke
|
||||
|
||||
### NodeJS
|
||||
|
||||
1. **Install Packages**
|
||||
- Fedora/RHEL: `$ sudo dnf install git make gcc libcurl nodejs python libcurl4 g++`
|
||||
- Debian/Ubuntu: `$ sudo apt install git make gcc libcurl4-openssl-dev nodejs npm python g++`
|
||||
|
||||
2. **Clone Repo**
|
||||
- Codeberg: `$ git clone https://codeberg.org/ashley/poke.git`
|
||||
- GitHub: `$ git clone https://github.com/ashley0143/poke.git`
|
||||
|
||||
3. **Install Dependencies**
|
||||
- `$ cd poke`
|
||||
- `$ npm install`
|
||||
|
||||
4. **Start Server**
|
||||
- `$ node server.js`
|
||||
|
||||
Congrats! PokeTube should now be running on `localhost:6003`! 🎉
|
||||
|
||||
### Docker
|
||||
|
||||
1. **Create Directory**
|
||||
- `$ mkdir poketube && cd poketube`
|
||||
|
||||
2. **Download Config**
|
||||
- `$ curl -O https://codeberg.org/Ashley/poke/raw/branch/main/docker-compose.yml`
|
||||
|
||||
3. **Run PokeTube**
|
||||
- `$ docker compose up -d`
|
||||
|
||||
Congrats! PokeTube should now be running on `localhost:6003`! 🎉
|
||||
|
||||
## Poke Community
|
||||
|
||||
Join us on [Revolt](https://rvlt.gg/poketube) or [Matrix](https://matrix.to/#/#poke:vern.cc)! I promise we're cool! <3
|
||||
This is the source code of Poke (formerly PokeTube), the privacy-friendly youtube front-end built with the InnerTube API!
|
||||
|
||||
|
||||
<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>
|
||||
|
||||
<h3>Customize</h3>
|
||||
Customize Poketube However you want :3
|
||||
|
||||
<h3>PWA</h3>
|
||||
Install PokeTube as a pwa on your mobile device :3
|
||||
|
||||
<h3>Accounts </h3>
|
||||
Suscribe (yes Suscribe hehe sussy baka) to whaever channel you want!
|
||||
|
||||
<h3>Web Search </h3>
|
||||
Search the web privatly on poketube :3
|
||||
|
||||
<br>
|
||||
<h3>And... </h3>
|
||||
<p>
|
||||
Ambient mode, HQ audio And Even more!!!!!
|
||||
</p>
|
||||
|
||||
## 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>
|
||||
|
||||
## No Non-free codec needed :3
|
||||
|
||||
Poke uses openh264 which is free software! poketube does not inculude non free stuff owowowoow!!!!
|
||||
|
||||
you can view the source code of the openh264 codec in this repo :3 --> https://github.com/cisco/openh264.git
|
||||
|
||||
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.
|
||||
|
||||
## Hosting Poke~
|
||||
|
||||
### 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
|
||||
|
||||
### With NodeJS
|
||||
- To self host your own Poke instance, you'll need the following:
|
||||
|
||||
- [Node.js](https://nodejs.org/en/download/)
|
||||
- [npm](http://npmjs.com) (Included with Node.js)
|
||||
|
||||
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
|
||||
|
||||
## The Legal Stuff (boring tbh)
|
||||
the main parts of the project is Under GPL-3.0-OR-LATER :3
|
||||
@@ -89,22 +161,18 @@ 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
|
||||
|
||||
|
||||
[Code Of conduct](https://codeberg.org/Ashley/poke/src/branch/main/CODE_OF_CONDUCT.md)
|
||||
|
||||
[Privacy Policy](https://poketube.fun/privacy)
|
||||
|
||||
TL;DR: we dont collect or share your personal info, that's it lol.
|
||||
|
||||
We use the GNU Coding Standard Thingy, see [this link.](https://www.gnu.org/prep/standards)
|
||||
We additionally use the GNU Coding Standard, see [this link.](https://www.gnu.org/prep/standards)
|
||||
|
||||
|
||||
<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>
|
||||
<a href="https://gnu.org/not-open-source">
|
||||
<img width="200" src="https://autumn.revolt.chat/attachments/eNpfwV2C1_wudONe43YCvWr-4vbvLpG78HbuXgOYfO">
|
||||
</a>
|
||||
<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>
|
||||
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
|
||||
|
||||
_____ _______ _____ _____
|
||||
/\ \ /::\ \ /\ \ /\ \
|
||||
/::\ \ /::::\ \ /::\____\ /::\ \
|
||||
/::::\ \ /::::::\ \ /:::/ / /::::\ \
|
||||
/::::::\ \ /::::::::\ \ /:::/ / /::::::\ \
|
||||
/:::/\:::\ \ /:::/~~\:::\ \ /:::/ / /:::/\:::\ \
|
||||
/:::/__\:::\ \ /:::/ \:::\ \ /:::/____/ /:::/__\:::\ \
|
||||
/::::\ \:::\ \ /:::/ / \:::\ \ /::::\ \ /::::\ \:::\ \
|
||||
/::::::\ \:::\ \ /:::/____/ \:::\____\ /::::::\____\________ /::::::\ \:::\ \
|
||||
/:::/\:::\ \:::\____\ |:::| | |:::| | /:::/\:::::::::::\ \ /:::/\:::\ \:::\ \
|
||||
/:::/ \:::\ \:::| ||:::|____| |:::| |/:::/ |:::::::::::\____\/:::/__\:::\ \:::\____\
|
||||
\::/ \:::\ /:::|____| \:::\ \ /:::/ / \::/ |::|~~~|~~~~~ \:::\ \:::\ \::/ /
|
||||
\/_____/\:::\/:::/ / \:::\ \ /:::/ / \/____|::| | \:::\ \:::\ \/____/
|
||||
\::::::/ / \:::\ /:::/ / |::| | \:::\ \:::\ \
|
||||
\::::/ / \:::\__/:::/ / |::| | \:::\ \:::\____\
|
||||
\::/____/ \::::::::/ / |::| | \:::\ \::/ /
|
||||
~~ \::::::/ / |::| | \:::\ \/____/
|
||||
\::::/ / |::| | \:::\ \
|
||||
\::/____/ \::| | \:::\____\
|
||||
~~ \:| | \::/ /
|
||||
\|___| \/____/
|
||||
|
||||
|
||||
16
config.json
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"tubeApi": "https://inner-api.poketube.fun/api/",
|
||||
"invapi": "https://invid-api.poketube.fun/bHj665PpYhUdPWuKPfZuQGoX/api/v1",
|
||||
"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",
|
||||
"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",
|
||||
"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",
|
||||
"proxylocation": "USA",
|
||||
"t_url": "https://t.poketube.fun/",
|
||||
"server_port": "6003"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 670 KiB |
|
Before Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 1000 KiB |
|
Before Width: | Height: | Size: 489 KiB |
10
css/app.js
@@ -82,14 +82,6 @@ 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');
|
||||
@@ -369,11 +361,9 @@ video.addEventListener("contextmenu", function(event) {
|
||||
});
|
||||
|
||||
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";
|
||||
});
|
||||
|
||||
|
||||
BIN
css/bg-720.webm
Normal file
BIN
css/bg-full.webm
Normal file
131
css/landing.css
@@ -719,12 +719,76 @@ li > a {cursor: var(--pointer-cursor)}
|
||||
.btn {cursor: var(--pointer-cursor) !important}
|
||||
|
||||
@font-face {
|
||||
src: url("https://p.poketube.fun/https://cdn.glitch.global/43b6691a-c8db-41d4-921c-8cf6aa0d9108/robotoflex.ttf?v=16683434286881");
|
||||
font-family: "PokeTube Flex";
|
||||
src: url("https://p.poketube.fun/https://cdn.glitch.global/43b6691a-c8db-41d4-921c-8cf6aa0d9108/robotoflex.ttf?v=16683434286881");
|
||||
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;
|
||||
@@ -759,20 +823,20 @@ li > a {cursor: var(--pointer-cursor)}
|
||||
}
|
||||
}
|
||||
.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: 503px;
|
||||
height: 700px;
|
||||
object-fit: cover;
|
||||
object-position: top;
|
||||
mask-image: linear-gradient(#5315ff,#0000);
|
||||
@@ -790,6 +854,7 @@ li > a {cursor: var(--pointer-cursor)}
|
||||
}
|
||||
.features {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
.features p {
|
||||
border-radius: 48px;
|
||||
@@ -805,53 +870,6 @@ li > a {cursor: var(--pointer-cursor)}
|
||||
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);
|
||||
@@ -893,12 +911,3 @@ video {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.adaptive-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit,minmax(350px,1fr));
|
||||
max-width: 1200px;
|
||||
margin: auto;
|
||||
grid-gap: 12px;
|
||||
}
|
||||
|
||||
33
css/maps.js
@@ -1,33 +0,0 @@
|
||||
var bbox = "?bbox=-165.76171875000003%2C-3.864254615721396%2C30.410156250000004%2C72.44879155730672&layer=mapnik"
|
||||
var iframe = document.getElementById('myFrame');
|
||||
iframe.src=`https://www.openstreetmap.org/export/embed.html${bbox}`
|
||||
iframe.addEventListener('load', function() {
|
||||
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
|
||||
var links = iframeDocument.getElementsByTagName('a');
|
||||
for (var i = 0; i < links.length; i++) {
|
||||
links[i].addEventListener('click', function(event) {
|
||||
var url = event.target.href;
|
||||
if (url.includes('www.openstreetmap.org')) {
|
||||
event.preventDefault();
|
||||
iframe.src = url;
|
||||
window.history.pushState(null, '', url);
|
||||
} else {
|
||||
window.location.href = url;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
window.onpopstate = function(event) {
|
||||
iframe.src = window.location.href;
|
||||
};
|
||||
|
||||
iframe.addEventListener('load', function() {
|
||||
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
|
||||
var elements = iframeDocument.querySelectorAll('[style*="//dka575ofm4ao0.cloudfront.net"]');
|
||||
for (var i = 0; i < elements.length; i++) {
|
||||
var style = elements[i].style.backgroundImage;
|
||||
var newStyle = style.replace('//dka575ofm4ao0.cloudfront.net', 'https://p.poketube.fun/https://dka575ofm4ao0.cloudfront.net');
|
||||
elements[i].style.backgroundImage = newStyle;
|
||||
}
|
||||
});
|
||||
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 1020 KiB |
@@ -573,8 +573,7 @@ a.avatar {
|
||||
border-radius: 8px;
|
||||
font-family: "Montserrat", sans-serif;
|
||||
box-shadow: var(--border-color) 0 0 5px;
|
||||
background-color: #222022d6;
|
||||
backdrop-filter: blur(20px);
|
||||
background-color: var(--context-menu-background);
|
||||
}
|
||||
|
||||
.dropdown__item {
|
||||
@@ -732,30 +731,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;
|
||||
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;
|
||||
.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;
|
||||
}
|
||||
|
||||
@media screen and (min-width: 1400px) {
|
||||
@@ -784,23 +783,6 @@ 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;
|
||||
@@ -831,14 +813,8 @@ marquee {
|
||||
display:none;
|
||||
}
|
||||
|
||||
@media screen and (max-height: 840px) {
|
||||
.theatermodeon {
|
||||
max-height: 10% !important;
|
||||
}
|
||||
}
|
||||
|
||||
#video:target {
|
||||
object-fit:contain;
|
||||
object-fit:none;
|
||||
}
|
||||
|
||||
#secret-theme:target{
|
||||
|
||||
14
css/product.svg
Normal file
|
After Width: | Height: | Size: 2.4 MiB |
BIN
css/red-tape.png
|
Before Width: | Height: | Size: 263 KiB |
@@ -1035,10 +1035,3 @@ a.icon-button > img {
|
||||
width: 500px;
|
||||
padding: 8px;
|
||||
}
|
||||
.search-options {
|
||||
display: flex;
|
||||
justify-content: space-evenly;
|
||||
width: 100%;
|
||||
max-width: 855px;
|
||||
margin: auto;
|
||||
}
|
||||
@@ -1,10 +1,111 @@
|
||||
# To run, please do either docker compose up -d (for docker's own version) or docker-compose up -d (for your OSes package managers verison)
|
||||
# To run 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
|
||||
|
||||
services:
|
||||
poke:
|
||||
image: codeberg.org/poketube/poke:amd64
|
||||
# image: codeberg.org/poketube/poke:arm64 # Works with ARM64/v8, not ARM64/v7
|
||||
poketube: # port 6003
|
||||
# image: quay.io/sudovanilla/poketube
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
depends_on:
|
||||
- invidious
|
||||
- lighttube
|
||||
- january
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./config.json:/poketube/config.json
|
||||
- ./docker/poke.json:/poketube/config.json:ro
|
||||
|
||||
# lighttube - tubeApi
|
||||
lighttube: # port 80
|
||||
image: docker.io/kuylar/lighttube:20220711
|
||||
depends_on:
|
||||
- mongo
|
||||
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
|
||||
ports:
|
||||
- "6003:6003"
|
||||
# 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
|
||||
|
||||
1
docker/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/data
|
||||
23
docker/Caddyfile
Normal file
@@ -0,0 +1,23 @@
|
||||
# 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
|
||||
}
|
||||
8
docker/invidious.yaml
Normal file
@@ -0,0 +1,8 @@
|
||||
db:
|
||||
dbname: invidious
|
||||
user: postgres
|
||||
password: postgres
|
||||
host: postgres
|
||||
port: 5432
|
||||
check_tables: true
|
||||
hmac_key: ujZnZzcMoxg2pEjdV52c
|
||||
8
docker/lighttube.yaml
Normal file
@@ -0,0 +1,8 @@
|
||||
Interface:
|
||||
MessageOfTheDay: meow
|
||||
Credentials:
|
||||
UseCredentials: false
|
||||
Sapisid:
|
||||
Psid:
|
||||
Database:
|
||||
MongoConnectionString: mongodb://lighttube:lighttube@mongo:27017/
|
||||
2
docker/mongo.env
Normal file
@@ -0,0 +1,2 @@
|
||||
MONGO_INITDB_ROOT_USERNAME=lighttube
|
||||
MONGO_INITDB_ROOT_PASSWORD=lighttube
|
||||
17
docker/poke.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
3
docker/postgres.env
Normal file
@@ -0,0 +1,3 @@
|
||||
POSTGRES_DB=invidious
|
||||
POSTGRES_USER=postgres
|
||||
POSTGRES_PASSWORD=postgres
|
||||
32
docker/pproxy.json
Normal file
@@ -0,0 +1,32 @@
|
||||
[
|
||||
"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"
|
||||
]
|
||||
@@ -1,4 +1,4 @@
|
||||
<%- 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)"
|
||||
<%- include('error.ejs', {
|
||||
error: "404",
|
||||
description: "Very 1984 Innit? I dont think this webpage exist :p"
|
||||
}) %>
|
||||
@@ -1,4 +1,4 @@
|
||||
<%- include('./layouts/error.ejs', {
|
||||
<%- include('error.ejs', {
|
||||
error: "502",
|
||||
description: "An error has occurred. Try again or come back later."
|
||||
}) %>
|
||||
@@ -63,10 +63,10 @@ var apiurl = "https://poketube.fun/api"
|
||||
if(!localStorage.getItem("UserID")) {
|
||||
localStorage.setItem('UserID', `<%- userid %>`);
|
||||
<% db.set(`user.${userid}`, userid) %>
|
||||
location.href = "/my-acc?ID=" + `<%- userid %>` + "&rparam=1"
|
||||
location.href = "/my-acc?ID=" + `<%- userid %>`
|
||||
}
|
||||
|
||||
if(localStorage.getItem("UserID")) {
|
||||
location.href = "/my-acc?ID=" + localStorage.getItem("UserID") + "&rparam=1"
|
||||
location.href = "/my-acc?ID=" + localStorage.getItem("UserID")
|
||||
}
|
||||
</script>
|
||||
115
html/channel.ejs
@@ -24,15 +24,18 @@
|
||||
<% if (ID === "UCFAiFyGs6oDiF1Nf-rRJpZA") { %>
|
||||
<title>Technoblade Never Dies! - PokeTube</title>
|
||||
<% } %>
|
||||
<title><%=j.Channel?.Metadata.Name%> - Poke</title>
|
||||
<title><%=j.Channel?.Metadata.Name%> - PokeTube</title>
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
<link href="css/yt-ukraine.svg" 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%> - Poke" property=og:title>
|
||||
<meta content="<%=j.Channel?.Metadata.Name%> - PokeTube" 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 -->
|
||||
<meta content="<%=j.Channel?.Metadata.Avatars.Thumbnail?.$t%>" property=og:image>
|
||||
<% 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">
|
||||
<style>
|
||||
* {
|
||||
@@ -195,22 +198,6 @@ 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:Montserrat,sans-serif
|
||||
}
|
||||
|
||||
a.class:hover {
|
||||
text-decoration:underline;
|
||||
font-weight:bold
|
||||
@@ -574,7 +561,7 @@ color:#ea9999 !important;
|
||||
<div class="search" style="margin-right: 5em;">
|
||||
|
||||
<form action="/search">
|
||||
<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">
|
||||
<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">
|
||||
|
||||
|
||||
<button class="btn btn-success" type="submit"><i class="fa-light fa-search"></i></button>
|
||||
@@ -645,7 +632,7 @@ 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 %> </p>
|
||||
<p class="ban-reason"> <%- cinv.error %> - literally 1984 lmao</p>
|
||||
|
||||
<% } %>
|
||||
|
||||
@@ -659,20 +646,20 @@ height: 100%;
|
||||
<% if (!isMobile) { %>
|
||||
<div class="channel-info-container" style="text-align: center;">
|
||||
|
||||
<% 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; %>
|
||||
<% 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; %>
|
||||
<% break; %>
|
||||
<% } %>
|
||||
<% } %>
|
||||
<% if (!bannerFound) { %>
|
||||
<img src="/static/shapes-dark.png" style="height: 30em; object-fit: cover; pointer-events: none;" id="default_banner">
|
||||
<% if (!thumbnailFound) { %>
|
||||
<img src="/static/shapes-dark.png" style="height: 30em; object-fit: cover; pointer-events: none;" id="default_thumbnail">
|
||||
<% } %>
|
||||
<% } else { %>
|
||||
<img src="/static/shapes-dark.png" style="height: 30em; object-fit: cover; pointer-events: none;" id="default_banner">
|
||||
<img src="/static/shapes-dark.png" style="height: 30em; object-fit: cover; pointer-events: none;" id="default_thumbnail">
|
||||
<% } %>
|
||||
|
||||
|
||||
@@ -698,7 +685,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 (firstVideo?.authorVerified) { %>
|
||||
<% if (cinv?.authorVerified) { %>
|
||||
<span style="padding: 1px;padding-top: 2.5px !important;display: inline-flex;border-radius: 3px;">
|
||||
|
||||
|
||||
@@ -708,7 +695,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;">
|
||||
|
||||
@@ -893,15 +880,8 @@ 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>
|
||||
@@ -1000,7 +980,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>
|
||||
@@ -1244,16 +1224,13 @@ 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://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="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="info">
|
||||
<span class="title max-lines-2" style="font-family:PokeTube flex,sans-serif;font-weight: 1000;font-stretch: ultra-expanded;"><%- x.title %></span>
|
||||
|
||||
@@ -1267,33 +1244,12 @@ 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> <% } %>
|
||||
|
||||
<% } %>
|
||||
|
||||
@@ -1330,7 +1286,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://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'>
|
||||
<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'>
|
||||
<span class="shorts-title"><%- x.title %></span>
|
||||
</a>
|
||||
<% }) %>
|
||||
@@ -1431,7 +1387,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://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="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="info">
|
||||
<span class="title max-lines-2" style="font-family:PokeTube flex,sans-serif;font-weight: 1000;font-stretch: ultra-expanded;"><%- x.title %></span>
|
||||
|
||||
@@ -1541,7 +1497,7 @@ width: fit-content;
|
||||
<video class="player" style="border-radius: 16px;
|
||||
" controls
|
||||
|
||||
poster="<%- media_proxy_url %>/proxy?url=https://i.ytimg.com/vi/<%=x.attachment.videoId%>/maxresdefault.jpg?v=607ddcd4">
|
||||
poster="<%- media_proxy_url %>/proxy?url=https://vid.puffyan.us/vi/<%=x.attachment.videoId%>/maxresdefault.jpg?v=607ddcd4">
|
||||
|
||||
|
||||
<source src="https://tube.kuylar.dev/proxy/media/<%=x.attachment.videoId%>/22" type="video/mp4; codecs="avc1.64001F, mp4a.40.2"" label="hd720" selected="false">
|
||||
@@ -1612,26 +1568,13 @@ 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: "poketube flex" , 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: "poketube flex" , sans-serif;font-weight: 1000;text-align: left;">Tags</div>
|
||||
<div class="tags-channel" style="padding: 10px;background: #272727;margin-top: 10px;border-radius: 11px;">
|
||||
<br>
|
||||
<% cinv.tags.forEach(x => { %>
|
||||
<div class="tag-channel">
|
||||
<a href="/hashtag/<%=x %>" style="color:var(--text-color)">
|
||||
<%=x %>
|
||||
</a>
|
||||
</div> <% }) %>
|
||||
<% } %>
|
||||
</div>
|
||||
|
||||
<% } %>
|
||||
|
||||
|
||||
<% } %>
|
||||
<% } %>
|
||||
|
||||
@@ -1706,12 +1649,6 @@ document.getElementById('search').addEventListener('keyup', function () {
|
||||
event.preventDefault();
|
||||
togglePopup();
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function (event) {
|
||||
if (event.key === 'Escape' && isPopupOpen) {
|
||||
closePopup();
|
||||
}
|
||||
});
|
||||
// @license-end
|
||||
|
||||
</script>
|
||||
|
||||
@@ -327,9 +327,7 @@ margin-left: auto;
|
||||
background: var(--not-quite-black);
|
||||
text-decoration: none;
|
||||
border-radius: 1em;
|
||||
}
|
||||
|
||||
</style>
|
||||
} </style>
|
||||
|
||||
|
||||
<style>
|
||||
@@ -415,10 +413,12 @@ 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;">
|
||||
Popular Videos On Poke :3 </h1>
|
||||
Discover Popular videos on poketube!
|
||||
</h1>
|
||||
<% if (!tab) { %>
|
||||
|
||||
<div class="tabs tabs-center">
|
||||
@@ -492,9 +492,9 @@ Popular Videos On Poke :3 </h1>
|
||||
|
||||
|
||||
|
||||
<div class="video-grid" style="border-top-left-radius:2em;width: 80em;border-top-right-radius: 2em;border: solid 1px purple;">
|
||||
<div class="video-grid" style="border-radius:12px">
|
||||
<% inv.forEach(x => { %>
|
||||
<a href="/watch?v=<%- x.videoId %>" class="video canloadhd" data-author="<%- x.author %>" >
|
||||
<a href="/watch?v=<%- x.videoId %>" class="video">
|
||||
<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>
|
||||
@@ -506,7 +506,7 @@ Popular Videos On Poke :3 </h1>
|
||||
|
||||
|
||||
<% }) %>
|
||||
<p>u reached the end.... :sob: </p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<script src="/static/data-mobile.js"></script>
|
||||
<script src="/static/data-mobile.js"></script
|
||||
</body>
|
||||
</html>
|
||||
<% } %>
|
||||
|
||||
196
html/landing.ejs
@@ -2,7 +2,7 @@
|
||||
|
||||
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)
|
||||
Copyright (C) 2021-2024 POKETUBE (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
|
||||
@@ -10,6 +10,7 @@
|
||||
(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.
|
||||
@@ -17,36 +18,26 @@
|
||||
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 privacy app of your dreams!</title>
|
||||
<title>Poke | The Ultimate Privacy App!</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=2544">
|
||||
<link rel="stylesheet" href="/css/landing.css?v=244">
|
||||
<link rel="stylesheet" href="/css/snow.css">
|
||||
<link rel="stylesheet" href="/css/app.main.css">
|
||||
<link href=/css/yt-ukraine.svg?v=6 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 privacy app of your dreams!" property=og:title>
|
||||
<% if(embedtype === "woke") { %>
|
||||
<meta content="Poke is a 𝔀𝓸𝓴𝓮 software YouTube front-end, search engine, translator, 𝔀𝓸𝓴𝓮 app, and even 𝔀𝓸𝓴𝓮!! Watch 𝔀𝓸𝓴𝓮 videos, search the internet, and do all of that and more 𝔀𝓸𝓴𝓮 in this all-in-one 𝔀𝓸𝓴𝓮 app!!!"
|
||||
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, search engine, translator, map app, and more!! Watch silly videos, search the internet, and do all of that and more anonymously in this all-in-one privacy app!!!"
|
||||
property="twitter:description">
|
||||
<meta content="https://cdn.glitch.global/302c6ee0-629f-453b-9024-bad1f8d7be36/poke.png?v=1716216428745"
|
||||
property="og:image">
|
||||
<% } %>
|
||||
|
||||
|
||||
<meta content="▶▶ 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="summary_large_image" name="twitter:card" />
|
||||
<% if(isOldWindows) { %>
|
||||
<style>
|
||||
@@ -67,26 +58,6 @@
|
||||
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;
|
||||
@@ -113,105 +84,60 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<%- include('./partials/header.ejs') %>
|
||||
<video playsinline autoplay muted loop><source src="/bg-480.webm" type="video/webm"/></video>
|
||||
<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 class="landing">
|
||||
<h1>PRIVACY APP OF YOUR DREAMS</h1>
|
||||
<p style="max-width: 800px;">Poke is a free software youtube front-end, search engine, translator, map app and even more!!1!! Watch silly videos, search stuff on the internet and do all of that and more anonymously in this all-in-one privacy app!!!1! :3</p><br>
|
||||
<a style="color: white; text-decoration: underline;" href="https://buildpalestine.com/2021/05/15/trusted-organizations-to-donate-to-palestine">Help & Support Palestine</a> <a style="color: white; text-decoration: underline;" href="https://gazaesims.com">(or donate esims to gaza!)</a> - <a style="color: white; text-decoration: underline;" href="https://war.ukraine.ua/donate"> Donate to Ukraine </a>
|
||||
<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" />
|
||||
<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>
|
||||
</div>
|
||||
|
||||
<!-- Icons are from Iconoir -->
|
||||
<h1 style="margin-left: auto;margin-right: auto;text-align: center;margin-bottom: -1em;margin-top: 1em;"> Why Choose Poke Lol? </h1>
|
||||
<div class="new-feature-set">
|
||||
<div class="feature-set">
|
||||
<div class="feature-set-title">
|
||||
<?xml version="1.0" encoding="UTF-8"?><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" style="--darkreader-inline-color: #e8e6e3;" data-darkreader-inline-color=""><path d="M19.5 16L17.0248 12.6038" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><path d="M12 17.5V14" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><path d="M4.5 16L6.96895 12.6124" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><path d="M3 8C6.6 16 17.4 16 21 8" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path></svg>
|
||||
<h2>No Tracking and Ads</h2>
|
||||
</div>
|
||||
<p> Poke Has no Trackers or ads - we dont and we wont see the vids ur watching :3</p>
|
||||
</div>
|
||||
<div class="feature-set">
|
||||
<div class="feature-set-title">
|
||||
<?xml version="1.0" encoding="UTF-8"?><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" style="--darkreader-inline-color: #e8e6e3;" data-darkreader-inline-color=""><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" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><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" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><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" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><path d="M8.89152 15.7103L7.65095 16.5374H4.34277" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path></svg>
|
||||
<h2>Very Fast</h2>
|
||||
</div>
|
||||
<p> Poke is really ligthweight (both on server and client :3) so you can still use it on poor connections :3</p>
|
||||
</div>
|
||||
<div class="feature-set">
|
||||
<div class="feature-set-title">
|
||||
<?xml version="1.0" encoding="UTF-8"?><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" style="--darkreader-inline-color: #e8e6e3;" data-darkreader-inline-color=""><path d="M12 8V16M12 16L15.5 12.5M12 16L8.5 12.5" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><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" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path></svg>
|
||||
<h2>Downloader</h2>
|
||||
</div>
|
||||
<p>You wouldnt download a car - welp i would :D u can download videos from poke for 0$!</p>
|
||||
</div>
|
||||
<div class="feature-set">
|
||||
<div class="feature-set-title">
|
||||
<?xml version="1.0" encoding="UTF-8"?><svg style="background: #ea6ddc;" 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="M21 12V10C21 7.23858 18.7614 5 16 5H8C5.23858 5 3 7.23858 3 10V10C3 12.7614 5.23858 15 8 15H12" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><path d="M20.1241 19.1185C20.6654 18.5758 21 17.827 21 17C21 15.3431 19.6569 14 18 14C16.3431 14 15 15.3431 15 17C15 18.6569 16.3431 20 18 20C18.8299 20 19.581 19.663 20.1241 19.1185ZM20.1241 19.1185L22 21" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path></svg>
|
||||
<h2>Web Search</h2>
|
||||
</div>
|
||||
<p>u can search the interwebs for anything that u wan!! (ik wha ur gonna search :p) </p>
|
||||
</div>
|
||||
<div class="feature-set">
|
||||
<div class="feature-set-title">
|
||||
<?xml version="1.0" encoding="UTF-8"?><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" style="--darkreader-inline-color: #e8e6e3;" data-darkreader-inline-color=""><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" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><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" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><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" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><path d="M12 16.391V18.5" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><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" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><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" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path><path d="M3 3L21 21" stroke="#ffffff" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="--darkreader-inline-stroke: #ffffff;" data-darkreader-inline-stroke=""></path></svg>
|
||||
<h2>DRM Free</h2>
|
||||
</div>
|
||||
<p> Poke comes without digital restrictions management - poke is free software :3</p>
|
||||
</div>
|
||||
<div class="feature-set">
|
||||
<div class="feature-set-title">
|
||||
<?xml version="1.0" encoding="UTF-8"?><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><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>
|
||||
<h2>Games Included</h2>
|
||||
</div>
|
||||
<p> U can play funnie games on poke! </p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="adaptive-grid">
|
||||
<%- include('./partials/card',
|
||||
icon_background='transparent',
|
||||
icon="none",
|
||||
title='Join Us',
|
||||
description='join our community if you want to! :3',
|
||||
actions='true',
|
||||
|
||||
has_secondary_action='true',
|
||||
secondary_icon='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M524.5 69.8a1.5 1.5 0 0 0 -.8-.7A485.1 485.1 0 0 0 404.1 32a1.8 1.8 0 0 0 -1.9 .9 337.5 337.5 0 0 0 -14.9 30.6 447.8 447.8 0 0 0 -134.4 0 309.5 309.5 0 0 0 -15.1-30.6 1.9 1.9 0 0 0 -1.9-.9A483.7 483.7 0 0 0 116.1 69.1a1.7 1.7 0 0 0 -.8 .7C39.1 183.7 18.2 294.7 28.4 404.4a2 2 0 0 0 .8 1.4A487.7 487.7 0 0 0 176 479.9a1.9 1.9 0 0 0 2.1-.7A348.2 348.2 0 0 0 208.1 430.4a1.9 1.9 0 0 0 -1-2.6 321.2 321.2 0 0 1 -45.9-21.9 1.9 1.9 0 0 1 -.2-3.1c3.1-2.3 6.2-4.7 9.1-7.1a1.8 1.8 0 0 1 1.9-.3c96.2 43.9 200.4 43.9 295.5 0a1.8 1.8 0 0 1 1.9 .2c2.9 2.4 6 4.9 9.1 7.2a1.9 1.9 0 0 1 -.2 3.1 301.4 301.4 0 0 1 -45.9 21.8 1.9 1.9 0 0 0 -1 2.6 391.1 391.1 0 0 0 30 48.8 1.9 1.9 0 0 0 2.1 .7A486 486 0 0 0 610.7 405.7a1.9 1.9 0 0 0 .8-1.4C623.7 277.6 590.9 167.5 524.5 69.8zM222.5 337.6c-29 0-52.8-26.6-52.8-59.2S193.1 219.1 222.5 219.1c29.7 0 53.3 26.8 52.8 59.2C275.3 311 251.9 337.6 222.5 337.6zm195.4 0c-29 0-52.8-26.6-52.8-59.2S388.4 219.1 417.9 219.1c29.7 0 53.3 26.8 52.8 59.2C470.7 311 447.5 337.6 417.9 337.6z"/></svg>',
|
||||
secondary_text='Discord',
|
||||
secondary_link='https://discord.poketube.fun',
|
||||
|
||||
primary_icon='<svg version="1.1" viewBox="0 0 27.9 32" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><g transform="translate(-.095 .005)" fill="#040404"><path d="m27.1 31.2v-30.5h-2.19v-0.732h3.04v32h-3.04v-0.732z"/><path d="m8.23 10.4v1.54h0.044c0.385-0.564 0.893-1.03 1.49-1.37 0.58-0.323 1.25-0.485 1.99-0.485 0.72 0 1.38 0.14 1.97 0.42 0.595 0.279 1.05 0.771 1.36 1.48 0.338-0.5 0.796-0.941 1.38-1.32 0.58-0.383 1.27-0.574 2.06-0.574 0.602 0 1.16 0.074 1.67 0.22 0.514 0.148 0.954 0.383 .32 0.707 0.366 0.323 0.653 0.746 0.859 1.27 0.205 0.522 0.308 1.15 0.308 1.89v7.63h-3.13v-6.46c0-0.383-0.015-0.743-0.044-1.08-0.0209-0.307-0.103-0.607-0.242-0.882-0.133-0.251-0.336-0.458-0.584-0.596-0.257-0.146-0.606-0.22-1.05-0.22-0.44 0-0.796 0.085-1.07 0.253-0.272 0.17-0.485 0.39-0.639 0.662-0.159 0.287-0.264 0.602-0.308 0.927-0.052 0.347-0.078 0.697-0.078 1.05v6.35h-3.13v-6.4c0-0.338-7e-3 -0.673-0.021-1-0.0114-0.314-0.0749-0.623-0.188-0.916-0.108-0.277-0.3-0.512-0.55-0.673-0.258-0.168-0.636-0.253-1.14-0.253-0.198 0.0083-0.394 0.042-0.584 0.1-0.258 0.0745-0.498 0.202-0.705 0.374-0.228 0.184-0.422 0.449-0.584 0.794-0.161 0.346-0.242 0.798-0.242 1.36v6.62h-3.13v-11.4z"/><path d="m0.936 0.732v30.5h2.19v0.732h-3.04v-32h3.03v0.732z"/></g></svg>',
|
||||
primary_text='Matrix',
|
||||
primary_link='https://matrix.to/#/%23poke:vern.cc'
|
||||
)%>
|
||||
|
||||
<%- include('./partials/card',
|
||||
icon_background='transparent',
|
||||
icon="none",
|
||||
title='Free and libre',
|
||||
description='Poke is free and libre software! u can view, edit and redistribute under GNU GPL 3 or later :3',
|
||||
actions='true',
|
||||
|
||||
has_secondary_action='true',
|
||||
secondary_icon='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3 .3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5 .3-6.2 2.3zm44.2-1.7c-2.9 .7-4.9 2.6-4.6 4.9 .3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3 .7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3 .3 2.9 2.3 3.9 1.6 1 3.6 .7 4.3-.7 .7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3 .7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3 .7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>',
|
||||
secondary_text='GitHub',
|
||||
secondary_link='https://github.com/ashley0143/poke',
|
||||
|
||||
primary_icon='<svg xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="svg1468" version="1.1" viewBox="0 0 4.233 4.233"><title id="title16">Codeberg logo</title><defs id="defs1462"><linearGradient id="linearGradient6918" x1="42519.285" x2="42575.336" y1="-7078.789" y2="-6966.931" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient6924"></linearGradient><linearGradient id="linearGradient6924"><stop style="stop-color:#2185d0;stop-opacity:0" id="stop6920" offset="0"></stop><stop id="stop6926" offset=".495" style="stop-color:#000000;stop-opacity:.48923996"></stop><stop style="stop-color:#000000;stop-opacity:.63279623" id="stop6922" offset="1"></stop></linearGradient><linearGradient id="linearGradient6918-3" x1="42519.285" x2="42575.336" y1="-7078.789" y2="-6966.931" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient6924-6"></linearGradient><linearGradient id="linearGradient6924-6"><stop style="stop-color:#000000;stop-opacity:0" id="stop6920-7" offset="0"></stop><stop id="stop6926-5" offset=".495" style="stop-color:#000000;stop-opacity:.30000001"></stop><stop style="stop-color:#000000;stop-opacity:.30000001" id="stop6922-3" offset="1"></stop></linearGradient></defs><metadata id="metadata1465"></metadata><g id="g370484" transform="matrix(0.06551432,0,0,0.06551432,-2.232417,-1.431776)"><path id="path6733-5" style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:url(#linearGradient6918-3);fill-opacity:1;stroke:none;stroke-width:3.67846;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;stop-color:#000;stop-opacity:1" d="m 42519.285,-7078.7891 a 0.76086879,0.56791688 0 0 0 -0.738,0.6739 l 33.586,125.8886 a 87.182358,87.182358 0 0 0 39.381,-33.7636 l -71.565,-92.5196 a 0.76086879,0.56791688 0 0 0 -0.664,-0.2793 z" transform="matrix(0.37058478,0,0,0.37058478,-15690.065,2662.0533)"></path><path id="path360787" style="opacity:1;fill:#000000;fill-opacity:1;stroke-width:17.0055;paint-order:markers fill stroke;stop-color:#000" d="m 11249.461,-1883.6961 c -12.74,0 -23.067,10.3275 -23.067,23.0671 0,4.3335 1.22,8.5795 3.522,12.2514 l 19.232,-24.8636 c 0.138,-0.1796 0.486,-0.1796 0.624,0 l 19.233,24.8646 c 2.302,-3.6721 3.523,-7.9185 3.523,-12.2524 0,-12.7396 -10.327,-23.0671 -23.067,-23.0671 z" transform="matrix(1.4006354,0,0,1.4006354,-15690.065,2662.0533)"></path></g></svg>',
|
||||
primary_text='Codeberg',
|
||||
primary_link='https://codeberg.org/ashley/poke'
|
||||
)%>
|
||||
</div>
|
||||
|
||||
<h1 style="font-size: xx-large;text-align: center;">So, wha ru waiting 4? </h1>
|
||||
<div class="discover-video-button">
|
||||
<a href="/app">Start Discovering! :3</a>
|
||||
</div>
|
||||
<!-- 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>
|
||||
|
||||
<script>
|
||||
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later
|
||||
|
||||
36
html/map.ejs
@@ -44,6 +44,40 @@
|
||||
|
||||
//--><!]]>
|
||||
</script>
|
||||
<script src="/static/maps.js"></script><script src="/static/data-mobile.js"></script>
|
||||
<script>
|
||||
var bbox = "?bbox=-165.76171875000003%2C-3.864254615721396%2C30.410156250000004%2C72.44879155730672&layer=mapnik"
|
||||
var iframe = document.getElementById('myFrame');
|
||||
iframe.src=`https://www.openstreetmap.org/export/embed.html${bbox}`
|
||||
iframe.addEventListener('load', function() {
|
||||
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
|
||||
var links = iframeDocument.getElementsByTagName('a');
|
||||
for (var i = 0; i < links.length; i++) {
|
||||
links[i].addEventListener('click', function(event) {
|
||||
var url = event.target.href;
|
||||
if (url.includes('www.openstreetmap.org')) {
|
||||
event.preventDefault();
|
||||
iframe.src = url;
|
||||
window.history.pushState(null, '', url);
|
||||
} else {
|
||||
window.location.href = url;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
window.onpopstate = function(event) {
|
||||
iframe.src = window.location.href;
|
||||
};
|
||||
|
||||
iframe.addEventListener('load', function() {
|
||||
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
|
||||
var elements = iframeDocument.querySelectorAll('[style*="//dka575ofm4ao0.cloudfront.net"]');
|
||||
for (var i = 0; i < elements.length; i++) {
|
||||
var style = elements[i].style.backgroundImage;
|
||||
var newStyle = style.replace('//dka575ofm4ao0.cloudfront.net', 'https://p.poketube.fun/https://dka575ofm4ao0.cloudfront.net');
|
||||
elements[i].style.backgroundImage = newStyle;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<div class="card-icon" style="background: <%= icon_background %>;">
|
||||
<% if(icon="none"){ %><% } else{ %> <%- icon %><% } %>
|
||||
</div>
|
||||
<h2><%= title %></h2>
|
||||
</div>
|
||||
<p><%= description %></p>
|
||||
<% if (actions=="true") { %>
|
||||
<div class="card-actions">
|
||||
<% if (has_secondary_action=="true") { %>
|
||||
<a class="card-secondary" href="<%= secondary_link %>"><%- secondary_icon %> <%= secondary_text %></a>
|
||||
<% } %>
|
||||
<a class="card-primary" href="<%= primary_link %>"><%- primary_icon %> <%= primary_text %></a>
|
||||
</div>
|
||||
<% }%>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.card {
|
||||
padding: 24px;
|
||||
}
|
||||
.card-title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.card-title h2 {
|
||||
font-family: "PokeTube flex";
|
||||
font-stretch: ultra-expanded;
|
||||
font-weight: 1000;
|
||||
margin: 0px;
|
||||
}
|
||||
.card-title svg {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
margin-right: 12px;
|
||||
}
|
||||
.card-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: right;
|
||||
gap: 12px;
|
||||
}
|
||||
.card-actions a {
|
||||
color: white;
|
||||
border: 2px white solid;
|
||||
border-radius: 3rem;
|
||||
padding: 12px 24px 12px 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.card-actions a:hover {
|
||||
filter: brightness(0.8);
|
||||
text-decoration: nones;
|
||||
}
|
||||
.card-actions svg {
|
||||
width: 24px !important;
|
||||
height: 24px !important;
|
||||
margin-right: 6px;
|
||||
}
|
||||
.card-actions .card-primary {
|
||||
background: white;
|
||||
color: black;
|
||||
}
|
||||
.card-actions .card-primary svg {
|
||||
fill: black;
|
||||
}
|
||||
.card-actions .card-secondary svg {
|
||||
fill: white;
|
||||
}
|
||||
</style>
|
||||
@@ -1,123 +0,0 @@
|
||||
<!--
|
||||
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>
|
||||
@@ -1,88 +0,0 @@
|
||||
<form action="/search">
|
||||
<input autocomplete="off" 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.
|
||||
*/
|
||||
|
||||
// Dismiss when the end-user clicks else where
|
||||
document.body.addEventListener("click", function (evt) {
|
||||
document.querySelector('.suggestions').style.opacity = '0'
|
||||
});
|
||||
|
||||
// When the end-user starts typing, trigget the fetch function
|
||||
document.querySelector('input[type="search"]').addEventListener('input', function(e) {
|
||||
if (e.target.value !== '') {
|
||||
document.querySelector('.suggestions').style.opacity = '1'
|
||||
GetResults()
|
||||
}
|
||||
else {null}
|
||||
});
|
||||
|
||||
// Fetch
|
||||
function GetResults() {
|
||||
var SearchValue = document.querySelector('input[type="search"]').value
|
||||
var YouTubeSuggestions = document.querySelector('.suggestions')
|
||||
fetch(window.location.origin + `/api/improving-poke/getsugesstions?q=${SearchValue}`)
|
||||
.then(response => response.json())
|
||||
.then(data => {YouTubeSuggestions.innerHTML = ListOfSuggestionsYT(data)})
|
||||
}
|
||||
|
||||
// Create List
|
||||
function ListOfSuggestionsYT(data) {
|
||||
const text = data.suggestions.map(data => `<a href="/search?query=${data}">${data}</a>`).join("\n")
|
||||
return `${text}`
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
.suggestions {
|
||||
position: absolute;
|
||||
display: grid;
|
||||
background: #473e46d6;
|
||||
border-radius: 6px;
|
||||
margin-top: 10px;
|
||||
width: 329px;
|
||||
z-index: 5;
|
||||
backdrop-filter: blur(10px);
|
||||
gap: 4px;
|
||||
padding: 4px 0px;
|
||||
}
|
||||
.suggestions a {
|
||||
color: white;
|
||||
background: transparent;
|
||||
padding: 6px 12px;
|
||||
border-radius: 4px;
|
||||
margin: 0px 4px;
|
||||
}
|
||||
.suggestions a:hover {
|
||||
background: #f9f9f917;
|
||||
text-decoration: none;
|
||||
}
|
||||
</style>
|
||||
@@ -246,8 +246,7 @@ font-family:Ubuntu
|
||||
<%- x.title %>
|
||||
</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>
|
||||
<a href="/channel?id=<%- x.authorId %>" style="border-radius:0em"><%- x.author %></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<!--
|
||||
This Source Code Form is subject to the terms of the GNU General Public License:
|
||||
|
||||
Copyright (C) 2021-2024 poke (https://codeberg.org/Ashley/poketube)
|
||||
Copyright (C) 2021-2023 POKETUBE (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>Poke | Legal mumbo jumbo</title>
|
||||
<title>PokeTube | Legal mumbo jumbo</title>
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
|
||||
<link href="/css/app-cdn.min.css" rel="stylesheet">
|
||||
@@ -250,20 +250,19 @@ 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: -22.5em;
|
||||
margin-top: -27.5em;
|
||||
width: 100px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.i-cant-find-a-class-name-help-me {
|
||||
margin-top: -53.3em;
|
||||
margin-top: -69em;
|
||||
max-width: 39em;
|
||||
color: white;
|
||||
background: #333;
|
||||
@@ -409,7 +408,7 @@ z-index: 10; /* Was 2 */"
|
||||
|
||||
<div class="content-inner" style="color:#fff;">
|
||||
<br>
|
||||
<h1 class="heading">Poke Privacy Policy</h1>
|
||||
<h1 class="heading">PokeTube 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>
|
||||
@@ -419,7 +418,7 @@ z-index: 10; /* Was 2 */"
|
||||
</div>
|
||||
|
||||
<div class="description i-cant-find-a-class-name-help-me">
|
||||
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>
|
||||
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>
|
||||
|
||||
<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
|
||||
@@ -433,9 +432,10 @@ 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 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>
|
||||
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>
|
||||
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,36 +443,52 @@ 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 Information that can indentify you
|
||||
We dont collect your personal information
|
||||
</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>
|
||||
|
||||
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" />
|
||||
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>
|
||||
|
||||
<h3 class="hd-md">
|
||||
We dont see the videos you watch
|
||||
</h3>
|
||||
<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>
|
||||
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>
|
||||
|
||||
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" />
|
||||
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>
|
||||
|
||||
<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 don’t track you through cookies
|
||||
</h3><br>
|
||||
|
||||
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.
|
||||
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.
|
||||
<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">
|
||||
|
||||
@@ -17,9 +17,7 @@
|
||||
NodeList.prototype.forEach = Array.prototype.forEach;
|
||||
</script>
|
||||
<style>
|
||||
* {
|
||||
font-family: "poketube flex" !important
|
||||
}
|
||||
|
||||
@keyframes gradient {
|
||||
0% {
|
||||
background-position: 0 50%;
|
||||
@@ -38,27 +36,18 @@
|
||||
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: #0007;
|
||||
border-radius: 5px;
|
||||
width: calc(100% - 33px);
|
||||
margin-left: 6px;
|
||||
}
|
||||
</style>
|
||||
background-color: #0f0f0f;
|
||||
}</style>
|
||||
<script>
|
||||
<!--//--><![CDATA[//><!--
|
||||
/**
|
||||
@@ -230,16 +219,18 @@
|
||||
<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: 9em;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: 13em;text-align: center;cursor: pointer;user-select: none;">
|
||||
<p style="margin-top: auto;margin-bottom: auto;font-weight: 1000;margin-left: 6px;font-stretch: ultra-expanded;font-family:"poketube flex";Poketube flex;">Search Poke</p>
|
||||
</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>
|
||||
|
||||
<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:"poketube flex";Poketube flex;">Im feeling lucky</p>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="downnav">
|
||||
<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>
|
||||
<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>
|
||||
<div style="float: right;">
|
||||
<a style="color:#fff" id="osInfo"></a> <a style="color:#fff;margin-right: 1em;" href="/license">License</a>
|
||||
</div>
|
||||
@@ -266,27 +257,6 @@ 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");
|
||||
|
||||
@@ -350,7 +320,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><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><script src="/static/emojis.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" -->
|
||||
|
||||
@@ -451,22 +451,22 @@ Web
|
||||
</div>
|
||||
|
||||
|
||||
<p style="margin-top: -21px;margin-left: 62em;font-family: "Poketube flex";color: #ffacbb;display: flex;flex-direction: row;gap: 5px;">Powered by <a href="https://ark.sudovanilla.org/Korbs/NarviSearch">NarviSearch ! :3</a> </p>
|
||||
|
||||
</div>
|
||||
<div class="video-list" >
|
||||
|
||||
<% results.forEach(x => { %>
|
||||
<div class="video" style="height: 8em;">
|
||||
<div class="video" style="height: 6em;">
|
||||
|
||||
<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>
|
||||
<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>
|
||||
<% if (!isMobile) { %>
|
||||
|
||||
<span style="color:white;width: 48em;display: flex;"><%= x.description %></span>
|
||||
<span style="color:white;width: 48em;display: flex;"><%= x.snippet %></span>
|
||||
<% } %>
|
||||
<% if (isMobile) { %>
|
||||
|
||||
<span style="color:white;max-width: 15em;display: flex;"><%= x.description %></span>
|
||||
<span style="color:white;max-width: 15em;display: flex;"><%= x.snippet %></span>
|
||||
<% } %>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
159
html/search.ejs
@@ -24,7 +24,7 @@
|
||||
<link href=/css/yt-ukraine.svg?v=6 rel=icon>
|
||||
<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=547 rel=stylesheet>
|
||||
<link href=/css/search.main.css?v=57 rel=stylesheet>
|
||||
<link href=/css/watch.main.css rel=stylesheet>
|
||||
<meta name="darkreader-lock"> <!-- tells dark reader that the site has a dark theme and to turn itself off -->
|
||||
<meta content="Searching <%=q%> - Poke" property=og:title>
|
||||
@@ -62,32 +62,34 @@ summary:hover{
|
||||
</style>
|
||||
|
||||
<link href=https://p.poketube.fun/https://site-assets.fontawesome.com/releases/v6.1.1/css/all.css rel=stylesheet>
|
||||
<link href="https://p.poketube.fun/https://cdn.jsdelivr.net/npm/ionicons@4.5.0-0/dist/css/ionicons.min.css" rel=stylesheet>
|
||||
|
||||
<style>
|
||||
|
||||
|
||||
.search-options {
|
||||
.tags.rec {
|
||||
font-weight: 600;
|
||||
font-stretch: expanded;
|
||||
overflow:hidden;
|
||||
width: auto;
|
||||
max-width: fit-content;
|
||||
margin-right: auto;
|
||||
padding-left: 1.5em;
|
||||
margin-top: 7px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
max-width: 855px;
|
||||
margin: auto;
|
||||
padding: 24px 0px 12px 0px;
|
||||
}
|
||||
gap: 3px;
|
||||
margin-inline: auto;
|
||||
margin-left: 8em;
|
||||
}
|
||||
|
||||
|
||||
.tags.rec:hover{
|
||||
overflow-x:auto;
|
||||
}
|
||||
.tags.rec {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
height: max-content;
|
||||
}
|
||||
|
||||
.tags.rec > .tag {
|
||||
border-radius: 8px;
|
||||
background: var(--chip-background-hover);
|
||||
padding: 8px 16px;
|
||||
background:var(--chip-background-hover);
|
||||
|
||||
}
|
||||
|
||||
.tag {
|
||||
@@ -98,19 +100,6 @@ summary:hover{
|
||||
font-family: ubuntu, sans-serif;
|
||||
}
|
||||
|
||||
#filters-collapse summary {
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 20px;
|
||||
}
|
||||
.filter-options div {
|
||||
padding: 6px 12px;
|
||||
}
|
||||
.filter-name.underlined {
|
||||
padding: 12px 0px 12px 23px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
@@ -504,125 +493,59 @@ video[counter].classList.add("shake");
|
||||
Videos
|
||||
</a>
|
||||
|
||||
<a href="/web?query=<%=q%>" style="color:#fff;text-decoration:none;display:none;
|
||||
<a href="/web?query=<%=q%>" style="color:#fff;text-decoration:none;
|
||||
" class="tag c">
|
||||
Web </a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%
|
||||
const searchStrings = [
|
||||
"suicide", "self harm", "self-harm", "support", "murder", "how to murder", "kill myself",
|
||||
"end my life", "depressed", "depression", "lonely",
|
||||
"hurt myself", "selfharm", "selfharm", "dying", "want to die",
|
||||
"kill", "die", "family problems", "family issues", "abuse",
|
||||
"domestic violence", "abusive parents", "family conflict",
|
||||
"estranged", "disowned", "run away", "runaway"
|
||||
];
|
||||
if (searchStrings.some(str => q.toLowerCase().includes(str))) {
|
||||
%>
|
||||
<% if (q.includes("suicide")) { %>
|
||||
|
||||
<div class="container">
|
||||
<span style="font-size: 7em; color: pink;margin-bottom: 3em;">❤️</span><br>
|
||||
<h2 style="font-family: 'PokeTube Flex';font-size: large;text-align: left;font-stretch: ultra-expanded;
|
||||
font-weight: 1000;">You are not alone</h2>
|
||||
<p>
|
||||
If you're having a tough time or know someone who is, reaching out and talking to someone can really help.
|
||||
if you or somebody you know is having a bad time, talk to somebody today.
|
||||
</p>
|
||||
<p>
|
||||
In the US? Call <strong>988</strong> for support. Not in the US? <a href="https://www.psychologytoday.com/us/basics/suicide/suicide-prevention-hotlines-resources-worldwide">Check out this link</a> for worldwide help.
|
||||
if you are from the US, call 988. if you arent <a href="https://www.psychologytoday.com/us/basics/suicide/suicide-prevention-hotlines-resources-worldwide"> see this url.</a>
|
||||
<br> <br> dont worry, ur not alone <3 and you are really important btw!
|
||||
</p>
|
||||
<p>
|
||||
LGBTQ+ and need someone to talk to? Try the <a href="https://www.thetrevorproject.org/">Trevor Project</a> at <strong>1-866-488-7386</strong> or text <strong>START</strong> to <strong>678-678</strong>. For more options, <a href="https://www.imalive.org/">IMAlive</a> is also available.
|
||||
</p>
|
||||
<p>
|
||||
Remember, ur not alone. u matter, and there's always someone who cares. and you are really important btw! <span style="font-family: 'PokeTube Flex';">❤️</span>
|
||||
</p>
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
|
||||
|
||||
<% if (q.includes("whats your eta")) { %>
|
||||
<a href="/watch?v=mREOvIgImmo" style="text-align: center;margin-left: auto;margin-right: auto;font-family: 'PokeTube Flex';font-stretch: ultra-expanded;font-weight: 1000;color: #fff;"><h1 style="font-family: 'PokeTube Flex';font-stretch: ultra-expanded;
|
||||
font-weight: 1000;">2 MINUTES!</h1></a>
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
|
||||
|
||||
<% if (!tab) { %>
|
||||
<style>
|
||||
.thumbnail {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.thumbnail .hover-text {
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
color: white;
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
padding: 5px 10px;
|
||||
border-radius: 5px;
|
||||
z-index: 2;
|
||||
}
|
||||
<% invresults.forEach (x => { %>
|
||||
<div class="video-list" >
|
||||
|
||||
.thumbnail:hover .hover-text {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.thumbnail .video-length {
|
||||
position: absolute;
|
||||
bottom: 10px;
|
||||
right: 10px;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.thumbnail:hover .video-length {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
<% invresults.forEach (x => { %>
|
||||
<div class="video-list">
|
||||
<div class="video">
|
||||
<a href="/watch?v=<%= x.videoId %>"
|
||||
<a
|
||||
href="/watch?v=<%= x.videoId %>"
|
||||
class="thumbnail"
|
||||
style="background-image: url('<%- media_proxy_url %>/proxy?url=https://i.ytimg.com/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBmAOZV7CM3NdDKlEFxGX7PpI5UWQ');border-radius: 10px;">
|
||||
<span class="hover-text">Watch :3</span>
|
||||
<span class="video-length"><%= turntomins(x.lengthSeconds) %></span>
|
||||
</a>
|
||||
<div class="info" style="color:#fff;text-align: left;font-weight: 1000;">
|
||||
style="background-image: url('<%- media_proxy_url %>/proxy?url=https://yt.miruku.cafe/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBmAOZV7CM3NdDKlEFxGX7PpI5UWQ');border-radius: 10px;"
|
||||
><span class="video-length"><%=turntomins(x.lengthSeconds) %></span></a>
|
||||
<div class="info" style="color:#fff;text-align: left;font-weight: 1000;">
|
||||
<a style="font-family: 'PokeTube Flex';font-size: large;text-align: left;font-stretch: extra-expanded;
|
||||
font-weight: 1000;" href="/watch?v=<%= x.videoId %>" class="title max-lines-2"><%= x.title %></a>
|
||||
font-weight: 1000;
|
||||
" href="/watch?v=<%= x.videoId %>" class="title max-lines-2"
|
||||
><%= x.title %></a>
|
||||
<div style="display: flex; flex-direction: column; row-gap: 8px;font-weight:bold">
|
||||
<a href="/watch?v=<%= x.videoId %>"><span><%= x.viewCountText %></span> <span>•</span> <span><%= x.publishedText %></span></a>
|
||||
<a href="/channel?id=<%= x.authorId %>"><%= x.author %><% if (x?.authorVerified) { %>
|
||||
<i class="icon ion ion-md-checkmark-circle" title="verified channel"></i><% } %></a>
|
||||
<div style="display: inline-flex;flex-direction: row;min-width: 6em;gap: 4px;">
|
||||
<a href="/download?v=<%= x.videoId %>" style="background: #333;width: 7.6em;border-radius: 18px;">
|
||||
<div style="display: flex;">
|
||||
<i class="fa-light fa-download" style="display: flex;font-size: 16px;padding: 5px;border-radius: 18px;margin-left: 2px;"></i><span style="margin-top: 6px;">Download</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="https://youtube.com/watch?v=<%= x.videoId %>" style="background: #333;width: 7.6em;border-radius: 18px;height: 2em;width: 12.5em;">
|
||||
<div style="display: flex;">
|
||||
<i class="fa-brands fa-youtube" style="display: flex;font-size: 16px;padding: 5px;border-radius: 18px;margin-left: 2px;"></i><span style="margin-top: 6px;">Open on YouTube :/</span>
|
||||
</div>
|
||||
</a>
|
||||
<a href="/channel?id=<%= x.authorId %>"><%=x.author %></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<% }) %>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<% }) %>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"Open Source":{
|
||||
"infocard":"<i>Open Source</i> is a wrong terminology",
|
||||
"more_info":"https://gnu.org/not-open-source"
|
||||
}
|
||||
}
|
||||
@@ -8,24 +8,38 @@
|
||||
"proxy": true,
|
||||
"official": true,
|
||||
"DEFAULT": true,
|
||||
"region": "🇩🇪",
|
||||
"region": "🇺🇸",
|
||||
"software": {
|
||||
"name": "poke",
|
||||
"name": "poketube",
|
||||
"version": "lastest",
|
||||
"branch": "dev"
|
||||
}
|
||||
}
|
||||
],
|
||||
[
|
||||
"pt.sudovanilla.org",
|
||||
"poketube.sudovanilla.com",
|
||||
{
|
||||
"uri": "https://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",
|
||||
"CLOUDFLARE": false,
|
||||
"piwik": false,
|
||||
"region": "🇺🇸",
|
||||
"software": {
|
||||
"name": "poke",
|
||||
"version": "lastest",
|
||||
"name": "poketube",
|
||||
"version": "latest",
|
||||
"branch": "dev"
|
||||
}
|
||||
}
|
||||
@@ -38,7 +52,7 @@
|
||||
"piwik": false,
|
||||
"region": "🇺🇸",
|
||||
"software": {
|
||||
"name": "poke",
|
||||
"name": "poketube",
|
||||
"version": "latest",
|
||||
"branch": "dev"
|
||||
}
|
||||
@@ -52,7 +66,7 @@
|
||||
"piwik": false,
|
||||
"region": "🇬🇧",
|
||||
"software": {
|
||||
"name": "poke",
|
||||
"name": "poketube",
|
||||
"version": "latest",
|
||||
"branch": "dev"
|
||||
}
|
||||
@@ -67,7 +81,7 @@
|
||||
"proxy": false,
|
||||
"region": "🇺🇸",
|
||||
"software": {
|
||||
"name": "poke",
|
||||
"name": "poketube",
|
||||
"version": "latest",
|
||||
"branch": "dev"
|
||||
}
|
||||
@@ -89,43 +103,29 @@
|
||||
}
|
||||
],
|
||||
[
|
||||
"poke.uk1.littkai.co.uk",
|
||||
"poke.am1.shiggy.cloud",
|
||||
{
|
||||
"uri": "https://poke.uk1.littkai.co.uk",
|
||||
"uri": "https://poke.am1.shiggy.cloud",
|
||||
"CLOUDFLARE": false,
|
||||
"piwik": false,
|
||||
"proxy": false,
|
||||
"region": "🇬🇧",
|
||||
"region": "🇳🇱",
|
||||
"software": {
|
||||
"name": "poke",
|
||||
"name": "poketube",
|
||||
"version": "latest",
|
||||
"branch": "dev"
|
||||
}
|
||||
}
|
||||
], [
|
||||
"poke.uk2.littlekai.co.uk",
|
||||
"poke.am2.shiggy.cloud",
|
||||
{
|
||||
"uri": "https://poke.uk2.littlekai.co.uk",
|
||||
"uri": "https://poke.am2.shiggy.cloud",
|
||||
"CLOUDFLARE": false,
|
||||
"piwik": false,
|
||||
"proxy": false,
|
||||
"region": "🇬🇧",
|
||||
"region": "🇳🇱",
|
||||
"software": {
|
||||
"name": "poke",
|
||||
"version": "latest",
|
||||
"branch": "dev"
|
||||
}
|
||||
}
|
||||
], [
|
||||
"poke.blahai.gay",
|
||||
{
|
||||
"uri": "https://poke.blahai.gay/",
|
||||
"CLOUDFLARE": true,
|
||||
"piwik": false,
|
||||
"proxy": false,
|
||||
"region": "🇩🇪",
|
||||
"software": {
|
||||
"name": "poke",
|
||||
"name": "poketube",
|
||||
"version": "latest",
|
||||
"branch": "dev"
|
||||
}
|
||||
|
||||
980
january/Cargo.lock
generated
@@ -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.0"
|
||||
actix-web = "4.4.1"
|
||||
lazy_static = "1.4"
|
||||
imagesize = "0.8"
|
||||
reqwest = "0.11"
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
# Build Stage
|
||||
FROM rustlang/rust:nightly-slim AS builder
|
||||
FROM rustlang/rust:nightly-bullseye-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 apt-get update && apt-get install -y libssl-dev pkg-config && cargo install --locked --path .
|
||||
RUN cargo install --locked --path .
|
||||
|
||||
# Bundle Stage
|
||||
FROM debian:buster-slim
|
||||
RUN apt-get update && apt-get install -y ca-certificates ffmpeg
|
||||
FROM debian:bullseye-slim
|
||||
RUN apt-get update && apt-get install -y ca-certificates ffmpeg libssl-dev
|
||||
COPY --from=builder /usr/local/cargo/bin/january ./
|
||||
EXPOSE 7000
|
||||
ENV JANUARY_HOST 0.0.0.0:7000
|
||||
|
||||
106
p/Dockerfile
@@ -1,99 +1,21 @@
|
||||
#################################################################################
|
||||
# INSTALLERS #
|
||||
# These images provide the dependencies required to build the other images. #
|
||||
#################################################################################
|
||||
# docker build -t pproxy .
|
||||
# docker run -p 6003:6003 -v ./whitelist.json:/pproxy/whitelist.json:ro pproxy
|
||||
|
||||
FROM quay.io/almalinuxorg/9-base AS builder-installer
|
||||
# Base
|
||||
FROM node:18-alpine
|
||||
|
||||
# Needed for node 18+
|
||||
# RUN dnf module --assumeyes enable nodejs
|
||||
# Install dependencies
|
||||
RUN apk add --no-cache git build-base python3
|
||||
|
||||
RUN --mount=type=cache,target=/var/cache/dnf \
|
||||
dnf install --assumeyes --nodocs nodejs ca-certificates jq make gcc g++
|
||||
# Set Work Directory
|
||||
WORKDIR /pproxy
|
||||
|
||||
RUN npm install -g \
|
||||
npm@$(curl "https://release-monitoring.org/api/v2/versions/?project_id=190206" | jq --raw-output '.stable_versions[0]')
|
||||
# Install dependencies
|
||||
# Honestly less effort this way
|
||||
RUN yarn add express undici
|
||||
|
||||
# Copy files
|
||||
COPY server.js .
|
||||
|
||||
# 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" ]
|
||||
# Entrypoint
|
||||
CMD [ "node", "server.js" ]
|
||||
37
p/server.js
@@ -1,41 +1,10 @@
|
||||
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 = [
|
||||
"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 URL_WHITELIST = require("./whitelist.json");
|
||||
|
||||
const app = express();
|
||||
|
||||
@@ -73,7 +42,6 @@ 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`);
|
||||
@@ -163,6 +131,7 @@ 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,
|
||||
|
||||
32
p/whitelist.json
Normal file
@@ -0,0 +1,32 @@
|
||||
[
|
||||
"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"
|
||||
]
|
||||
@@ -28,17 +28,17 @@
|
||||
"node-libcurl": "^3.0.0",
|
||||
"uglify-js": "^3.17.4",
|
||||
"ping": "^0.4.4",
|
||||
"undici": "^6.14.0",
|
||||
"undici": "^5.25.2",
|
||||
"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.3.0"
|
||||
"youtubei.js": "^9.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
"node": "16.x"
|
||||
},
|
||||
"repository": {
|
||||
"url": "https://codeberg.org/Ashley/poketube"
|
||||
|
||||
56
server.js
@@ -32,19 +32,9 @@
|
||||
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 " +
|
||||
@@ -75,8 +65,9 @@
|
||||
const sha384 = modules.hash;
|
||||
const rateLimit = require("express-rate-limit");
|
||||
|
||||
|
||||
const limiter = rateLimit({
|
||||
windowMs: 45 * 1000, // 45 Seconds
|
||||
windowMs:45 * 1000, // 45 Seconds
|
||||
max: 886, // limit each IP to 866 requests per windowMs
|
||||
});
|
||||
|
||||
@@ -88,7 +79,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(
|
||||
@@ -98,23 +89,24 @@
|
||||
};
|
||||
|
||||
// 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);
|
||||
// but may cause the check to be too sensitive.
|
||||
toobusy.interval(110);
|
||||
|
||||
toobusy.maxLag(3500);
|
||||
toobusy.maxLag(3500);
|
||||
|
||||
app.use(function (req, res, next) {
|
||||
app.use(function(req, res, next) {
|
||||
if (toobusy()) {
|
||||
res.send(503, "I'm busy right now, sorry.");
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
toobusy.onLag(function (currentLag) {
|
||||
toobusy.onLag(function(currentLag) {
|
||||
process.exit(1);
|
||||
console.log("Event loop lag detected! Latency: " + currentLag + "ms");
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
const random_words = [
|
||||
"banana pie",
|
||||
@@ -148,8 +140,8 @@
|
||||
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();
|
||||
});
|
||||
|
||||
@@ -170,22 +162,10 @@
|
||||
});
|
||||
|
||||
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
|
||||
);
|
||||
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);
|
||||
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)\/.+/)) {
|
||||
|
||||
@@ -47,60 +47,15 @@ const splash = [
|
||||
"pika!",
|
||||
"fsf.org",
|
||||
"ssfffssfssfffaassssfsdf!",
|
||||
"𝓯𝓻𝓮𝓪𝓴𝔂poke",
|
||||
"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..",
|
||||
"poketube!!!",
|
||||
"discord.poketube.fun!",
|
||||
"rvlt.gg/poke!",
|
||||
"women are pretty!",
|
||||
"men are handsome!",
|
||||
"enbys are cute!",
|
||||
"you are cute :3",
|
||||
"read if cute!",
|
||||
"stallmansupport.org!!!",
|
||||
"does not include revolt.chat!",
|
||||
"revolt-free!",
|
||||
"not for revolt users!",
|
||||
"%99 free of revolt!",
|
||||
"does include nya~!!!",
|
||||
"you're literally showing ads!",
|
||||
"actually stable! :3"
|
||||
"stallmansupport.org!!!"
|
||||
]
|
||||
|
||||
|
||||
@@ -129,7 +84,7 @@ module.exports = function (app, config, renderTemplate) {
|
||||
const t = getJson(await invtrend.text());
|
||||
|
||||
const invpopular = await fetch(
|
||||
`https://invid-api.poketube.fun/bHj665PpYhUdPWuKPfZuQGoX/api/v1/popular`
|
||||
`https://invid-api.poketube.fun/api/v1/popular`
|
||||
);
|
||||
const p = getJson(await invpopular.text());
|
||||
|
||||
@@ -161,17 +116,6 @@ module.exports = function (app, config, renderTemplate) {
|
||||
const random = splash[Math.floor(Math.random() * splash.length)];
|
||||
const browser = req.useragent.browser;
|
||||
const isOldWindows = (uaos === "Windows 7" || uaos === "Windows 8") && browser === "Firefox";
|
||||
var proxyurl = config.p_url;
|
||||
|
||||
const secure = [
|
||||
"poketube.fun",
|
||||
"localhost" // Testing purposes
|
||||
].includes(req.hostname);
|
||||
const verify = [
|
||||
"poketube.fun",
|
||||
"poke.ashley0143.xyz",
|
||||
"localhost"
|
||||
].includes(req.hostname);
|
||||
|
||||
const rendermainpage = () => {
|
||||
if (req.useragent.isMobile) {
|
||||
@@ -179,11 +123,7 @@ module.exports = function (app, config, renderTemplate) {
|
||||
}
|
||||
|
||||
return renderTemplate(res, req, "landing.ejs", {
|
||||
secure,
|
||||
embedtype:req.query.embedtype,
|
||||
verify,
|
||||
isOldWindows,
|
||||
proxyurl,
|
||||
random
|
||||
});
|
||||
};
|
||||
|
||||
@@ -70,17 +70,17 @@ app.get("/api/set-channel-subs", async function (req, res) {
|
||||
channelName: channelToSubName,
|
||||
avatar: avatar, // Store the avatar URL along with the subscription
|
||||
});
|
||||
res.redirect("/account-create")
|
||||
res.json("user subbed");
|
||||
} 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.redirect("/account-create")
|
||||
res.json("user subbed");
|
||||
} else {
|
||||
// If the user is already subscribed to this channel, send a message indicating so
|
||||
res.json("ur already subscribed");
|
||||
res.json("user already subscribed");
|
||||
}
|
||||
});
|
||||
|
||||
@@ -104,17 +104,10 @@ app.get("/account-create", async function (req, res) {
|
||||
}
|
||||
});
|
||||
|
||||
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`);
|
||||
|
||||
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 });
|
||||
});
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
@@ -30,15 +30,14 @@ const pkg = require("../../../package.json");
|
||||
const os = require('os');
|
||||
const cnf = require("../../../config.json");
|
||||
const innertube = require("../libpoketube-youtubei-objects.json");
|
||||
const { execSync } = require('child_process');
|
||||
|
||||
const verfull = "v24.1906-sho-MAJOR_UPDATE-stable-dev-nonLTS-git-MTcxODc5NDY3NQ==";
|
||||
const versmol = "v24.1906-sho"
|
||||
const verfull = "v24.2801-JeSsIcA-MAJOR-stable-dev-nonLTS-git-MTcwNjQzMTc0OQ==";
|
||||
const versmol = "v24.2801-JeSsIcA"
|
||||
const branch = "dev/master";
|
||||
const codename = "sho";
|
||||
const versionnumber = "293";
|
||||
const relaseunixdate = "MTcxODc5NDY3NQ=="
|
||||
const updatequote = "pls fund vennie plush -Bims"
|
||||
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"
|
||||
|
||||
|
||||
module.exports = function (app, config, renderTemplate) {
|
||||
@@ -117,7 +116,7 @@ app.get("/avatars/:v", async function (req, res) {
|
||||
var format = "mp3";
|
||||
}
|
||||
|
||||
const url = `https://tube-nightly.kuylar.dev/proxy/media/${v}/${q}`;
|
||||
const url = `https://tube.kuylar.dev/proxy/media/${v}/${q}`;
|
||||
|
||||
res.redirect(url);
|
||||
});
|
||||
@@ -193,18 +192,6 @@ app.use("/sb/i/:v/:imagePath/:img", async function (req, res) {
|
||||
f.body.pipe(res);
|
||||
});
|
||||
|
||||
app.get("/api/improving-poke/getsugesstions", async (req, res) => {
|
||||
const query = req.query.q;
|
||||
|
||||
let url = `https://invid-api.poketube.fun/bHj665PpYhUdPWuKPfZuQGoX/api/v1/search/suggestions?q=${query}`;
|
||||
|
||||
let f = await modules.fetch(url, {
|
||||
method: req.method,
|
||||
});
|
||||
|
||||
f.body.pipe(res);
|
||||
});
|
||||
|
||||
app.get("/api/redirect", async (req, res) => {
|
||||
const red_url = atob(req.query.u);
|
||||
|
||||
@@ -224,10 +211,8 @@ 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/bHj665PpYhUdPWuKPfZuQGoX/api/v1/stats")
|
||||
.fetch("https://invid-api.poketube.fun/api/v1/stats")
|
||||
.then((res) => res.text())
|
||||
.then((txt) => getJson(txt));
|
||||
|
||||
@@ -235,20 +220,10 @@ app.use("/sb/i/:v/:imagePath/:img", async function (req, res) {
|
||||
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 response = {
|
||||
pt_version: {
|
||||
version:versmol,
|
||||
version_full:verfull,
|
||||
commit: latestCommitHash
|
||||
version_full:verfull
|
||||
},
|
||||
branch,
|
||||
updatequote,
|
||||
@@ -285,7 +260,7 @@ execSync('git rev-list HEAD -n 1 --abbrev-commit', (error, stdout, stderr) => {
|
||||
const { fetch } = await import("undici");
|
||||
|
||||
try {
|
||||
const url = `https://raw.githubusercontent.com/ashley0143/poke/main/instances.json`;
|
||||
const url = `https://codeberg.org/Ashley/poketube/raw/branch/main/instances.json`;
|
||||
|
||||
let f = await fetch(url)
|
||||
.then((res) => res.text())
|
||||
|
||||
@@ -108,28 +108,15 @@ module.exports = function (app, config, renderTemplate) {
|
||||
|
||||
const poketube_universe_value = "poketube_smart_search";
|
||||
|
||||
if (query) {
|
||||
let redirectTo = null;
|
||||
let splitParam = ":";
|
||||
|
||||
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=";
|
||||
}
|
||||
|
||||
if (redirectTo) {
|
||||
if (query?.includes("youtube.com/watch?v=")) {
|
||||
try {
|
||||
const id = query.split(splitParam)[1];
|
||||
res.redirect(`${redirectTo}${splitParam}${id}`);
|
||||
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);
|
||||
@@ -184,7 +171,70 @@ 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("/");
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/channel/", async (req, res) => {
|
||||
@@ -205,7 +255,6 @@ 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 = {};
|
||||
|
||||
@@ -257,8 +306,8 @@ module.exports = function (app, config, renderTemplate) {
|
||||
)}/${ID}/?hl=en-US`;
|
||||
|
||||
const channelINVUrl = `${apiUrl}${ID}/`;
|
||||
|
||||
const pronoun = "no pronouns :c";
|
||||
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);
|
||||
|
||||
var [tj, shorts, playlist, stream, c, cinv] = await Promise.all([
|
||||
getChannelData(channelUrl),
|
||||
@@ -297,7 +346,7 @@ module.exports = function (app, config, renderTemplate) {
|
||||
var { tj, shorts, stream, c, boutJson } = cache[ID].result;
|
||||
}
|
||||
|
||||
const subscribers = convert(cinv?.subCount);
|
||||
const subscribers = boutJson.Channel?.Metadata.Subscribers;
|
||||
const about = boutJson?.Channel?.Contents?.ItemSection?.About;
|
||||
const description = about?.Description.toString().replace(
|
||||
/\n/g,
|
||||
@@ -305,25 +354,10 @@ module.exports = function (app, config, renderTemplate) {
|
||||
);
|
||||
const dnoreplace = about?.Description.toString();
|
||||
|
||||
if (continuation) {
|
||||
const currentAuthorId = String(cinv.authorId).trim();
|
||||
const firstVideoAuthorId = String(tj?.videos[0].authorId).trim();
|
||||
|
||||
if (currentAuthorId.localeCompare(firstVideoAuthorId) !== 0) {
|
||||
res.status(400).send("Continuation does not match the channel :c");
|
||||
}
|
||||
}
|
||||
|
||||
let ChannelFirstVideoObject = {
|
||||
subCountText: "0",
|
||||
authorVerified: false,
|
||||
};
|
||||
|
||||
renderTemplate(res, req, "channel.ejs", {
|
||||
ID,
|
||||
tab,
|
||||
shorts,
|
||||
firstVideo: ChannelFirstVideoObject,
|
||||
j: boutJson,
|
||||
sort: sort_by,
|
||||
stream,
|
||||
|
||||
@@ -210,20 +210,11 @@ module.exports = function (app, config, renderTemplate) {
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/game-hub", function (req, res) {
|
||||
var gameslist = ["pong", "tic-tac-toe", "sudoku", "snake"];
|
||||
var requestedGame = req.query.game;
|
||||
|
||||
if (req.query.game && !gameslist.includes(requestedGame)) {
|
||||
return renderTemplate(res, req, "404.ejs");
|
||||
}
|
||||
|
||||
app.get("/game-hub", function (req, res) {
|
||||
renderTemplate(res, req, "gamehub.ejs", {
|
||||
game: requestedGame,
|
||||
game: req.query.game,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
app.get("/static/:id", (req, res) => {
|
||||
const id = req.params.id;
|
||||
|
||||
|
||||
@@ -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) {
|
||||
@@ -168,14 +168,7 @@ const X_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) {
|
||||
@@ -197,13 +190,6 @@ 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";
|
||||
|
||||
@@ -217,11 +203,10 @@ 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) => {
|
||||
INNERTUBE.getYouTubeApiVideo(f, v, contentlang, contentregion).then((data) => {
|
||||
try {
|
||||
const k = data?.video;
|
||||
const channel_uploads = data?.channel_uploads;
|
||||
const channel_uploads = data?.channel_uploads
|
||||
const json = data?.json;
|
||||
const engagement = data?.engagement;
|
||||
const inv_comments = data?.comments || "Disabled";
|
||||
@@ -233,6 +218,7 @@ module.exports = function (app, config, renderTemplate) {
|
||||
d = desc.toString().replace(/\n/g, " <br> ");
|
||||
}
|
||||
|
||||
|
||||
const descriptionString = String(inv_vid?.description);
|
||||
|
||||
function extractInfo(regex) {
|
||||
@@ -242,23 +228,18 @@ module.exports = function (app, config, renderTemplate) {
|
||||
}
|
||||
|
||||
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_THAT_SHOULD_HAVE_STOPPED_WITH_PAYPAL_WE_WILL_FOREVER_CALL_IT_TWITTER_AND_HE_CAN_DO_NOTHING_ABOUT_IT_LOL_FUCK_YOU_ELON_TRANS_RIGHTS_BTW = extractInfo(X_REGEX);
|
||||
const linkto = extractInfo(LNKTO_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);
|
||||
|
||||
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;
|
||||
var mediaproxy = config.media_proxy
|
||||
|
||||
|
||||
if (inv_vid?.genre === "Music") {
|
||||
var vidurl = u.losslessurl;
|
||||
@@ -269,7 +250,7 @@ module.exports = function (app, config, renderTemplate) {
|
||||
|
||||
if (req.useragent.source.includes("Pardus")) {
|
||||
var vidurl = "https://iv.ggtyler.dev";
|
||||
var mediaproxy = "https://nyc1.pokejan.ggtyler.dev/";
|
||||
var mediaproxy = "https://media-proxy.ashley0143.xyz"
|
||||
var isvidious = true;
|
||||
var isSchoolProxy = "";
|
||||
}
|
||||
@@ -279,7 +260,7 @@ module.exports = function (app, config, renderTemplate) {
|
||||
let comments = "";
|
||||
let nnn = "";
|
||||
|
||||
const dnt_val = isDntEnabled(req);
|
||||
const dnt_val = isDntEnabled(req)
|
||||
|
||||
if (
|
||||
inv_vid?.error ===
|
||||
@@ -291,12 +272,6 @@ module.exports = function (app, config, renderTemplate) {
|
||||
);
|
||||
}
|
||||
|
||||
if (inv_vid?.error) {
|
||||
renderTemplate(res, req, "404.ejs", {
|
||||
v,
|
||||
});
|
||||
}
|
||||
|
||||
var uaos = req.useragent.os;
|
||||
const browser = req.useragent.browser;
|
||||
const IsOldWindows =
|
||||
@@ -314,10 +289,8 @@ module.exports = function (app, config, renderTemplate) {
|
||||
color2: data.color2,
|
||||
linkify,
|
||||
engagement,
|
||||
linkto,
|
||||
IsOldWindows,
|
||||
channelurlfixer,
|
||||
itag_hd,
|
||||
support,
|
||||
shortsui,
|
||||
u: vidurl,
|
||||
@@ -326,7 +299,7 @@ module.exports = function (app, config, renderTemplate) {
|
||||
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_THAT_SHOULD_HAVE_STOPPED_WITH_PAYPAL_WE_WILL_FOREVER_CALL_IT_TWITTER_AND_HE_CAN_DO_NOTHING_ABOUT_IT_LOL_FUCK_YOU_ELON_TRANS_RIGHTS_BTW,
|
||||
twitter,
|
||||
k,
|
||||
dm,
|
||||
proxyurl,
|
||||
@@ -371,8 +344,7 @@ module.exports = function (app, config, renderTemplate) {
|
||||
console.error(error);
|
||||
return res.redirect(`/watch?v=${req.query.v}&fx=1&err=${error}`);
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
app.get("/lite", async (req, res) => {
|
||||
@@ -395,11 +367,10 @@ 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) => {
|
||||
INNERTUBE.getYouTubeApiVideo(f, v, contentlang, contentregion).then((data) => {
|
||||
try {
|
||||
const k = data?.video;
|
||||
const channel_uploads = data?.channel_uploads;
|
||||
const channel_uploads = data?.channel_uploads
|
||||
const json = data?.json;
|
||||
const engagement = data?.engagement;
|
||||
const inv_comments = data?.comments || "Disabled";
|
||||
@@ -411,6 +382,7 @@ module.exports = function (app, config, renderTemplate) {
|
||||
d = desc.toString().replace(/\n/g, " <br> ");
|
||||
}
|
||||
|
||||
|
||||
const descriptionString = String(inv_vid?.description);
|
||||
|
||||
function extractInfo(regex) {
|
||||
@@ -426,10 +398,12 @@ module.exports = function (app, config, renderTemplate) {
|
||||
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;
|
||||
var mediaproxy = config.media_proxy
|
||||
|
||||
|
||||
if (inv_vid?.genre === "Music") {
|
||||
var vidurl = u.losslessurl;
|
||||
@@ -440,7 +414,7 @@ module.exports = function (app, config, renderTemplate) {
|
||||
|
||||
if (req.useragent.source.includes("Pardus")) {
|
||||
var vidurl = "https://iv.ggtyler.dev";
|
||||
var mediaproxy = "https://media-proxy.ashley0143.xyz";
|
||||
var mediaproxy = "https://media-proxy.ashley0143.xyz"
|
||||
var isvidious = true;
|
||||
var isSchoolProxy = "";
|
||||
}
|
||||
@@ -450,7 +424,7 @@ module.exports = function (app, config, renderTemplate) {
|
||||
let comments = "";
|
||||
let nnn = "";
|
||||
|
||||
const dnt_val = isDntEnabled(req);
|
||||
const dnt_val = isDntEnabled(req)
|
||||
|
||||
if (
|
||||
inv_vid?.error ===
|
||||
@@ -530,8 +504,7 @@ module.exports = function (app, config, renderTemplate) {
|
||||
console.error(error);
|
||||
return res.redirect(`/watch?v=${req.query.v}&fx=1&err=${error}`);
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
app.get("/music", async function (req, res) {
|
||||
|
||||
@@ -11,6 +11,7 @@ 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');
|
||||
|
||||
|
||||
/**
|
||||
@@ -30,13 +31,7 @@ class InnerTubePokeVidious {
|
||||
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 = "19.14.42"
|
||||
this.ANDROID_VERSION = "13"
|
||||
this.useragent = "com.google.android.youtube/19.14.42 (Linux; U; Android 12; US) gzip"
|
||||
this.INNERTUBE_CONTEXT_CLIENT_VERSION = "1"
|
||||
this.region = "region=US";
|
||||
this.sqp = "-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw";
|
||||
@@ -76,6 +71,7 @@ class InnerTubePokeVidious {
|
||||
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";
|
||||
|
||||
@@ -88,8 +84,7 @@ class InnerTubePokeVidious {
|
||||
let desc = "";
|
||||
|
||||
try {
|
||||
const [invComments, videoInfo, videoData] = await Promise.all([
|
||||
fetch(`${this.config.invapi}/comments/${v}?hl=${contentlang}®ion=${contentregion}&h=${btoa(Date.now())}`).then((res) => res.text()),
|
||||
const [videoInfo, videoData] = await Promise.all([
|
||||
fetch(`${this.config.invapi}/videos/${v}?hl=${contentlang}®ion=${contentregion}&h=${btoa(Date.now())}`).then((res) => res.text()),
|
||||
curly
|
||||
.get(`${this.config.tubeApi}video?v=${v}`, {
|
||||
@@ -103,7 +98,7 @@ class InnerTubePokeVidious {
|
||||
]);
|
||||
|
||||
|
||||
const comments = await this.getJson(invComments);
|
||||
const comments = await yt.getComments(v);
|
||||
|
||||
const vid = await this.getJson(videoInfo);
|
||||
const { json, video } = videoData;
|
||||
@@ -167,9 +162,7 @@ class InnerTubePokeVidious {
|
||||
*/
|
||||
isvalidvideo(v) {
|
||||
if (v != "assets" && v != "cdn-cgi" && v != "404") {
|
||||
const regex = new RegExp("^([a-zA-Z0-9_-]{11})");
|
||||
const isMatch = regex.test(v);
|
||||
return isMatch;
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
@@ -188,7 +181,7 @@ class InnerTubePokeVidious {
|
||||
// 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/bHj665PpYhUdPWuKPfZuQGoX/api/v1",
|
||||
invapi: "https://invid-api.poketube.fun/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/",
|
||||
|
||||
@@ -47,6 +47,7 @@ class PokeTubeDislikesAPIManager {
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
"INNERTUBE_CONTEXT_HL": "en-US"
|
||||
},
|
||||
"LATEST_ECATCHER_SERVICE_PARAMS": { "client.name": "WEB" },
|
||||
"INNERTUBE_API_KEYS": {
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
TIME_BEFORE_DELETE=30
|
||||
INACTIVE_TIME_BEFORE_DELETE=3600
|
||||
PORT=45872
|
||||
# DO NOT PUT A / AT THE END OF THE URL
|
||||
PROXY_URL=https://eu-proxy.poketube.fun
|
||||
170
videobundler/.gitignore
vendored
@@ -1,170 +0,0 @@
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
cover/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
.pybuilder/
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# IPython
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# pyenv
|
||||
# For a library or package, you might want to ignore these files since the code is
|
||||
# intended to run in multiple environments; otherwise, check them in:
|
||||
# .python-version
|
||||
|
||||
# pipenv
|
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||
# install all needed dependencies.
|
||||
#Pipfile.lock
|
||||
|
||||
# poetry
|
||||
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
||||
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||
# commonly ignored for libraries.
|
||||
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
||||
#poetry.lock
|
||||
|
||||
# pdm
|
||||
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
||||
#pdm.lock
|
||||
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
||||
# in version control.
|
||||
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
|
||||
.pdm.toml
|
||||
.pdm-python
|
||||
.pdm-build/
|
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||
__pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat.pid
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# pytype static type analyzer
|
||||
.pytype/
|
||||
|
||||
# Cython debug symbols
|
||||
cython_debug/
|
||||
|
||||
# PyCharm
|
||||
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
#.idea/
|
||||
bin/
|
||||
include/
|
||||
lib64/
|
||||
pyvenv.cfg
|
||||
*.m4a
|
||||
*.mp4
|
||||
.env
|
||||
done.*
|
||||
@@ -1,21 +0,0 @@
|
||||
# poke-videobundler
|
||||
|
||||
Takes 2 input streams, downloads them, and spits out a combined file.
|
||||
|
||||
## Installation
|
||||
|
||||
1. Make sure `ffmpeg` and Python 3 are all installed.
|
||||
2. Download the program files to your computer - `main.py` and `.env.example`.
|
||||
3. Run `python3 -m pip install aiohttp`.
|
||||
|
||||
## Usage
|
||||
|
||||
1. `python3 main.py`.
|
||||
2. If everything went well, you shouldn't see any output at launch.
|
||||
3. You will now be able to call the server at :3030.
|
||||
|
||||
## Endpoints
|
||||
|
||||
- `/`: Will return `{success:true}` if alive.
|
||||
- `/[ANYTHING]?id=VIDEO_ID&audio_itag=AUDIO_ITAG&video_itag=VIDEO_ITAG`: Starts the merging process. ID is the youtube video ID, and itags are self explanatory. As a response, you will get a job ID that you will be able to use in future requests to query the video or its status. When this process is finished, the inactive autodelete counter will start, which will allow you to fetch the video until the countdown is over.
|
||||
> Replace `[ANYTHING]` with absolutely anything, however it has to be unique to the request. Preferably use an UUID
|
||||
@@ -1,104 +0,0 @@
|
||||
import asyncio
|
||||
import aiohttp
|
||||
from aiohttp import web
|
||||
import string
|
||||
import os
|
||||
import random
|
||||
import subprocess
|
||||
from aiohttp.web import Response, FileResponse
|
||||
|
||||
app = web.Application()
|
||||
app.router._frozen = False
|
||||
|
||||
def get_random_string(length):
|
||||
# choose from all lowercase letter
|
||||
letters = string.ascii_lowercase
|
||||
result_str = "".join(random.choice(letters) for i in range(length))
|
||||
return result_str
|
||||
|
||||
async def run_command(cmd):
|
||||
# Create subprocess
|
||||
process = await asyncio.create_subprocess_shell(
|
||||
cmd,
|
||||
stdout=asyncio.subprocess.PIPE,
|
||||
)
|
||||
# Wait for the subprocess to finish
|
||||
stdout, stderr = await process.communicate()
|
||||
# Check for errors
|
||||
if process.returncode!= 0:
|
||||
# Log or handle the error
|
||||
print(f"Command '{args}' failed with return code {process.returncode}")
|
||||
return None
|
||||
# Decode stdout and return
|
||||
return stdout
|
||||
|
||||
async def merge(request: aiohttp.web.Request):
|
||||
# register params
|
||||
video_id: str = request.rel_url.query["id"]
|
||||
audio_itag: str = request.rel_url.query["audio_itag"]
|
||||
video_itag: str = request.rel_url.query["video_itag"]
|
||||
# validate
|
||||
if " " in video_id or len(video_id) > 11:
|
||||
print(f"Video {video_id} flagged as invalid, dropping request")
|
||||
return
|
||||
if not audio_itag.isdigit():
|
||||
print(f"Audio itag {audio_itag} flagged as invalid, dropping request")
|
||||
return
|
||||
if not video_itag.isdigit():
|
||||
print(f"Video itag {video_itag} flagged as invalid, dropping request")
|
||||
return
|
||||
if "Firefox" in request.headers["User-Agent"]:
|
||||
# Sane browser that supports streaming
|
||||
|
||||
cmdline = f"ffmpeg -i \"https://eu-proxy.poketube.fun/latest_version?id={video_id}&itag={audio_itag}&local=true\" -i \"https://eu-proxy.poketube.fun/latest_version?id={video_id}&itag={video_itag}&local=true\" -c copy -f mp4 -movflags frag_keyframe+empty_moov -"
|
||||
process = await asyncio.create_subprocess_shell(
|
||||
cmdline,
|
||||
stdout=asyncio.subprocess.PIPE,
|
||||
stderr=asyncio.subprocess.PIPE
|
||||
)
|
||||
response = web.StreamResponse(status=206, reason='OK', headers={
|
||||
'Content-Type': 'application/octet-stream',
|
||||
'Transfer-Encoding': 'chunked',
|
||||
'Content-Disposition': 'inline'
|
||||
})
|
||||
await response.prepare(request)
|
||||
try:
|
||||
while True:
|
||||
chunk = await process.stdout.readline()
|
||||
if not chunk:
|
||||
break
|
||||
await response.write(chunk)
|
||||
except Exception as e:
|
||||
|
||||
print(f"Error streaming FFmpeg output: {e}")
|
||||
#finally:
|
||||
#await response.write_eof()
|
||||
else:
|
||||
# Likely to be chromium browser, so to avoid browser shitting itself we download file
|
||||
job_id = f'{request.rel_url.query["id"]}_{request.rel_url.query["audio_itag"]}_{request.rel_url.query["video_itag"]}'
|
||||
if os.path.isfile(f"{job_id}.mp4"):
|
||||
return web.FileResponse(
|
||||
path=f"{job_id}.mp4"
|
||||
)
|
||||
cmdline = f"ffmpeg -i \"https://eu-proxy.poketube.fun/latest_version?id={video_id}&itag={audio_itag}&local=true\" -i \"https://eu-proxy.poketube.fun/latest_version?id={video_id}&itag={video_itag}&local=true\" -c:v copy -f mp4 -movflags frag_keyframe+empty_moov {job_id}.mp4"
|
||||
process = await asyncio.create_subprocess_shell(
|
||||
cmdline
|
||||
)
|
||||
await process.wait()
|
||||
if process.returncode != 0: # Log or handle the error
|
||||
return None
|
||||
response = FileResponse(path=f"{job_id}.mp4")
|
||||
return response
|
||||
|
||||
async def ping(request):
|
||||
return web.Response(body='{"success": true}', content_type="application/json")
|
||||
|
||||
async def init_app():
|
||||
app.router.add_get("/{id:.+}", merge)
|
||||
app.router.add_get("/", ping)
|
||||
return app
|
||||
|
||||
if __name__ == '__main__':
|
||||
loop = asyncio.get_event_loop()
|
||||
app = loop.run_until_complete(init_app())
|
||||
web.run_app(app, port=3030)
|
||||