diff --git a/.gitignore b/.gitignore
index 69bed392..a23a8a27 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,3 +42,4 @@ LunaSea.ipa
ios/build/
ExportOptions.plist
api_responses/
+pre_archive
diff --git a/assets/CustomIcons.ttf b/assets/CustomIcons.ttf
new file mode 100644
index 00000000..0d473a6d
Binary files /dev/null and b/assets/CustomIcons.ttf differ
diff --git a/assets/custom_icons/CustomIcons.ttf b/assets/custom_icons/CustomIcons.ttf
deleted file mode 100644
index 55459853..00000000
Binary files a/assets/custom_icons/CustomIcons.ttf and /dev/null differ
diff --git a/assets/custom_icons/config.json b/assets/custom_icons/config.json
deleted file mode 100644
index 86089f2f..00000000
--- a/assets/custom_icons/config.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "name": "CustomIcons",
- "css_prefix_text": "",
- "css_use_suffix": false,
- "hinting": true,
- "units_per_em": 1000,
- "ascent": 850,
- "glyphs": [
- {
- "uid": "0f79e958e1ed08e14ccbd7369b5d4440",
- "css": "sabnzbd",
- "code": 59392,
- "src": "custom_icons",
- "selected": true,
- "svg": {
- "path": "M252.3 109.8C249.8 110.8 244.6 114.4 240.8 117.8L233.8 124.1 233.8 289.9 233.8 455.6 178.7 455.2C119 454.9 113.8 456 107.7 470.7 101.1 486.8 105.8 497.6 130.9 523.4L154 547.2 146.1 558.9 138.1 570.6 139.6 639.9C140.4 678 141 712 140.9 715.4 140.9 718.8 140.7 735.8 140.4 753.3L140 785.1 150 794.1 160.1 803.1 265.4 802.9C323.4 802.7 373.5 801.5 376.9 800.2 387.1 796.1 397.1 803.7 438.9 847.4 498 909.1 496.9 909.1 555.9 848.1 602.4 799.9 607.1 796.3 617.8 800.3 630.7 805.2 829.7 803.8 839.6 798.7 854.8 790.8 855.4 786.1 855.4 674.1L855.4 570.1 848 559.2 840.7 548.4 861.8 527.4C893.6 495.9 898.6 479.8 882.3 462.3 876.1 455.6 873.9 455.4 820.2 455.4L764.6 455.4 764.6 290.8 764.6 126.3 756.1 117.8 747.6 109.2 502.2 108.7C367.3 108.4 254.8 108.9 252.3 109.8M735.4 310.8L735.4 483.1 798.7 483.1 862 483.1 828.8 516.9 795.7 550.8 765.5 550.8 735.4 550.8 735.3 519.2C735.3 471.7 735.4 471.8 666.3 473.8 601.8 475.8 603.1 474.9 603.1 520.3L603.1 550.8 493.1 550.9C432.6 551 342.2 551 292.3 550.9L201.5 550.7 169.2 517.7 136.9 484.6 199.2 483.8 261.5 483 261.5 310.7 261.5 138.5 498.5 138.5 735.4 138.5 735.4 310.8M708.4 539.2L709.2 576.9 766.9 577.8 824.6 578.6 824.6 675.5 824.6 772.3 727.7 772.3 630.8 772.3 630.8 636.9 630.8 501.5 669.1 501.5 707.5 501.5 708.4 539.2M363.1 598.5L363.1 618.5 306.2 618.5 249.2 618.5 249.2 636.9 249.2 655.4 306.2 655.4 363.1 655.4 363.1 713.8 363.1 772.3 266.2 772.3 169.2 772.3 169.2 752.4 169.2 732.4 226.9 731.6 284.6 730.8 285.5 713.1 286.5 695.4 227.8 695.4 169.2 695.4 169.2 636.9 169.2 578.5 266.2 578.5 363.1 578.5 363.1 598.5M593.8 675.4L593.8 772.3 496.9 772.3 400 772.3 400 713.8 400 655.4 456.9 655.4 513.8 655.4 513.8 636.9 513.8 618.5 456.9 618.5 400 618.5 400 598.5 400 578.5 496.9 578.5 593.8 578.5 593.8 675.4M708.4 674.6L709.2 730.8 726.9 731.7 744.6 732.6 744.6 675.5 744.6 618.5 726.1 618.5 707.6 618.5 708.4 674.6M480 713.8L480 732.3 496.9 732.3 513.8 732.3 513.8 713.8 513.8 695.4 496.9 695.4 480 695.4 480 713.8M529.2 831.9L497.7 863.8 475.8 840.5C463.7 827.7 449.7 813.3 444.7 808.6L435.6 800 498.1 800 560.6 800 529.2 831.9",
- "width": 1000
- },
- "search": [
- "sabnzbd"
- ]
- },
- {
- "uid": "f08ba9f0e8f9b426a92efcaa59c1e932",
- "css": "reddit-alien",
- "code": 62081,
- "src": "fontawesome"
- },
- {
- "uid": "0f6a2573a7b6df911ed199bb63717e27",
- "css": "github-circled",
- "code": 61595,
- "src": "fontawesome"
- },
- {
- "uid": "bbf307b0e5e61f59d838e83455cabecc",
- "css": "nzbget",
- "code": 59394,
- "src": "custom_icons",
- "selected": true,
- "svg": {
- "path": "M412.9 68.7C131 119.7-26.3 441.8 104.3 701 250.5 991.1 661.2 1026.6 852 765.6 1089.5 440.7 810-3.1 412.9 68.7M599.6 117C892.5 197.1 993.1 558.1 783.4 776.7 591 977.3 257.7 922.7 138.8 671.2 38 457.9 147.6 200.5 371.5 124.8 435.9 103.1 536.1 99.6 599.6 117M421.9 294.9L421.9 324.2 502 324.2 582 324.2 582 294.9 582 265.6 502 265.6 421.9 265.6 421.9 294.9M421.9 380.9L421.9 410.2 502 410.2 582 410.2 582 380.9 582 351.6 502 351.6 421.9 351.6 421.9 380.9M421.4 438.4C421.2 441.1 421.3 461.4 421.8 483.4L422.6 523.4 367.4 523.4C321.3 523.4 312.6 524.3 315.2 528.9 320.1 537.4 499.3 718.8 502.8 718.8 506.7 718.8 695.3 530.3 695.3 526.3 695.3 524.7 669.9 523.4 638.8 523.4L582.3 523.4 581.2 479.5 580.1 435.5 501 434.5C439.2 433.7 421.8 434.5 421.4 438.4",
- "width": 1000
- },
- "search": [
- "nzbget"
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/assets/custom_icons/images/nzbget.png b/assets/custom_icons/images/nzbget.png
deleted file mode 100644
index dab63b48..00000000
Binary files a/assets/custom_icons/images/nzbget.png and /dev/null differ
diff --git a/assets/custom_icons/images/nzbget.svg b/assets/custom_icons/images/nzbget.svg
deleted file mode 100644
index e2683a3b..00000000
--- a/assets/custom_icons/images/nzbget.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/custom_icons/images/sabnzbd.png b/assets/custom_icons/images/sabnzbd.png
deleted file mode 100644
index 5011834b..00000000
Binary files a/assets/custom_icons/images/sabnzbd.png and /dev/null differ
diff --git a/assets/custom_icons/images/sabnzbd.svg b/assets/custom_icons/images/sabnzbd.svg
deleted file mode 100644
index e3eac6bc..00000000
--- a/assets/custom_icons/images/sabnzbd.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/lib/core.dart b/lib/core.dart
new file mode 100644
index 00000000..ea3d9616
--- /dev/null
+++ b/lib/core.dart
@@ -0,0 +1,4 @@
+export 'package:lunasea/core/app_state.dart';
+export 'package:lunasea/core/constants.dart';
+export 'package:lunasea/core/extensions.dart';
+export 'package:lunasea/core/reducers.dart';
diff --git a/lib/core/app_state.dart b/lib/core/app_state.dart
new file mode 100644
index 00000000..3f787767
--- /dev/null
+++ b/lib/core/app_state.dart
@@ -0,0 +1,10 @@
+import 'package:redux/redux.dart';
+
+final appReducer = combineReducers([
+
+]);
+
+class AppState {
+ AppState();
+ factory AppState.initialState() => AppState();
+}
diff --git a/lib/system/constants.dart b/lib/core/constants.dart
similarity index 95%
rename from lib/system/constants.dart
rename to lib/core/constants.dart
index 812dd243..712c5279 100644
--- a/lib/system/constants.dart
+++ b/lib/core/constants.dart
@@ -29,12 +29,6 @@ class Constants {
"fixes": ['Unable to fetch changes'],
"tweaks": ['Unable to fetch changes'],
}];
- static const Map LOWEST_VERSION = {
- 'major': 0,
- 'minor': 0,
- 'revision': 0,
- 'code': 0,
- };
//Filesystem
static const FILESYSTEM_INVALID = '<>';
static const ENCRYPTION_FAILURE = '<>';
diff --git a/lib/core/extensions.dart b/lib/core/extensions.dart
new file mode 100644
index 00000000..705b17ba
--- /dev/null
+++ b/lib/core/extensions.dart
@@ -0,0 +1,3 @@
+export 'package:lunasea/core/extensions/bytes.dart';
+export 'package:lunasea/core/extensions/datetime.dart';
+export 'package:lunasea/core/extensions/functions.dart';
diff --git a/lib/core/extensions/bytes.dart b/lib/core/extensions/bytes.dart
new file mode 100644
index 00000000..3ffc300c
--- /dev/null
+++ b/lib/core/extensions/bytes.dart
@@ -0,0 +1,13 @@
+import 'package:lunasea/core.dart';
+
+extension BytesExtension on int {
+ String toStringFromBytes({ int decimals = 2 }) {
+ int position = 0;
+ double size = this.toDouble();
+ while(size > 1024) {
+ size /= 1024;
+ position++;
+ }
+ return '${size.toStringAsFixed(decimals)} ${Constants.BYTE_SIZES[position]}';
+ }
+}
diff --git a/lib/core/extensions/datetime.dart b/lib/core/extensions/datetime.dart
new file mode 100644
index 00000000..0a80cb8d
--- /dev/null
+++ b/lib/core/extensions/datetime.dart
@@ -0,0 +1,5 @@
+extension DateTimeExtension on DateTime {
+ DateTime round() {
+ return DateTime(this.year, this.month, this.day);
+ }
+}
diff --git a/lib/system/functions.dart b/lib/core/extensions/functions.dart
similarity index 99%
rename from lib/system/functions.dart
rename to lib/core/extensions/functions.dart
index c123d9ad..3deb47d6 100644
--- a/lib/system/functions.dart
+++ b/lib/core/extensions/functions.dart
@@ -1,4 +1,4 @@
-import 'package:lunasea/system/constants.dart';
+import 'package:lunasea/core.dart';
import 'package:url_launcher/url_launcher.dart';
class Functions {
diff --git a/lib/core/reducers.dart b/lib/core/reducers.dart
new file mode 100644
index 00000000..e69de29b
diff --git a/lib/logic.dart b/lib/logic.dart
new file mode 100644
index 00000000..d92cd3d6
--- /dev/null
+++ b/lib/logic.dart
@@ -0,0 +1,5 @@
+export 'package:lunasea/logic/abstracts.dart';
+export 'package:lunasea/logic/automation.dart';
+export 'package:lunasea/logic/clients.dart';
+export 'package:lunasea/logic/calendar.dart';
+export 'package:lunasea/logic/system.dart';
diff --git a/lib/logic/abstracts.dart b/lib/logic/abstracts.dart
new file mode 100644
index 00000000..f85ebd65
--- /dev/null
+++ b/lib/logic/abstracts.dart
@@ -0,0 +1,9 @@
+export 'package:lunasea/logic/abstracts/calendar.dart';
+
+abstract class API {
+ void logWarning(String methodName, String text);
+ void logError(String methodName, String text, Object error);
+ Future testConnection(List values);
+}
+
+abstract class Entry {}
diff --git a/lib/logic/abstracts/calendar.dart b/lib/logic/abstracts/calendar.dart
new file mode 100644
index 00000000..eaf425e1
--- /dev/null
+++ b/lib/logic/abstracts/calendar.dart
@@ -0,0 +1 @@
+export 'package:lunasea/logic/abstracts/calendar/entry.dart';
diff --git a/lib/logic/abstracts/calendar/entry.dart b/lib/logic/abstracts/calendar/entry.dart
new file mode 100644
index 00000000..0e294bb1
--- /dev/null
+++ b/lib/logic/abstracts/calendar/entry.dart
@@ -0,0 +1,17 @@
+import 'package:flutter/material.dart';
+import 'package:lunasea/logic/abstracts.dart';
+
+abstract class CalendarEntry implements Entry {
+ int id;
+ String title;
+
+ TextSpan get subtitle;
+ IconButton get trailing;
+ String get bannerURI;
+ Future enterContent(BuildContext context);
+
+ CalendarEntry(
+ this.id,
+ this.title,
+ );
+}
diff --git a/lib/logic/automation.dart b/lib/logic/automation.dart
new file mode 100644
index 00000000..a44040dc
--- /dev/null
+++ b/lib/logic/automation.dart
@@ -0,0 +1,3 @@
+export 'package:lunasea/logic/automation/lidarr.dart';
+export 'package:lunasea/logic/automation/radarr.dart';
+export 'package:lunasea/logic/automation/sonarr.dart';
diff --git a/lib/logic/automation/lidarr/api.dart b/lib/logic/automation/lidarr/api.dart
index 852a2248..80c17382 100644
--- a/lib/logic/automation/lidarr/api.dart
+++ b/lib/logic/automation/lidarr/api.dart
@@ -1,8 +1,7 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
-import 'package:lunasea/configuration/values.dart';
+import 'package:lunasea/system.dart';
import 'package:lunasea/logic/automation/lidarr.dart';
-import 'package:lunasea/system/logger.dart';
class LidarrAPI {
LidarrAPI._();
@@ -214,13 +213,13 @@ class LidarrAPI {
return null;
}
- static Future removeArtist(int artistID) async {
+ static Future removeArtist(int artistID, { deleteFiles = false }) async {
List values = Values.lidarrValues;
if(values[0] == false) {
return false;
}
try {
- String uri = '${values[1]}/api/v1/artist/$artistID?apikey=${values[2]}';
+ String uri = '${values[1]}/api/v1/artist/$artistID?apikey=${values[2]}&deleteFiles=$deleteFiles';
http.Response response = await http.delete(
Uri.encodeFull(uri),
);
diff --git a/lib/logic/automation/lidarr/entry/album.dart b/lib/logic/automation/lidarr/entry/album.dart
index 1e50c293..84932839 100644
--- a/lib/logic/automation/lidarr/entry/album.dart
+++ b/lib/logic/automation/lidarr/entry/album.dart
@@ -1,4 +1,4 @@
-import 'package:lunasea/configuration/values.dart';
+import 'package:lunasea/system.dart';
import 'package:intl/intl.dart';
class LidarrAlbumEntry {
diff --git a/lib/logic/automation/lidarr/entry/catalogue.dart b/lib/logic/automation/lidarr/entry/catalogue.dart
index 562ece21..1e3dd696 100644
--- a/lib/logic/automation/lidarr/entry/catalogue.dart
+++ b/lib/logic/automation/lidarr/entry/catalogue.dart
@@ -1,5 +1,5 @@
-import 'package:lunasea/configuration/values.dart';
-import 'package:lunasea/system/functions.dart';
+import 'package:lunasea/core.dart';
+import 'package:lunasea/system.dart';
class LidarrCatalogueEntry {
String title;
@@ -46,7 +46,7 @@ class LidarrCatalogueEntry {
}
String get subtitle {
- return '$albums\t•\t$tracks\n${Functions.bytesToReadable(sizeOnDisk)}';
+ return '$albums\t•\t$tracks\n${sizeOnDisk.toStringFromBytes()}';
}
String get tracks {
diff --git a/lib/logic/automation/lidarr/entry/history.dart b/lib/logic/automation/lidarr/entry/history.dart
index 73aa2c4b..d440fe17 100644
--- a/lib/logic/automation/lidarr/entry/history.dart
+++ b/lib/logic/automation/lidarr/entry/history.dart
@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
-import 'package:lunasea/system/constants.dart';
+import 'package:lunasea/core.dart';
abstract class LidarrHistoryEntry {
String title;
diff --git a/lib/logic/automation/lidarr/entry/missing.dart b/lib/logic/automation/lidarr/entry/missing.dart
index dfdb44e2..b567b8b4 100644
--- a/lib/logic/automation/lidarr/entry/missing.dart
+++ b/lib/logic/automation/lidarr/entry/missing.dart
@@ -1,4 +1,4 @@
-import 'package:lunasea/configuration/values.dart';
+import 'package:lunasea/system.dart';
class LidarrMissingEntry {
String title;
diff --git a/lib/logic/automation/lidarr/entry/track.dart b/lib/logic/automation/lidarr/entry/track.dart
index 6b054dd8..a8ceafa9 100644
--- a/lib/logic/automation/lidarr/entry/track.dart
+++ b/lib/logic/automation/lidarr/entry/track.dart
@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
-import 'package:lunasea/system/constants.dart';
+import 'package:lunasea/core.dart';
class LidarrTrackEntry {
String title;
diff --git a/lib/logic/automation/radarr/api.dart b/lib/logic/automation/radarr/api.dart
index 2d16924c..6713935d 100644
--- a/lib/logic/automation/radarr/api.dart
+++ b/lib/logic/automation/radarr/api.dart
@@ -1,8 +1,7 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
-import 'package:lunasea/configuration/values.dart';
+import 'package:lunasea/system.dart';
import 'package:lunasea/logic/automation/radarr.dart';
-import 'package:lunasea/system/logger.dart';
class RadarrAPI {
RadarrAPI._();
@@ -245,13 +244,13 @@ class RadarrAPI {
return false;
}
- static Future removeMovie(int id) async {
+ static Future removeMovie(int id, {bool deleteFiles = false }) async {
List values = Values.radarrValues;
if(values[0] == false) {
return false;
}
try {
- String uri = '${values[1]}/api/movie/$id?apikey=${values[2]}';
+ String uri = '${values[1]}/api/movie/$id?apikey=${values[2]}&deleteFiles=$deleteFiles';
http.Response response = await http.delete(
Uri.encodeFull(uri),
);
@@ -470,29 +469,65 @@ class RadarrAPI {
Uri.encodeFull(uri),
);
if(response.statusCode == 200) {
- List _availableEntries = [];
+ List _entries = [];
+ List body = json.decode(response.body);
+ for(var entry in body) {
+ if(!entry['downloaded'] && entry['monitored'] && entry['status'] == 'released') {
+ var _quality = entry['qualityProfileId'] != null ? _qualities[entry['qualityProfileId']] : null;
+ _entries.add(
+ RadarrMissingEntry(
+ entry['id'] ?? -1,
+ entry['title'] ?? 'Unknown Title',
+ entry['sortTitle'] ?? 'Unknown Title',
+ entry['studio'] ?? 'Unknown Studio',
+ entry['physicalRelease'] ?? '',
+ entry['inCinemas'] ?? '',
+ _quality != null ? _quality.name : '',
+ entry['year'] ?? 0,
+ entry['runtime'] ?? 0,
+ entry['status'] ?? 'Unknown Status',
+ ),
+ );
+ }
+ }
+ //Sort the list by the appropriate dates
+ _entries.sort((a,b) {
+ if(a.physicalReleaseObject == null) return 1;
+ if(b.physicalReleaseObject == null) return -1;
+ return b.physicalReleaseObject.compareTo(a.physicalReleaseObject);
+ });
+ return _entries;
+ } else {
+ logError('getMissing', ' HTTP Status Code (${response.statusCode})', null);
+ }
+ }
+ } catch (e) {
+ logError('getMissing', 'Failed to fetch missing movies', e);
+ return null;
+ }
+ logWarning('getMissing', 'Failed to fetch missing movies');
+ return null;
+ }
+
+ static Future> getUpcoming() async {
+ List values = Values.radarrValues;
+ if(values[0] == false) {
+ return null;
+ }
+ try {
+ Map _qualities = await getQualityProfiles();
+ if(_qualities != null) {
+ String uri = '${values[1]}/api/movie?apikey=${values[2]}';
+ http.Response response = await http.get(
+ Uri.encodeFull(uri),
+ );
+ if(response.statusCode == 200) {
List _cinemaEntries = [];
List _announcedEntries = [];
List body = json.decode(response.body);
for(var entry in body) {
if(!entry['downloaded'] && entry['monitored']) {
var _quality = entry['qualityProfileId'] != null ? _qualities[entry['qualityProfileId']] : null;
- if(entry['status'] == 'released') {
- _availableEntries.add(
- RadarrMissingEntry(
- entry['id'] ?? -1,
- entry['title'] ?? 'Unknown Title',
- entry['sortTitle'] ?? 'Unknown Title',
- entry['studio'] ?? 'Unknown Studio',
- entry['physicalRelease'] ?? '',
- entry['inCinemas'] ?? '',
- _quality != null ? _quality.name : '',
- entry['year'] ?? 0,
- entry['runtime'] ?? 0,
- entry['status'] ?? 'Unknown Status',
- ),
- );
- }
if(entry['status'] == 'inCinemas') {
_cinemaEntries.add(
RadarrMissingEntry(
@@ -527,12 +562,7 @@ class RadarrAPI {
}
}
}
- //Sort the lists by the appropriate dates
- _availableEntries.sort((a,b) {
- if(a.physicalReleaseObject == null) return 1;
- if(b.physicalReleaseObject == null) return -1;
- return b.physicalReleaseObject.compareTo(a.physicalReleaseObject);
- });
+ //Sort entries
_cinemaEntries.sort((a,b) {
if(a.physicalReleaseObject == null) return 1;
if(b.physicalReleaseObject == null) return -1;
@@ -543,16 +573,16 @@ class RadarrAPI {
if(b.inCinemasObject == null) return -1;
return a.inCinemasObject.compareTo(b.inCinemasObject);
});
- return [_availableEntries, _cinemaEntries, _announcedEntries].expand((x) => x).toList();
+ return [_cinemaEntries, _announcedEntries].expand((x) => x).toList();
} else {
- logError('getMissing', ' HTTP Status Code (${response.statusCode})', null);
+ logError('getUpcoming', ' HTTP Status Code (${response.statusCode})', null);
}
}
} catch (e) {
- logError('getMissing', 'Failed to fetch missing movies', e);
+ logError('getUpcoming', 'Failed to fetch upcoming movies', e);
return null;
}
- logWarning('getMissing', 'Failed to fetch missing movies');
+ logWarning('getUpcoming', 'Failed to fetch upcoming movies');
return null;
}
diff --git a/lib/logic/automation/radarr/entry/catalogue.dart b/lib/logic/automation/radarr/entry/catalogue.dart
index eddfb462..48666ca8 100644
--- a/lib/logic/automation/radarr/entry/catalogue.dart
+++ b/lib/logic/automation/radarr/entry/catalogue.dart
@@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
-import 'package:lunasea/configuration/values.dart';
-import 'package:lunasea/system/constants.dart';
-import 'package:lunasea/system/functions.dart';
+import 'package:lunasea/core.dart';
+import 'package:lunasea/system.dart';
import 'package:intl/intl.dart';
class RadarrCatalogueEntry {
diff --git a/lib/logic/automation/radarr/entry/history.dart b/lib/logic/automation/radarr/entry/history.dart
index 5198555a..838500e3 100644
--- a/lib/logic/automation/radarr/entry/history.dart
+++ b/lib/logic/automation/radarr/entry/history.dart
@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
-import 'package:lunasea/system/constants.dart';
+import 'package:lunasea/core.dart';
abstract class RadarrHistoryEntry {
String movieTitle;
diff --git a/lib/logic/automation/radarr/entry/missing.dart b/lib/logic/automation/radarr/entry/missing.dart
index 390ae991..46e5453e 100644
--- a/lib/logic/automation/radarr/entry/missing.dart
+++ b/lib/logic/automation/radarr/entry/missing.dart
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
-import 'package:lunasea/configuration/values.dart';
-import 'package:lunasea/system/functions.dart';
+import 'package:lunasea/core.dart';
+import 'package:lunasea/system.dart';
class RadarrMissingEntry {
String title;
diff --git a/lib/logic/automation/radarr/entry/upcoming.dart b/lib/logic/automation/radarr/entry/upcoming.dart
index fd36e3c7..d37db242 100644
--- a/lib/logic/automation/radarr/entry/upcoming.dart
+++ b/lib/logic/automation/radarr/entry/upcoming.dart
@@ -1,4 +1,4 @@
-import 'package:lunasea/configuration/values.dart';
+import 'package:lunasea/system.dart';
class RadarrUpcomingEntry {
String title;
diff --git a/lib/logic/automation/sonarr/api.dart b/lib/logic/automation/sonarr/api.dart
index d2bb0381..851af911 100644
--- a/lib/logic/automation/sonarr/api.dart
+++ b/lib/logic/automation/sonarr/api.dart
@@ -1,9 +1,8 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
-import 'package:lunasea/configuration/values.dart';
-import 'package:lunasea/logic/automation/sonarr.dart';
import 'package:intl/intl.dart';
-import 'package:lunasea/system/logger.dart';
+import 'package:lunasea/system.dart';
+import 'package:lunasea/logic/automation/sonarr.dart';
class SonarrAPI {
SonarrAPI._();
@@ -93,13 +92,13 @@ class SonarrAPI {
return false;
}
- static Future removeSeries(int seriesID) async {
+ static Future removeSeries(int seriesID, { deleteFiles = false }) async {
List values = Values.sonarrValues;
if(values[0] == false) {
return false;
}
try {
- String uri = '${values[1]}/api/series/$seriesID?apikey=${values[2]}';
+ String uri = '${values[1]}/api/series/$seriesID?apikey=${values[2]}&deleteFiles=$deleteFiles';
http.Response response = await http.delete(
Uri.encodeFull(uri),
);
@@ -578,6 +577,7 @@ class SonarrAPI {
entry['episodeNumber'] ?? 0,
entry['airDateUtc'] ?? '',
entry['id'] ?? -1,
+ entry['episodeFileId'] ?? -1,
entry['monitored'] ?? false,
entry['hasFile'] ?? false,
quality ?? 'Unknown Quality',
@@ -1075,4 +1075,64 @@ class SonarrAPI {
logWarning('downloadRelease', 'Failed to download release ($guid)');
return false;
}
+
+ static Future toggleEpisodeMonitored(int episodeID, bool status) async {
+ List values = Values.sonarrValues;
+ if(values[0] == false) {
+ return false;
+ }
+ try {
+ String uriGet = '${values[1]}/api/episode/$episodeID?apikey=${values[2]}';
+ String uriPut = '${values[1]}/api/episode?apikey=${values[2]}';
+ http.Response response = await http.get(
+ Uri.encodeFull(uriGet),
+ );
+ if(response.statusCode == 200) {
+ Map body = json.decode(response.body);
+ body['monitored'] = status;
+ response = await http.put(
+ Uri.encodeFull(uriPut),
+ body: json.encode(body),
+ headers: {
+ "Content-Type": "application/json",
+ },
+ );
+ if(response.statusCode == 202) {
+ return true;
+ } else {
+ logError('toggleSeasonMonitored', ' HTTP Status Code (${response.statusCode})', null);
+ }
+ } else {
+ logError('toggleSeasonMonitored', ' HTTP Status Code (${response.statusCode})', null);
+ }
+ } catch (e) {
+ logError('toggleEpisodeMonitored', 'Failed to toggle episode monitored state ($episodeID, $status)', e);
+ return false;
+ }
+ logWarning('toggleEpisodeMonitored', 'Failed to toggle episode monitored state ($episodeID, $status)');
+ return false;
+ }
+
+ static Future deleteEpisodeFile(int episodeFileID) async {
+ List values = Values.sonarrValues;
+ if(values[0] == false) {
+ return false;
+ }
+ try {
+ String uri = '${values[1]}/api/episodefile/$episodeFileID?apikey=${values[2]}';
+ http.Response response = await http.delete(
+ Uri.encodeFull(uri),
+ );
+ if(response.statusCode == 200) {
+ return true;
+ } else {
+ logError('deleteEpisodeFile', ' HTTP Status Code (${response.statusCode})', null);
+ }
+ } catch (e) {
+ logError('deleteEpisodeFile', 'Failed to delete episode file ($episodeFileID)', e);
+ return false;
+ }
+ logWarning('deleteEpisodeFile', 'Failed to delete episode file ($episodeFileID)');
+ return false;
+ }
}
diff --git a/lib/logic/automation/sonarr/entry/catalogue.dart b/lib/logic/automation/sonarr/entry/catalogue.dart
index 0643a70a..4159db1d 100644
--- a/lib/logic/automation/sonarr/entry/catalogue.dart
+++ b/lib/logic/automation/sonarr/entry/catalogue.dart
@@ -1,6 +1,6 @@
-import 'package:lunasea/configuration/values.dart';
import 'package:intl/intl.dart';
-import 'package:lunasea/system/functions.dart';
+import 'package:lunasea/core.dart';
+import 'package:lunasea/system.dart';
class SonarrCatalogueEntry {
String title;
diff --git a/lib/logic/automation/sonarr/entry/episode.dart b/lib/logic/automation/sonarr/entry/episode.dart
index 344f442c..ce1b13c9 100644
--- a/lib/logic/automation/sonarr/entry/episode.dart
+++ b/lib/logic/automation/sonarr/entry/episode.dart
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:lunasea/logic/automation/sonarr.dart';
-import 'package:lunasea/system/constants.dart';
+import 'package:lunasea/core.dart';
import 'package:intl/intl.dart';
class SonarrEpisodeEntry {
@@ -10,6 +10,7 @@ class SonarrEpisodeEntry {
int seasonNumber;
int episodeNumber;
int episodeID;
+ int episodeFileID;
int size;
bool isMonitored;
bool hasFile;
@@ -23,6 +24,7 @@ class SonarrEpisodeEntry {
this.episodeNumber,
this.airDate,
this.episodeID,
+ this.episodeFileID,
this.isMonitored,
this.hasFile,
this.quality,
diff --git a/lib/logic/automation/sonarr/entry/history.dart b/lib/logic/automation/sonarr/entry/history.dart
index f21065d3..b2ae182a 100644
--- a/lib/logic/automation/sonarr/entry/history.dart
+++ b/lib/logic/automation/sonarr/entry/history.dart
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
-import 'package:lunasea/configuration/values.dart';
-import 'package:lunasea/system/constants.dart';
+import 'package:lunasea/core.dart';
+import 'package:lunasea/system.dart';
abstract class SonarrHistoryEntry {
String seriesTitle;
diff --git a/lib/logic/automation/sonarr/entry/missing.dart b/lib/logic/automation/sonarr/entry/missing.dart
index 578f8464..c2558df8 100644
--- a/lib/logic/automation/sonarr/entry/missing.dart
+++ b/lib/logic/automation/sonarr/entry/missing.dart
@@ -1,4 +1,4 @@
-import 'package:lunasea/configuration/values.dart';
+import 'package:lunasea/system.dart';
class SonarrMissingEntry {
String showTitle;
diff --git a/lib/logic/automation/sonarr/entry/search.dart b/lib/logic/automation/sonarr/entry/search.dart
index 9b4b3f31..d187be64 100644
--- a/lib/logic/automation/sonarr/entry/search.dart
+++ b/lib/logic/automation/sonarr/entry/search.dart
@@ -1,4 +1,4 @@
-import 'package:lunasea/system/functions.dart';
+import 'package:lunasea/core.dart';
class SonarrSearchEntry {
String title;
diff --git a/lib/logic/automation/sonarr/entry/upcoming.dart b/lib/logic/automation/sonarr/entry/upcoming.dart
index aced820d..6c479ceb 100644
--- a/lib/logic/automation/sonarr/entry/upcoming.dart
+++ b/lib/logic/automation/sonarr/entry/upcoming.dart
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
-import 'package:lunasea/configuration/values.dart';
-import 'package:lunasea/system/constants.dart';
+import 'package:lunasea/core.dart';
+import 'package:lunasea/system.dart';
class SonarrUpcomingEntry {
String seriesTitle;
diff --git a/lib/logic/calendar.dart b/lib/logic/calendar.dart
new file mode 100644
index 00000000..3ebfd5da
--- /dev/null
+++ b/lib/logic/calendar.dart
@@ -0,0 +1,2 @@
+export 'package:lunasea/logic/calendar/api.dart';
+export 'package:lunasea/logic/calendar/entry.dart';
diff --git a/lib/logic/calendar/api.dart b/lib/logic/calendar/api.dart
new file mode 100644
index 00000000..8991c303
--- /dev/null
+++ b/lib/logic/calendar/api.dart
@@ -0,0 +1,145 @@
+import 'dart:convert';
+import 'package:http/http.dart' as http;
+import 'package:intl/intl.dart';
+import 'package:lunasea/core.dart';
+import 'package:lunasea/system.dart';
+import 'package:lunasea/logic/abstracts.dart';
+import 'package:lunasea/logic/calendar.dart';
+
+class CalendarAPI extends API {
+ @override
+ void logError(String methodName, String text, Object error) {
+ Logger.error('package:lunasea/logic/home/api.dart', methodName, 'Home: $text', error, StackTrace.current);
+ }
+
+ @override
+ void logWarning(String methodName, String text) {
+ Logger.warning('package:lunasea/logic/home/api.dart', methodName, 'Home: $text');
+ }
+
+ Future