From caad6329c943be999aa561152b42014b392b0417 Mon Sep 17 00:00:00 2001 From: Colin Powell Date: Mon, 19 Aug 2024 18:59:37 -0400 Subject: [PATCH] [scrobbles] Fixing tests and breaking more --- tests/scrobbles_tests/test_views.py | 103 +++++++++++++--------------- vrobbler/apps/music/models.py | 2 +- vrobbler/apps/music/utils.py | 9 ++- 3 files changed, 55 insertions(+), 59 deletions(-) diff --git a/tests/scrobbles_tests/test_views.py b/tests/scrobbles_tests/test_views.py index 7a9a763..630d283 100644 --- a/tests/scrobbles_tests/test_views.py +++ b/tests/scrobbles_tests/test_views.py @@ -30,17 +30,36 @@ def test_bad_mopidy_request_data(client, valid_auth_token): ) +@pytest.mark.parametrize( + "seconds, expected_percent_played, expected_scrobble_id", + [ + (1, 1, 1), + (58, 96, 1), + (59, 98, 1), + (60, 100, 1), + (1, 1, 2), + (1, 1, 3), + ], +) @pytest.mark.django_db def test_scrobble_mopidy_track( - client, mopidy_track, valid_auth_token + client, + mopidy_track, + valid_auth_token, + seconds, + expected_percent_played, + expected_scrobble_id, ): url = reverse("scrobbles:mopidy-webhook") headers = {"Authorization": f"Token {valid_auth_token}"} # Start new scrobble - seconds = 1 - scrobble_id = 1 - with time_machine.travel(datetime(2024, 1, 14, 12, 0, seconds)): + minutes = 0 + calc_seconds = seconds + if seconds >= 60: + minutes = 1 + calc_seconds = calc_seconds % 10 + with time_machine.travel(datetime(2024, 1, 14, 12, minutes, calc_seconds)): mopidy_track.request_data["playback_time_ticks"] = seconds * 1000 response = client.post( url, @@ -49,45 +68,10 @@ def test_scrobble_mopidy_track( headers=headers, ) assert response.status_code == 200 - assert response.data == {"scrobble_id": scrobble_id} - - scrobble = Scrobble.objects.get(id=1) - assert scrobble.media_obj.__class__ == Track - assert scrobble.media_obj.title == "Same in the End" - - # Continue existingscrobble - seconds = 58 - scrobble_id = 1 - with time_machine.travel(datetime(2024, 1, 14, 12, 0, seconds)): - mopidy_track.request_data["playback_time_ticks"] = seconds * 1000 - response = client.post( - url, - mopidy_track.request_json, - content_type="application/json", - headers=headers, - ) - assert response.status_code == 200 - assert response.data == {"scrobble_id": scrobble_id} - - scrobble = Scrobble.objects.get(id=1) - assert scrobble.media_obj.__class__ == Track - assert scrobble.media_obj.title == "Same in the End" - - # Continue new scrobble - seconds = 61 - scrobble_id = 2 - with time_machine.travel(datetime(2024, 1, 14, 12, 1, seconds)): - mopidy_track.request_data["playback_time_ticks"] = seconds * 1000 - response = client.post( - url, - mopidy_track.request_json, - content_type="application/json", - headers=headers, - ) - assert response.status_code == 200 - assert response.data == {"scrobble_id": scrobble_id} + assert response.data == {"scrobble_id": expected_scrobble_id} scrobble = Scrobble.objects.get(id=1) + assert scrobble.percent_played == expected_percent_played assert scrobble.media_obj.__class__ == Track assert scrobble.media_obj.title == "Same in the End" @@ -149,29 +133,34 @@ def test_scrobble_mopidy_podcast( @pytest.mark.django_db @patch("music.utils.lookup_artist_from_mb", return_value={}) -@patch("music.utils.lookup_album_dict_from_mb", return_value={"year": "1999", "mb_group_id": 1}) +@patch( + "music.utils.lookup_album_dict_from_mb", + return_value={"year": "1999", "mb_group_id": 1}, +) @patch("music.utils.lookup_track_from_mb", return_value={}) @patch("music.models.lookup_artist_from_tadb", return_value={}) @patch("music.models.lookup_album_from_tadb", return_value={"year": "1999"}) @patch("music.models.Album.fetch_artwork", return_value=None) @patch("music.models.Album.scrape_allmusic", return_value=None) def test_scrobble_jellyfin_track( - mock_lookup_artist, - mock_lookup_album, - mock_lookup_track, - mock_lookup_artist_tadb, - mock_lookup_album_tadb, - mock_fetch_artwork, - mock_scrape_allmusic, - client, - jellyfin_track, - valid_auth_token, + mock_lookup_artist, + mock_lookup_album, + mock_lookup_track, + mock_lookup_artist_tadb, + mock_lookup_album_tadb, + mock_fetch_artwork, + mock_scrape_allmusic, + client, + jellyfin_track, + valid_auth_token, ): url = reverse("scrobbles:jellyfin-webhook") headers = {"Authorization": f"Token {valid_auth_token}"} with time_machine.travel(datetime(2024, 1, 14, 12, 00, 1)): - jellyfin_track.request_data["UtcTimestamp"] = timezone.now().strftime("%Y-%m-%d %H:%M:%S") + jellyfin_track.request_data["UtcTimestamp"] = timezone.now().strftime( + "%Y-%m-%d %H:%M:%S" + ) response = client.post( url, jellyfin_track.request_json, @@ -186,7 +175,9 @@ def test_scrobble_jellyfin_track( assert scrobble.media_obj.title == "Emotion" with time_machine.travel(datetime(2024, 1, 14, 12, 0, 58)): - jellyfin_track.request_data["UtcTimestamp"] = timezone.now().strftime("%Y-%m-%d %H:%M:%S") + jellyfin_track.request_data["UtcTimestamp"] = timezone.now().strftime( + "%Y-%m-%d %H:%M:%S" + ) response = client.post( url, jellyfin_track.request_json, @@ -202,7 +193,9 @@ def test_scrobble_jellyfin_track( assert scrobble.media_obj.title == "Emotion" with time_machine.travel(datetime(2024, 1, 14, 12, 1, 1)): - jellyfin_track.request_data["UtcTimestamp"] = timezone.now().strftime("%Y-%m-%d %H:%M:%S") + jellyfin_track.request_data["UtcTimestamp"] = timezone.now().strftime( + "%Y-%m-%d %H:%M:%S" + ) response = client.post( url, jellyfin_track.request_json, diff --git a/vrobbler/apps/music/models.py b/vrobbler/apps/music/models.py index 98f5e79..af49512 100644 --- a/vrobbler/apps/music/models.py +++ b/vrobbler/apps/music/models.py @@ -404,7 +404,7 @@ class Album(TimeStampedModel): class Track(ScrobblableMixin): - COMPLETION_PERCENT = getattr(settings, "MUSIC_COMPLETION_PERCENT", 99) + COMPLETION_PERCENT = getattr(settings, "MUSIC_COMPLETION_PERCENT", 100) class Opinion(models.IntegerChoices): DOWN = -1, "Thumbs down" diff --git a/vrobbler/apps/music/utils.py b/vrobbler/apps/music/utils.py index 0211c3c..3b17663 100644 --- a/vrobbler/apps/music/utils.py +++ b/vrobbler/apps/music/utils.py @@ -91,13 +91,16 @@ def get_or_create_album( def get_or_create_track(post_data: dict, post_keys: dict) -> Track: + track_run_time_seconds = post_data.get(post_keys.get("RUN_TIME"), 0) + if post_keys.get("RUN_TIME") == "RunTime": + track_run_time_seconds = convert_to_seconds( + post_data.get(post_keys.get("RUN_TIME"), 0) + ) + artist_name = post_data.get(post_keys.get("ARTIST_NAME"), "") artist_mb_id = post_data.get(post_keys.get("ARTIST_MB_ID"), "") album_title = post_data.get(post_keys.get("ALBUM_NAME"), "") album_mb_id = post_data.get(post_keys.get("ALBUM_MB_ID"), "") - track_run_time_seconds = convert_to_seconds( - post_data.get(post_keys.get("RUN_TIME"), 0) - ) track_title = post_data.get(post_keys.get("TRACK_TITLE"), "") track_mb_id = post_data.get(post_keys.get("TRACK_MB_ID"), "")