Backend: GET /api/random/ (aliases /random and /random/) returns a random library image with: - rating=s,q,e filtering (comma separated, default any); - fastfetch mode (?fastfetch=1 or any User-Agent containing "fastfetch") that only considers png/jpg/gif - what terminal viewers can show; - JSON with j_id, filename, extension, rating, size, e621 id plus absolute url/download_url/thumbnail_url. Authenticated callers get signed URLs so fastfetch and image viewers can load them without headers; guests get unsigned URLs and never receive hidden_from_guests items. Tests: apps/library/tests/test_random.py (8 tests) covering the response contract, guest signatures, image-only default, the fastfetch format restriction (flag and User-Agent), rating filters, guest visibility and the short alias. Frontend: /random page with rating pills, R to roll, Open/Download and a library link, plus navigation and command palette entries; needs a backend, hidden in local mode. nginx: /random negotiates on Accept so browsers keep getting the SPA while scripts get the JSON (verified with the proxy and frontend containers). Also fixes a regression from the SSRF change: the guest download proxy still referenced the removed 'parsed' variable on its success path, so every proxied download would have 500'd. Redirect hops are now covered by tests with a mocked requests.get.
27 lines
1.0 KiB
Python
27 lines
1.0 KiB
Python
from django.conf import settings
|
|
from django.conf.urls.static import static
|
|
from django.contrib import admin
|
|
from django.urls import include, path
|
|
|
|
from apps.core.views import HealthView
|
|
from apps.library.views import RandomItemView
|
|
|
|
urlpatterns = [
|
|
path("admin/", admin.site.urls),
|
|
path("api/auth/", include("apps.accounts.urls")),
|
|
path("api/", include("apps.accounts.api_urls")),
|
|
path("api/", include("apps.core.urls")),
|
|
path("api/", include("apps.library.urls")),
|
|
path("api/", include("apps.follows.urls")),
|
|
# Liveness probe for uptime monitors (no /api prefix, no auth).
|
|
path("health", HealthView.as_view(), name="health"),
|
|
path("health/", HealthView.as_view()),
|
|
# Short alias for shell greeting scripts (fish_greeting + fastfetch);
|
|
# /api/random/ is the canonical path.
|
|
path("random", RandomItemView.as_view(), name="random"),
|
|
path("random/", RandomItemView.as_view()),
|
|
]
|
|
|
|
if settings.DEBUG:
|
|
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|