- courses.py: curs "quantic" (shop.cursnlp.ro/curs/34, root nlp-quantic/) - download.py: yt-dlp cu 8 fragmente paralele + fara progress bar - rename_phone_quantic.py: copii MP3 cu ID3 (titlu, album per modul, track) + coperta - rename_phone_practitioner.py: font fallback Linux, an pe coperta din YEAR - nlp-quantic/: coperti M1-M5, pagina index.html pentru descarcare pe telefon, PDF-uri rezumat Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017NC1T6XwMepWVPuGZELZtT
59 lines
3.0 KiB
HTML
59 lines
3.0 KiB
HTML
<!doctype html>
|
||
<html lang="ro">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>NLP Quantic audio</title>
|
||
<style>
|
||
:root { --bg:#fff; --fg:#1a1a1a; --muted:#666; --line:#e3e3e3; --btn:#8e2a22; --btnfg:#fff; }
|
||
@media (prefers-color-scheme: dark) { :root { --bg:#121212; --fg:#eee; --muted:#aaa; --line:#333; --btn:#c0504a; } }
|
||
body { margin:0; padding:16px; background:var(--bg); color:var(--fg); font:16px/1.4 system-ui, sans-serif; max-width:720px; }
|
||
h1 { font-size:1.4em; margin:0 0 12px; }
|
||
h2 { font-size:1.1em; margin:24px 0 8px; display:flex; justify-content:space-between; align-items:center; gap:8px; }
|
||
button { background:var(--btn); color:var(--btnfg); border:0; border-radius:8px; padding:10px 14px; font-size:15px; }
|
||
button.big { width:100%; padding:14px; font-size:17px; }
|
||
.track { border-top:1px solid var(--line); padding:10px 0; }
|
||
.track a { color:var(--fg); }
|
||
audio { width:100%; margin-top:6px; }
|
||
#status { color:var(--muted); margin-top:8px; min-height:1.4em; }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<h1>NLP Quantic – audio</h1>
|
||
<button class="big" onclick="downloadAll(document.querySelectorAll('a.mp3'))">Descarcă tot (13 fișiere, 1.8 GB)</button>
|
||
<div id="status">Dacă browserul întreabă „permiți descărcări multiple?”, apasă Permite.</div>
|
||
<div id="list"></div>
|
||
<script>
|
||
const MODULES = {
|
||
"Quantic M1": ["Q1-01 NLP Quantic M1Z1.mp3", "Q1-02 NLP Quantic M1Z2.mp3", "Q1-03 Workshop Bonus - Experiente in apropierea mortii.mp3"],
|
||
"Quantic M2": ["Q2-01 Modulul 2 - ziua 1.mp3", "Q2-02 Modulul 2 - ziua 2.mp3"],
|
||
"Quantic M3": ["Q3-01 Modulul 3 ziua 1.mp3", "Q3-02 Modulul 3 ziua 2.mp3"],
|
||
"Quantic M4": ["Q4-01 Modulul 4 ziua 1.mp3", "Q4-02 Modulul 4 ziua 2.mp3"],
|
||
"Quantic M5": ["Q5-01 Modulul 5 ziua 1.mp3", "Q5-02 Modulul 5 ziua 2.mp3", "Q5-03 Workshop Bonus.mp3", "Q5-04 Workshop Bonus - Karma si Reincarnarea.mp3"],
|
||
};
|
||
const list = document.getElementById("list");
|
||
for (const [dir, files] of Object.entries(MODULES)) {
|
||
const sec = document.createElement("section");
|
||
sec.innerHTML = `<h2>${dir}<button>Descarcă modulul</button></h2>`;
|
||
for (const f of files) {
|
||
const url = encodeURIComponent(dir) + "/" + encodeURIComponent(f);
|
||
sec.insertAdjacentHTML("beforeend",
|
||
`<div class="track"><a class="mp3" href="${url}" download="${f}">${f.replace(".mp3", "")}</a>
|
||
<audio controls preload="none" src="${url}"></audio></div>`);
|
||
}
|
||
sec.querySelector("h2 button").onclick = () => downloadAll(sec.querySelectorAll("a.mp3"));
|
||
list.appendChild(sec);
|
||
}
|
||
async function downloadAll(links) {
|
||
const status = document.getElementById("status");
|
||
for (let i = 0; i < links.length; i++) {
|
||
status.textContent = `Pornesc descărcarea ${i + 1}/${links.length}: ${links[i].textContent}`;
|
||
links[i].click();
|
||
await new Promise(r => setTimeout(r, 2500)); // browsers drop rapid-fire download clicks
|
||
}
|
||
status.textContent = `Gata: ${links.length} descărcări pornite. Le găsești în folderul Download.`;
|
||
}
|
||
</script>
|
||
</body>
|
||
</html>
|