From 1143ae9a49e466afc8b1aea33768abc2c134a2aa Mon Sep 17 00:00:00 2001 From: Chris Fulljames Date: Sun, 6 Jul 2025 18:15:34 -0400 Subject: [PATCH] Add ntfy instructions, uuid --- src/littlesongplace/__init__.py | 4 +++ src/littlesongplace/auth.py | 12 ++++--- src/littlesongplace/db.py | 2 +- src/littlesongplace/sql/schema.sql | 31 +++++++++++++++-- src/littlesongplace/sql/schema_revert.sql | 8 ++--- src/littlesongplace/sql/schema_update.sql | 30 ++-------------- src/littlesongplace/static/ntfy_done.webp | Bin 0 -> 16564 bytes src/littlesongplace/static/ntfy_server.webp | Bin 0 -> 20972 bytes src/littlesongplace/static/ntfy_sub.webp | Bin 0 -> 22350 bytes src/littlesongplace/templates/activity.html | 2 ++ src/littlesongplace/templates/index.html | 1 + src/littlesongplace/templates/news.html | 2 ++ .../templates/notifications.html | 32 ++++++++++++++++++ src/littlesongplace/users.py | 13 +++++++ 14 files changed, 96 insertions(+), 41 deletions(-) create mode 100644 src/littlesongplace/static/ntfy_done.webp create mode 100644 src/littlesongplace/static/ntfy_server.webp create mode 100644 src/littlesongplace/static/ntfy_sub.webp create mode 100644 src/littlesongplace/templates/notifications.html diff --git a/src/littlesongplace/__init__.py b/src/littlesongplace/__init__.py index 5754392..b2648fa 100644 --- a/src/littlesongplace/__init__.py +++ b/src/littlesongplace/__init__.py @@ -91,6 +91,10 @@ def site_news(): def about(): return render_template("about.html") +@app.get("/notifications") +def notifications(): + return render_template("notifications.html") + def get_gif_data(): # Convert all .gifs to base64 strings and embed them as dataset entries # in
s. This is used by nav.js:customImage() - it replaces specific diff --git a/src/littlesongplace/auth.py b/src/littlesongplace/auth.py index 174a5f2..b32a05b 100644 --- a/src/littlesongplace/auth.py +++ b/src/littlesongplace/auth.py @@ -4,7 +4,7 @@ from datetime import datetime, timezone import bcrypt from flask import Blueprint, render_template, redirect, flash, g, request, current_app, session -from . import comments, db +from . import comments, db, users from .logutils import flash_and_log bp = Blueprint("auth", __name__) @@ -108,10 +108,14 @@ def requires_login(f): if not "userid" in session: return redirect("/login") - g.userid = session["userid"] - g.username = session["username"] - return f(*args, **kwargs) return _wrapper +@bp.before_app_request +def load_user(): + if "userid" in session: + g.userid = session["userid"] + g.username = session["username"] + g.user = users.by_id(session["userid"]) + diff --git a/src/littlesongplace/db.py b/src/littlesongplace/db.py index ec1ebad..0fd94c9 100644 --- a/src/littlesongplace/db.py +++ b/src/littlesongplace/db.py @@ -6,7 +6,7 @@ from flask import abort, g, current_app from . import datadir -DB_VERSION = 5 +DB_VERSION = 6 def get(): db = getattr(g, '_database', None) diff --git a/src/littlesongplace/sql/schema.sql b/src/littlesongplace/sql/schema.sql index 51057b6..6b34013 100644 --- a/src/littlesongplace/sql/schema.sql +++ b/src/littlesongplace/sql/schema.sql @@ -1,3 +1,17 @@ +DROP TABLE IF EXISTS jam_events; +CREATE TABLE jam_events( + eventid INTEGER PRIMARY KEY, + jamid INTEGER NOT NULL, + threadid INTEGER NOT NULL, + created TEXT NOT NULL, + title TEXT NOT NULL, -- Hidden until startdate + startdate TEXT, + enddate TEXT, + description TEXT, -- Hidden until startdate + FOREIGN KEY(jamid) REFERENCES jams(jamid), + FOREIGN KEY(threadid) REFERENCES comment_threads(threadid) +); + DROP TABLE IF EXISTS users; CREATE TABLE users ( userid INTEGER PRIMARY KEY AUTOINCREMENT, @@ -21,9 +35,12 @@ CREATE TABLE songs ( title TEXT NOT NULL, description TEXT, threadid INTEGER, - FOREIGN KEY(userid) REFERENCES users(userid) + eventid INTEGER, + FOREIGN KEY(userid) REFERENCES users(userid), + FOREIGN KEY(eventid) REFERENCES jam_events(eventid) ); CREATE INDEX idx_songs_by_user ON songs(userid); +CREATE INDEX idx_songs_by_eventid ON songs(eventid); DROP TABLE IF EXISTS song_collaborators; CREATE TABLE song_collaborators ( @@ -159,5 +176,15 @@ BEGIN DELETE FROM notifications WHERE objectid = OLD.commentid AND objecttype = 0; END; -PRAGMA user_version = 4; +DROP TABLE IF EXISTS jams; +CREATE TABLE jams ( + jamid INTEGER PRIMARY KEY, + ownerid INTEGER NOT NULL, + created TEXT NOT NULL, + title TEXT NOT NULL, + description TEXT, + FOREIGN KEY(ownerid) REFERENCES users(userid) +); + +PRAGMA user_version = 5; diff --git a/src/littlesongplace/sql/schema_revert.sql b/src/littlesongplace/sql/schema_revert.sql index a6cd883..b4b96af 100644 --- a/src/littlesongplace/sql/schema_revert.sql +++ b/src/littlesongplace/sql/schema_revert.sql @@ -1,7 +1,3 @@ -DROP INDEX idx_songs_by_eventid; -ALTER TABLE songs DROP COLUMN eventid; -DROP TABLE IF EXISTS jams; -DROP TABLE IF EXISTS jam_events; - -PRAGMA user_version = 4; +ALTER TABLE users DROP COLUMN ntfyuuid; +PRAGMA user_version = 5; diff --git a/src/littlesongplace/sql/schema_update.sql b/src/littlesongplace/sql/schema_update.sql index ffb9b60..2e1021a 100644 --- a/src/littlesongplace/sql/schema_update.sql +++ b/src/littlesongplace/sql/schema_update.sql @@ -1,29 +1,3 @@ ---DROP TABLE IF EXISTS jams; -CREATE TABLE jams ( - jamid INTEGER PRIMARY KEY, - ownerid INTEGER NOT NULL, - created TEXT NOT NULL, - title TEXT NOT NULL, - description TEXT, - FOREIGN KEY(ownerid) REFERENCES users(userid) -); - ---DROP TABLE IF EXISTS jam_events; -CREATE TABLE jam_events( - eventid INTEGER PRIMARY KEY, - jamid INTEGER NOT NULL, - threadid INTEGER NOT NULL, - created TEXT NOT NULL, - title TEXT NOT NULL, -- Hidden until startdate - startdate TEXT, - enddate TEXT, - description TEXT, -- Hidden until startdate - FOREIGN KEY(jamid) REFERENCES jams(jamid), - FOREIGN KEY(threadid) REFERENCES comment_threads(threadid) -); - -ALTER TABLE songs ADD COLUMN eventid INTEGER REFERENCES jam_events(eventid); -CREATE INDEX idx_songs_by_eventid ON songs(eventid); - -PRAGMA user_version = 5; +ALTER TABLE users ADD COLUMN ntfyuuid TEXT; +PRAGMA user_version = 6; diff --git a/src/littlesongplace/static/ntfy_done.webp b/src/littlesongplace/static/ntfy_done.webp new file mode 100644 index 0000000000000000000000000000000000000000..da3444e688dad0a1d3f87ce53cb395ee3c7fe438 GIT binary patch literal 16564 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 z%0D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 literal 0 HcmV?d00001 diff --git a/src/littlesongplace/static/ntfy_server.webp b/src/littlesongplace/static/ntfy_server.webp new file mode 100644 index 0000000000000000000000000000000000000000..faf5f0f5bd49cd8ea5586bf75b6e47f7be2edc4d GIT binary patch literal 20972 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 literal 0 HcmV?d00001 diff --git a/src/littlesongplace/static/ntfy_sub.webp b/src/littlesongplace/static/ntfy_sub.webp new file mode 100644 index 0000000000000000000000000000000000000000..ff47abec68e55c7295ad58138120bc30f9d4f1a6 GIT binary patch literal 22350 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 ^ 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[push notifications available]

+ {% if comments %}

activity

diff --git a/src/littlesongplace/templates/index.html b/src/littlesongplace/templates/index.html index 587ff5d..edc7f79 100644 --- a/src/littlesongplace/templates/index.html +++ b/src/littlesongplace/templates/index.html @@ -33,6 +33,7 @@

hot new tunes

+

[push notifications available]

{% include "song-list.html" %} {% endblock %} diff --git a/src/littlesongplace/templates/news.html b/src/littlesongplace/templates/news.html index 36bd090..d552f81 100644 --- a/src/littlesongplace/templates/news.html +++ b/src/littlesongplace/templates/news.html @@ -6,6 +6,8 @@

site news

+

[push notifications available]

+

2025-07-01 - Download Button

You can now download your own songs as mp3 files from the dedicated button on diff --git a/src/littlesongplace/templates/notifications.html b/src/littlesongplace/templates/notifications.html new file mode 100644 index 0000000..82dccab --- /dev/null +++ b/src/littlesongplace/templates/notifications.html @@ -0,0 +1,32 @@ +{% extends "base.html" %} + +{% block title %}Push Notifications{% endblock %} + +{% block body %} + +

Push Notifications

+ +

+littlesong.place can send you push notifications on your phone via +ntfy. +It takes a few minutes to set up (I know, it's a little clunky), but you only have to do it once. +Here's how it works: +

+
    +
  1. Install the ntfy app on your device.
  2. +
  3. Open the app and grant it permission to send you push notifications when asked.
  4. +
  5. In the ntfy app, open the Settings tab, and set Default server to https://ntfy.littlesong.place.
  6. +
  7. Subscribe to each topic you'd like to be notified about using the '+' button in the app (see available topics below).
  8. +
  9. When you're done, it should look something like this:

  10. +
+Available topics include: +
    +
  • songs - get notified (at most once per day) when new songs are uploaded
  • +
  • news - get notified about site news
  • +
  • jams - get notified when jams start or end
  • + {% if g.user %} +
  • {{ g.user.ntfy_uuid }} (unique to you) - get notified about activity (comments)
  • + {% endif %} +
+ +{% endblock %} diff --git a/src/littlesongplace/users.py b/src/littlesongplace/users.py index 857196d..8d8de2d 100644 --- a/src/littlesongplace/users.py +++ b/src/littlesongplace/users.py @@ -1,3 +1,4 @@ +import uuid from dataclasses import dataclass from . import colors, datadir, db @@ -9,6 +10,7 @@ class User: fgcolor: str bgcolor: str accolor: str + _ntfy_uuid: str @property def colors(self): @@ -18,12 +20,23 @@ class User: "accolor": self.accolor, } + @property + def ntfy_uuid(self): + if not self._ntfy_uuid: + self._ntfy_uuid = str(uuid.uuid4()) + db.query( + "UPDATE users SET ntfyuuid = ? WHERE userid = ?", + [self._ntfy_uuid, self.userid]) + db.commit() + return self._ntfy_uuid + @classmethod def from_row(cls, row): user_colors = get_user_colors(row) return User( userid=row["userid"], username=row["username"], + _ntfy_uuid=row["ntfyuuid"], **user_colors) def by_id(userid): -- 2.39.5