j/k nutzte ein starres 8px/16ms-setInterval (~500px/s, unsauber getaktet gegenüber dem Frame-Takt) — ersetzt durch eine requestAnimationFrame-Schleife mit sanftem Ramp-up (700 -> 1800px/s über 300ms), das behebt sowohl die zu niedrige Geschwindigkeit als auch das Ruckeln kurz nach Scrollbeginn. Der Service Worker war unter /static/js/sw.js registriert, wodurch sein Scope (mangels Service-Worker-Allowed-Header) automatisch auf /static/js/ beschränkt war statt die ganze App abzudecken — Navigationen zu z.B. / liefen nie durch den fetch-Handler, weshalb offline nur die Browser-eigene Fehlerseite statt der App-Shell erschien. Jetzt wird sw.js zusätzlich unter der Root /sw.js ausgeliefert (diora/urls.py) und dort mit explizitem scope:'/' registriert; alte Registrierungen mit dem falschen Scope werden beim Laden automatisch entfernt. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
20 lines
1 KiB
Python
20 lines
1 KiB
Python
from django.conf import settings
|
|
from django.conf.urls.static import static
|
|
from django.contrib import admin
|
|
from django.urls import path, include
|
|
from django.views.static import serve as serve_static
|
|
|
|
urlpatterns = [
|
|
path('admin/', admin.site.urls),
|
|
path('accounts/', include('accounts.urls')),
|
|
path('podcasts/', include('podcasts.urls')),
|
|
path('books/', include('books.urls')),
|
|
path('api/2/', include('gpodder.urls')),
|
|
# Served at the root (not /static/js/sw.js) so its default scope covers
|
|
# the whole app — a service worker's scope is limited to its own script's
|
|
# directory unless the server sends Service-Worker-Allowed, so registering
|
|
# it from under /static/js/ silently restricted it to that subpath and
|
|
# navigations to '/', '/books/' etc. were never intercepted while offline.
|
|
path('sw.js', serve_static, {'document_root': settings.BASE_DIR / 'static' / 'js', 'path': 'sw.js'}),
|
|
path('', include('radio.urls')),
|
|
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|