- PodcastFeed (Migration 0007_feed_settings): playback_speed (null = Tempo
des Geräts), skip_intro, skip_outro, volume (0.2/0.5/1.0/1.5/2.0/2.5),
new_episodes (inbox/queue/ignore), include_words, exclude_words,
min_duration. Abos mit auto_queue bekommen new_episodes='queue';
auto_queue bleibt gleich (new_episodes == 'queue'), auch über
set-auto-queue/ und beim Speichern im Code.
- POST feeds/<id>/settings/: beliebige Teilmenge, prüft jeden Wert (400 mit
Feldname, dann wird nichts geändert), nur eigene Abos (sonst 404);
Antwort sind alle Einstellungen des Abos. feeds/ und state/ liefern sie
für jedes Abo mit.
- Neue Folgen beim Aktualisieren: was am Filter scheitert (keins der
Wörter, ein Ausschlusswort im Titel, kürzer als die Mindestlänge) und
bei 'ignore' alles verlässt sofort „Neu“ (nicht gehört); 'queue' reiht
an der auto_queue_position ein; 'inbox' wie bisher. Beim ersten Abruf
zählt weiter nur die neueste Folge.
- PodcastSettings.keep_sorted ('', new, old, short, long, feed): danach
wird die ganze Warteschlange nach jedem Einreihen, jedem Umsortieren und
beim Einschalten neu sortiert; settings/ und state/ liefern den Wert.
- Tests für alles davon.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
74 lines
2.6 KiB
Python
74 lines
2.6 KiB
Python
from django.db import migrations, models
|
|
|
|
|
|
def auto_queue_to_new_episodes(apps, schema_editor):
|
|
"""Feeds that queued their new episodes keep doing so."""
|
|
PodcastFeed = apps.get_model('podcasts', 'PodcastFeed')
|
|
PodcastFeed.objects.filter(auto_queue=True).update(new_episodes='queue')
|
|
|
|
|
|
def new_episodes_to_auto_queue(apps, schema_editor):
|
|
PodcastFeed = apps.get_model('podcasts', 'PodcastFeed')
|
|
PodcastFeed.objects.filter(new_episodes='queue').update(auto_queue=True)
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
dependencies = [
|
|
('podcasts', '0006_episodeprogress_favorite'),
|
|
]
|
|
|
|
operations = [
|
|
migrations.AddField(
|
|
model_name='podcastfeed',
|
|
name='exclude_words',
|
|
field=models.CharField(blank=True, max_length=500),
|
|
),
|
|
migrations.AddField(
|
|
model_name='podcastfeed',
|
|
name='include_words',
|
|
field=models.CharField(blank=True, max_length=500),
|
|
),
|
|
migrations.AddField(
|
|
model_name='podcastfeed',
|
|
name='min_duration',
|
|
field=models.PositiveIntegerField(default=0),
|
|
),
|
|
migrations.AddField(
|
|
model_name='podcastfeed',
|
|
name='new_episodes',
|
|
field=models.CharField(
|
|
choices=[('inbox', 'In „Neu“'), ('queue', 'In die Warteschlange'), ('ignore', 'Nicht anzeigen')],
|
|
default='inbox', max_length=10),
|
|
),
|
|
migrations.AddField(
|
|
model_name='podcastfeed',
|
|
name='playback_speed',
|
|
field=models.FloatField(blank=True, null=True),
|
|
),
|
|
migrations.AddField(
|
|
model_name='podcastfeed',
|
|
name='skip_intro',
|
|
field=models.PositiveIntegerField(default=0),
|
|
),
|
|
migrations.AddField(
|
|
model_name='podcastfeed',
|
|
name='skip_outro',
|
|
field=models.PositiveIntegerField(default=0),
|
|
),
|
|
migrations.AddField(
|
|
model_name='podcastfeed',
|
|
name='volume',
|
|
field=models.FloatField(default=1.0),
|
|
),
|
|
migrations.AddField(
|
|
model_name='podcastsettings',
|
|
name='keep_sorted',
|
|
field=models.CharField(
|
|
blank=True,
|
|
choices=[('', 'Aus'), ('new', 'Neueste zuerst'), ('old', 'Älteste zuerst'),
|
|
('short', 'Kürzeste zuerst'), ('long', 'Längste zuerst'), ('feed', 'Nach Podcast')],
|
|
default='', max_length=10),
|
|
),
|
|
migrations.RunPython(auto_queue_to_new_episodes, new_episodes_to_auto_queue),
|
|
]
|