From 04dd38496c196c8575b557a3632b7a3aefe30af4 Mon Sep 17 00:00:00 2001 From: Bruno D'Luka Date: Tue, 3 Dec 2024 13:54:00 -0300 Subject: [PATCH 1/3] fix: Properly check if event is in the same day --- lib/api/events.dart | 2 +- .../events_timeline/events_playback.dart | 20 ++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/api/events.dart b/lib/api/events.dart index af29af27..0ee3ad78 100644 --- a/lib/api/events.dart +++ b/lib/api/events.dart @@ -198,6 +198,6 @@ extension EventsExtension on API { '${deviceId != null ? ' for device $deviceId' : ''}', ); - return events.where((e) => e.duration > const Duration(seconds: 5)); + return events; } } diff --git a/lib/screens/events_timeline/events_playback.dart b/lib/screens/events_timeline/events_playback.dart index 0a309fd9..08dde533 100644 --- a/lib/screens/events_timeline/events_playback.dart +++ b/lib/screens/events_timeline/events_playback.dart @@ -67,7 +67,7 @@ class _EventsPlaybackState extends EventsScreenState { DateTimeExtension.now().year, DateTimeExtension.now().month, DateTimeExtension.now().day, - ).toLocal(); + ); bool hasEverFetched = false; @@ -78,9 +78,8 @@ class _EventsPlaybackState extends EventsScreenState { final settings = context.read(); setState(() { hasEverFetched = true; - date = date.toLocal(); - startDate = DateTime(date.year, date.month, date.day).toLocal(); - endDate = DateTime(date.year, date.month, date.day, 23, 59, 59).toLocal(); + startDate = DateTime(date.year, date.month, date.day); + endDate = DateTime(date.year, date.month, date.day, 23, 59, 59); timeline?.dispose(); timeline = null; }); @@ -111,10 +110,17 @@ class _EventsPlaybackState extends EventsScreenState { return 0; }); for (final event in events) { - if (event.isAlarm || event.mediaURL == null) continue; + if (event.isAlarm || event.mediaURL == null) { + debugPrint('Removing corrupted event ${event.id}/${event.deviceID}.'); + continue; + } - if (!DateUtils.isSameDay(event.published, date) || - !DateUtils.isSameDay(event.published.add(event.duration), date)) { + if (!DateUtils.isSameDay(event.published.toLocal(), date.toLocal()) || + !DateUtils.isSameDay(event.published.add(event.duration).toLocal(), + date.toLocal())) { + debugPrint( + 'Removing future event ${event.id}/${event.deviceID}: ${event.published}.', + ); continue; } From 044d56a5140dbac26b68ff9e1a9ca42fde38b4f0 Mon Sep 17 00:00:00 2001 From: Bruno D'Luka Date: Tue, 3 Dec 2024 14:04:33 -0300 Subject: [PATCH 2/3] feat: Improve events logging --- lib/api/events.dart | 16 ++++++---- lib/models/event.dart | 2 +- lib/providers/events_provider.dart | 30 +++++++++++++++---- .../events_timeline/events_playback.dart | 20 +++++++++---- 4 files changed, 50 insertions(+), 18 deletions(-) diff --git a/lib/api/events.dart b/lib/api/events.dart index 0ee3ad78..06b60b3b 100644 --- a/lib/api/events.dart +++ b/lib/api/events.dart @@ -72,11 +72,12 @@ extension EventsExtension on API { allowUntrustedCertificates: data['allowUntrustedCertificates'] as bool, ); - debugPrint( + writeLogToFile( 'Getting events for server ${server.name} with limit $limit ' - '${startTime != null ? 'from $startTime ' : ''}' - '${endTime != null ? 'to $endTime ' : ''}' + '${startTime != null ? 'from $startTime ' : ''} ' + '${endTime != null ? 'to $endTime ' : ''} ' '${deviceId != null ? 'for device $deviceId' : ''}', + print: true, ); assert(server.serverUUID != null && server.hasCookies); @@ -155,7 +156,9 @@ extension EventsExtension on API { events = (jsonDecode(parser.toGData())['feed']['entry'] as Iterable) .map((item) { final e = item as Map; - if (!e.containsKey('content')) debugPrint(e.toString()); + if (!e.containsKey('content')) { + debugPrint('Event does not have a content: $e'); + } return Event( server: server, id: int.parse(e['id']['raw']), @@ -189,13 +192,14 @@ extension EventsExtension on API { handleError( error, stack, - 'Failed to getEvents on server ${server.name} $uri ${response.body}', + 'Failed to _getEvents on server ${server.name} $uri ${response.body}', ); } - debugPrint( + writeLogToFile( 'Loaded ${events.length} events for server ${server.name}' '${deviceId != null ? ' for device $deviceId' : ''}', + print: true, ); return events; diff --git a/lib/models/event.dart b/lib/models/event.dart index d1d54e61..83219ccf 100644 --- a/lib/models/event.dart +++ b/lib/models/event.dart @@ -124,7 +124,7 @@ class Event { @override String toString() { - return 'Event(server: $server, id: $id, deviceID: $deviceID, title: $title, publishedRaw: $publishedRaw, published: $published, updatedRaw: $updatedRaw, updated: $updated, category: $category, mediaID: $mediaID, mediaURL: $mediaURL)'; + return 'Event(server: ${server.ip}, id: $id, deviceID: $deviceID, title: $title, publishedRaw: $publishedRaw, published: $published, updatedRaw: $updatedRaw, updated: $updated, category: $category, mediaID: $mediaID, mediaURL: $mediaURL)'; } Map toJson() => { diff --git a/lib/providers/events_provider.dart b/lib/providers/events_provider.dart index d1abe9c2..164e142f 100644 --- a/lib/providers/events_provider.dart +++ b/lib/providers/events_provider.dart @@ -27,7 +27,7 @@ import 'package:bluecherry_client/providers/server_provider.dart'; import 'package:bluecherry_client/screens/events_browser/filter.dart'; import 'package:bluecherry_client/utils/constants.dart'; import 'package:bluecherry_client/utils/extensions.dart'; -import 'package:bluecherry_client/utils/logging.dart'; +import 'package:bluecherry_client/utils/logging.dart' as logging; import 'package:bluecherry_client/utils/storage.dart'; import 'package:flutter/foundation.dart'; @@ -201,18 +201,36 @@ extension EventsScreenProvider on EventsProvider { ..removeWhere((event) { if (!isDateSet) return false; - return event.published.toUtc().isBefore(startDate!.toUtc()) || - event.updated.toUtc().isAfter(endDate!.toUtc()); + final isToRemove = + event.published.toUtc().isBefore(startDate!.toUtc()) || + event.updated.toUtc().isAfter(endDate!.toUtc()); + + if (isToRemove) { + logging.writeLogToFile( + 'Removing future event ${event.id} ' + 'from ${event.server.name}/${event.deviceID}: ' + '{raw: ${event.publishedRaw}, parsed: ${event.published}}.', + print: true, + ); + } + return isToRemove; }) - ..sort( - (a, b) => b.published.toUtc().compareTo(a.published.toUtc())); + ..sort((a, b) => a.published.compareTo(b.published)); loadedEvents!.events[server] ??= []; loadedEvents!.events[server]!.addAll(iterable); + + if (iterable.isNotEmpty) { + logging.writeLogToFile( + 'First event: ${iterable.first}', + print: true, + ); + logging.writeLogToFile('Last event: ${iterable.last}', print: true); + } _notify(); })); } catch (error, stack) { - handleError(error, stack, 'Error loading events for $server'); + logging.handleError(error, stack, 'Error loading events for $server'); loadedEvents!.invalidResponses.add(server); } })); diff --git a/lib/screens/events_timeline/events_playback.dart b/lib/screens/events_timeline/events_playback.dart index 08dde533..b4c2b388 100644 --- a/lib/screens/events_timeline/events_playback.dart +++ b/lib/screens/events_timeline/events_playback.dart @@ -31,6 +31,7 @@ import 'package:bluecherry_client/screens/events_timeline/desktop/timeline_view. import 'package:bluecherry_client/screens/events_timeline/mobile/timeline_device_view.dart'; import 'package:bluecherry_client/utils/date.dart'; import 'package:bluecherry_client/utils/methods.dart'; +import 'package:bluecherry_client/utils/logging.dart' as logging; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; @@ -84,7 +85,7 @@ class _EventsPlaybackState extends EventsScreenState { timeline = null; }); - // if (true) { + // if (kDebugMode) { // setState(() => timeline = Timeline.dump()); // return; // } @@ -111,15 +112,21 @@ class _EventsPlaybackState extends EventsScreenState { }); for (final event in events) { if (event.isAlarm || event.mediaURL == null) { - debugPrint('Removing corrupted event ${event.id}/${event.deviceID}.'); + logging.writeLogToFile( + 'Removing corrupted event ${event.id} from ${event.server.name}/${event.deviceID}.', + print: true, + ); continue; } if (!DateUtils.isSameDay(event.published.toLocal(), date.toLocal()) || !DateUtils.isSameDay(event.published.add(event.duration).toLocal(), date.toLocal())) { - debugPrint( - 'Removing future event ${event.id}/${event.deviceID}: ${event.published}.', + logging.writeLogToFile( + 'Removing future event ${event.id} ' + 'from ${event.server.name}/${event.deviceID}: ' + '{raw: ${event.publishedRaw}, parsed: ${event.published}}.', + print: true, ); continue; } @@ -378,7 +385,10 @@ extension DevicesMapExtension on MapEntry> { TimelineTile buildTimelineTile(BuildContext context) { final device = key; final events = value; - debugPrint('Loaded ${events.length} events for $device'); + logging.writeLogToFile( + 'Loaded ${events.length} events for tile $device', + print: true, + ); return TimelineTile( device: device, From 36f5e7e8d1beae65805c3583a176eb9e7d7a9aec Mon Sep 17 00:00:00 2001 From: Bruno D'Luka Date: Tue, 3 Dec 2024 14:09:02 -0300 Subject: [PATCH 3/3] chore: Lints --- lib/screens/events_timeline/events_playback.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/screens/events_timeline/events_playback.dart b/lib/screens/events_timeline/events_playback.dart index b4c2b388..9cb60e59 100644 --- a/lib/screens/events_timeline/events_playback.dart +++ b/lib/screens/events_timeline/events_playback.dart @@ -30,8 +30,8 @@ import 'package:bluecherry_client/screens/events_timeline/desktop/timeline_sideb import 'package:bluecherry_client/screens/events_timeline/desktop/timeline_view.dart'; import 'package:bluecherry_client/screens/events_timeline/mobile/timeline_device_view.dart'; import 'package:bluecherry_client/utils/date.dart'; -import 'package:bluecherry_client/utils/methods.dart'; import 'package:bluecherry_client/utils/logging.dart' as logging; +import 'package:bluecherry_client/utils/methods.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart';