Compare commits
No commits in common. "main" and "v1.0.0" have entirely different histories.
13 changed files with 0 additions and 348 deletions
|
|
@ -138,10 +138,6 @@ themes/mon-theme/
|
||||||
|
|
||||||
Les chemins doivent rester dans le dossier du thème (`..` et chemins absolus refusés) et les valeurs des variables ne peuvent pas contenir `url(`, `;` ou `{}` : un thème téléchargé ne peut ni lire vos fichiers ni casser l'interface. Les erreurs de thème sont écrites dans les logs. Les sons d'Orbe sont générés par `node tools/gen-sounds.mjs`.
|
Les chemins doivent rester dans le dossier du thème (`..` et chemins absolus refusés) et les valeurs des variables ne peuvent pas contenir `url(`, `;` ou `{}` : un thème téléchargé ne peut ni lire vos fichiers ni casser l'interface. Les erreurs de thème sont écrites dans les logs. Les sons d'Orbe sont générés par `node tools/gen-sounds.mjs`.
|
||||||
|
|
||||||
## Skin Steam
|
|
||||||
|
|
||||||
Pour garder Steam avec le style Orbe : skin CSS Loader pour Big Picture et le mode jeu SteamOS, plus une vidéo de démarrage pour Steam Deck. Voir [`skins/steam`](skins/steam/README.md).
|
|
||||||
|
|
||||||
## Mode kiosque
|
## Mode kiosque
|
||||||
|
|
||||||
*Paramètres*, *Mode kiosque* : le launcher reste en plein écran et ne se ferme plus au clavier (Alt+F4 ne suffit pas) ; on le quitte par le menu système.
|
*Paramètres*, *Mode kiosque* : le launcher reste en plein écran et ne se ferme plus au clavier (Alt+F4 ne suffit pas) ; on le quitte par le menu système.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
/* Orbe de particules (image fixe, rendue par tools/art.html) derrière l'accueil et la bibliothèque */
|
|
||||||
.gamepadui_BasicHome.gamepadui_OpaqueBackground,
|
|
||||||
.gamepadlibrary_GamepadLibrary {
|
|
||||||
background: url(/themes_custom/Orbe/orb.webp) right -10vw center / auto 110% no-repeat, radial-gradient(ellipse at 74% 50%, #151b09 0%, #0d0f0a 35%, #0a0a0a 70%) !important;
|
|
||||||
}
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
/* Archivo à la place de Motiva Sans : on redéclare la famille utilisée par Steam (les dernières déclarations l'emportent), sans toucher aux sélecteurs. */
|
|
||||||
@font-face { font-family: "Motiva Sans"; src: url(/themes_custom/Orbe/fonts/Archivo.woff2) format("woff2"); font-weight: 100; }
|
|
||||||
@font-face { font-family: "Motiva Sans"; src: url(/themes_custom/Orbe/fonts/Archivo.woff2) format("woff2"); font-weight: 300; }
|
|
||||||
@font-face { font-family: "Motiva Sans"; src: url(/themes_custom/Orbe/fonts/Archivo.woff2) format("woff2"); font-weight: 400; }
|
|
||||||
@font-face { font-family: "Motiva Sans"; src: url(/themes_custom/Orbe/fonts/Archivo.woff2) format("woff2"); font-weight: 500; }
|
|
||||||
@font-face { font-family: "Motiva Sans"; src: url(/themes_custom/Orbe/fonts/Archivo.woff2) format("woff2"); font-weight: 700; }
|
|
||||||
@font-face { font-family: "Motiva Sans"; src: url(/themes_custom/Orbe/fonts/Archivo.woff2) format("woff2"); font-weight: 400; font-style: italic; }
|
|
||||||
@font-face { font-family: "Motiva Sans"; src: url(/themes_custom/Orbe/fonts/Archivo.woff2) format("woff2"); font-weight: 300; font-style: italic; }
|
|
||||||
@font-face { font-family: "Motiva Sans"; src: url(/themes_custom/Orbe/fonts/Archivo.woff2) format("woff2"); font-weight: 700; font-style: italic; }
|
|
||||||
Binary file not shown.
|
|
@ -1,93 +0,0 @@
|
||||||
Copyright 2020 The Archivo Project Authors (https://github.com/Omnibus-Type/Archivo)
|
|
||||||
|
|
||||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
||||||
This license is copied below, and is also available with a FAQ at:
|
|
||||||
http://scripts.sil.org/OFL
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------
|
|
||||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
||||||
-----------------------------------------------------------
|
|
||||||
|
|
||||||
PREAMBLE
|
|
||||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
||||||
development of collaborative font projects, to support the font creation
|
|
||||||
efforts of academic and linguistic communities, and to provide a free and
|
|
||||||
open framework in which fonts may be shared and improved in partnership
|
|
||||||
with others.
|
|
||||||
|
|
||||||
The OFL allows the licensed fonts to be used, studied, modified and
|
|
||||||
redistributed freely as long as they are not sold by themselves. The
|
|
||||||
fonts, including any derivative works, can be bundled, embedded,
|
|
||||||
redistributed and/or sold with any software provided that any reserved
|
|
||||||
names are not used by derivative works. The fonts and derivatives,
|
|
||||||
however, cannot be released under any other type of license. The
|
|
||||||
requirement for fonts to remain under this license does not apply
|
|
||||||
to any document created using the fonts or their derivatives.
|
|
||||||
|
|
||||||
DEFINITIONS
|
|
||||||
"Font Software" refers to the set of files released by the Copyright
|
|
||||||
Holder(s) under this license and clearly marked as such. This may
|
|
||||||
include source files, build scripts and documentation.
|
|
||||||
|
|
||||||
"Reserved Font Name" refers to any names specified as such after the
|
|
||||||
copyright statement(s).
|
|
||||||
|
|
||||||
"Original Version" refers to the collection of Font Software components as
|
|
||||||
distributed by the Copyright Holder(s).
|
|
||||||
|
|
||||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
||||||
or substituting -- in part or in whole -- any of the components of the
|
|
||||||
Original Version, by changing formats or by porting the Font Software to a
|
|
||||||
new environment.
|
|
||||||
|
|
||||||
"Author" refers to any designer, engineer, programmer, technical
|
|
||||||
writer or other person who contributed to the Font Software.
|
|
||||||
|
|
||||||
PERMISSION & CONDITIONS
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
||||||
redistribute, and sell modified and unmodified copies of the Font
|
|
||||||
Software, subject to the following conditions:
|
|
||||||
|
|
||||||
1) Neither the Font Software nor any of its individual components,
|
|
||||||
in Original or Modified Versions, may be sold by itself.
|
|
||||||
|
|
||||||
2) Original or Modified Versions of the Font Software may be bundled,
|
|
||||||
redistributed and/or sold with any software, provided that each copy
|
|
||||||
contains the above copyright notice and this license. These can be
|
|
||||||
included either as stand-alone text files, human-readable headers or
|
|
||||||
in the appropriate machine-readable metadata fields within text or
|
|
||||||
binary files as long as those fields can be easily viewed by the user.
|
|
||||||
|
|
||||||
3) No Modified Version of the Font Software may use the Reserved Font
|
|
||||||
Name(s) unless explicit written permission is granted by the corresponding
|
|
||||||
Copyright Holder. This restriction only applies to the primary font name as
|
|
||||||
presented to the users.
|
|
||||||
|
|
||||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
||||||
Software shall not be used to promote, endorse or advertise any
|
|
||||||
Modified Version, except to acknowledge the contribution(s) of the
|
|
||||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
||||||
permission.
|
|
||||||
|
|
||||||
5) The Font Software, modified or unmodified, in part or in whole,
|
|
||||||
must be distributed entirely under this license, and must not be
|
|
||||||
distributed under any other license. The requirement for fonts to
|
|
||||||
remain under this license does not apply to any document created
|
|
||||||
using the Font Software.
|
|
||||||
|
|
||||||
TERMINATION
|
|
||||||
This license becomes null and void if any of the above conditions are
|
|
||||||
not met.
|
|
||||||
|
|
||||||
DISCLAIMER
|
|
||||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
||||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
||||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
||||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
||||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 40 KiB |
|
|
@ -1,61 +0,0 @@
|
||||||
/* Orbe pour Steam (Big Picture, mode jeu SteamOS) via CSS Loader.
|
|
||||||
Les classes sont écrites sous leur nom lisible : CSS Loader les traduit vers les noms de la version de Steam installée
|
|
||||||
(tools/check.py vérifie qu'elles existent toutes). */
|
|
||||||
:root {
|
|
||||||
--orbe-bg: #0a0a0a;
|
|
||||||
--orbe-surface: #121212;
|
|
||||||
--orbe-line: #262624;
|
|
||||||
--orbe-text: #f5f5f0;
|
|
||||||
--orbe-muted: #8f8f8a;
|
|
||||||
--orbe-accent: #d3fd50;
|
|
||||||
}
|
|
||||||
|
|
||||||
::selection { background: var(--orbe-accent); color: var(--orbe-bg); }
|
|
||||||
|
|
||||||
/* Fonds : noir profond à la place du bleu nuit */
|
|
||||||
.gamepadui_BasicHome.gamepadui_OpaqueBackground,
|
|
||||||
.gamepadlibrary_GamepadLibrary { background: var(--orbe-bg) !important; }
|
|
||||||
.gamepadpagedsettings_PagedSettingsDialog,
|
|
||||||
.mainmenu_Menu { background: var(--orbe-bg) !important; }
|
|
||||||
|
|
||||||
/* Jaquettes : contour citron au focus */
|
|
||||||
.appportrait_LibraryItemBox.gpfocus {
|
|
||||||
outline: 3px solid var(--orbe-accent) !important;
|
|
||||||
outline-offset: 3px;
|
|
||||||
box-shadow: 0 0 34px rgba(211, 253, 80, .28) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Boutons : accent plein au focus */
|
|
||||||
button.DialogButton.gpfocus,
|
|
||||||
button.DialogButton:enabled.gpfocus,
|
|
||||||
button.gamepaddialog_Button.DialogButton.gpfocus,
|
|
||||||
button.gamepaddialog_Button.DialogButton:enabled.gpfocus {
|
|
||||||
background: var(--orbe-accent) !important;
|
|
||||||
color: var(--orbe-bg) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Onglets du haut */
|
|
||||||
.gamepadtabbedpage_Tab.gamepadtabbedpage_Selected,
|
|
||||||
.gamepadtabbedpage_Tab.gamepadtabbedpage_Selected:hover {
|
|
||||||
background-color: var(--orbe-accent) !important;
|
|
||||||
color: var(--orbe-bg) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Menu principal : entrée active en citron */
|
|
||||||
.mainmenu_Item.mainmenu_Active,
|
|
||||||
.mainmenu_Item.mainmenu_Active .mainmenu_ItemIcon { color: var(--orbe-accent) !important; }
|
|
||||||
|
|
||||||
/* Menus contextuels */
|
|
||||||
.gamepadcontextmenu_contextMenuItem.gamepadcontextmenu_Focused {
|
|
||||||
background: var(--orbe-accent) !important;
|
|
||||||
color: var(--orbe-bg) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Lignes de réglage : léger voile citron au focus */
|
|
||||||
.gamepaddialog_Field.gpfocus,
|
|
||||||
.gamepaddialog_Field.gpfocuswithin { background: rgba(211, 253, 80, .08) !important; }
|
|
||||||
|
|
||||||
/* Interrupteurs et curseurs */
|
|
||||||
.gamepaddialog_ToggleRail::before { background: var(--orbe-accent) !important; }
|
|
||||||
.gamepaddialog_Toggle.gamepaddialog_On .gamepaddialog_ToggleSwitch { background: var(--orbe-bg) !important; }
|
|
||||||
.gamepadslider_SliderTrack { --left-track-color: var(--orbe-accent) !important; }
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
{
|
|
||||||
"name": "Orbe",
|
|
||||||
"author": "yasder5",
|
|
||||||
"version": "v1.0.0",
|
|
||||||
"description": "Le style d'Orbe Launcher dans Steam (Big Picture et mode jeu SteamOS) : noir profond, accent citron, police Archivo, orbe de particules en fond.",
|
|
||||||
"target": "System-Wide",
|
|
||||||
"manifest_version": 8,
|
|
||||||
"inject": {
|
|
||||||
"shared.css": ["SP", "bigpicture", "QuickAccess", "MainMenu"]
|
|
||||||
},
|
|
||||||
"patches": {
|
|
||||||
"Police Archivo": {
|
|
||||||
"default": "Yes",
|
|
||||||
"type": "checkbox",
|
|
||||||
"values": {
|
|
||||||
"Yes": { "fonts.css": ["SP", "bigpicture", "QuickAccess", "MainMenu"] },
|
|
||||||
"No": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Fond orbe": {
|
|
||||||
"default": "Yes",
|
|
||||||
"type": "checkbox",
|
|
||||||
"values": {
|
|
||||||
"Yes": { "background.css": ["SP", "bigpicture"] },
|
|
||||||
"No": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
# Skin Steam Orbe
|
|
||||||
|
|
||||||
Le style d'Orbe Launcher pour l'interface manette de Steam (Big Picture sous Windows, mode jeu SteamOS / Steam Deck), via [CSS Loader](https://github.com/DeckThemes/SDH-CssLoader). Rien n'est modifié dans les fichiers de Steam.
|
|
||||||
|
|
||||||
- `Orbe/` : le thème CSS Loader (couleurs dans `shared.css`, options « Police Archivo » et « Fond orbe »).
|
|
||||||
- `deck_startup.webm` : vidéo de démarrage 1280×800 pour Steam Deck / SteamOS.
|
|
||||||
- `tools/check.py` : vérifie que chaque classe utilisée existe dans la version actuelle de Steam.
|
|
||||||
- `tools/art.html` + `tools/render.py` : rendent `Orbe/orb.webp` et les images de la vidéo.
|
|
||||||
|
|
||||||
## Installer
|
|
||||||
|
|
||||||
**Steam Deck / SteamOS** : Decky Loader, puis CSS Loader depuis sa boutique ; copier `Orbe/` dans `~/homebrew/themes/` et l'activer dans CSS Loader.
|
|
||||||
|
|
||||||
**Windows (Big Picture)** : [CSSLoader Desktop](https://github.com/beebls/CSSLoader-Desktop/releases) ; activer le mode développeur de Windows et redémarrer le backend une fois (police et fond) ; copier `Orbe/` dans `%USERPROFILE%\homebrew\themes\`.
|
|
||||||
|
|
||||||
**Vidéo de démarrage** : copier `deck_startup.webm` dans `~/.steam/root/config/uioverrides/movies/`, puis Paramètres, Personnalisation, Vidéo de démarrage.
|
|
||||||
|
|
||||||
## Classes Steam
|
|
||||||
|
|
||||||
Les sélecteurs utilisent les noms lisibles (`gamepaddialog_ToggleRail`) : CSS Loader les traduit vers les noms obfusqués de la version de Steam installée. Après une mise à jour de Steam :
|
|
||||||
|
|
||||||
```sh
|
|
||||||
curl -so map.json https://api.deckthemes.com/stable.json
|
|
||||||
# sp.css : dans le paquet steamui_websrc_all du client (liste : client-update.steamstatic.com/steam_client_ubuntu12)
|
|
||||||
python3 tools/check.py map.json sp.css
|
|
||||||
```
|
|
||||||
Binary file not shown.
|
|
@ -1,60 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="fr">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>Orbe Steam art</title>
|
|
||||||
<style>
|
|
||||||
/* Rendu image par image (pilote : tools/render.py). ?mode=bg : fond transparent 1920×1080 ; ?mode=boot : vidéo de démarrage 1280×800. */
|
|
||||||
@font-face { font-family: Archivo; src: url(../Orbe/fonts/Archivo.woff2) format('woff2'); font-weight: 100 900; }
|
|
||||||
html, body { margin: 0; background: transparent; overflow: hidden; }
|
|
||||||
body.boot { background: #0a0a0a; }
|
|
||||||
canvas { position: absolute; inset: 0; }
|
|
||||||
.mark { position: absolute; left: 0; right: 0; top: 50%; text-align: center; font: 900 120px/1 Archivo; letter-spacing: -.05em; color: #f5f5f0; opacity: 0; }
|
|
||||||
.mark span { color: #d3fd50; }
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<canvas id="cv"></canvas>
|
|
||||||
<div class="mark" id="mark">orbe<span>.</span></div>
|
|
||||||
<script>
|
|
||||||
const mode = new URLSearchParams(location.search).get('mode') || 'bg'
|
|
||||||
const W = mode === 'boot' ? 1280 : 1920, H = mode === 'boot' ? 800 : 1080
|
|
||||||
const cv = document.getElementById('cv'), ctx = cv.getContext('2d'), mark = document.getElementById('mark')
|
|
||||||
cv.width = W; cv.height = H; cv.style.width = W + 'px'; cv.style.height = H + 'px'
|
|
||||||
if (mode === 'boot') document.body.className = 'boot'
|
|
||||||
|
|
||||||
/* Même sphère de Fibonacci que le launcher et le site ; départ dispersé (graine fixe) pour l'arrivée des particules */
|
|
||||||
const N = 620, pts = []
|
|
||||||
let s = 7; const rnd = () => (s = (s * 16807) % 2147483647) / 2147483647
|
|
||||||
for (let i = 0; i < N; i++) {
|
|
||||||
const y = 1 - (i / (N - 1)) * 2, r = Math.sqrt(1 - y * y), th = i * 2.39996323
|
|
||||||
const a = rnd() * 6.283, d = 1.6 + rnd() * 2.2
|
|
||||||
pts.push({ x: Math.cos(th) * r, y, z: Math.sin(th) * r, hot: i % 9 === 0, sx: Math.cos(a) * d, sy: Math.sin(a) * d, lag: rnd() * .35 })
|
|
||||||
}
|
|
||||||
const ease = t => 1 - Math.pow(1 - Math.min(1, Math.max(0, t)), 3)
|
|
||||||
|
|
||||||
/* t en secondes */
|
|
||||||
window.render = t => {
|
|
||||||
const boot = mode === 'boot'
|
|
||||||
const R = boot ? 250 : 430, cx = boot ? W / 2 : W * .74, cy = boot ? H / 2 - 40 : H * .5
|
|
||||||
const a = .6 + t * .35, b = Math.sin(t * .4) * .3, ca = Math.cos(a), sa = Math.sin(a), cb = Math.cos(b), sb = Math.sin(b)
|
|
||||||
/* vidéo : arrivée 0 → 1,6 s, l'orbe s'efface derrière le mot (2,2 → 3 s), fondu au noir à la fin (3,4 → 4 s) */
|
|
||||||
const fade = boot ? 1 - ease((t - 3.4) / .6) : 1, dim = boot ? 1 - .7 * ease((t - 2.2) / .8) : 1
|
|
||||||
ctx.clearRect(0, 0, W, H)
|
|
||||||
for (const p of pts) {
|
|
||||||
const k = boot ? ease((t - p.lag) / 1.25) : 1
|
|
||||||
const x1 = p.x * ca - p.z * sa, z1 = p.x * sa + p.z * ca, y1 = p.y * cb - z1 * sb, z2 = p.y * sb + z1 * cb, d = (z2 + 1.4) / 2.4
|
|
||||||
const px = p.sx + (x1 - p.sx) * k, py = p.sy + (y1 - p.sy) * k
|
|
||||||
const al = (p.hot ? .2 + d * .7 : .06 + d * .42) * fade * dim * (boot ? Math.min(1, k * 1.5) : 1)
|
|
||||||
ctx.fillStyle = p.hot ? `rgba(211,253,80,${al})` : `rgba(243,243,238,${al})`
|
|
||||||
ctx.beginPath(); ctx.arc(cx + px * R, cy + py * R, (p.hot ? 2.4 : 1.5) * (boot ? 1.4 : 2) * (.6 + d * .7), 0, 6.283); ctx.fill()
|
|
||||||
}
|
|
||||||
if (boot) {
|
|
||||||
const m = ease((t - 1.7) / .7) * fade
|
|
||||||
mark.style.opacity = m; mark.style.transform = `translateY(${-50 + (1 - m) * 12}%)`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
render(0)
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
"""Vérifie que chaque classe lisible du skin (module_Nom) est connue de CSS Loader et existe dans l'interface Steam actuelle.
|
|
||||||
Usage : check.py <map.json de api.deckthemes.com/stable.json> <sp.css du paquet steamui_websrc_all>"""
|
|
||||||
import json, re, sys
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
mapping, sp = json.load(open(sys.argv[1])), open(sys.argv[2]).read()
|
|
||||||
alias = {a: v[-1] for v in mapping.values() for a in v}
|
|
||||||
bad = 0
|
|
||||||
for f in sorted((Path(__file__).parent.parent / "Orbe").glob("*.css")):
|
|
||||||
for name in sorted(set(re.findall(r"\.([a-z]+_[A-Za-z]+)\b", f.read_text()))):
|
|
||||||
cur = alias.get(name)
|
|
||||||
ok = cur is not None and re.search(r"\." + re.escape(cur) + r"(?![\w-])", sp)
|
|
||||||
bad += not ok
|
|
||||||
print("%-4s %-12s %-45s %s" % ("ok" if ok else "ABS", f.name, name, cur or "-"))
|
|
||||||
sys.exit(1 if bad else 0)
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
"""Rend tools/art.html dans un Chromium headless (protocole CDP) : fond orbe (PNG transparent) et vidéo de démarrage (images PNG).
|
|
||||||
Usage : render.py <url de art.html> <cdp ws http://hôte:port> <dossier de sortie>"""
|
|
||||||
import base64, json, os, sys, time, urllib.request
|
|
||||||
import websocket
|
|
||||||
|
|
||||||
url, cdp, out = sys.argv[1:4]
|
|
||||||
os.makedirs(out + "/frames", exist_ok=True)
|
|
||||||
t = json.load(urllib.request.urlopen(urllib.request.Request(cdp + "/json/new?about:blank", method="PUT")))
|
|
||||||
ws, n = websocket.create_connection(t["webSocketDebuggerUrl"], timeout=60), 0
|
|
||||||
|
|
||||||
|
|
||||||
def cmd(method, **params):
|
|
||||||
global n
|
|
||||||
n += 1
|
|
||||||
ws.send(json.dumps({"id": n, "method": method, "params": params}))
|
|
||||||
while True:
|
|
||||||
m = json.loads(ws.recv())
|
|
||||||
if m.get("id") == n:
|
|
||||||
return m.get("result", {})
|
|
||||||
|
|
||||||
|
|
||||||
def shot(path, w, h):
|
|
||||||
png = cmd("Page.captureScreenshot", format="png", clip={"x": 0, "y": 0, "width": w, "height": h, "scale": 1})["data"]
|
|
||||||
open(path, "wb").write(base64.b64decode(png))
|
|
||||||
|
|
||||||
|
|
||||||
def load(mode, w, h):
|
|
||||||
cmd("Emulation.setDeviceMetricsOverride", width=w, height=h, deviceScaleFactor=1, mobile=False)
|
|
||||||
cmd("Emulation.setDefaultBackgroundColorOverride", color={"r": 0, "g": 0, "b": 0, "a": 0})
|
|
||||||
cmd("Page.navigate", url=url + "?mode=" + mode)
|
|
||||||
time.sleep(1.5)
|
|
||||||
cmd("Runtime.evaluate", expression="document.fonts.ready", awaitPromise=True)
|
|
||||||
|
|
||||||
|
|
||||||
cmd("Page.enable")
|
|
||||||
load("bg", 1920, 1080)
|
|
||||||
cmd("Runtime.evaluate", expression="render(2)")
|
|
||||||
shot(out + "/orb.png", 1920, 1080)
|
|
||||||
|
|
||||||
load("boot", 1280, 800)
|
|
||||||
for i in range(120): # 4 s à 30 i/s
|
|
||||||
cmd("Runtime.evaluate", expression="render(%f)" % (i / 30))
|
|
||||||
shot("%s/frames/%03d.png" % (out, i), 1280, 800)
|
|
||||||
cmd("Page.close")
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue