Browse Source

Fix artist aggregation so it works

Colin Powell 2 năm trước cách đây
mục cha
commit
f8c9df3b9a

+ 1 - 1
vrobbler/apps/music/aggregators.py

@@ -94,7 +94,7 @@ def top_artists(filter: str = "today", limit: int = 15) -> List["Artist"]:
 
     return (
         Artist.objects.annotate(
-            num_scrobbles=Sum("track__scrobble", distinct=True)
+            num_scrobbles=Count("track__scrobble", distinct=True)
         )
         .filter(time_filter)
         .order_by("-num_scrobbles")[:limit]

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

@@ -13,7 +13,7 @@ class ScrobbleAdmin(admin.ModelAdmin):
         "playback_position",
         "in_progress",
     )
-    list_filter = ("in_progress", "source")
+    list_filter = ("in_progress", "source", "track__artist")
     ordering = ("-timestamp",)
 
 

+ 6 - 0
vrobbler/apps/scrobbles/views.py

@@ -23,6 +23,7 @@ from scrobbles.utils import convert_to_seconds
 from videos.models import Video
 from vrobbler.apps.music.aggregators import (
     scrobble_counts,
+    top_artists,
     top_tracks,
     week_of_scrobbles,
 )
@@ -62,6 +63,11 @@ class RecentScrobbleList(ListView):
         data['top_daily_tracks'] = top_tracks()
         data['top_weekly_tracks'] = top_tracks(filter='week')
         data['top_monthly_tracks'] = top_tracks(filter='month')
+
+        data['top_daily_artists'] = top_artists()
+        data['top_weekly_artists'] = top_artists(filter='week')
+        data['top_monthly_artists'] = top_artists(filter='month')
+
         data["weekly_data"] = week_of_scrobbles()
         data['counts'] = scrobble_counts()
         return data

+ 27 - 27
vrobbler/templates/base.html

@@ -280,35 +280,35 @@
             var myChart = new Chart(ctx, {
                 type: 'line',
                 data: {
-                labels: [
-                    {% for day in weekly_data.keys %}
-                    "{{day}}"{% if not forloop.last %},{% endif %}
-                    {% endfor %}
-                ],
-                datasets: [{
-                    data: [
-                    {% for count in weekly_data.values %}
-                    {{count}}{% if not forloop.last %},{% endif %}
-                    {% endfor %}
-                    ],
-                    lineTension: 0,
-                    backgroundColor: 'transparent',
-                    borderColor: '#007bff',
-                    borderWidth: 4,
-                    pointBackgroundColor: '#007bff'
-                }]
+                  labels: [
+                      {% for day in weekly_data.keys %}
+                      "{{day}}"{% if not forloop.last %},{% endif %}
+                      {% endfor %}
+                  ],
+                  datasets: [{
+                      data: [
+                      {% for count in weekly_data.values %}
+                      {{count}}{% if not forloop.last %},{% endif %}
+                      {% endfor %}
+                      ],
+                      lineTension: 0,
+                      backgroundColor: 'transparent',
+                      borderColor: '#007bf0',
+                      borderWidth: 4,
+                      pointBackgroundColor: '#007bff'
+                  }]
                 },
                 options: {
-                scales: {
-                    yAxes: [{
-                    ticks: {
-                        beginAtZero: false
-                    }
-                    }]
-                },
-                legend: {
-                    display: false
-                }
+                  scales: {
+                      yAxes: [{
+                      ticks: {
+                          beginAtZero: false
+                      }
+                      }]
+                  },
+                  legend: {
+                      display: false
+                  }
                 }
             })
             })()

+ 101 - 72
vrobbler/templates/scrobbles/scrobble_list.html

@@ -20,80 +20,109 @@
 
     <canvas class="my-4 w-100" id="myChart" width="900" height="380"></canvas>
 
-
-    <h2>Top this week</h2>
-    <div class="table-responsive">
-        <table class="table table-striped table-sm">
-        <thead>
-            <tr>
-                <th scope="col">#</th>
-                <th scope="col">Track</th>
-                <th scope="col">Artist</th>
-                <th scope="col">Album</th>
-            </tr>
-        </thead>
-        <tbody>
-            {% for track in top_weekly_tracks %}
-            <tr>
-                <td>{{track.num_scrobbles}}</td>
-                <td>{{track.title}}</td>
-                <td>{{track.artist.name}}</td>
-                <td>{{track.album.name}}</td>
-            </tr>
-            {% endfor %}
-        </tbody>
-        </table>
-    </div>
-
-    <h2>Latest scrobbles</h2>
-    <p>Today <b>{{counts.today}}</b> | This Week <b>{{counts.week}}</b> | This Month <b>{{counts.month}}</b> | This Year <b>{{counts.year}}</b> | All Time <b>{{counts.alltime}}</b></p>
-    <div class="table-responsive">
-        <table class="table table-striped table-sm">
-        <thead>
-            <tr>
-            <th scope="col">Time</th>
-            <th scope="col">Track</th>
-            <th scope="col">Artist</th>
-            <th scope="col">Source</th>
-            </tr>
-        </thead>
-        <tbody>
-            {% for scrobble in object_list %}
-            <tr>
-                <td>{{scrobble.timestamp|naturaltime}}</td>
-                <td>{{scrobble.track.title}}</td>
-                <td>{{scrobble.track.artist.name}}</td>
-                <td>{{scrobble.source}}</td>
-            </tr>
-            {% endfor %}
-        </tbody>
-        </table>
+    <div class="container">
+        <div class="row">
+            <div class="col-md">
+                <h2>Top artists this week</h2>
+                <div class="table-responsive">
+                    <table class="table table-striped table-sm">
+                    <thead>
+                        <tr>
+                            <th scope="col">#</th>
+                            <th scope="col">Artist</th>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        {% for artist in top_weekly_artists %}
+                        <tr>
+                            <td>{{artist.num_scrobbles}}</td>
+                            <td>{{artist.name}}</td>
+                        </tr>
+                        {% endfor %}
+                    </tbody>
+                    </table>
+                </div>
+            </div>
+            <div class="col-lg">
+                <h2>Top tracks this week</h2>
+                <div class="table-responsive">
+                    <table class="table table-striped table-sm">
+                    <thead>
+                        <tr>
+                            <th scope="col">#</th>
+                            <th scope="col">Track</th>
+                            <th scope="col">Artist</th>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        {% for track in top_weekly_tracks %}
+                        <tr>
+                            <td>{{track.num_scrobbles}}</td>
+                            <td>{{track.title}}</td>
+                            <td>{{track.artist.name}}</td>
+                        </tr>
+                        {% endfor %}
+                    </tbody>
+                    </table>
+                </div>
+            </div>
+        </div>
     </div>
+    <div class="container">
+        <div class="row">
+            <div class="col-lg">
+                <h2>Latest listened</h2>
+                <p>Today <b>{{counts.today}}</b> | This Week <b>{{counts.week}}</b> | This Month <b>{{counts.month}}</b> | This Year <b>{{counts.year}}</b> | All Time <b>{{counts.alltime}}</b></p>
+                <div class="table-responsive">
+                    <table class="table table-striped table-sm">
+                    <thead>
+                        <tr>
+                        <th scope="col">Time</th>
+                        <th scope="col">Track</th>
+                        <th scope="col">Artist</th>
+                        <th scope="col">Source</th>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        {% for scrobble in object_list %}
+                        <tr>
+                            <td>{{scrobble.timestamp|naturaltime}}</td>
+                            <td>{{scrobble.track.title}}</td>
+                            <td>{{scrobble.track.artist.name}}</td>
+                            <td>{{scrobble.source}}</td>
+                        </tr>
+                        {% endfor %}
+                    </tbody>
+                    </table>
+                </div>
+            </div>
 
-    <h2>Latest watched</h2>
-    <div class="table-responsive">
-        <table class="table table-striped table-sm">
-        <thead>
-            <tr>
-            <th scope="col">Time</th>
-            <th scope="col">Title</th>
-            <th scope="col">Series</th>
-            <th scope="col">Season & Episode</th>
-            <th scope="col">Source</th>
-            </tr>
-        </thead>
-        <tbody>
-            {% for scrobble in video_scrobble_list %}
-            <tr>
-                <td>{{scrobble.timestamp|naturaltime}}</td>
-                <td>{{scrobble.video.title}}</td>
-                <td>{% if scrobble.video.tv_series %}{{scrobble.video.tv_series}}{% endif %}</td>
-                <td>{% if scrobble.video.tv_series %}{{scrobble.video.season_number}}, {{scrobble.video.episode_number}}{% endif %}</td>
-                <td>{{scrobble.source}}</td>
-            </tr>
-            {% endfor %}
-        </tbody>
-        </table>
+            <div class="col-lg">
+                <h2>Latest watched</h2>
+                <div class="table-responsive">
+                    <table class="table table-striped table-sm">
+                    <thead>
+                        <tr>
+                        <th scope="col">Time</th>
+                        <th scope="col">Title</th>
+                        <th scope="col">Series</th>
+                        <th scope="col">Source</th>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        {% for scrobble in video_scrobble_list %}
+                        <tr>
+                            <td>{{scrobble.timestamp|naturaltime}}</td>
+                            <td>{% if scrobble.video.tv_series %}E{{scrobble.video.season_number}}S{{scrobble.video.season_number}} -{% endif %} {{scrobble.video.title}}</td>
+                            <td>{% if scrobble.video.tv_series %}{{scrobble.video.tv_series}}{% endif %}</td>
+                            <td>{{scrobble.source}}</td>
+                        </tr>
+                        {% endfor %}
+                    </tbody>
+                    </table>
+                </div>
+            </div>
+        </div>
     </div>
 </main>
 {% endblock %}