- podcasts/silence.py: ffmpeg (imageio-ffmpeg) findet die Pausen einer Folge einmal (silencedetect -35 dB, ab 0,4 s), im Hintergrund, höchstens 2 zugleich; gespeichert in PodcastEpisode.silences (Migration 0018); GET episodes/<id>/silences/ - podcasts-web.js: skip_silence als Einstellung (Gerät, pro Podcast vom Server), springt beim Abspielen über die Pausen (0,15 s bleiben) - Drift: Ringpuffer für die Körner als AudioWorklet statt ScriptProcessor im Hauptthread (gehäufte Aussetzer am Desktop, wenn die Seite kurz stockte) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
40 lines
2.8 KiB
Python
40 lines
2.8 KiB
Python
from django.urls import path
|
|
from . import views
|
|
|
|
urlpatterns = [
|
|
path('search/', views.podcast_search, name='podcast_search'),
|
|
path('feeds/', views.feed_list, name='podcast_feed_list'),
|
|
path('feeds/add/', views.add_feed, name='podcast_add_feed'),
|
|
path('feeds/import/', views.import_opml, name='podcast_import_opml'),
|
|
path('feeds/export.opml', views.export_opml, name='podcast_export_opml'),
|
|
path('feeds/refresh/', views.refresh_feed_now, name='podcast_refresh_feed'),
|
|
path('feeds/refresh-all/', views.refresh_all_feeds, name='podcast_refresh_all_feeds'),
|
|
path('state/', views.podcast_state, name='podcast_state'),
|
|
path('feeds/<int:pk>/remove/', views.remove_feed, name='podcast_remove_feed'),
|
|
path('feeds/<int:pk>/set-auto-queue/', views.set_auto_queue, name='podcast_set_auto_queue'),
|
|
path('feeds/<int:pk>/settings/', views.feed_settings, name='podcast_feed_settings'),
|
|
path('feeds/<int:pk>/episodes/', views.feed_episodes, name='podcast_feed_episodes'),
|
|
path('episodes/', views.episode_list, name='podcast_episode_list'),
|
|
path('episodes/favorite/', views.set_favorites, name='podcast_set_favorites'),
|
|
path('episodes/discard/', views.discard_episodes, name='podcast_discard_episodes'),
|
|
path('episodes/<int:pk>/', views.episode_detail, name='podcast_episode_detail'),
|
|
path('episodes/<int:pk>/transcript/', views.episode_transcript, name='podcast_episode_transcript'),
|
|
path('episodes/<int:pk>/silences/', views.episode_silences, name='podcast_episode_silences'),
|
|
path('episodes/<int:pk>/favorite/', views.set_favorite, name='podcast_set_favorite'),
|
|
path('stats/', views.podcast_stats, name='podcast_stats'),
|
|
path('queue/', views.queue_get, name='podcast_queue_get'),
|
|
path('queue/add/', views.queue_add, name='podcast_queue_add'),
|
|
path('queue/remove/', views.queue_remove, name='podcast_queue_remove'),
|
|
path('queue/reorder/', views.queue_reorder, name='podcast_queue_reorder'),
|
|
path('settings/', views.podcast_settings, name='podcast_settings'),
|
|
path('progress/save/', views.save_progress, name='podcast_save_progress'),
|
|
path('progress/mark-played/', views.mark_played, name='podcast_mark_played'),
|
|
path('progress/dismiss/', views.dismiss_episodes, name='podcast_dismiss_episodes'),
|
|
path('inbox/', views.inbox, name='podcast_inbox'),
|
|
path('import-downloads/', views.import_downloads, name='podcast_import_downloads'),
|
|
path('import-downloads/clear/', views.clear_import_downloads, name='podcast_clear_import_downloads'),
|
|
path('player/', views.player_state, name='podcast_player_state'),
|
|
path('player/report/', views.player_report, name='podcast_player_report'),
|
|
path('player/command/', views.player_command, name='podcast_player_command'),
|
|
path('player/stream/', views.player_stream, name='podcast_player_stream'),
|
|
]
|