funkwhale/api/funkwhale_api/federation/tasks.py

88 wiersze
2.6 KiB
Python
Czysty Zwykły widok Historia

2018-04-12 17:57:43 +00:00
import json
import logging
from django.conf import settings
2018-04-12 18:38:06 +00:00
from django.utils import timezone
2018-04-12 17:57:43 +00:00
2018-04-12 16:41:43 +00:00
from requests.exceptions import RequestException
2018-04-12 17:57:43 +00:00
from funkwhale_api.common import session
2018-04-11 21:13:33 +00:00
from funkwhale_api.taskapp import celery
2018-04-12 17:57:43 +00:00
from . import actors
2018-04-11 21:13:33 +00:00
from . import library as lb
from . import models
2018-04-12 17:57:43 +00:00
from . import signing
logger = logging.getLogger(__name__)
@celery.app.task(
name='federation.send',
autoretry_for=[RequestException],
retry_backoff=30,
max_retries=5)
@celery.require_instance(models.Actor, 'actor')
def send(activity, actor, to):
logger.info('Preparing activity delivery to %s', to)
auth = signing.get_auth(
actor.private_key, actor.private_key_id)
for url in to:
recipient_actor = actors.get_actor(url)
logger.debug('delivering to %s', recipient_actor.inbox_url)
logger.debug('activity content: %s', json.dumps(activity))
response = session.get_session().post(
auth=auth,
json=activity,
url=recipient_actor.inbox_url,
timeout=5,
verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL,
headers={
'Content-Type': 'application/activity+json'
}
)
response.raise_for_status()
logger.debug('Remote answered with %s', response.status_code)
2018-04-11 21:13:33 +00:00
2018-04-12 16:41:43 +00:00
@celery.app.task(
name='federation.scan_library',
autoretry_for=[RequestException],
retry_backoff=30,
max_retries=5)
2018-04-11 21:13:33 +00:00
@celery.require_instance(models.Library, 'library')
2018-04-12 16:41:43 +00:00
def scan_library(library, until=None):
2018-04-11 21:13:33 +00:00
if not library.federation_enabled:
return
data = lb.get_library_data(library.url)
scan_library_page.delay(
2018-04-12 16:41:43 +00:00
library_id=library.id, page_url=data['first'], until=until)
2018-04-12 18:38:06 +00:00
library.fetched_date = timezone.now()
library.tracks_count = data['totalItems']
library.save(update_fields=['fetched_date', 'tracks_count'])
2018-04-11 21:13:33 +00:00
2018-04-12 16:41:43 +00:00
@celery.app.task(
name='federation.scan_library_page',
autoretry_for=[RequestException],
retry_backoff=30,
max_retries=5)
2018-04-11 21:13:33 +00:00
@celery.require_instance(models.Library, 'library')
2018-04-12 16:41:43 +00:00
def scan_library_page(library, page_url, until=None):
2018-04-11 21:13:33 +00:00
if not library.federation_enabled:
return
data = lb.get_library_page(library, page_url)
lts = []
for item_serializer in data['items']:
2018-04-12 16:41:43 +00:00
item_date = item_serializer.validated_data['published']
if until and item_date < until:
return
2018-04-11 21:13:33 +00:00
lts.append(item_serializer.save())
2018-04-12 16:41:43 +00:00
next_page = data.get('next')
if next_page and next_page != page_url:
scan_library_page.delay(library_id=library.id, page_url=next_page)