diff options
Diffstat (limited to '_frame')
-rw-r--r-- | _frame/about/index.php | 228 | ||||
-rw-r--r-- | _frame/home/index.php | 39 | ||||
-rw-r--r-- | _frame/index.php | 4 | ||||
-rw-r--r-- | _frame/library.internal/index.php | 7 | ||||
-rw-r--r-- | _frame/library.internal/main.php | 60 | ||||
-rw-r--r-- | _frame/library.internal/view.php | 161 | ||||
-rw-r--r-- | _frame/lyrics/index.php | 99 | ||||
-rw-r--r-- | _frame/settings/index.php | 51 |
8 files changed, 649 insertions, 0 deletions
diff --git a/_frame/about/index.php b/_frame/about/index.php new file mode 100644 index 0000000..b1166ad --- /dev/null +++ b/_frame/about/index.php @@ -0,0 +1,228 @@ +<?php if (str_ends_with($_SERVER['HTTP_HOST'], ".familine.minteck.org")) { $_FAMILINE = true; } else { $_FAMILINE = false; } function l($en, $fr) { global $_FAMILINE; if ($_FAMILINE) { return $fr; } else { return $en; } } $root = $_SERVER['DOCUMENT_ROOT']; $root = $_SERVER['DOCUMENT_ROOT']; if ($_FAMILINE) { require_once "/mnt/familine/app/session.php"; } ?> +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Argon</title> + <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> + <link rel="stylesheet" href="/css/fonts.css"> + <link rel="stylesheet" href="/css/general.css"> + <link rel="stylesheet" href="/css/loader.css"> + <link rel="stylesheet" href="/css/header.css"> + <link rel="stylesheet" href="/css/frame-about.css"> + <link rel="stylesheet" href="/css/frame.css"> + <link rel="stylesheet" href="/dark.css"> + <meta name="HandheldFriendly" content="true" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> +</head> +<body> +<div id="argon-frame"> + <div id="frame-header"> + <?= l("About Argon", "À propos de Familine Musique") ?> + </div> + <div id="frame-contents"> + <div id="frame-about-general"> + <div id="frame-about-general-icon"> + <img alt="<?= $_FAMILINE ? "Familine Musique" : "Argon" ?>" src="<?= $_FAMILINE ? "https://familine.minteck.org/icns/familine-music.svg" : "/logo/512.png" ?>" id="frame-about-general-icon"> + </div> + <div id="frame-about-general-text"> + <div id="frame-about-general-text-inner"> + <b><?= $_FAMILINE ? "Familine Musique" : "Argon Media Platform" ?></b><br> + <?= $_FAMILINE ? "Argon v" : "Version " ?><?= file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/version"); ?> + </div> + </div> + </div> + + <?php if (str_contains($_SERVER['HTTP_USER_AGENT'], "+AutomateCloud/") && !$_FAMILINE): ?> + <p>For more details and legal notices, go to the About Argon screen in the app's menus.</p> + <?php endif; ?> + + <div id="frame-about-debug"> + <b><?= l("Player Info", "Infos lecteur ") ?>:</b><br> + + <div id="frame-about-debug--player" class="frame-about-section"> + <span><?= l("Song ID", "ID morceau ") ?>:</span> + <span id="frame-about-debug--songId"><?= l("<not playing>", "<pas de lecture>") ?></span> + + <span><?= l("Song Metadata", "Infos morc. ") ?>:</span> + <span id="frame-about-debug--songMetadata"><?= l("<not playing>", "<pas de lecture>") ?></span> + + <span><?= l("Song Release Date", "Date sortie morc. ") ?>:</span> + <span id="frame-about-debug--songRelease"><?= l("<not playing>", "<pas de lecture>") ?></span> + + <span><?= l("Previous Song", "Morc. précédent ") ?>:</span> + <span id="frame-about-debug--previousSong"><?= l("<not playing>", "<pas de lecture>") ?></span> + + <span><?= l("Next Song", "Morc. suivant ") ?>:</span> + <span id="frame-about-debug--nextSong"><?= l("<not playing>", "<pas de lecture>") ?></span> + + <span><?= l("Position", "Position ") ?>:</span> + <span id="frame-about-debug--position"><?= l("<not playing>", "<pas de lecture>") ?></span> + + <span><?= l("Playback Quality", "Qualité lecture ") ?>:</span> + <span id="frame-about-debug--quality"><?= l("<not playing>", "<pas de lecture>") ?></span> + + <span><?= l("Stream URL", "URL flux ") ?>:</span> + <span id="frame-about-debug--stream" class="frame-about-link" onclick="window.open(window.parent.ArgonPlayer._player.src);"><?= l("<not playing>", "<pas de lecture>") ?></span> + + <span><?= l("Player State", "État lecteur ") ?>:</span> + <span id="frame-about-debug--state"><?= l("<not playing>", "<pas de lecture>") ?></span> + + <span><?= l("Seeking", "Navigation ") ?>:</span> + <span id="frame-about-debug--seeking"><?= l("<not playing>", "<pas de lecture>") ?></span> + + <span><?= l("Shuffle Mode", "Lect. aléatoire ") ?>:</span> + <span id="frame-about-debug--shuffle"><?= l("<not playing>", "<pas de lecture>") ?></span> + + <span><?= l("Repeat Mode", "Lect. en boucle ") ?>:</span> + <span id="frame-about-debug--repeat"><?= l("<not playing>", "<pas de lecture>") ?></span> + </div> + + <b><?= l("Server Info", "Infos serveur ") ?>:</b><br> + + <div id="frame-about-debug--server" class="frame-about-section"> + <span><?= l("PHP Version", "Version PHP ") ?>:</span> + <span id="frame-about-debug--php"><?= PHP_VERSION ?></span> + + <span><?= l("Zend Version", "Version Zend ") ?>:</span> + <span id="frame-about-debug--php"><?= zend_version() ?></span> + + <span><?= l("Web Server", "Serveur Web ") ?>:</span> + <span id="frame-about-debug--php"><?= $_SERVER['SERVER_SOFTWARE'] ?></span> + + <span><?= l("Server Gateway", "Passerelle serveur ") ?>:</span> + <span id="frame-about-debug--gateway"><?= php_sapi_name() ?> (<?= $_SERVER['GATEWAY_INTERFACE'] ?>)</span> + + <span><?= l("System Version", "Version système ") ?>:</span> + <span id="frame-about-debug--system"><?= php_uname("s") . " " . php_uname("r") ?></span> + + <span><?= l("Server User", "Util. serveur ") ?>:</span> + <span id="frame-about-debug--system"><?= get_current_user() ?></span> + </div> + + <b><?= l("Client Info", "Infos client ") ?>:</b><br> + + <div id="frame-about-debug--client" class="frame-about-section"> + <span><?= l("Logical Cores", "Cœurs logiques ") ?>:</span> + <span id="frame-about-debug--cores">...</span> + + <span><?= l("Language", "Langue ") ?>:</span> + <span id="frame-about-debug--language">...</span> + + <span><?= l("Touch Points", "Points de contact ") ?>:</span> + <span id="frame-about-debug--touch">...</span> + + <span><?= l("Working Online", "En ligne ") ?>:</span> + <span id="frame-about-debug--online">...</span> + + <span><?= l("Mobile Device", "Appareil mobile ") ?>:</span> + <span id="frame-about-debug--mobile">...</span> + + <span><?= l("Navigator Brand", "Marque navigateur ") ?>:</span> + <span id="frame-about-debug--brands">...</span> + </div> + </div> + + <script> + setInterval(() => { + document.getElementById("frame-about-debug--cores").innerText = navigator.hardwareConcurrency; + document.getElementById("frame-about-debug--language").innerText = navigator.language; + document.getElementById("frame-about-debug--touch").innerText = navigator.maxTouchPoints; + document.getElementById("frame-about-debug--online").innerText = navigator.onLine; + try { + document.getElementById("frame-about-debug--mobile").innerText = navigator.userAgentData.mobile; + } catch (e) { + document.getElementById("frame-about-debug--mobile").innerText = "null"; + } + try { + document.getElementById("frame-about-debug--brands").innerText = navigator.userAgentData.brands.map(i => { return i.brand.trim() + "/" + i.version }).join(", "); + } catch (e) { + document.getElementById("frame-about-debug--brands").innerText = navigator.userAgent.replace(/(\([._;:\/\\A-Za-z 0-9,]*\))/gm, "").split(" ").filter(i => i.trim() !== "").filter(i => !i.startsWith("Mozilla")).join(", "); + } + + if (window.parent.ArgonPlayer._current !== null) { + if (!window.parent.ArgonPlayer._shuffle) { + if (window.parent._argonSongsData.sorted[window.parent._argonSongsData.sorted.indexOf(window.parent.ArgonPlayer._current) + 1]) { + document.getElementById("frame-about-debug--nextSong").innerText = window.parent._argonSongsData.sorted[window.parent._argonSongsData.sorted.indexOf(window.parent.ArgonPlayer._current) + 1]; + } else { + document.getElementById("frame-about-debug--nextSong").innerText = "<not applicable>"; + } + } else { + document.getElementById("frame-about-debug--nextSong").innerText = "<shuffle on>"; + } + + if (!window.parent.ArgonPlayer._shuffle) { + if (window.parent._argonSongsData.sorted[window.parent._argonSongsData.sorted.indexOf(window.parent.ArgonPlayer._current) - 1]) { + document.getElementById("frame-about-debug--previousSong").innerText = window.parent._argonSongsData.sorted[window.parent._argonSongsData.sorted.indexOf(window.parent.ArgonPlayer._current) - 1]; + } else { + document.getElementById("frame-about-debug--previousSong").innerText = "<?= l("<not applicable>", "<pas applicable>") ?>"; + } + } else { + document.getElementById("frame-about-debug--previousSong").innerText = "<?= l("<shuffle on>", "<lect. aléa. activée>") ?>"; + } + + document.getElementById("frame-about-debug--songId").innerText = window.parent.ArgonPlayer._current; + document.getElementById("frame-about-debug--songMetadata").innerText = window.parent._argonSongsData.songs[window.parent.ArgonPlayer._current].name + " (" + window.parent._argonSongsData.songs[window.parent.ArgonPlayer._current].author + ", original<?= l("", " ") ?>: " + window.parent._argonSongsData.songs[window.parent.ArgonPlayer._current].original + ")"; + document.getElementById("frame-about-debug--songRelease").innerText = window.parent._argonSongsData.songs[window.parent.ArgonPlayer._current].release; + document.getElementById("frame-about-debug--seeking").innerText = !window.parent.ArgonPlayer._seekbar; + document.getElementById("frame-about-debug--shuffle").innerText = window.parent.ArgonPlayer._shuffle; + document.getElementById("frame-about-debug--repeat").innerText = window.parent.ArgonPlayer._repeat; + switch (window.parent.ArgonPlayer._preferredQualityPreference[0] - 1 + 1) { + case 0: + document.getElementById("frame-about-debug--quality").innerText = window.parent.ArgonPlayer._currentQuality + " (<?= l("dynamic", "dynamique") ?>)"; + break; + case 1: + document.getElementById("frame-about-debug--quality").innerText = window.parent.ArgonPlayer._currentQuality + " (<?= l("fixed", "fixe") ?>)"; + break; + case 2: + document.getElementById("frame-about-debug--quality").innerText = window.parent.ArgonPlayer._currentQuality + " (original)"; + break; + default: + document.getElementById("frame-about-debug--quality").innerText = window.parent.ArgonPlayer._currentQuality + " (<?= l("unknown", "inconnu") ?>)"; + break; + } + document.getElementById("frame-about-debug--position").innerText = "(" + (window.parent.document.getElementById("player-seekbar").value / 1000).toFixed(3) + ") " + window.parent.ArgonPlayer._player.currentTime.toFixed(3) + "/" + window.parent.ArgonPlayer._player.duration.toFixed(3); + document.getElementById("frame-about-debug--stream").innerText = window.parent.ArgonPlayer._player.src; + switch (window.parent.ArgonPlayer._player.readyState) { + case 0: + document.getElementById("frame-about-debug--state").innerText = window.parent.ArgonPlayer._player.readyState + " (HAVE_NOTHING, <?= l("not playable", "ne peut pas lire") ?>)"; + break; + case 1: + document.getElementById("frame-about-debug--state").innerText = window.parent.ArgonPlayer._player.readyState + " (HAVE_METADATA, <?= l("seekable", "navigable") ?>)"; + break; + case 2: + document.getElementById("frame-about-debug--state").innerText = window.parent.ArgonPlayer._player.readyState + " (HAVE_CURRENT_DATA, <?= l("real-time download", "téléch. en temps réel") ?>)"; + break; + case 3: + document.getElementById("frame-about-debug--state").innerText = window.parent.ArgonPlayer._player.readyState + " (HAVE_FUTURE_DATA, <?= l("ready", "prêt") ?>)"; + break; + case 4: + document.getElementById("frame-about-debug--state").innerText = window.parent.ArgonPlayer._player.readyState + " (HAVE_ENOUGH_DATA, <?= l("uninterrupted", "ininterrompu") ?>)"; + break; + default: + document.getElementById("frame-about-debug--state").innerText = window.parent.ArgonPlayer._player.readyState + " (<?= l("unknown", "inconnu") ?>)"; + break; + } + } else { + document.getElementById("frame-about-debug--songId").innerText = "<?= l("<not playing>", "<pas de lecture>") ?>"; + document.getElementById("frame-about-debug--songMetadata").innerText = "<?= l("<not playing>", "<pas de lecture>") ?>"; + document.getElementById("frame-about-debug--songRelease").innerText = "<?= l("<not playing>", "<pas de lecture>") ?>"; + document.getElementById("frame-about-debug--quality").innerText = "<?= l("<not playing>", "<pas de lecture>") ?>"; + document.getElementById("frame-about-debug--position").innerText = "<?= l("<not playing>", "<pas de lecture>") ?>"; + document.getElementById("frame-about-debug--stream").innerText = "<?= l("<not playing>", "<pas de lecture>") ?>"; + document.getElementById("frame-about-debug--state").innerText = "<?= l("<not playing>", "<pas de lecture>") ?>"; + document.getElementById("frame-about-debug--nextSong").innerText = "<?= l("<not playing>", "<pas de lecture>") ?>"; + document.getElementById("frame-about-debug--previousSong").innerText = "<?= l("<not playing>", "<pas de lecture>") ?>"; + } + }) + + width = Math.max(...Array.from(document.getElementsByClassName('frame-about-section')).map(i => { return Array.from(i.children).filter(i => i.id === "").map(i => { return i.clientWidth; }); }).map(i => { return Math.max(...i); })); + + for (let item of [].concat(...Array.from(document.getElementsByClassName('frame-about-section')).map(i => Array.from(i.children).filter(i => i.id === "")))) { + item.style.width = width + "px"; + } + </script> + </div> +</div> +</body> +</html>
\ No newline at end of file diff --git a/_frame/home/index.php b/_frame/home/index.php new file mode 100644 index 0000000..c0f0c69 --- /dev/null +++ b/_frame/home/index.php @@ -0,0 +1,39 @@ +<?php if (str_ends_with($_SERVER['HTTP_HOST'], ".familine.minteck.org")) { $_FAMILINE = true; } else { $_FAMILINE = false; } function l($en, $fr) { global $_FAMILINE; if ($_FAMILINE) { return $fr; } else { return $en; } } $root = $_SERVER['DOCUMENT_ROOT']; $root = $_SERVER['DOCUMENT_ROOT']; if ($_FAMILINE) { require_once "/mnt/familine/app/session.php"; } ?> +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Argon</title> + <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> + <link rel="stylesheet" href="/css/fonts.css"> + <link rel="stylesheet" href="/css/general.css"> + <link rel="stylesheet" href="/css/header.css"> + <link rel="stylesheet" href="/css/frame-home.css"> + <link rel="stylesheet" href="/css/frame.css"> + <link rel="stylesheet" href="/dark.css"> + <meta name="HandheldFriendly" content="true" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> +</head> +<body> +<div id="argon-frame"> + <div id="frame-header"> + <?= l("Home", "Accueil") ?> + </div> + <div id="frame-contents"> + <div id="frame-home-intro" <?= $_FAMILINE ? "style=\"filter: hue-rotate(250deg);\"" : "" ?>> + <img src="<?= str_contains($_SERVER['HTTP_USER_AGENT'], "+AutomateCloud/") ? ("/native.svg") : ($_FAMILINE ? "https://familine.minteck.org/icns/familine-music.svg" : "/logo/256.png") ?>" id="frame-home-logo" <?= $_FAMILINE ? "style=\"filter: hue-rotate(-250deg);\"" : "" ?>> + <div id="frame-home-welcome"><?= l("Welcome to the Argon Media Platform!", "Bienvenue sur Familine Musique !") ?></div> + <div id="frame-home-tagline"><?= l("High quality ad-free music from Minteck", "Musique de haute qualité et sans publicités de la famille") ?></div> + <button onclick="location.href='/_frame/library';" id="frame-home-button"><?= l("Browse Library", "Explorer la bibliothèque") ?></button> + <div id="frame-home-links"> + <a onclick="location.href='/_frame/about';" id="frame-home-link-about" class="frame-home-link"><?= l("About Argon", "À propos") ?></a> + · + <a onclick="location.href='/_frame/settings';" id="frame-home-link-settings" class="frame-home-link"><?= l("Preferences", "Préférences") ?></a> + · + <a onclick="window.open('https://gitlab.minteck.org/explore/projects/topics/Argon');" id="frame-home-link-source" class="frame-home-link"><?= l("Source Code", "Code source") ?></a> + </div> + </div> + </div> +</div> +</body> +</html>
\ No newline at end of file diff --git a/_frame/index.php b/_frame/index.php new file mode 100644 index 0000000..bd6bbfb --- /dev/null +++ b/_frame/index.php @@ -0,0 +1,4 @@ +<?php + +header("Location: /_frame/home"); +die();
\ No newline at end of file diff --git a/_frame/library.internal/index.php b/_frame/library.internal/index.php new file mode 100644 index 0000000..04f766e --- /dev/null +++ b/_frame/library.internal/index.php @@ -0,0 +1,7 @@ +<?php + +if (trim($_GET['_']) === "") { + require_once $_SERVER["DOCUMENT_ROOT"] . "/_frame/library.internal/main.php"; +} else { + require_once $_SERVER["DOCUMENT_ROOT"] . "/_frame/library.internal/view.php"; +}
\ No newline at end of file diff --git a/_frame/library.internal/main.php b/_frame/library.internal/main.php new file mode 100644 index 0000000..7ce781e --- /dev/null +++ b/_frame/library.internal/main.php @@ -0,0 +1,60 @@ +<?php if (str_ends_with($_SERVER['HTTP_HOST'], ".familine.minteck.org")) { $_FAMILINE = true; } else { $_FAMILINE = false; } function l($en, $fr) { global $_FAMILINE; if ($_FAMILINE) { return $fr; } else { return $en; } } $root = $_SERVER['DOCUMENT_ROOT']; $root = $_SERVER['DOCUMENT_ROOT']; if ($_FAMILINE) { require_once "/mnt/familine/app/session.php"; } ?> +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Argon</title> + <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> + <link rel="stylesheet" href="/css/fonts.css"> + <link rel="stylesheet" href="/css/general.css"> + <link rel="stylesheet" href="/css/header.css"> + <link rel="stylesheet" href="/css/frame-library.css?_=a"> + <link rel="stylesheet" href="/css/frame.css"> + <link rel="stylesheet" href="/dark.css"> + <meta name="HandheldFriendly" content="true" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> +</head> +<body> +<div id="argon-frame"> + <div id="frame-header"> + <?= l("Library", "Bibliothèque") ?> + </div> + <div id="frame-contents"> + <?php $data = json_decode(file_get_contents("https://argon.minteck.org/api/get_list.php"), true); ?> + <div id="frame-library-listing"> + <?php foreach ($data["listing"] as $item): ?> + <div onclick="if (!event.target.classList.contains('frame-library-item-part-song')) location.href='/_frame/library/<?= $item["_id"] ?>';" class="frame-library-item" id="frame-library-item--<?= $item["_type"] . "-" . $item["_id"] ?>"> + <div class="frame-library-item-inner"> + <div class="frame-library-item-cover"> + <img alt="<?= l("Album art", "Couv. album") ?>" class="frame-library-item-cover-inner" src="/api/get_image.php?_=<?= $item["_id"] ?>"> + </div> + <div class="frame-library-item-text"> + <div class="frame-library-item-text-inner"> + <div class="frame-library-item-text-title"><?= $item["name"] ?><?php if ($item["wip"]): ?> <span class="frame-library-wipBadge"><?= l("WIP", "En travail") ?></span><?php endif; ?></div> + <div class="frame-library-item-text-info"><?= $item["author"] ?> · <?= substr($item["release"], 0, 4); ?></div> + <?php if ($item["_type"] === "song"): ?> + <div class="frame-library-item-text-original"><?= $item["original"] === null ? l("Original Content", "Contenu original") : l("original by ", "original par ") . $item["original"] ?></div> + <?php else: ?> + <div class="frame-library-item-text-original"><?= count($item["songs"]) ?> <?= l("tracks", "morceaux") ?></div> + <?php endif; ?> + </div> + </div> + </div> + <?php if ($item["_type"] === "set"): ?> + <div class="frame-library-item-set"> + <?php foreach ($item["songs"] as $index => $song): ?> + <div <?php if ($song["_released"]): ?>onclick="location.href='/_frame/library/<?= $song["_id"] ?>';"<?php endif; ?> class="frame-library-item-set-song frame-library-item-part-song <?php if (!$song["_released"]): ?>frame-library-item-set-song-wip<?php endif; ?>" id="frame-library-item-set-song--<?= $item["_id"] ?>--<?= $song["_id"] ?>"> + <div class="frame-library-item-set-song-cover frame-library-item-part-song"> + <img alt="<?= l("Album art", "Couv. album") ?>" class="frame-library-item-set-song-cover-inner frame-library-item-part-song" src="/api/get_image.php?_=<?= $song["_id"] ?>"></div> + <div class="frame-library-item-set-song-title frame-library-item-part-song"><?= $song["name"] ?><?php if ($song["wip"]): ?> <span class="frame-library-wipBadge"><?= l("WIP", "En travail") ?></span><?php endif; ?></div> + </div> + <?php endforeach; ?> + </div> + <?php endif; ?> + </div> + <?php endforeach; ?> + </div> + </div> +</div> +</body> +</html>
\ No newline at end of file diff --git a/_frame/library.internal/view.php b/_frame/library.internal/view.php new file mode 100644 index 0000000..b66a4ca --- /dev/null +++ b/_frame/library.internal/view.php @@ -0,0 +1,161 @@ +<?php if (str_ends_with($_SERVER['HTTP_HOST'], ".familine.minteck.org")) { $_FAMILINE = true; setlocale(LC_TIME, array('fr_FR.UTF-8','fr_FR@euro','fr_FR','french')); } else { $_FAMILINE = false; } function l($en, $fr) { global $_FAMILINE; if ($_FAMILINE) { return $fr; } else { return $en; } } $root = $_SERVER['DOCUMENT_ROOT']; $root = $_SERVER['DOCUMENT_ROOT']; + +$data = json_decode(file_get_contents("https://argon.minteck.org/api/get_list.php"), true); +$views = json_decode(file_get_contents("/mnt/argon-cdn/3pad/data.json"), true); + +if (str_starts_with($_GET['_'], ":")) { + header("Location: /_frame/library"); + die(); +} + +$set = null; +$selected = null; +foreach ($data["listing"] as $item) { + if ($item["_id"] === $_GET['_']) { + $selected = $item; + if ($item["_type"] === "set") { + $set = true; + + foreach ($item["songs"] as $song) { + if ($song["_id"] === $_GET['_']) { + $selected = $song; + $set = false; + } + } + } else { + $set = false; + } + } else { + if ($item["_type"] === "set") { + foreach ($item["songs"] as $song) { + if ($song["_id"] === $_GET['_']) { + $selected = $song; + $set = false; + } + } + } + } +} + +if ($selected === null) { + header("Location: /_frame/library"); + die(); +} + +?> +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Argon</title> + <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> + <link rel="stylesheet" href="/css/fonts.css"> + <link rel="stylesheet" href="/css/general.css"> + <link rel="stylesheet" href="/css/header.css"> + <link rel="stylesheet" href="/css/frame-library.css?_=a"> + <link rel="stylesheet" href="/css/frame.css"> + <link rel="stylesheet" href="/dark.css"> + <meta name="HandheldFriendly" content="true" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> +</head> +<body> +<div id="argon-frame"> + <div id="frame-header"> + <?= l("Library", "Bibliothèque") ?> + </div> + <div id="frame-contents"> + <div id="frame-viewer-header-outer" style="background-image: url('/api/get_image.php?_=<?= $selected["_id"] ?>');"> + <div id="frame-viewer-header" <?= str_contains($_SERVER['HTTP_USER_AGENT'], "WebKit") || str_contains($_SERVER['HTTP_USER_AGENT'], "Chrome") ? 'style= "background: rgba(200, 200, 200, .5);"' : '' ?>> + <div id="frame-viewer-header-inner"> + <div id="frame-viewer-header-cover"> + <img id="frame-viewer-header-cover-inner" alt="<?= l("Album art", "Couv. album") ?>" src="/api/get_image.php?_=<?= $selected["_id"] ?>"> + </div> + <div id="frame-viewer-header-text"> + <div id="frame-viewer-header-text-inner"> + <div id="frame-viewer-header-text-title"><?= $selected["name"] ?><?php if ($selected["wip"]): ?> <span class="frame-library-wipBadge"><?= l("WIP", "En travail") ?></span><?php endif; ?></div> + <div id="frame-viewer-header-text-info"><?= l("by", "par") ?> <?= $selected["author"] ?> · <?= l("released", "sorti le") ?> <?php + $fmt = new \IntlDateFormatter($_FAMILINE ? "fr_FR" : "en_US", NULL, NULL); + $fmt->setPattern('d MMMM yyyy'); + echo $fmt->format(new DateTime($selected["release"])); + ?> + <?php + + $playable = false; + $firstPlayableIndex = -1; + $notPlayableCount = 0; + + if ($selected["_type"] === "set") { + foreach ($selected["songs"] as $index => $song) { + if ($song["_released"]) { + if ($firstPlayableIndex === -1) $firstPlayableIndex = $index; + $playable = true; + } else { + $notPlayableCount++; + } + } + } else if (!str_starts_with($selected["_id"], "_")) { + $playable = true; + } + + ?> + <?php if ($playable): ?> + <?php if ((isset($selected["set"]) || $selected["_type"] === "song") && $selected["_released"]): ?>· <?= $views[$selected["_id"]]["_total"] ?> <?= l("listen", "écoute") ?><?= $views[$selected["_id"]] > 1 || $views[$selected["_id"]] === 0 ? "s" : "" ?><?php elseif ($selected["_type"] === "set"): ?>· <?php + + $listens = 0; + foreach ($selected["songs"] as $song) { + $listens = $listens + $views[$song["_id"]]["_total"]; + } + echo $listens; + + ?> <?= l("listen", "écoute") ?><?= $listens > 1 || $listens === 0 ? "s" : "" ?> + <?php endif; ?> + <?php endif; ?></div> + <?php if ($selected["_type"] === "song" || isset($selected["set"])): ?> + <div class="frame-viewer-header-text-original"><?php if ($selected["set"] !== null): ?><?= l("in", "dans") ?> <a id="frame-viewer-header-text-linkToSet" onclick="location.href='/_frame/library/<?= $selected["set"]["_id"] ?>';"><?= $selected["set"]["name"] ?></a> · <?php endif; ?><?= $selected["original"] === null ? l("Original Content", "Contenu original") : l("original by", "original par") . " <a id='frame-viewer-header-text-linkToOriginal' onclick='window.open("" . $selected['link'] . "")'>" . $selected["original"] . "</a>" ?></div> + <?php else: ?> + <div class="frame-viewer-header-text-original"><?= count($selected["songs"]) ?> tracks</div> + <?php endif; ?> + <?php if ($playable): ?> + <button onclick="window.parent.ArgonPlayer.play('<?= $selected["_type"] === "set" ? $selected["songs"][$firstPlayableIndex]["_id"] : $selected["_id"] ?>');" id="frame-viewer-header-play"><?= l("Play", "Lire") ?></button> + <?php if ($notPlayableCount > 0 && $playable): ?> + <span id="frame-viewer-header-notAvailableCount"><?= $notPlayableCount ?> <?= l("track", "morceau") ?><?= $notPlayableCount > 1 ? "s" : "" ?> <?= l("are not playable at the moment.", $notPlayableCount > 1 ? "ne sont pas accessibles en ce moment." : "n'est pas accessible en ce moment") ?></span> + <?php endif; ?> + <?php else: ?> + <div id="frame-viewer-header-notPlayable"><?= $selected["_type"] === "set" ? l("This playlist", "Cette liste de lecture") : l("This song", "Ce morceau") ?> <?= l("is not playable at the moment.", "n'est pas accessible en ce moment.") ?></div> + <?php endif; ?> + </div> + </div> + </div> + </div> + </div> + <div id="frame-viewer-description"> + <?php if (trim($selected["description"]) !== ""): ?> + <?= strip_tags($selected["description"]) ?> + <?php else: ?> + <span style="opacity:.5;"><?= l("No description provided.", "Aucune description donnée.") ?></span> + <?php endif; ?> + </div> + <?php if ((isset($selected["_type"]) && $selected["_type"] === "set") || isset($selected["set"])): ?> + <?php + if (isset($selected["_type"]) && $selected["_type"] === "set") $set = $selected; + if (isset($selected["set"])) { + $set = $selected["set"]; + foreach ($set["songs"] as $index => $sid) { + if (isset($data["songs"][$sid])) $set["songs"][$index] = $data["songs"][$sid]; + } + } + ?> + <div class="frame-library-item-set" id="frame-viewer-set"> + <?php foreach ($set["songs"] as $index => $song): ?> + <div <?php if ($song["_released"]): ?>onclick="location.href='/_frame/library/<?= $song["_id"] ?>';"<?php endif; ?> class="frame-library-item-set-song frame-library-item-part-song <?php if (!$song["_released"]): ?>frame-library-item-set-song-wip<?php endif; ?>" id="frame-library-item-set-song--<?= $set["_id"] ?>--<?= $song["_id"] ?>"> + <div class="frame-library-item-set-song-cover frame-library-item-part-song"> + <img alt="<?= l("Album art", "Couv. album") ?>" class="frame-library-item-set-song-cover-inner frame-library-item-part-song" src="/api/get_image.php?_=<?= $song["_id"] ?>"></div> + <div class="frame-library-item-set-song-title frame-library-item-part-song"><?= isset($selected["set"]) && $song["_id"] === $selected["_id"] ? "<b>" . $song["name"] . "</b>" : $song["name"] ?><?php if ($song["wip"]): ?> <span class="frame-library-wipBadge"><?= l("WIP", "En travail") ?></span><?php endif; ?></div> + </div> + <?php endforeach; ?> + </div> + <?php endif; ?> + </div> +</div> +</body> +</html>
\ No newline at end of file diff --git a/_frame/lyrics/index.php b/_frame/lyrics/index.php new file mode 100644 index 0000000..5b75d54 --- /dev/null +++ b/_frame/lyrics/index.php @@ -0,0 +1,99 @@ +<?php if (str_ends_with($_SERVER['HTTP_HOST'], ".familine.minteck.org")) { $_FAMILINE = true; } else { $_FAMILINE = false; } function l($en, $fr) { global $_FAMILINE; if ($_FAMILINE) { return $fr; } else { return $en; } } $root = $_SERVER['DOCUMENT_ROOT']; $root = $_SERVER['DOCUMENT_ROOT']; if ($_FAMILINE) { require_once "/mnt/familine/app/session.php"; } ?> +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Argon</title> + <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> + <link rel="stylesheet" href="/css/fonts.css"> + <link rel="stylesheet" href="/css/general.css"> + <link rel="stylesheet" href="/css/loader.css"> + <link rel="stylesheet" href="/css/header.css"> + <link rel="stylesheet" href="/css/frame-lyrics.css"> + <link rel="stylesheet" href="/css/frame.css"> + <link rel="stylesheet" href="/dark.css"> + <meta name="HandheldFriendly" content="true" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> +</head> +<body> +<div id="argon-frame"> + <div id="frame-header"> + <?= l("Lyrics", "Paroles") ?> + </div> + <div id="frame-contents"> + <div id="frame-lyrics-loader"> + <div style="width:48px;height:48px;text-align: center;margin-left: auto;margin-right: auto;"> + <svg class="circular-loader" viewBox="25 25 50 50"> + <circle class="loader-path" cx="50" cy="50" r="20" fill="none"></circle> + </svg> + </div> + </div> + <div id="frame-lyrics-none" style="display:none;"> + <div id="frame-lyrics-none-inner"> + <img src="/icons/no-lyrics.svg" id="frame-lyrics-none-icon"> + <div id="frame-lyrics-none-message"><?= l("No lyrics available for this song", "Pas de paroles disponibles pour ce morceau") ?></div> + </div> + </div> + <div id="frame-lyrics-play" style="display:none;"> + <div id="frame-lyrics-play-inner"> + <img src="/icons/lyrics-not-playing.svg" id="frame-lyrics-play-icon"> + <div id="frame-lyrics-play-message"><?= l("No music is currently playing", "Aucun contenu n'est en cours de lecture") ?></div> + </div> + </div> + <div id="frame-lyrics-show" style="display:none;"> + <div id="frame-lyrics-show-header"> + <b id="frame-lyrics-show-header-author">Author</b> · <b id="frame-lyrics-show-header-title">Song Name</b><br> + <b id="frame-lyrics-show-header-original"><?= l("original creation", "création originalle") ?></b> + </div> + <br> + <div id="frame-lyrics-show-inner"></div> + <br> + <div id="frame-lyrics-show-copyright"></div> + </div> + </div> + + <script> + _shouldRefresh = true; + + document.onmousedown = () => { + _shouldRefresh = false; + } + document.onmouseup = () => { + _shouldRefresh = true; + } + + setInterval(() => { + if (!_shouldRefresh) return; + + document.getElementById("frame-lyrics-none").style.display = "none"; + document.getElementById("frame-lyrics-show").style.display = "none"; + document.getElementById("frame-lyrics-play").style.display = "none"; + document.getElementById("frame-lyrics-loader").style.display = "none"; + + if (typeof window.parent.ArgonPlayer._current === "string") { + if (typeof window.parent._argonSongsData.songs[window.parent.ArgonPlayer._current].lyrics === "string") { + document.getElementById("frame-lyrics-show-header-title").innerHTML = window.parent._argonSongsData.songs[window.parent.ArgonPlayer._current].name; + document.getElementById("frame-lyrics-show-header-author").innerHTML = window.parent._argonSongsData.songs[window.parent.ArgonPlayer._current].author; + if (window.parent._argonSongsData.songs[window.parent.ArgonPlayer._current].original) { + document.getElementById("frame-lyrics-show-header-original").innerHTML = "<?= l("original by ", "original par ") ?>" + window.parent._argonSongsData.songs[window.parent.ArgonPlayer._current].original; + document.getElementById("frame-lyrics-show-copyright").innerText = "© " + window.parent._argonSongsData.songs[window.parent.ArgonPlayer._current].original; + } else { + document.getElementById("frame-lyrics-show-header-original").innerHTML = "<?= l("original creation", "creation originale") ?>"; + document.getElementById("frame-lyrics-show-copyright").innerText = "© " + window.parent._argonSongsData.songs[window.parent.ArgonPlayer._current].author; + } + document.getElementById("frame-lyrics-show-inner").innerHTML = window.parent._argonSongsData.songs[window.parent.ArgonPlayer._current].lyrics.split("\n").join("<br>"); + document.getElementById("frame-lyrics-show").style.display = ""; + document.getElementById("frame-lyrics-loader").style.display = "none"; + } else { + document.getElementById("frame-lyrics-none").style.display = ""; + document.getElementById("frame-lyrics-loader").style.display = "none"; + } + } else { + document.getElementById("frame-lyrics-play").style.display = ""; + document.getElementById("frame-lyrics-loader").style.display = "none"; + } + }, 1000) + </script> +</div> +</body> +</html>
\ No newline at end of file diff --git a/_frame/settings/index.php b/_frame/settings/index.php new file mode 100644 index 0000000..b0ac0b7 --- /dev/null +++ b/_frame/settings/index.php @@ -0,0 +1,51 @@ +<?php if (str_ends_with($_SERVER['HTTP_HOST'], ".familine.minteck.org")) { $_FAMILINE = true; } else { $_FAMILINE = false; } function l($en, $fr) { global $_FAMILINE; if ($_FAMILINE) { return $fr; } else { return $en; } } $root = $_SERVER['DOCUMENT_ROOT']; $root = $_SERVER['DOCUMENT_ROOT']; if ($_FAMILINE) { require_once "/mnt/familine/app/session.php"; } ?> +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Argon</title> + <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> + <link rel="stylesheet" href="/css/fonts.css"> + <link rel="stylesheet" href="/css/general.css"> + <link rel="stylesheet" href="/css/loader.css"> + <link rel="stylesheet" href="/css/header.css"> + <link rel="stylesheet" href="/css/frame-settings.css"> + <link rel="stylesheet" href="/css/frame.css"> + <link rel="stylesheet" href="/dark.css"> + <meta name="HandheldFriendly" content="true" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> +</head> +<body> +<div id="argon-frame"> + <div id="frame-header"> + <?= l("Preferences", "Préférences") ?> + </div> + <div id="frame-contents"> + <?= l("Audio Quality", "Qualité audio") ?><br> + <select onchange="localStorage.setItem('quality', document.getElementById('frame-settings-quality').value); document.getElementById('frame-settings-quality-warning').style.display = document.getElementById('frame-settings-quality').value !== '0' ? '' : 'none'" id="frame-settings-quality"> + <optgroup label="<?= l("Recommended Settings", "Paramètres recommendés") ?>"> + <option value="0"><?= l("Automatically depending on network (recommended)", "Automatiquement selon le réseau (recommandé)") ?></option> + <option value="2"><?= l("Original audio quality", "Qualité audio originale") ?></option> + </optgroup> + <optgroup label="<?= l("Advanced", "Avancé") ?>"> + <option value="1:ultrahighpcm"><?= l("Highest quality", "Qualité la plus haute") ?> (<?= l("CBR", "constant") ?> 460<?= l("kbps", " ko/s") ?>, 32<?= l("bit", " bits") ?>)</option> + <option value="1:veryhigh"><?= l("Higher quality", "Qualité plus haute") ?> (<?= l("CBR", "constant") ?> 320<?= l("kbps", " ko/s") ?>, 32<?= l("bit", " bits") ?>)</option> + <option value="1:high"><?= l("High quality", "Haute qualité") ?> (<?= l("VBR", "variable") ?> 245<?= l("kbps", " ko/s") ?>, 32<?= l("bit", " bits") ?>)</option> + <option value="1:medium"><?= l("Medium quality", "Qualité moyenne") ?> (<?= l("VBR", "variable") ?> 175<?= l("kbps", " ko/s") ?>, 16<?= l("bit", " bits") ?>)</option> + <option value="1:low"><?= l("Low quality", "Basse qualité") ?> (<?= l("VBR", "variable") ?> 130<?= l("kbps", " ko/s") ?>, 16<?= l("bit", " bits") ?>)</option> + <option value="1:verylow"><?= l("Slightly lower quality", "Qualité légèrement plus basse") ?> (<?= l("VBR", "variable") ?> 100<?= l("kbps", " ko/s") ?>, 16<?= l("bit", " bits") ?>)</option> + <option value="1:ultralow"><?= l("Lower quality", "Qualité plus basse") ?> (<?= l("VBR", "variable") ?> 85<?= l("kbps", " ko/s") ?>, 16<?= l("bit", " bits") ?>)</option> + <option value="1:superlow"><?= l("Lowest quality", "Qualité la plus basse") ?> (<?= l("VBR", "variable") ?> 65<?= l("kbps", " ko/s") ?>, 16<?= l("bit", " bits") ?>)</option> + </optgroup> + </select> + <div id="frame-settings-quality-warning" style="display:none;"><?= l("Using another audio quality setting than the default one may lead to audio not playing continuously due to low Internet connection or poor performance.", "Utiliser une autre option de qualité audio que celle par défaut peut empêcher l'audio d'être lu en continu en raison d'une mauvaise performance réseau ou système.") ?></div> + </div> + + <script> + if (localStorage.getItem("quality") === null) localStorage.setItem('quality', '0'); + document.getElementById('frame-settings-quality').value = localStorage.getItem("quality"); + document.getElementById('frame-settings-quality-warning').style.display = document.getElementById('frame-settings-quality').value !== '0' ? '' : 'none'; + </script> +</div> +</body> +</html>
\ No newline at end of file |