Emergency Update: Pineapple Express += 2 (1.1.2)

This commit is contained in:
rainbownapkin 2024-10-12 08:01:30 -04:00
parent 05f0eb0048
commit 1cdf5f8ab9
10 changed files with 2083 additions and 983 deletions

View file

@ -1,4 +1,4 @@
fore.st - Pineapple Express++ (v1.1.1) fore.st - Pineapple Express += 2 (v1.1.2)
====== ======
fore.st is the server software for ourfore.st, a community based chat & synced video embedding site tailored to service fore.st is the server software for ourfore.st, a community based chat & synced video embedding site tailored to service
@ -24,44 +24,8 @@ You can reach out by bugging rainbownapkin on the ttn discord or ourfore.st, you
- Thanks to calzoneman for making [cytube](https://github.com/calzoneman/sync), that saved our asses. - Thanks to calzoneman for making [cytube](https://github.com/calzoneman/sync), that saved our asses.
- Thanks to the core TTN community and everyone else who's ever used it, I was only there for the last handful of years but it was an absolute fuckin' ride. You guys are the best, it isn't TTN but I hope this at least help fills the gap. - Thanks to the core TTN community and everyone else who's ever used it, I was only there for the last handful of years but it was an absolute fuckin' ride. You guys are the best, it isn't TTN but I hope this at least help fills the gap.
## Pineapple Express++ 1.1.1 Release Notes ## Pineapple Express += 2 1.1.2 Release Notes
Abriged Patchnotes: - Fixed busted video providers with YT-DLP integration (youtube/dailymotion)
- bugfixes/QoL tweaks
- remove duplicated blazem from tokefile
- fix playlist on submit channel for standard users
- only show nested menu on playlist if user rank is <= 2
- show "playlist" button for users rank 1 on r/submit channel
- stop tokebot from including full toke messages
- fully disconnect/kick unregistered users from channels connect
- limit words/link display text(DO NOT MODIFY LINK HREF) to 40 chars to prevent breaking chat width
- limit image embed width
- fix video/chat/autobump UI components not expanding after collapsing in chromium based browsers
- remove close playlist button when legacy playlist is disabled
- fix expand/shade playlist items button
- add end date to playlist items
- userlist collapse/expand persistent accross browser sessions
- cinema mode persistent accross browser sessions
- dissapearing server whispers/join messages
- fix input field lengths in quicksettings
- prevent temporary items on submit channel
- always block anonymous user (ignore channel setting)
- use regex for whitespace detection in commands
- client side commands
- process commands that start with "/" or "(whitespace)/" in the browser
- allow admins to trigger client side commands remotely
- show words that start with "/" as a link that chatsmacks command(similiar to behavior with words that start with !)
- /thunder
- Disable lightning (seizure prevention)
- update tab completion
- add non-toke server-side commands to tab completion(check perms for respective commands)
- add client-side commands to tab completion
- show autocomplete in text box
- kick users w/ old client
- spooktober themes
## License ## License
Original fore.st code is provided under the Affero General Public License v3 in order to prevent fore.st being used in proprietary software. Original fore.st code is provided under the Affero General Public License v3 in order to prevent fore.st being used in proprietary software.

2769
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{ {
"name": "fore.st", "name": "fore.st",
"version": "1.1.1", "version": "1.1.2",
"description": "fore.st: A fork of cytube tailored for the TTN Community", "description": "fore.st: A fork of cytube tailored for the TTN Community",
"main": "index.js", "main": "index.js",
"directories": { "directories": {
@ -23,7 +23,7 @@
"express": "^4.17.1", "express": "^4.17.1",
"express-minify": "^1.0.0", "express-minify": "^1.0.0",
"json-typecheck": "^0.1.3", "json-typecheck": "^0.1.3",
"knex": "^0.95.2", "knex": "^3.1.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"morgan": "^1.10.0", "morgan": "^1.10.0",
"mysql": "^2.18.1", "mysql": "^2.18.1",
@ -38,7 +38,8 @@
"source-map-support": "^0.5.19", "source-map-support": "^0.5.19",
"toml": "^3.0.0", "toml": "^3.0.0",
"uuid": "^8.3.2", "uuid": "^8.3.2",
"yamljs": "^0.2.8" "yamljs": "^0.2.8",
"youtube-dl-exec": "^3.0.10"
}, },
"scripts": { "scripts": {
"build-server": "babel -D --source-maps --out-dir lib/ src/", "build-server": "babel -D --source-maps --out-dir lib/ src/",

View file

@ -1,60 +1,2 @@
dev goals for 1.1.1 pineapple express++: dev goals for 1.1.2 pineapple Express += 2:
--Fix broken video providers (dailymotion/youtube)
- bugfixes/QoL tweaks
- remove duplicated blazem from tokefile
- fix playlist on submit channel for standard users
- only show nested menu on playlist if user rank is <= 2
- show "playlist" button for users rank 1 on r/submit channel
- stop tokebot from including full toke messages
- fully disconnect/kick unregistered users from channels connect
- limit words/link display text(DO NOT MODIFY LINK HREF) to 40 chars to prevent breaking chat width
- limit image embed width
- fix video/chat/autobump UI components not expanding after collapsing in chromium based browsers
- remove close playlist button when legacy playlist is disabled
- fix expand/shade playlist items button
- add end date to playlist items
- userlist collapse/expand persistent accross browser sessions
- cinema mode persistent accross browser sessions
- dissapearing server whispers/join messages
- fix input field lengths in quicksettings
- prevent temporary items on submit channel
- always block anonymous user (ignore channel setting)
- use regex for whitespace detection in commands
- client side commands
- process commands that start with "/" or "(whitespace)/" in the browser
- allow admins to trigger client side commands remotely
- remove / from client command when calling sendcmd if present
- do not send command as chat (unless it starts with whitespace, matching serverside command behavior)
- show words that start with "/" as a link that chatsmacks command(similiar to behavior with words that start with !)
- /thunder
- Disable lightning (seizure prevention)
- update tab completion
- add non-toke server-side commands to tab completion(check perms for respective commands)
- me
- announce
- af
- sp
- afk
- poll
- hpoll
- mute
- smute
- unmute
- kick
- ban
- ipban
- clear
- clean
- cleantitle
- sendcmd
- add client-side commands to tab completion
- show autocomplete in text box
- send clientside version on connect
- kick if version old/not received
- spooktober themes
- Candycorn
- Candycorn lite

View file

@ -1289,11 +1289,16 @@ PlaylistModule.prototype.startPlayback = function (time) {
} }
if(self.current.media.type == "yt"){//if its yt if(self.current.media.type == "yt"){//if its yt
InfoGetter.getYTRaw(self.current.media.id,function(url){//get raw link from invidious api InfoGetter.getRawCopy(self.current.media.id,function(url){//get raw link from invidious api
self.current.media.meta.rawLink = url;//set to meta self.current.media.meta.rawLink = url;//set to meta
self.sendChangeMedia(self.channel.users);//fuggin SEND IT self.sendChangeMedia(self.channel.users);//fuggin SEND IT
}); });
}else if(self.current.media.type == "dm"){
InfoGetter.getRawCopy(`https://dailymotion.com/video/${self.current.media.id}`,function(url){//get raw link from invidious api
self.current.media.meta.rawLink = url;//set to meta
self.sendChangeMedia(self.channel.users);//fuggin SEND IT
});
}else{ }else{
self.sendChangeMedia(self.channel.users); self.sendChangeMedia(self.channel.users);
} }

View file

@ -49,6 +49,8 @@ const Vimeo = require("@cytube/mediaquery/lib/provider/vimeo");
const Streamable = require("@cytube/mediaquery/lib/provider/streamable"); const Streamable = require("@cytube/mediaquery/lib/provider/streamable");
const TwitchVOD = require("@cytube/mediaquery/lib/provider/twitch-vod"); const TwitchVOD = require("@cytube/mediaquery/lib/provider/twitch-vod");
const TwitchClip = require("@cytube/mediaquery/lib/provider/twitch-clip"); const TwitchClip = require("@cytube/mediaquery/lib/provider/twitch-clip");
const YTDLP = require('youtube-dl-exec');
import { Counter } from 'prom-client'; import { Counter } from 'prom-client';
import { lookup as lookupCustomMetadata } from './custom-media'; import { lookup as lookupCustomMetadata } from './custom-media';
@ -111,7 +113,7 @@ function getBlocked(reg){
var Getters = { var Getters = {
/* youtube.com */ /* youtube.com */
yt: function (id, callback) { yt: async function (id, callback) {
if(!Config.get("invidious-backend")){//legacy youtube backend (fucking yicky) if(!Config.get("invidious-backend")){//legacy youtube backend (fucking yicky)
if (!Config.get("youtube-v3-key")) { if (!Config.get("youtube-v3-key")) {
@ -134,8 +136,29 @@ var Getters = {
}).catch(function (err) { }).catch(function (err) {
callback(err.message || err, null); callback(err.message || err, null);
}); });
}else{//invidious api calls (google bad) }else{
var options = { //yt-dlp calls (google bad)
try{
var video = await YTDLP(id,{
dumpSingleJson: true,
}
)
var meta = {
ytRating: video.like_count
}
var media = new Media(video.id, video.title, video.duration, "yt", meta);
callback(false, media);
}catch(err){
callback(err.message || err, null);
}
//callback("test funciton, remove this call!" || err, null);
//invidious api calls (o7 Stream on, you magnificent bastard. We'll always remember you! <3 2018-2014)
/*var options = {
host: Config.get("invidious-source"), host: Config.get("invidious-source"),
port: 443, port: 443,
path: "/api/v1/videos/" + id, path: "/api/v1/videos/" + id,
@ -161,13 +184,13 @@ var Getters = {
var media = new Media(vid.videoId, vid.title, vid.lengthSeconds, "yt", meta); var media = new Media(vid.videoId, vid.title, vid.lengthSeconds, "yt", meta);
return callback(false, media); return callback(false, media);
}); });*/
} }
}, },
/* youtube.com playlists */ /* youtube.com playlists */
yp: function (id, callback) { yp: async function (id, callback) {
if(!Config.get("invidious-backend")){//legacy youtube backend (fucking yicky) if(!Config.get("invidious-backend")){//legacy youtube backend (fucking yicky)
if (!Config.get("youtube-v3-key")) { if (!Config.get("youtube-v3-key")) {
return callback("The YouTube API now requires an API key. You could sign up for an API key, but you're a lot better off using the invidious backend!" + return callback("The YouTube API now requires an API key. You could sign up for an API key, but you're a lot better off using the invidious backend!" +
@ -188,7 +211,34 @@ var Getters = {
}).catch(function (err) { }).catch(function (err) {
callback(err.message || err, null); callback(err.message || err, null);
}); });
}else{//invidious api calls (google bad) }else{//yt-dlp wrapper calls (google bad)
try{
var list = await YTDLP(id,{
dumpSingleJson: true,
}
);
var videos = new Array;
list.entries.forEach(function(video){
if(video != null){
var meta = {
ytRating: video.like_count
}
videos.push(new Media(video.id, video.title, video.duration, "yt", meta));
}
});
console.log(videos);
callback(null, videos);
}catch(err){
callback(err.message || err, null);
}
/*invidious api calls (o7 RIP 2018-2024)
var options = { var options = {
host: Config.get("invidious-source"), host: Config.get("invidious-source"),
port: 443, port: 443,
@ -209,12 +259,12 @@ var Getters = {
}); });
return callback(null, vids); return callback(null, vids);
}); });*/
} }
}, },
/* youtube.com search */ /* youtube.com search */
ytSearch: function (query, callback) { ytSearch: async function (query, callback) {
if(!Config.get("invidious-backend")){//legacy youtube backend (fucking yicky) if(!Config.get("invidious-backend")){//legacy youtube backend (fucking yicky)
if (!Config.get("youtube-v3-key")) { if (!Config.get("youtube-v3-key")) {
@ -239,7 +289,33 @@ var Getters = {
}).catch(function (err) { }).catch(function (err) {
callback(err.message || err, null); callback(err.message || err, null);
}); });
}else{//invidious api calls (google bad) }else{
try{
var results = await YTDLP(`ytsearch8:${query}`,{
dumpSingleJson: true,
}
);
var videos = new Array;
results.entries.forEach(function(result){
var meta = {
ytRating: result.like_count
}
var video = new Media(result.id, result.title, result.duration, "yt", meta);
video.thumb = {url: result.thumbnails[5].url};
videos.push(video);
});
callback(null, videos);
}catch(err){
callback(err.message || err, null);
}
/*invidious api calls (o7 RIP 2018-2024)
var options = { var options = {
host: Config.get("invidious-source"), host: Config.get("invidious-source"),
port: 443, port: 443,
@ -264,7 +340,7 @@ var Getters = {
}); });
return callback(null, vids.filter(rs => rs != null)); return callback(null, vids.filter(rs => rs != null));
}); });*/
} }
}, },
@ -287,6 +363,8 @@ var Getters = {
}, },
/* dailymotion.com */ /* dailymotion.com */
//The dailymotion player has been broken, however their basic API remains intact.
//This will stay *for now* but will be replaced by yt-dlp at the first sign of resistance.
dm: function (id, callback) { dm: function (id, callback) {
var m = id.match(/([\w-]+)/); var m = id.match(/([\w-]+)/);
if (m) { if (m) {
@ -596,7 +674,18 @@ module.exports = {
callback("Unknown media type '" + type + "'", null); callback("Unknown media type '" + type + "'", null);
} }
}, },
getYTRaw: function (id, cb){ getRawCopy: async function (id, cb){
try{
var video = await YTDLP(id,{
dumpSingleJson: true,
}
)
cb(video.requested_downloads[0].url);
}catch(err){
console.log(err.message);
}
/* Invidious Code (o7 RIP 2018-2024)
var options = { var options = {
host: Config.get("invidious-source"), host: Config.get("invidious-source"),
port: 443, port: 443,
@ -606,6 +695,8 @@ module.exports = {
}; };
urlRetrieve(https, options, function (status, data) { urlRetrieve(https, options, function (status, data) {
old invidious code (o7 2018 - 2024)
if(status !== 200) { if(status !== 200) {
console.log("Invidious HTTPS error code: " + status); console.log("Invidious HTTPS error code: " + status);
} }
@ -615,6 +706,7 @@ module.exports = {
if(vid.formatStreams[0] != null){//TEMPORARY FOR FRONTEND DEV PURPOSES, PULL LINK AND SET AGAIN WHEN VIDEO QUEUED(shit expires) if(vid.formatStreams[0] != null){//TEMPORARY FOR FRONTEND DEV PURPOSES, PULL LINK AND SET AGAIN WHEN VIDEO QUEUED(shit expires)
cb(vid.formatStreams[vid.formatStreams.length - 1].url); cb(vid.formatStreams[vid.formatStreams.length - 1].url);
} }
});
});*/
} }
}; };

View file

@ -56,4 +56,4 @@ block content
| No spamming submit channel or chat | No spamming submit channel or chat
p. p.
Comments? Questions? Feature requests? DMCA Notices? <a href="mailto:ourforest@420blaze.it">Email us!</a> Comments? Questions? Feature requests? DMCA Notices? <a href="mailto:ourforest@420blaze.it">Email us!</a>
h4 fore.st version: Pineapple Express++ (v1.1.1) h4 fore.st version: Pineapple Express += 2 (v1.1.2)

View file

@ -1,47 +0,0 @@
extends layout.pug
block content
.col-md-8.col-md-offset-2
h1 Google Drive Userscript
h2 Disclaimer
.alert.alert-danger.messagebox
strong Unsupported
p.
This functionality is provided <strong>as-is</strong> for backwards
compatibility for existing users for whom it already is known to work.
There are many reasons, known and unknown, for which it may
<strong>not</strong> work for you; please note the staff in CyTube
support channels cannot provide any troubleshooting assistance and you
will be asked to simply use a different video provider.
p.
This functionality was originally added so that users could share their
own personal videos stored in their Drive. No support whatsoever will
be provided to users attempting to use it to circumvent copyright
restrictions on third-party video hosts.
h2 How It Works
p.
The userscript is a short script that you can install using a browser
extension such as Greasemonkey or Tampermonkey that runs on the page
and provides additional functionality needed to play Google Drive
videos.
h2 Installation
ul
li
strong Chrome
| &mdash;Install <a href="https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo" target="_blank">Tampermonkey</a>.
li
strong Firefox
| &mdash;Install <a href="https://addons.mozilla.org/en-US/firefox/addon/tampermonkey/" target="_blank">Tampermonkey</a>
| or <a href="https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/" target="_blank">Greasemonkey</a>.
li
strong Other Browsers
| &mdash;Install the appropriate userscript plugin for your browser.
| Tampermonkey supports many browsers besides Chrome.
p.
Once you have installed the userscript manager addon for your browser,
you can <a href="/js/cytube-google-drive.user.js" target="_blank">
install the userscript</a>. If this link 404s, it means the administrator
of this server hasn't generated it yet.
p.
You can find a guide with screenshots of the installation process
<a href="https://github.com/calzoneman/sync/wiki/Google-Drive-Userscript-Installation-Guide" target="_blank">on GitHub</a>.

View file

@ -37,7 +37,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
*/ */
var CL_VERSION = "1.1.1"; var CL_VERSION = "1.1.2";
var GS_VERSION = 1.7; // Google Drive Userscript var GS_VERSION = 1.7; // Google Drive Userscript
var CLIENT = { var CLIENT = {

View file

@ -1773,7 +1773,7 @@
e = error1; e = error1;
return console.error(e); return console.error(e);
} }
} else if ((USEROPTS.yt_source !== "OFYT" && data.type == "yt")) { } else if ((USEROPTS.yt_source !== "OFYT" && data.type == "yt") || data.type == "dm") {
data.ofyt = data.id; data.ofyt = data.id;
data.id = data.meta.rawLink;//set link and spoof mov/h264 data.id = data.meta.rawLink;//set link and spoof mov/h264
data.type = "fi"; data.type = "fi";