2023-11-29 20:12:23 +00:00
|
|
|
import datetime
|
|
|
|
import pylistenbrainz
|
|
|
|
|
|
|
|
from django.utils import timezone
|
2023-11-30 18:38:25 +00:00
|
|
|
from config import plugins
|
2023-11-29 20:12:23 +00:00
|
|
|
from funkwhale_api.history import models as history_models
|
|
|
|
from funkwhale_api.music import models as music_models
|
2023-11-30 18:38:25 +00:00
|
|
|
from funkwhale_api.taskapp import celery
|
|
|
|
from funkwhale_api.users import models
|
2023-11-29 20:12:23 +00:00
|
|
|
|
2023-12-13 15:31:26 +00:00
|
|
|
from .funkwhale_startup import PLUGIN
|
|
|
|
|
2023-11-29 20:12:23 +00:00
|
|
|
|
|
|
|
@celery.app.task(name="listenbrainz.trigger_listening_sync_with_listenbrainz")
|
|
|
|
def trigger_listening_sync_with_listenbrainz():
|
|
|
|
now = timezone.now()
|
|
|
|
active_month = now - datetime.timedelta(days=30)
|
|
|
|
users = (
|
|
|
|
models.User.objects.filter(plugins__code="listenbrainz")
|
|
|
|
.filter(plugins__conf__sync_listenings=True)
|
|
|
|
.filter(last_activity__gte=active_month)
|
|
|
|
)
|
|
|
|
for user in users:
|
|
|
|
plugins.trigger_hook(
|
|
|
|
plugins.LISTENING_SYNC,
|
|
|
|
user=user,
|
|
|
|
confs=plugins.get_confs(user),
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@celery.app.task(name="listenbrainz.trigger_favorite_sync_with_listenbrainz")
|
|
|
|
def trigger_favorite_sync_with_listenbrainz():
|
|
|
|
now = timezone.now()
|
|
|
|
active_month = now - datetime.timedelta(days=30)
|
|
|
|
users = (
|
|
|
|
models.User.objects.filter(plugins__code="listenbrainz")
|
|
|
|
.filter(plugins__conf__sync_listenings=True)
|
|
|
|
.filter(last_activity__gte=active_month)
|
|
|
|
)
|
|
|
|
for user in users:
|
|
|
|
plugins.trigger_hook(
|
|
|
|
plugins.FAVORITE_SYNC,
|
|
|
|
user=user,
|
|
|
|
confs=plugins.get_confs(user),
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@celery.app.task(name="listenbrainz.import_listenbrainz_listenings")
|
|
|
|
def import_listenbrainz_listenings(user, user_name, ts):
|
|
|
|
client = pylistenbrainz.ListenBrainz()
|
|
|
|
listens = client.get_listens(username=user_name, min_ts=ts, count=100)
|
|
|
|
add_lb_listenings_to_db(listens, user)
|
|
|
|
new_ts = 13
|
|
|
|
last_ts = 12
|
|
|
|
while new_ts != last_ts:
|
|
|
|
last_ts = listens[0].listened_at
|
|
|
|
listens = client.get_listens(username=user_name, min_ts=new_ts, count=100)
|
|
|
|
new_ts = listens[0].listened_at
|
|
|
|
add_lb_listenings_to_db(listens, user)
|
|
|
|
|
|
|
|
|
|
|
|
def add_lb_listenings_to_db(listens, user):
|
|
|
|
fw_listens = []
|
|
|
|
for listen in listens:
|
|
|
|
if (
|
|
|
|
listen.additional_info.get("submission_client")
|
|
|
|
and listen.additional_info.get("submission_client")
|
|
|
|
== "Funkwhale ListenBrainz plugin"
|
2023-12-13 15:31:26 +00:00
|
|
|
and history_models.Listening.objects.filter(
|
|
|
|
creation_date=listen.listened_at
|
|
|
|
).exists()
|
2023-11-29 20:12:23 +00:00
|
|
|
):
|
|
|
|
continue
|
2023-12-13 15:31:26 +00:00
|
|
|
|
|
|
|
mbid = (
|
|
|
|
listen.mbid_mapping
|
|
|
|
if hasattr(listen, "mbid_mapping")
|
|
|
|
else listen.recording_mbid
|
|
|
|
)
|
|
|
|
|
|
|
|
if not mbid:
|
|
|
|
logger = PLUGIN["logger"]
|
|
|
|
logger.info("Received listening doesn't have a mbid. Skipping...")
|
|
|
|
|
2023-11-29 20:12:23 +00:00
|
|
|
try:
|
2023-12-13 15:31:26 +00:00
|
|
|
track = music_models.Track.objects.get(mbid=mbid)
|
2023-11-29 20:12:23 +00:00
|
|
|
except music_models.Track.DoesNotExist:
|
2023-12-13 15:31:26 +00:00
|
|
|
logger.info("Received listening doesn't exist in fw database. Skipping...")
|
2023-11-29 20:12:23 +00:00
|
|
|
continue
|
|
|
|
|
|
|
|
user = user
|
|
|
|
fw_listen = history_models.Listening(
|
2023-12-13 15:31:26 +00:00
|
|
|
creation_date=timezone.make_aware(listen.listened_at),
|
2023-11-29 20:12:23 +00:00
|
|
|
track=track,
|
|
|
|
user=user,
|
2023-12-13 15:31:26 +00:00
|
|
|
source="Listenbrainz",
|
2023-11-29 20:12:23 +00:00
|
|
|
)
|
|
|
|
fw_listens.append(fw_listen)
|
|
|
|
|
|
|
|
history_models.Listening.objects.bulk_create(fw_listens)
|
|
|
|
|
|
|
|
|
|
|
|
@celery.app.task(name="listenbrainz.import_listenbrainz_favorites")
|
|
|
|
def import_listenbrainz_favorites():
|
|
|
|
return "to do"
|