Skip to content
Snippets Groups Projects
nodeinfo.py 2.46 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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"]},