Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1821ac0d7b | |||
| 4eb8289e55 | |||
| 66e805542c |
38
PROJECT.org
38
PROJECT.org
@ -79,20 +79,7 @@ fetching and simple saving.
|
|||||||
:LOGBOOK:
|
:LOGBOOK:
|
||||||
CLOCK: [2025-07-09 Wed 09:55]--[2025-07-09 Wed 10:15] => 0:20
|
CLOCK: [2025-07-09 Wed 09:55]--[2025-07-09 Wed 10:15] => 0:20
|
||||||
:END:
|
:END:
|
||||||
* Backlog [4/27]
|
* Backlog [7/28]
|
||||||
** STRT Only create a LastFM import if there are files to import :vrobbler:feature:lastfm:importers:project:personal:
|
|
||||||
:PROPERTIES:
|
|
||||||
:ID: 7a1456af-c5f1-6385-b34f-0be24a6b65b0
|
|
||||||
:END:
|
|
||||||
- Note taken on [2025-07-20 Sun 16:21]
|
|
||||||
|
|
||||||
This thing is kicking my butt. As it stands it works, but the scrobbles are not assigned to the tracks properly.
|
|
||||||
** TODO Add timezone awarness to IMAP importer :personal:project:vrobbler:feature:importer:imap:timezones:
|
|
||||||
** DONE Track timezone changes for profiles :vrobbler:feature:profiles:personal:project:
|
|
||||||
:PROPERTIES:
|
|
||||||
:ID: 89ec867f-29fd-82f1-be17-b49dddc30c78
|
|
||||||
:END:
|
|
||||||
[2025-07-11 14:23]
|
|
||||||
** TODO [#A] Add classmethod for metadata fetching to tracks :vrobbler:feature:music:personal:project:
|
** TODO [#A] Add classmethod for metadata fetching to tracks :vrobbler:feature:music:personal:project:
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:ID: bc4b45e5-4c65-13c5-ab7b-1937d3fbf5c2
|
:ID: bc4b45e5-4c65-13c5-ab7b-1937d3fbf5c2
|
||||||
@ -456,6 +443,29 @@ it's annoying.
|
|||||||
** TODO [#C] Allow users to see tasks on calendar view :vrobbler:personal:project:templates:feature:
|
** TODO [#C] Allow users to see tasks on calendar view :vrobbler:personal:project:templates:feature:
|
||||||
https://codepen.io/oliviale/pen/QYqybo
|
https://codepen.io/oliviale/pen/QYqybo
|
||||||
** TODO [#C] Come up with a possible flow using WebDAV and super-productivity for tasks :personal:feature:project:vrobbler:tasks:
|
** TODO [#C] Come up with a possible flow using WebDAV and super-productivity for tasks :personal:feature:project:vrobbler:tasks:
|
||||||
|
* Version 18.4
|
||||||
|
** DONE Track timezone changes for profiles :vrobbler:feature:profiles:personal:project:
|
||||||
|
:PROPERTIES:
|
||||||
|
:ID: 89ec867f-29fd-82f1-be17-b49dddc30c78
|
||||||
|
:END:
|
||||||
|
[2025-07-11 14:23]
|
||||||
|
** DONE Only create a LastFM import if there are files to import :vrobbler:feature:lastfm:importers:project:personal:
|
||||||
|
:PROPERTIES:
|
||||||
|
:ID: 7a1456af-c5f1-6385-b34f-0be24a6b65b0
|
||||||
|
:END:
|
||||||
|
- Note taken on [2025-07-20 Sun 16:21]
|
||||||
|
|
||||||
|
This thing is kicking my butt. As it stands it works, but the scrobbles are not assigned to the tracks properly.
|
||||||
|
* Version 18.3
|
||||||
|
** DONE Add timezone awarness to IMAP importer :personal:project:vrobbler:feature:importer:imap:timezones:
|
||||||
|
:PROPERTIES:
|
||||||
|
:ID: 05837b7c-96aa-6190-3678-e2ae7c7cac75
|
||||||
|
:END:
|
||||||
|
* Version 18
|
||||||
|
** DONE Condense tracks of the same title by the same artist with multiple albums :vrobbler:feature:music:project:personal:
|
||||||
|
:PROPERTIES:
|
||||||
|
:ID: b39fcec8-59fd-eab0-5809-b8144c7d2708
|
||||||
|
:END:
|
||||||
** DONE Import from BG stats a "learning" log field when "Learning to play" is in the comment :vrobbler:feature:boardgames:project:personal:
|
** DONE Import from BG stats a "learning" log field when "Learning to play" is in the comment :vrobbler:feature:boardgames:project:personal:
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:ID: fda59fab-4349-e99e-54c6-9f1392a1c474
|
:ID: fda59fab-4349-e99e-54c6-9f1392a1c474
|
||||||
|
|||||||
@ -93,7 +93,7 @@ class LastFM:
|
|||||||
)
|
)
|
||||||
return created
|
return created
|
||||||
|
|
||||||
def get_last_scrobbles(self, time_from=None, time_to=None):
|
def get_last_scrobbles(self, time_from=None, time_to=None, check=False):
|
||||||
"""Given a user, Last.fm api key, and secret key, grab a list of scrobbled
|
"""Given a user, Last.fm api key, and secret key, grab a list of scrobbled
|
||||||
tracks"""
|
tracks"""
|
||||||
lfm_params = {}
|
lfm_params = {}
|
||||||
@ -109,6 +109,9 @@ class LastFM:
|
|||||||
found_scrobbles = self.user.get_recent_tracks(**lfm_params)
|
found_scrobbles = self.user.get_recent_tracks(**lfm_params)
|
||||||
# TOOD spin this out into a celery task over certain threshold of found scrobbles?
|
# TOOD spin this out into a celery task over certain threshold of found scrobbles?
|
||||||
|
|
||||||
|
if check and found_scrobbles:
|
||||||
|
return True
|
||||||
|
|
||||||
for scrobble in found_scrobbles:
|
for scrobble in found_scrobbles:
|
||||||
logger.info(f"Processing {scrobble}")
|
logger.info(f"Processing {scrobble}")
|
||||||
run_time = None
|
run_time = None
|
||||||
|
|||||||
@ -2,7 +2,6 @@ import logging
|
|||||||
import re
|
import re
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from typing import Any, Optional
|
from typing import Any, Optional
|
||||||
from zoneinfo import ZoneInfo
|
|
||||||
|
|
||||||
import pendulum
|
import pendulum
|
||||||
import pytz
|
import pytz
|
||||||
@ -27,6 +26,7 @@ from scrobbles.constants import (
|
|||||||
SCROBBLE_CONTENT_URLS,
|
SCROBBLE_CONTENT_URLS,
|
||||||
)
|
)
|
||||||
from scrobbles.models import Scrobble
|
from scrobbles.models import Scrobble
|
||||||
|
from scrobbles.notifications import NtfyNotification
|
||||||
from scrobbles.utils import convert_to_seconds, extract_domain
|
from scrobbles.utils import convert_to_seconds, extract_domain
|
||||||
from sports.models import SportEvent
|
from sports.models import SportEvent
|
||||||
from sports.thesportsdb import lookup_event_from_thesportsdb
|
from sports.thesportsdb import lookup_event_from_thesportsdb
|
||||||
@ -505,6 +505,7 @@ def email_scrobble_board_game(
|
|||||||
scrobble.played_to_completion = True
|
scrobble.played_to_completion = True
|
||||||
scrobble.save()
|
scrobble.save()
|
||||||
scrobbles_created.append(scrobble)
|
scrobbles_created.append(scrobble)
|
||||||
|
NtfyNotification(scrobble).send()
|
||||||
|
|
||||||
return scrobbles_created
|
return scrobbles_created
|
||||||
|
|
||||||
|
|||||||
@ -114,6 +114,8 @@ def get_long_plays_completed(user: User) -> list:
|
|||||||
|
|
||||||
def import_lastfm_for_all_users(restart=False):
|
def import_lastfm_for_all_users(restart=False):
|
||||||
"""Grab a list of all users with LastFM enabled and kickoff imports for them"""
|
"""Grab a list of all users with LastFM enabled and kickoff imports for them"""
|
||||||
|
from scrobbles.importers.lastfm import LastFM
|
||||||
|
|
||||||
LastFmImport = apps.get_model("scrobbles", "LastFMImport")
|
LastFmImport = apps.get_model("scrobbles", "LastFMImport")
|
||||||
lastfm_enabled_user_ids = UserProfile.objects.filter(
|
lastfm_enabled_user_ids = UserProfile.objects.filter(
|
||||||
lastfm_username__isnull=False,
|
lastfm_username__isnull=False,
|
||||||
@ -124,6 +126,31 @@ def import_lastfm_for_all_users(restart=False):
|
|||||||
lastfm_import_count = 0
|
lastfm_import_count = 0
|
||||||
|
|
||||||
for user_id in lastfm_enabled_user_ids:
|
for user_id in lastfm_enabled_user_ids:
|
||||||
|
|
||||||
|
lfm_import = LastFmImport.objects.filter(
|
||||||
|
user_id=user_id, processed_finished__isnull=False
|
||||||
|
).last()
|
||||||
|
if lfm_import:
|
||||||
|
last_processed = lfm_import.processed_finished
|
||||||
|
else:
|
||||||
|
logger.info(
|
||||||
|
f"Not resuming failed LastFM import {lfm_import.id} for user {user_id}, use restart=True to restart"
|
||||||
|
"No existing LastFM import, we should start a monthly parsing of lastFm for this user going back to 2002"
|
||||||
|
)
|
||||||
|
continue
|
||||||
|
|
||||||
|
lfm_client = LastFM(
|
||||||
|
user=get_user_model().objects.filter(id=user_id).first()
|
||||||
|
)
|
||||||
|
|
||||||
|
has_scrobbles = lfm_client.get_last_scrobbles(
|
||||||
|
time_from=last_processed, check=True
|
||||||
|
)
|
||||||
|
|
||||||
|
if not has_scrobbles:
|
||||||
|
logger.info("No new scrobbles to import from LastFM")
|
||||||
|
continue
|
||||||
|
|
||||||
lfm_import, created = LastFmImport.objects.get_or_create(
|
lfm_import, created = LastFmImport.objects.get_or_create(
|
||||||
user_id=user_id, processed_finished__isnull=True
|
user_id=user_id, processed_finished__isnull=True
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user