Emergency Update: Pineapple Express += 2 (1.1.2)
This commit is contained in:
parent
05f0eb0048
commit
1cdf5f8ab9
42
README.md
42
README.md
|
|
@ -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
|
||||
|
|
@ -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 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
|
||||
Abriged Patchnotes:
|
||||
- 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
|
||||
## Pineapple Express += 2 1.1.2 Release Notes
|
||||
- Fixed busted video providers with YT-DLP integration (youtube/dailymotion)
|
||||
|
||||
## 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.
|
||||
|
|
|
|||
2769
package-lock.json
generated
2769
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "fore.st",
|
||||
"version": "1.1.1",
|
||||
"version": "1.1.2",
|
||||
"description": "fore.st: A fork of cytube tailored for the TTN Community",
|
||||
"main": "index.js",
|
||||
"directories": {
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
"express": "^4.17.1",
|
||||
"express-minify": "^1.0.0",
|
||||
"json-typecheck": "^0.1.3",
|
||||
"knex": "^0.95.2",
|
||||
"knex": "^3.1.0",
|
||||
"lodash": "^4.17.21",
|
||||
"morgan": "^1.10.0",
|
||||
"mysql": "^2.18.1",
|
||||
|
|
@ -38,7 +38,8 @@
|
|||
"source-map-support": "^0.5.19",
|
||||
"toml": "^3.0.0",
|
||||
"uuid": "^8.3.2",
|
||||
"yamljs": "^0.2.8"
|
||||
"yamljs": "^0.2.8",
|
||||
"youtube-dl-exec": "^3.0.10"
|
||||
},
|
||||
"scripts": {
|
||||
"build-server": "babel -D --source-maps --out-dir lib/ src/",
|
||||
|
|
|
|||
|
|
@ -1,60 +1,2 @@
|
|||
dev goals for 1.1.1 pineapple express++:
|
||||
|
||||
- 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
|
||||
dev goals for 1.1.2 pineapple Express += 2:
|
||||
--Fix broken video providers (dailymotion/youtube)
|
||||
|
|
@ -1289,12 +1289,17 @@ PlaylistModule.prototype.startPlayback = function (time) {
|
|||
}
|
||||
|
||||
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.sendChangeMedia(self.channel.users);//fuggin SEND IT
|
||||
});
|
||||
|
||||
}else{
|
||||
}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{
|
||||
self.sendChangeMedia(self.channel.users);
|
||||
}
|
||||
self.channel.notifyModules("onMediaChange", [self.current.media]);
|
||||
|
|
|
|||
116
src/get-info.js
116
src/get-info.js
|
|
@ -49,6 +49,8 @@ const Vimeo = require("@cytube/mediaquery/lib/provider/vimeo");
|
|||
const Streamable = require("@cytube/mediaquery/lib/provider/streamable");
|
||||
const TwitchVOD = require("@cytube/mediaquery/lib/provider/twitch-vod");
|
||||
const TwitchClip = require("@cytube/mediaquery/lib/provider/twitch-clip");
|
||||
const YTDLP = require('youtube-dl-exec');
|
||||
|
||||
import { Counter } from 'prom-client';
|
||||
import { lookup as lookupCustomMetadata } from './custom-media';
|
||||
|
||||
|
|
@ -111,7 +113,7 @@ function getBlocked(reg){
|
|||
|
||||
var Getters = {
|
||||
/* youtube.com */
|
||||
yt: function (id, callback) {
|
||||
yt: async function (id, callback) {
|
||||
|
||||
if(!Config.get("invidious-backend")){//legacy youtube backend (fucking yicky)
|
||||
if (!Config.get("youtube-v3-key")) {
|
||||
|
|
@ -134,8 +136,29 @@ var Getters = {
|
|||
}).catch(function (err) {
|
||||
callback(err.message || err, null);
|
||||
});
|
||||
}else{//invidious api calls (google bad)
|
||||
var options = {
|
||||
}else{
|
||||
//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"),
|
||||
port: 443,
|
||||
path: "/api/v1/videos/" + id,
|
||||
|
|
@ -161,13 +184,13 @@ var Getters = {
|
|||
|
||||
var media = new Media(vid.videoId, vid.title, vid.lengthSeconds, "yt", meta);
|
||||
return callback(false, media);
|
||||
});
|
||||
});*/
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
/* 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("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!" +
|
||||
|
|
@ -188,7 +211,34 @@ var Getters = {
|
|||
}).catch(function (err) {
|
||||
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 = {
|
||||
host: Config.get("invidious-source"),
|
||||
port: 443,
|
||||
|
|
@ -209,12 +259,12 @@ var Getters = {
|
|||
});
|
||||
|
||||
return callback(null, vids);
|
||||
});
|
||||
});*/
|
||||
}
|
||||
},
|
||||
|
||||
/* 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("youtube-v3-key")) {
|
||||
|
|
@ -239,7 +289,33 @@ var Getters = {
|
|||
}).catch(function (err) {
|
||||
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 = {
|
||||
host: Config.get("invidious-source"),
|
||||
port: 443,
|
||||
|
|
@ -264,7 +340,7 @@ var Getters = {
|
|||
});
|
||||
|
||||
return callback(null, vids.filter(rs => rs != null));
|
||||
});
|
||||
});*/
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -287,6 +363,8 @@ var Getters = {
|
|||
},
|
||||
|
||||
/* 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) {
|
||||
var m = id.match(/([\w-]+)/);
|
||||
if (m) {
|
||||
|
|
@ -596,7 +674,18 @@ module.exports = {
|
|||
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 = {
|
||||
host: Config.get("invidious-source"),
|
||||
port: 443,
|
||||
|
|
@ -606,6 +695,8 @@ module.exports = {
|
|||
};
|
||||
|
||||
urlRetrieve(https, options, function (status, data) {
|
||||
|
||||
old invidious code (o7 2018 - 2024)
|
||||
if(status !== 200) {
|
||||
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)
|
||||
cb(vid.formatStreams[vid.formatStreams.length - 1].url);
|
||||
}
|
||||
});
|
||||
|
||||
});*/
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -56,4 +56,4 @@ block content
|
|||
| No spamming submit channel or chat
|
||||
p.
|
||||
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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
| —Install <a href="https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo" target="_blank">Tampermonkey</a>.
|
||||
li
|
||||
strong Firefox
|
||||
| —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
|
||||
| —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>.
|
||||
|
|
@ -37,7 +37,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|||
SOFTWARE.
|
||||
*/
|
||||
|
||||
var CL_VERSION = "1.1.1";
|
||||
var CL_VERSION = "1.1.2";
|
||||
var GS_VERSION = 1.7; // Google Drive Userscript
|
||||
|
||||
var CLIENT = {
|
||||
|
|
|
|||
|
|
@ -1773,11 +1773,11 @@
|
|||
e = error1;
|
||||
return console.error(e);
|
||||
}
|
||||
} else if ((USEROPTS.yt_source !== "OFYT" && data.type == "yt")) {
|
||||
data.ofyt = data.id;
|
||||
data.id = data.meta.rawLink;//set link and spoof mov/h264
|
||||
data.type = "fi";
|
||||
data.meta.codec = "mov/h264";
|
||||
} else if ((USEROPTS.yt_source !== "OFYT" && data.type == "yt") || data.type == "dm") {
|
||||
data.ofyt = data.id;
|
||||
data.id = data.meta.rawLink;//set link and spoof mov/h264
|
||||
data.type = "fi";
|
||||
data.meta.codec = "mov/h264";
|
||||
try {
|
||||
return window.PLAYER = new FilePlayer(data);
|
||||
} catch (error1) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue