<!DOCTYPE html> <html> <head> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta charset="UTF-8"> <meta property="og:title" content=deflax.net> <meta property="og:site_name" content="▷"> <meta property="og:url" content=https://deflax.net> <meta property="og:description" content="The landing page of the flaxnet"> <meta property="og:type" content=product> <meta property="og:image" content=https://deflax.net/static/images/logo.png> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>▷ deflax.net</title> <link rel='shortcut icon' type='image/x-icon' href='/static/images/favicon.ico' /> <link rel="stylesheet" href="static/css/root.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css" crossorigin="anonymous" referrerpolicy="no-referrer" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap/dist/css/bootstrap.min.css" crossorigin="anonymous"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/plyr/dist/plyr.min.css"> <script src="https://cdn.jsdelivr.net/npm/bootstrap/dist/js/bootstrap.min.js" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/plyr/dist/plyr.min.js" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/hls.js/dist/hls.min.js" crossorigin="anonymous"></script> </head> <body> <nav class="navbar fixed-top navbar-dark bg-dark navbar-expand"> <div class="container-fluid"> <div class="col-lg-1 d-none d-md-block"> </div> <a class="navbar-brand" href="#"> <img src="static/images/logo.png" alt="" width="40" height="40" class="d-inline-block align-text-center"> deflax.net </a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse text-right" id="navbarNav"> <ul class="navbar-nav ms-auto flex-nowrap"> <li class="nav-item"> <a class="nav-link" href="#stream">Stream <i class="fa fa-satellite-dish" aria-hidden="true"></i></a> </li> <li class="nav-item"> <a class="nav-link" href="#archive">Archive <i class="fa fa-file-video" aria-hidden="true"></i></a> </li> </ul> </div> <div class="col-lg-1 d-none d-md-block"> </div> </div> </nav> <div class="content-container bg-dark text-white"> <div id="stream" class="container-fluid p-3 bg-dark text-white"> <div class="row"> <div class="col-md-1 d-none d-md-block"> </div> <div class="col-12 col-lg-10"> <div class="content"> <video controls crossorigin playsinline muted poster="static/images/poster.png"> </video> <script> document.addEventListener('DOMContentLoaded', () => { const video = document.querySelector("video"); const source = 'https://stream.deflax.net/memfs/f2844c7c-e86c-4f0a-afb6-a1b0e25a5071.m3u8'; const playhead_url = "https://deflax.net/playhead"; // For more options, see: https://github.com/sampotts/plyr/#options // captions.update is required for captions to work with hls.js const defaultOptions = {}; // // First check for native browser HLS support // if (video.canPlayType('application/vnd.apple.mpegurl')) { async function fetchInitData() { try { // Fetch data from the API const response = await fetch(playhead_url); // Check if the response is successful (status code 200) if (!response.ok) { throw new Error(`Video: HTTP error! Status: ${response.status}`); } // Parse JSON from the response const data = await response.json(); // Now 'data' contains the parsed JSON //console.log("Fetched JSON data:", data); video.src = data.head; console.log("Video: switching to ", data.head); const player = new Plyr(video, defaultOptions); } catch (error) { console.error("Video: Error fetching data:", error); } } fetchInitData(); // // If no native HLS support, check if HLS.js is supported // } else if (Hls.isSupported()) { const hls = new Hls(); // Function to fetch and process JSON from the API async function fetchData() { try { // Fetch data from the API const response = await fetch(playhead_url); // Check if the response is successful (status code 200) if (!response.ok) { throw new Error(`HLS.js: HTTP error! Status: ${response.status}`); } // Parse JSON from the response const data = await response.json(); // Now 'data' contains the parsed JSON // console.log("Fetched JSON data:", data); const oldsrc = hls.url; const newsrc = data.head; if (newsrc === oldsrc) { console.log("HLS.js: playing from ", newsrc); } else { console.log("HLS.js: switching to ", newsrc); hls.loadSource(newsrc); video.load(); // Reload the video element to apply the new source video.play().catch(error => { console.error('HLS.js: Autoplay was prevented:', error); }); } } catch (error) { console.error("HLS.js: Error fetching data:", error); } } fetchData(); // Set the interval for periodic execution (e.g., every 5 seconds) const interval = 4200; // in milliseconds setInterval(fetchData, interval); // Attach Hls.js to the video element hls.loadSource(source); hls.attachMedia(video); // From the m3u8 playlist, hls parses the manifest and returns // all available video qualities. This is important; in this approach, // we will have one source on the Plyr player. hls.on(Hls.Events.MANIFEST_PARSED, function (event, data) { console.log("HLS.js: manifest parsed"); // Transform available levels into an array of integers (height values). const availableQualities = hls.levels.map((l) => l.height) availableQualities.unshift(0); //prepend 0 to quality array // Add new qualities to option defaultOptions.quality = { default: 0, //Default - AUTO options: availableQualities, forced: true, onChange: (e) => updateQuality(e), } // Add Auto Label defaultOptions.i18n = { qualityLabel: { 0: 'Auto', }, } hls.on(Hls.Events.LEVEL_SWITCHED, function (event, data) { console.log("HLS.js: level switched"); var span = document.querySelector(".plyr__menu__container [data-plyr='quality'][value='0'] span") if (hls.autoLevelEnabled) { span.innerHTML = `AUTO (${hls.levels[data.level].height}p)` } else { span.innerHTML = `AUTO` } }); // Initialize new Plyr player with quality options const player = new Plyr(video, defaultOptions); }); window.hls = hls; } function updateQuality(newQuality) { if (newQuality === 0) { window.hls.currentLevel = -1; //Enable AUTO quality if option.value = 0 } else { window.hls.levels.forEach((level, levelIndex) => { if (level.height === newQuality) { console.log("HLS.js: Found quality match with " + newQuality); window.hls.currentLevel = levelIndex; } }); } } }); </script> </div> </div> <div class="col-md-1 d-none d-md-block"> </div> </div> </div> </div> <div class="content-container bg-dark text-white"> <div id="archive" class="container-fluid p-3 bg-dark text-white"> <div class="row"> <div class="col-md-1 d-none d-md-block"> </div> <div class="col-12 col-lg-10"> <div class="content"> <div class="gallery"> {% for thumbnail in thumbnails %} <div class="gallery-item"> <a href="{{ url_for('video_watch_route', video_file_no_extension=thumbnail[:-4]) }}" class="image-link"> <img src="{{ url_for('thumb_route', thumb_file=thumbnail) }}" alt="{{ thumbnail }}"> <div class="overlay"> <div class="overlay-content"> <h3>Play</h3> <p>{{ thumbnail[:-4] }}</p> </div> </div> </a> </div> {% endfor %} </div> </div> </div> <div class="col-md-1 d-none d-md-block"> </div> </div> </div> </div> <div class="content-container bg-dark text-white"> <div id="info" class="container-fluid p-3 bg-dark text-white"> <div class="row"> <div class="col-md-1 d-none d-md-block"> </div> <div class="col col-xl-2"> <div class="content"> <h2>Friends</h2> <p><a href='https://jungletrain.net/' target=_blank><img src="static/images/jtlogo.png" height="64"></a></p> <p><a href='http://freerave.cz/' target=_blank><img src="static/images/freeravemini.png" height="64"></a></p> <p><a href='http://iwayhigh.net/' target=_blank>|iway|High</a></p> <p><a href='https://anima.sknt.ru/' target=_blank>Anima Amoris</a></p> <p>You! 🙃</p> </div> </div> <div class="col col-xl-2"> <div class="content"> <h2>Media</h2> <p><a href='https://youtube.com/@daniel.deflax' target=_blank><img src="static/images/icons8-youtube-96.png"></a></p> <p><a href='https://www.twitch.tv/deflaxtv' target_blank><img src="static/images/icons8-twitch-96.png"></a></p> <p><a href='https://soundcloud.com/deflax' target=_blank><img src="static/images/icons8-soundcloud-96.png"></a></p> </div> </div> <div class="col col-xl-4"> <div class="content"> <h2>Spam</h2> <p><a href='https://discord.com/invite/KKGtn6GCE3' target=_blank><img src="static/images/icons8-discord-96.png"></a></p> <p><a href='https://instagram.com/daniel.deflax' target=_blank><img src="static/images/icons8-instagram-96.png"></a></p> <p><a href='https://facebook.com/daniel.default' target=_blank><img src="static/images/icons8-facebook-96.png"></a></p> </div> </div> <div class="col col-xl-3"> <div class="content"> <h2>About</h2> <pre> _______________________________ /|o............................o| | |: .. flax network .. .. :| | |: ... . .. 2008-{{ now.year }} .... :| | |: ,-. _____ ,-. :| | |: ( `)) [_____] ( `)) :| |v|: `-` ' ' ' `-` :| |||: ,______________. :| |||....../::::o::::::o::::\......| |^|o..../:::O::::::::::O:::\....o| |/`----/--------------------`----| `.____/ /====/ /=//=/ /====/_____/ `--------------------' </pre> <p>Icons by <a target="_blank" href="https://icons8.com">Icons8</a></p> <p>Everthying you do is a <a href='https://rareboc.org/' target=_blank>balloon</a></p> </div> </div> <div class="col-md-1 d-none d-md-block"> </div> </div> </div> </div> </body> </html>