mirror of
https://codeberg.org/ashley/poke.git
synced 2024-12-25 17:48:41 +01:00
Merge pull request 'main' (#7) from ashley/poke:main into main
Reviewed-on: https://codeberg.org/Korbs/poke/pulls/7
This commit is contained in:
commit
cf7cf98dd5
22 changed files with 465 additions and 267 deletions
18
.drone.yml
18
.drone.yml
|
@ -1,19 +1,19 @@
|
|||
kind: pipeline
|
||||
type: exec
|
||||
name: Build and Push Docker Image (Quay)
|
||||
name: Build and Push Docker Image
|
||||
|
||||
platform:
|
||||
os: linux
|
||||
arch: amd64
|
||||
arch: arm64
|
||||
|
||||
steps:
|
||||
- name: Build
|
||||
environment:
|
||||
QUAY_USERNAME:
|
||||
from_secret: QUAY_USERNAME
|
||||
QUAY_PASSWORD:
|
||||
from_secret: QUAY_PASSWORD
|
||||
CODEBERG_USERNAME:
|
||||
from_secret: CODEBERG_USERNAME
|
||||
CODEBERG_PASSWORD:
|
||||
from_secret: CODEBERG_PASSWORD
|
||||
commands:
|
||||
- echo $QUAY_PASSWORD | docker login quay.io --username $QUAY_USERNAME --password-stdin
|
||||
- docker build -t quay.io/sudovanilla/poketube .
|
||||
- docker push quay.io/sudovanilla/poketube
|
||||
- echo $CODEBERG_PASSWORD | docker login codeberg.org --username $CODEBERG_USERNAME --password-stdin
|
||||
- docker build -t codeberg.org/korbs/poke:arm64 .
|
||||
- docker push codeberg.org/korbs/poke:arm64
|
213
README.md
213
README.md
|
@ -1,176 +1,87 @@
|
|||
|
||||
<h1 align="center">
|
||||
<a href="https://poketube.fun/watch?v=9sJUDx7iEJw&quality=medium&=sjohgteojgytrueugtye4jhtytjrjnyıı">
|
||||
<img src="https://poketube.fun/css/logo-poke.svg" width="400">
|
||||
<a href="http://www.defectivebydesign.org/drm-free">
|
||||
<img src="https://static.fsf.org/dbd/label/DRM-free%20label%20120.en.png"
|
||||
alt="DefectiveByDesign.org"
|
||||
width="65" height="65" border="0" align="middle" /></a>
|
||||
</a>
|
||||
<p>The Ultimate Privacy App</p>
|
||||
</h1>
|
||||
|
||||
<div align="center">
|
||||
|
||||
<span> Be Anonymous watching epic videos, searching thingys on the interwebs and listening to music on poke - the free privacy front end!</span>
|
||||
|
||||
<span>"Since you work on poke, Are you in touch with its lead developer "Jose marchasi"? <br>
|
||||
-RMS
|
||||
|
||||
Stallman though poke was GNU poke lmaoooo
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<img src="https://poketube.fun/css/logo-poke.svg" width="400">
|
||||
</a>
|
||||
<a href="http://www.defectivebydesign.org/drm-free">
|
||||
<img src="https://static.fsf.org/dbd/label/DRM-free%20label%20120.en.png"
|
||||
alt="DRM Free" width="65" height="65" border="0" align="middle" />
|
||||
</a>
|
||||
<p>PRIVACY APP OF YOUR DREAMS! :3</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>
|
||||
|
||||
[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>
|
||||
<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>
|
||||
|
||||
![Preview](./css/README_Preview.png)
|
||||
|
||||
## Welcome!
|
||||
|
||||
This is the source code of Poke (formerly PokeTube), the privacy-friendly youtube front-end built with the InnerTube API!
|
||||
Welcome to Poke (formerly PokeTube), the privacy-friendly YouTube front-end built with the InnerTube API! Imagine paying for YouTube Premium just to download videos - couldn't be us (literally).
|
||||
|
||||
# Features
|
||||
## Features
|
||||
|
||||
| <img width="100%" style="border-radius: 24px" src="./css/README_RYD.png"> | <div style="text-align: left"><h3>Return YouTube Dislikes Built-In</h3>See the dislikes from returnyoutubedislike! </div> |
|
||||
| <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 :3</div> | <img width="100%" style="border-radius: 24px" src="./css/README_PWA.jpg"> |
|
||||
| <div style="text-align: right"><h3>📱 PWA Support</h3>With PWA Support, you can install Poke on your mobile device. Now you can pretend to be productive while watching cat videos on the go, mreoww! :3</div> | <img width="100%" style="border-radius: 24px" src="./css/README_PWA.jpg"> |
|
||||
| <h3>🎨 Customize</h3>Customize Poke however you want. Make it as unique as your taste in memes. | <h3>📥 Accounts</h3>Suscribe (yes Suscribe hehe sussy baka) to whaever channel you want! </div> |
|
||||
| <h3>🔍 Web Search</h3>Search the web privately on PokeTube. Incognito mode who? | <h3>🎶 And...</h3>Ambient mode, HQ audio, and even more! :3 |
|
||||
|
||||
<h3>Customize</h3>
|
||||
Customize Poketube However you want :3
|
||||
## No Non-Free Codec Needed
|
||||
|
||||
<h3>Accounts </h3>
|
||||
Suscribe (yes Suscribe hehe sussy baka) to whaever channel you want!
|
||||
Poke uses OpenH264, which is free software! No non-free components included :3 View the source code of OpenH264 [here](https://github.com/cisco/openh264.git). Because who wants to deal with non-free stuff? Not us!~
|
||||
|
||||
<h3>Web Search </h3>
|
||||
Search the web privatly on poketube :3
|
||||
## Hosting Poke
|
||||
|
||||
<br>
|
||||
<h3>And... </h3>
|
||||
<p>
|
||||
Ambient mode, HQ audio And Even more!!!!!
|
||||
</p>
|
||||
### NodeJS
|
||||
|
||||
## 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>
|
||||
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++`
|
||||
|
||||
## No Non-free codec needed :3
|
||||
2. **Clone Repo**
|
||||
- Codeberg: `$ git clone https://codeberg.org/ashley/poke.git`
|
||||
- GitHub: `$ git clone https://github.com/ashley0143/poke.git`
|
||||
|
||||
Poke uses openh264 which is free software! poketube does not inculude non free stuff owowowoow!!!!
|
||||
3. **Install Dependencies**
|
||||
- `$ cd poke`
|
||||
- `$ npm install`
|
||||
|
||||
you can view the source code of the openh264 codec in this repo :3 --> https://github.com/cisco/openh264.git
|
||||
4. **Start Server**
|
||||
- `$ node server.js`
|
||||
|
||||
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.
|
||||
Congrats! PokeTube should now be running on `localhost:6003`! 🎉
|
||||
|
||||
## Hosting Poke~
|
||||
### Docker
|
||||
|
||||
### 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
|
||||
1. **Create Directory**
|
||||
- `$ mkdir poketube && cd poketube`
|
||||
|
||||
### With NodeJS
|
||||
To self host your own Poke instance, you'll need some packages installed on your GNU/Linux install.
|
||||
2. **Download Config**
|
||||
- `$ curl -O https://codeberg.org/Ashley/poke/raw/branch/main/docker-compose.yml`
|
||||
|
||||
<details>
|
||||
<summary>For Fedora/RHEL/Rocky/CentOS</summary>
|
||||
<br/>
|
||||
3. **Run PokeTube**
|
||||
- `$ docker compose up -d`
|
||||
|
||||
```
|
||||
sudo dnf install git make gcc libcurl nodejs python libcurl4 g++
|
||||
```
|
||||
Congrats! PokeTube should now be running on `localhost:6003`! 🎉
|
||||
|
||||
</details>
|
||||
## Poke Community
|
||||
|
||||
<details>
|
||||
<summary>For Debian/Ubuntu</summary>
|
||||
<br/>
|
||||
Join us on [Revolt](https://rvlt.gg/poketube) or [Matrix](https://matrix.to/#/#poke:vern.cc)! I promise we're cool! <3
|
||||
|
||||
```
|
||||
sudo apt install git make gcc libcurl4-openssl-dev nodejs npm python g++
|
||||
```
|
||||
|
||||
</details>
|
||||
<br/>
|
||||
|
||||
Once you have everything, clone our repo:
|
||||
|
||||
<details open>
|
||||
<summary>Clone via Codeberg</summary>
|
||||
<br/>
|
||||
|
||||
```
|
||||
git clone https://codeberg.org/ashley/poke.git
|
||||
```
|
||||
|
||||
</details>
|
||||
<details>
|
||||
<summary>Clone via GitHub</summary>
|
||||
<br/>
|
||||
|
||||
```
|
||||
git clone https://github.com/ashley0143/poke.git
|
||||
```
|
||||
|
||||
</details>
|
||||
<br/>
|
||||
|
||||
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
|
||||
|
@ -178,18 +89,22 @@ 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 additionally use the GNU Coding Standard, see [this link.](https://www.gnu.org/prep/standards)
|
||||
We use the GNU Coding Standard Thingy, see [this link.](https://www.gnu.org/prep/standards)
|
||||
|
||||
<div>
|
||||
<h3>some parts of poketube.fun is proudly hosted on glitch.com since <i>2020</i> </h3>
|
||||
<a href="https://glitch.com/"><img src="https://cdn.glitch.global/d68d17bb-f2c0-4bc3-993f-50902734f652/glitch-fastly-lock-up.svg?v=1696671148266"></a><br><hr>
|
||||
<a href="https://gnu.org/not-open-source"><img width="200" src="https://autumn.revolt.chat/attachments/eNpfwV2C1_wudONe43YCvWr-4vbvLpG78HbuXgOYfO"></a>
|
||||
</div>
|
||||
|
||||
<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>
|
BIN
css/poke-chan-v2.png
Normal file
BIN
css/poke-chan-v2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
BIN
css/red-tape.png
Normal file
BIN
css/red-tape.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 263 KiB |
|
@ -1,7 +1,8 @@
|
|||
# To run, please do either docker compose up -d (for docker's own version) or docker-compose up -d (for your OSes package managers verison)
|
||||
services:
|
||||
poketube:
|
||||
image: quay.io/sudovanilla/poketube
|
||||
image: codeberg.org/korbs/poke:amd64
|
||||
# image: codeberg.org/korbs/poke:arm64 # Use this if you're using a Raspberry Pi or an arm architecture
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./config.json:/poketube/config.json
|
||||
|
|
|
@ -327,7 +327,9 @@ margin-left: auto;
|
|||
background: var(--not-quite-black);
|
||||
text-decoration: none;
|
||||
border-radius: 1em;
|
||||
} </style>
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
|
||||
<style>
|
||||
|
@ -413,12 +415,10 @@ border:solid;
|
|||
<div class="channel-page" >
|
||||
<audio id="audio" style="display:none;" loop autoplay></audio>
|
||||
|
||||
<img src="https://t.poketube.fun/t/rep.gif" style="width: 0;visibility: hidden;display:none;" id="discover_main">
|
||||
|
||||
|
||||
|
||||
<h1 style="font-size: 2em;margin-left: auto;margin-right: auto;text-align: center;font-family: poketube flex;font-weight: 1000;font-stretch: ultra-expanded;color: #fff;margin-bottom: 7px;margin-top: 31px;">
|
||||
Discover Popular videos on poketube!
|
||||
</h1>
|
||||
Popular Videos On Poke :3 </h1>
|
||||
<% if (!tab) { %>
|
||||
|
||||
<div class="tabs tabs-center">
|
||||
|
@ -492,9 +492,9 @@ Discover Popular videos on poketube!
|
|||
|
||||
|
||||
|
||||
<div class="video-grid" style="border-radius:12px">
|
||||
<div class="video-grid" style="border-top-left-radius:2em;width: 80em;border-top-right-radius: 2em;border: solid 1px purple;">
|
||||
<% inv.forEach(x => { %>
|
||||
<a href="/watch?v=<%- x.videoId %>" class="video">
|
||||
<a href="/watch?v=<%- x.videoId %>" class="video author-<%- x.author %>">
|
||||
<div class="thumbnail" style="background-image: url('/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw');border-radius: 10px;"><span class="video-length"><%- turntomins(x.lengthSeconds) %></span></div>
|
||||
<div class="info">
|
||||
<span class="title max-lines-2" title="<%- x.title %>" style="font-family:Inter,sans-serif;"><%- x.title %></span>
|
||||
|
@ -506,7 +506,7 @@ Discover Popular videos on poketube!
|
|||
|
||||
|
||||
<% }) %>
|
||||
|
||||
<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>
|
||||
<% } %>
|
||||
|
|
|
@ -34,11 +34,19 @@
|
|||
<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>
|
||||
<meta content="Poke is a free software youtube front-end, search engine, translator, map app and even more!! Watch silly videos, search stuff on 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" />
|
||||
<% 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="summary_large_image" name="twitter:card" />
|
||||
<% if(isOldWindows) { %>
|
||||
<style>
|
||||
|
@ -174,9 +182,9 @@
|
|||
actions='true',
|
||||
|
||||
has_secondary_action='true',
|
||||
secondary_icon='<svg width="35" height="37" viewBox="0 0 35 37" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_108_2)"><path d="M24.979 12.562C24.979 15.349 23.459 17.022 20.215 17.022H14.844V8.20296H20.216C23.459 8.20296 24.979 9.92596 24.979 12.562ZM0.979004 1.00696L6.179 8.21996V36.58H14.845V23.153H16.923L24.323 36.583H34.104L25.894 22.494C28.1862 21.9361 30.2192 20.6123 31.6566 18.7416C33.0939 16.8709 33.8494 14.5655 33.798 12.207C33.798 6.02396 29.44 1.00696 20.723 1.00696H0.979004Z" fill="white" stroke="white"/></g><defs><clipPath id="clip0_108_2"><rect width="35" height="37" fill="white"/></clipPath></defs></svg>',
|
||||
secondary_text='Revolt',
|
||||
secondary_link='https://rvlt.gg/poketube',
|
||||
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',
|
||||
|
|
|
@ -24,9 +24,10 @@
|
|||
<header>
|
||||
<div class="header-content">
|
||||
<div class="header-start">
|
||||
<a title="Poke Homepage" href="/">
|
||||
<a title="Poke Homepage" href="/playlist?list=PL3roRV3JHZzbatp5PvE-88ApmVishqGHN">
|
||||
<img src="/css/logo-poke.svg?v=5"/>
|
||||
<p class="subtitle"> <%- random %></p>
|
||||
<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">
|
||||
|
|
|
@ -246,8 +246,9 @@ font-family:Ubuntu
|
|||
<%- x.title %>
|
||||
</a>
|
||||
<div>
|
||||
<a href="/channel?id=<%- x.authorId %>" style="border-radius:0em"><%- x.author %></a>
|
||||
</div>
|
||||
<a href="/channel?id=<%- x.authorId %>" style="border-radius:0em"><%- x.author %></a><br>
|
||||
<a href="/download?id=<%- x.videoId %>" style="border-radius:0em"> Download </a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
<link href="/css/yt-ukraine.svg?v=3" rel=icon>
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
<link href=/css/snow.css rel=stylesheet>
|
||||
<title> <%=inv_vid.title%> | PokeTube </title>
|
||||
<title> <%=inv_vid.title%> | Watch </title>
|
||||
<style>
|
||||
.comments-area {
|
||||
background: #f1f9ff;
|
||||
|
@ -929,6 +929,10 @@ Source Code
|
|||
<a href="/privacy" style="text-decoration: none;color:#fff;" class="dropdown__item">
|
||||
<i style="width: 16px;height: 17px;margin-left: -1px;" class="fa-light fa-shield"></i>
|
||||
Privacy
|
||||
</a>
|
||||
<a href="https://discord.poketube.fun" style="text-decoration: none;color:#fff;" class="dropdown__item">
|
||||
<i class="fa-brands fa-discord"></i>
|
||||
Offical Discord Server! :3
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1001,7 +1005,11 @@ Privacy
|
|||
<a href="https://codeberg.org/ashley/poke/src/branch/main/fix-videoplayback-issues.md" style="color: #fff;">
|
||||
<i class="fa-light fa-info-circle"></i> Having issues?</a>
|
||||
</div>
|
||||
|
||||
<div >
|
||||
<a href="https://discord.poketube.fun" style="color: #fff;">
|
||||
<i class="fa-brands fa-discord"></i> Discord Server</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
@ -1137,7 +1145,15 @@ Privacy
|
|||
</div>
|
||||
</div>
|
||||
<div class="video-info" >
|
||||
<% if (universe) { %>
|
||||
|
||||
<div class="video-info-panel gradient" style="display:none;">
|
||||
<% } %>
|
||||
<% if (!universe) { %>
|
||||
|
||||
<div class="video-info-panel gradient">
|
||||
<% } %>
|
||||
|
||||
<% if (k.Video.Channel.Name == "7clouds") { %>
|
||||
<div class="video-title t" style="font-family: 'Edo SZ', sans-serif !important;font-weight:bold;line-break: auto;max-width: max-content;margin: 0;margin-bottom: 0;padding: 0;"
|
||||
<% } %>
|
||||
|
@ -1372,6 +1388,63 @@ WIP! </a>
|
|||
Date of upload: <%=date%> ^^ <br>
|
||||
<hr style="clear: both;display: none;border: none;border-bottom: 0.5px solid #2f2f2f;/*! width: 4.5em; */height: 0;">
|
||||
Rating : <%=engagement.rating.toLocaleString()%> (<%=engagement.dislikes.toLocaleString()%>/<%=engagement.likes.toLocaleString()%> <abbr title="Like To dislike ratio - the number to the left is dislike count and the one to the right is like count :3">LTDR</abbr>) <br>
|
||||
|
||||
<%
|
||||
const likes = parseInt(engagement.likes) || 0;
|
||||
const dislikes = parseInt(engagement.dislikes) || 0;
|
||||
const total = likes + dislikes;
|
||||
|
||||
const likePercentage = total > 0 ? ((likes / total) * 100).toFixed(2) : 0;
|
||||
const dislikePercentage = total > 0 ? ((dislikes / total) * 100).toFixed(2) : 0;
|
||||
|
||||
const getLikePercentageColor = (percentage) => {
|
||||
if (percentage >= 80) {
|
||||
return 'green';
|
||||
} else if (percentage >= 50) {
|
||||
return 'orange';
|
||||
} else {
|
||||
return 'red';
|
||||
}
|
||||
};
|
||||
|
||||
const getDislikePercentageColor = (percentage) => {
|
||||
if (percentage >= 50) {
|
||||
return 'red';
|
||||
} else if (percentage >= 20) {
|
||||
return 'orange';
|
||||
} else {
|
||||
return 'green';
|
||||
}
|
||||
};
|
||||
|
||||
const likeColor = getLikePercentageColor(likePercentage);
|
||||
const dislikeColor = getDislikePercentageColor(dislikePercentage);
|
||||
|
||||
const userScore = (parseFloat(likePercentage) - parseFloat(dislikePercentage) / 2).toFixed(2);
|
||||
|
||||
const getUserScoreLabel = (score) => {
|
||||
if (score >= 80) {
|
||||
return 'Overwhelmingly Positive';
|
||||
} else if (score >= 60) {
|
||||
return 'Positive';
|
||||
} else if (score >= 40) {
|
||||
return 'Mixed';
|
||||
} else if (score >= 20) {
|
||||
return 'Negative';
|
||||
} else {
|
||||
return 'Overwhelmingly Negative';
|
||||
}
|
||||
};
|
||||
|
||||
const userScoreLabel = getUserScoreLabel(userScore);
|
||||
const userScoreColor = userScore >= 80 ? 'green' : userScore >= 50 ? 'orange' : 'red';
|
||||
%>
|
||||
|
||||
|
||||
|
||||
<br><span style="color: <%= likeColor %>;"><%= likePercentage %>%</span> of the users lieked the video!! <br>
|
||||
<span style="color: <%= dislikeColor %>;"><%= dislikePercentage %>%</span> of the users dislieked the video!! <br>
|
||||
User score: <span style="color: <%= userScoreColor %>;"><%= userScore %></span>- <%= userScoreLabel %><br><br>
|
||||
RYD date created : <%=engagement.dateCreated.toLocaleString()%> <br>
|
||||
<a href="https://returnyoutubedislikeapi.com/votes?videoId=<%=inv_vid.videoId%>">See in json</a>
|
||||
|
||||
|
@ -1594,6 +1667,28 @@ WIP! </a>
|
|||
|
||||
|
||||
<div class="recommended-list" align="center">
|
||||
<% if (universe) { %>
|
||||
|
||||
<% if (k.Video.Channel.Name == "7clouds") { %>
|
||||
<div class="video-title t" style="font-family: 'Edo SZ', sans-serif !important;font-weight:bold;line-break: auto;max-width: max-content;margin: 0;margin-bottom: 0;padding: 0;"
|
||||
<% } %>
|
||||
<% if (k.Video.Channel.Name !== "7clouds") { %>
|
||||
<div class="video-title t" style="font-family:inter;font-weight:bold;line-break: auto;max-width: max-content;margin: 0;margin-bottom: 0;padding: 0;"
|
||||
<% } %>
|
||||
|
||||
<% if (inv_vid?.title !== k.Video.Title) { %>
|
||||
title="Non-Translated title : <%=inv_vid.title%>"
|
||||
<% } %>
|
||||
> <%-k.Video.Title.replace(/\/channel\//g, "/channel?id=").replace(/https:\/\/youtube.com/g, ""); %>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div> <i class="fa-light fa-thumbs-up"></i> <%=convert(engagement.likes)%> || <i class="fa-light fa-thumbs-down"></i> <%=convert(engagement.dislikes)%> </div>
|
||||
|
||||
<% } %>
|
||||
|
||||
<div style="text-align: left;" class="auto-play">
|
||||
<label title="autoplay the next video" for="continue">AutoPlay:</label>
|
||||
<input title="autoplay the next video" name="continue" id="continue" type="checkbox" >
|
||||
|
@ -1653,34 +1748,58 @@ Recommended Videos
|
|||
<% if (!f) { %>
|
||||
|
||||
<% if (inv_vid.recommendedVideos) { %>
|
||||
<%
|
||||
const musicChannels = new Set();
|
||||
inv_vid?.recommendedVideos.forEach(video => {
|
||||
if (video.title.toLowerCase().includes("official video") || video.title.toLowerCase().includes("official music video") || video.title.toLowerCase().includes("official audio")) {
|
||||
musicChannels.add(video.authorId);
|
||||
}
|
||||
});
|
||||
%>
|
||||
|
||||
<% inv_vid?.recommendedVideos.forEach(x => { %>
|
||||
<div class="fade-in video">
|
||||
<% if (!optout) { %><a class="thumbnail" href="/watch?v=<%= x.videoId %>" style="background-image:url(<%- media_proxy_url %>/proxy?url=https://yt.miruku.cafe/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw);border-radius:9.5px" alt="<%= x.Title %>"><span class="video-length"><%- turntomins(x.lengthSeconds) || "LIVE"%></span><% } %><% if (optout) { %><a class="thumbnail"href="/watch?v=<%= x.videoId %>&m=f"style="background-image:url(<%- media_proxy_url %>/proxy?url=https://yt.miruku.cafe/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw);border-radius:9.5px"alt="<%= x.Title %>"><span class="video-length"><%- x.duration || "LIVE"%></span><% } %></a>
|
||||
<div class="fade-in video channel-<%= x.authorId %>">
|
||||
<% if (!optout) { %>
|
||||
<a class="thumbnail" href="/watch?v=<%= x.videoId %>" style="background-image:url(<%- media_proxy_url %>/proxy?url=https://yt.miruku.cafe/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw);border-radius:9.5px" alt="<%= x.Title %>">
|
||||
<span class="video-length"><%- turntomins(x.lengthSeconds) || "LIVE"%></span>
|
||||
<% } %>
|
||||
<% if (optout) { %>
|
||||
<a class="thumbnail" href="/watch?v=<%= x.videoId %>&m=f" style="background-image:url(<%- media_proxy_url %>/proxy?url=https://yt.miruku.cafe/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw);border-radius:9.5px" alt="<%= x.Title %>">
|
||||
<span class="video-length"><%- x.duration || "LIVE"%></span>
|
||||
<% } %>
|
||||
</a>
|
||||
<div class="info">
|
||||
<% if (!optout) { %>
|
||||
<a class="max-lines-2 title" href="/watch?v=<%= x.videoId %>" style="font-stretch:ultra-expanded;font-weight:850" title="<%= x.title %>">
|
||||
<%= x.title %>
|
||||
</a>
|
||||
<% } %>
|
||||
<% if (optout) { %>
|
||||
<a class="max-lines-2 title" href="/watch?v=<%= x.videoId %>&m=f" style="font-stretch:100%;font-weight:800" title="<%= x.Title %>">
|
||||
<%= x.title %>
|
||||
</a>
|
||||
<% } %>
|
||||
<% if (optout) { %>
|
||||
<a class="max-lines-2 title" href="/watch?v=<%= x.videoId %>&m=f" style="font-stretch:100%;font-weight:800" title="<%= x.title %>">
|
||||
<%= x.title %>
|
||||
</a>
|
||||
<% } %>
|
||||
<div>
|
||||
<a class="max-lines-2" href="/channel?id=<%= x.authorId %>@youtube.com" style="-webkit-line-clamp:1;width:12em;word-wrap:break-word">
|
||||
<span>
|
||||
<%= x.author %>
|
||||
<% if (x?.authorVerified) { %>
|
||||
<% if (musicChannels.has(x.authorId)) { %>
|
||||
<i class="fa-light fa-music-note" style="margin-left: 0em;" title="verified artist channel"></i>
|
||||
<% } else { %>
|
||||
<i class="icon ion ion-md-checkmark-circle" style="margin-left: 0em;" title="verified channel"></i>
|
||||
<% } %>
|
||||
<% } %>
|
||||
<div>
|
||||
<a class="max-lines-2" href="/channel?id=<%= x.authorId %>@youtube.com" style="-webkit-line-clamp:1;width:12em;word-wrap:break-word">
|
||||
<span> <%=x.author %> <% if (x?.authorVerified) { %> <i class="icon ion ion-md-checkmark-circle" style="margin-left: 0em;" title="verified channel"></i> <% } %> </span>
|
||||
</a>
|
||||
<div class="video-views">
|
||||
|
||||
<%= convert(x.viewCount) %> views
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
</a>
|
||||
<div class="video-views">
|
||||
<%= convert(x.viewCount) %> views
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<% }) %>
|
||||
</div>
|
||||
<% }) %>
|
||||
|
||||
|
||||
|
||||
<% } %>
|
||||
|
@ -2227,8 +2346,7 @@ a {
|
|||
border-radius: 6px;
|
||||
box-shadow: 0 13em 14em <%=color2%>;
|
||||
filter: blur(5px);
|
||||
transition: opacity 0.2s ease;
|
||||
opacity: 0;
|
||||
opacity: 1;
|
||||
z-index: -1;
|
||||
|
||||
}
|
||||
|
@ -2244,8 +2362,7 @@ a {
|
|||
border-radius: 6px;
|
||||
box-shadow: 0 13em 14em <%=color2%>;
|
||||
filter: blur(5px);
|
||||
transition: opacity 0.2s ease;
|
||||
opacity: 0;
|
||||
opacity: 1;
|
||||
z-index: -1;
|
||||
|
||||
}
|
||||
|
@ -2581,18 +2698,75 @@ font-size: 13px;margin:0;padding:0;white-space: nowrap;
|
|||
</div>
|
||||
<div>
|
||||
|
||||
|
||||
<%
|
||||
const likes = parseInt(engagement.likes) || 0;
|
||||
const dislikes = parseInt(engagement.dislikes) || 0;
|
||||
const total = likes + dislikes;
|
||||
|
||||
const likePercentage = total > 0 ? ((likes / total) * 100).toFixed(2) : 0;
|
||||
const dislikePercentage = total > 0 ? ((dislikes / total) * 100).toFixed(2) : 0;
|
||||
|
||||
const getLikePercentageColor = (percentage) => {
|
||||
if (percentage >= 80) {
|
||||
return 'green';
|
||||
} else if (percentage >= 50) {
|
||||
return 'orange';
|
||||
} else {
|
||||
return 'red';
|
||||
}
|
||||
};
|
||||
|
||||
const getDislikePercentageColor = (percentage) => {
|
||||
if (percentage >= 50) {
|
||||
return 'red';
|
||||
} else if (percentage >= 20) {
|
||||
return 'orange';
|
||||
} else {
|
||||
return 'green';
|
||||
}
|
||||
};
|
||||
|
||||
const likeColor = getLikePercentageColor(likePercentage);
|
||||
const dislikeColor = getDislikePercentageColor(dislikePercentage);
|
||||
|
||||
const userScore = (parseFloat(likePercentage) - parseFloat(dislikePercentage) / 2).toFixed(2);
|
||||
|
||||
const getUserScoreLabel = (score) => {
|
||||
if (score >= 80) {
|
||||
return 'Overwhelmingly Positive';
|
||||
} else if (score >= 60) {
|
||||
return 'Positive';
|
||||
} else if (score >= 40) {
|
||||
return 'Mixed';
|
||||
} else if (score >= 20) {
|
||||
return 'Negative';
|
||||
} else {
|
||||
return 'Overwhelmingly Negative';
|
||||
}
|
||||
};
|
||||
|
||||
const userScoreLabel = getUserScoreLabel(userScore);
|
||||
const userScoreColor = userScore >= 80 ? 'green' : userScore >= 50 ? 'orange' : 'red';
|
||||
%>
|
||||
<div class="nerddd" style="background:#272727;padding: 5px;margin-top: 12px;border-radius: 11px;font-family: 'PokeTube Flex';font-stretch: extra-expanded;font-weight: 700;">
|
||||
<%-String(channelurlfixer(inv_vid.descriptionHtml)).replace(/\n/g, " <br> ").replace(/twitter\.com/g, "twitter.com").replace(/reddit\.com/g, "redlib.matthew.science") %>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="video-title" style="color:var(--text-color);font-family:var(--text-font-primary);;font-weight:var(--text-header-weight);font-stretch: extra-expanded;margin-top: 10px;margin-bottom: 10px;">Rating! :3</div>
|
||||
|
||||
|
||||
|
||||
<br><span style="color: <%= likeColor %>;"><%= likePercentage %>%</span> of the users lieked the video!! <br>
|
||||
<span style="color: <%= dislikeColor %>;"><%= dislikePercentage %>%</span> of the users dislieked the video!! <br>
|
||||
User score: <span style="color: <%= userScoreColor %>;"><%= userScore %></span>- <%= userScoreLabel %><br><br>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="background: #272727;margin-top:10px;border-radius: 11px;">
|
||||
|
||||
|
||||
|
@ -3249,27 +3423,9 @@ function resumeProgress() {
|
|||
}
|
||||
}
|
||||
|
||||
function toggleOpacity() {
|
||||
const element = document.getElementById('shadow'); // Replace 'yourElementId' with the ID of your element
|
||||
const video = document.getElementById('video'); // Assuming your video element has an ID of 'video'
|
||||
const currentOpacity = parseFloat(window.getComputedStyle(element).opacity);
|
||||
|
||||
|
||||
if (video.paused) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (currentOpacity === 1) {
|
||||
element.style.transition = 'opacity 3s ease'; // Adjust the duration as needed
|
||||
element.style.opacity = 0;
|
||||
} else {
|
||||
element.style.transition = 'opacity 3s ease'; // Adjust the duration as needed
|
||||
element.style.opacity = 1;
|
||||
}
|
||||
}
|
||||
|
||||
window.onload = function() {
|
||||
setInterval(toggleOpacity, 1500);
|
||||
};
|
||||
|
||||
|
||||
|
||||
video.addEventListener('timeupdate', () => {
|
||||
|
|
|
@ -451,12 +451,12 @@ 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: 6em;">
|
||||
<div class="video" style="height: 8em;">
|
||||
|
||||
<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>
|
||||
|
|
|
@ -548,10 +548,14 @@ font-weight: 1000;
|
|||
<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>
|
||||
</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="/web?query=<%= x.title %>" style="background: #333;width: 7.6em;border-radius: 18px;height: 2em;width: 13.5em;"><div style="display: flex;">
|
||||
<i class="fa-light fa-search" style="display: flex;font-size: 16px;padding: 5px;border-radius: 18px;margin-left: 2px;"> </i><span style="margin-top: 6px;">Search Title On Web :3</span></div> </a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -17,10 +17,10 @@
|
|||
}
|
||||
],
|
||||
[
|
||||
"poketube.sudovanilla.com",
|
||||
"pt.sudovanilla.org",
|
||||
{
|
||||
"uri": "https://poketube.sudovanilla.com",
|
||||
"CLOUDFLARE": true,
|
||||
"uri": "https://pt.sudovanilla.org",
|
||||
"CLOUDFLARE": false,
|
||||
"piwik": false,
|
||||
"region": "🇺🇸",
|
||||
"software": {
|
||||
|
@ -89,13 +89,13 @@
|
|||
}
|
||||
],
|
||||
[
|
||||
"poke.am1.shiggy.cloud",
|
||||
"poke.uk1.littkai.co.uk",
|
||||
{
|
||||
"uri": "https://poke.am1.shiggy.cloud",
|
||||
"uri": "https://poke.uk1.littkai.co.uk",
|
||||
"CLOUDFLARE": false,
|
||||
"piwik": false,
|
||||
"proxy": false,
|
||||
"region": "🇳🇱",
|
||||
"region": "🇬🇧",
|
||||
"software": {
|
||||
"name": "poke",
|
||||
"version": "latest",
|
||||
|
@ -103,13 +103,13 @@
|
|||
}
|
||||
}
|
||||
], [
|
||||
"poke.am2.shiggy.cloud",
|
||||
"poke.uk2.littlekai.co.uk",
|
||||
{
|
||||
"uri": "https://poke.am2.shiggy.cloud",
|
||||
"uri": "https://poke.uk2.littlekai.co.uk",
|
||||
"CLOUDFLARE": false,
|
||||
"piwik": false,
|
||||
"proxy": false,
|
||||
"region": "🇳🇱",
|
||||
"region": "🇬🇧",
|
||||
"software": {
|
||||
"name": "poke",
|
||||
"version": "latest",
|
||||
|
|
|
@ -73,6 +73,7 @@ const proxy = async (req, res) => {
|
|||
return res.status(400).send("Malformed URL");
|
||||
}
|
||||
|
||||
// Sanity check, to avoid being used as an open proxy
|
||||
if (!URL_WHITELIST.includes(url.host)) {
|
||||
console.log(`==> Refusing to proxy host ${url.host}`);
|
||||
res.status(401).send(`Hostname '${url.host}' is not permitted`);
|
||||
|
|
|
@ -53,6 +53,15 @@ const splash = [
|
|||
"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!",
|
||||
|
@ -73,6 +82,8 @@ const splash = [
|
|||
"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!",
|
||||
"poketube!!!",
|
||||
"rvlt.gg/poke!",
|
||||
|
@ -161,6 +172,7 @@ module.exports = function (app, config, renderTemplate) {
|
|||
|
||||
return renderTemplate(res, req, "landing.ejs", {
|
||||
secure,
|
||||
embedtype:req.query.embedtype,
|
||||
verify,
|
||||
isOldWindows,
|
||||
proxyurl,
|
||||
|
|
|
@ -32,13 +32,13 @@ const cnf = require("../../../config.json");
|
|||
const innertube = require("../libpoketube-youtubei-objects.json");
|
||||
const { exec } = require('child_process');
|
||||
|
||||
const verfull = "v24.0605-VeE-MINOR_UPDATE-stable-dev-nonLTS-git-MTcxNTAwOTczNQ==";
|
||||
const versmol = "v24.0605-vEe"
|
||||
const verfull = "v24.1906-sho-MAJOR_UPDATE-stable-dev-nonLTS-git-MTcxODc5NDY3NQ==";
|
||||
const versmol = "v24.1906-sho"
|
||||
const branch = "dev/master";
|
||||
const codename = "vee";
|
||||
const versionnumber = "291";
|
||||
const relaseunixdate = "MTcxNTAwOTczNQ=="
|
||||
const updatequote = "Love is the ultimate software update; embrace the patches, for they refine the code of our shared existence, hand in hand, heart to heard (unknown)"
|
||||
const codename = "sho";
|
||||
const versionnumber = "293";
|
||||
const relaseunixdate = "MTcxODc5NDY3NQ=="
|
||||
const updatequote = "pls fund vennie plush -Bims"
|
||||
|
||||
|
||||
module.exports = function (app, config, renderTemplate) {
|
||||
|
@ -117,7 +117,7 @@ app.get("/avatars/:v", async function (req, res) {
|
|||
var format = "mp3";
|
||||
}
|
||||
|
||||
const url = `https://tube.kuylar.dev/proxy/media/${v}/${q}`;
|
||||
const url = `https://tube-nightly.kuylar.dev/proxy/media/${v}/${q}`;
|
||||
|
||||
res.redirect(url);
|
||||
});
|
||||
|
@ -181,17 +181,6 @@ app.use("/sb/i/:v/:imagePath/:img", async function (req, res) {
|
|||
} catch {}
|
||||
});
|
||||
|
||||
app.get("/feeds/videos.xml", async (req, res) => {
|
||||
const id = req.query.channel_id;
|
||||
|
||||
let url = `https://youtube.com/feeds/videos.xml?channel_id=${id}`;
|
||||
|
||||
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);
|
||||
|
@ -273,7 +262,7 @@ exec('git rev-list HEAD -n 1 --abbrev-commit', (error, stdout, stderr) => {
|
|||
const { fetch } = await import("undici");
|
||||
|
||||
try {
|
||||
const url = `https://codeberg.org/Ashley/poketube/raw/branch/main/instances.json`;
|
||||
const url = `https://raw.githubusercontent.com/ashley0143/poke/main/instances.json`;
|
||||
|
||||
let f = await fetch(url)
|
||||
.then((res) => res.text())
|
||||
|
|
|
@ -189,9 +189,7 @@ module.exports = function (app, config, renderTemplate) {
|
|||
|
||||
const { fetch } = await import("undici");
|
||||
|
||||
const search = await fetch(
|
||||
`https://4get.sudovanilla.org/api/v1/web?s=${query}`
|
||||
);
|
||||
const search = await fetch(atob("aHR0cHM6Ly9zZWFyY2guc3Vkb3ZhbmlsbGEub3JnL2FwaS92MS93ZWI/cz0=") + query);
|
||||
const web = getJson(await search.text());
|
||||
|
||||
if (req.query.lucky === "true") {
|
||||
|
@ -344,6 +342,8 @@ module.exports = function (app, config, renderTemplate) {
|
|||
return `https://vid.puffyan.us/vi/${video.videoId}/hqdefault.jpg`;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
cache[ID] = {
|
||||
result: {
|
||||
|
@ -372,6 +372,14 @@ module.exports = function (app, config, renderTemplate) {
|
|||
|
||||
|
||||
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
renderTemplate(res, req, "channel.ejs", {
|
||||
ID,
|
||||
|
|
|
@ -210,11 +210,20 @@ module.exports = function (app, config, renderTemplate) {
|
|||
}
|
||||
});
|
||||
|
||||
app.get("/game-hub", function (req, res) {
|
||||
renderTemplate(res, req, "gamehub.ejs", {
|
||||
game: req.query.game,
|
||||
});
|
||||
app.get("/game-hub", function (req, res) {
|
||||
var gameslist = ["pong", "tic-tac-toe", "sudoku", "snake"];
|
||||
var requestedGame = req.query.game;
|
||||
|
||||
if (req.query.game && !gameslist.includes(requestedGame)) {
|
||||
return renderTemplate(res, req, "404.ejs");
|
||||
}
|
||||
|
||||
renderTemplate(res, req, "gamehub.ejs", {
|
||||
game: requestedGame,
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
app.get("/static/:id", (req, res) => {
|
||||
const id = req.params.id;
|
||||
|
||||
|
|
4
videobundler/.env.example
Normal file
4
videobundler/.env.example
Normal file
|
@ -0,0 +1,4 @@
|
|||
TIME_BEFORE_DELETE=30
|
||||
PORT=45872
|
||||
# DO NOT PUT A / AT THE END OF THE URL
|
||||
PROXY_URL=https://eu-proxy.poketube.fun
|
25
videobundler/README.md
Normal file
25
videobundler/README.md
Normal file
|
@ -0,0 +1,25 @@
|
|||
# poke-videobundler
|
||||
|
||||
Takes 2 input streams, downloads them, and spits out a combined file.
|
||||
|
||||
## Installation
|
||||
|
||||
1. Make sure `ffmpeg`, `wget`, 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 flask python-dotenv waitress`.
|
||||
|
||||
## Configuration
|
||||
|
||||
1. Run `mv .env.example .env`, **even if you don't want to configure anything**.
|
||||
2. Edit and fill in the values if needed.
|
||||
|
||||
## 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 the configured port.
|
||||
|
||||
## Endpoints
|
||||
|
||||
- `/`: Will return `{success:true}` if alive.
|
||||
- `/get_merged_video?id=VIDEO_ID&audio_itag=AUDIO_ITAG&video_itag=VIDEO_ITAG`: Returns a merged video. ID is the youtube video ID, and itags are self explanatory.
|
64
videobundler/main.py
Normal file
64
videobundler/main.py
Normal file
|
@ -0,0 +1,64 @@
|
|||
from datetime import datetime
|
||||
from dotenv import load_dotenv
|
||||
from flask import Flask, request, Response, send_file
|
||||
from threading import Thread
|
||||
from time import sleep
|
||||
|
||||
import io
|
||||
import json
|
||||
import os
|
||||
import random
|
||||
import string
|
||||
import subprocess
|
||||
import uuid
|
||||
|
||||
load_dotenv()
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
def autodelete(job_id: str):
|
||||
sleep(os.getenv("TIME_BEFORE_DELETE"))
|
||||
os.remove(f"{job_id}.mp4")
|
||||
os.remove(f"{job_id}.m4a")
|
||||
os.remove(f"output.{job_id}.mp4")
|
||||
|
||||
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
|
||||
|
||||
@app.route("/")
|
||||
def ping():
|
||||
return json.loads("""
|
||||
{
|
||||
"success": true
|
||||
}
|
||||
""")
|
||||
|
||||
@app.route("/get_merged_video")
|
||||
def get_merged_video():
|
||||
pwd = os.getcwd()
|
||||
video_id = request.args.get("id")
|
||||
job_id = get_random_string(10)
|
||||
audio_itag = request.args.get("audio_itag")
|
||||
video_itag = request.args.get("video_itag")
|
||||
# Download both audio and video
|
||||
subprocess.run(["wget", f"-O{job_id}.m4a", f"{os.getenv("PROXY_URL")}/latest_version?id={video_id}&itag={audio_itag}&local=true"], check=True)
|
||||
subprocess.run(["wget", f"-O{job_id}.mp4", f"{os.getenv("PROXY_URL")}/latest_version?id={video_id}&itag={video_itag}&local=true"], check=True)
|
||||
# Merge both files
|
||||
subprocess.run(f"ffmpeg -i {pwd}/{job_id}.m4a -i {pwd}/{job_id}.mp4 -c copy {pwd}/output.{job_id}.mp4", shell=True, check=True)
|
||||
thread = Thread(target=autodelete, args = (job_id, ))
|
||||
thread.start()
|
||||
with open(f"output.{job_id}.mp4", "rb") as bytes:
|
||||
return send_file(
|
||||
io.BytesIO(bytes.read()),
|
||||
mimetype="video/mp4",
|
||||
download_name=f"output.{job_id}.mp4",
|
||||
as_attachment=True
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
from waitress import serve
|
||||
serve(app, host="0.0.0.0", port=os.getenv("PORT"))
|
Loading…
Reference in a new issue