Merge pull request 'main' (#2) from Ashley/poketube:main into main

Reviewed-on: https://codeberg.org/Korbs/poketube/pulls/2
This commit is contained in:
Korbs 2023-11-21 22:47:19 +00:00
commit acc40bfcd8
16 changed files with 567 additions and 595 deletions

6
HOSTING_REQUIREMENTS.md Normal file
View file

@ -0,0 +1,6 @@
Internet : 1GBIT (recommended 5GBIT) <br>
Ram : 2GB <br>
Cpu : Any recent one <br>
OS: Microsoft Windows, Macos
GNU/LINUX (doesnt work on "musl" distros ) <brr>
systemd or any service manager

View file

@ -1,5 +1,15 @@
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later
// Get the current URL
const url = new URL(window.location.href);
// Remove the 'fx' query parameter
url.searchParams.delete('fx');
// Replace the current URL without the 'fx' parameter
history.replaceState(null, '', url.toString());
// Retrieve volume from local storage or set to max if not available
const initialVolume = localStorage.getItem('playerVolume') || 1;
const video = document.getElementById('video');

View file

@ -849,7 +849,11 @@ button[type="submit"]:hover {
height: 700px;
object-fit: cover;
object-position: top;
mask-image: linear-gradient(black, #0000);
mask-image: linear-gradient(#5315ff,#0000);
border-top-left-radius: 1em;
border-top-right-radius: 1em;
pointer-events: none;
-webkit-mask-image: linear-gradient(#5315ff,#0000);
}
.landing-actions a {
background: #fff;

View file

@ -2,93 +2,84 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xml:space="preserve"
id="svg5"
width="717.97009"
height="112.56479"
viewBox="0 0 717.97009 112.56479"
version="1.1"
viewBox="0 0 376.97411 60.910771"
height="16.115974mm"
width="99.741066mm"
id="svg5"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="drawing-1.svg"
xml:space="preserve"
inkscape:export-filename="draw2ing.svg"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview7"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:document-units="px"
showgrid="false"
inkscape:zoom="0.6147115"
inkscape:cx="774.347"
inkscape:cy="251.33742"
inkscape:window-width="1920"
inkscape:window-height="1008"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><defs
id="defs2" /><g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-2816.2962,-312.58059)"><g
id="g993"
transform="matrix(1.3141622,0,0,1.3141622,-179.53607,-382.46212)"><g
id="g3709"
transform="matrix(1.1286291,0,0,1.1286291,-209.77235,-62.332797)" /><g
id="g1113"
transform="matrix(0.44880392,0,0,0.44880392,134.56053,190.28044)"><g
id="g4814"
transform="matrix(1.1286291,0,0,1.1286291,-160.33168,-62.332797)"><text
xml:space="preserve"
style="font-size:112.04px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.33795;stroke-dasharray:none;stroke-opacity:1"
x="465.73672"
y="448.20261"
id="text167"><tspan
id="tspan165"
x="465.73672"
y="448.20261"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:112.04px;font-family:Urbanist;-inkscape-font-specification:'Urbanist Bold Italic';fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.33795;stroke-dasharray:none;stroke-opacity:1">Poketube</tspan></text><g
id="g3702"
transform="matrix(0.79053551,0,0,0.79053551,91.95505,93.12606)"
style="fill:#ffffff;stroke:#ffffff;stroke-width:3.86781;stroke-dasharray:none;stroke-opacity:1"><path
style="fill:#ffffff;stroke:#ffffff;stroke-width:5.61679;stroke-dasharray:none;stroke-opacity:1"
id="path3694"
d="m 290.38798,191.32796 68.57204,-39.59009 1e-5,79.18018 0,79.18017 -68.57205,-39.59009 -68.57204,-39.59008 z"
transform="matrix(-0.68861541,0,0,-0.68861541,586.1132,555.86413)" /></g><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:170.118px;font-family:'Manrope ExtraLight';-inkscape-font-specification:'Manrope ExtraLight, Bold';fill:#ffffff;stroke-width:1.18546"
x="1498.2238"
y="354.64182"
id="text428"><tspan
id="tspan426"
style="stroke-width:1.18547"
x="1498.2238"
y="354.64182" /></text></g><g
id="g10697"
transform="matrix(1.1286291,0,0,1.1286291,4375.1174,346.91686)"
style="fill:#ffffff"><g
aria-label="Poketube"
id="text10687"
style="font-size:112.04px;stroke-width:1.33795"><path
d="m 464.5603,448.20261 11.03594,-78.428 h 28.01001 q 6.38628,0 11.09196,3.19314 4.7617,3.19314 7.05852,8.57106 2.29682,5.37792 1.34448,11.82022 -0.89632,6.61036 -4.81772,11.98828 -3.86538,5.3219 -9.5234,8.51504 -5.602,3.13712 -11.7642,3.13712 h -14.34113 l -4.42558,31.20314 z m 19.99915,-44.87202 h 12.8846 q 2.91304,0 5.48996,-1.45652 2.63294,-1.45652 4.42558,-3.9214 1.79264,-2.46488 2.18478,-5.48996 0.50418,-3.0811 -0.61622,-5.54598 -1.1204,-2.46488 -3.3612,-3.9214 -2.18478,-1.45652 -5.09782,-1.45652 h -12.82858 z"
style="font-style:italic;font-weight:bold;font-family:Urbanist;-inkscape-font-specification:'Urbanist Bold Italic'"
id="path13170" /><path
d="m 546.15048,449.65913 q -7.73076,0 -13.55684,-3.97742 -5.77006,-3.97742 -8.62708,-10.6438 -2.801,-6.7224 -1.6806,-14.8453 0.8403,-6.1622 3.75334,-11.4841 2.96906,-5.37792 7.39464,-9.41136 4.42558,-4.08946 9.8035,-6.38628 5.43394,-2.29682 11.204,-2.29682 7.73077,0 13.50083,3.97742 5.82608,3.97742 8.6831,10.69982 2.85702,6.7224 1.6806,14.90132 -0.8403,6.10618 -3.80936,11.42808 -2.91304,5.3219 -7.33862,9.41136 -4.42558,4.03344 -9.80351,6.33026 -5.37792,2.29682 -11.204,2.29682 z m 1.90468,-13.66888 q 4.08946,0 7.61872,-2.18478 3.52927,-2.18478 5.93813,-5.77006 2.46488,-3.58528 3.02508,-7.8428 0.61622,-4.36956 -0.8403,-7.95484 -1.45652,-3.6413 -4.42558,-5.77006 -2.91305,-2.18478 -6.83445,-2.18478 -4.03344,0 -7.61872,2.18478 -3.52926,2.18478 -5.93812,5.82608 -2.40886,3.6413 -3.02508,7.89882 -0.61622,4.42558 0.8403,8.01086 1.45652,3.58528 4.42558,5.71404 2.96906,2.07274 6.83444,2.07274 z"
style="font-style:italic;font-weight:bold;font-family:Urbanist;-inkscape-font-specification:'Urbanist Bold Italic'"
id="path13172" /><path
d="m 632.28407,448.20261 h -15.74162 l -9.63544,-22.01586 -9.18728,9.35534 -1.79264,12.66052 h -13.66888 l 11.82022,-84.03 h 13.66888 l -7.05852,50.1379 21.67974,-22.1279 h 17.87038 l -22.408,22.91218 z"
style="font-style:italic;font-weight:bold;font-family:Urbanist;-inkscape-font-specification:'Urbanist Bold Italic'"
id="path13174" /><path
d="m 661.89346,449.65913 q -7.73076,0 -13.55684,-3.97742 -5.77006,-3.97742 -8.62708,-10.69982 -2.801,-6.7224 -1.6806,-14.8453 0.8403,-6.10618 3.75334,-11.42808 2.96906,-5.37792 7.39464,-9.41136 4.42558,-4.08946 9.8035,-6.38628 5.43394,-2.29682 11.204,-2.29682 6.55434,0 11.59614,2.801 5.0418,2.74498 8.17892,7.5627 3.19314,4.81772 4.03344,10.97992 0.8403,6.1622 -1.00836,12.8846 h -40.8946 q 0.2801,3.13712 1.73662,5.65802 1.45652,2.46488 3.97742,3.97742 2.5209,1.45652 5.99414,1.51254 3.58528,0.056 6.77842,-1.6806 3.19314,-1.79264 5.54598,-4.81772 l 13.50082,3.24916 q -4.42558,7.45066 -11.87624,12.21236 -7.45066,4.70568 -15.85366,4.70568 z m -8.85116,-35.06852 h 27.56184 q -0.16806,-3.3612 -1.79264,-6.05016 -1.56856,-2.74498 -4.25752,-4.36956 -2.68896,-1.62458 -6.05016,-1.62458 -3.3612,0 -6.49832,1.62458 -3.0811,1.56856 -5.43394,4.31354 -2.29682,2.68896 -3.52926,6.10618 z"
style="font-style:italic;font-weight:bold;font-family:Urbanist;-inkscape-font-specification:'Urbanist Bold Italic'"
id="path13176" /><path
d="m 734.86232,405.85149 h -10.86788 l -5.99414,42.35112 h -13.66888 l 5.99414,-42.35112 h -8.29096 l 1.90468,-13.66888 h 8.29096 l 2.46488,-17.59028 H 728.364 l -2.46488,17.59028 H 736.767 Z"
style="font-style:italic;font-weight:bold;font-family:Urbanist;-inkscape-font-specification:'Urbanist Bold Italic'"
id="path13178" /><path
d="m 739.62399,427.47521 4.98578,-35.2926 h 13.66888 l -4.4816,31.70732 q -0.39214,3.30518 0.8403,6.05016 1.23244,2.68896 3.69732,4.31354 2.5209,1.56856 5.77006,1.56856 3.30518,0 6.21822,-1.56856 2.96906,-1.62458 4.92976,-4.31354 2.01672,-2.74498 2.46488,-6.05016 l 4.4816,-31.70732 h 13.66888 l -7.8428,56.02 h -13.66888 l 0.67224,-5.09782 q -3.30518,3.02508 -7.5627,4.81772 -4.2015,1.73662 -8.73912,1.73662 -6.10618,0 -10.75584,-2.96906 -4.64966,-3.02508 -6.94648,-8.01086 -2.2408,-5.0418 -1.4005,-11.204 z"
style="font-style:italic;font-weight:bold;font-family:Urbanist;-inkscape-font-specification:'Urbanist Bold Italic'"
id="path13180" /><path
d="m 837.40976,390.61405 q 8.17892,0 14.34112,3.97742 6.1622,3.97742 9.18729,10.69982 3.0811,6.66638 1.90468,14.78928 -0.8403,6.10618 -3.9214,11.4841 -3.02509,5.37792 -7.67475,9.46738 -4.64966,4.03344 -10.30768,6.33026 -5.65802,2.29682 -11.82022,2.29682 -5.26588,0 -9.01922,-2.35284 -3.75334,-2.40886 -5.8821,-6.21822 l -1.06438,7.11454 h -13.66888 l 11.82022,-84.03 h 13.66888 l -4.92976,35.0125 q 3.24916,-3.80936 7.67474,-6.1622 4.42558,-2.40886 9.69146,-2.40886 z m -6.55434,45.82436 q 4.36956,0 8.17892,-2.18478 3.86538,-2.2408 6.49832,-5.93812 2.68896,-3.69732 3.30518,-8.23494 0.61622,-4.4816 -1.00836,-8.17892 -1.56856,-3.75334 -4.87374,-5.93812 -3.24916,-2.18478 -7.5627,-2.18478 -4.31354,0 -8.01086,2.2408 -3.6413,2.18478 -6.05016,5.93812 -2.40886,3.69732 -3.02508,8.1229 -0.61622,4.53762 0.78428,8.29096 1.4005,3.69732 4.42558,5.8821 3.02508,2.18478 7.33862,2.18478 z"
style="font-style:italic;font-weight:bold;font-family:Urbanist;-inkscape-font-specification:'Urbanist Bold Italic'"
id="path13182" /><path
d="m 892.30945,449.65913 q -7.73076,0 -13.55684,-3.97742 -5.77006,-3.97742 -8.62708,-10.69982 -2.801,-6.7224 -1.6806,-14.8453 0.8403,-6.10618 3.75334,-11.42808 2.96906,-5.37792 7.39464,-9.41136 4.42558,-4.08946 9.8035,-6.38628 5.43394,-2.29682 11.204,-2.29682 6.55434,0 11.59614,2.801 5.0418,2.74498 8.17892,7.5627 3.19314,4.81772 4.03344,10.97992 0.8403,6.1622 -1.00836,12.8846 h -40.8946 q 0.2801,3.13712 1.73662,5.65802 1.45652,2.46488 3.97742,3.97742 2.5209,1.45652 5.99414,1.51254 3.58528,0.056 6.77842,-1.6806 3.19314,-1.79264 5.54598,-4.81772 l 13.50082,3.24916 q -4.42558,7.45066 -11.87624,12.21236 -7.45066,4.70568 -15.85366,4.70568 z m -8.85116,-35.06852 h 27.56184 q -0.16806,-3.3612 -1.79264,-6.05016 -1.56856,-2.74498 -4.25752,-4.36956 -2.68896,-1.62458 -6.05016,-1.62458 -3.3612,0 -6.49832,1.62458 -3.0811,1.56856 -5.43394,4.31354 -2.29682,2.68896 -3.52926,6.10618 z"
style="font-style:italic;font-weight:bold;font-family:Urbanist;-inkscape-font-specification:'Urbanist Bold Italic'"
id="path13184" /></g><g
id="g10691"
transform="matrix(0.79053551,0,0,0.79053551,91.95505,93.12606)"
style="fill:#ffffff;stroke:#ffffff;stroke-width:3.86781;stroke-dasharray:none;stroke-opacity:1"><path
style="fill:#ffffff;stroke:#ffffff;stroke-width:5.61679;stroke-dasharray:none;stroke-opacity:1"
id="path10689"
d="m 290.38798,191.32796 68.57204,-39.59009 1e-5,79.18018 0,79.18017 -68.57205,-39.59009 -68.57204,-39.59008 z"
transform="matrix(-0.68861541,0,0,-0.68861541,586.1132,555.86413)" /></g><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:170.118px;font-family:'Manrope ExtraLight';-inkscape-font-specification:'Manrope ExtraLight, Bold';fill:#ffffff;stroke-width:1.18546"
x="1498.2238"
y="354.64182"
id="text10695"><tspan
id="tspan10693"
style="fill:#ffffff;stroke-width:1.18547"
x="1498.2238"
y="354.64182" /></text></g></g></g></g></svg>
transform="translate(-383.8923,-33.717606)"><g
id="g1157"
transform="translate(66.5396,-160)"
inkscape:export-filename="./g1157.svg"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"><g
aria-label="Poketube"
transform="scale(0.98720112,1.0129648)"
id="text976"
style="font-size:145.641px;font-family:Manrope;-inkscape-font-specification:'Manrope, @wght=800';font-variation-settings:'wght' 800;fill:#ffffff;stroke-width:3.4;stroke-linecap:round;stroke-linejoin:bevel;paint-order:stroke fill markers"><path
d="m 456.27173,300.46899 14.34564,-101.9487 h 35.09949 q 8.22871,0 14.34563,4.07795 6.11693,4.07795 9.10257,10.99589 2.98564,6.91795 1.74769,15.29231 -1.16513,8.52 -6.18974,15.43795 -5.02462,6.84512 -12.30667,10.92307 -7.20923,4.07795 -15.21948,4.07795 h -19.95282 l -5.82564,41.14358 z m 23.0841,-56.29024 h 18.42359 q 4.29641,0 8.22872,-2.18462 3.9323,-2.18462 6.55384,-5.82564 2.69436,-3.64103 3.34975,-8.22872 0.65538,-4.58769 -1.01949,-8.22871 -1.60205,-3.71385 -4.9518,-5.82564 -3.27692,-2.18462 -7.57333,-2.18462 h -18.42358 z"
style="font-family:Urbanist;-inkscape-font-specification:'Urbanist, @ital=1.00,wght=600';font-variation-settings:'ital' 1, 'wght' 600"
id="path4647" /><path
d="m 560.98952,302.36233 q -10.04923,0 -17.62256,-5.17026 -7.50051,-5.17025 -11.21436,-13.83589 -3.64103,-8.73846 -2.18462,-19.29744 1.09231,-8.01025 4.87898,-14.9282 3.85949,-6.99077 9.6123,-12.23385 5.75282,-5.31589 12.74359,-8.30153 7.06359,-2.98564 14.5641,-2.98564 10.04923,0 17.54974,5.17025 7.57334,5.17026 11.28718,13.90872 3.71385,8.73846 2.18462,19.37025 -1.09231,7.93744 -4.9518,14.85539 -3.78666,6.91794 -9.53948,12.23384 -5.75282,5.24308 -12.74359,8.22872 -6.99077,2.98564 -14.5641,2.98564 z m 2.11179,-15.14667 q 6.04411,0 11.28718,-3.2041 5.24308,-3.2041 8.81128,-8.44718 3.64103,-5.31589 4.44205,-11.50564 0.87385,-6.33538 -1.23795,-11.65128 -2.11179,-5.31589 -6.48102,-8.44718 -4.36923,-3.2041 -10.26769,-3.2041 -5.97128,0 -11.28718,3.2041 -5.24308,3.20411 -8.81128,8.52 -3.5682,5.3159 -4.44205,11.57846 -0.87385,6.48103 1.23795,11.7241 2.18461,5.24308 6.55384,8.37436 4.36923,3.05846 10.19487,3.05846 z"
style="font-family:Urbanist;-inkscape-font-specification:'Urbanist, @ital=1.00,wght=600';font-variation-settings:'ital' 1, 'wght' 600"
id="path4649" /><path
d="m 670.72839,300.46899 h -17.47692 l -13.54461,-30.87589 -13.69026,13.98154 -2.40307,16.89435 h -15.14667 l 15.36513,-109.23075 h 15.14666 l -9.68512,68.81537 31.67692,-32.40512 h 19.80717 l -28.98256,29.63795 z"
style="font-family:Urbanist;-inkscape-font-specification:'Urbanist, @ital=1.00,wght=600';font-variation-settings:'ital' 1, 'wght' 600"
id="path4651" /><path
d="m 710.01342,302.36233 q -10.04923,0 -17.62256,-5.17026 -7.50051,-5.17025 -11.21436,-13.83589 -3.64102,-8.73846 -2.18461,-19.29744 1.09231,-8.01025 4.87897,-14.9282 3.85949,-6.99077 9.61231,-12.23385 5.75282,-5.31589 12.74359,-8.30153 7.06358,-2.98564 14.5641,-2.98564 8.37435,0 14.85538,3.49538 6.48102,3.42256 10.55897,9.53949 4.15077,6.0441 5.3159,13.98153 1.23795,7.86462 -0.94667,16.74872 h -56.07179 q 0.14565,5.02461 2.33026,9.10256 2.18462,4.00513 6.0441,6.33539 3.93231,2.33025 9.24821,2.40307 5.53435,0 10.48615,-2.76718 4.95179,-2.76718 8.52,-7.64615 l 14.85538,3.56821 q -5.75282,9.68512 -15.43795,15.87486 -9.6123,6.11693 -20.53538,6.11693 z m -14.41846,-44.56615 h 41.36205 q 0,-5.24308 -2.33026,-9.46667 -2.33025,-4.29641 -6.4082,-6.7723 -4.07795,-2.54872 -9.32103,-2.54872 -5.17025,0 -9.90358,2.4759 -4.73334,2.47589 -8.22872,6.7723 -3.49539,4.22359 -5.17026,9.53949 z"
style="font-family:Urbanist;-inkscape-font-specification:'Urbanist, @ital=1.00,wght=600';font-variation-settings:'ital' 1, 'wght' 600"
id="path4653" /><path
d="m 804.4598,242.79516 h -15.2923 l -8.22872,57.67383 h -15.14666 l 8.22871,-57.67383 h -11.57846 l 2.1118,-15.14667 h 11.57846 l 3.13128,-22.86564 h 15.14666 l -3.13128,22.86564 h 15.29231 z"
style="font-family:Urbanist;-inkscape-font-specification:'Urbanist, @ital=1.00,wght=600';font-variation-settings:'ital' 1, 'wght' 600"
id="path4655" /><path
d="m 810.28551,273.16131 6.4082,-45.51282 h 15.14667 l -5.89846,41.79897 q -0.65539,4.87897 1.16512,8.8841 1.82052,4.00513 5.46154,6.40821 3.71385,2.33025 8.52,2.33025 4.87898,0 9.24821,-2.33025 4.36923,-2.40308 7.28205,-6.40821 2.91282,-4.00513 3.5682,-8.8841 l 5.82564,-41.79897 h 15.14667 l -10.19488,72.8205 h -15.14666 l 1.09231,-7.86461 q -4.36923,4.51487 -10.26769,7.13641 -5.89846,2.62154 -12.23385,2.62154 -8.08307,0 -14.2,-3.93231 -6.0441,-3.93231 -9.10256,-10.55897 -2.98564,-6.62667 -1.82051,-14.70974 z"
style="font-family:Urbanist;-inkscape-font-specification:'Urbanist, @ital=1.00,wght=600';font-variation-settings:'ital' 1, 'wght' 600"
id="path4657" /><path
d="m 935.49876,225.60952 q 10.63179,0 18.56923,5.17025 8.01025,5.17026 11.94256,13.90872 4.00513,8.66564 2.4759,19.29743 -1.09231,7.93744 -5.09744,14.92821 -3.9323,6.91794 -9.97641,12.23384 -5.97128,5.24308 -13.39897,8.22872 -7.35487,2.98564 -15.2923,2.98564 -7.64616,0 -12.88923,-3.49539 -5.24308,-3.5682 -8.08308,-9.10256 l -1.52923,10.70461 h -15.14666 l 15.36512,-109.23075 h 15.14667 l -6.55385,46.96922 q 4.36923,-5.60717 10.55897,-9.10256 6.26257,-3.49538 13.90872,-3.49538 z m -8.8841,62.04307 q 6.4082,0 12.01538,-3.20411 5.68,-3.2041 9.53949,-8.59282 3.9323,-5.38871 4.80615,-11.86974 0.94667,-6.62666 -1.45641,-12.01538 -2.40308,-5.38872 -7.20923,-8.52 -4.80615,-3.2041 -11.06872,-3.2041 -6.33538,0 -11.57846,3.2041 -5.24307,3.2041 -8.66564,8.59282 -3.42256,5.38872 -4.36923,11.94256 -0.87384,6.55385 1.01949,11.94256 1.96615,5.38872 6.33539,8.59282 4.36923,3.13129 10.63179,3.13129 z"
style="font-family:Urbanist;-inkscape-font-specification:'Urbanist, @ital=1.00,wght=600';font-variation-settings:'ital' 1, 'wght' 600"
id="path4659" /><path
d="m 1006.7901,302.36233 q -10.04923,0 -17.62257,-5.17026 -7.50051,-5.17025 -11.21435,-13.83589 -3.64103,-8.73846 -2.18462,-19.29744 1.09231,-8.01025 4.87897,-14.9282 3.85949,-6.99077 9.61231,-12.23385 5.75282,-5.31589 12.74356,-8.30153 7.0636,-2.98564 14.5641,-2.98564 8.3744,0 14.8554,3.49538 6.481,3.42256 10.559,9.53949 4.1508,6.0441 5.3159,13.98153 1.2379,7.86462 -0.9467,16.74872 h -56.07177 q 0.14564,5.02461 2.33025,9.10256 2.18462,4.00513 6.04411,6.33539 3.93231,2.33025 9.24821,2.40307 5.5343,0 10.4861,-2.76718 4.9518,-2.76718 8.52,-7.64615 l 14.8554,3.56821 q -5.7528,9.68512 -15.4379,15.87486 -9.6123,6.11693 -20.5354,6.11693 z m -14.41847,-44.56615 h 41.36207 q 0,-5.24308 -2.3303,-9.46667 -2.3302,-4.29641 -6.4082,-6.7723 -4.0779,-2.54872 -9.321,-2.54872 -5.1703,0 -9.9036,2.4759 -4.7333,2.47589 -8.22871,6.7723 -3.49538,4.22359 -5.17026,9.53949 z"
style="font-family:Urbanist;-inkscape-font-specification:'Urbanist, @ital=1.00,wght=600';font-variation-settings:'ital' 1, 'wght' 600"
id="path4661" /></g><g
style="fill:#ffffff;fill-opacity:1;stroke-width:0.870784"
id="g1151"
transform="matrix(1.14839,0,0,1.14839,288.64294,165.19861)"><path
fill-rule="evenodd"
clip-rule="evenodd"
d="m 39.782,41.7207 c -19.9967,22.5928 -19.0962,79.3023 -0.977,79.3023 12.5877,0 14.4521,-0.235 18.6508,-0.765 1.8451,-0.233 4.1409,-0.523 7.9954,-0.874 11.8103,-1.078 8.7256,-9.687 5.4833,-18.735 -2.1148,-5.9018 -4.2966,-11.9907 -2.4568,-16.2997 1.799,-4.2134 11.2308,-3.267 21.6295,-2.2235 9.5054,0.9538 19.8188,1.9886 25.8488,-0.7624 12.626,-5.7606 11.478,-35.0342 0,-45.4033 C 104.477,25.591 56.0977,23.2867 39.782,41.7207 Z m 43.8584,26.4989 c 4.6659,0 11.377,-1.8662 11.9479,-8.398 0.0288,-0.3298 0.0587,-0.6612 0.0886,-0.9937 0.6497,-7.211 1.3445,-14.924 -7.4412,-17.6686 -11.9479,-3.7324 -17.4623,11.15 -17.4623,18.6623 0,6.5318 8.201,8.398 12.867,8.398 z"
fill="url(#paint0_linear_9_6)"
id="path1134"
style="fill:#ffffff;fill-opacity:1;stroke-width:0.758265" /></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

View file

@ -254,21 +254,24 @@ body {
height:66px
}
.new-button {
background:#0009;
border-radius:0.5em;
padding-right:1em;
display:flex;
justify-content:center;
align-items:center;
align-content:center;
width:max-content;
margin-top:4px;
margin-left:3px;
margin-right:0
background: #0009;
border-radius: 1.5em;
padding-right: 1em;
display: flex;
justify-content: center;
align-items: center;
align-content: center;
width: max-content;
margin-top: 4px;
margin-left: 3px;
margin-right: 0;
border: solid 0.5px #333;
}
.pill-button {
margin-left:1em;
font-family:ubuntu,sans-serif
margin-left: 1em;
font-family: 'PokeTube Flex';
font-stretch: ultra-expanded;
font-weight: 800;
}
.vertical {
border-left:1px solid gray;
@ -1742,7 +1745,7 @@ a.icon-link>i {
background:#fff;
border-radius:2em;
text-transform:initial;
font-weight:900;
font-weight:1000;
padding:10px 16px;
border:none;
margin-left:.5em;
@ -1768,11 +1771,13 @@ h3 {
ptd-custom-more {
color:#fff
}
@media screen and (orientation:landscape) {
.ptnewbuttons {
margin-left:auto;
width:fit-content;
width:-moz-fit-content;
overflow:scroll;
max-width:150em!important;
margin-right: auto !important;
}

View file

@ -49,9 +49,12 @@
src:url('https://p.poketube.fun/https://cdn.statically.io/gh/brecert/discord-quote-generator/main/Ginto-Nord-800.woff') format("woff");
}
.channel-info-container > img {
width: 100%;
width: 98%;
border-radius: 1em;
margin-top: 6px;
margin-bottom: -9px;
}
:root {
--text-primary: #fff;
@ -254,8 +257,14 @@ padding-bottom: 32px;
table-layout: auto;
border-spacing: 4px 0;
}
.tabs.tabs-center {
margin: auto;
.tabs.tabs-center {
margin-left: 2em;
margin-top: 3em !important;
font-size: 12px;
font-family: ubuntu;
border-top-right-radius: 11px;
border-top-left-radius: 11px;
background: #333;
}
.tabs.tabs-justify {
width: 100%;
@ -558,7 +567,7 @@ color:#ea9999 !important;
<% } %>
<div class="name" style="background: #333;border-radius: 12px;padding: 9px;">
<div class="name" style="background: #333;border-radius: 12px;padding: 9px;height: 6em;">
<p style="font-family:PokeTube Flex,sans-serif;font-weight:1000;font-stretch: ultra-expanded;margin-top: 16px;margin-bottom: 15px;"><%=j.Channel?.Metadata.Name%>
<span style="background: #0005;padding: 3px;padding-top: 2.5px !important;display: inline-flex;border-radius: 3px;">
@ -590,18 +599,20 @@ color:#ea9999 !important;
<p>Error: <%= error.message %></p>
<% } %>
<i class="fa-thin fa-angle-right"></i></a>
<i class="fa-thin fa-angle-right"></i></a><br><button class="subscribe-button " style="text-decoration: none;margin-right:3px !important;"> <a style="color: black;
white-space: nowrap;text-decoration: none;" id="sub">Suscribe</a></button><button class="subscribe-button " style="text-decoration: none;"> <a style="color: black;
white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<%=ID%>">Rss feed </a></button>
</p>
</div>
<button class="subscribe-button " style="text-decoration: none;"> <a style="color: black;
white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<%=ID%>">Rss feed </a></button>
</div>
<% if (!isMobile) { %>
<div class="tabs tabs-center">
<% if (!tab) { %>
<div class="tabs tabs-center" style="margin-top: 26px;">
<% if (!tab) { %>
<a href="/channel?id=<%=ID%>" class="tab active" style="color:#cfe2f3;">Videos</a>
@ -636,8 +647,7 @@ white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<
<% } %>
<a href="/channel?id=<%=ID%>&tab=about" class="tab" style="color:gold">About</a>
<% } %>
<% } %>
<% if (tab === "about") { %>
<a href="/channel?id=<%=ID%>" class="tab" style="color:#cfe2f3;">Videos</a>
@ -670,8 +680,7 @@ white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<
<% } %>
<a href="/channel?id=<%=ID%>&tab=about" class="tab active" style="color:gold">About</a>
<% } %>
<% } %>
<% if (tab === "community") { %>
@ -696,8 +705,7 @@ white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<
<a href="/channel?id=<%=ID%>&tab=community" class="tab active" style="color:pink">Community</a>
<a href="/channel?id=<%=ID%>&tab=about" class="tab" style="color:gold">About</a>
<% } %>
<% } %>
<% if (tab === "shorts") { %>
@ -724,8 +732,7 @@ white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<
<% } %>
<% } %>
<a href="/channel?id=<%=ID%>&tab=about" class="tab" style="color:gold">About</a>
<% } %>
<% } %>
<% if (tab === "live") { %>
@ -751,8 +758,7 @@ white-space: nowrap;text-decoration: none;" href="/feeds/videos.xml?channel_id=<
<% } %>
<% } %>
<a href="/channel?id=<%=ID%>&tab=about" class="tab" style="color:gold">About</a>
<% } %>
<% } %>
</div>
@ -810,10 +816,11 @@ width: fit-content;
<div style="text-align: center;padding: 3px;margin-top: 0px;">
<div class="tabs tabs-center">
<% if (!tab) { %>
<div class="tabs tabs-center" style="overflow: scroll;width: 7em;font-size: 10px;margin-left: -1px;font-family: poketube flex !important;font-weight: 800 !important;font-stretch: ultra-expanded;">
<a href="/channel?id=<%=ID%>" class="tab active">Home</a>
<% if (!tab) { %>
<a href="/channel?id=<%=ID%>" class="tab active">Videos</a>
<% if (Array.isArray(c.comments)) { %>
<% if (c.comments.length != "0") { %>
@ -821,22 +828,50 @@ width: fit-content;
<a href="/channel?id=<%=ID%>&tab=community" class="tab">Community</a>
<% } %>
<% } %>
<a href="/channel?id=<%=ID%>&tab=about" class="tab">About</a>
<% } %>
<% if (tab ==="about") { %>
<% if (Array?.isArray(shorts?.videos)) { %>
<a href="/channel?id=<%=ID%>" class="tab">Home</a>
<% if (turntomins(shorts?.videos[0]?.lengthSeconds) != "aN:aN" ) { %>
<a href="/channel?id=<%=ID%>&tab=shorts" class="tab">Shorts</a>
<% } %>
<% } %>
<% } %>
<% if (tab ==="about") { %>
<% if (Array?.isArray(shorts?.videos)) { %>
<% if (turntomins(shorts?.videos[0]?.lengthSeconds) != "aN:aN" ) { %>
<a href="/channel?id=<%=ID%>&tab=shorts" class="tab">Shorts</a>
<% } %>
<% } %>
<a href="/channel?id=<%=ID%>" class="tab">Videos</a>
<a href="/channel?id=<%=ID%>&tab=community" class="tab">Community</a>
<a href="/channel?id=<%=ID%>&tab=about" class="tab active">About</a>
<% } %>
<% } %>
<% if (tab ==="community") { %>
<a href="/channel?id=<%=ID%>" class="tab">Home</a>
<a href="/channel?id=<%=ID%>&tab=community" class="tab active">Community</a>
<a href="/channel?id=<%=ID%>&tab=about" class="tab">About</a>
<% } %>
<a href="/channel?id=<%=ID%>" class="tab">Videos</a>
<% if (Array?.isArray(shorts?.videos)) { %>
<% if (turntomins(shorts?.videos[0]?.lengthSeconds) != "aN:aN" ) { %>
<a href="/channel?id=<%=ID%>&tab=shorts" class="tab">Shorts</a>
<% } %>
<% } %>
<a href="/channel?id=<%=ID%>&tab=community" class="tab active">Community</a>
<% } %>
<% if (tab ==="shorts") { %>
<a href="/channel?id=<%=ID%>" class="tab">Videos</a>
<% if (Array?.isArray(shorts?.videos)) { %>
<% if (turntomins(shorts?.videos[0]?.lengthSeconds) != "aN:aN" ) { %>
<a href="/channel?id=<%=ID%>&tab=shorts" class="tab active">Shorts</a>
<% } %>
<% } %>
<a href="/channel?id=<%=ID%>&tab=community" class="tab">Community</a>
<% } %>
</div>
@ -1313,51 +1348,19 @@ width: fit-content;
<script src="/css/custom-css.js"> </script>
<script>
// Fetch URLs and handle progress saving
const urls = document.querySelectorAll('a[href*="/watch?v="]');
const spinner = document.createElement('div');
spinner.id = 'fetch-spinner';
spinner.classList.add('hide');
document.body.appendChild(spinner);
const text = document.createElement('div');
text.id = 'fetch-text';
text.classList.add('hide');
document.body.appendChild(text);
document.body.classList.add('blur');
var anchor = document.getElementById("sub");
let fetchedCount = 0;
// Check if there's a user ID in localStorage
var userID = localStorage.getItem("UserID");
urls.forEach(link => {
const url = new URL(link.href);
if (url.host !== 'www.youtube.com' && url.host !== 'youtube.com' && url.host !== "redirect.poketube.fun") {
console.log(`Fetching ${url.origin}`);
spinner.classList.remove('hide');
text.classList.remove('hide');
fetch(url.href)
.then(response => {
if (response.status === 500) {
// do nothing
}
console.log(`Fetched ${url.origin}`);
fetchedCount++;
console.clear()
if (fetchedCount === urls.length) {
spinner.classList.add('hide');
text.classList.add('hide');
document.body.classList.remove('blur');
}
})
.catch(error => {
spinner.classList.add('hide');
text.classList.add('hide');
console.clear()
if (!(error instanceof TypeError && error.message.includes('Failed to fetch'))) {
console.error(`Error fetching ${url.origin}: ${error}`);
}
});
}
});
if (userID) {
// If user ID exists in localStorage, set the href attribute
anchor.href = `/api/set-channel-subs?ID=${userID}&channelName=<%=j.Channel?.Metadata.Name%>&avatar=https://p.poketube.fun/<%- j.Channel?.Metadata.Avatars.Thumbnail?.$t %>&channelID=<%= ID %>`;
} else {
// If user ID doesn't exist in localStorage, you can handle it as needed
console.log("User ID not found in localStorage");
// Optionally, you can set a default href or display an error message.
}
</script>
</body>

View file

@ -20,7 +20,7 @@
-->
<!DOCTYPE html>
<html class="poketube_desktop_player" version="browser_web_lite">
<html class="poketube_desktop_player" version="browser_web_lite" style="background: #000;">
<head>
<% if (e === false) { %>
<!-- MetaTag disabled -->
@ -31,15 +31,15 @@
<meta content="<%=k.Video.Channel.Name%>" name=twitter:author>
<meta content=@youtube name=twitter:site>
<meta content="https://poketube.fun/lite?v=<%=inv_vid.videoId%>" name=twitter:url>
<meta content="<%=inv_vid.title%> - PokeTube Lite " name=twitter:title>
<meta content="Watch this video by <%=k.Video.Channel.Name%> On PokeTube Lite! Save Your Bandwidth while protecting your privacy!" property=twitter:description>
<meta content="<%=inv_vid.title%> - Lite " name=twitter:title>
<meta content="Watch this video by <%=k.Video.Channel.Name%> On Lite! Save Your Bandwidth while protecting your privacy!" property=twitter:description>
<meta content="https://i.ytimg.com/vi/<%=inv_vid.videoId%>/maxresdefault.jpg" property=og:image>
<meta content=summary_large_image name=twitter:card>
<link href="https://poketube.fun/lite?v=<%=inv_vid.videoId%>" itemprop=url>
<link href="http://www.youtube.com/channel/<%=k.Video.Channel.id%>" itemprop=url>
<% } %> <!-- close the } -->
<link href="/css/yt-ukraine.svg" rel=icon>
<title> <%=inv_vid.title%> | PokeTube Lite </title>
<title> <%=inv_vid.title%> | Lite </title>
<style>
.comments-area {
@ -244,7 +244,21 @@ background: none !important;
word-break: break-all;
white-space: normal;
}
</style>
<% if (lightOrDark(color) == "light") { %>
.player.video-ambient-container {
box-shadow: 0 -8px 5.9em <%=color%>;
}
<% } %>
<% if (lightOrDark(color) == "dark") { %>
.player.video-ambient-container {
box-shadow: 0 -8px 5.9em <%=color2%>;
}
<% } %>
</style>
<link href=/css/app-cdn.min.css rel=stylesheet>
<link href=/css/app.main.css rel=stylesheet>
@ -267,17 +281,12 @@ background: none !important;
<div class="app" style="color:#fff;border-radius: 0em !important;">
<nav>
<nav style="position: sticky;">
<div class=left>
<% if (inv_vid.genre != "Music") { %>
<a class="class" href="/143" style=font-family:Inter,sans-serif;color:#fff> <img style="transform: scale(1.3);padding-left:0.9em;width: 8.5em;display: block;margin-left: auto;margin-right: auto;" src="/css/logo.svg?v=5"></a>
<% } %>
<% if (inv_vid.genre === "Music") { %>
<a class="class" href="/143" style=font-family:Inter,sans-serif;color:#fff> <img style="transform: scale(1.0);padding-left:0;width: 7.5em;display: block;margin-left: auto;margin-right: auto;" src="/css/logo-poke.svg?v=5"></a>
<a class="class" href="/143" style=font-family:Inter,sans-serif;color:#fff> <img style="transform: scale(1.3);padding-left:0.9em;width: 7.5em;display: block;margin-left: auto;margin-right: auto;" src="/css/music.svg?v=5"></a>
<% } %>
</div>
<div class="middle">
<form action="/search"><input class="search-bar" autocomplete="on" id="fname" name="query" style="color:#fff;font-family:Inter,sans-serif;border-radius: 2em;" data-ddg-inputtype="identities.firstName">
@ -303,7 +312,7 @@ background: none !important;
<div class="video-player-container">
<video class="player" id="<%=sha384(inv_vid.videoId)%>" style="border-radius: 7px;margin-left: -5.5px;" autoplay controls
<video class="player video-ambient-container" id="<%=sha384(inv_vid.videoId)%>" style="border-radius: 7px;margin-left: -5.5px;" autoplay controls
poster="https://p.poketube.fun/https://i.ytimg.com/vi/<%=inv_vid.videoId%>/maxresdefault.jpg?v=607ddcd4">

View file

@ -42,7 +42,8 @@
<meta content="<%=k.Video.Channel.Name%>" name=twitter:author>
<meta content="https://poketube.fun/watch?v=<%=inv_vid.videoId%>" name=twitter:url>
<meta content="<%=inv_vid.title%> | PokeTube" name=twitter:title>
<meta content="Watch this video from <%=k.Video.Channel.Name%> On PokeTube! The Libre YouTube Front end!1!" property=twitter:description>
<meta content="Watch this video from <%=k.Video.Channel.Name%> On Poke!
👍 <%=convert(engagement.likes)%> | 👎 <%=convert(engagement.dislikes)%> | 📈 <%=convert(engagement.viewCount)%> Views 🗓️ <%= date %>" property=twitter:description>
<meta content="https://i.ytimg.com/vi/<%=inv_vid.videoId%>/maxresdefault.jpg" property=og:image>
<meta content=summary_large_image name=twitter:card>
<link rel="manifest" href="/manifest.json">
@ -695,7 +696,6 @@ But Please note that unofficial instances can add the same lock icon, so please
<button class="btn btn-success" type="submit" style="transform: translate(21em, -1.25em);"><i class="fa-light fa-search"></i></button>
</form>
<img src="https://t.poketube.fun/t/rep.gif" style="border:0;width: 0;visibility: hidden;">
</div>
<div class="right">
@ -727,6 +727,7 @@ Account
<a href="/settings" style="text-decoration: none;" class="dropdown__item">
<i class="fa-light fa-globe"></i>
Region settings </a>
<hr style="clear: both;display: block;border: none;border-bottom: 0.5px solid #1a1111;width: 16.5em;height: 0;">
<% if (!a) { %>
@ -767,6 +768,7 @@ Region settings </a>
<% } %>
<hr style="clear: both;display: block;border: none;border-bottom: 0.5px solid #1a1111;width: 16.5em;height: 0;">
<% if (!universe) { %>
@ -786,7 +788,10 @@ Region settings </a>
<% } %>
<a title="Low Bandwidth? try PokeTube Lite!" href="/lite?v=<%=inv_vid.videoId%>" style="text-decoration: none;" class="dropdown__item">
<i class="fa-light fa-bolt" style="width: 16px;height: 17px;margin-left: 2px;"></i>
Go Lite!
</a>
<hr style="clear: both;display: block;border: none;border-bottom: 0.5px solid #1a1111;width: 16.5em;height: 0;">
<a href="/video/upload" style="text-decoration: none;" class="dropdown__item">
@ -821,7 +826,7 @@ About
<div id="popupMenu" class="popup">
<div >
<a href="/download?v=<%=inv_vid.videoId%>" style="color: #fff;">
Save Video</a>
<i class="fa-light fa-download"></i> Download Video</a>
</div>
<div>
@ -829,7 +834,7 @@ About
<% if (isvidious) { %>
<% if (!qua) { %>
<a href="<%=u%>/latest_version?id=<%=inv_vid.videoId%>&itag=22&local=true" style="color: #fff;" target="_blank">
Open video in new tab
<i class="fa-light fa-arrow-up-right-from-square"></i> Open video in new tab
</a>
<% } %>
@ -837,7 +842,7 @@ About
<% if (qua === "medium") { %>
<a href="<%=u%>/latest_version?id=<%=inv_vid.videoId%>&itag=18&local=true" target="_blank" style="color: #fff;">
Open video in new tab
<i class="fa-light fa-arrow-up-right-from-square"></i> Open video in new tab
</a>
<% } %>
@ -847,7 +852,7 @@ About
<% if (!qua) { %>
<a href="https://tube.kuylar.dev/proxy/media/<%=inv_vid.videoId%>/22 " target="_blank" style="color: #fff;">
Open video in new tab
<i class="fa-light fa-arrow-up-right-from-square"></i> Open video in new tab
</a>
@ -856,7 +861,7 @@ About
<% if (qua === "medium") { %>
<a href="https://tube.kuylar.dev/proxy/media/<%=inv_vid.videoId%>/18 " target="_blank" style="color: #fff;">
Open video in new tab
<i class="fa-light fa-arrow-up-right-from-square"></i> Open video in new tab
</a>
@ -864,15 +869,15 @@ About
<% } %>
</div>
<div id="loopOption">
Loop Video
<i class="fa-light fa-repeat"> </i> Loop Video
</div>
<div id="speedOption">
Speed: 1x
<i class="fa-light fa-gauge"></i> Speed: 1.00x
</div>
<hr style="clear: both;display: block;border: none;border-bottom: 0.5px solid #1a1111;/*! width: 4.5em; */height: 0;">
<div >
<a href="https://codeberg.org/Ashley/poketube/issues/new" style="color: #fff;">
Report broken proxy/video</a>
<i class="fa-light fa-flag"></i> Report broken proxy/video</a>
</div>
</div>
@ -885,10 +890,8 @@ Speed: 1x
box-sizing: border-box;
min-width: 100%;
display: block; !important;" autoplay controls
poster="https://p.poketube.fun/https://i.ytimg.com/vi/<%=inv_vid.videoId%>/maxresdefault.jpg?v=607ddcd4">
<% if (isvidious) { %>
<% if (!qua) { %>
<source src="<%=u%>/latest_version?id=<%=inv_vid.videoId%>&itag=22&local=true" type="video/mp4; codecs=&quot;avc1.64001F, mp4a.40.2&quot;" label="hd720" selected="true">
@ -923,13 +926,11 @@ display: block; !important;" autoplay controls
<% inv_vid.captions?.forEach(x => { %>
<track src="/api/subtitles?v=<%=inv_vid.videoId%>&h=<%= x.label %>" label="<%= x.label.replace("United States","Simplified - USA") %>" kind="subtitles">
<img src="https://t.poketube.fun/t/rep.gif?v=<%=btoa(inv_vid.videoId)%>&h=<%= x.label %>" id="subtitle_usage_rate" style="border:0;width: 0;visibility: hidden;">
<% }) %>
<% }) %>
<% } %>
<% if (!Array.isArray( inv_vid.captions)) { %>
<track src="/api/subtitles?v=<%=inv_vid.videoId%>&h=<%= %>" label="<%= video.Subtitles.Subtitle.language.replace("United States","Simplified - USA") %>" kind="subtitles">
<img loading="lazy" src="https://t.poketube.fun/t/rep.gif?v=<%=btoa(inv_vid.videoId)%>&h=<%= video.Subtitles.Subtitle.language %>" id="subtitle_usage_rate" style="border:0;width: 0;visibility: hidden;">
<% } %>
@ -937,10 +938,10 @@ display: block; !important;" autoplay controls
<% if (!a) { %>
<canvas width="150" height="150" id="ambient-canvas"></canvas>
<% } %>
<img loading="lazy" src="https://t.poketube.fun/t/rep.gif?video=<%=btoa(inv_vid.videoId)%>" style="border:0;width: 0;visibility: hidden;" id="video">
<div class="pwp" style="display: flex;justify-content: center;align-items: center;flex-direction: row; column-gap: 3px;margin-top: -1em;max-height: 16px;" align="center">
<% } %>
<div class="pwp" style="display: flex;justify-content: center;align-items: center;flex-direction: row; column-gap: 3px;margin-top: -1em;max-height: 16px;" align="center">
<% if (!qua) { %>
@ -971,21 +972,6 @@ display: block; !important;" autoplay controls
<a href="#video" class="maxi" id="maximize"> <i style="display: block;" title="Maximise!" class="fa-light fa-maximize"></i> </a>
<!-- comments -->
<% if (inv.comments) { %>
<% if (inv.comments.length > 8 ) { %>
<div class="flying_cmnt">
<% inv.comments.slice(-8).forEach(x =>{ %>
<marquee loop="INFINITY">
<%- x.contentHtml %>
</marquee>
<% }) %>
</div>
<% } %> <% } %>
<!-- Stats for nerds -->
@ -1118,8 +1104,8 @@ display: block; !important;" autoplay controls
<a title="Support the Creator of the video!" style="color:var(--text-color);text-decoration: none;" href="https://www.patreon.com/join/<%- support.name %>">
<div class="pill-button">
<i class="fa-light fa-badge-dollar"></i>
Support
<i class="fa-light fa-heart"></i>
Thanks!
</div>
</div>
@ -1167,11 +1153,11 @@ display: block; !important;" autoplay controls
<% if (!video?.Channel.Name.endsWith(' - Topic')) { %>
<% if (!inv_vid.title.endsWith('Audio)')) { %>
<div class="new-button button-lite" style=";margin-left: -4px;">
<a title="Low Bandwidth? try PokeTube Lite!" style="color:var(--text-color);text-decoration: none" href="/lite?v=<%=inv_vid.videoId%>">
<a title="See videos comments" style="color:var(--text-color);text-decoration: none" href="#comments-container">
<div class="pill-button">
<i class="fa-light fa-bolt"></i>
Go Lite!
<i class="fa-light fa-comments"></i>
Comments
</div>
</a>
</div>
@ -1431,94 +1417,17 @@ display: block; !important;" autoplay controls
<div class="comments">
<div class="comments-class-or-something-i-cant-find-a-name-lol">
<a id="comments-container"></a>
<h5 style="font-family:var(--text-font-primary);font-weight:var(--text-header-weight);white-space:yes;font-stretch: ultra-expanded;margin-bottom: 11px;margin-top: 6px;padding-top: 10px;">
Comments <span style="font-family: inter;font-weight: 900;text-transform: lowercase;margin: 1px;">- <%- convert(inv.commentCount) %></span>
</h5>
<p style="padding: 0;margin: 0;font-family: Inter;margin-bottom: 10px;">
Top Comments are being randered rn :3 all comments are soon!
Top Comments of this video!! :3
</p>
<hr style="clear: both;display: block;border: none;border-bottom: 0.5px solid #2f2f2f;margin: 0 0;/*! width: 4.5em; */height: 0;">
<% inv.comments.forEach(x =>{ %>
<div class="<%- x.commentId %>.<%- btoa(x.commentId) %> fade-in ">
<div class="comment_<%- x.commentId %>_<%- btoa(btoa(x.commentId)) %>" style="padding: 10px;">
<div class="comment-list left-padding" style="background: #333;padding-top: 1px;padding: 10px;border-radius: 30px;padding-top: 0;">
<div class="single-comment justify-content-between d-flex" style="padding-top: none;">
<div class="user justify-content-between d-flex">
<div class="desc">
<h5 style="display: flex;margin-top: 7px;padding-top: 10px;"><div class="thumb">
<a href="/channel?id=<%- x.authorId%>" class="avatar" style="width: 40px;height: 40px;">
<img loading="lazy" src="/avatars/<%= x.authorThumbnails[1].url.replace("https://yt3.ggpht.com/", "") %>">
</a>
</div>
<% if (!x.authorIsChannelOwner) { %>
<p class="comments-author">
<a href="/channel?id=<%- x.authorId%>" style="color: var(--text-color);text-decoration: none;" >
<%- x.author%> <% if (x.verified) { %>
<i class="icon ion ion-md-checkmark-circle"></i>
<% } %>
<p class="date-publish">
<%- x.publishedText %>
</p>
</a>
</p> <% } %>
<% if (x.authorIsChannelOwner) { %>
<p class="comments-author owner">
<a href="/channel?id=<%- x.authorId%>" style="color: var(--text-color);text-decoration: none;" >
<%- x.author%> <% if (x.verified) { %>
<i class="icon ion ion-md-checkmark-circle"></i>
<% } %>
<p class="date-publish">
<%- x.publishedText %>
</p>
</a>
<% } %>
</p>
</h5>
<p class="comment" style="font-weight: bold;">
<%- x.contentHtml %>
<br> <br>
<span> <i class="fa-light fa-thumbs-up"></i>
<%- convert(x.likeCount) %> | <i class="fa-light fa-thumbs-down"></i> <% if(x.creatorHeart) { %>
<i class="icon ion-ios-heart creator-heart-small-container" title="<%= x.creatorHeart.creatorName%> marked it with a ❤ owo"></i>
</span>
<% } %>
</p>
</div>
</div>
</div>
</div>
</div>
<!-- This is to see how much comments loaded in a video, i dont collect the comment metadata - its sha hashed (see /privacy ) -->
<img loading="lazy" src="https://t.poketube.fun/t/rep.gif?v=<%=sha384(inv_vid.videoId)%>&pub_date=<%-sha384(x.publishedText)%>&content_comment_sha=<%- sha384(x.content)%>&id=<%- sha384(x.commentId) %>" id="comments_rate" style="border:0;width: 0;visibility: hidden;display:none;">
</div>
<% }) %>
<% inv.comments.forEach(x =>{ %><div class=". fade-in <%- x.commentId %> <%- btoa(x.commentId) %> "><div class="_ comment_ <%- x.commentId %> <%- btoa(btoa(x.commentId)) %>"style=padding:10px><div class="comment-list left-padding"style=background:#333;padding-top:1px;padding:10px;border-radius:30px;padding-top:0><div class="d-flex justify-content-between single-comment"style=padding-top:none><div class="d-flex justify-content-between user"><div class=desc><h5 style=display:flex;margin-top:7px;padding-top:10px><div class=thumb><a href="/channel?id=<%- x.authorId%>"style=width:40px;height:40px class=avatar><img loading=lazy src="/avatars/<%= x.authorThumbnails[1].url.replace("https://yt3.ggpht.com/", "") %>"></a></div> <% if (!x.authorIsChannelOwner) { %> <p class=comments-author><a href="/channel?id=<%- x.authorId%>"style=color:var(--text-color);text-decoration:none> <%- x.author%> <% if (x.verified) { %> <i class="icon ion ion-md-checkmark-circle"></i> <% } %> <p class=date-publish> <%- x.publishedText %> </p></a></p> <% } %> <% if (x.authorIsChannelOwner) { %> <p class="comments-author owner"><a href="/channel?id=<%- x.authorId%>"style=color:var(--text-color);text-decoration:none> <%- x.author%> <% if (x.verified) { %> <i class="icon ion ion-md-checkmark-circle"></i> <% } %> <p class=date-publish> <%- x.publishedText %> </p></a> <% } %> </h5><p class=comment style=font-weight:700> <%- x.contentHtml %> <br><br><span><i class="fa-light fa-thumbs-up"></i> <%- convert(x.likeCount) %> | <i class="fa-light fa-thumbs-down"></i> <% if(x.creatorHeart) { %> <i class="icon creator-heart-small-container ion-ios-heart"style=color:#ffabcc title="<%= x.creatorHeart.creatorName%> marked it with a ❤ owo"></i> </span> <% } %> </div></div></div></div></div></div> <% }) %>
<center>
<a href="#top">Go To Top</a>
@ -1574,35 +1483,7 @@ Recommended Videos
</div>
<% if (!f) { %>
<% k.Video.Recommendations?.Video?.forEach(x => { %>
<div class="video fade-in" >
<% if (!optout) { %>
<a href="/watch?v=<%= x.id %>" alt="<%= x.Title %>" class="thumbnail " style="background-image: url('/vi/<%= x.id %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw');border-radius: 9.5px;" > <span class="video-length"><%- x.duration || "LIVE"%></span>
<% } %>
<% if (optout) { %>
<a href="/watch?v=<%= x.id %>&m=f" alt="<%= x.Title %>" class="thumbnail" style="background-image: url('/vi/<%= x.id %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw');border-radius: 9.5px;" > <span class="video-length"><%- x.duration || "LIVE"%></span>
<% } %>
</a>
<div class="info">
<% if (!optout) { %>
<a href="/watch?v=<%= x.id %>" class="title max-lines-2" title="<%= x.Title %>" style="font-stretch: 100%;font-weight: 800;"><%= x.Title %></a>
<% } %>
<% if (optout) { %>
<a href="/watch?v=<%= x.id %>&m=f" class="title max-lines-2" title="<%= x.Title %>" style="font-stretch: 100%;font-weight: 800;"><%= x.Title %></a>
<% } %>
<div>
<a class="max-lines-2" href="/channel?id=<%= x.Channel.id %>" style="-webkit-line-clamp: 1;width: 12em;word-wrap: break-word;"><%=x.Channel.Name %></a>
<div class="video-views"> <%= x.uploadedAt.replace("Streamed", "Live") %> • <%= convert(x.views) %> views </div>
</div>
</div>
</div>
<% }) %>
<% } %>
<% if (!f) { %> <% k.Video.Recommendations?.Video?.forEach(x => { %> <div class="fade-in video"> <% if (!optout) { %> <a class=thumbnail href="/watch?v=<%= x.id %>"style="background-image:url('/vi/<%= x.id %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw');border-radius:9.5px"alt="<%= x.Title %>"><span class=video-length><%- x.duration || "LIVE"%></span> <% } %> <% if (optout) { %> <a class=thumbnail href="/watch?v=<%= x.id %>&m=f"style="background-image:url('/vi/<%= x.id %>/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBy_x4UUHLNDZtJtH0PXeQGoRFTgw');border-radius:9.5px"alt="<%= x.Title %>"><span class=video-length><%- x.duration || "LIVE"%></span> <% } %> </a><div class=info> <% if (!optout) { %> <a class="max-lines-2 title"href="/watch?v=<%= x.id %>"style=font-stretch:100%;font-weight:800 title="<%= x.Title %>"><%= x.Title %></a> <% } %> <% if (optout) { %> <a class="max-lines-2 title"href="/watch?v=<%= x.id %>&m=f"style=font-stretch:100%;font-weight:800 title="<%= x.Title %>"><%= x.Title %></a> <% } %> <div><a class=max-lines-2 href="/channel?id=<%= x.Channel.id %>"style=-webkit-line-clamp:1;width:12em;word-wrap:break-word><%=x.Channel.Name %></a><div class=video-views> <%= x.uploadedAt.replace("Streamed", "Live") %> • <%= convert(x.views) %> views</div></div></div></div> <% }) %><% } %>
<% if (f) { %>
@ -1702,13 +1583,6 @@ Recommended Videos
</div>
<!-- IGNORE THESE -->
<a href="/channel?id=<%=video?.Channel.id || k.Video.Channel.id%>&tab=community" style="display:none;"></a><a href="/channel?id=<%=video?.Channel.id || k.Video.Channel.id%>&tab=shorts" style="display:none;"></a><a href="/channel?id=<%=video?.Channel.id || k.Video.Channel.id%>&tab=live" style="display:none;"></a><a href="/channel?id=<%=video?.Channel.id || k.Video.Channel.id%>&tab=about" style="display:none;"></a>
<img src="<%=t%>t/rep.gif?ID=<%=btoa(Date.now())%>" style="width: 0;visibility: hidden;" id="ChannelCacheLoadedOrNot">
<!-- IGNORE THESE -->
<!-- SCRIPTS -->
@ -1805,6 +1679,7 @@ const urlParams = new URLSearchParams(window.location.search);
if (!urlParams.has('hl') && !urlParams.has('region') && languageCode && regionCode) {
location.href = currentURL + `&region=${regionCode}&hl=${languageCode}`;
}
let isMiddleButtonPressed = false;
// Function to change video speed
@ -1842,15 +1717,14 @@ if (userID) {
anchor.href = `/api/set-channel-subs?ID=${userID}&channelName=<%=k.Video.Channel.Name%>&avatar=https://p.poketube.fun/<%= k.Video.Channel.Avatar[1].$t %>&channelID=<%=video?.Channel.id || k.Video.Channel.id %>`;
} else {
// If user ID doesn't exist in localStorage, you can handle it as needed
console.log("User ID not found in localStorage");
// Optionally, you can set a default href or display an error message.
anchor.href = "/account-create"
// Optionally, you can set a default href or display an error message.
}
// Now, all the selected video links should have the parameters added to their href attributes
// Now, all the selected links should have the parameters appended
</script>
</script>
<!-- app.js -->
<!-- app.js -->
<!-- app.js -->
@ -1858,7 +1732,14 @@ if (userID) {
<!-- app.js -->
<!-- app.js -->
<!-- Ambient Mode, for PokeTube -->
<!-- Ambient Mode, for PokeTube --><% if(!IsOldWindows) { %>
<script>
console.error("[AMBIENT MODE] error_device_not_supported")
</script>
<% } %>
<% if(!IsOldWindows) { %>
<script>
let requestId;
@ -1929,9 +1810,10 @@ window.addEventListener("unload", cleanup)
z-index: -1;
}
</style>
<% } %>
<script src="/static/app.bundle.js?ver=<%-btoa("1f739d93") %>&bundledat=<%- Date.now() %>"></script>
<style> img.emoji {height: 1em;width: 1em;margin: 0 .05em 0 .1em;vertical-align: -0.1em;}</style>
<script>twemoji.parse(document.body,{ base: 'https://p.poketube.fun/https://cdn.zptr.cc/twemoji/' })</script><script>
<script>twemoji.parse(document.body,{ base: 'https://cdn.zptr.cc/twemoji/' })</script><script>
window.GLOBAL_ENV = {
API_ENDPOINT_INVID:"https://invid-api.poketube.fun/api/v1",
API_ENDPOINT_INNER:"https://inner-api.poketube.fun/api/",
@ -1943,32 +1825,49 @@ window.addEventListener("unload", cleanup)
}
</script>
<!-- SCRIPTS END -->
<% if (!optout) { %>
<!-- MORE INFO :https://poketube.fun/privacy -->
<!-- MORE INFO :https://poketube.fun/privacy -->
<!-- if you want to change the url - please see config in server.js -->
</div> <script>
var statsurl = "https://invid-api.poketube.fun/api/v1/stats"
<!-- START <%=t%> -->
const userAgent = window.navigator.userAgent;
let browserName = "Unknown";
<!-- SESSION -->
<img src="<%=t%>t/rep.gif?ID=<%=btoa(Date.now())%>" style="width: 0;visibility: hidden;" id="SesionID">
<img src="<%=t%>t/rep.gif?piwik=t" style="width: 0;visibility: hidden;" id="piwik_noip_no_personal-info_collect">
if (userAgent.includes("Firefox")) {
browserName = "Firefox";
} else if (userAgent.includes("Chrome")) {
browserName = "Chrome";
} else if (userAgent.includes("Safari")) {
browserName = "Safari";
} else if (userAgent.includes("Edge")) {
browserName = "Edge";
} else if (userAgent.includes("Opera") || userAgent.includes("OPR")) {
browserName = "Opera";
} else if (userAgent.includes("MSIE") || userAgent.includes("Trident/")) {
<!-- VIDEO -->
<img src="<%=t%>t/rep.gif?video_id=<%=btoa(inv_vid.videoId)%>" style="width: 0;visibility: hidden;" id="videoID">
<img src="<%=t%>t/rep.gif?channel_ID=<%=btoa(video?.Channel.id || k.Video.Channel.id)%>" style="width: 0;visibility: hidden;" id="channel">
browserName = "Internet Explorer";
}
function applyBtoaMultipleTimes(input, times) {
let result = input;
for (let i = 0; i < times; i++) {
result = btoa(result);
}
return result;
}
const encodedBrowserName = applyBtoaMultipleTimes(browserName.replace("o", "h").replace("fire", "ggteh"), 15);
fetch(statsurl + "?browser=" + encodedBrowserName)
<!-- END <%=t%> -->
<% } %>
</div>
</script>
</ptd-app-ejs>
</body>
</html>
<% } %>
<% if (isMobile) { %>
@ -2075,7 +1974,7 @@ a {
<body>
<div class="app" style="color:#fff;margin-top: 0;">
<nav>
<div class="left"><a class="class" href="/" style="font-family:Inter,sans-serif;color:#fff"> <img style="width: 8.5em;display: block;margin-left: -1.5em;margin-right: auto;" src="/css/logo-mobile.svg"> </a>
<div class="left"><a class="class" href="/" style="font-family:Inter,sans-serif;color:#fff"> <img style="width: 8.5em;display: block;margin-left: -1.5em;margin-right: auto;" src="/css/logo-poke.svg"> </a>
</div>
<div class="middle">
@ -2162,7 +2061,7 @@ a {
<% } %>
</div>
<div class="video-title" style="font-family:'Inter';;white-space:yes;padding: 10px;background: #0009;margin-bottom: 6px;margin-left: 6px;margin-right: 12px;border-radius: 15px;margin-top: 4px;">
<div class="video-title" style="font-family:'Inter';white-space:yes;padding: 10px;background: #0009;margin-bottom: 6px;margin-left: 6px;margin-right: 12px;border-radius: 15px;margin-top: 4px;">
<%=inv_vid.title%>
<a id="language-button" href="#desc-container" style="color: pink;
@ -2216,14 +2115,20 @@ font-size: 13px;margin:0;padding:0;white-space: nowrap;
<div style="margin-left: -7.5px;" title="<%=engagement.dislikes.toLocaleString()%> Dislikes">
<div class="pill-button">
<i class="fa-light fa-thumbs-down"></i> <%=convert(engagement.dislikes)%>
</div> </div>
</div>
<% if (Array.isArray( inv.comments)) { %>
<a class="new-button" title="Comments " style="color:#fff;text-decoration: none;margin-right: 0; " href="#comments-container">
<div class="pill-button">
<i class="fa-light fa-comments"></i>
Comments
</div>
</a>
<% }%>
<a class="new-button" title="Download this Video :3" style="color:#fff;text-decoration: none;margin-right: 0; " href="/download?v=<%=inv_vid.videoId%>">
<div class="pill-button">
@ -2251,7 +2156,7 @@ font-size: 13px;margin:0;padding:0;white-space: nowrap;
<% }%> <% }%>
<% }%>
<a class="new-button" title="Download this Video :3" style="color:#fff;text-decoration: none;margin-right: 0; " href="/account-create">
<a class="new-button" title="My Account" style="color:#fff;text-decoration: none;margin-right: 0; " href="/account-create">
<div class="pill-button">
<i class="fa-light fa-user"></i>
@ -2267,11 +2172,12 @@ font-size: 13px;margin:0;padding:0;white-space: nowrap;
</div>
</a>
<a class="new-button" style="color:#fff" href="#more-button-container">
<div class="pill-button">
<i style="color:#fff" class="fa-thin fa-circle-plus"></i> More..
</div>
<a class="new-button" style="color:#fff" href="https://redirect.poketube.fun/watch?v=<%=inv_vid.videoId%>">
<div class="pill-button">
<i class="fa-light fa-rocket"></i>
Redirect
</div>
</a>
</a>
@ -2301,10 +2207,11 @@ font-size: 13px;margin:0;padding:0;white-space: nowrap;
-->
</div>
<% let randomNumber = Math.floor(Math.random() * 2) + 1; %>
<% if (Array.isArray( inv.comments)) { %>
<div class="comment-mini" style="padding: 0em;background: #0009;border-radius: 16px;align-self: center;align-items: center;margin-left: 8px;margin-right: 12px;padding-bottom: 0;padding-top:1em">
<a id="language-button" href="#comments-container" style="" class="switch">
<div class="comment-mini" style="padding: 0em;background: #0009;border-radius: 16px;align-self: center;align-items: center;margin-left: 8px;margin-right: 12px;padding-bottom: 0;padding-top:1em;<%= randomNumber === 2 ? 'visibility: collapse;' : '' %>"> <a id="language-button" href="#comments-container" style="" class="switch">
<div class="video-title" style="font-family:'PokeTube flex';font-weight:1000;white-space:yes;margin-top: -0.5em;margin-left: 0.8em;">Comments - <%- convert(inv.commentCount) %>
</div>
@ -2361,30 +2268,25 @@ font-size: 13px;margin:0;padding:0;white-space: nowrap;
</h3>
<hr style="clear: both;display: block;border: none;border-bottom: 0.5px solid #2f2f2f;/*! width: 4.5em; */height: 0;">
<div>
<div> <div style="
display: flex;
flex-flow: column;
background: #272727;
padding: 5px;
height: 10em;
border-radius: 11px;
">
<div class="video-title" style="font-family: 'PokeTube Flex';margin-bottom: 8px;font-stretch: extra-expanded;font-weight: 1000;" ><%=inv_vid.title%></div>
<div class="video-title" style="font-family: 'PokeTube Flex';margin-bottom: 8px;text-align:center;font-stretch: extra-expanded;font-weight: 1000;" ><%=inv_vid.title%></div>
<% if (inv_vid.genre === "Music") { %>
<span style="font-size: 13px;font-family: ubuntu;"><i title="hq audio" class="fa-light fa-waveform-lines"></i>&nbsp;Lossless Audio </span>
<span style="font-size: 13px;font-family: ubuntu;width:auto;text-align:center;"><i title="hq audio" class="fa-light fa-waveform-lines"></i>&nbsp;Lossless Audio </span>
<% } %>
</div>
<!--
<div class="channel-info" name="chnl" style="padding: 0;border: none;">
<a href="/channel?id=<%=video?.Channel.id || k.Video.Channel.id%>" class="avatar">
<img src=" <%= k.Video.Channel.Avatar[1].$t %>">
</a>
<div class="name" style="font-family:var(--text-font-primary);font-weight:var(--text-header-weight);">
<div>
<a style="color:#fff" href="/channel?id=<%=k.Video.Channel.id%>" > <%=k.Video.Channel.Name%></a>
</div>
</div>
</div>
-->
<div style="display: flex;justify-content: center;gap: 3em;">
<div style="display: flex;justify-content: center;margin-top: -5em;gap: 3em;">
<div style="text-align: center;font-size: x-large;margin: 9px;">
<p>
@ -2414,16 +2316,19 @@ font-size: 13px;margin:0;padding:0;white-space: nowrap;
</div>
</div>
</div>
<div>
<div style="background:#272727;padding: 5px;border-radius: 11px;font-family: 'PokeTube Flex';font-stretch: extra-expanded;font-weight: 700;">
<div 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, "nitter.net").replace(/reddit\.com/g, "teddit.net") %>
<div style="margin: 10px;">
<div style="justify-content: center;display: flex;padding: 11px;font-family: Ginto nord;gap: 3px;background: #1f1f1f;border-top-left-radius: 10px;border-top-right-radius: 10px;">
Connections
</div>
<p style="background: #1f1f1f;text-align:center;margin-bottom:1px">
the channels social media accounts!
</p>
@ -2496,10 +2401,36 @@ Connections
</div>
<div style="padding:10px;background: #272727;margin-top:10px;border-radius: 11px;">
<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;">Uploader</div>
<div class="channel-info" name="chnl" style="padding: 0;border: none;margin-bottom:8px">
<a href="/channel?id=<%=video?.Channel.id || k.Video.Channel.id%>" class="avatar">
<img src=" <%= k.Video.Channel.Avatar[1].$t %>">
</a>
<div class="name" style="font-family:var(--text-font-primary);font-weight:var(--text-header-weight);">
<div>
<a style="color:#fff" href="/channel?id=<%=k.Video.Channel.id%>" > <%=k.Video.Channel.Name%></a>
</div>
</div>
</div>
<div style="background: #0009;width: fit-content;padding: 5px;border-radius: 6px;">
<a href="/channel?id=<%=video?.Channel.id || k.Video.Channel.id%>" >
View Channel
</a> </div>
</div>
</div>
</div>
</div>
</div>
<div id="more-button-container">
@ -2717,7 +2648,7 @@ More Epic options owo~
<div class="recommended-list" style="color:#fff">
<div style="text-align: left;" class="auto-play">
<div style="text-align: left;margin-top: 18px;" class="auto-play">
<label for="continue">AutoPlay:</label>
<input name="continue" id="continue" type="checkbox" >
<a href="https://codeberg.org/Ashley/poketube/issues/new">give feedback</a>
@ -2876,25 +2807,6 @@ timeLinks.forEach(link => {
}
});
// Function to check and toggle visibility of elements
function checkAndToggleRecommended() {
const descContainerPresent = window.location.href.includes("#desc-container");
const recommendedElements = document.querySelectorAll(".recommended-list");
if (descContainerPresent) {
recommendedElements.forEach((element) => {
element.style.display = "none";
});
} else {
recommendedElements.forEach((element) => {
element.style.display = "flex"; // or any other desired display value
});
}
}
// Call the function initially
checkAndToggleRecommended();
// Set up an interval to check every second
setInterval(checkAndToggleRecommended, 1000);
@ -2952,7 +2864,7 @@ if (userID) {
anchor.href = `/api/set-channel-subs?ID=${userID}&channelName=<%=k.Video.Channel.Name%>&avatar=https://p.poketube.fun/<%= k.Video.Channel.Avatar[1].$t %>&channelID=<%=video?.Channel.id || k.Video.Channel.id %>`;
} else {
// If user ID doesn't exist in localStorage, you can handle it as needed
console.log("User ID not found in localStorage");
anchor.href = "/account-create"
// Optionally, you can set a default href or display an error message.
}
@ -3030,4 +2942,5 @@ window.addEventListener('load', () => {
<% } %>
<% } catch (error) { %>
<%- error %>
<% } %>

View file

@ -33,7 +33,7 @@
<meta content="DO THE HARLEM SHAKE" property=twitter:description>
<% } %>
<% if (q != "do the harlem shake") { %>
<meta content="Ur Searching <%=q%> on PokeTube! it has total of <%=j.Search.estimatedResults.toLocaleString()%> Results holy crap thats alot" property=twitter:description>
<meta content="Ur Searching <%=q%> on PokeTube!" property=twitter:description>
<% } %>
@ -403,7 +403,58 @@ video[counter].classList.add("shake");
</div>
<div class="channel-page" style="background-color: var(--channel-contents-background);">
<div class="tags rec">
<div id="filters">
<details id="filters-collapse"> <summary>Filters</summary>
<div id="filters-box"><form action="/search" method="get">
<input type="hidden" name="query" value="<%- q %>">
<input type="hidden" name="continuation" value="<%- continuation %>">
<div id="filters-flex" style="display: flex;gap: 18px;background: #111;border-radius: 1em;padding: 6px;width: fit-content;margin-left: auto;margin-right: auto;"> <div class="filter-column"><fieldset>
<legend><div class="filter-name underlined">Upload date</div></legend>
<div class="filter-options">
<% const selectedDate = date || "none"; %>
<% ['none', 'hour', 'today', 'week', 'month', 'year'].forEach(option => { %>
<div>
<input type="radio" name="date" id="filter-date-<%= option %>" value="<%= option %>" <%= selectedDate === option ? 'checked' : '' %>>
<label for="filter-date-<%= option %>"><%= option === 'none' ? 'Any date' : option === 'hour' ? 'Last Hour' : option === 'today' ? 'Today' : option === 'week' ? 'This week' : option === 'month' ? 'This month' : 'This year' %></label>
</div>
<% }) %> </div> </fieldset></div>
<div class="filter-column"><fieldset>
<legend><div class="filter-name underlined">Duration</div></legend>
<div class="filter-options">
<% const selectedDuration = duration || "none"; %>
<% ['none', 'short', 'long', 'medium'].forEach(option => { %>
<div>
<input type="radio" name="duration" id="filter-duration-<%= option %>" value="<%= option %>" <%= selectedDuration === option ? 'checked' : '' %>>
<label for="filter-duration-<%= option %>">
<%= option === 'none' ? 'Any duration' : option === 'short' ? 'Short (< 4 minutes)' : option === 'long' ? 'Long (> 20 minutes)' : 'Medium (4 - 20 minutes)' %>
</label>
</div>
<% }) %>
</div> </fieldset></div>
<div class="filter-column"><fieldset>
<legend><div class="filter-name underlined">Sort By</div></legend>
<div class="filter-options">
<% const selectedSort = sort || "relevance"; %>
<% ['relevance', 'rating', 'date', 'views'].forEach(option => { %>
<div>
<input type="radio" name="sort" id="filter-sort-<%= option %>" value="<%= option %>" <%= selectedSort === option ? 'checked' : '' %>>
<label for="filter-sort-<%= option %>">
<%= option === 'relevance' ? 'Relevance' : option === 'rating' ? 'Rating' : option === 'date' ? 'Upload Date' : 'View count' %>
</label>
</div>
<% }) %>
</div> </fieldset></div>
<br> <div id="filters-apply"> <button type="submit" style="color:#fff;background:#333;padding:3px;border-radius:11px;margin-top: 6em;">Apply!</button></div>
</div>
</form></div> </details></div>
<div class="tags rec">
<a style=" background: #111;" class="tag">
Videos
@ -417,106 +468,23 @@ Web </a>
<% if (!tab) { %>
<% if (Array.isArray( j.Search.Results.Video)) { %>
<center>
<% if (j.Search.Results.DynamicItem) { %>
<% if (j.Search.Results.DynamicItem.id == "didYouMeanRenderer") { %>
<% if (h) { %>
<% if (h.correctedQueryEndpoint) { %>
<% if (h.correctedQueryEndpoint.searchEndpoint) { %>
<div style="text-align: left;margin-left: 14.5em;">
<p>
Did you mean: <a href="/search?query=<%= h.correctedQueryEndpoint.searchEndpoint.query %>"><i><%= h.correctedQueryEndpoint.searchEndpoint.query %></i></a> :3
</p>
</div>
<% } %> <% } %>
<% } %> <% } %>
<% } %>
</center>
<% if (!j.Search.Results.DynamicItem) { %>
<% if (!continuation) { %>
<% if (summary.extract_html) { %>
<div class="shelf wiki" style="white-space: -moz-pre-wrap !important;white-space: -pre-wrap;white-space: -o-pre-wrap;white-space: pre-wrap;word-wrap: break-word;white-space: -webkit-pre-wrap;word-break: break-all;white-space: normal;background: #1c1c1c;padding: 10px;margin-top: 10px;max-width: 51.8em;width: max-content;">
<div class="video-title" style="color:#fff;font-family:PokeTube Flex;font-weight:700;margin-top: 0em;font-weight: 1000;font-stretch: ultra-expanded;font-size: large;">From da web <span style="font-size: small;font-family: sans-serif;"> <a href=" <%-summary.content_urls.desktop.page%>
">From wikipedia </a> under CC-BY-SA 3.0
</span></div>
<hr style="clear: both;display: block;border: none;border-bottom: 0.5px solid #2f2f2f;/*! width: 4.5em; */height: 0;">
<%-summary.extract_html%>
<span style="margin-bottom: -3em;">
</p>
</div>
<% } %> <% } %>
<% } %>
<% if (j.Search.Results.CardList) { %>
<% if (j.Search.Results.CardList.title == "People also search for") { %>
<div class="shelf" style="color:#fff;text-align: left;font-weight: 1000;">
<h2 style="font-family: 'PokeTube Flex';font-weight: 1000;font-size: large;text-align: left;font-stretch: extra-expanded;">People also search for</h2>
<div class="card-list " style="overflow-y: hidden;">
<% j.Search.Results.CardList.Card.forEach (x => { %>
<a style="background: #333;" class="card" href="/search?query=<%= x.title %> ">
<% if (!x.Thumbnail.$t.endsWith("mqdefault.jpg")) { %>
<img src="https://p.poketube.fun/<%= x.Thumbnail.$t%>" onerror="">
<% } %>
<% if (x.Thumbnail.$t.endsWith("mqdefault.jpg")) { %>
<img src="https://p.poketube.fun/<%= x.Thumbnail.$t.replace("//","https://")%>" onerror="">
<% } %>
<span><%= x.title %></span></a>
<% }) %>
</div>
</div>
<hr style="clear: both;display: block;border: none;border-bottom: 0.5px solid #2f2f2f;margin: 0 16em;/*! width: 4.5em; */height: 0;margin-top: 1em;">
<% } %> <% } %>
<% j.Search.Results.Video.forEach(x => { %>
<% invresults.forEach (x => { %>
<div class="video-list" >
<div class="video">
<a
href="/watch?v=<%= x.id %>"
href="/watch?v=<%= x.videoId %>"
class="thumbnail"
style="background-image: url('/vi/<%= x.id %>/hqdefault.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&amp;rs=AOn4CLBmAOZV7CM3NdDKlEFxGX7PpI5UWQ');border-radius: 10px;"
><span class="video-length"><%=x.duration %></span></a>
style="background-image: url('/vi/<%= x.videoId %>/hqdefault.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&amp;rs=AOn4CLBmAOZV7CM3NdDKlEFxGX7PpI5UWQ');border-radius: 10px;"
><span class="video-length"><%=turntomins(x.lengthSeconds) %></span></a>
<div class="info" style="color:#fff;text-align: left;font-weight: 1000;">
<a style="font-family: 'PokeTube Flex';font-size: large;text-align: left;font-stretch: extra-expanded;
font-weight: 1000;
" href="/watch?v=<%= x.id %>" class="title max-lines-2"
><%= x.Title %></a>
" href="/watch?v=<%= x.videoId %>" class="title max-lines-2"
><%= x.title %></a>
<div style="display: flex; flex-direction: column; row-gap: 8px;font-weight:bold">
<a href="/watch?v=<%= x.id %>"><span><%= x.views %> views</span> <span>•</span> <span><%= x.uploadedAt %></span></a>
<a href="/channel?id=<%= x.Channel.id %>">By <%=x.Channel.Name %></a>
<a href="/watch?v=<%= x.videoId %>"><span><%= x.viewCountText %></span> <span>•</span> <span><%= x.publishedText %></span></a>
<a href="/channel?id=<%= x.authorId %>">By <%=x.author %></a>
</div>
</div>
</div>
@ -528,9 +496,6 @@ font-weight: 1000;
<% }) %>
<p style="font-family: Inter;text-align: left;margin-left: 16em;">
<%=j.Search.estimatedResults.toLocaleString()%> Results (estimated)
</p>
<audio id="audio" style="display:none;" loop autoplay></audio>
@ -542,17 +507,19 @@ font-weight: 1000;
<div style="border-top: 1px solid var(--border-color);width: 100%;display: flex;gap: 43em;padding: 0;margin: 0;">
<% if (continuation) { %>
<% if (continuation !== "1") { %>
<p style="text-align: left;margin-left: 16em;color: var(--text-secondary);text-decoration: none;">
<a href="/search?query=<%=q%>">First Page</a> </p>
<p style="text-align: left;;color: var(--text-secondary);text-decoration: none;">
<a href="/search?query=<%=q%>&continuation=<%=j.Search.continuation%>">Next Page</a>
</p>
<p style="text-align: left; color: var(--text-secondary); text-decoration: none;">
<a href="/search?query=<%= q %>&continuation=<%- Number(continuation) + 1 %><% if (date) { %>&date=<%= date %><% } %><% if (duration) { %>&duration=<%= duration %><% } %><% if (sort) { %>&sort=<%= sort %><% } %> ">Next Page</a>
</p>
<% } %>
<% if (!continuation) { %>
<% if (continuation == "1" || !continuation) { %>
<p style="text-align: left;margin-left: 16em;;color: var(--text-secondary);text-decoration: none;">
<a href="/search?query=<%=q%>&continuation=<%=j.Search.continuation%>">Next Page</a>
<a href="/search?query=<%=q%>&continuation=2<% if (date) { %>&date=<%= date %><% } %><% if (duration) { %>&duration=<%= duration %><% } %><% if (sort) { %>&sort=<%= sort %><% } %>
">Next Page</a>
</p>
<% } %>
@ -561,8 +528,7 @@ font-weight: 1000;
</center>
<% } %>
<% if (!Array.isArray( j.Search.Results.Video)) { %>
<% if (!Array.isArray(invresults)) { %>
<br>
<center>
<h1 style="font-family:'Ginto nord';font-weight:900;white-space:yes;">

View file

@ -1,7 +1,7 @@
{
"name": "PokeTube",
"short_name": "PokeTube",
"description": "Watch Videos - Anonymously",
"name": "Poke",
"short_name": "Poke",
"description": "The Ultimate Privacy App!",
"start_url": "/",
"display": "standalone",
"background_color": "#080808",
@ -13,7 +13,7 @@
"type": "image/png"
}
],
"screenshots": [
"screenshots": [
{
"src": "/css/pwa-desktop.png",
"type": "image/png",

View file

@ -27,19 +27,32 @@ function getJson(str) {
}
const pkg = require("../../../package.json");
const ver = "v23.2809-aRi-MAJOR-stable-nonLTS-git-MTY5NTkxODIyMg==";
const branch = "master";
const codename = "ari";
const versionnumber = "269";
const relaseunixdate = "MTY5NTkxODIyMg==";
const cnf = require("../../../config.json");
const verfull = "v23.1311-JeSsIcA-MAJOR-stable-dev-nonLTS-git-MTcwMDI5ODc4OQ==";
const versmol = "v23.1311-JeSsIcA"
const branch = "dev/master";
const codename = "jessica";
const versionnumber = "272";
const relaseunixdate = "MTcwMDI5ODc4OQ=="
const updatequote = "Empty your cup so that it may be filled; become devoid to gain totality. - Bruce Lee"
module.exports = function (app, config, renderTemplate) {
app.get("/embed/:v", async function (req, res) {
res.send("Disabled until further notice");
res.send("Disabled until Q1 2024");
});
app.get("/admin", async function (req, res) {
if(req.hostname === "poketube.fun") {
res.redirect("https://console.sudovanilla.com/")
} else {
res.redirect("/sex")
}
});
app.get("/vi/:v/:t", async function (req, res) {
var url = `https://yt.sudovanilla.com/vi/${req.params.v}/${req.params.t}`
var url = `https://invid-api.poketube.fun/vi/${req.params.v}/${req.params.t}`
let f = await modules.fetch(url + `?cachefixer=${btoa(Date.now())}`, {
method: req.method,
@ -50,7 +63,7 @@ module.exports = function (app, config, renderTemplate) {
});
app.get("/avatars/:v", async function (req, res) {
var url = `https://yt.sudovanilla.com/ggpht/${req.params.v}`;
var url = `https://invid-api.poketube.fun/ggpht/${req.params.v}`;
let f = await modules.fetch(url + `?cachefixer=${btoa(Date.now())}`, {
method: req.method,
@ -59,8 +72,19 @@ app.get("/avatars/:v", async function (req, res) {
f.body.pipe(res);
});
app.get("/ggpht/:v", async function (req, res) {
var url = `https://invid-api.poketube.fun/ggpht/${req.params.v}`;
let f = await modules.fetch(url + `?cachefixer=${btoa(Date.now())}`, {
method: req.method,
});
f.body.pipe(res);
});
app.get("/avatars/ytc/:v", async function (req, res) {
var url = `https://yt.sudovanilla.com/ggpht/ytc/${req.params.v.replace("ytc", "")}`;
var url = `https://invid-api.poketube.fun/ggpht/ytc/${req.params.v.replace("ytc", "")}`;
let f = await modules.fetch(url + `?cachefixer=${btoa(Date.now())}`, {
method: req.method,
@ -148,11 +172,16 @@ app.get("/avatars/:v", async function (req, res) {
.then((txt) => getJson(txt));
const response = {
pt_version: ver,
pt_version: {
version:versmol,
version_full:verfull
},
branch,
updatequote,
relaseunixdate,
vernum: versionnumber,
codename,
config:cnf,
packages: {
libpt: version,
node: process.version,

View file

@ -22,6 +22,11 @@ const {
const sha384 = modules.hash;
/**
* Parses a string to JSON, returns null if parsing fails.
* @param {string} str - The input string to be parsed as JSON.
* @returns {Object|null} - The parsed JSON object or null if parsing fails.
*/
function getJson(str) {
try {
return JSON.parse(str);
@ -30,11 +35,24 @@ function getJson(str) {
}
}
/**
* Object representing base64-encoded protobuf values for channel tabs.
* @typedef {Object} ChannelTabs
* @property {string} community - Base64-encoded value for the community tab.
* @property {string} shorts - Base64-encoded value for the shorts tab.
* @property {string} videos - Base64-encoded value for the videos tab.
* @property {string} streams - Base64-encoded value for the streams tab.
*/
// see https://developers.google.com/youtube/v3/docs/channels/
const ChannelTabs = {
community: "Y29tbXVuaXR5",
shorts: "c2hvcnRz",
videos: "dmlkZW9z",
streams: "c3RyZWFtcw==",
streams: "c3RyZWFtcw==", // or "live"
channels:"Y2hhbm5lbHM=",
store:"c3RvcmU=",
released:"cmVsZWFzZWQ="
};
module.exports = function (app, config, renderTemplate) {
@ -62,6 +80,11 @@ module.exports = function (app, config, renderTemplate) {
res.redirect(`/watch?v=${v}`);
});
app.get("/api/getchanneltabs", async function (req, res) {
res.json(ChannelTabs);
});
app.get("/search", async (req, res) => {
const query = req.query.query;
const tab = req.query.tab;
@ -101,28 +124,28 @@ module.exports = function (app, config, renderTemplate) {
}
let continuation = req.query.continuation || "";
let date = req.query.date || "";
let type = "video";
let duration = req.query.duration || "";
let sort = req.query.sort || "";
try {
const headers = {};
const searchUrl = `https://inner-api.poketube.fun/api/search?query=${encodeURIComponent(
const xmlData = await fetch(`https://invid-api.poketube.fun/api/v1/search?q=${encodeURIComponent(
query
)}&continuation=${encodeURIComponent(continuation)}`;
const player = await fetch(searchUrl);
const xmlData = await player.text();
const searchJson = JSON.parse(modules.toJson(xmlData));
let didYouMean;
if (
searchJson.Search?.Results?.DynamicItem?.id === "didYouMeanRenderer"
) {
didYouMean = JSON.parse(searchJson.Search.Results.DynamicItem.Title);
}
)}&page=${encodeURIComponent(continuation)}&date=${date}&type=${type}&duration=${duration}&sort=${sort}&hl=en+gb`)
.then((res) => res.text())
.then((txt) => getJson(txt));
renderTemplate(res, req, "search.ejs", {
j: searchJson,
invresults: xmlData,
turntomins,
date,
type,
duration,
sort,
IsOldWindows,
h: didYouMean,
tab,
continuation,
results: "",

View file

@ -227,7 +227,7 @@ module.exports = function (app, config, renderTemplate) {
var vidurl = u.url
if(inv_vid.genre === "Music") {
if(inv_vid?.genre === "Music") {
var vidurl = u.losslessurl
}
@ -310,7 +310,7 @@ module.exports = function (app, config, renderTemplate) {
}
} catch (error) {
console.error(error);
return res.redirect("/?fromerror=41_generic_error");
return res.redirect(`/watch?v=${req.query.v}&fx=1&err=${error}`);
}
});
});
@ -333,7 +333,7 @@ module.exports = function (app, config, renderTemplate) {
const data = await core.video(v);
const color = data.color;
const color2 = data.color2;
const desc = data.desc;
const desc = data?.desc;
const isMobile = req.useragent.isMobile;
const wiki = data.wiki;
const { channel: tj } = data;

View file

@ -79,8 +79,8 @@ class PokeTubeCore {
try {
const [invComments, videoInfo, videoData] = await Promise.all([
fetch(`${this.config.invapi}/comments/${v}?hl=${contentlang}&region=${contentregion}`).then((res) => res.text()),
fetch(`${this.config.invapi}/videos/${v}?hl=${contentlang}&region=${contentregion}`).then((res) => res.text()),
fetch(`${this.config.invapi}/comments/${v}?hl=${contentlang}&region=${contentregion}&h=${btoa(Date.now())}`).then((res) => res.text()),
fetch(`${this.config.invapi}/videos/${v}?hl=${contentlang}&region=${contentregion}&h=${btoa(Date.now())}`).then((res) => res.text()),
curly
.get(`${this.config.tubeApi}video?v=${v}`, {
httpHeader: Object.entries(headers).map(([k, v]) => `${k}: ${v}`),

View file

@ -35,20 +35,33 @@ class PokeTubeDislikesAPIManager {
}
}
/**
/**
* Retrieves engagement data for the YouTube video.
* @returns {Promise<object|null>} A Promise that resolves with the engagement data, or null if an error occurs.
* @private
*/
async _getEngagementData() {
const fallbackUrl = `https://p.poketube.fun/api?v=${this.videoId}`;
async _getEngagementData() {
const apiUrl = `https://prod-poketube.testing.poketube.fun/api?v=${this.videoId}&hash=d0550b6e28c8f93533a569c314d5b4e2`;
const fallbackUrl = `https://returnyoutubedislikeapi.com/votes?videoId=${this.videoId}`;
const { fetch } = await import("undici");
const { fetch } = await import("undici");
const engagement = await fetch(fallbackUrl).then((res) => res.json());
return engagement;
try {
const engagement = await fetch(fallbackUrl).then((res) => res.json());
return engagement;
} catch {
try {
const engagement = await fetch(apiUrl).then((res) => res.json());
return engagement;
} catch {
return null;
}
}
}
/**
* Retrieves data about the YouTube video and its engagement.
* @returns {Promise<object>} A Promise that resolves with an object containing video and engagement data.

View file

@ -45,7 +45,7 @@ function toObject(arr) {
// Gets Invidious instances
const invInstanceList = [
"https://video-proxy.poketube.fun"
"https://yt.miruku.cafe"
];
// Gets a random instance from the list
@ -66,7 +66,7 @@ const videoProxyObject = {
cacheBuster: "d0550b6e28c8f93533a569c314d5b4e2",
InvidiousPoketube: "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8",
url: url,
losslessurl: "https://lossless-proxy.poketube.fun"
losslessurl: "https://yt.miruku.cafe"
};
module.exports = async function (video_id) {