- Ordner wie Tags (docs/library.md): folders.js zeichnet die Chip-Reihe, das Blatt „In Ordner …“ (Häkchen, Neuer Ordner) und „Ordner verwalten“ (umbenennen = zusammenlegen, löschen, Reihenfolge). E-Books: `folders` im verschlüsselten Meta, Reihenfolge in verschlüsselten Bibliotheks-Einstellungen (/books/prefs/). Podcasts/Hörbücher: PodcastFeed.folders (Migration 0021, übernimmt `folder`), /podcasts/folders/ (+rename, +delete). Blogs: Reihenfolge (/feeds/folders/order/). - Bibliothek (53-library.js): Kopf mit Suche, Sortierung, Raster/Liste und +; Chips Angefangen · Ungelesen · Gelesen · Ordner; eine „Weiterlesen“-Karte; Mehrfachauswahl (lange drücken). E-Ink und diora Reader beginnen als Liste. - Cover Ende-zu-Ende verschlüsselt (covers.js, /books/<id>/cover/): aus dem E-Book (EPUB-Coverbild, PDF Seite 1), 300 px, mit dem Nutzerschlüssel verschlüsselt, einmal hochgeladen; sparsam im Leerlauf, nie beim Lesen, nie auf E-Ink. - Bücher ohne Cover bekommen eins (gencover.js): Stichwörter aus Titel, Autor, Regal und Ordnern wählen ein Gestaltungskonzept (Konstruktivismus, Geometrie, Psyche, Wellen, Karte, Kosmos, Ornament, Botanik, Berge, Zellen, Raster, Schatten, Typo, sonst Bauhaus); ein Hash aus Titel und Autor Palette, Aufbau und Details – einzigartig, überall gleich, nichts gespeichert. - Hörbücher: Ordner-Chips statt Kacheln, „In Ordner …“ mit mehreren Ordnern. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
22 lines
1.3 KiB
Python
22 lines
1.3 KiB
Python
from django.urls import path
|
|
from . import views, webdav
|
|
|
|
urlpatterns = [
|
|
path('', views.book_list, name='book_list'),
|
|
path('upload/', views.upload_book, name='upload_book'),
|
|
path('cloud/sources/', webdav.cloud_sources, name='cloud_sources'),
|
|
path('cloud/<int:pk>/browse/', webdav.cloud_browse, name='cloud_browse'),
|
|
path('cloud/<int:pk>/fetch/', webdav.cloud_fetch, name='cloud_fetch'),
|
|
path('metadata-lookup/', views.lookup_book_metadata, name='lookup_book_metadata'),
|
|
path('<int:pk>/data/', views.get_book_data, name='get_book_data'),
|
|
path('<int:pk>/delete/', views.delete_book, name='delete_book'),
|
|
path('<int:pk>/read/', views.set_book_read, name='set_book_read'),
|
|
path('<int:pk>/meta/', views.update_book_meta, name='update_book_meta'),
|
|
path('<int:pk>/cover/', views.book_cover, name='book_cover'),
|
|
path('prefs/', views.library_prefs, name='library_prefs'),
|
|
path('<int:pk>/replace-data/', views.replace_book_data, name='replace_book_data'),
|
|
path('<int:pk>/rekey/', views.rekey_book, name='rekey_book'),
|
|
path('<int:pk>/progress/', views.save_progress, name='save_book_progress'),
|
|
path('<int:pk>/highlights/', views.book_highlights, name='book_highlights'),
|
|
path('<int:pk>/bookmarks/', views.book_bookmarks, name='book_bookmarks'),
|
|
]
|