Skip to content
Snippets Groups Projects
nodeinfo.py 2.32 KiB
Newer Older
import memoize.djangocache

import funkwhale_api
from funkwhale_api.common import preferences

from . import stats


store = memoize.djangocache.Cache('default')
memo = memoize.Memoizer(store, namespace='instance:stats')


def get():
    share_stats = preferences.get('instance__nodeinfo_stats_enabled')
    private = preferences.get('instance__nodeinfo_private')
    data = {
        'version': '2.0',
        'software': {
            'name': 'funkwhale',
            'version': funkwhale_api.__version__
        },
        'protocols': ['activitypub'],
        'services': {
            'inbound': [],
            'outbound': []
        },
        'openRegistrations': preferences.get('users__registration_enabled'),
        'usage': {
            'users': {
                'total': 0,
            'private': preferences.get('instance__nodeinfo_private'),
            'shortDescription': preferences.get('instance__short_description'),
            'longDescription': preferences.get('instance__long_description'),
            'nodeName': preferences.get('instance__name'),
            'library': {
                'federationEnabled': preferences.get('federation__enabled'),
                'federationNeedsApproval': preferences.get('federation__music_needs_approval'),
                'anonymousCanListen': preferences.get('common__api_authentication_required'),
            },
        }
    }
    if share_stats:
        getter = memo(
            lambda: stats.get(),
            max_age=600
        )
        statistics = getter()
        data['usage']['users']['total'] = statistics['users']
        data['metadata']['library']['tracks'] = {
            'total': statistics['tracks'],
        }
        data['metadata']['library']['artists'] = {
            'total': statistics['artists'],
        }
        data['metadata']['library']['albums'] = {
            'total': statistics['albums'],
        }
        data['metadata']['library']['music'] = {
            'hours': statistics['music_duration']
        }

        data['metadata']['usage'] = {
            'favorites': {
                'tracks': {
                    'total': statistics['track_favorites'],
                }
            },
            'listenings': {
                'total': statistics['listenings']
            }
        }
    return data