Browse Source

Add media type to scrobbles

Colin Powell 2 years ago
parent
commit
7106a0840d

+ 1 - 3
vrobbler/apps/scrobbles/admin.py

@@ -1,4 +1,5 @@
 from django.contrib import admin
+
 from scrobbles.models import (
     AudioScrobblerTSVImport,
     ChartRecord,
@@ -110,8 +111,5 @@ class ScrobbleAdmin(admin.ModelAdmin):
     def media_name(self, obj):
         return obj.media_obj
 
-    def media_type(self, obj):
-        return obj.media_obj.__class__.__name__
-
     def playback_percent(self, obj):
         return obj.percent_played

+ 29 - 0
vrobbler/apps/scrobbles/migrations/0037_scrobble_media_type.py

@@ -0,0 +1,29 @@
+# Generated by Django 4.1.7 on 2023-04-09 04:42
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("scrobbles", "0036_scrobble_stop_timestamp"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="scrobble",
+            name="media_type",
+            field=models.CharField(
+                choices=[
+                    ("Video", "Video"),
+                    ("Track", "Track"),
+                    ("PodcastEpisode", "Podcast episode"),
+                    ("SportEvent", "Sport event"),
+                    ("Book", "Book"),
+                    ("VideoGame", "Video game"),
+                ],
+                default="Video",
+                max_length=14,
+            ),
+        ),
+    ]

+ 15 - 0
vrobbler/apps/scrobbles/models.py

@@ -411,6 +411,16 @@ class ChartRecord(TimeStampedModel):
 class Scrobble(TimeStampedModel):
     """A scrobble tracks played media items by a user."""
 
+    class MediaType(models.TextChoices):
+        """Enum mapping a media model type to a string"""
+
+        VIDEO = "Video", "Video"
+        TRACK = "Track", "Track"
+        PODCAST_EPISODE = "PodcastEpisode", "Podcast episode"
+        SPORT_EVENT = "SportEvent", "Sport event"
+        BOOK = "Book", "Book"
+        VIDEO_GAME = "VideoGame", "Video game"
+
     uuid = models.UUIDField(editable=False, **BNULL)
     video = models.ForeignKey(Video, on_delete=models.DO_NOTHING, **BNULL)
     track = models.ForeignKey(Track, on_delete=models.DO_NOTHING, **BNULL)
@@ -424,6 +434,9 @@ class Scrobble(TimeStampedModel):
     video_game = models.ForeignKey(
         VideoGame, on_delete=models.DO_NOTHING, **BNULL
     )
+    media_type = models.CharField(
+        max_length=14, choices=MediaType.choices, default=MediaType.VIDEO
+    )
     user = models.ForeignKey(
         User, blank=True, null=True, on_delete=models.DO_NOTHING
     )
@@ -457,6 +470,8 @@ class Scrobble(TimeStampedModel):
         if not self.uuid:
             self.uuid = uuid4()
 
+        self.media_type = self.MediaType(self.media_obj.__class__.__name__)
+
         return super(Scrobble, self).save(*args, **kwargs)
 
     @property