Skip to content
This repository was archived by the owner on Apr 3, 2025. It is now read-only.

Commit e477eca

Browse files
committed
fix(sonarr): support Sonarr v4 API changes
1 parent da20cbb commit e477eca

File tree

14 files changed

+72
-40
lines changed

14 files changed

+72
-40
lines changed

lib/api/sonarr/controllers/series.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ class SonarrControllerSeries {
1717
required SonarrSeriesType seriesType,
1818
required bool seasonFolder,
1919
required SonarrQualityProfile qualityProfile,
20-
required SonarrLanguageProfile languageProfile,
2120
required SonarrRootFolder rootFolder,
2221
required SonarrSeriesMonitorType monitorType,
2322
List<SonarrTag> tags = const [],
23+
SonarrLanguageProfile? languageProfile,
2424
bool searchForMissingEpisodes = false,
2525
bool searchForCutoffUnmetEpisodes = false,
2626
bool includeSeasonImages = false,
@@ -42,7 +42,7 @@ class SonarrControllerSeries {
4242
/// Handler for [series/{id}](https://github.com/Sonarr/Sonarr/wiki/Series#deleteid).
4343
///
4444
/// Delete the series with the given series ID.
45-
Future<SonarrSeries> delete({
45+
Future<void> delete({
4646
required int seriesId,
4747
bool deleteFiles = false,
4848
bool addImportListExclusion = false,

lib/api/sonarr/controllers/series/add_series.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ Future<SonarrSeries> _commandAddSeries(
66
required SonarrSeriesType seriesType,
77
required bool seasonFolder,
88
required SonarrQualityProfile qualityProfile,
9-
required SonarrLanguageProfile languageProfile,
109
required SonarrRootFolder rootFolder,
1110
required SonarrSeriesMonitorType monitorType,
11+
SonarrLanguageProfile? languageProfile,
1212
List<SonarrTag> tags = const [],
1313
bool searchForMissingEpisodes = false,
1414
bool searchForCutoffUnmetEpisodes = false,
@@ -17,7 +17,7 @@ Future<SonarrSeries> _commandAddSeries(
1717
_payload.addAll({
1818
'monitored': true,
1919
'qualityProfileId': qualityProfile.id,
20-
'languageProfileId': languageProfile.id,
20+
if (languageProfile != null) 'languageProfileId': languageProfile.id,
2121
'seasonFolder': seasonFolder,
2222
'seriesType': seriesType.value,
2323
'tags': tags.map((tag) => tag.id).toList(),
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
part of sonarr_commands;
22

3-
Future<SonarrSeries> _commandDeleteSeries(
3+
Future<void> _commandDeleteSeries(
44
Dio client, {
55
required int seriesId,
66
bool deleteFiles = false,
77
bool addImportListExclusion = false,
88
}) async {
9-
Response response = await client.delete('series/$seriesId', queryParameters: {
9+
await client.delete('series/$seriesId', queryParameters: {
1010
'deleteFiles': deleteFiles,
1111
'addImportListExclusion': addImportListExclusion,
1212
});
13-
return SonarrSeries.fromJson(response.data);
1413
}

lib/modules/sonarr/core/api_controller.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -621,10 +621,10 @@ class SonarrAPIController {
621621
required SonarrSeriesType seriesType,
622622
required bool seasonFolder,
623623
required SonarrQualityProfile qualityProfile,
624-
required SonarrLanguageProfile languageProfile,
625624
required SonarrRootFolder rootFolder,
626625
required SonarrSeriesMonitorType monitorType,
627626
required List<SonarrTag> tags,
627+
SonarrLanguageProfile? languageProfile,
628628
bool showSnackbar = true,
629629
}) async {
630630
if (context.read<SonarrState>().enabled) {

lib/modules/sonarr/core/extensions/sonarr_event_type.dart

+10-8
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,11 @@ extension SonarrEventTypeLunaExtension on SonarrEventType {
139139
title: 'sonarr.Quality'.tr(),
140140
body: history.quality?.quality?.name ?? LunaUI.TEXT_EMDASH,
141141
),
142-
LunaTableContent(
143-
title: 'sonarr.Languages'.tr(),
144-
body: history.language?.name ?? LunaUI.TEXT_EMDASH,
145-
),
142+
if (history.language != null)
143+
LunaTableContent(
144+
title: 'sonarr.Languages'.tr(),
145+
body: history.language?.name ?? LunaUI.TEXT_EMDASH,
146+
),
146147
LunaTableContent(
147148
title: 'sonarr.Client'.tr(),
148149
body: history.data!['downloadClient'] ?? LunaUI.TEXT_EMDASH,
@@ -242,10 +243,11 @@ extension SonarrEventTypeLunaExtension on SonarrEventType {
242243
title: 'sonarr.Quality'.tr(),
243244
body: history.quality?.quality?.name ?? LunaUI.TEXT_EMDASH,
244245
),
245-
LunaTableContent(
246-
title: 'sonarr.Languages'.tr(),
247-
body: history.language?.name ?? LunaUI.TEXT_EMDASH,
248-
),
246+
if (history.language != null)
247+
LunaTableContent(
248+
title: 'sonarr.Languages'.tr(),
249+
body: history.language?.name ?? LunaUI.TEXT_EMDASH,
250+
),
249251
LunaTableContent(
250252
title: 'sonarr.Indexer'.tr(),
251253
body: history.data!['indexer'],

lib/modules/sonarr/core/extensions/sonarr_series.dart

+5-2
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,13 @@ extension SonarrSeriesExtension on SonarrSeries {
142142
series.seasonFolder = edits.useSeasonFolders;
143143
series.path = edits.seriesPath;
144144
series.qualityProfileId = edits.qualityProfile?.id ?? this.qualityProfileId;
145-
series.languageProfileId =
146-
edits.languageProfile.id ?? this.languageProfileId;
147145
series.seriesType = edits.seriesType ?? this.seriesType;
148146
series.tags = edits.tags?.map((t) => t.id!).toList() ?? [];
147+
if (edits.languageProfile != null) {
148+
series.languageProfileId =
149+
edits.languageProfile!.id ?? this.languageProfileId;
150+
}
151+
149152
return series;
150153
}
151154
}

lib/modules/sonarr/core/state.dart

+17-1
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,24 @@ class SonarrState extends LunaModuleState {
221221
notifyListeners();
222222
}
223223

224+
Future<List<SonarrLanguageProfile>> _fetchLanguageProfiles() async {
225+
try {
226+
final profiles = await _api!.profile.getLanguageProfiles();
227+
return profiles;
228+
} catch (error, stack) {
229+
LunaLogger().error(
230+
'Failed to fetch language profiles, assuming v4',
231+
error,
232+
stack,
233+
);
234+
return const [];
235+
}
236+
}
237+
224238
void fetchLanguageProfiles() {
225-
if (_api != null) _languageProfiles = _api!.profile.getLanguageProfiles();
239+
if (_api != null) {
240+
_languageProfiles = _fetchLanguageProfiles();
241+
}
226242
notifyListeners();
227243
}
228244

lib/modules/sonarr/routes/add_series_details/route.dart

+2-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ class _State extends State<AddSeriesDetailsRoute>
124124
const SonarrSeriesAddDetailsRootFolderTile(),
125125
const SonarrSeriesAddDetailsMonitorTile(),
126126
const SonarrSeriesAddDetailsQualityProfileTile(),
127-
const SonarrSeriesAddDetailsLanguageProfileTile(),
127+
if (languageProfiles.isNotEmpty)
128+
const SonarrSeriesAddDetailsLanguageProfileTile(),
128129
const SonarrSeriesAddDetailsSeriesTypeTile(),
129130
const SonarrSeriesAddDetailsUseSeasonFoldersTile(),
130131
const SonarrSeriesAddDetailsTagsTile(),

lib/modules/sonarr/routes/edit_series/route.dart

+2-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ class _State extends State<SeriesEditRoute>
121121
const SonarrSeriesEditMonitoredTile(),
122122
const SonarrSeriesEditSeasonFoldersTile(),
123123
SonarrSeriesEditQualityProfileTile(profiles: qualityProfiles),
124-
SonarrSeriesEditLanguageProfileTile(profiles: languageProfiles),
124+
if (languageProfiles.isNotEmpty)
125+
SonarrSeriesEditLanguageProfileTile(profiles: languageProfiles),
125126
const SonarrSeriesEditSeriesTypeTile(),
126127
const SonarrSeriesEditSeriesPathTile(),
127128
const SonarrSeriesEditTagsTile(),

lib/modules/sonarr/routes/edit_series/state.dart

+4-3
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,15 @@ class SonarrSeriesEditState extends ChangeNotifier {
8080
);
8181
}
8282

83-
late SonarrLanguageProfile _languageProfile;
84-
SonarrLanguageProfile get languageProfile => _languageProfile;
85-
set languageProfile(SonarrLanguageProfile languageProfile) {
83+
SonarrLanguageProfile? _languageProfile;
84+
SonarrLanguageProfile? get languageProfile => _languageProfile;
85+
set languageProfile(SonarrLanguageProfile? languageProfile) {
8686
_languageProfile = languageProfile;
8787
notifyListeners();
8888
}
8989

9090
void initializeLanguageProfile(List<SonarrLanguageProfile> languageProfiles) {
91+
if (languageProfiles.isEmpty) return;
9192
_languageProfile = languageProfiles.firstWhere(
9293
(p) => p.id == series!.languageProfileId,
9394
);

lib/modules/sonarr/routes/edit_series/widgets/tile_language_profile.dart

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ class SonarrSeriesEditLanguageProfileTile extends StatelessWidget {
1616
title: 'sonarr.LanguageProfile'.tr(),
1717
body: [
1818
TextSpan(
19-
text: context.watch<SonarrSeriesEditState>().languageProfile.name,
19+
text: context.watch<SonarrSeriesEditState>().languageProfile?.name ??
20+
LunaUI.TEXT_EMDASH,
2021
),
2122
],
2223
trailing: const LunaIconButton.arrow(),

lib/modules/sonarr/routes/queue/widgets/queue_tile.dart

+11-8
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,12 @@ class _State extends State<SonarrQueueTile> {
9292
text: widget.queueRecord.quality?.quality?.name ?? LunaUI.TEXT_EMDASH,
9393
),
9494
TextSpan(text: LunaUI.TEXT_BULLET.pad()),
95-
TextSpan(
96-
text: widget.queueRecord.language?.name ?? LunaUI.TEXT_EMDASH,
97-
),
98-
TextSpan(text: LunaUI.TEXT_BULLET.pad()),
95+
if (widget.queueRecord.language != null)
96+
TextSpan(
97+
text: widget.queueRecord.language?.name ?? LunaUI.TEXT_EMDASH,
98+
),
99+
if (widget.queueRecord.language != null)
100+
TextSpan(text: LunaUI.TEXT_BULLET.pad()),
99101
TextSpan(
100102
text: widget.queueRecord.lunaTimeLeft(),
101103
),
@@ -162,10 +164,11 @@ class _State extends State<SonarrQueueTile> {
162164
title: 'sonarr.Quality'.tr(),
163165
body: widget.queueRecord.quality?.quality?.name ?? LunaUI.TEXT_EMDASH,
164166
),
165-
LunaTableContent(
166-
title: 'sonarr.Language'.tr(),
167-
body: widget.queueRecord.language?.name ?? LunaUI.TEXT_EMDASH,
168-
),
167+
if (widget.queueRecord.language != null)
168+
LunaTableContent(
169+
title: 'sonarr.Language'.tr(),
170+
body: widget.queueRecord.language?.name ?? LunaUI.TEXT_EMDASH,
171+
),
169172
LunaTableContent(
170173
title: 'sonarr.Client'.tr(),
171174
body: widget.queueRecord.downloadClient ?? LunaUI.TEXT_EMDASH,

lib/modules/sonarr/routes/releases/widgets/release_tile.dart

+9-6
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,10 @@ class _State extends State<SonarrReleasesTile> {
8080
if (_preferredWordScore != null)
8181
TextSpan(text: LunaUI.TEXT_BULLET.pad()),
8282
TextSpan(text: widget.release.lunaQuality),
83-
TextSpan(text: LunaUI.TEXT_BULLET.pad()),
84-
TextSpan(text: widget.release.lunaLanguage),
83+
if (widget.release.language != null)
84+
TextSpan(text: LunaUI.TEXT_BULLET.pad()),
85+
if (widget.release.language != null)
86+
TextSpan(text: widget.release.lunaLanguage),
8587
TextSpan(text: LunaUI.TEXT_BULLET.pad()),
8688
TextSpan(text: widget.release.lunaSize),
8789
],
@@ -118,10 +120,11 @@ class _State extends State<SonarrReleasesTile> {
118120
title: 'sonarr.Size'.tr(),
119121
body: widget.release.lunaSize,
120122
),
121-
LunaTableContent(
122-
title: 'sonarr.Language'.tr(),
123-
body: widget.release.lunaLanguage,
124-
),
123+
if (widget.release.language != null)
124+
LunaTableContent(
125+
title: 'sonarr.Language'.tr(),
126+
body: widget.release.lunaLanguage,
127+
),
125128
LunaTableContent(
126129
title: 'sonarr.Quality'.tr(),
127130
body: widget.release.lunaQuality,

lib/modules/sonarr/routes/season_details/sheets/episode_details.dart

+3-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ class SonarrEpisodeDetailsSheet extends LunaBottomModalSheet {
4747
: LunaColours.accent,
4848
text: episodeFile!.quality?.quality?.name ?? LunaUI.TEXT_EMDASH,
4949
),
50-
if (episode!.hasFile! && episodeFile != null)
50+
if (episode!.hasFile! &&
51+
episodeFile != null &&
52+
episodeFile!.languageCutoffNotMet != null)
5153
LunaHighlightedNode(
5254
backgroundColor: episodeFile!.languageCutoffNotMet!
5355
? LunaColours.orange

0 commit comments

Comments
 (0)