diff --git a/README.md b/README.md index 1e13c3ee..d4b118aa 100644 --- a/README.md +++ b/README.md @@ -55,8 +55,6 @@ dev goals for 1.1 pineapple express: - videojs.coffee(hls,videojs,raw-file,gdrive,rtmp) ✓ - dailymotion ~(this is kinda broken, likely not possible client-side without breaking CORS policy. This can wait until next version when an installation script including nginx and cors-proxy config gets added to support the catbox.moe image upload button which faces the same issue. - vimeo ✓ - - add player.js updates to twitch - - save temporary vids to channel library - slide out panel (not an end user feature in and of itself, however a common UI element used for most menus, made to be quick and ezpz ✓ - function for opening, closing ✓ @@ -124,10 +122,6 @@ dev goals for 1.1 pineapple express: - server-whisper target parameter for user specific whispers ✓ - server-whisper name ✓ -- getplaylistlinks outputs in fpanel - - I mean its pretty fucking simple I dont know how you can screw this one up bud. - - ezpzlmnsqze - - flex layout/legacy layout ripout ✓ - rip out legacy layout system ✓ - chat/player sized to fit canvas with navbar (remove -+ buttons on player) ✓ @@ -157,29 +151,52 @@ dev goals for 1.1 pineapple express: - fix portrait/mobile mode ✓ - fix user tooltip menu position ✓ -- decaffeinate player.js - - Coffee script was a bad idea then, and it makes even less sense now. - - fuck me its just javascript with worse syntax, no real debugging tools, and build times - - literally fucking why though?(I guess it made sense before ES6 but still fuck me) +- decaffeinate player.js ✓ + - Coffee script was a bad idea then, and it makes even less sense now. ✓ + - fuck me its just javascript with worse syntax, no real debugging tools, and build times ✓ + - literally fucking why though?(I guess it made sense before ES6 but still fuck me) ✓ -- degoogling - - yt-dlp backend for serverside metadata acquisition of youtube videos w/o registered API key or google account - - potentially leverage yt-dlp backend for other media sources +- degoogling ✓ + - invidious api or yt-dlp backend for serverside metadata acquisition of youtube videos w/o registered API key or google account + - pull metadata for single video ✓ + - pull metadata for playlist ✓ + - search function ✓ + - potentially leverage yt-dlp backend for other media sources X went with invidious. YT-DLP may make more sense for a total re-write in the future - implement player.js updates into youtube.coffee - - latching - - getres - - update minicont dur - - update minicont buttons - - invidious embed support for youtube video playback - - youtube source in user prefrences (three or four invidious instances from different countries/continents, official youtube embed, or custom invidious instance) - -- autobump - - sepearate bump lists, based on js/txt files at first, will be stored in db next update (may use multiple at once) - - skip next bump/disable bumping - - bump frequency (default: 1) - - queue method: random from last-half, round-robin, full random - - override next bump - - require video be at least 4 minutes to add bump (mods can override from bump menu) + - latching ✓ + - getres X Probably not possible without breaking cors policy. (same as DM) + - handleVideoSize on load ✓ + - update minicont dur ~ updates with server tick, doesnt look as good as other sources, but YT embeds suck. + - update minicont buttons ✓ + - invidious embed support for youtube video playback X not possible with current setup. Reqs either update to invidious allowing embed control, or a cors proxy(will look into this next update, or whenever installation script is created) + - invidious embed alternative: pull raw video link on vid start server side, serve to client ✓ + - youtube source in user prefrences (raw link or official yt embed for now) ✓ + +- mod/admin panel + - button on chatbar ✓ + - auto switch to admin panel ✓ + - main panel + - poll creation ✓ + - tools + - !announce button/field ✓ + - !clear button w/ username dropdown ✓ + - mod message (sends message to all active mods) ✓ + - preferences ✓ + - modflair ✓ + - show modflair on chat header ✓ + - show shadowmuted messages ✓ + - show ips in tooltips ✓ + - open playlist below video by default ✓ + - nested menu + - new nested menu protoype object ✓ + - playlist menu (just the playlist but in fpanel, currently one or the other) ✓ + - move playlist between legacy area and fpanel on open/close ✓ + - bugfixes ✓ + - lock/unlock panel dissapears playlist (suicide by two shots to the back of the head) ✓ + - fix scroll to item ✓ + - fix scrolling while dragging pl item ✓ + - autobump control menu + - tokebot control menu - merge tokebot into ourfore.st codebase, one server instead of two. - profile and userlist entry @@ -189,29 +206,43 @@ dev goals for 1.1 pineapple express: - tokefile, list of usernames with toke count. This will be switched to mariadb in the next update - total tokes listed on profile tooltip +- autobump + - sepearate bump lists, based on js/txt files at first, will be stored in db next update (may use multiple at once) + - skip next bump/disable bumping + - bump frequency (default: 1) + - queue method: random from last-half, round-robin, full random + - override next bump + - require video be at least 4 minutes to add bump (mods can override from bump menu) -- mod panel - - button on chatbar - - mod message (sends message to all active mods) - - new poll button - - autobump control tab - - tokebot control tab - - playlist tab - - modflair - - open playlist below video (if closed, otherwise this does not appear) - - open playlist below video by default - - -- merge fore.st theme changes to fore.st dusk, consider moving some of them over to cytube.css for easier management +- finishing touches + - CRITICAL BUG FIX: video sometimes unlatches if sync delayed on video start.(Fix pre-latch, if not duration check until sync is past 2s?) + - CRITICAL BUG FIX: userlist profile tooltips are currently broken + - CRITICAL BUG FIX: chat does not fill screen in portrait mode (video height being subtracted while video collapsed) + - save temporary vids to channel library + - getplaylistlinks outputs in fpanel + - display links + - pop mod nmenu + - css variables in theme for ez customizablity + - merge fore.st theme changes to fore.st dusk, consider moving some of them over to cytube.css for easier management - extra shit(probs wait til next update, or hotfix) - short chats (acronyms, emoji, single letters/numbers/symbols) pop in over video from left starting at top left, overflow pops in below, instead of in chat box. Chats slide back up into top of vid after 2s. (optional, default on) - - basic mod chat (save to mod channel + pm all online mods) + - pop out btn - basic profile page (in side panel) - - css variables in theme for ez customizablity + - improved mod chat (dedicated pop out to access mod channel chat from any channel) - user themes + - movie night theme + - tree house theme + - the network theme - change background to other themes background or img from url(theme background by default) - - native odysee support (no raw embed) + - click and drag to resize fpanel + - native odysee support (no raw embed) (might save for 1.2) + - fix touch & drag to resize chat/video split on mobile/touch devices + - add player.js updates to twitch/embed/soundcloud + - latching + - getres + - update minicont dur + - update minicont buttons ## 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. diff --git a/src/channel/playlist.js b/src/channel/playlist.js index e012939f..22de51fc 100644 --- a/src/channel/playlist.js +++ b/src/channel/playlist.js @@ -1238,7 +1238,7 @@ PlaylistModule.prototype.startPlayback = function (time) { } /* Lead-in time of 3 seconds to allow clients to buffer */ - time = time || (media.seconds > 0 ? (media.type == "yt" ? -6 : -3) : 0); //if its a yt vid make it 6 for the link pull + time = time || (media.seconds > 0 ? -3 : 0); media.paused = time < 0; media.currentTime = time; diff --git a/src/config.js b/src/config.js index cdc31e34..6b0388a3 100644 --- a/src/config.js +++ b/src/config.js @@ -66,7 +66,7 @@ var defaults = { } }, "invidious-backend": true, - "invidious-source": 'vid.puffyan.us', + "invidious-source": 'inv.riverside.rocks', "youtube-v3-key": "", "channel-blacklist": [], "channel-path": "r", diff --git a/templates/about.pug b/templates/about.pug index edf595ca..8a20f68c 100644 --- a/templates/about.pug +++ b/templates/about.pug @@ -39,22 +39,21 @@ block content OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - .col-md-8.col-md-offset-2 - .aboutText - h1 Welcome to ourfore.st! - h3 about fore.st/ourfore.st - p. - fore.st is a fork of cytube built for the TTN community post-shutdown. TTN was a community based streaming service for cannabis enthusiasts. After eight years, the man behind the site went on to greener pastures. In it's place stands this, and many other community efforts such as Treezone, and the community discord. While it may not be the same, we aim to provide a similiar service for the same people. The refrence instance for fore.st is hosted at ourfore.st. - h3 ourfore.st instance rules - ul - li - | Don't be a dick - li - | Don't post, or explain where to find pirated content in the chat - li - | Do not upload content to the internet you do not have permission to for purpose of using it on ourfore.st - li - | No spamming submit channel or chat - p. - Comments? Questions? Feature requests? DMCA Notices? Email us! - h4 fore.st version: Pineapple Express (v1.1-INDEV) + .aboutText + h1 Welcome to ourfore.st! + h3 about fore.st/ourfore.st + p. + fore.st is a fork of cytube built for the TTN community post-shutdown. TTN was a community based video & stream embedding/chat site for cannabis enthusiasts. After eight years, the man behind the site went on to greener pastures. In it's place stands this, and many other community efforts such as Treezone, and the community discord. While it may not be the same, we aim to provide a similiar service for the same people. The refrence instance for fore.st is hosted at ourfore.st. + h3 ourfore.st instance rules + ul + li + | Don't be a dick + li + | Don't post, or explain where to find pirated content in the chat + li + | Do not upload content to the internet you do not have permission to for purpose of using it on ourfore.st + li + | No spamming submit channel or chat + p. + Comments? Questions? Feature requests? DMCA Notices? Email us! + h4 fore.st version: Pineapple Express (v1.1-INDEV) diff --git a/templates/channel.pug b/templates/channel.pug index 3a229a44..d158f95f 100644 --- a/templates/channel.pug +++ b/templates/channel.pug @@ -60,14 +60,14 @@ html(lang="en") section#mainpage .container #motdrow.row - #motdwrap.well + #motdwrap.well.panelback button#togglemotd.close.pull-right(type="button") span.glyphicon.glyphicon-minus #motd .clear #announcements.row #titles.row - p#videowrap-header + p#videowrap-header.panelback i#blindvideo.glyphicon.glyphicon-chevron-down.pointer(title="Hide Player") span#currenttitle Nothing Playing span#minicontrol @@ -81,9 +81,9 @@ html(lang="en") span#cinemode.playercont.glyphicon.glyphicon-film.pointer(title="Toggle Cinema Mode") span#lockaspect.playercont.glyphicon.glyphicon-picture.pointer(style="display: none;", title="Lock to Aspect Ratio") span#latchvid.label.label-default.pull-right.pointer(style="display: none;") Sync - #chatheader + #chatheader.panelback i#blindchat.glyphicon.glyphicon-chevron-down.pointer(title="Hide Chat") - span#modflair.label.label-default.pull-right.pointer Name Color + span#modflair.label.label-default.pointer Modflair span(style="flex-grow: 2;") span#usercount.pointer Not Connected i#userlisttoggle.glyphicon.glyphicon-chevron-down.pull-left.pointer(title="Show/Hide Userlist") @@ -96,23 +96,24 @@ html(lang="en") h3 Take a Toke! #chatwrap #chatmain - #userlist + #userlist.panelback #fpaneldiv.fpanel(style="display: none;") #fptitlediv.fptitlebar.fpanel p#fptitle.fptitlebar.fpanel null p#closefpanel.fptitlebar.fpanel.glyphicon.glyphicon-remove.pointer(onclick="javascript:closeFPanel()", title="Close null panel.") #fpcontdiv.fpcont.fpanel - #messagebuffer.linewrap + #messagebuffer.linewrap.panelback #chatbar(style="display: flex;") - button#pollopenbtn.btn.btn-sm.btn-default.glyphicon.glyphicon-ok.chatbtn(onclick="javascript:panelbtn(fpoll)",style="display: none;", title="Poll") - button#prefopenbtn.btn.btn-sm.btn-default.glyphicon.glyphicon-cog.chatbtn(onclick="javascript:panelbtn(fpset)",title="Quick Settings") - button#emoteopenbtn.btn.btn-sm.btn-default.chatbtn(onclick="javascript:panelbtn(fpemote)",title="Emotes") ;) + button#pollopenbtn.btn.btn-sm.btn-default.glyphicon.glyphicon-ok.chatbtn.panelback(onclick="javascript:panelbtn(fpoll)",style="display: none;", title="Poll") + button#prefopenbtn.btn.btn-sm.btn-default.glyphicon.glyphicon-cog.chatbtn.panelback(onclick="javascript:panelbtn(fpset)",title="Quick Settings") + button#modopenbtn.btn.btn-sm.btn-default.chatbtn.panelback(onclick="javascript:panelbtn(fpmod)",title="Mod Panel", style="display: none;") MOD + button#emoteopenbtn.btn.btn-sm.btn-default.chatbtn.panelback(onclick="javascript:panelbtn(fpemote)",title="Emotes") ;) form(action="javascript:void(0)" style="display: flex; flex-grow: 1;") - input#chatline.form-control(type="text", maxlength="320", style="display: none") + input#chatline.form-control.panelback(type="text", maxlength="320", style="display: none") #guestlogin.input-group span.input-group-addon Registration Required! //input#guestname.form-control(type="text", placeholder="Name") - button#chatsend.btn.btn-sm.btn-default Send + button#chatsend.btn.btn-sm.btn-default.panelback Send //#videocontrols.btn-group.pull-right //button#fullscreenbtn.btn.btn-sm.btn-default(title="Make the video player fullscreen")This makes no sense, all supported players already have a full screen button. Not a fan of the placement of this anywho @@ -123,9 +124,9 @@ html(lang="en") //#leftcontrols.col-lg-5.col-md-5 //button#newpollbtn.btn.btn-sm.btn-default New Poll #playlistrow.row - #rightpane + #rightpane.panelback #rightpane-inner.row - #rightcontrols + #rightcontrols.panelback #plcontrol.btn-group button#showmediaurl.btn.btn-sm.btn-default(title="Add video from URL", data-toggle="collapse", data-target="#addfromurl") span.glyphicon.glyphicon-plus @@ -150,61 +151,61 @@ html(lang="en") span#plcount 0 items br span#pllength 00:00:00 - #searchcontrol.collapse.plcontrol-collapse.col-lg-12.col-md-12 - .vertical-spacer - .input-group - input#library_query.form-control(type="text", placeholder="Search query") - span.input-group-btn - button#library_search.btn.btn-default Library - span.input-group-btn - button#youtube_search.btn.btn-default YouTube - .checkbox - label - input.add-temp(type="checkbox") - | Add as temporary - ul#library.videolist.col-lg-12.col-md-12 - #addfromurl.collapse.plcontrol-collapse.col-lg-12.col-md-12 - .vertical-spacer - .input-group - input#mediaurl.form-control(type="text", placeholder="Media URL") - span.input-group-btn - button#queue_next.btn.btn-default Queue next - span.input-group-btn - button#queue_end.btn.btn-default Queue last - span.input-group-btn#showcustomembed - button#showcustomembed.btn.btn-default(title="Embed a custom frame", data-toggle="collapse", data-target="#customembed") - span.glyphicon.glyphicon-th-large - .checkbox - label - input.add-temp(type="checkbox") - | Add as temporary - div#addfromurl-queue - #customembed.collapse.plcontrol-collapse.col-lg-12.col-md-12 - .vertical-spacer - .input-group - input#customembed-title.form-control(type="text", placeholder="Title (optional)") - span.input-group-btn - button#ce_queue_next.btn.btn-default Queue next - span.input-group-btn - button#ce_queue_end.btn.btn-default Queue last - .checkbox - label - input.add-temp(type="checkbox") - | Add as temporary - | Paste the embed code below and click Next or At End. - | Acceptable embed codes are <iframe> and <object> tags. CUSTOM EMBEDS CANNOT BE SYNCHRONIZED. - textarea#customembed-content.input-block-level.form-control(rows="3") - #playlistmanager.collapse.plcontrol-collapse.col-lg-12.col-md-12 - .vertical-spacer - .input-group - input#userpl_name.form-control(type="text", placeholder="Playlist Name") - span.input-group-btn - button#userpl_save.btn.btn-default Save - .checkbox - label - input.add-temp(type="checkbox") - | Add as temporary - ul#userpl_list.videolist + #searchcontrol.collapse.plcontrol-collapse.col-lg-12.col-md-12 + .vertical-spacer + .input-group + input#library_query.form-control(type="text", placeholder="Search query") + span.input-group-btn + button#library_search.btn.btn-default Library + span.input-group-btn + button#youtube_search.btn.btn-default YouTube + .checkbox + label + input.add-temp(type="checkbox") + | Add as temporary + ul#library.videolist.col-lg-12.col-md-12 + #addfromurl.collapse.plcontrol-collapse.col-lg-12.col-md-12 + .vertical-spacer + .input-group + input#mediaurl.form-control(type="text", placeholder="Media URL") + span.input-group-btn + button#queue_next.btn.btn-default Queue next + span.input-group-btn + button#queue_end.btn.btn-default Queue last + span.input-group-btn#showcustomembed + button#showcustomembed.btn.btn-default(title="Embed a custom frame", data-toggle="collapse", data-target="#customembed") + span.glyphicon.glyphicon-th-large + .checkbox + label + input.add-temp(type="checkbox") + | Add as temporary + div#addfromurl-queue + #customembed.collapse.plcontrol-collapse.col-lg-12.col-md-12 + .vertical-spacer + .input-group + input#customembed-title.form-control(type="text", placeholder="Title (optional)") + span.input-group-btn + button#ce_queue_next.btn.btn-default Queue next + span.input-group-btn + button#ce_queue_end.btn.btn-default Queue last + .checkbox + label + input.add-temp(type="checkbox") + | Add as temporary + | Paste the embed code below and click Next or At End. + | Acceptable embed codes are <iframe> and <object> tags. CUSTOM EMBEDS CANNOT BE SYNCHRONIZED. + textarea#customembed-content.input-block-level.form-control(rows="3") + #playlistmanager.collapse.plcontrol-collapse.col-lg-12.col-md-12 + .vertical-spacer + .input-group + input#userpl_name.form-control(type="text", placeholder="Playlist Name") + span.input-group-btn + button#userpl_save.btn.btn-default Save + .checkbox + label + input.add-temp(type="checkbox") + | Add as temporary + ul#userpl_list.videolist #queuefail.col-lg-12.col-md-12 .col-lg-12.col-md-12 ul#queue.videolist diff --git a/templates/index.pug b/templates/index.pug index c65dc99a..b1fae06c 100644 --- a/templates/index.pug +++ b/templates/index.pug @@ -39,7 +39,7 @@ block content OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - .col-lg-9.col-md-9 + .channel-list h3 Public Channels table.table.table-bordered.table-striped thead diff --git a/templates/useroptions.pug b/templates/useroptions.pug index 9f6ed902..2da8f6a8 100644 --- a/templates/useroptions.pug +++ b/templates/useroptions.pug @@ -122,3 +122,4 @@ mixin us-mod +rcheckbox("us-modflair", "Show name color") +rcheckbox("us-shadowchat", "Show shadowmuted messages") +rcheckbox("us-show-ip-in-tooltip", "Show IP addresses in profile tooltip") + +rcheckbox("us-show-playlist", "Legacy Playlist") diff --git a/www/css/cytube.css b/www/css/cytube.css index 3a1839bd..d5cb3c96 100644 --- a/www/css/cytube.css +++ b/www/css/cytube.css @@ -40,21 +40,49 @@ body{ max-width: 100%; overflow-x: hidden; } + +#mp-show-ip-in-tooltip{ + margin-top: 0.5em; +} #main, #titles{ display: flex; } +.static-cont{ + position: absolute; + width: auto !important; + height: auto !important; + min-width: 100%; + min-height: 100%; +} +.qt{ + margin: 0.5em 0; +} +#qt-clearuser{ + margin: 0 0.5em; +} .container-fluid { padding-left: 15px; padding-right: 15px; margin-left: auto; margin-right: auto; } - +.nmenu{ + position: absolute; + bottom: 0; + left: 0; + right: 0; + display: flex; + z-index: 1; +} +.nmenu-btn{ + flex-grow: 1; +} #minicontrol{ display: none; margin: 0 0.5em 0 0.5em; } + #vidplay{ } #viddur{ @@ -63,7 +91,14 @@ body{ #loginform > .form-group { margin-right: 5px; } - +#npoll-timeout{ + width: 4em; +} +#npopt{ + display: flex; + height: 1.6em; + margin: 0.5em 0; +} .center { text-align: center; } @@ -98,7 +133,7 @@ body{ #messagebuffer, #userlist { height: 329px; overflow-x: hidden; - overflow-y: scroll; + overflow-y: auto; margin-bottom: 0; } @@ -107,7 +142,12 @@ body{ border-top-left-radius: 0; border-top-right-radius: 0; } - +.floatcont{ + position: absolute; + right: 0; + left: 0; + z-index: 1; +} .linewrap, .linewrap code { white-space: pre-wrap; /* css-3 */ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ @@ -420,7 +460,8 @@ label[for="emotealphabox"]{ font-family: Monospace; } .fpcont{ - overflow: scroll; + overflow-y: auto; + overflow-x: hidden; } #optedit, #permedit, #filteredit, #motdedit, #cssedit, #jsedit, #banlist, #loginhistory, #channelranks, #chanlog { diff --git a/www/css/themes/fore.st.css b/www/css/themes/fore.st.css index 06093c1a..2b747784 100644 --- a/www/css/themes/fore.st.css +++ b/www/css/themes/fore.st.css @@ -88,7 +88,13 @@ sub,sup{ font-size:75%; line-height:0; position:relative; - vertical-align:baseline + vertical-align:baseline; +} +.btn.btn-sm.btn-default.nmenu-btn.nmenu-border{ + border-left: 1px #949494 solid; +} +.nmenu{ + border-top: 1px #949494 solid; } .label-admin, .label.label-admin{ background-color: #cc0000; @@ -5492,11 +5498,17 @@ a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{ text-decoration: none; } -#pollopenbtn, #prefopenbtn, #emoteopenbtn, #chatsend, #motdwrap, #chatline, #rightcontrols, #chatheader, #userlist, #messagebuffer, #videowrap-header, .embed-responsive, #rightpane, #mainrow{ +.panelback, .embed-responsive{ background-color: #111111C0; backdrop-filter: blur(12px); } + +.nmenu-btn{ + background-color: #00000000; + backdrop-filter: blur(12px); +} + #fpaneldiv{ border: 1px #949494 solid; background-color: #1119; @@ -5513,6 +5525,15 @@ a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{ background-color: #111111C0; padding: 10px; border: 1px solid #949494; + position:absolute; + left: 50%; + right 50%; + transform: translate(-50%); + top: 10%; + width: 40%; +} +.npoll-opt{ + width: 50%; } #chatwrap, #videowrap{ padding-right: 0px; diff --git a/www/js/callbacks.js b/www/js/callbacks.js index 886289a8..fd097a7c 100644 --- a/www/js/callbacks.js +++ b/www/js/callbacks.js @@ -222,7 +222,9 @@ Callbacks = { $("

").appendTo(div) .html("Go watch one of the channels that actually exists here."); - $("#ytapiplayer").append('')//KSSSSSSSSSSSSSSSSSSSSSSSH + $("#ytapiplayer").removeClass("embed-responsive-item").addClass("static-cont"); + $("#ytapiplayer").append('

").attr("id",this.title).addClass("nmenu");//create nmenu div + par = this.parent; + this.elm.append(melm.append( + $("