[scrobbles] Add note taking to webpages
Some checks failed
build & deploy / test (push) Successful in 1m51s
build & deploy / deploy (push) Failing after 2m2s

This commit is contained in:
2026-03-17 11:42:58 -04:00
parent f1f615f0ed
commit 48e13af2e8
4 changed files with 149 additions and 6 deletions

View File

@ -1,3 +1,5 @@
import re
from rest_framework import serializers
from scrobbles.models import (
AudioScrobblerTSVImport,
@ -7,10 +9,52 @@ from scrobbles.models import (
)
NOTE_POSITION_RE = re.compile(r"\[start:(\d+)\|end:(\d+)\]$")
class ScrobbleSerializer(serializers.HyperlinkedModelSerializer):
note = serializers.CharField(required=False, allow_blank=True)
note_position = serializers.DictField(required=False)
class Meta:
model = Scrobble
fields = "__all__"
extra_kwargs = {
"url": {"view_name": "scrobble-detail", "lookup_field": "uuid"},
}
def update(self, instance, validated_data):
note = validated_data.pop("note", None)
note_position = validated_data.pop("note_position", None)
instance = super().update(instance, validated_data)
if note is not None:
log = instance.log or {}
notes = log.get("notes", [])
if isinstance(notes, str):
notes = [notes]
elif notes is None:
notes = []
if note_position:
note = f"{note} [start:{note_position['start']}|end:{note_position['end']}]"
notes.append(note)
log["notes"] = notes
instance.log = log
instance.save(update_fields=["log"])
return instance
def parse_note_position(note):
match = NOTE_POSITION_RE.search(note)
if match:
start, end = match.groups()
text = NOTE_POSITION_RE.sub("", note)
return text, {"start": int(start), "end": int(end)}
return note, None
class KoReaderImportSerializer(serializers.HyperlinkedModelSerializer):
@ -19,9 +63,7 @@ class KoReaderImportSerializer(serializers.HyperlinkedModelSerializer):
fields = "__all__"
class AudioScrobblerTSVImportSerializer(
serializers.HyperlinkedModelSerializer
):
class AudioScrobblerTSVImportSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = AudioScrobblerTSVImport
fields = "__all__"

View File

@ -1,3 +1,5 @@
from logging import getLogger
from rest_framework import permissions, viewsets
from scrobbles.api.serializers import (
AudioScrobblerTSVImportSerializer,
@ -12,11 +14,14 @@ from scrobbles.models import (
LastFmImport,
)
logger = getLogger(__name__)
class ScrobbleViewSet(viewsets.ModelViewSet):
queryset = Scrobble.objects.all().order_by("-timestamp")
serializer_class = ScrobbleSerializer
permission_classes = [permissions.IsAuthenticated]
lookup_field = "uuid"
def get_queryset(self):
return super().get_queryset().filter(user=self.request.user)