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

import funkwhale_api
from funkwhale_api.common import preferences
Eliot Berriot's avatar
Eliot Berriot committed
from funkwhale_api.federation import actors
from funkwhale_api.music import utils as music_utils
Eliot Berriot's avatar
Eliot Berriot committed
store = memoize.djangocache.Cache("default")
memo = memoize.Memoizer(store, namespace="instance:stats")
Eliot Berriot's avatar
Eliot Berriot committed
    share_stats = preferences.get("instance__nodeinfo_stats_enabled")
Eliot Berriot's avatar
Eliot Berriot committed
        "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, "activeHalfyear": 0, "activeMonth": 0}},
Eliot Berriot's avatar
Eliot Berriot committed
        "metadata": {
Eliot Berriot's avatar
Eliot Berriot committed
            "actorId": actors.get_service_actor().fid,
Eliot Berriot's avatar
Eliot Berriot committed
            "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": not preferences.get(
Eliot Berriot's avatar
Eliot Berriot committed
                    "common__api_authentication_required"
                ),
            "supportedUploadExtensions": music_utils.SUPPORTED_EXTENSIONS,
Eliot Berriot's avatar
Eliot Berriot committed
        },
Eliot Berriot's avatar
Eliot Berriot committed
        getter = memo(lambda: stats.get(), max_age=600)
        statistics = getter()
        data["usage"]["users"]["total"] = statistics["users"]["total"]
        data["usage"]["users"]["activeHalfyear"] = statistics["users"][
            "active_halfyear"
        ]
        data["usage"]["users"]["activeMonth"] = statistics["users"]["active_month"]
Eliot Berriot's avatar
Eliot Berriot committed
        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"]}
Eliot Berriot's avatar
Eliot Berriot committed
        data["metadata"]["usage"] = {
            "favorites": {"tracks": {"total": statistics["track_favorites"]}},
            "listenings": {"total": statistics["listenings"]},