Add tap controls, lock-screen playback and other comfort features

- Tap/click a track to play or pause, double-tap/double-click to like
  with a heart burst; any key or tap starts playback
- Media Session API: lock-screen, notification and headphone controls,
  with next/previous working while the screen is locked
- Drag the waveform to seek, hover shows the time
- "Not for me" button feeds a dislike signal into the ranker
- Share button (native share sheet or copy link)
- Likes newest first, each playable right away
- Filters remembered per browser, clear button, active indicator
- Panels close on outside click or Esc; help overlay on "?"
- Buffering spinner, paused badge, toast messages, first-run hint
- Installable as an app (manifest and icons)
- Refreshed README screenshots and controls
This commit is contained in:
nvrl committed 2026-10-31 20:49:47 +01:00
1 parent 4a7f6903a3
commit 87af563a95
16 files changed
+731 -112

No files matched your search

+14 -9
View File
@@ -59,15 +59,20 @@ local session token is stored. Logins are rate-limited to 5 per IP and 3 per ema
## Controls
| key | action |
| -------------- | ---------------- |
| ↓ / j, ↑ / k | next / previous |
| space | play / pause |
| ← / → | seek 10 s |
| l | like |
| phone | desktop | action |
| ---------------- | -------------------- | ------------------------------ |
| tap | click · space | play / pause |
| double-tap | double-click · l | like |
| swipe up / down | ↓ j · ↑ k | next / previous |
| drag waveform | drag waveform · ← → | seek |
| ✕ button | x | not for me (skip, show less) |
| share button | s | share / copy link |
| | m | mute |
| | ? · Esc | help · close panels |
Click the waveform to seek. "filters" sets free-only and a BPM range. "likes" lists everything
you liked, with links to pl8list.
Lock-screen, notification and headphone buttons control playback too (Media Session API).
"likes" lists your likes newest first; ▶ plays one right away. Filters (free only, BPM range)
are remembered per browser. The site can be installed to the home screen as an app.
## How it works
@@ -96,7 +101,7 @@ one request every 20 seconds. When a user likes or finishes a track, its related
its artist's catalogue are crawled first.
**Ranking** (`ranker.py`). Each track the user has not seen yet gets a score from popularity,
freshness, artist affinity (from their likes, completions and skips), closeness to the BPM and
freshness, artist affinity (from their likes, completions, skips and "not for me"), closeness to the BPM and
key of tracks they liked, whether it is related to something they liked, and some random
exploration. Artists are then spread out so you don't get five tracks from one person in a
row. Tune `WEIGHTS` at the top of the file.