From 9bcd9d8bb78e854f24253295ea91ffca1557d9ec Mon Sep 17 00:00:00 2001 From: Colin Powell Date: Mon, 6 Mar 2023 00:53:50 -0500 Subject: [PATCH] Fixing long play scrobbles --- ..._author_name_book_author_openlibrary_id.py | 23 +++++++ .../apps/books/migrations/0003_book_cover.py | 20 ++++++ vrobbler/apps/books/urls.py | 19 ++++++ vrobbler/apps/books/views.py | 17 ++++++ ...obble_videogame_minutes_played_and_more.py | 22 +++++++ ...0028_scrobble_video_game_minutes_played.py | 21 +++++++ .../apps/scrobbles/static/images/hltb.webp | Bin 0 -> 78 bytes .../scrobbles/static/images/igdb-logo.png | Bin 0 -> 16753 bytes ...ogame_summary_alter_videogame_platforms.py | 23 +++++++ .../apps/videogames/templatetags/__init__.py | 0 .../templatetags/naturalduration.py | 16 +++++ vrobbler/templates/books/book_detail.html | 57 ++++++++++++++++++ .../videogames/videogame_detail.html | 57 ++++++++++++++++++ 13 files changed, 275 insertions(+) create mode 100644 vrobbler/apps/books/migrations/0002_book_author_name_book_author_openlibrary_id.py create mode 100644 vrobbler/apps/books/migrations/0003_book_cover.py create mode 100644 vrobbler/apps/books/urls.py create mode 100644 vrobbler/apps/books/views.py create mode 100644 vrobbler/apps/scrobbles/migrations/0027_remove_scrobble_videogame_minutes_played_and_more.py create mode 100644 vrobbler/apps/scrobbles/migrations/0028_scrobble_video_game_minutes_played.py create mode 100644 vrobbler/apps/scrobbles/static/images/hltb.webp create mode 100644 vrobbler/apps/scrobbles/static/images/igdb-logo.png create mode 100644 vrobbler/apps/videogames/migrations/0006_videogame_summary_alter_videogame_platforms.py create mode 100644 vrobbler/apps/videogames/templatetags/__init__.py create mode 100644 vrobbler/apps/videogames/templatetags/naturalduration.py create mode 100644 vrobbler/templates/books/book_detail.html create mode 100644 vrobbler/templates/videogames/videogame_detail.html diff --git a/vrobbler/apps/books/migrations/0002_book_author_name_book_author_openlibrary_id.py b/vrobbler/apps/books/migrations/0002_book_author_name_book_author_openlibrary_id.py new file mode 100644 index 0000000..1529227 --- /dev/null +++ b/vrobbler/apps/books/migrations/0002_book_author_name_book_author_openlibrary_id.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.5 on 2023-03-06 05:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("books", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="book", + name="author_name", + field=models.CharField(blank=True, max_length=255, null=True), + ), + migrations.AddField( + model_name="book", + name="author_openlibrary_id", + field=models.CharField(blank=True, max_length=255, null=True), + ), + ] diff --git a/vrobbler/apps/books/migrations/0003_book_cover.py b/vrobbler/apps/books/migrations/0003_book_cover.py new file mode 100644 index 0000000..8549a9d --- /dev/null +++ b/vrobbler/apps/books/migrations/0003_book_cover.py @@ -0,0 +1,20 @@ +# Generated by Django 4.1.5 on 2023-03-06 05:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("books", "0002_book_author_name_book_author_openlibrary_id"), + ] + + operations = [ + migrations.AddField( + model_name="book", + name="cover", + field=models.ImageField( + blank=True, null=True, upload_to="books/covers/" + ), + ), + ] diff --git a/vrobbler/apps/books/urls.py b/vrobbler/apps/books/urls.py new file mode 100644 index 0000000..6638eea --- /dev/null +++ b/vrobbler/apps/books/urls.py @@ -0,0 +1,19 @@ +from django.urls import path +from books import views + +app_name = "books" + + +urlpatterns = [ + path("book/", views.BookListView.as_view(), name="book_list"), + path( + "book//", + views.BookDetailView.as_view(), + name="book_detail", + ), + path( + "author//", + views.AuthorDetailView.as_view(), + name="author_detail", + ), +] diff --git a/vrobbler/apps/books/views.py b/vrobbler/apps/books/views.py new file mode 100644 index 0000000..d4df0a8 --- /dev/null +++ b/vrobbler/apps/books/views.py @@ -0,0 +1,17 @@ +from django.views import generic +from books.models import Book, Author + + +class BookListView(generic.ListView): + model = Book + paginate_by = 20 + + +class BookDetailView(generic.DetailView): + model = Book + slug_field = "uuid" + + +class AuthorDetailView(generic.DetailView): + model = Author + slug_field = "uuid" diff --git a/vrobbler/apps/scrobbles/migrations/0027_remove_scrobble_videogame_minutes_played_and_more.py b/vrobbler/apps/scrobbles/migrations/0027_remove_scrobble_videogame_minutes_played_and_more.py new file mode 100644 index 0000000..9a90cab --- /dev/null +++ b/vrobbler/apps/scrobbles/migrations/0027_remove_scrobble_videogame_minutes_played_and_more.py @@ -0,0 +1,22 @@ +# Generated by Django 4.1.5 on 2023-03-06 02:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("scrobbles", "0026_scrobble_video_game"), + ] + + operations = [ + migrations.RemoveField( + model_name="scrobble", + name="videogame_minutes_played", + ), + migrations.AlterField( + model_name="scrobble", + name="playback_position", + field=models.CharField(blank=True, max_length=10, null=True), + ), + ] diff --git a/vrobbler/apps/scrobbles/migrations/0028_scrobble_video_game_minutes_played.py b/vrobbler/apps/scrobbles/migrations/0028_scrobble_video_game_minutes_played.py new file mode 100644 index 0000000..0529bdc --- /dev/null +++ b/vrobbler/apps/scrobbles/migrations/0028_scrobble_video_game_minutes_played.py @@ -0,0 +1,21 @@ +# Generated by Django 4.1.5 on 2023-03-06 05:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ( + "scrobbles", + "0027_remove_scrobble_videogame_minutes_played_and_more", + ), + ] + + operations = [ + migrations.AddField( + model_name="scrobble", + name="video_game_minutes_played", + field=models.IntegerField(blank=True, null=True), + ), + ] diff --git a/vrobbler/apps/scrobbles/static/images/hltb.webp b/vrobbler/apps/scrobbles/static/images/hltb.webp new file mode 100644 index 0000000000000000000000000000000000000000..5a566e82b26d7b11d77ccbe7930c085c96320bf6 GIT binary patch literal 78 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 literal 0 HcmV?d00001 diff --git a/vrobbler/apps/videogames/migrations/0006_videogame_summary_alter_videogame_platforms.py b/vrobbler/apps/videogames/migrations/0006_videogame_summary_alter_videogame_platforms.py new file mode 100644 index 0000000..0f522c9 --- /dev/null +++ b/vrobbler/apps/videogames/migrations/0006_videogame_summary_alter_videogame_platforms.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.5 on 2023-03-06 02:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("videogames", "0005_rename_platform_videogame_platforms"), + ] + + operations = [ + migrations.AddField( + model_name="videogame", + name="summary", + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name="videogame", + name="platforms", + field=models.ManyToManyField(to="videogames.videogameplatform"), + ), + ] diff --git a/vrobbler/apps/videogames/templatetags/__init__.py b/vrobbler/apps/videogames/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vrobbler/apps/videogames/templatetags/naturalduration.py b/vrobbler/apps/videogames/templatetags/naturalduration.py new file mode 100644 index 0000000..6c7a98b --- /dev/null +++ b/vrobbler/apps/videogames/templatetags/naturalduration.py @@ -0,0 +1,16 @@ +from django import template + +register = template.Library() + + +@register.filter +def natural_duration(value): + value = int(value) + hours = int(value / 60) + minutes = value - (hours * 60) + value_str = "" + if minutes: + value_str = f"{minutes} minutes" + if hours: + value_str = f"{hours} hours, " + value_str + return value_str diff --git a/vrobbler/templates/books/book_detail.html b/vrobbler/templates/books/book_detail.html new file mode 100644 index 0000000..467a8e0 --- /dev/null +++ b/vrobbler/templates/books/book_detail.html @@ -0,0 +1,57 @@ +{% extends "base_list.html" %} +{% load mathfilters %} +{% load static %} +{% load naturalduration %} + +{% block title %}{{object.title}}{% endblock %} + +{% block lists %} + +
+ + {% if object.cover%} +

+ +

+ {% endif %} +
+ {% if object.summary %} +

{{object.summary|safe|linebreaks|truncatewords:160}}

+
+ {% endif %} +

+ + +

+
+
+
+

{{object.scrobble_set.count}} scrobbles

+

Start playing

+
+
+
+

Last scrobbles

+
+ + + + + + + + + + {% for scrobble in object.scrobble_set.all|dictsortreversed:"timestamp" %} + + + + + + {% endfor %} + +
DateDurationAuthors
{{scrobble.timestamp}}{% if scrobble.in_progress %}Now playing{% else %}{{scrobble.playback_position|natural_duration}}{% endif %}{% for author in scrobble.book.authors.all %}{{author}}{% if not forloop.last %}, {% endif %}{% endfor %}
+
+
+
+{% endblock %} diff --git a/vrobbler/templates/videogames/videogame_detail.html b/vrobbler/templates/videogames/videogame_detail.html new file mode 100644 index 0000000..c43ba81 --- /dev/null +++ b/vrobbler/templates/videogames/videogame_detail.html @@ -0,0 +1,57 @@ +{% extends "base_list.html" %} +{% load mathfilters %} +{% load static %} +{% load naturalduration %} + +{% block title %}{{object.title}}{% endblock %} + +{% block lists %} + +
+ + {% if object.hltb_cover%} +

+ +

+ {% endif %} +
+ {% if object.summary %} +

{{object.summary|safe|linebreaks|truncatewords:160}}

+
+ {% endif %} +

+ + +

+
+
+
+

{{object.scrobble_set.count}} scrobbles

+

Start playing

+
+
+
+

Last scrobbles

+
+ + + + + + + + + + {% for scrobble in object.scrobble_set.all|dictsortreversed:"timestamp" %} + + + + + + {% endfor %} + +
DateDurationPlatforms
{{scrobble.timestamp}}{% if scrobble.in_progress %}Now playing{% else %}{{scrobble.playback_position|natural_duration}}{% endif %}{% for platform in scrobble.video_game.platforms.all %}{{platform}}{% if not forloop.last %}, {% endif %}{% endfor %}
+
+
+
+{% endblock %}