From 41bb52c5513170bec4a14a0b4563e57468562fa5 Mon Sep 17 00:00:00 2001 From: Colin Powell Date: Tue, 24 Mar 2026 10:42:10 -0400 Subject: [PATCH] [scrobbles] Add tagging from labels --- .../migrations/0074_add_tags_to_scrobble.py | 26 +++++++++++++++++++ vrobbler/apps/scrobbles/models.py | 15 ++++++++--- 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 vrobbler/apps/scrobbles/migrations/0074_add_tags_to_scrobble.py diff --git a/vrobbler/apps/scrobbles/migrations/0074_add_tags_to_scrobble.py b/vrobbler/apps/scrobbles/migrations/0074_add_tags_to_scrobble.py new file mode 100644 index 0000000..978f256 --- /dev/null +++ b/vrobbler/apps/scrobbles/migrations/0074_add_tags_to_scrobble.py @@ -0,0 +1,26 @@ +# Generated by Django 4.2.29 on 2026-03-24 14:14 + +from django.db import migrations +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ("taggit", "0004_alter_taggeditem_content_type_alter_taggeditem_tag"), + ("scrobbles", "0073_delete_chartrecord"), + ] + + operations = [ + migrations.AddField( + model_name="scrobble", + name="tags", + field=taggit.managers.TaggableManager( + blank=True, + help_text="A comma-separated list of tags.", + through="taggit.TaggedItem", + to="taggit.Tag", + verbose_name="Tags", + ), + ), + ] diff --git a/vrobbler/apps/scrobbles/models.py b/vrobbler/apps/scrobbles/models.py index 11fadc4..ccf154d 100644 --- a/vrobbler/apps/scrobbles/models.py +++ b/vrobbler/apps/scrobbles/models.py @@ -12,8 +12,9 @@ import pytz from beers.models import Beer from boardgames.models import BoardGame from books.koreader import process_koreader_sqlite_file -from books.models import Book, Paper, BookPageLogData, BookLogData +from books.models import Book, BookLogData, BookPageLogData, Paper from bricksets.models import BrickSet +from charts.utils import build_charts from dataclass_wizard.errors import ParseError from django.conf import settings from django.contrib.auth import get_user_model @@ -42,15 +43,15 @@ from profiles.utils import ( from puzzles.models import Puzzle from scrobbles import dataclasses as logdata from scrobbles.constants import ( + AUTO_FINISH_MEDIA, LONG_PLAY_MEDIA, MEDIA_END_PADDING_SECONDS, - AUTO_FINISH_MEDIA, ) from scrobbles.importers.lastfm import LastFM from scrobbles.notifications import ScrobbleNtfyNotification -from charts.utils import build_charts from scrobbles.utils import get_file_md5_hash, media_class_to_foreign_key from sports.models import SportEvent +from taggit.managers import TaggableManager from tasks.models import Task from trails.models import Trail from videogames import retroarch @@ -447,6 +448,7 @@ class Scrobble(TimeStampedModel): decoder=logdata.ScrobbleLogDataDecoder, ) timezone = models.CharField(max_length=50, **BNULL) + tags = TaggableManager(blank=True) # Fields for keeping track of video game data videogame_save_data = models.FileField( @@ -1296,6 +1298,8 @@ class Scrobble(TimeStampedModel): ] ) + self._add_labels_as_tags() + class_name = self.media_obj.__class__.__name__ if class_name in LONG_PLAY_MEDIA.values(): self.finish_long_play() @@ -1313,6 +1317,11 @@ class Scrobble(TimeStampedModel): }, ) + def _add_labels_as_tags(self) -> None: + if self.logdata and hasattr(self.logdata, "labels") and self.logdata.labels: + for label in self.logdata.labels: + self.tags.add(label) + def pause(self) -> None: if self.is_paused: logger.warning(f"{self.id} - already paused - {self.source}")