Compare commits

..
4 Commits
7 changed files with 300 additions and 100 deletions

No files matched your search

+2 -20
View File
@@ -6,12 +6,8 @@
<title>Queue Reader</title>
</head>
<body>
{% if current_link %}
<p>
<a href="/r" target="_blank" rel="noopener noreferrer" id="a"
>{{ current_link }}</a
>
</p>
{% from 'macros.html' import magic_link %} {% if current_link %}
<p>{{ magic_link(current_link, current_link, "a") }}</p>
<button id="b">skip/fw</button>
<script>
document.getElementById("b").addEventListener("click", async () => {
@@ -20,20 +16,6 @@
window.location.reload();
});
});
/**@type {HTMLAnchorElement}*/
const a = document.getElementById("a");
a.addEventListener("click", function (e) {
// all ts so safari works ://
e.preventDefault();
window.open(
this.href,
this.target,
Array.from(this.relList).join(", ")
);
setTimeout(() => {
window.location.reload();
});
});
</script>
{% else %}
<p>no</p>
+57
View File
@@ -0,0 +1,57 @@
{% macro magic_link(url, text, unique_id='magic_link') %}
<a
href="{{ url }}"
target="_blank"
rel="noopener noreferrer"
id="{{ unique_id }}"
>
{{ text }}
</a>
<script>
(function () {
const a = document.getElementById("{{ unique_id }}");
a.addEventListener("click", function (e) {
e.preventDefault();
window.open(
this.href,
this.target,
Array.from(this.relList).join(", ")
);
setTimeout(() => {
window.location.reload();
});
});
})();
</script>
{% endmacro %} {% macro qrcode_queue(queue_items) %} {% if queue_items %}
<ol>
{% for item in queue_items %}
<li>
<a href="{{ item }}" target="_blank" rel="noreferrer noopener">
{{ item }}
<div class="qrcode"></div>
</a>
</li>
{% endfor %}
<style>
/* it works ig */
& {
li:has(.qrcode) {
width: min-content;
}
}
</style>
</ol>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/qrcode.js"></script>
<script>
window.addEventListener("load", (_) => {
document.querySelectorAll(".qrcode").forEach((e) => {
const a = e.parentElement.textContent.trim();
new QRCode(e, {
text: a,
correctLevel: QRCode.CorrectLevel.L,
});
});
});
</script>
{% endif %} {% endmacro %}
+130
View File
@@ -0,0 +1,130 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Queue dump type shit</title>
<style>
li {
width: min-content;
}
</style>
</head>
<body>
<!-- style="display: flex; justify-content: space-between" -->
<form id="c">
<label for="n"
>how many:
<input
name="n"
id="n"
step="1"
min="0"
type="number"
placeholder="how many"
value="1"
/></label>
<div>
<button id="s" type="button">send it</button>
<button id="all" type="button">send all</button>
</div>
</form>
<div id="gonk"></div>
<script>
/** @type {HTMLDivElement} */
const bij = document.getElementById("gonk");
let arrlen = 0;
/** @type {HTMLInputElement} */
const n = document.getElementById("n");
const changeHandler = async () => {
const number = parseInt(n.value);
if (isNaN(number)) {
bij.textContent = "number?";
return;
}
const f = new URL("/api/queue", window.location.href);
f.searchParams.append("n", number);
console.log("fetching", f);
const c = await fetch(f)
.then((r) => r.json())
.then((n) => {
console.log(n);
arrlen = n.length;
if (n) {
const ol = document.createElement("ol");
for (const i of n) {
const li = document.createElement("li");
const a = document.createElement("a");
a.href = i;
a.textContent = i;
a.target = "_blank";
a.rel = "noopener noreferrer";
li.appendChild(a);
ol.appendChild(li);
}
bij.textContent = `next ${
n.length != 1
? `${n.length} entries are`
: "entry is"
} SO gone`;
bij.appendChild(ol);
} else {
bij.textContent = "wym empty";
}
})
.catch((e) => {
console.error(e);
arrlen = 0;
bij.textContent = `shit. cant fetch`;
});
};
n.addEventListener("change", changeHandler);
/** @type {HTMLFormElement} */
const c = document.getElementById("c");
c.addEventListener("submit", async (e) => {
e.preventDefault();
await changeHandler();
});
changeHandler();
const s = document.getElementById("s");
s.addEventListener("click", (e) => {
e.preventDefault();
console.log("ts runs");
changeHandler();
for (const _ of Array(arrlen)) {
const w = window.open(
"/r",
"_blank",
"noopener, noreferrer"
);
console.log(w);
}
arrlen = 0;
bij.textContent = "something idk";
});
/** @type {HTMLButtonElement} */
const all = document.getElementById("all");
all.addEventListener(
"click",
async () =>
await fetch("/api/queue/len")
.then((d) => d.json())
.then((len) => {
console.log("ts runs", len);
for (const _ of Array(len)) {
const w = window.open(
"/r",
"_blank",
"noopener, noreferrer"
);
console.log(w);
}
arrlen = 0;
bij.textContent = "everything idk";
})
.catch((e) => console.error(e))
);
</script>
</body>
</html>
+18
View File
@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>QRCode queue</title>
</head>
<body>
{% from "macros.html" import qrcode_queue %}
{% if queue_items %}
<p>total: {{ queue_items|length }}</p>
{{ qrcode_queue(queue_items) }}
{% else %}
<p>empty</p>
{% endif %}
</body>
</html>
+16 -24
View File
@@ -7,40 +7,32 @@
</head>
<body>
<form method="POST" action="/queuein">
<label for="l">in:</label>
<label for="lines">in:</label>
<textarea
id="l"
rows="20"
cols="100"
style="min-width: 20%; min-height: 20dvh"
name="l"
name="lines"
></textarea>
<input type="submit" value="ahh" />
</form>
{% if queue_items %}
<ol>
{% for item in queue_items %}
<li>
<a href="{{ item }}" target="_blank" rel="noreferrer noopener">
{{ item }}
<div class="qrcode"></div>
</a>
</li>
{% endfor %}
</ol>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/qrcode.js"></script>
<script>
window.addEventListener("load", (_) => {
document.querySelectorAll(".qrcode").forEach((e) => {
const a = e.parentElement.textContent.trim();
new QRCode(e, {
text: a,
correctLevel: QRCode.CorrectLevel.L,
});
});
/**@type {HTMLTextAreaElement} */
(
// lifted from google search ai
document.getElementById("l")
).addEventListener("keydown", function (e) {
// Check for Ctrl+Enter (Windows/Linux) or Command+Enter (Mac)
if ((e.ctrlKey || e.metaKey) && e.key === "Enter") {
e.preventDefault(); // Prevent the default newline character
// Submit the form associated with this textarea
this.form.submit();
}
});
</script>
{% endif %}
{% from "macros.html" import qrcode_queue %} {% if queue_items %}
<p>total: {{ queue_items|length }}</p>
{% endif %} {{ qrcode_queue(queue_items) }}
</body>
</html>
-56
View File
@@ -1,56 +0,0 @@
"gemini converted"
from collections import deque
import uvicorn
from fastapi import FastAPI, Form, Request
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory="templates")
queue: deque[str] = deque()
def link_extract_from_onetab(line):
"link | title"
link = line.split("|", 1)[0].strip()
return link
@app.get("/", response_class=HTMLResponse)
async def no(request: Request):
current_link = queue[0] if queue else None
return templates.TemplateResponse(
"index.html", {"request": request, "current_link": current_link}
)
@app.get("/r")
async def redir(request: Request):
if queue:
q = queue.popleft()
return RedirectResponse(url=q)
return templates.TemplateResponse(
"index.html", {"request": request, "current_link": None}
)
@app.get("/queuein", response_class=HTMLResponse)
async def cuh_get(request: Request):
return templates.TemplateResponse(
"queue.html", {"request": request, "queue_items": list(queue)}
)
@app.post("/queuein")
async def cuh_post(l: str = Form("")):
for line in l.splitlines():
if line.strip():
queue.append(link_extract_from_onetab(line))
return RedirectResponse(url="/queuein", status_code=303)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=2222)
# uvicorn --host "0.0.0.0" --port 2222 uhhhh_fastapi:app
+77
View File
@@ -0,0 +1,77 @@
"gemini converted"
from collections import deque
from itertools import islice
import uvicorn
from fastapi import FastAPI, Form, Request
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory="templates")
queue: deque[str] = deque() # lifo ahh
def link_extract_from_onetab(line):
"link | title"
link = line.split("|", 1)[0].strip()
return link
@app.get("/", response_class=HTMLResponse)
async def no(request: Request):
current_link = queue[0] if queue else None
return templates.TemplateResponse(
request, "index.html", {"current_link": current_link}
)
@app.get("/r")
async def redir(request: Request):
if queue:
q = queue.popleft()
return RedirectResponse(url=q)
return templates.TemplateResponse(request, "index.html", {"current_link": None})
@app.get("/m", response_class=HTMLResponse)
async def mlti(request: Request):
"request first new style"
return templates.TemplateResponse(request, "multi.html")
@app.get("/api/queue")
async def queueview(n: int | None = None, s: int | None = None):
return list(islice(queue, s, n))
@app.get("/api/queue/len")
async def queuelen():
return len(queue)
@app.get("/qrcode_queue", response_class=HTMLResponse)
async def qrcodequeue(request: Request):
return templates.TemplateResponse(request, "qq.html", {"queue_items": list(queue)})
@app.get("/queuein", response_class=HTMLResponse)
async def cuh_get(request: Request):
return templates.TemplateResponse(
request, "queue.html", {"queue_items": list(queue)}
)
@app.post("/queuein")
async def cuh_post(lines: str = Form("")):
"""var name == form ele name (name="lines")"""
queue.extend(
link_extract_from_onetab(line) for line in lines.splitlines() if line.strip()
)
return RedirectResponse(url="/queuein", status_code=303)
if __name__ == "__main__":
uvicorn.run("uhhhhup:app", host="0.0.0.0", port=2222, reload=True)
# uvicorn --host "0.0.0.0" --port 2222 --reload uhhhhup:app