1
Fork 0

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:
Korbs 2024-06-23 07:57:23 +00:00
commit cf7cf98dd5
22 changed files with 465 additions and 267 deletions

View file

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

213
README.md
View file

@ -1,176 +1,87 @@
<h1 align="center"> <h1 align="center">
<a href="https://poketube.fun/watch?v=9sJUDx7iEJw&quality=medium&=sjohgteojgytrueugtye4jhtytjrjnyıı"> <a href="https://poketube.fun/watch?v=9sJUDx7iEJw&quality=medium&=sjohgteojgytrueugtye4jhtytjrjnyıı">
<img src="https://poketube.fun/css/logo-poke.svg" width="400"> <img src="https://poketube.fun/css/logo-poke.svg" width="400">
<a href="http://www.defectivebydesign.org/drm-free"> </a>
<img src="https://static.fsf.org/dbd/label/DRM-free%20label%20120.en.png" <a href="http://www.defectivebydesign.org/drm-free">
alt="DefectiveByDesign.org" <img src="https://static.fsf.org/dbd/label/DRM-free%20label%20120.en.png"
width="65" height="65" border="0" align="middle" /></a> alt="DRM Free" width="65" height="65" border="0" align="middle" />
</a> </a>
<p>The Ultimate Privacy App</p> <p>PRIVACY APP OF YOUR DREAMS! :3</p>
</h1> </h1>
<div align="center">
<span> Be Anonymous watching epic videos, searching thingys on the interwebs and listening to music on poke - the free privacy front end!</span>
<span>"Since you work on poke, Are you in touch with its lead developer "Jose marchasi"? <br>
-RMS
Stallman though poke was GNU poke lmaoooo
</span>
</div>
<div align="center"> <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)&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[Features](#features)&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[No non-free codec needed](#no-non-free-codec-needed-3)&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[Hosting Poke~](#hosting-poketube)&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[Poke community!](#poketube-community)&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[The Legal Stuff (boring tbh)](#the-legal-stuff-boring-tbh) <div align="center">
<a href="#welcome">Welcome!</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#features">Features</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#no-non-free-codec-needed">No Non-Free Codec</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#hosting-poke">Hosting</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#poke-community">Community</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#legal">Legal</a>
<a href="https://status.poketube.fun" target="_blank"> <br><br>
<img <a href="https://status.poketube.fun" target="_blank">
width="170" <img width="170" src="https://api.netweak.com/status-badges/K2LY9" alt="Status Badge"/>
src="https://api.netweak.com/status-badges/K2LY9" </a>
alt="Netweak status badge" <img src="https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg" alt="Stand with Ukraine">
/> <a href="./LICENSE">
</a><br> <img src="https://img.shields.io/badge/License-GPL--3-FF6666" alt="GPL-3 License">
<a href="https://tosdr.org/en/service/7114"> </a>
<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> </div>
![Preview](./css/README_Preview.png) ![Preview](./css/README_Preview.png)
## Welcome! ## Welcome!
This is the source code of Poke (formerly PokeTube), the privacy-friendly youtube front-end built with the InnerTube API! Welcome to Poke (formerly PokeTube), the privacy-friendly YouTube front-end built with the 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> ## No Non-Free Codec Needed
Customize Poketube However you want :3
<h3>Accounts </h3> Poke uses OpenH264, which is free software! No non-free components included :3 View the source code of OpenH264 [here](https://github.com/cisco/openh264.git). Because who wants to deal with non-free stuff? Not us!~
Suscribe (yes Suscribe hehe sussy baka) to whaever channel you want!
<h3>Web Search </h3> ## Hosting Poke
Search the web privatly on poketube :3
<br> ### NodeJS
<h3>And... </h3>
<p>
Ambient mode, HQ audio And Even more!!!!!
</p>
## Written by humans - not gpt 1. **Install Packages**
poke is made by hard-working hoomans - not gpt :3<br> - Fedora/RHEL: `$ sudo dnf install git make gcc libcurl nodejs python libcurl4 g++`
<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> - 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 1. **Create Directory**
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 - `$ mkdir poketube && cd poketube`
### With NodeJS 2. **Download Config**
To self host your own Poke instance, you'll need some packages installed on your GNU/Linux install. - `$ curl -O https://codeberg.org/Ashley/poke/raw/branch/main/docker-compose.yml`
<details> 3. **Run PokeTube**
<summary>For Fedora/RHEL/Rocky/CentOS</summary> - `$ docker compose up -d`
<br/>
``` Congrats! PokeTube should now be running on `localhost:6003`! 🎉
sudo dnf install git make gcc libcurl nodejs python libcurl4 g++
```
</details> ## Poke Community
<details> Join us on [Revolt](https://rvlt.gg/poketube) or [Matrix](https://matrix.to/#/#poke:vern.cc)! I promise we're cool! <3
<summary>For Debian/Ubuntu</summary>
<br/>
```
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 Legal Stuff (boring tbh)
the main parts of the project is Under GPL-3.0-OR-LATER :3 the main parts of the project is Under GPL-3.0-OR-LATER :3
@ -178,18 +89,22 @@ the main parts of the project is Under GPL-3.0-OR-LATER :3
see the each sections LICENSE tho!! see the each sections LICENSE tho!!
Copyleft 2021-202x Poke Project Copyleft 2021-202x Poke Project
[Code Of conduct](https://codeberg.org/Ashley/poke/src/branch/main/CODE_OF_CONDUCT.md) [Code Of conduct](https://codeberg.org/Ashley/poke/src/branch/main/CODE_OF_CONDUCT.md)
[Privacy Policy](https://poketube.fun/privacy) [Privacy Policy](https://poketube.fun/privacy)
TL;DR: we dont collect or share your personal info, that's it lol. TL;DR: we dont collect or share your personal info, that's it lol.
We additionally use the GNU Coding Standard, see [this link.](https://www.gnu.org/prep/standards) We use the GNU Coding Standard Thingy, see [this link.](https://www.gnu.org/prep/standards)
<div>
<h3>some parts of poketube.fun is proudly hosted on glitch.com since <i>2020</i> </h3>
<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

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
css/red-tape.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

View file

@ -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) # To run, please do either docker compose up -d (for docker's own version) or docker-compose up -d (for your OSes package managers verison)
services: services:
poketube: 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 restart: unless-stopped
volumes: volumes:
- ./config.json:/poketube/config.json - ./config.json:/poketube/config.json

View file

@ -327,7 +327,9 @@ margin-left: auto;
background: var(--not-quite-black); background: var(--not-quite-black);
text-decoration: none; text-decoration: none;
border-radius: 1em; border-radius: 1em;
} </style> }
</style>
<style> <style>
@ -413,12 +415,10 @@ border:solid;
<div class="channel-page" > <div class="channel-page" >
<audio id="audio" style="display:none;" loop autoplay></audio> <audio id="audio" style="display:none;" loop autoplay></audio>
<img src="https://t.poketube.fun/t/rep.gif" style="width: 0;visibility: hidden;display:none;" id="discover_main">
<h1 style="font-size: 2em;margin-left: auto;margin-right: auto;text-align: center;font-family: poketube flex;font-weight: 1000;font-stretch: ultra-expanded;color: #fff;margin-bottom: 7px;margin-top: 31px;"> <h1 style="font-size: 2em;margin-left: auto;margin-right: auto;text-align: center;font-family: poketube flex;font-weight: 1000;font-stretch: ultra-expanded;color: #fff;margin-bottom: 7px;margin-top: 31px;">
Discover Popular videos on poketube! Popular Videos On Poke :3 </h1>
</h1>
<% if (!tab) { %> <% if (!tab) { %>
<div class="tabs tabs-center"> <div class="tabs tabs-center">
@ -492,9 +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 => { %> <% 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="thumbnail" style="background-image: url('/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw');border-radius: 10px;"><span class="video-length"><%- turntomins(x.lengthSeconds) %></span></div>
<div class="info"> <div class="info">
<span class="title max-lines-2" title="<%- x.title %>" style="font-family:Inter,sans-serif;"><%- x.title %></span> <span class="title max-lines-2" title="<%- x.title %>" style="font-family:Inter,sans-serif;"><%- x.title %></span>
@ -506,7 +506,7 @@ Discover Popular videos on poketube!
<% }) %> <% }) %>
<p>u reached the end.... :sob: </p>
</div> </div>

View file

@ -139,7 +139,7 @@
</a> </a>
</div> </div>
</div> </div>
<script src="/static/data-mobile.js"></script <script src="/static/data-mobile.js"></script>
</body> </body>
</html> </html>
<% } %> <% } %>

View file

@ -34,11 +34,19 @@
<link rel="manifest" href="/manifest.json"> <link rel="manifest" href="/manifest.json">
<meta name="darkreader-lock"> <!-- tells dark reader that the site has a dark theme and to turn itself off --> <meta name="darkreader-lock"> <!-- tells dark reader that the site has a dark theme and to turn itself off -->
<meta content="▶▶ Poke - The privacy app of your dreams!" property=og:title> <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!!!" <% if(embedtype === "woke") { %>
property=twitter:description> <meta content="Poke is a 𝔀𝓸𝓴𝓮 software YouTube front-end, search engine, translator, 𝔀𝓸𝓴𝓮 app, and even 𝔀𝓸𝓴𝓮!! Watch 𝔀𝓸𝓴𝓮 videos, search the internet, and do all of that and more 𝔀𝓸𝓴𝓮 in this all-in-one 𝔀𝓸𝓴𝓮 app!!!"
<meta property="twitter:description">
content="https://cdn.glitch.global/302c6ee0-629f-453b-9024-bad1f8d7be36/poke.png?v=1716216428745" <meta content="https://cdn.glitch.global/302c6ee0-629f-453b-9024-bad1f8d7be36/9fhFiXJ.png?v=1717357642758"
property="og:image" /> property="og:image">
<% } else { %>
<meta content="Poke is a free software YouTube front-end, search engine, translator, map app, and more!! Watch silly videos, search the internet, and do all of that and more anonymously in this all-in-one privacy app!!!"
property="twitter:description">
<meta content="https://cdn.glitch.global/302c6ee0-629f-453b-9024-bad1f8d7be36/poke.png?v=1716216428745"
property="og:image">
<% } %>
<meta content="summary_large_image" name="twitter:card" /> <meta content="summary_large_image" name="twitter:card" />
<% if(isOldWindows) { %> <% if(isOldWindows) { %>
<style> <style>
@ -174,9 +182,9 @@
actions='true', actions='true',
has_secondary_action='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_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='Revolt', secondary_text='Discord',
secondary_link='https://rvlt.gg/poketube', 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_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_text='Matrix',

View file

@ -24,9 +24,10 @@
<header> <header>
<div class="header-content"> <div class="header-content">
<div class="header-start"> <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"/> <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> </a>
</div> </div>
<div class="header-center"> <div class="header-center">

View file

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

View file

@ -54,7 +54,7 @@
<link href="/css/yt-ukraine.svg?v=3" rel=icon> <link href="/css/yt-ukraine.svg?v=3" rel=icon>
<link rel="manifest" href="/manifest.json"> <link rel="manifest" href="/manifest.json">
<link href=/css/snow.css rel=stylesheet> <link href=/css/snow.css rel=stylesheet>
<title> <%=inv_vid.title%> | PokeTube </title> <title> <%=inv_vid.title%> | Watch </title>
<style> <style>
.comments-area { .comments-area {
background: #f1f9ff; background: #f1f9ff;
@ -929,6 +929,10 @@ Source Code
<a href="/privacy" style="text-decoration: none;color:#fff;" class="dropdown__item"> <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> <i style="width: 16px;height: 17px;margin-left: -1px;" class="fa-light fa-shield"></i>
Privacy 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> </a>
</div> </div>
</div> </div>
@ -1001,7 +1005,11 @@ Privacy
<a href="https://codeberg.org/ashley/poke/src/branch/main/fix-videoplayback-issues.md" style="color: #fff;"> <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> <i class="fa-light fa-info-circle"></i> Having issues?</a>
</div> </div>
<div >
<a href="https://discord.poketube.fun" style="color: #fff;">
<i class="fa-brands fa-discord"></i> Discord Server</a>
</div>
</div> </div>
@ -1137,7 +1145,15 @@ Privacy
</div> </div>
</div> </div>
<div class="video-info" > <div class="video-info" >
<% if (universe) { %>
<div class="video-info-panel gradient" style="display:none;">
<% } %>
<% if (!universe) { %>
<div class="video-info-panel gradient"> <div class="video-info-panel gradient">
<% } %>
<% if (k.Video.Channel.Name == "7clouds") { %> <% 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;" <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> Date of upload: <%=date%> ^^ <br>
<hr style="clear: both;display: none;border: none;border-bottom: 0.5px solid #2f2f2f;/*! width: 4.5em; */height: 0;"> <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> 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> RYD date created : <%=engagement.dateCreated.toLocaleString()%> <br>
<a href="https://returnyoutubedislikeapi.com/votes?videoId=<%=inv_vid.videoId%>">See in json</a> <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"> <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"> <div style="text-align: left;" class="auto-play">
<label title="autoplay the next video" for="continue">AutoPlay:</label> <label title="autoplay the next video" for="continue">AutoPlay:</label>
<input title="autoplay the next video" name="continue" id="continue" type="checkbox" > <input title="autoplay the next video" name="continue" id="continue" type="checkbox" >
@ -1653,34 +1748,58 @@ Recommended Videos
<% if (!f) { %> <% if (!f) { %>
<% if (inv_vid.recommendedVideos) { %> <% 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 => { %> <% inv_vid?.recommendedVideos.forEach(x => { %>
<div class="fade-in video"> <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> <% 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"> <div class="info">
<% if (!optout) { %> <% if (!optout) { %>
<a class="max-lines-2 title" href="/watch?v=<%= x.videoId %>" style="font-stretch:ultra-expanded;font-weight:850" title="<%= x.title %>"> <a class="max-lines-2 title" href="/watch?v=<%= x.videoId %>" style="font-stretch:ultra-expanded;font-weight:850" title="<%= x.title %>">
<%= x.title %> <%= x.title %>
</a> </a>
<% } %> <% } %>
<% if (optout) { %> <% 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 %>"> <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 %> <%= x.title %>
</a> </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> </span>
<a class="max-lines-2" href="/channel?id=<%= x.authorId %>@youtube.com" style="-webkit-line-clamp:1;width:12em;word-wrap:break-word"> </a>
<span> <%=x.author %> <% if (x?.authorVerified) { %> <i class="icon ion ion-md-checkmark-circle" style="margin-left: 0em;" title="verified channel"></i> <% } %> </span> <div class="video-views">
</a> <%= convert(x.viewCount) %> views
<div class="video-views"> </div>
</div>
<%= convert(x.viewCount) %> views
</div>
</div>
</div> </div>
</div> </div>
<% }) %> <% }) %>
<% } %> <% } %>
@ -2227,8 +2346,7 @@ a {
border-radius: 6px; border-radius: 6px;
box-shadow: 0 13em 14em <%=color2%>; box-shadow: 0 13em 14em <%=color2%>;
filter: blur(5px); filter: blur(5px);
transition: opacity 0.2s ease; opacity: 1;
opacity: 0;
z-index: -1; z-index: -1;
} }
@ -2244,8 +2362,7 @@ a {
border-radius: 6px; border-radius: 6px;
box-shadow: 0 13em 14em <%=color2%>; box-shadow: 0 13em 14em <%=color2%>;
filter: blur(5px); filter: blur(5px);
transition: opacity 0.2s ease; opacity: 1;
opacity: 0;
z-index: -1; z-index: -1;
} }
@ -2581,18 +2698,75 @@ font-size: 13px;margin:0;padding:0;white-space: nowrap;
</div> </div>
<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;"> <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") %> <%-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>
<div style="background: #272727;margin-top:10px;border-radius: 11px;"> <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', () => { video.addEventListener('timeupdate', () => {

View file

@ -451,12 +451,12 @@ Web
</div> </div>
<p style="margin-top: -21px;margin-left: 62em;font-family: &quot;Poketube flex&quot;;color: #ffacbb;display: flex;flex-direction: row;gap: 5px;">Powered by <a href="https://ark.sudovanilla.org/Korbs/NarviSearch">NarviSearch ! :3</a> </p>
</div> </div>
<div class="video-list" > <div class="video-list" >
<% results.forEach(x => { %> <% results.forEach(x => { %>
<div class="video" style="height: 6em;"> <div class="video" style="height: 8em;">
<a style="min-width: 81em;" href="<%= x.url %>"><%= x.title %></a><br> <a style="min-width: 81em;" href="<%= x.url %>"><%= x.title %></a><br>
<p style="color:gray;display: flex;flex-direction: column;width: 48em;margin-top: -8em;"><%= x.url %><br> <p style="color:gray;display: flex;flex-direction: column;width: 48em;margin-top: -8em;"><%= x.url %><br>

View file

@ -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="/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) { %> <a href="/channel?id=<%= x.authorId %>"><%=x.author %><% if (x?.authorVerified) { %>
<i class="icon ion ion-md-checkmark-circle" title="verified channel"></i><% } %> <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;"> <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> <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> </div>
</div> </div>

View file

@ -17,10 +17,10 @@
} }
], ],
[ [
"poketube.sudovanilla.com", "pt.sudovanilla.org",
{ {
"uri": "https://poketube.sudovanilla.com", "uri": "https://pt.sudovanilla.org",
"CLOUDFLARE": true, "CLOUDFLARE": false,
"piwik": false, "piwik": false,
"region": "🇺🇸", "region": "🇺🇸",
"software": { "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, "CLOUDFLARE": false,
"piwik": false, "piwik": false,
"proxy": false, "proxy": false,
"region": "🇳🇱", "region": "🇬🇧",
"software": { "software": {
"name": "poke", "name": "poke",
"version": "latest", "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, "CLOUDFLARE": false,
"piwik": false, "piwik": false,
"proxy": false, "proxy": false,
"region": "🇳🇱", "region": "🇬🇧",
"software": { "software": {
"name": "poke", "name": "poke",
"version": "latest", "version": "latest",

View file

@ -73,6 +73,7 @@ const proxy = async (req, res) => {
return res.status(400).send("Malformed URL"); return res.status(400).send("Malformed URL");
} }
// Sanity check, to avoid being used as an open proxy
if (!URL_WHITELIST.includes(url.host)) { if (!URL_WHITELIST.includes(url.host)) {
console.log(`==> Refusing to proxy host ${url.host}`); console.log(`==> Refusing to proxy host ${url.host}`);
res.status(401).send(`Hostname '${url.host}' is not permitted`); res.status(401).send(`Hostname '${url.host}' is not permitted`);

View file

@ -53,6 +53,15 @@ const splash = [
"we come for you!", "we come for you!",
"no chances!", "no chances!",
"dema dont control us!", "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!", "im fairly local!",
"i dont wanna go like this!", "i dont wanna go like this!",
"east is up!", "east is up!",
@ -73,6 +82,8 @@ const splash = [
"o7 keons", "o7 keons",
"at least let me clean my room", "at least let me clean my room",
"100+ stars on gh!", "100+ stars on gh!",
"let the vibe slide over me!",
"sip a capri sun like its don peregon",
"now even gayer!", "now even gayer!",
"poketube!!!", "poketube!!!",
"rvlt.gg/poke!", "rvlt.gg/poke!",
@ -161,6 +172,7 @@ module.exports = function (app, config, renderTemplate) {
return renderTemplate(res, req, "landing.ejs", { return renderTemplate(res, req, "landing.ejs", {
secure, secure,
embedtype:req.query.embedtype,
verify, verify,
isOldWindows, isOldWindows,
proxyurl, proxyurl,

View file

@ -32,13 +32,13 @@ const cnf = require("../../../config.json");
const innertube = require("../libpoketube-youtubei-objects.json"); const innertube = require("../libpoketube-youtubei-objects.json");
const { exec } = require('child_process'); const { exec } = require('child_process');
const verfull = "v24.0605-VeE-MINOR_UPDATE-stable-dev-nonLTS-git-MTcxNTAwOTczNQ=="; const verfull = "v24.1906-sho-MAJOR_UPDATE-stable-dev-nonLTS-git-MTcxODc5NDY3NQ==";
const versmol = "v24.0605-vEe" const versmol = "v24.1906-sho"
const branch = "dev/master"; const branch = "dev/master";
const codename = "vee"; const codename = "sho";
const versionnumber = "291"; const versionnumber = "293";
const relaseunixdate = "MTcxNTAwOTczNQ==" const relaseunixdate = "MTcxODc5NDY3NQ=="
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 updatequote = "pls fund vennie plush -Bims"
module.exports = function (app, config, renderTemplate) { module.exports = function (app, config, renderTemplate) {
@ -117,7 +117,7 @@ app.get("/avatars/:v", async function (req, res) {
var format = "mp3"; 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); res.redirect(url);
}); });
@ -181,17 +181,6 @@ app.use("/sb/i/:v/:imagePath/:img", async function (req, res) {
} catch {} } 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) => { app.get("/api/redirect", async (req, res) => {
const red_url = atob(req.query.u); 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"); const { fetch } = await import("undici");
try { try {
const url = `https://codeberg.org/Ashley/poketube/raw/branch/main/instances.json`; const url = `https://raw.githubusercontent.com/ashley0143/poke/main/instances.json`;
let f = await fetch(url) let f = await fetch(url)
.then((res) => res.text()) .then((res) => res.text())

View file

@ -189,9 +189,7 @@ module.exports = function (app, config, renderTemplate) {
const { fetch } = await import("undici"); const { fetch } = await import("undici");
const search = await fetch( const search = await fetch(atob("aHR0cHM6Ly9zZWFyY2guc3Vkb3ZhbmlsbGEub3JnL2FwaS92MS93ZWI/cz0=") + query);
`https://4get.sudovanilla.org/api/v1/web?s=${query}`
);
const web = getJson(await search.text()); const web = getJson(await search.text());
if (req.query.lucky === "true") { 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`; return `https://vid.puffyan.us/vi/${video.videoId}/hqdefault.jpg`;
} }
} }
cache[ID] = { cache[ID] = {
result: { 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", { renderTemplate(res, req, "channel.ejs", {
ID, ID,

View file

@ -210,11 +210,20 @@ module.exports = function (app, config, renderTemplate) {
} }
}); });
app.get("/game-hub", function (req, res) { app.get("/game-hub", function (req, res) {
renderTemplate(res, req, "gamehub.ejs", { var gameslist = ["pong", "tic-tac-toe", "sudoku", "snake"];
game: req.query.game, var requestedGame = req.query.game;
});
if (req.query.game && !gameslist.includes(requestedGame)) {
return renderTemplate(res, req, "404.ejs");
}
renderTemplate(res, req, "gamehub.ejs", {
game: requestedGame,
}); });
});
app.get("/static/:id", (req, res) => { app.get("/static/:id", (req, res) => {
const id = req.params.id; const id = req.params.id;

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