feat: add "Include Specials" toggle to the show download dialog

The aired-order rework can sweep correctly-placed Specials into "download
next N"; this toggle lets users opt out. Shown only for whole shows
(reusing FocusableSwitchListTile via an optional toggle on the shared
option-picker dialog), remembered across opens via a BoolPref
(default on = unchanged behavior). Filters Specials at the single
collect choke point (_collectPlayable), with a guard so explicitly
downloading the Specials season still queues its episodes.
This commit is contained in:
edde746
2026-06-25 23:41:31 +02:00
parent dbe804f8db
commit f04691d321
47 changed files with 420 additions and 46 deletions
+5 -2
View File
@@ -40,8 +40,8 @@ class _AppDatabaseTestSuite {
// ============================================================
group('schema', () {
test('schemaVersion is 15', () {
expect(db.schemaVersion, 15);
test('schemaVersion is 16', () {
expect(db.schemaVersion, 16);
});
test('all tables are accessible and start empty', () async {
@@ -865,6 +865,7 @@ class _AppDatabaseTestSuite {
expect(rules.first.enabled, isTrue); // default
expect(rules.first.downloadFilter, 'unwatched'); // default
expect(rules.first.mediaIndex, 0); // default
expect(rules.first.includeSpecials, isTrue); // default
expect(rules.first.lastExecutedAt, isNull);
});
@@ -888,6 +889,7 @@ class _AppDatabaseTestSuite {
targetType: 'season',
episodeCount: 99,
downloadFilter: 'all',
includeSpecials: false,
);
final rules = await db.getSyncRules();
@@ -895,6 +897,7 @@ class _AppDatabaseTestSuite {
expect(rules.first.targetType, 'season');
expect(rules.first.episodeCount, 99);
expect(rules.first.downloadFilter, 'all');
expect(rules.first.includeSpecials, isFalse);
});
test('insertSyncRule allows the same server item for different profiles', () async {