From e051a3ea5274ad85bb0ce47456b9b29cbffb1a42 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Tue, 1 Mar 2022 17:21:42 -0500 Subject: [PATCH 01/14] Implement Diaspora Contact Importing --- .../diaspora_contact_serializer.dart | 41 ++++++ .../models/friendica_timeline_entry.dart | 24 ++-- .../models/friendica_contact.dart | 13 +- .../services/diaspora_archive_service.dart | 127 ++++++++++++++++++ .../diaspora_profile_json_reader.dart | 25 ++++ .../src/services/friendica_connections.dart | 12 +- .../src/utils/top_interactors_generator.dart | 8 +- .../disapora_profile_json_reader_test.dart | 14 ++ 8 files changed, 238 insertions(+), 26 deletions(-) create mode 100644 friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart rename friendica_archive_browser/lib/src/{friendica => }/models/friendica_contact.dart (82%) create mode 100644 friendica_archive_browser/lib/src/services/diaspora_archive_service.dart create mode 100644 friendica_archive_browser/lib/src/services/diaspora_profile_json_reader.dart create mode 100644 friendica_archive_browser/test/disapora_profile_json_reader_test.dart diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart new file mode 100644 index 0000000..d60d00b --- /dev/null +++ b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart @@ -0,0 +1,41 @@ +import 'package:friendica_archive_browser/src/models/friendica_contact.dart'; + +Contact friendicaContactFromDiasporaJson(Map json) { + const network = "Diaspora"; + final accountId = json['account_id'] ?? ''; + final profileUrl = _profileUrlFromAccountId(accountId); + final name = json['person_name'] ?? ''; + final id = json['person_guid'] ?? ''; + final following = json['following'] ?? false; + final followed = json['followed'] ?? false; + var status = ConnectionStatus.none; + if (following && followed) { + status = ConnectionStatus.mutual; + } else if (following) { + status = ConnectionStatus.youFollowThem; + } else if (followed) { + status = ConnectionStatus.theyFollowYou; + } + + return Contact( + status: status, + name: name, + id: id, + profileUrl: profileUrl, + network: network); +} + +Uri _profileUrlFromAccountId(String accountId) { + if (accountId.isEmpty) { + return Uri(); + } + final accountIdPieces = accountId.split('@'); + if (accountIdPieces.length != 2) { + return Uri(); + } + + final userName = accountIdPieces[0]; + final server = accountIdPieces[1]; + + return Uri.parse('https://$server/u/$userName'); +} diff --git a/friendica_archive_browser/lib/src/friendica/models/friendica_timeline_entry.dart b/friendica_archive_browser/lib/src/friendica/models/friendica_timeline_entry.dart index 32cc935..676079d 100644 --- a/friendica_archive_browser/lib/src/friendica/models/friendica_timeline_entry.dart +++ b/friendica_archive_browser/lib/src/friendica/models/friendica_timeline_entry.dart @@ -1,5 +1,5 @@ -import 'package:friendica_archive_browser/src/friendica/models/friendica_contact.dart'; import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/models/friendica_contact.dart'; import 'package:friendica_archive_browser/src/services/friendica_connections.dart'; import 'package:friendica_archive_browser/src/utils/offsetdatetime_utils.dart'; import 'package:intl/intl.dart'; @@ -44,9 +44,9 @@ class FriendicaTimelineEntry { final List links; - final List likes; + final List likes; - final List dislikes; + final List dislikes; FriendicaTimelineEntry( {this.id = '', @@ -63,8 +63,8 @@ class FriendicaTimelineEntry { this.parentAuthorId = '', this.externalLink = '', this.locationData = const LocationData(), - this.likes = const [], - this.dislikes = const [], + this.likes = const [], + this.dislikes = const [], List? mediaAttachments, List? links}) : mediaAttachments = mediaAttachments ?? [], @@ -85,8 +85,8 @@ class FriendicaTimelineEntry { parentAuthor = 'Random parent author ${randomId()}', parentAuthorId = 'Random parent author id ${randomId()}', locationData = LocationData.randomBuilt(), - likes = const [], - dislikes = const [], + likes = const [], + dislikes = const [], links = [ Uri.parse('http://localhost/${randomId()}'), Uri.parse('http://localhost/${randomId()}') @@ -112,8 +112,8 @@ class FriendicaTimelineEntry { String? parentAuthorId, LocationData? locationData, List? mediaAttachments, - List? likes, - List? dislikes, + List? likes, + List? dislikes, List? links}) { return FriendicaTimelineEntry( creationTimestamp: creationTimestamp ?? this.creationTimestamp, @@ -207,15 +207,15 @@ class FriendicaTimelineEntry { .toList(); final likes = (json['friendica_activities']?['like'] as List? ?? []) - .map((json) => FriendicaContact.fromJson(json)) + .map((json) => Contact.fromJson(json)) .toList(); final dislikes = (json['friendica_activities']?['dislike'] as List? ?? []) - .map((json) => FriendicaContact.fromJson(json)) + .map((json) => Contact.fromJson(json)) .toList(); final announce = (json['friendica_activities']?['announce'] as List? ?? []) - .map((json) => FriendicaContact.fromJson(json)) + .map((json) => Contact.fromJson(json)) .toList(); for (final contact in [...likes, ...dislikes, ...announce]) { diff --git a/friendica_archive_browser/lib/src/friendica/models/friendica_contact.dart b/friendica_archive_browser/lib/src/models/friendica_contact.dart similarity index 82% rename from friendica_archive_browser/lib/src/friendica/models/friendica_contact.dart rename to friendica_archive_browser/lib/src/models/friendica_contact.dart index 2374460..62aef8f 100644 --- a/friendica_archive_browser/lib/src/friendica/models/friendica_contact.dart +++ b/friendica_archive_browser/lib/src/models/friendica_contact.dart @@ -1,4 +1,4 @@ -class FriendicaContact { +class Contact { final ConnectionStatus status; final String name; @@ -9,14 +9,14 @@ class FriendicaContact { final String network; - FriendicaContact( + Contact( {required this.status, required this.name, required this.id, required this.profileUrl, required this.network}); - static FriendicaContact fromJson(Map json) { + static Contact fromJson(Map json) { final status = (json['following'] ?? '') == 'true' ? ConnectionStatus.youFollowThem : ConnectionStatus.none; @@ -25,13 +25,18 @@ class FriendicaContact { final profileUrl = Uri.parse(json['url'] ?? ''); final network = json['network'] ?? 'unkn'; - return FriendicaContact( + return Contact( status: status, name: name, id: id, profileUrl: profileUrl, network: network); } + + @override + String toString() { + return 'FriendicaContact{status: $status, name: $name, id: $id, profileUrl: $profileUrl, network: $network}'; + } } enum ConnectionStatus { diff --git a/friendica_archive_browser/lib/src/services/diaspora_archive_service.dart b/friendica_archive_browser/lib/src/services/diaspora_archive_service.dart new file mode 100644 index 0000000..ba1a841 --- /dev/null +++ b/friendica_archive_browser/lib/src/services/diaspora_archive_service.dart @@ -0,0 +1,127 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:path/path.dart' as p; +import 'package:result_monad/result_monad.dart'; + +import '../friendica/models/friendica_entry_tree_item.dart'; +import '../friendica/models/friendica_timeline_entry.dart'; +import '../friendica/services/path_mapping_service.dart'; +import '../models/local_image_archive_entry.dart'; +import '../utils/exec_error.dart'; +import 'friendica_connections.dart'; + +class DiasporaArchiveService { + final PathMappingService pathMappingService; + final Map _imagesByRequestUrl = {}; + final List _postEntries = []; + final List _orphanedCommentEntries = []; + final List _allComments = []; + final FriendicaConnections connections = FriendicaConnections(); + String _ownersName = ''; + + DiasporaArchiveService({required this.pathMappingService}); + + String get ownersName => _ownersName; + + void clearCaches() { + connections.clearCaches(); + _imagesByRequestUrl.clear(); + _orphanedCommentEntries.clear(); + _allComments.clear(); + _postEntries.clear(); + } + + FutureResult, ExecError> getPosts() async { + if (_postEntries.isEmpty && _allComments.isEmpty) { + _loadEntries(); + } + + return Result.ok(_postEntries); + } + + FutureResult, ExecError> getAllComments() async { + if (_postEntries.isEmpty && _allComments.isEmpty) { + _loadEntries(); + } + + return Result.ok(_allComments); + } + + FutureResult, ExecError> + getOrphanedComments() async { + if (_postEntries.isEmpty && _allComments.isEmpty) { + _loadEntries(); + } + + return Result.ok(_orphanedCommentEntries); + } + + Result getImageByUrl(String url) { + if (_imagesByRequestUrl.isEmpty) { + _loadImages(); + } + + final result = _imagesByRequestUrl[url]; + return result == null + ? Result.error(ExecError(errorMessage: '$url not found')) + : Result.ok(result); + } + + String get _baseArchiveFolder => pathMappingService.rootFolder; + + void _loadEntries() { + final entriesJsonPath = p.join(_baseArchiveFolder, 'postsAndComments.json'); + final jsonFile = File(entriesJsonPath); + if (jsonFile.existsSync()) { + final json = jsonDecode(jsonFile.readAsStringSync()) as List; + final entries = + json.map((j) => FriendicaTimelineEntry.fromJson(j, connections)); + final topLevelEntries = + entries.where((element) => element.parentId.isEmpty); + final commentEntries = + entries.where((element) => element.parentId.isNotEmpty).toList(); + final entryTrees = {}; + + final postTreeEntries = []; + for (final entry in topLevelEntries) { + final treeEntry = FriendicaEntryTreeItem(entry, false); + entryTrees[entry.id] = treeEntry; + postTreeEntries.add(treeEntry); + } + + final commentTreeEntries = []; + commentEntries.sort( + (c1, c2) => c1.creationTimestamp.compareTo(c2.creationTimestamp)); + for (final entry in commentEntries) { + final parent = entryTrees[entry.parentId]; + final treeEntry = FriendicaEntryTreeItem(entry, parent == null); + parent?.addChild(treeEntry); + entryTrees[entry.id] = treeEntry; + commentTreeEntries.add(treeEntry); + } + + _postEntries.clear(); + _postEntries.addAll(postTreeEntries); + + _allComments.clear(); + _allComments.addAll(commentTreeEntries); + + _orphanedCommentEntries.clear(); + _orphanedCommentEntries + .addAll(entryTrees.values.where((element) => element.isOrphaned)); + } + } + + void _loadImages() { + final imageJsonPath = p.join(_baseArchiveFolder, 'images.json'); + final jsonFile = File(imageJsonPath); + if (jsonFile.existsSync()) { + final json = jsonDecode(jsonFile.readAsStringSync()) as List; + final imageEntries = json.map((j) => ImageEntry.fromJson(j)); + for (final entry in imageEntries) { + _imagesByRequestUrl[entry.url] = entry; + } + } + } +} diff --git a/friendica_archive_browser/lib/src/services/diaspora_profile_json_reader.dart b/friendica_archive_browser/lib/src/services/diaspora_profile_json_reader.dart new file mode 100644 index 0000000..f4dab26 --- /dev/null +++ b/friendica_archive_browser/lib/src/services/diaspora_profile_json_reader.dart @@ -0,0 +1,25 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:friendica_archive_browser/src/diaspora/serializers/diaspora_contact_serializer.dart'; +import 'package:friendica_archive_browser/src/models/friendica_contact.dart'; + +class DiasporaProfileJsonReader { + final String jsonFilePath; + + DiasporaProfileJsonReader(this.jsonFilePath); + + List readContacts() { + final jsonFile = File(jsonFilePath); + if (jsonFile.existsSync()) { + final json = + jsonDecode(jsonFile.readAsStringSync()) as Map; + final contactsJson = json['user']?['contacts'] as List; + final contacts = + contactsJson.map((j) => friendicaContactFromDiasporaJson(j)).toList(); + return contacts; + } + + return []; + } +} diff --git a/friendica_archive_browser/lib/src/services/friendica_connections.dart b/friendica_archive_browser/lib/src/services/friendica_connections.dart index bd665e0..e3a36df 100644 --- a/friendica_archive_browser/lib/src/services/friendica_connections.dart +++ b/friendica_archive_browser/lib/src/services/friendica_connections.dart @@ -1,16 +1,16 @@ -import 'package:friendica_archive_browser/src/friendica/models/friendica_contact.dart'; +import 'package:friendica_archive_browser/src/models/friendica_contact.dart'; import 'package:result_monad/result_monad.dart'; class FriendicaConnections { - final _connectionsById = {}; - final _connectionsByName = {}; + final _connectionsById = {}; + final _connectionsByName = {}; void clearCaches() { _connectionsById.clear(); _connectionsByName.clear(); } - bool addConnection(FriendicaContact contact) { + bool addConnection(Contact contact) { if (_connectionsById.containsKey(contact.id)) { return false; } @@ -20,13 +20,13 @@ class FriendicaConnections { return true; } - Result getById(String id) { + Result getById(String id) { final result = _connectionsById[id]; return result != null ? Result.ok(result) : Result.error('$id not found'); } - Result getByName(String name) { + Result getByName(String name) { final result = _connectionsByName[name]; return result != null ? Result.ok(result) : Result.error('$name not found'); diff --git a/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart b/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart index 47d7798..be2eccc 100644 --- a/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart +++ b/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart @@ -1,5 +1,5 @@ -import 'package:friendica_archive_browser/src/friendica/models/friendica_contact.dart'; import 'package:friendica_archive_browser/src/friendica/models/friendica_timeline_entry.dart'; +import 'package:friendica_archive_browser/src/models/friendica_contact.dart'; import 'package:friendica_archive_browser/src/services/friendica_connections.dart'; class TopInteractorsGenerator { @@ -66,7 +66,7 @@ class TopInteractorsGenerator { final contact = contacts.getById(id).fold( onSuccess: (contact) => contact, - onError: (error) => FriendicaContact( + onError: (error) => Contact( status: ConnectionStatus.none, name: '', id: id, @@ -77,7 +77,7 @@ class TopInteractorsGenerator { } class InteractorItem { - final FriendicaContact contact; + final Contact contact; final int resharedOrCommentedOn; final int likeCount; final int dislikeCount; @@ -94,7 +94,7 @@ class InteractorItem { } InteractorItem copy( - {FriendicaContact? contact, + {Contact? contact, int? resharedOrCommentedOn, int? likeCount, int? dislikeCount}) { diff --git a/friendica_archive_browser/test/disapora_profile_json_reader_test.dart b/friendica_archive_browser/test/disapora_profile_json_reader_test.dart new file mode 100644 index 0000000..7877b9b --- /dev/null +++ b/friendica_archive_browser/test/disapora_profile_json_reader_test.dart @@ -0,0 +1,14 @@ +// ignore_for_file: avoid_print + +import 'package:flutter_test/flutter_test.dart'; +import 'package:friendica_archive_browser/src/services/diaspora_profile_json_reader.dart'; + +void main() { + test('Diaspora Connections Test', () { + final reader = DiasporaProfileJsonReader( + '/Users/hankdev/Desktop/diaspora_pretty.json'); + final contacts = reader.readContacts(); + print(contacts.length); + print(contacts.first); + }); +} From e84bbf2c09df3143ff4d026df62b2b21436b6c98 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Tue, 1 Mar 2022 17:23:11 -0500 Subject: [PATCH 02/14] Refactor services so in individual network type folders --- friendica_archive_browser/lib/src/app.dart | 6 +++--- .../src/components/top_interactactors_widget.dart | 2 +- .../services/diaspora_archive_service.dart | 14 +++++++------- .../services/diaspora_profile_json_reader.dart | 0 .../components/media_timeline_component.dart | 6 +++--- .../components/media_wrapper_component.dart | 10 +++++----- .../src/friendica/components/tree_entry_card.dart | 4 ++-- .../models/friendica_media_attachment.dart | 4 ++-- .../friendica/models/friendica_timeline_entry.dart | 6 +++--- .../src/friendica/screens/geospatial_screen.dart | 12 ++++++------ .../friendica/screens/media_slideshow_screen.dart | 4 ++-- .../lib/src/friendica/screens/stats_screen.dart | 2 +- .../services/friendica_archive_service.dart | 6 +++--- .../services/friendica_connections.dart | 0 ...ce.dart => friendica_path_mapping_service.dart} | 6 +++--- friendica_archive_browser/lib/src/home.dart | 2 +- .../lib/src/utils/top_interactors_generator.dart | 2 +- .../test/disapora_profile_json_reader_test.dart | 2 +- 18 files changed, 44 insertions(+), 44 deletions(-) rename friendica_archive_browser/lib/src/{ => diaspora}/services/diaspora_archive_service.dart (90%) rename friendica_archive_browser/lib/src/{ => diaspora}/services/diaspora_profile_json_reader.dart (100%) rename friendica_archive_browser/lib/src/{ => friendica}/services/friendica_archive_service.dart (96%) rename friendica_archive_browser/lib/src/{ => friendica}/services/friendica_connections.dart (100%) rename friendica_archive_browser/lib/src/friendica/services/{path_mapping_service.dart => friendica_path_mapping_service.dart} (93%) diff --git a/friendica_archive_browser/lib/src/app.dart b/friendica_archive_browser/lib/src/app.dart index 99bd088..e195243 100644 --- a/friendica_archive_browser/lib/src/app.dart +++ b/friendica_archive_browser/lib/src/app.dart @@ -2,12 +2,12 @@ import 'package:desktop_window/desktop_window.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:friendica_archive_browser/src/services/friendica_archive_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_archive_service.dart'; import 'package:friendica_archive_browser/src/themes.dart'; import 'package:friendica_archive_browser/src/utils/scrolling_behavior.dart'; import 'package:provider/provider.dart'; -import 'friendica/services/path_mapping_service.dart'; +import 'friendica/services/friendica_path_mapping_service.dart'; import 'home.dart'; import 'settings/settings_controller.dart'; @@ -25,7 +25,7 @@ class FriendicaArchiveBrowser extends StatelessWidget { @override Widget build(BuildContext context) { DesktopWindow.setMinWindowSize(minAppSize); - final pathMappingService = PathMappingService(settingsController); + final pathMappingService = FriendicaPathMappingService(settingsController); final friendicaArchiveService = FriendicaArchiveService(pathMappingService: pathMappingService); settingsController.addListener(() { diff --git a/friendica_archive_browser/lib/src/components/top_interactactors_widget.dart b/friendica_archive_browser/lib/src/components/top_interactactors_widget.dart index f9ec53f..faf9414 100644 --- a/friendica_archive_browser/lib/src/components/top_interactactors_widget.dart +++ b/friendica_archive_browser/lib/src/components/top_interactactors_widget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:friendica_archive_browser/src/models/time_element.dart'; -import 'package:friendica_archive_browser/src/services/friendica_connections.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_connections.dart'; import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; import 'package:friendica_archive_browser/src/utils/top_interactors_generator.dart'; import 'package:logging/logging.dart'; diff --git a/friendica_archive_browser/lib/src/services/diaspora_archive_service.dart b/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart similarity index 90% rename from friendica_archive_browser/lib/src/services/diaspora_archive_service.dart rename to friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart index ba1a841..c0c13e1 100644 --- a/friendica_archive_browser/lib/src/services/diaspora_archive_service.dart +++ b/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart @@ -4,15 +4,15 @@ import 'dart:io'; import 'package:path/path.dart' as p; import 'package:result_monad/result_monad.dart'; -import '../friendica/models/friendica_entry_tree_item.dart'; -import '../friendica/models/friendica_timeline_entry.dart'; -import '../friendica/services/path_mapping_service.dart'; -import '../models/local_image_archive_entry.dart'; -import '../utils/exec_error.dart'; -import 'friendica_connections.dart'; +import '../../friendica/models/friendica_entry_tree_item.dart'; +import '../../friendica/models/friendica_timeline_entry.dart'; +import '../../friendica/services/friendica_path_mapping_service.dart'; +import '../../models/local_image_archive_entry.dart'; +import '../../utils/exec_error.dart'; +import '../../friendica/services/friendica_connections.dart'; class DiasporaArchiveService { - final PathMappingService pathMappingService; + final FriendicaPathMappingService pathMappingService; final Map _imagesByRequestUrl = {}; final List _postEntries = []; final List _orphanedCommentEntries = []; diff --git a/friendica_archive_browser/lib/src/services/diaspora_profile_json_reader.dart b/friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart similarity index 100% rename from friendica_archive_browser/lib/src/services/diaspora_profile_json_reader.dart rename to friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart diff --git a/friendica_archive_browser/lib/src/friendica/components/media_timeline_component.dart b/friendica_archive_browser/lib/src/friendica/components/media_timeline_component.dart index b474c6e..edc3e98 100644 --- a/friendica_archive_browser/lib/src/friendica/components/media_timeline_component.dart +++ b/friendica_archive_browser/lib/src/friendica/components/media_timeline_component.dart @@ -3,8 +3,8 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:friendica_archive_browser/src/friendica/models/friendica_media_attachment.dart'; import 'package:friendica_archive_browser/src/friendica/screens/media_slideshow_screen.dart'; -import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; -import 'package:friendica_archive_browser/src/services/friendica_archive_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_archive_service.dart'; import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; import 'package:provider/provider.dart'; @@ -28,7 +28,7 @@ class MediaTimelineComponent extends StatelessWidget { final double singleWidth = MediaQuery.of(context).size.width / 2.0; final double threeAcrossWidth = MediaQuery.of(context).size.width / 3.0; final double preferredMultiWidth = min(threeAcrossWidth, _maxHeightWidth); - final pathMapper = Provider.of(context); + final pathMapper = Provider.of(context); final archiveService = Provider.of(context); final settingsController = Provider.of(context); diff --git a/friendica_archive_browser/lib/src/friendica/components/media_wrapper_component.dart b/friendica_archive_browser/lib/src/friendica/components/media_wrapper_component.dart index 0b0dfc5..6929695 100644 --- a/friendica_archive_browser/lib/src/friendica/components/media_wrapper_component.dart +++ b/friendica_archive_browser/lib/src/friendica/components/media_wrapper_component.dart @@ -3,8 +3,8 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:friendica_archive_browser/src/friendica/models/friendica_media_attachment.dart'; -import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; -import 'package:friendica_archive_browser/src/services/friendica_archive_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_archive_service.dart'; import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; import 'package:logging/logging.dart'; @@ -28,7 +28,7 @@ class MediaWrapperComponent extends StatelessWidget { @override Widget build(BuildContext context) { final settingsController = Provider.of(context); - final pathMapper = Provider.of(context); + final pathMapper = Provider.of(context); final archiveService = Provider.of(context); final videoPlayerCommand = settingsController.videoPlayerCommand; final path = _calculatePath(pathMapper, archiveService); @@ -111,7 +111,7 @@ class MediaWrapperComponent extends StatelessWidget { } } - _ImageAndPathResult _uriToImage(Uri uri, PathMappingService mapper, + _ImageAndPathResult _uriToImage(Uri uri, FriendicaPathMappingService mapper, {String imageTypeName = 'image'}) { if (uri.toString().startsWith('https://interncache')) { return _ImageAndPathResult.none(); @@ -173,7 +173,7 @@ class MediaWrapperComponent extends StatelessWidget { } String _calculatePath( - PathMappingService pathMapper, FriendicaArchiveService archiveService) { + FriendicaPathMappingService pathMapper, FriendicaArchiveService archiveService) { final url = mediaAttachment.uri.toString(); String basePath = ''; if (url.startsWith('http')) { diff --git a/friendica_archive_browser/lib/src/friendica/components/tree_entry_card.dart b/friendica_archive_browser/lib/src/friendica/components/tree_entry_card.dart index 6e30981..396e0f5 100644 --- a/friendica_archive_browser/lib/src/friendica/components/tree_entry_card.dart +++ b/friendica_archive_browser/lib/src/friendica/components/tree_entry_card.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart'; import 'package:friendica_archive_browser/src/friendica/models/friendica_entry_tree_item.dart'; import 'package:friendica_archive_browser/src/friendica/models/location_data.dart'; -import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; import 'package:friendica_archive_browser/src/utils/clipboard_helper.dart'; import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; @@ -32,7 +32,7 @@ class TreeEntryCard extends StatelessWidget { const double spacingHeight = 5.0; final formatter = Provider.of(context).dateTimeFormatter; - final mapper = Provider.of(context); + final mapper = Provider.of(context); final entry = treeEntry.entry; diff --git a/friendica_archive_browser/lib/src/friendica/models/friendica_media_attachment.dart b/friendica_archive_browser/lib/src/friendica/models/friendica_media_attachment.dart index 178c8f1..a80e21f 100644 --- a/friendica_archive_browser/lib/src/friendica/models/friendica_media_attachment.dart +++ b/friendica_archive_browser/lib/src/friendica/models/friendica_media_attachment.dart @@ -1,6 +1,6 @@ import 'dart:io'; -import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; import 'model_utils.dart'; @@ -71,7 +71,7 @@ class FriendicaMediaAttachment { return 'FriendicaMediaAttachment{uri: $uri, creationTimestamp: $creationTimestamp, type: $explicitType, metadata: $metadata, title: $title, description: $description}'; } - String toHumanString(PathMappingService mapper) { + String toHumanString(FriendicaPathMappingService mapper) { if (uri.scheme.startsWith('http')) { return uri.toString(); } diff --git a/friendica_archive_browser/lib/src/friendica/models/friendica_timeline_entry.dart b/friendica_archive_browser/lib/src/friendica/models/friendica_timeline_entry.dart index 676079d..af27b6c 100644 --- a/friendica_archive_browser/lib/src/friendica/models/friendica_timeline_entry.dart +++ b/friendica_archive_browser/lib/src/friendica/models/friendica_timeline_entry.dart @@ -1,6 +1,6 @@ -import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; import 'package:friendica_archive_browser/src/models/friendica_contact.dart'; -import 'package:friendica_archive_browser/src/services/friendica_connections.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_connections.dart'; import 'package:friendica_archive_browser/src/utils/offsetdatetime_utils.dart'; import 'package:intl/intl.dart'; import 'package:logging/logging.dart'; @@ -142,7 +142,7 @@ class FriendicaTimelineEntry { return 'FriendicaTimelineEntry{id: $id, isReshare: $isReshare, parentId: $parentId, creationTimestamp: $creationTimestamp, modificationTimestamp: $modificationTimestamp, backdatedTimeStamp: $backdatedTimestamp, post: $body, title: $title, author: $author, parentAuthor: $parentAuthor mediaAttachments: $mediaAttachments, links: $links}'; } - String toHumanString(PathMappingService mapper, DateFormat formatter) { + String toHumanString(FriendicaPathMappingService mapper, DateFormat formatter) { final creationDateString = formatter.format( DateTime.fromMillisecondsSinceEpoch(creationTimestamp * 1000) .toLocal()); diff --git a/friendica_archive_browser/lib/src/friendica/screens/geospatial_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/geospatial_screen.dart index 9ca32dc..f652321 100644 --- a/friendica_archive_browser/lib/src/friendica/screens/geospatial_screen.dart +++ b/friendica_archive_browser/lib/src/friendica/screens/geospatial_screen.dart @@ -8,11 +8,11 @@ import 'package:friendica_archive_browser/src/friendica/components/geo/marker_da import 'package:friendica_archive_browser/src/friendica/components/tree_entry_card.dart'; import 'package:friendica_archive_browser/src/friendica/models/friendica_entry_tree_item.dart'; import 'package:friendica_archive_browser/src/friendica/models/friendica_timeline_entry.dart'; -import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; import 'package:friendica_archive_browser/src/screens/error_screen.dart'; import 'package:friendica_archive_browser/src/screens/loading_status_screen.dart'; import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; -import 'package:friendica_archive_browser/src/services/friendica_archive_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_archive_service.dart'; import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; import 'package:friendica_archive_browser/src/utils/exec_error.dart'; import 'package:friendica_archive_browser/src/utils/temp_file_builder.dart'; @@ -178,7 +178,7 @@ class _GeospatialViewState extends State { _logger.finer('Call Geospatial builder'); final formatter = Provider.of(context).dateTimeFormatter; - final mapper = Provider.of(context); + final mapper = Provider.of(context); _updatePostsInBoundsFilter(); final map = _buildMap(context, formatter, mapper); @@ -204,7 +204,7 @@ class _GeospatialViewState extends State { } Widget _buildPostList( - BuildContext context, DateFormat formatter, PathMappingService mapper) { + BuildContext context, DateFormat formatter, FriendicaPathMappingService mapper) { _logger.finest(() => 'Building PostList with ${postsInList.length} items'); if (postsInList.isEmpty) { return const StandInStatusScreen( @@ -225,7 +225,7 @@ class _GeospatialViewState extends State { } Widget _buildMap( - BuildContext context, DateFormat formatter, PathMappingService mapper) { + BuildContext context, DateFormat formatter, FriendicaPathMappingService mapper) { final settings = Provider.of(context); final shouldDebugCache = @@ -333,7 +333,7 @@ class _GeospatialViewState extends State { } Widget _buildMarkerWidget( - MarkerData data, DateFormat formatter, PathMappingService mapper) { + MarkerData data, DateFormat formatter, FriendicaPathMappingService mapper) { return Positioned( left: data.pos.dx - 16, top: data.pos.dy - 16, diff --git a/friendica_archive_browser/lib/src/friendica/screens/media_slideshow_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/media_slideshow_screen.dart index bbb2e9a..5a23cf1 100644 --- a/friendica_archive_browser/lib/src/friendica/screens/media_slideshow_screen.dart +++ b/friendica_archive_browser/lib/src/friendica/screens/media_slideshow_screen.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:friendica_archive_browser/src/friendica/components/media_wrapper_component.dart'; import 'package:friendica_archive_browser/src/friendica/models/friendica_media_attachment.dart'; -import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; import 'package:friendica_archive_browser/src/themes.dart'; import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; @@ -155,7 +155,7 @@ class _MediaSlideShowScreenState extends State { } Future _saveFile(BuildContext context) async { - final pathMapper = Provider.of(context, listen: false); + final pathMapper = Provider.of(context, listen: false); final filename = media.uri.pathSegments.last; final initialPath = pathMapper.toFullPath(media.uri.toFilePath()); diff --git a/friendica_archive_browser/lib/src/friendica/screens/stats_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/stats_screen.dart index c4e25d9..53cfeae 100644 --- a/friendica_archive_browser/lib/src/friendica/screens/stats_screen.dart +++ b/friendica_archive_browser/lib/src/friendica/screens/stats_screen.dart @@ -7,7 +7,7 @@ import 'package:friendica_archive_browser/src/friendica/components/filter_contro import 'package:friendica_archive_browser/src/friendica/models/model_utils.dart'; import 'package:friendica_archive_browser/src/models/time_element.dart'; import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; -import 'package:friendica_archive_browser/src/services/friendica_archive_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_archive_service.dart'; import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; diff --git a/friendica_archive_browser/lib/src/services/friendica_archive_service.dart b/friendica_archive_browser/lib/src/friendica/services/friendica_archive_service.dart similarity index 96% rename from friendica_archive_browser/lib/src/services/friendica_archive_service.dart rename to friendica_archive_browser/lib/src/friendica/services/friendica_archive_service.dart index 77d6711..8af914d 100644 --- a/friendica_archive_browser/lib/src/services/friendica_archive_service.dart +++ b/friendica_archive_browser/lib/src/friendica/services/friendica_archive_service.dart @@ -4,15 +4,15 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:friendica_archive_browser/src/friendica/models/friendica_entry_tree_item.dart'; import 'package:friendica_archive_browser/src/friendica/models/friendica_timeline_entry.dart'; -import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; import 'package:friendica_archive_browser/src/models/local_image_archive_entry.dart'; -import 'package:friendica_archive_browser/src/services/friendica_connections.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_connections.dart'; import 'package:friendica_archive_browser/src/utils/exec_error.dart'; import 'package:path/path.dart' as p; import 'package:result_monad/result_monad.dart'; class FriendicaArchiveService extends ChangeNotifier { - final PathMappingService pathMappingService; + final FriendicaPathMappingService pathMappingService; final Map _imagesByRequestUrl = {}; final List _postEntries = []; final List _orphanedCommentEntries = []; diff --git a/friendica_archive_browser/lib/src/services/friendica_connections.dart b/friendica_archive_browser/lib/src/friendica/services/friendica_connections.dart similarity index 100% rename from friendica_archive_browser/lib/src/services/friendica_connections.dart rename to friendica_archive_browser/lib/src/friendica/services/friendica_connections.dart diff --git a/friendica_archive_browser/lib/src/friendica/services/path_mapping_service.dart b/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart similarity index 93% rename from friendica_archive_browser/lib/src/friendica/services/path_mapping_service.dart rename to friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart index 4b5182d..9412695 100644 --- a/friendica_archive_browser/lib/src/friendica/services/path_mapping_service.dart +++ b/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart @@ -4,12 +4,12 @@ import 'package:friendica_archive_browser/src/settings/settings_controller.dart' import 'package:logging/logging.dart'; import 'package:path/path.dart' as p; -class PathMappingService { - static final _logger = Logger('$PathMappingService'); +class FriendicaPathMappingService { + static final _logger = Logger('$FriendicaPathMappingService'); final SettingsController settings; final _archiveDirectories = []; - PathMappingService(this.settings) { + FriendicaPathMappingService(this.settings) { refresh(); } diff --git a/friendica_archive_browser/lib/src/home.dart b/friendica_archive_browser/lib/src/home.dart index 9f8187f..2adfae3 100644 --- a/friendica_archive_browser/lib/src/home.dart +++ b/friendica_archive_browser/lib/src/home.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/services/friendica_archive_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_archive_service.dart'; import 'friendica/screens/entries_screen.dart'; import 'friendica/screens/stats_screen.dart'; diff --git a/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart b/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart index be2eccc..4270dd1 100644 --- a/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart +++ b/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart @@ -1,6 +1,6 @@ import 'package:friendica_archive_browser/src/friendica/models/friendica_timeline_entry.dart'; import 'package:friendica_archive_browser/src/models/friendica_contact.dart'; -import 'package:friendica_archive_browser/src/services/friendica_connections.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_connections.dart'; class TopInteractorsGenerator { final _interactors = {}; diff --git a/friendica_archive_browser/test/disapora_profile_json_reader_test.dart b/friendica_archive_browser/test/disapora_profile_json_reader_test.dart index 7877b9b..b7366ee 100644 --- a/friendica_archive_browser/test/disapora_profile_json_reader_test.dart +++ b/friendica_archive_browser/test/disapora_profile_json_reader_test.dart @@ -1,7 +1,7 @@ // ignore_for_file: avoid_print import 'package:flutter_test/flutter_test.dart'; -import 'package:friendica_archive_browser/src/services/diaspora_profile_json_reader.dart'; +import 'package:friendica_archive_browser/src/diaspora/services/diaspora_profile_json_reader.dart'; void main() { test('Diaspora Connections Test', () { From b8b40ebe5ba7ca5b519b7552be2383fff45f1417 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Fri, 4 Mar 2022 15:02:09 -0500 Subject: [PATCH 03/14] Fix loading issue when can't read the previous run's archive dir. --- .../lib/src/settings/settings_controller.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/friendica_archive_browser/lib/src/settings/settings_controller.dart b/friendica_archive_browser/lib/src/settings/settings_controller.dart index 8f470c9..0b746d4 100644 --- a/friendica_archive_browser/lib/src/settings/settings_controller.dart +++ b/friendica_archive_browser/lib/src/settings/settings_controller.dart @@ -6,6 +6,7 @@ import 'package:friendica_archive_browser/src/utils/temp_file_builder.dart'; import 'package:intl/intl.dart'; import 'package:logging/logging.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:result_monad/result_monad.dart'; import 'settings_service.dart'; @@ -19,6 +20,10 @@ class SettingsController with ChangeNotifier { Future loadSettings() async { _themeMode = await _settingsService.themeMode(); _rootFolder = await _settingsService.rootFolder(); + var canReadRootDir = runCatching(()=>Result.ok(Directory(_rootFolder).listSync())).isSuccess; + if (!canReadRootDir) { + _rootFolder = ''; + } _videoPlayerSettingType = await _settingsService.videoPlayerSettingType(); _videoPlayerCommand = await _settingsService.videoPlayerCommand(); _dateTimeFormatter = DateFormat('MMMM dd yyyy h:mm a'); From 1deaebd94e843b5405db04461337e1e0312ab7bd Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Tue, 8 Mar 2022 16:22:17 -0500 Subject: [PATCH 04/14] D* (minus photos) and Friendica loading in UI. --- friendica_archive_browser/lib/src/app.dart | 16 +- .../components/top_interactactors_widget.dart | 4 +- .../diaspora_contact_serializer.dart | 6 +- .../diaspora_posts_serializer.dart | 97 +++++++ .../services/diaspora_archive_service.dart | 93 +++---- .../diaspora_path_mapping_service.dart | 54 ++++ .../diaspora_profile_json_reader.dart | 55 +++- .../components/geo/geo_extensions.dart | 4 +- .../friendica/components/geo/marker_data.dart | 4 +- .../components/media_timeline_component.dart | 11 +- .../components/media_wrapper_component.dart | 31 ++- .../friendica/components/tree_entry_card.dart | 18 +- .../models/friendica_entry_tree_item.dart | 19 -- .../models/friendica_timeline_entry.dart | 246 ------------------ .../src/friendica/screens/entries_screen.dart | 13 +- .../friendica/screens/geospatial_screen.dart | 30 +-- .../screens/media_slideshow_screen.dart | 9 +- .../src/friendica/screens/stats_screen.dart | 10 +- .../friendica_contact_serializer.dart | 18 ++ ...friendica_media_attachment_serializer.dart | 25 ++ .../friendica_timeline_entry_serializer.dart | 72 +++++ .../services/friendica_archive_service.dart | 45 ++-- .../services/friendica_connections.dart | 34 --- .../friendica_path_mapping_service.dart | 4 +- friendica_archive_browser/lib/src/home.dart | 4 +- .../lib/src/models/archive_types_enum.dart | 5 + .../lib/src/models/connection.dart | 46 ++++ .../lib/src/models/entry_tree_item.dart | 18 ++ .../lib/src/models/friendica_contact.dart | 62 ----- .../{friendica => }/models/location_data.dart | 0 .../media_attachment.dart} | 48 ++-- .../{friendica => }/models/model_utils.dart | 0 .../lib/src/models/time_element.dart | 4 +- .../lib/src/models/timeline_entry.dart | 160 ++++++++++++ .../services/archive_service_interface.dart | 31 +++ .../services/archive_service_provider.dart | 70 +++++ .../lib/src/services/connections_manager.dart | 46 ++++ .../path_mapper_service_interface.dart | 12 + .../lib/src/settings/settings_controller.dart | 17 +- .../lib/src/settings/settings_service.dart | 18 ++ .../lib/src/settings/settings_view.dart | 15 ++ .../lib/src/utils/offsetdatetime_utils.dart | 20 +- .../src/utils/top_interactors_generator.dart | 17 +- friendica_archive_browser/pubspec.lock | 14 + friendica_archive_browser/pubspec.yaml | 1 + .../test/additional_key_logger_test.dart | 2 +- .../disapora_profile_json_reader_test.dart | 23 +- 47 files changed, 970 insertions(+), 581 deletions(-) create mode 100644 friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart create mode 100644 friendica_archive_browser/lib/src/diaspora/services/diaspora_path_mapping_service.dart delete mode 100644 friendica_archive_browser/lib/src/friendica/models/friendica_entry_tree_item.dart delete mode 100644 friendica_archive_browser/lib/src/friendica/models/friendica_timeline_entry.dart create mode 100644 friendica_archive_browser/lib/src/friendica/serializers/friendica_contact_serializer.dart create mode 100644 friendica_archive_browser/lib/src/friendica/serializers/friendica_media_attachment_serializer.dart create mode 100644 friendica_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart delete mode 100644 friendica_archive_browser/lib/src/friendica/services/friendica_connections.dart create mode 100644 friendica_archive_browser/lib/src/models/archive_types_enum.dart create mode 100644 friendica_archive_browser/lib/src/models/connection.dart create mode 100644 friendica_archive_browser/lib/src/models/entry_tree_item.dart delete mode 100644 friendica_archive_browser/lib/src/models/friendica_contact.dart rename friendica_archive_browser/lib/src/{friendica => }/models/location_data.dart (100%) rename friendica_archive_browser/lib/src/{friendica/models/friendica_media_attachment.dart => models/media_attachment.dart} (61%) rename friendica_archive_browser/lib/src/{friendica => }/models/model_utils.dart (100%) create mode 100644 friendica_archive_browser/lib/src/models/timeline_entry.dart create mode 100644 friendica_archive_browser/lib/src/services/archive_service_interface.dart create mode 100644 friendica_archive_browser/lib/src/services/archive_service_provider.dart create mode 100644 friendica_archive_browser/lib/src/services/connections_manager.dart create mode 100644 friendica_archive_browser/lib/src/services/path_mapper_service_interface.dart diff --git a/friendica_archive_browser/lib/src/app.dart b/friendica_archive_browser/lib/src/app.dart index e195243..2a7b61f 100644 --- a/friendica_archive_browser/lib/src/app.dart +++ b/friendica_archive_browser/lib/src/app.dart @@ -2,12 +2,11 @@ import 'package:desktop_window/desktop_window.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_archive_service.dart'; +import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; import 'package:friendica_archive_browser/src/themes.dart'; import 'package:friendica_archive_browser/src/utils/scrolling_behavior.dart'; import 'package:provider/provider.dart'; -import 'friendica/services/friendica_path_mapping_service.dart'; import 'home.dart'; import 'settings/settings_controller.dart'; @@ -25,12 +24,9 @@ class FriendicaArchiveBrowser extends StatelessWidget { @override Widget build(BuildContext context) { DesktopWindow.setMinWindowSize(minAppSize); - final pathMappingService = FriendicaPathMappingService(settingsController); - final friendicaArchiveService = - FriendicaArchiveService(pathMappingService: pathMappingService); + final archiveService = ArchiveServiceProvider(settingsController); settingsController.addListener(() { - friendicaArchiveService.clearCaches(); - pathMappingService.refresh(); + archiveService.clearCaches(); }); return AnimatedBuilder( animation: settingsController, @@ -55,13 +51,11 @@ class FriendicaArchiveBrowser extends StatelessWidget { home: MultiProvider( providers: [ ChangeNotifierProvider(create: (context) => settingsController), - ChangeNotifierProvider( - create: (context) => friendicaArchiveService), - Provider(create: (context) => pathMappingService), + ChangeNotifierProvider(create: (context) => archiveService), ], child: Home( settingsController: settingsController, - archiveService: friendicaArchiveService), + archiveService: archiveService), ), ); }, diff --git a/friendica_archive_browser/lib/src/components/top_interactactors_widget.dart b/friendica_archive_browser/lib/src/components/top_interactactors_widget.dart index faf9414..b35795d 100644 --- a/friendica_archive_browser/lib/src/components/top_interactactors_widget.dart +++ b/friendica_archive_browser/lib/src/components/top_interactactors_widget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:friendica_archive_browser/src/models/time_element.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_connections.dart'; +import 'package:friendica_archive_browser/src/services/connections_manager.dart'; import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; import 'package:friendica_archive_browser/src/utils/top_interactors_generator.dart'; import 'package:logging/logging.dart'; @@ -8,7 +8,7 @@ import 'package:url_launcher/url_launcher.dart'; class TopInteractorsWidget extends StatefulWidget { final List entries; - final FriendicaConnections connections; + final ConnectionsManager connections; const TopInteractorsWidget(this.entries, this.connections, {Key? key}) : super(key: key); diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart index d60d00b..6f54bd2 100644 --- a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart +++ b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart @@ -1,6 +1,6 @@ -import 'package:friendica_archive_browser/src/models/friendica_contact.dart'; +import 'package:friendica_archive_browser/src/models/connection.dart'; -Contact friendicaContactFromDiasporaJson(Map json) { +Connection contactFromDiasporaJson(Map json) { const network = "Diaspora"; final accountId = json['account_id'] ?? ''; final profileUrl = _profileUrlFromAccountId(accountId); @@ -17,7 +17,7 @@ Contact friendicaContactFromDiasporaJson(Map json) { status = ConnectionStatus.theyFollowYou; } - return Contact( + return Connection( status: status, name: name, id: id, diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart new file mode 100644 index 0000000..c398397 --- /dev/null +++ b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart @@ -0,0 +1,97 @@ +import 'package:friendica_archive_browser/src/models/connection.dart'; +import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:friendica_archive_browser/src/utils/offsetdatetime_utils.dart'; +import 'package:logging/logging.dart'; +import 'package:markdown/markdown.dart'; +import 'package:result_monad/result_monad.dart'; + +import '../../services/connections_manager.dart'; + +final _logger = Logger('DiasporaPostsSerializer'); +const _statusMessageType = 'status_message'; +const _reshareType = 'reshare'; +const _knownPostTypes = [_statusMessageType, _reshareType]; + +Result timelineItemFromDiasporaPostJson( + Map json, ConnectionsManager connections) { + if (!json.containsKey('entity_data')) { + return Result.error(ExecError.message('Timeline item has no entity data')); + } + final entityData = json['entity_data'] ?? {}; + final postId = entityData['guid'] ?? ''; + final entityType = json['entity_type'] ?? ''; + if (!_knownPostTypes.contains(entityType)) { + final error = 'Unknown entity type $entityType for Post ID: $postId'; + _logger.severe(error); + return Result.error(ExecError.message(error)); + } + + if (entityType == _statusMessageType) { + return _buildStatusMessageType(entityData, connections); + } else { + return _buildReshareMessageType(entityData, connections); + } +} + +Result _buildReshareMessageType( + entityData, ConnectionsManager connections) { + final createdAtString = entityData['created_at'] ?? ''; + final epochTime = + OffsetDateTimeUtils.epochSecTimeFromTimeZoneString(createdAtString) + .getValueOrElse(() => -1); + final postId = entityData['guid'] ?? ''; + final authorName = entityData['author'] ?? ''; + final parentGuid = entityData['root_guid'] ?? ''; + final parentName = entityData['root_author'] ?? ''; + final externalLink = _buildReshareUrl(authorName, parentName, parentGuid); + final author = + connections.getByName(authorName).getValueOrElse(() => Connection()); + final parentAuthor = connections + .getByName(parentName) + .getValueOrElse(() => Connection(name: parentName)); + final timelineEntry = TimelineEntry( + id: postId, + creationTimestamp: epochTime, + author: author.name, + authorId: author.id, + isReshare: true, + parentAuthor: parentAuthor.name, + parentAuthorId: parentAuthor.id, + externalLink: externalLink, + ); + return Result.ok(timelineEntry); +} + +Result _buildStatusMessageType( + entityData, ConnectionsManager connections) { + final createdAtString = entityData['created_at'] ?? ''; + final epochTime = + OffsetDateTimeUtils.epochSecTimeFromTimeZoneString(createdAtString) + .getValueOrElse(() => -1); + final postId = entityData['guid'] ?? ''; + final postMarkdown = entityData['text'] ?? ''; + final postHtml = markdownToHtml(postMarkdown); + final authorName = entityData['author'] ?? ''; + final author = + connections.getByName(authorName).getValueOrElse(() => Connection()); + final timelineEntry = TimelineEntry( + id: postId, + creationTimestamp: epochTime, + body: postHtml, + author: author.name, + authorId: author.id); + return Result.ok(timelineEntry); +} + +String _buildReshareUrl(String author, String rootAuthor, String rootGuid) { + final accountId = rootAuthor.isNotEmpty ? rootAuthor : author; + final accountIdPieces = accountId.split('@'); + if (accountIdPieces.length != 2) { + return rootGuid; + } + + final server = accountIdPieces[1]; + + return 'https://$server/p/$rootGuid'; +} diff --git a/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart b/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart index c0c13e1..11e44d9 100644 --- a/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart +++ b/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart @@ -1,23 +1,28 @@ import 'dart:convert'; import 'dart:io'; +import 'package:friendica_archive_browser/src/diaspora/services/diaspora_path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/diaspora/services/diaspora_profile_json_reader.dart'; +import 'package:friendica_archive_browser/src/services/archive_service_interface.dart'; import 'package:path/path.dart' as p; import 'package:result_monad/result_monad.dart'; -import '../../friendica/models/friendica_entry_tree_item.dart'; -import '../../friendica/models/friendica_timeline_entry.dart'; -import '../../friendica/services/friendica_path_mapping_service.dart'; +import '../../models/entry_tree_item.dart'; import '../../models/local_image_archive_entry.dart'; +import '../../services/connections_manager.dart'; import '../../utils/exec_error.dart'; -import '../../friendica/services/friendica_connections.dart'; -class DiasporaArchiveService { - final FriendicaPathMappingService pathMappingService; +class DiasporaArchiveService implements ArchiveService { + @override + final DiasporaPathMappingService pathMappingService; + final Map _imagesByRequestUrl = {}; - final List _postEntries = []; - final List _orphanedCommentEntries = []; - final List _allComments = []; - final FriendicaConnections connections = FriendicaConnections(); + final List _postEntries = []; + final List _orphanedCommentEntries = []; + final List _allComments = []; + + @override + final ConnectionsManager connectionsManager = ConnectionsManager(); String _ownersName = ''; DiasporaArchiveService({required this.pathMappingService}); @@ -25,33 +30,32 @@ class DiasporaArchiveService { String get ownersName => _ownersName; void clearCaches() { - connections.clearCaches(); + connectionsManager.clearCaches(); _imagesByRequestUrl.clear(); _orphanedCommentEntries.clear(); _allComments.clear(); _postEntries.clear(); } - FutureResult, ExecError> getPosts() async { + FutureResult, ExecError> getPosts() async { if (_postEntries.isEmpty && _allComments.isEmpty) { - _loadEntries(); + _loadProfileFile(); } return Result.ok(_postEntries); } - FutureResult, ExecError> getAllComments() async { + FutureResult, ExecError> getAllComments() async { if (_postEntries.isEmpty && _allComments.isEmpty) { - _loadEntries(); + _loadProfileFile(); } return Result.ok(_allComments); } - FutureResult, ExecError> - getOrphanedComments() async { + FutureResult, ExecError> getOrphanedComments() async { if (_postEntries.isEmpty && _allComments.isEmpty) { - _loadEntries(); + _loadProfileFile(); } return Result.ok(_orphanedCommentEntries); @@ -70,46 +74,21 @@ class DiasporaArchiveService { String get _baseArchiveFolder => pathMappingService.rootFolder; - void _loadEntries() { - final entriesJsonPath = p.join(_baseArchiveFolder, 'postsAndComments.json'); - final jsonFile = File(entriesJsonPath); - if (jsonFile.existsSync()) { - final json = jsonDecode(jsonFile.readAsStringSync()) as List; - final entries = - json.map((j) => FriendicaTimelineEntry.fromJson(j, connections)); - final topLevelEntries = - entries.where((element) => element.parentId.isEmpty); - final commentEntries = - entries.where((element) => element.parentId.isNotEmpty).toList(); - final entryTrees = {}; - - final postTreeEntries = []; - for (final entry in topLevelEntries) { - final treeEntry = FriendicaEntryTreeItem(entry, false); - entryTrees[entry.id] = treeEntry; - postTreeEntries.add(treeEntry); + void _loadProfileFile() { + _ownersName = ''; + final archiveDir = Directory(_baseArchiveFolder); + final jsonFiles = archiveDir.listSync().where((element) => + element.statSync().type == FileSystemEntityType.file && + element.path.toLowerCase().endsWith('json')); + for (final file in jsonFiles) { + final reader = + DiasporaProfileJsonReader(file.absolute.path, connectionsManager); + if (_ownersName.isEmpty) { + _ownersName = reader.readOwnersName(); + reader.readContacts(); + final newPosts = reader.readPosts().map((e) => EntryTreeItem(e, false)); + _postEntries.addAll(newPosts); } - - final commentTreeEntries = []; - commentEntries.sort( - (c1, c2) => c1.creationTimestamp.compareTo(c2.creationTimestamp)); - for (final entry in commentEntries) { - final parent = entryTrees[entry.parentId]; - final treeEntry = FriendicaEntryTreeItem(entry, parent == null); - parent?.addChild(treeEntry); - entryTrees[entry.id] = treeEntry; - commentTreeEntries.add(treeEntry); - } - - _postEntries.clear(); - _postEntries.addAll(postTreeEntries); - - _allComments.clear(); - _allComments.addAll(commentTreeEntries); - - _orphanedCommentEntries.clear(); - _orphanedCommentEntries - .addAll(entryTrees.values.where((element) => element.isOrphaned)); } } diff --git a/friendica_archive_browser/lib/src/diaspora/services/diaspora_path_mapping_service.dart b/friendica_archive_browser/lib/src/diaspora/services/diaspora_path_mapping_service.dart new file mode 100644 index 0000000..2e9ec39 --- /dev/null +++ b/friendica_archive_browser/lib/src/diaspora/services/diaspora_path_mapping_service.dart @@ -0,0 +1,54 @@ +import 'dart:io'; + +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as p; + +import '../../services/path_mapper_service_interface.dart'; +import '../../settings/settings_controller.dart'; + +class DiasporaPathMappingService implements PathMappingService { + static final _logger = Logger('$DiasporaPathMappingService'); + final SettingsController settings; + final _photoDirectories = []; + + DiasporaPathMappingService(this.settings) { + refresh(); + } + + @override + String get rootFolder => settings.rootFolder; + + @override + List get archiveDirectories => + List.unmodifiable(_photoDirectories); + + @override + void refresh() { + _logger.fine('Refreshing path mapping service directory data.'); + if (!Directory(settings.rootFolder).existsSync()) { + _logger.severe( + "Base directory does not exist! can't do mapping of ${settings.rootFolder}"); + return; + } + _photoDirectories.clear(); + + _photoDirectories.addAll(Directory(settings.rootFolder) + .listSync(recursive: false) + .where((element) => + element.statSync().type == FileSystemEntityType.directory)); + } + + @override + String toFullPath(String relPath) { + for (final file in _photoDirectories) { + final fullPath = p.join(file.path, relPath); + if (File(fullPath).existsSync()) { + return fullPath; + } + } + + _logger.fine( + 'Did not find a file with this relPath anywhere therefore returning the relPath'); + return relPath; + } +} diff --git a/friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart b/friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart index f4dab26..6520207 100644 --- a/friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart +++ b/friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart @@ -2,24 +2,63 @@ import 'dart:convert'; import 'dart:io'; import 'package:friendica_archive_browser/src/diaspora/serializers/diaspora_contact_serializer.dart'; -import 'package:friendica_archive_browser/src/models/friendica_contact.dart'; +import 'package:friendica_archive_browser/src/models/connection.dart'; +import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; +import 'package:friendica_archive_browser/src/services/connections_manager.dart'; + +import '../serializers/diaspora_posts_serializer.dart'; class DiasporaProfileJsonReader { final String jsonFilePath; + final ConnectionsManager connectionsManager; + final _jsonData = {}; - DiasporaProfileJsonReader(this.jsonFilePath); + DiasporaProfileJsonReader(this.jsonFilePath, this.connectionsManager); + + Map get jsonData { + if (_jsonData.isNotEmpty) { + return _jsonData; + } - List readContacts() { final jsonFile = File(jsonFilePath); if (jsonFile.existsSync()) { final json = jsonDecode(jsonFile.readAsStringSync()) as Map; - final contactsJson = json['user']?['contacts'] as List; - final contacts = - contactsJson.map((j) => friendicaContactFromDiasporaJson(j)).toList(); - return contacts; + _jsonData.addAll(json); } - return []; + return _jsonData; + } + + String readOwnersName() => + jsonData['user']?['profile']?['entity_data']?['author'] ?? 'Unknown'; + + List readContacts() { + final json = jsonData; + final userName = json['user']?['profile']?['entity_data']?['author'] ?? ''; + final userContact = Connection(name: userName, id: '0'); + connectionsManager.addConnection(userContact); + final contactsJson = json['user']?['contacts'] as List; + final contacts = contactsJson.map((j) => contactFromDiasporaJson(j)); + connectionsManager.addAllConnections(contacts); + return contacts.toList(); + } + + List readPosts() { + if (connectionsManager.length == 0) { + readContacts(); + } + + final json = jsonData; + final postsJson = json['user']?['posts'] as List; + final posts = postsJson + .map((j) => timelineItemFromDiasporaPostJson(j, connectionsManager)) + .where((element) => element.isSuccess) + .map((e) => e.value) + .toList(); + + posts + .sort((p1, p2) => p2.creationTimestamp.compareTo(p1.creationTimestamp)); + return posts; } } diff --git a/friendica_archive_browser/lib/src/friendica/components/geo/geo_extensions.dart b/friendica_archive_browser/lib/src/friendica/components/geo/geo_extensions.dart index c86625d..c5a339f 100644 --- a/friendica_archive_browser/lib/src/friendica/components/geo/geo_extensions.dart +++ b/friendica_archive_browser/lib/src/friendica/components/geo/geo_extensions.dart @@ -1,12 +1,12 @@ import 'dart:ui'; -import 'package:friendica_archive_browser/src/friendica/models/friendica_timeline_entry.dart'; +import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; import 'package:latlng/latlng.dart'; import 'package:map/map.dart'; import 'marker_data.dart'; -extension GeoSpatialPostExtensions on FriendicaTimelineEntry { +extension GeoSpatialPostExtensions on TimelineEntry { MarkerData toMarkerData(MapTransformer transformer, Color color) { final latLon = LatLng(locationData.latitude, locationData.longitude); final offset = transformer.fromLatLngToXYCoords(latLon); diff --git a/friendica_archive_browser/lib/src/friendica/components/geo/marker_data.dart b/friendica_archive_browser/lib/src/friendica/components/geo/marker_data.dart index eb2ce4e..c921c9e 100644 --- a/friendica_archive_browser/lib/src/friendica/components/geo/marker_data.dart +++ b/friendica_archive_browser/lib/src/friendica/components/geo/marker_data.dart @@ -1,9 +1,9 @@ import 'dart:ui'; -import 'package:friendica_archive_browser/src/friendica/models/friendica_timeline_entry.dart'; +import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; class MarkerData { - final List posts; + final List posts; final Offset pos; final Color color; diff --git a/friendica_archive_browser/lib/src/friendica/components/media_timeline_component.dart b/friendica_archive_browser/lib/src/friendica/components/media_timeline_component.dart index edc3e98..d4b08e9 100644 --- a/friendica_archive_browser/lib/src/friendica/components/media_timeline_component.dart +++ b/friendica_archive_browser/lib/src/friendica/components/media_timeline_component.dart @@ -1,10 +1,9 @@ import 'dart:math'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/friendica/models/friendica_media_attachment.dart'; import 'package:friendica_archive_browser/src/friendica/screens/media_slideshow_screen.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_archive_service.dart'; +import 'package:friendica_archive_browser/src/models/media_attachment.dart'; +import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; import 'package:provider/provider.dart'; @@ -13,7 +12,7 @@ import 'media_wrapper_component.dart'; class MediaTimelineComponent extends StatelessWidget { static const double _maxHeightWidth = 400.0; - final List mediaAttachments; + final List mediaAttachments; const MediaTimelineComponent({Key? key, required this.mediaAttachments}) : super(key: key); @@ -28,8 +27,7 @@ class MediaTimelineComponent extends StatelessWidget { final double singleWidth = MediaQuery.of(context).size.width / 2.0; final double threeAcrossWidth = MediaQuery.of(context).size.width / 3.0; final double preferredMultiWidth = min(threeAcrossWidth, _maxHeightWidth); - final pathMapper = Provider.of(context); - final archiveService = Provider.of(context); + final archiveService = Provider.of(context); final settingsController = Provider.of(context); return Container( @@ -48,7 +46,6 @@ class MediaTimelineComponent extends StatelessWidget { return MultiProvider( providers: [ ChangeNotifierProvider.value(value: settingsController), - Provider.value(value: pathMapper), ChangeNotifierProvider.value(value: archiveService), ], child: MediaSlideShowScreen( diff --git a/friendica_archive_browser/lib/src/friendica/components/media_wrapper_component.dart b/friendica_archive_browser/lib/src/friendica/components/media_wrapper_component.dart index 6929695..7cce22a 100644 --- a/friendica_archive_browser/lib/src/friendica/components/media_wrapper_component.dart +++ b/friendica_archive_browser/lib/src/friendica/components/media_wrapper_component.dart @@ -2,9 +2,9 @@ import 'dart:async'; import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/friendica/models/friendica_media_attachment.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_archive_service.dart'; +import 'package:friendica_archive_browser/src/models/media_attachment.dart'; +import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; +import 'package:friendica_archive_browser/src/services/path_mapper_service_interface.dart'; import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; import 'package:logging/logging.dart'; @@ -14,7 +14,7 @@ class MediaWrapperComponent extends StatelessWidget { static final _logger = Logger('$MediaWrapperComponent'); static const double _noPreferredValue = -1.0; - final FriendicaMediaAttachment mediaAttachment; + final MediaAttachment mediaAttachment; final double preferredWidth; final double preferredHeight; @@ -28,24 +28,23 @@ class MediaWrapperComponent extends StatelessWidget { @override Widget build(BuildContext context) { final settingsController = Provider.of(context); - final pathMapper = Provider.of(context); - final archiveService = Provider.of(context); + final archiveService = Provider.of(context); final videoPlayerCommand = settingsController.videoPlayerCommand; - final path = _calculatePath(pathMapper, archiveService); + final path = _calculatePath(archiveService); final width = preferredWidth > 0 ? preferredWidth : MediaQuery.of(context).size.width; final height = preferredHeight > 0 ? preferredHeight : MediaQuery.of(context).size.height; - if (mediaAttachment.explicitType == FriendicaAttachmentMediaType.unknown) { + if (mediaAttachment.explicitType == AttachmentMediaType.unknown) { return Text('Unable to resolve type for ${mediaAttachment.uri.path}'); } - if (mediaAttachment.explicitType == FriendicaAttachmentMediaType.video) { + if (mediaAttachment.explicitType == AttachmentMediaType.video) { final title = "Video (click to play): " + mediaAttachment.title; final thumbnailImageResult = _uriToImage( - mediaAttachment.thumbnailUri, pathMapper, + mediaAttachment.thumbnailUri, archiveService.pathMappingService, imageTypeName: 'thumbnail image'); if (thumbnailImageResult.image != null) { return _createFinalWidget( @@ -74,8 +73,9 @@ class MediaWrapperComponent extends StatelessWidget { ); } - if (mediaAttachment.explicitType == FriendicaAttachmentMediaType.image) { - final imageResult = _uriToImage(mediaAttachment.uri, pathMapper); + if (mediaAttachment.explicitType == AttachmentMediaType.image) { + final imageResult = + _uriToImage(mediaAttachment.uri, archiveService.pathMappingService); if (imageResult.image == null) { final errorPath = imageResult.path.isNotEmpty ? imageResult.path @@ -111,7 +111,7 @@ class MediaWrapperComponent extends StatelessWidget { } } - _ImageAndPathResult _uriToImage(Uri uri, FriendicaPathMappingService mapper, + _ImageAndPathResult _uriToImage(Uri uri, PathMappingService mapper, {String imageTypeName = 'image'}) { if (uri.toString().startsWith('https://interncache')) { return _ImageAndPathResult.none(); @@ -172,8 +172,7 @@ class MediaWrapperComponent extends StatelessWidget { return InkWell(onTap: onTap, child: imageWidget); } - String _calculatePath( - FriendicaPathMappingService pathMapper, FriendicaArchiveService archiveService) { + String _calculatePath(ArchiveServiceProvider archiveService) { final url = mediaAttachment.uri.toString(); String basePath = ''; if (url.startsWith('http')) { @@ -187,7 +186,7 @@ class MediaWrapperComponent extends StatelessWidget { basePath = mediaAttachment.uri.path; } - return pathMapper.toFullPath(basePath); + return archiveService.pathMappingService.toFullPath(basePath); } } diff --git a/friendica_archive_browser/lib/src/friendica/components/tree_entry_card.dart b/friendica_archive_browser/lib/src/friendica/components/tree_entry_card.dart index 396e0f5..3059bb0 100644 --- a/friendica_archive_browser/lib/src/friendica/components/tree_entry_card.dart +++ b/friendica_archive_browser/lib/src/friendica/components/tree_entry_card.dart @@ -1,9 +1,9 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart'; -import 'package:friendica_archive_browser/src/friendica/models/friendica_entry_tree_item.dart'; -import 'package:friendica_archive_browser/src/friendica/models/location_data.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/models/entry_tree_item.dart'; +import 'package:friendica_archive_browser/src/models/location_data.dart'; +import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; import 'package:friendica_archive_browser/src/utils/clipboard_helper.dart'; import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; @@ -16,7 +16,7 @@ import 'media_timeline_component.dart'; class TreeEntryCard extends StatelessWidget { static final _logger = Logger("$TreeEntryCard"); - final FriendicaEntryTreeItem treeEntry; + final EntryTreeItem treeEntry; final bool isTopLevel; const TreeEntryCard( @@ -32,7 +32,7 @@ class TreeEntryCard extends StatelessWidget { const double spacingHeight = 5.0; final formatter = Provider.of(context).dateTimeFormatter; - final mapper = Provider.of(context); + final archiveService = Provider.of(context); final entry = treeEntry.entry; @@ -75,7 +75,8 @@ class TreeEntryCard extends StatelessWidget { child: IconButton( onPressed: () async => await copyToClipboard( context: context, - text: entry.toHumanString(mapper, formatter), + text: entry.toHumanString( + archiveService.pathMappingService, formatter), snackbarMessage: 'Copied Post to clipboard'), icon: const Icon(Icons.copy)), ), @@ -129,9 +130,10 @@ class TreeEntryCard extends StatelessWidget { ), if (entry.locationData.hasData()) entry.locationData.toWidget(spacingHeight), - if (entry.links.isNotEmpty) ...[ + if (treeEntry.entry.externalLink.isNotEmpty) ...[ const SizedBox(height: spacingHeight), - LinkElementsComponent(links: entry.links) + LinkElementsComponent( + links: [Uri.parse(treeEntry.entry.externalLink)]) ], if (entry.mediaAttachments.isNotEmpty) ...[ const SizedBox(height: spacingHeight), diff --git a/friendica_archive_browser/lib/src/friendica/models/friendica_entry_tree_item.dart b/friendica_archive_browser/lib/src/friendica/models/friendica_entry_tree_item.dart deleted file mode 100644 index 7dbe457..0000000 --- a/friendica_archive_browser/lib/src/friendica/models/friendica_entry_tree_item.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:friendica_archive_browser/src/friendica/models/friendica_timeline_entry.dart'; - -class FriendicaEntryTreeItem { - final FriendicaTimelineEntry entry; - final bool isOrphaned; - - final _children = {}; - - FriendicaEntryTreeItem(this.entry, this.isOrphaned); - - String get id => entry.id; - - void addChild(FriendicaEntryTreeItem child) { - _children[child.id] = child; - } - - List get children => - List.unmodifiable(_children.values); -} diff --git a/friendica_archive_browser/lib/src/friendica/models/friendica_timeline_entry.dart b/friendica_archive_browser/lib/src/friendica/models/friendica_timeline_entry.dart deleted file mode 100644 index af27b6c..0000000 --- a/friendica_archive_browser/lib/src/friendica/models/friendica_timeline_entry.dart +++ /dev/null @@ -1,246 +0,0 @@ -import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; -import 'package:friendica_archive_browser/src/models/friendica_contact.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_connections.dart'; -import 'package:friendica_archive_browser/src/utils/offsetdatetime_utils.dart'; -import 'package:intl/intl.dart'; -import 'package:logging/logging.dart'; - -import 'friendica_media_attachment.dart'; -import 'location_data.dart'; -import 'model_utils.dart'; - -class FriendicaTimelineEntry { - static final _logger = Logger('$FriendicaTimelineEntry'); - - final String id; - - final String parentId; - - final String parentAuthor; - - final String parentAuthorId; - - final int creationTimestamp; - - final int backdatedTimestamp; - - final int modificationTimestamp; - - final String body; - - final String title; - - final bool isReshare; - - final String author; - - final String authorId; - - final String externalLink; - - final List mediaAttachments; - - final LocationData locationData; - - final List links; - - final List likes; - - final List dislikes; - - FriendicaTimelineEntry( - {this.id = '', - this.parentId = '', - this.creationTimestamp = 0, - this.backdatedTimestamp = 0, - this.modificationTimestamp = 0, - this.isReshare = false, - this.body = '', - this.title = '', - this.author = '', - this.authorId = '', - this.parentAuthor = '', - this.parentAuthorId = '', - this.externalLink = '', - this.locationData = const LocationData(), - this.likes = const [], - this.dislikes = const [], - List? mediaAttachments, - List? links}) - : mediaAttachments = mediaAttachments ?? [], - links = links ?? []; - - FriendicaTimelineEntry.randomBuilt() - : creationTimestamp = DateTime.now().millisecondsSinceEpoch, - backdatedTimestamp = DateTime.now().millisecondsSinceEpoch, - modificationTimestamp = DateTime.now().millisecondsSinceEpoch, - id = randomId(), - isReshare = false, - parentId = randomId(), - externalLink = 'Random external link ${randomId()}', - body = 'Random post text ${randomId()}', - title = 'Random title ${randomId()}', - author = 'Random author ${randomId()}', - authorId = 'Random authorId ${randomId()}', - parentAuthor = 'Random parent author ${randomId()}', - parentAuthorId = 'Random parent author id ${randomId()}', - locationData = LocationData.randomBuilt(), - likes = const [], - dislikes = const [], - links = [ - Uri.parse('http://localhost/${randomId()}'), - Uri.parse('http://localhost/${randomId()}') - ], - mediaAttachments = [ - FriendicaMediaAttachment.randomBuilt(), - FriendicaMediaAttachment.randomBuilt() - ]; - - FriendicaTimelineEntry copy( - {int? creationTimestamp, - int? backdatedTimestamp, - int? modificationTimestamp, - bool? isReshare, - String? id, - String? parentId, - String? externalLink, - String? body, - String? title, - String? author, - String? authorId, - String? parentAuthor, - String? parentAuthorId, - LocationData? locationData, - List? mediaAttachments, - List? likes, - List? dislikes, - List? links}) { - return FriendicaTimelineEntry( - creationTimestamp: creationTimestamp ?? this.creationTimestamp, - backdatedTimestamp: backdatedTimestamp ?? this.backdatedTimestamp, - modificationTimestamp: - modificationTimestamp ?? this.modificationTimestamp, - id: id ?? this.id, - isReshare: isReshare ?? this.isReshare, - parentId: parentId ?? this.parentId, - externalLink: externalLink ?? this.externalLink, - body: body ?? this.body, - title: title ?? this.title, - author: author ?? this.author, - authorId: authorId ?? this.authorId, - parentAuthor: parentAuthor ?? this.parentAuthor, - parentAuthorId: parentAuthorId ?? this.parentAuthorId, - locationData: locationData ?? this.locationData, - mediaAttachments: mediaAttachments ?? this.mediaAttachments, - likes: likes ?? this.likes, - dislikes: dislikes ?? this.dislikes, - links: links ?? this.links); - } - - @override - String toString() { - return 'FriendicaTimelineEntry{id: $id, isReshare: $isReshare, parentId: $parentId, creationTimestamp: $creationTimestamp, modificationTimestamp: $modificationTimestamp, backdatedTimeStamp: $backdatedTimestamp, post: $body, title: $title, author: $author, parentAuthor: $parentAuthor mediaAttachments: $mediaAttachments, links: $links}'; - } - - String toHumanString(FriendicaPathMappingService mapper, DateFormat formatter) { - final creationDateString = formatter.format( - DateTime.fromMillisecondsSinceEpoch(creationTimestamp * 1000) - .toLocal()); - return [ - 'Title: $title', - 'Creation At: $creationDateString', - 'Text:', - 'Author: $author', - 'Reshare: $isReshare', - if (externalLink.isNotEmpty) 'External Link: $externalLink', - body, - '', - if (parentId.isNotEmpty) - "Comment on post/comment by ${parentAuthor.isNotEmpty ? parentAuthor : 'unknown author'}", - if (links.isNotEmpty) 'Links:', - ...links.map((e) => e.toString()), - '', - if (mediaAttachments.isNotEmpty) 'Photos and Videos:', - ...mediaAttachments.map((e) => e.toHumanString(mapper)), - if (locationData.hasPosition) locationData.toHumanString(), - ].join('\n'); - } - - bool hasImages() => mediaAttachments - .where((element) => - element.explicitType == FriendicaAttachmentMediaType.image) - .isNotEmpty; - - bool hasVideos() => mediaAttachments - .where((element) => - element.explicitType == FriendicaAttachmentMediaType.video) - .isNotEmpty; - - static FriendicaTimelineEntry fromJson( - Map json, FriendicaConnections connections) { - final int timestamp = json.containsKey('created_at') - ? OffsetDateTimeUtils.epochSecTimeFromFriendicaString( - json['created_at']) - .fold( - onSuccess: (value) => value, - onError: (error) { - _logger.severe("Couldn't read date time string: $error"); - return 0; - }) - : 0; - final id = json['id_str'] ?? ''; - final isReshare = json.containsKey('retweeted_status'); - final parentId = json['in_reply_to_status_id_str'] ?? ''; - final parentAuthor = json['in_reply_to_screen_name'] ?? ''; - final parentAuthorId = json['in_reply_to_user_id_str'] ?? ''; - final body = json['friendica_html'] ?? ''; - final author = json['user']['name']; - final authorId = json['user']['id_str']; - final title = json['friendica_title'] ?? ''; - final externalLink = json['external_url'] ?? ''; - final actualLocationData = LocationData(); - final modificationTimestamp = timestamp; - final backdatedTimestamp = timestamp; - final links = []; - final mediaAttachments = (json['attachments'] as List? ?? []) - .map((j) => FriendicaMediaAttachment.fromJson(j)) - .toList(); - final likes = - (json['friendica_activities']?['like'] as List? ?? []) - .map((json) => Contact.fromJson(json)) - .toList(); - final dislikes = - (json['friendica_activities']?['dislike'] as List? ?? []) - .map((json) => Contact.fromJson(json)) - .toList(); - final announce = - (json['friendica_activities']?['announce'] as List? ?? []) - .map((json) => Contact.fromJson(json)) - .toList(); - - for (final contact in [...likes, ...dislikes, ...announce]) { - connections.addConnection(contact); - } - - return FriendicaTimelineEntry( - creationTimestamp: timestamp, - modificationTimestamp: modificationTimestamp, - backdatedTimestamp: backdatedTimestamp, - locationData: actualLocationData, - externalLink: externalLink, - body: body, - isReshare: isReshare, - id: id, - parentId: parentId, - parentAuthorId: parentAuthorId, - author: author, - authorId: authorId, - parentAuthor: parentAuthor, - title: title, - links: links, - likes: likes, - dislikes: dislikes, - mediaAttachments: mediaAttachments, - ); - } -} diff --git a/friendica_archive_browser/lib/src/friendica/screens/entries_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/entries_screen.dart index 3dc888a..24eeeb5 100644 --- a/friendica_archive_browser/lib/src/friendica/screens/entries_screen.dart +++ b/friendica_archive_browser/lib/src/friendica/screens/entries_screen.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:friendica_archive_browser/src/friendica/components/filter_control_component.dart'; import 'package:friendica_archive_browser/src/friendica/components/tree_entry_card.dart'; -import 'package:friendica_archive_browser/src/friendica/models/friendica_entry_tree_item.dart'; -import 'package:friendica_archive_browser/src/friendica/models/model_utils.dart'; +import 'package:friendica_archive_browser/src/models/entry_tree_item.dart'; +import 'package:friendica_archive_browser/src/models/model_utils.dart'; import 'package:friendica_archive_browser/src/screens/error_screen.dart'; import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; import 'package:friendica_archive_browser/src/utils/exec_error.dart'; @@ -15,8 +15,7 @@ import '../../screens/standin_status_screen.dart'; class EntriesScreen extends StatelessWidget { static final _logger = Logger('$EntriesScreen'); - final FutureResult, ExecError> Function() - populator; + final FutureResult, ExecError> Function() populator; const EntriesScreen({Key? key, required this.populator}) : super(key: key); @@ -25,7 +24,7 @@ class EntriesScreen extends StatelessWidget { _logger.info('Build FriendicaEntriesScreen'); Provider.of(context); - return FutureBuilder, ExecError>>( + return FutureBuilder, ExecError>>( future: populator(), builder: (context, snapshot) { _logger.info('FriendicaEntriesScreen Future builder called'); @@ -58,7 +57,7 @@ class EntriesScreen extends StatelessWidget { class _FriendicaEntriesScreenWidget extends StatelessWidget { static final _logger = Logger('$_FriendicaEntriesScreenWidget'); - final List posts; + final List posts; const _FriendicaEntriesScreenWidget({Key? key, required this.posts}) : super(key: key); @@ -66,7 +65,7 @@ class _FriendicaEntriesScreenWidget extends StatelessWidget { @override Widget build(BuildContext context) { _logger.fine('Redrawing'); - return FilterControl( + return FilterControl( allItems: posts, commentsOnlyFilterFunction: (post) => post.children.isNotEmpty, imagesOnlyFilterFunction: (post) => post.entry.hasImages(), diff --git a/friendica_archive_browser/lib/src/friendica/screens/geospatial_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/geospatial_screen.dart index f652321..5ac0ce1 100644 --- a/friendica_archive_browser/lib/src/friendica/screens/geospatial_screen.dart +++ b/friendica_archive_browser/lib/src/friendica/screens/geospatial_screen.dart @@ -6,13 +6,13 @@ import 'package:friendica_archive_browser/src/friendica/components/geo/geo_exten import 'package:friendica_archive_browser/src/friendica/components/geo/map_bounds.dart'; import 'package:friendica_archive_browser/src/friendica/components/geo/marker_data.dart'; import 'package:friendica_archive_browser/src/friendica/components/tree_entry_card.dart'; -import 'package:friendica_archive_browser/src/friendica/models/friendica_entry_tree_item.dart'; -import 'package:friendica_archive_browser/src/friendica/models/friendica_timeline_entry.dart'; import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/models/entry_tree_item.dart'; +import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; import 'package:friendica_archive_browser/src/screens/error_screen.dart'; import 'package:friendica_archive_browser/src/screens/loading_status_screen.dart'; import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_archive_service.dart'; +import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; import 'package:friendica_archive_browser/src/utils/exec_error.dart'; import 'package:friendica_archive_browser/src/utils/temp_file_builder.dart'; @@ -33,9 +33,9 @@ class GeospatialViewScreen extends StatelessWidget { @override Widget build(BuildContext context) { _logger.info('Build GeospatialViewScreen'); - final service = Provider.of(context); + final service = Provider.of(context); - return FutureBuilder, ExecError>>( + return FutureBuilder, ExecError>>( future: service.getPosts(), builder: (context, snapshot) { _logger.info('GeospatialViewScreen Future builder called'); @@ -66,7 +66,7 @@ class GeospatialViewScreen extends StatelessWidget { } class GeospatialView extends StatefulWidget { - final List posts; + final List posts; const GeospatialView({Key? key, required this.posts}) : super(key: key); @@ -88,8 +88,8 @@ class _GeospatialViewState extends State { ); Offset? dragStart; - final postsInList = []; - final postsInView = []; + final postsInList = []; + final postsInView = []; double scaleStart = 1.0; @override @@ -203,8 +203,8 @@ class _GeospatialViewState extends State { highlightedColor: Colors.indigo[900]!))); } - Widget _buildPostList( - BuildContext context, DateFormat formatter, FriendicaPathMappingService mapper) { + Widget _buildPostList(BuildContext context, DateFormat formatter, + FriendicaPathMappingService mapper) { _logger.finest(() => 'Building PostList with ${postsInList.length} items'); if (postsInList.isEmpty) { return const StandInStatusScreen( @@ -218,14 +218,14 @@ class _GeospatialViewState extends State { behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false), child: ListView.separated( itemBuilder: (context, index) => TreeEntryCard( - treeEntry: FriendicaEntryTreeItem(postsInList[index], false)), + treeEntry: EntryTreeItem(postsInList[index], false)), separatorBuilder: (context, index) => const Divider(height: 1), itemCount: postsInList.length), ); } - Widget _buildMap( - BuildContext context, DateFormat formatter, FriendicaPathMappingService mapper) { + Widget _buildMap(BuildContext context, DateFormat formatter, + FriendicaPathMappingService mapper) { final settings = Provider.of(context); final shouldDebugCache = @@ -332,8 +332,8 @@ class _GeospatialViewState extends State { ); } - Widget _buildMarkerWidget( - MarkerData data, DateFormat formatter, FriendicaPathMappingService mapper) { + Widget _buildMarkerWidget(MarkerData data, DateFormat formatter, + FriendicaPathMappingService mapper) { return Positioned( left: data.pos.dx - 16, top: data.pos.dy - 16, diff --git a/friendica_archive_browser/lib/src/friendica/screens/media_slideshow_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/media_slideshow_screen.dart index 5a23cf1..c50042a 100644 --- a/friendica_archive_browser/lib/src/friendica/screens/media_slideshow_screen.dart +++ b/friendica_archive_browser/lib/src/friendica/screens/media_slideshow_screen.dart @@ -4,8 +4,8 @@ import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:friendica_archive_browser/src/friendica/components/media_wrapper_component.dart'; -import 'package:friendica_archive_browser/src/friendica/models/friendica_media_attachment.dart'; import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/models/media_attachment.dart'; import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; import 'package:friendica_archive_browser/src/themes.dart'; import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; @@ -14,7 +14,7 @@ import 'package:provider/provider.dart'; class MediaSlideShowScreen extends StatefulWidget { static const _spacing = 5.0; - final List mediaAttachments; + final List mediaAttachments; final int initialIndex; const MediaSlideShowScreen( @@ -27,7 +27,7 @@ class MediaSlideShowScreen extends StatefulWidget { class _MediaSlideShowScreenState extends State { static const fastestChangeMS = 250; - FriendicaMediaAttachment media = FriendicaMediaAttachment.blank(); + MediaAttachment media = MediaAttachment.blank(); int index = 0; int lastKeyInducedIndexChange = 0; @@ -155,7 +155,8 @@ class _MediaSlideShowScreenState extends State { } Future _saveFile(BuildContext context) async { - final pathMapper = Provider.of(context, listen: false); + final pathMapper = + Provider.of(context, listen: false); final filename = media.uri.pathSegments.last; final initialPath = pathMapper.toFullPath(media.uri.toFilePath()); diff --git a/friendica_archive_browser/lib/src/friendica/screens/stats_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/stats_screen.dart index 53cfeae..bdb884c 100644 --- a/friendica_archive_browser/lib/src/friendica/screens/stats_screen.dart +++ b/friendica_archive_browser/lib/src/friendica/screens/stats_screen.dart @@ -4,10 +4,10 @@ import 'package:friendica_archive_browser/src/components/timechart_widget.dart'; import 'package:friendica_archive_browser/src/components/top_interactactors_widget.dart'; import 'package:friendica_archive_browser/src/components/word_frequency_widget.dart'; import 'package:friendica_archive_browser/src/friendica/components/filter_control_component.dart'; -import 'package:friendica_archive_browser/src/friendica/models/model_utils.dart'; +import 'package:friendica_archive_browser/src/models/model_utils.dart'; import 'package:friendica_archive_browser/src/models/time_element.dart'; import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_archive_service.dart'; +import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; @@ -21,7 +21,7 @@ class StatsScreen extends StatefulWidget { class _StatsScreenState extends State { static final _logger = Logger("$_StatsScreenState"); - FriendicaArchiveService? archiveDataService; + ArchiveServiceProvider? archiveDataService; final allItems = []; StatType statType = StatType.selectType; bool hasText = true; @@ -78,7 +78,7 @@ class _StatsScreenState extends State { @override Widget build(BuildContext context) { - archiveDataService = Provider.of(context); + archiveDataService = Provider.of(context); return FilterControl( allItems: allItems, @@ -147,7 +147,7 @@ class _StatsScreenState extends State { child: Column(children: [ ..._buildGraphScreens(context, items), const Divider(), - TopInteractorsWidget(items, archiveDataService!.connections), + TopInteractorsWidget(items, archiveDataService!.connectionsManager), const Divider(), WordFrequencyWidget(items), ]), diff --git a/friendica_archive_browser/lib/src/friendica/serializers/friendica_contact_serializer.dart b/friendica_archive_browser/lib/src/friendica/serializers/friendica_contact_serializer.dart new file mode 100644 index 0000000..5bb7633 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/serializers/friendica_contact_serializer.dart @@ -0,0 +1,18 @@ +import '../../models/connection.dart'; + +Connection contactFromFriendicaJson(Map json) { + final status = (json['following'] ?? '') == 'true' + ? ConnectionStatus.youFollowThem + : ConnectionStatus.none; + final name = json['name'] ?? ''; + final id = json['id_str'] ?? ''; + final profileUrl = Uri.parse(json['url'] ?? ''); + final network = json['network'] ?? 'unkn'; + + return Connection( + status: status, + name: name, + id: id, + profileUrl: profileUrl, + network: network); +} diff --git a/friendica_archive_browser/lib/src/friendica/serializers/friendica_media_attachment_serializer.dart b/friendica_archive_browser/lib/src/friendica/serializers/friendica_media_attachment_serializer.dart new file mode 100644 index 0000000..7e500cd --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/serializers/friendica_media_attachment_serializer.dart @@ -0,0 +1,25 @@ +import '../../models/media_attachment.dart'; + +MediaAttachment mediaAttachmentfromFriendicaJson(Map json) { + final uri = Uri.parse(json['url']); + const creationTimestamp = 0; + final metadata = (json['metadata'] as Map? ?? {}) + .map((key, value) => MapEntry(key, value.toString())); + final explicitType = (json['mimetype'] ?? '').startsWith('image') + ? AttachmentMediaType.image + : (json['mimetype'] ?? '').startsWith('video') + ? AttachmentMediaType.video + : AttachmentMediaType.unknown; + final thumbnailUri = Uri(); + const title = ''; + const description = ''; + + return MediaAttachment( + uri: uri, + creationTimestamp: creationTimestamp, + metadata: metadata, + thumbnailUri: thumbnailUri, + title: title, + explicitType: explicitType, + description: description); +} diff --git a/friendica_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart b/friendica_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart new file mode 100644 index 0000000..636c876 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart @@ -0,0 +1,72 @@ +import 'package:friendica_archive_browser/src/friendica/serializers/friendica_contact_serializer.dart'; +import 'package:friendica_archive_browser/src/friendica/serializers/friendica_media_attachment_serializer.dart'; +import 'package:logging/logging.dart'; + +import '../../models/location_data.dart'; +import '../../models/timeline_entry.dart'; +import '../../services/connections_manager.dart'; +import '../../utils/offsetdatetime_utils.dart'; + +final _logger = Logger('FriendicaTimelineEntrySerializer'); + +TimelineEntry timelineEntryFromFriendicaJson( + Map json, ConnectionsManager connections) { + final int timestamp = json.containsKey('created_at') + ? OffsetDateTimeUtils.epochSecTimeFromFriendicaString(json['created_at']) + .fold( + onSuccess: (value) => value, + onError: (error) { + _logger.severe("Couldn't read date time string: $error"); + return 0; + }) + : 0; + final id = json['id_str'] ?? ''; + final isReshare = json.containsKey('retweeted_status'); + final parentId = json['in_reply_to_status_id_str'] ?? ''; + final parentAuthor = json['in_reply_to_screen_name'] ?? ''; + final parentAuthorId = json['in_reply_to_user_id_str'] ?? ''; + final body = json['friendica_html'] ?? ''; + final author = json['user']['name']; + final authorId = json['user']['id_str']; + final title = json['friendica_title'] ?? ''; + final externalLink = json['external_url'] ?? ''; + final actualLocationData = LocationData(); + final modificationTimestamp = timestamp; + final backdatedTimestamp = timestamp; + final mediaAttachments = (json['attachments'] as List? ?? []) + .map((j) => mediaAttachmentfromFriendicaJson(j)) + .toList(); + final likes = (json['friendica_activities']?['like'] as List? ?? []) + .map((json) => contactFromFriendicaJson(json)) + .toList(); + final dislikes = + (json['friendica_activities']?['dislike'] as List? ?? []) + .map((json) => contactFromFriendicaJson(json)) + .toList(); + final announce = + (json['friendica_activities']?['announce'] as List? ?? []) + .map((json) => contactFromFriendicaJson(json)) + .toList(); + + connections.addAllConnections([...likes, ...dislikes, ...announce]); + + return TimelineEntry( + creationTimestamp: timestamp, + modificationTimestamp: modificationTimestamp, + backdatedTimestamp: backdatedTimestamp, + locationData: actualLocationData, + externalLink: externalLink, + body: body, + isReshare: isReshare, + id: id, + parentId: parentId, + parentAuthorId: parentAuthorId, + author: author, + authorId: authorId, + parentAuthor: parentAuthor, + title: title, + likes: likes, + dislikes: dislikes, + mediaAttachments: mediaAttachments, + ); +} diff --git a/friendica_archive_browser/lib/src/friendica/services/friendica_archive_service.dart b/friendica_archive_browser/lib/src/friendica/services/friendica_archive_service.dart index 8af914d..0b6660b 100644 --- a/friendica_archive_browser/lib/src/friendica/services/friendica_archive_service.dart +++ b/friendica_archive_browser/lib/src/friendica/services/friendica_archive_service.dart @@ -1,23 +1,27 @@ import 'dart:convert'; import 'dart:io'; -import 'package:flutter/foundation.dart'; -import 'package:friendica_archive_browser/src/friendica/models/friendica_entry_tree_item.dart'; -import 'package:friendica_archive_browser/src/friendica/models/friendica_timeline_entry.dart'; +import 'package:friendica_archive_browser/src/friendica/serializers/friendica_timeline_entry_serializer.dart'; import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/models/entry_tree_item.dart'; import 'package:friendica_archive_browser/src/models/local_image_archive_entry.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_connections.dart'; +import 'package:friendica_archive_browser/src/services/archive_service_interface.dart'; +import 'package:friendica_archive_browser/src/services/connections_manager.dart'; import 'package:friendica_archive_browser/src/utils/exec_error.dart'; import 'package:path/path.dart' as p; import 'package:result_monad/result_monad.dart'; -class FriendicaArchiveService extends ChangeNotifier { +class FriendicaArchiveService implements ArchiveService { + @override final FriendicaPathMappingService pathMappingService; + final Map _imagesByRequestUrl = {}; - final List _postEntries = []; - final List _orphanedCommentEntries = []; - final List _allComments = []; - final FriendicaConnections connections = FriendicaConnections(); + final List _postEntries = []; + final List _orphanedCommentEntries = []; + final List _allComments = []; + @override + final ConnectionsManager connectionsManager = ConnectionsManager(); + String _ownersName = ''; FriendicaArchiveService({required this.pathMappingService}); @@ -34,14 +38,14 @@ class FriendicaArchiveService extends ChangeNotifier { } void clearCaches() { - connections.clearCaches(); + connectionsManager.clearCaches(); _imagesByRequestUrl.clear(); _orphanedCommentEntries.clear(); _allComments.clear(); _postEntries.clear(); } - FutureResult, ExecError> getPosts() async { + FutureResult, ExecError> getPosts() async { if (_postEntries.isEmpty && _allComments.isEmpty) { _loadEntries(); } @@ -49,7 +53,7 @@ class FriendicaArchiveService extends ChangeNotifier { return Result.ok(_postEntries); } - FutureResult, ExecError> getAllComments() async { + FutureResult, ExecError> getAllComments() async { if (_postEntries.isEmpty && _allComments.isEmpty) { _loadEntries(); } @@ -57,8 +61,7 @@ class FriendicaArchiveService extends ChangeNotifier { return Result.ok(_allComments); } - FutureResult, ExecError> - getOrphanedComments() async { + FutureResult, ExecError> getOrphanedComments() async { if (_postEntries.isEmpty && _allComments.isEmpty) { _loadEntries(); } @@ -84,27 +87,27 @@ class FriendicaArchiveService extends ChangeNotifier { final jsonFile = File(entriesJsonPath); if (jsonFile.existsSync()) { final json = jsonDecode(jsonFile.readAsStringSync()) as List; - final entries = - json.map((j) => FriendicaTimelineEntry.fromJson(j, connections)); + final entries = json + .map((j) => timelineEntryFromFriendicaJson(j, connectionsManager)); final topLevelEntries = entries.where((element) => element.parentId.isEmpty); final commentEntries = entries.where((element) => element.parentId.isNotEmpty).toList(); - final entryTrees = {}; + final entryTrees = {}; - final postTreeEntries = []; + final postTreeEntries = []; for (final entry in topLevelEntries) { - final treeEntry = FriendicaEntryTreeItem(entry, false); + final treeEntry = EntryTreeItem(entry, false); entryTrees[entry.id] = treeEntry; postTreeEntries.add(treeEntry); } - final commentTreeEntries = []; + final commentTreeEntries = []; commentEntries.sort( (c1, c2) => c1.creationTimestamp.compareTo(c2.creationTimestamp)); for (final entry in commentEntries) { final parent = entryTrees[entry.parentId]; - final treeEntry = FriendicaEntryTreeItem(entry, parent == null); + final treeEntry = EntryTreeItem(entry, parent == null); parent?.addChild(treeEntry); entryTrees[entry.id] = treeEntry; commentTreeEntries.add(treeEntry); diff --git a/friendica_archive_browser/lib/src/friendica/services/friendica_connections.dart b/friendica_archive_browser/lib/src/friendica/services/friendica_connections.dart deleted file mode 100644 index e3a36df..0000000 --- a/friendica_archive_browser/lib/src/friendica/services/friendica_connections.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:friendica_archive_browser/src/models/friendica_contact.dart'; -import 'package:result_monad/result_monad.dart'; - -class FriendicaConnections { - final _connectionsById = {}; - final _connectionsByName = {}; - - void clearCaches() { - _connectionsById.clear(); - _connectionsByName.clear(); - } - - bool addConnection(Contact contact) { - if (_connectionsById.containsKey(contact.id)) { - return false; - } - _connectionsById[contact.id] = contact; - _connectionsByName[contact.name] = contact; - - return true; - } - - Result getById(String id) { - final result = _connectionsById[id]; - - return result != null ? Result.ok(result) : Result.error('$id not found'); - } - - Result getByName(String name) { - final result = _connectionsByName[name]; - - return result != null ? Result.ok(result) : Result.error('$name not found'); - } -} diff --git a/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart b/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart index 9412695..d189bd3 100644 --- a/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart +++ b/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart @@ -4,7 +4,9 @@ import 'package:friendica_archive_browser/src/settings/settings_controller.dart' import 'package:logging/logging.dart'; import 'package:path/path.dart' as p; -class FriendicaPathMappingService { +import '../../services/path_mapper_service_interface.dart'; + +class FriendicaPathMappingService implements PathMappingService { static final _logger = Logger('$FriendicaPathMappingService'); final SettingsController settings; final _archiveDirectories = []; diff --git a/friendica_archive_browser/lib/src/home.dart b/friendica_archive_browser/lib/src/home.dart index 2adfae3..4196779 100644 --- a/friendica_archive_browser/lib/src/home.dart +++ b/friendica_archive_browser/lib/src/home.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_archive_service.dart'; +import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; import 'friendica/screens/entries_screen.dart'; import 'friendica/screens/stats_screen.dart'; @@ -10,7 +10,7 @@ import 'settings/settings_view.dart'; class Home extends StatefulWidget { final SettingsController settingsController; - final FriendicaArchiveService archiveService; + final ArchiveServiceProvider archiveService; const Home( {Key? key, diff --git a/friendica_archive_browser/lib/src/models/archive_types_enum.dart b/friendica_archive_browser/lib/src/models/archive_types_enum.dart new file mode 100644 index 0000000..5801882 --- /dev/null +++ b/friendica_archive_browser/lib/src/models/archive_types_enum.dart @@ -0,0 +1,5 @@ +enum ArchiveType { + unknown, + diaspora, + friendica, +} diff --git a/friendica_archive_browser/lib/src/models/connection.dart b/friendica_archive_browser/lib/src/models/connection.dart new file mode 100644 index 0000000..8ede8fc --- /dev/null +++ b/friendica_archive_browser/lib/src/models/connection.dart @@ -0,0 +1,46 @@ +class Connection { + final ConnectionStatus status; + + final String name; + + final String id; + + final Uri profileUrl; + + final String network; + + Connection( + {this.status = ConnectionStatus.none, + this.name = '', + this.id = '', + profileUrl, + this.network = ''}) + : profileUrl = profileUrl ?? Uri(); + + @override + String toString() { + return 'Connection{status: $status, name: $name, id: $id, profileUrl: $profileUrl, network: $network}'; + } +} + +enum ConnectionStatus { + youFollowThem, + theyFollowYou, + mutual, + none, +} + +extension FriendStatusWriter on ConnectionStatus { + String name() { + switch (this) { + case ConnectionStatus.youFollowThem: + return "You Follow Them"; + case ConnectionStatus.theyFollowYou: + return "They Follow You"; + case ConnectionStatus.mutual: + return "Follow each other"; + case ConnectionStatus.none: + return "Not connected"; + } + } +} diff --git a/friendica_archive_browser/lib/src/models/entry_tree_item.dart b/friendica_archive_browser/lib/src/models/entry_tree_item.dart new file mode 100644 index 0000000..b6b3cff --- /dev/null +++ b/friendica_archive_browser/lib/src/models/entry_tree_item.dart @@ -0,0 +1,18 @@ +import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; + +class EntryTreeItem { + final TimelineEntry entry; + final bool isOrphaned; + + final _children = {}; + + EntryTreeItem(this.entry, this.isOrphaned); + + String get id => entry.id; + + void addChild(EntryTreeItem child) { + _children[child.id] = child; + } + + List get children => List.unmodifiable(_children.values); +} diff --git a/friendica_archive_browser/lib/src/models/friendica_contact.dart b/friendica_archive_browser/lib/src/models/friendica_contact.dart deleted file mode 100644 index 62aef8f..0000000 --- a/friendica_archive_browser/lib/src/models/friendica_contact.dart +++ /dev/null @@ -1,62 +0,0 @@ -class Contact { - final ConnectionStatus status; - - final String name; - - final String id; - - final Uri profileUrl; - - final String network; - - Contact( - {required this.status, - required this.name, - required this.id, - required this.profileUrl, - required this.network}); - - static Contact fromJson(Map json) { - final status = (json['following'] ?? '') == 'true' - ? ConnectionStatus.youFollowThem - : ConnectionStatus.none; - final name = json['name'] ?? ''; - final id = json['id_str'] ?? ''; - final profileUrl = Uri.parse(json['url'] ?? ''); - final network = json['network'] ?? 'unkn'; - - return Contact( - status: status, - name: name, - id: id, - profileUrl: profileUrl, - network: network); - } - - @override - String toString() { - return 'FriendicaContact{status: $status, name: $name, id: $id, profileUrl: $profileUrl, network: $network}'; - } -} - -enum ConnectionStatus { - youFollowThem, - theyFollowYou, - mutual, - none, -} - -extension FriendStatusWriter on ConnectionStatus { - String name() { - switch (this) { - case ConnectionStatus.youFollowThem: - return "You Follow Them"; - case ConnectionStatus.theyFollowYou: - return "They Follow You"; - case ConnectionStatus.mutual: - return "Follow each other"; - case ConnectionStatus.none: - return "Not connected"; - } - } -} diff --git a/friendica_archive_browser/lib/src/friendica/models/location_data.dart b/friendica_archive_browser/lib/src/models/location_data.dart similarity index 100% rename from friendica_archive_browser/lib/src/friendica/models/location_data.dart rename to friendica_archive_browser/lib/src/models/location_data.dart diff --git a/friendica_archive_browser/lib/src/friendica/models/friendica_media_attachment.dart b/friendica_archive_browser/lib/src/models/media_attachment.dart similarity index 61% rename from friendica_archive_browser/lib/src/friendica/models/friendica_media_attachment.dart rename to friendica_archive_browser/lib/src/models/media_attachment.dart index a80e21f..a3c92a8 100644 --- a/friendica_archive_browser/lib/src/friendica/models/friendica_media_attachment.dart +++ b/friendica_archive_browser/lib/src/models/media_attachment.dart @@ -1,12 +1,12 @@ import 'dart:io'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/services/path_mapper_service_interface.dart'; import 'model_utils.dart'; -enum FriendicaAttachmentMediaType { unknown, image, video } +enum AttachmentMediaType { unknown, image, video } -class FriendicaMediaAttachment { +class MediaAttachment { static final _graphicsExtensions = ['jpg', 'png', 'gif', 'tif']; static final _movieExtensions = ['avi', 'mp4', 'mpg', 'wmv']; @@ -16,7 +16,7 @@ class FriendicaMediaAttachment { final Map metadata; - final FriendicaAttachmentMediaType explicitType; + final AttachmentMediaType explicitType; final Uri thumbnailUri; @@ -24,7 +24,7 @@ class FriendicaMediaAttachment { final String description; - FriendicaMediaAttachment( + MediaAttachment( {required this.uri, required this.creationTimestamp, required this.metadata, @@ -33,16 +33,16 @@ class FriendicaMediaAttachment { required this.explicitType, required this.description}); - FriendicaMediaAttachment.randomBuilt() + MediaAttachment.randomBuilt() : uri = Uri.parse('http://localhost/${randomId()}'), creationTimestamp = DateTime.now().millisecondsSinceEpoch, title = 'Random title ${randomId()}', thumbnailUri = Uri.parse('${randomId()}.jpg'), description = 'Random description ${randomId()}', - explicitType = FriendicaAttachmentMediaType.image, + explicitType = AttachmentMediaType.image, metadata = {'value1': randomId(), 'value2': randomId()}; - FriendicaMediaAttachment.fromUriOnly(this.uri) + MediaAttachment.fromUriOnly(this.uri) : creationTimestamp = 0, thumbnailUri = Uri.file(''), title = '', @@ -50,18 +50,18 @@ class FriendicaMediaAttachment { description = '', metadata = {}; - FriendicaMediaAttachment.fromUriAndTime(this.uri, this.creationTimestamp) + MediaAttachment.fromUriAndTime(this.uri, this.creationTimestamp) : thumbnailUri = Uri.file(''), title = '', explicitType = mediaTypeFromString(uri.path), description = '', metadata = {}; - FriendicaMediaAttachment.blank() + MediaAttachment.blank() : uri = Uri(), creationTimestamp = 0, thumbnailUri = Uri.file(''), - explicitType = FriendicaAttachmentMediaType.unknown, + explicitType = AttachmentMediaType.unknown, title = '', description = '', metadata = {}; @@ -71,7 +71,7 @@ class FriendicaMediaAttachment { return 'FriendicaMediaAttachment{uri: $uri, creationTimestamp: $creationTimestamp, type: $explicitType, metadata: $metadata, title: $title, description: $description}'; } - String toHumanString(FriendicaPathMappingService mapper) { + String toHumanString(PathMappingService mapper) { if (uri.scheme.startsWith('http')) { return uri.toString(); } @@ -79,20 +79,6 @@ class FriendicaMediaAttachment { return mapper.toFullPath(uri.toString()); } - FriendicaMediaAttachment.fromJson(Map json) - : uri = Uri.parse(json['url']), - creationTimestamp = 0, - metadata = (json['metadata'] as Map? ?? {}) - .map((key, value) => MapEntry(key, value.toString())), - explicitType = (json['mimetype'] ?? '').startsWith('image') - ? FriendicaAttachmentMediaType.image - : (json['mimetype'] ?? '').startsWith('video') - ? FriendicaAttachmentMediaType.video - : FriendicaAttachmentMediaType.unknown, - thumbnailUri = Uri(), - title = '', - description = ''; - Map toJson() => { 'uri': uri.toString(), 'creationTimestamp': creationTimestamp, @@ -103,25 +89,25 @@ class FriendicaMediaAttachment { 'description': description, }; - static FriendicaAttachmentMediaType mediaTypeFromString(String path) { + static AttachmentMediaType mediaTypeFromString(String path) { final separator = Platform.isWindows ? '\\' : '/'; final lastSlash = path.lastIndexOf(separator) + 1; final filename = path.substring(lastSlash); final lastPeriod = filename.lastIndexOf('.') + 1; if (lastPeriod == 0) { - return FriendicaAttachmentMediaType.unknown; + return AttachmentMediaType.unknown; } final extension = filename.substring(lastPeriod).toLowerCase(); if (_graphicsExtensions.contains(extension)) { - return FriendicaAttachmentMediaType.image; + return AttachmentMediaType.image; } if (_movieExtensions.contains(extension)) { - return FriendicaAttachmentMediaType.video; + return AttachmentMediaType.video; } - return FriendicaAttachmentMediaType.unknown; + return AttachmentMediaType.unknown; } } diff --git a/friendica_archive_browser/lib/src/friendica/models/model_utils.dart b/friendica_archive_browser/lib/src/models/model_utils.dart similarity index 100% rename from friendica_archive_browser/lib/src/friendica/models/model_utils.dart rename to friendica_archive_browser/lib/src/models/model_utils.dart diff --git a/friendica_archive_browser/lib/src/models/time_element.dart b/friendica_archive_browser/lib/src/models/time_element.dart index bb30841..a905fa0 100644 --- a/friendica_archive_browser/lib/src/models/time_element.dart +++ b/friendica_archive_browser/lib/src/models/time_element.dart @@ -1,8 +1,8 @@ -import 'package:friendica_archive_browser/src/friendica/models/friendica_timeline_entry.dart'; +import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; class TimeElement { final DateTime timestamp; - final FriendicaTimelineEntry entry; + final TimelineEntry entry; TimeElement({int timeInMS = 0, required this.entry}) : timestamp = DateTime.fromMillisecondsSinceEpoch(timeInMS); diff --git a/friendica_archive_browser/lib/src/models/timeline_entry.dart b/friendica_archive_browser/lib/src/models/timeline_entry.dart new file mode 100644 index 0000000..cad73df --- /dev/null +++ b/friendica_archive_browser/lib/src/models/timeline_entry.dart @@ -0,0 +1,160 @@ +import 'package:friendica_archive_browser/src/models/connection.dart'; +import 'package:friendica_archive_browser/src/services/path_mapper_service_interface.dart'; +import 'package:intl/intl.dart'; + +import 'location_data.dart'; +import 'media_attachment.dart'; +import 'model_utils.dart'; + +class TimelineEntry { + final String id; + + final String parentId; + + final String parentAuthor; + + final String parentAuthorId; + + final int creationTimestamp; + + final int backdatedTimestamp; + + final int modificationTimestamp; + + final String body; + + final String title; + + final bool isReshare; + + final String author; + + final String authorId; + + final String externalLink; + + final List mediaAttachments; + + final LocationData locationData; + + final List likes; + + final List dislikes; + + TimelineEntry({ + this.id = '', + this.parentId = '', + this.creationTimestamp = 0, + this.backdatedTimestamp = 0, + this.modificationTimestamp = 0, + this.isReshare = false, + this.body = '', + this.title = '', + this.author = '', + this.authorId = '', + this.parentAuthor = '', + this.parentAuthorId = '', + this.externalLink = '', + this.locationData = const LocationData(), + this.likes = const [], + this.dislikes = const [], + List? mediaAttachments, + }) : mediaAttachments = mediaAttachments ?? []; + + TimelineEntry.randomBuilt() + : creationTimestamp = DateTime.now().millisecondsSinceEpoch, + backdatedTimestamp = DateTime.now().millisecondsSinceEpoch, + modificationTimestamp = DateTime.now().millisecondsSinceEpoch, + id = randomId(), + isReshare = false, + parentId = randomId(), + externalLink = 'Random external link ${randomId()}', + body = 'Random post text ${randomId()}', + title = 'Random title ${randomId()}', + author = 'Random author ${randomId()}', + authorId = 'Random authorId ${randomId()}', + parentAuthor = 'Random parent author ${randomId()}', + parentAuthorId = 'Random parent author id ${randomId()}', + locationData = LocationData.randomBuilt(), + likes = const [], + dislikes = const [], + mediaAttachments = [ + MediaAttachment.randomBuilt(), + MediaAttachment.randomBuilt() + ]; + + TimelineEntry copy( + {int? creationTimestamp, + int? backdatedTimestamp, + int? modificationTimestamp, + bool? isReshare, + String? id, + String? parentId, + String? externalLink, + String? body, + String? title, + String? author, + String? authorId, + String? parentAuthor, + String? parentAuthorId, + LocationData? locationData, + List? mediaAttachments, + List? likes, + List? dislikes, + List? links}) { + return TimelineEntry( + creationTimestamp: creationTimestamp ?? this.creationTimestamp, + backdatedTimestamp: backdatedTimestamp ?? this.backdatedTimestamp, + modificationTimestamp: + modificationTimestamp ?? this.modificationTimestamp, + id: id ?? this.id, + isReshare: isReshare ?? this.isReshare, + parentId: parentId ?? this.parentId, + externalLink: externalLink ?? this.externalLink, + body: body ?? this.body, + title: title ?? this.title, + author: author ?? this.author, + authorId: authorId ?? this.authorId, + parentAuthor: parentAuthor ?? this.parentAuthor, + parentAuthorId: parentAuthorId ?? this.parentAuthorId, + locationData: locationData ?? this.locationData, + mediaAttachments: mediaAttachments ?? this.mediaAttachments, + likes: likes ?? this.likes, + dislikes: dislikes ?? this.dislikes); + } + + @override + String toString() { + return 'TimelineEntry{id: $id, isReshare: $isReshare, parentId: $parentId, creationTimestamp: $creationTimestamp, modificationTimestamp: $modificationTimestamp, backdatedTimeStamp: $backdatedTimestamp, post: $body, title: $title, author: $author, parentAuthor: $parentAuthor mediaAttachments: $mediaAttachments, externalLink:$externalLink}'; + } + + String toHumanString(PathMappingService mapper, DateFormat formatter) { + final creationDateString = formatter.format( + DateTime.fromMillisecondsSinceEpoch(creationTimestamp * 1000) + .toLocal()); + return [ + 'Title: $title', + 'Creation At: $creationDateString', + 'Text:', + 'Author: $author', + 'Reshare: $isReshare', + if (externalLink.isNotEmpty) 'External Link: $externalLink', + body, + '', + if (parentId.isNotEmpty) + "Comment on post/comment by ${parentAuthor.isNotEmpty ? parentAuthor : 'unknown author'}", + '', + if (mediaAttachments.isNotEmpty) 'Photos and Videos:', + ...mediaAttachments.map((e) => e.toHumanString(mapper)), + if (locationData.hasPosition) locationData.toHumanString(), + ].join('\n'); + } + + bool hasImages() => mediaAttachments + .where((element) => element.explicitType == AttachmentMediaType.image) + .isNotEmpty; + + bool hasVideos() => mediaAttachments + .where((element) => element.explicitType == AttachmentMediaType.video) + .isNotEmpty; +} diff --git a/friendica_archive_browser/lib/src/services/archive_service_interface.dart b/friendica_archive_browser/lib/src/services/archive_service_interface.dart new file mode 100644 index 0000000..a4b994c --- /dev/null +++ b/friendica_archive_browser/lib/src/services/archive_service_interface.dart @@ -0,0 +1,31 @@ +import 'package:friendica_archive_browser/src/services/path_mapper_service_interface.dart'; +import 'package:result_monad/result_monad.dart'; + +import '../models/entry_tree_item.dart'; +import '../models/local_image_archive_entry.dart'; +import '../utils/exec_error.dart'; +import 'connections_manager.dart'; + +class ArchiveService { + ConnectionsManager get connectionsManager => + throw Exception('Not implemented'); + + String get ownersName => throw Exception('Not implemented'); + + PathMappingService get pathMappingService => + throw Exception('Not Implemented'); + + void clearCaches() => throw Exception('Not implemented'); + + FutureResult, ExecError> getPosts() async => + throw Exception('Not implemented'); + + FutureResult, ExecError> getAllComments() => + throw Exception('Not implemented'); + + FutureResult, ExecError> getOrphanedComments() => + throw Exception('Not implemented'); + + Result getImageByUrl(String url) => + throw Exception('Not implemented'); +} diff --git a/friendica_archive_browser/lib/src/services/archive_service_provider.dart b/friendica_archive_browser/lib/src/services/archive_service_provider.dart new file mode 100644 index 0000000..20d305e --- /dev/null +++ b/friendica_archive_browser/lib/src/services/archive_service_provider.dart @@ -0,0 +1,70 @@ +import 'package:flutter/cupertino.dart'; +import 'package:friendica_archive_browser/src/diaspora/services/diaspora_archive_service.dart'; +import 'package:friendica_archive_browser/src/diaspora/services/diaspora_path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_archive_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/services/archive_service_interface.dart'; +import 'package:friendica_archive_browser/src/services/connections_manager.dart'; +import 'package:friendica_archive_browser/src/services/path_mapper_service_interface.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:result_monad/result_monad.dart'; + +import '../models/archive_types_enum.dart'; +import '../models/entry_tree_item.dart'; +import '../models/local_image_archive_entry.dart'; +import '../utils/exec_error.dart'; + +class ArchiveServiceProvider extends ChangeNotifier implements ArchiveService { + final SettingsController settings; + late DiasporaArchiveService _diasporaArchiveService; + late FriendicaArchiveService _friendicaArchiveService; + + @override + ConnectionsManager get connectionsManager => + _archiveService.connectionsManager; + + ArchiveServiceProvider(this.settings) { + _diasporaArchiveService = DiasporaArchiveService( + pathMappingService: DiasporaPathMappingService(settings)); + _friendicaArchiveService = FriendicaArchiveService( + pathMappingService: FriendicaPathMappingService(settings)); + } + + String get ownersName => _archiveService.ownersName; + + void clearCaches() { + _friendicaArchiveService.clearCaches(); + _diasporaArchiveService.clearCaches(); + } + + FutureResult, ExecError> getPosts() async { + return _archiveService.getPosts(); + } + + FutureResult, ExecError> getAllComments() async { + return _archiveService.getAllComments(); + } + + FutureResult, ExecError> getOrphanedComments() async { + return _archiveService.getOrphanedComments(); + } + + Result getImageByUrl(String url) { + return _archiveService.getImageByUrl(url); + } + + ArchiveService get _archiveService { + switch (settings.archiveType) { + case ArchiveType.diaspora: + return _diasporaArchiveService; + case ArchiveType.friendica: + return _friendicaArchiveService; + default: + throw Exception('Unknown archive type'); + } + } + + @override + PathMappingService get pathMappingService => + _archiveService.pathMappingService; +} diff --git a/friendica_archive_browser/lib/src/services/connections_manager.dart b/friendica_archive_browser/lib/src/services/connections_manager.dart new file mode 100644 index 0000000..137fccd --- /dev/null +++ b/friendica_archive_browser/lib/src/services/connections_manager.dart @@ -0,0 +1,46 @@ +import 'package:friendica_archive_browser/src/models/connection.dart'; +import 'package:result_monad/result_monad.dart'; + +class ConnectionsManager { + final _connectionsById = {}; + final _connectionsByName = {}; + + int get length => _connectionsById.length; + + void clearCaches() { + _connectionsById.clear(); + _connectionsByName.clear(); + } + + bool addConnection(Connection connection) { + if (_connectionsById.containsKey(connection.id)) { + return false; + } + _connectionsById[connection.id] = connection; + _connectionsByName[connection.name] = connection; + + return true; + } + + bool addAllConnections(Iterable newConnections) { + bool result = true; + + for (final connection in newConnections) { + result &= addConnection(connection); + } + + return result; + } + + Result getById(String id) { + final result = _connectionsById[id]; + + return result != null ? Result.ok(result) : Result.error('$id not found'); + } + + Result getByName(String name) { + final result = _connectionsByName[name]; + + return result != null ? Result.ok(result) : Result.error('$name not found'); + } +} diff --git a/friendica_archive_browser/lib/src/services/path_mapper_service_interface.dart b/friendica_archive_browser/lib/src/services/path_mapper_service_interface.dart new file mode 100644 index 0000000..86466d3 --- /dev/null +++ b/friendica_archive_browser/lib/src/services/path_mapper_service_interface.dart @@ -0,0 +1,12 @@ +import 'dart:io'; + +class PathMappingService { + String get rootFolder => throw Exception('Not implemented'); + + List get archiveDirectories => + throw Exception('Not implemented'); + + void refresh() => throw Exception('Not implemented'); + + String toFullPath(String relPath) => throw Exception('Not implemented'); +} diff --git a/friendica_archive_browser/lib/src/settings/settings_controller.dart b/friendica_archive_browser/lib/src/settings/settings_controller.dart index 0b746d4..c7fa89b 100644 --- a/friendica_archive_browser/lib/src/settings/settings_controller.dart +++ b/friendica_archive_browser/lib/src/settings/settings_controller.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/models/archive_types_enum.dart'; import 'package:friendica_archive_browser/src/settings/video_player_settings.dart'; import 'package:friendica_archive_browser/src/utils/temp_file_builder.dart'; import 'package:intl/intl.dart'; @@ -18,9 +19,12 @@ class SettingsController with ChangeNotifier { : _settingsService = SettingsService(); Future loadSettings() async { + _archiveType = await _settingsService.archiveType(); _themeMode = await _settingsService.themeMode(); _rootFolder = await _settingsService.rootFolder(); - var canReadRootDir = runCatching(()=>Result.ok(Directory(_rootFolder).listSync())).isSuccess; + var canReadRootDir = + runCatching(() => Result.ok(Directory(_rootFolder).listSync())) + .isSuccess; if (!canReadRootDir) { _rootFolder = ''; } @@ -74,6 +78,17 @@ class SettingsController with ChangeNotifier { await _settingsService.updateRootFolder(newPath); } + late ArchiveType _archiveType; + + ArchiveType get archiveType => _archiveType; + + Future updateArchiveType(ArchiveType newArchiveType) async { + if (newArchiveType == _archiveType) return; + _archiveType = newArchiveType; + notifyListeners(); + await _settingsService.updateArchiveType(newArchiveType); + } + late ThemeMode _themeMode; ThemeMode get themeMode => _themeMode; diff --git a/friendica_archive_browser/lib/src/settings/settings_service.dart b/friendica_archive_browser/lib/src/settings/settings_service.dart index 1e5cea3..92406cd 100644 --- a/friendica_archive_browser/lib/src/settings/settings_service.dart +++ b/friendica_archive_browser/lib/src/settings/settings_service.dart @@ -1,12 +1,14 @@ import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/models/archive_types_enum.dart'; import 'package:logging/logging.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'video_player_settings.dart'; class SettingsService { + static const archiveTypeKey = "archiveType"; static const themeDarknessKey = 'themeDarkness'; static const rootFolderKey = 'rootFolder'; static const videoPlayerSettingTypeKey = 'videoPlayerSettingType'; @@ -45,6 +47,22 @@ class SettingsService { prefs.setInt(themeDarknessKey, theme.index); } + Future archiveType() async { + final prefs = await SharedPreferences.getInstance(); + final archiveTypeIndex = prefs.getInt(archiveTypeKey) ?? 0; + if (archiveTypeIndex > ArchiveType.values.length - 1 || + archiveTypeIndex < 0) { + return ArchiveType.unknown; + } + + return ArchiveType.values[archiveTypeIndex]; + } + + Future updateArchiveType(ArchiveType archiveType) async { + final prefs = await SharedPreferences.getInstance(); + prefs.setInt(archiveTypeKey, archiveType.index); + } + Future rootFolder() async { final prefs = await SharedPreferences.getInstance(); final result = prefs.getString(rootFolderKey) ?? ''; diff --git a/friendica_archive_browser/lib/src/settings/settings_view.dart b/friendica_archive_browser/lib/src/settings/settings_view.dart index 64cda30..5ac969a 100644 --- a/friendica_archive_browser/lib/src/settings/settings_view.dart +++ b/friendica_archive_browser/lib/src/settings/settings_view.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/models/archive_types_enum.dart'; import 'package:friendica_archive_browser/src/settings/video_player_settings.dart'; import 'package:friendica_archive_browser/src/utils/clipboard_helper.dart'; import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; @@ -157,6 +158,20 @@ class _SettingsViewState extends State { Text('Archive Folder: ', style: Theme.of(context).textTheme.bodyText1), const SizedBox(width: 10), + DropdownButton( + value: widget._settingsController.archiveType, + onChanged: (newArchiveType) async { + await widget._settingsController + .updateArchiveType(newArchiveType!); + setState(() {}); + }, + items: ArchiveType.values + .map((e) => DropdownMenuItem( + value: e, + child: Text(e.name), + )) + .toList(), + ), Expanded( child: TextField( controller: _folderPathController, diff --git a/friendica_archive_browser/lib/src/utils/offsetdatetime_utils.dart b/friendica_archive_browser/lib/src/utils/offsetdatetime_utils.dart index 9edf531..8f05822 100644 --- a/friendica_archive_browser/lib/src/utils/offsetdatetime_utils.dart +++ b/friendica_archive_browser/lib/src/utils/offsetdatetime_utils.dart @@ -3,12 +3,26 @@ import 'package:result_monad/result_monad.dart'; import 'package:time_machine/time_machine_text_patterns.dart'; class OffsetDateTimeUtils { - static final _parser = OffsetDateTimePattern.createWithInvariantCulture( - 'ddd MMM dd HH:mm:ss o<+HHmm> yyyy'); + static final _offsetTimeParser = + OffsetDateTimePattern.createWithInvariantCulture( + 'ddd MMM dd HH:mm:ss o<+HHmm> yyyy'); static Result epochSecTimeFromFriendicaString( String dateString) { - final offsetDateTime = _parser.parse(dateString); + final offsetDateTime = _offsetTimeParser.parse(dateString); + if (!offsetDateTime.success) { + return Result.error(ExecError.message(offsetDateTime.error.toString())); + } + + return Result.ok(offsetDateTime.value.localDateTime + .toDateTimeLocal() + .millisecondsSinceEpoch ~/ + 1000); + } + + static Result epochSecTimeFromTimeZoneString( + String dateString) { + final offsetDateTime = OffsetDateTimePattern.generalIso.parse(dateString); if (!offsetDateTime.success) { return Result.error(ExecError.message(offsetDateTime.error.toString())); } diff --git a/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart b/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart index 4270dd1..78b1eae 100644 --- a/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart +++ b/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart @@ -1,6 +1,6 @@ -import 'package:friendica_archive_browser/src/friendica/models/friendica_timeline_entry.dart'; -import 'package:friendica_archive_browser/src/models/friendica_contact.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_connections.dart'; +import 'package:friendica_archive_browser/src/models/connection.dart'; +import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; +import 'package:friendica_archive_browser/src/services/connections_manager.dart'; class TopInteractorsGenerator { final _interactors = {}; @@ -11,8 +11,7 @@ class TopInteractorsGenerator { _processedEntryIds.clear(); } - void processEntry( - FriendicaTimelineEntry item, FriendicaConnections contacts) { + void processEntry(TimelineEntry item, ConnectionsManager contacts) { if (_processedEntryIds.contains(item.id)) { return; } @@ -59,14 +58,14 @@ class TopInteractorsGenerator { } InteractorItem _getInteractorItemById( - String id, FriendicaConnections contacts) { + String id, ConnectionsManager contacts) { if (_interactors.containsKey(id)) { return _interactors[id]!; } final contact = contacts.getById(id).fold( onSuccess: (contact) => contact, - onError: (error) => Contact( + onError: (error) => Connection( status: ConnectionStatus.none, name: '', id: id, @@ -77,7 +76,7 @@ class TopInteractorsGenerator { } class InteractorItem { - final Contact contact; + final Connection contact; final int resharedOrCommentedOn; final int likeCount; final int dislikeCount; @@ -94,7 +93,7 @@ class InteractorItem { } InteractorItem copy( - {Contact? contact, + {Connection? contact, int? resharedOrCommentedOn, int? likeCount, int? dislikeCount}) { diff --git a/friendica_archive_browser/pubspec.lock b/friendica_archive_browser/pubspec.lock index 9b70db8..85e5e80 100644 --- a/friendica_archive_browser/pubspec.lock +++ b/friendica_archive_browser/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.0" async: dependency: transitive description: @@ -217,6 +224,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" + markdown: + dependency: "direct main" + description: + name: markdown + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.1" matcher: dependency: transitive description: diff --git a/friendica_archive_browser/pubspec.yaml b/friendica_archive_browser/pubspec.yaml index 9eaadfe..b2aacfd 100644 --- a/friendica_archive_browser/pubspec.yaml +++ b/friendica_archive_browser/pubspec.yaml @@ -22,6 +22,7 @@ dependencies: logging: ^1.0.2 latlng: ^0.1.0 map: ^1.0.0 + markdown: ^4.0.1 metadata_fetch: ^0.4.1 multi_split_view: ^1.10.0+1 path: ^1.8.0 diff --git a/friendica_archive_browser/test/additional_key_logger_test.dart b/friendica_archive_browser/test/additional_key_logger_test.dart index 07efc65..e51c81a 100644 --- a/friendica_archive_browser/test/additional_key_logger_test.dart +++ b/friendica_archive_browser/test/additional_key_logger_test.dart @@ -1,7 +1,7 @@ // ignore_for_file: avoid_print import 'package:flutter_test/flutter_test.dart'; -import 'package:friendica_archive_browser/src/friendica/models/model_utils.dart'; +import 'package:friendica_archive_browser/src/models/model_utils.dart'; import 'package:logging/logging.dart'; void main() { diff --git a/friendica_archive_browser/test/disapora_profile_json_reader_test.dart b/friendica_archive_browser/test/disapora_profile_json_reader_test.dart index b7366ee..3e1c465 100644 --- a/friendica_archive_browser/test/disapora_profile_json_reader_test.dart +++ b/friendica_archive_browser/test/disapora_profile_json_reader_test.dart @@ -2,13 +2,32 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:friendica_archive_browser/src/diaspora/services/diaspora_profile_json_reader.dart'; +import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; +import 'package:friendica_archive_browser/src/services/connections_manager.dart'; + +const jsonPath = '/Users/hankdev/Desktop/diaspora_pretty.json'; void main() { test('Diaspora Connections Test', () { - final reader = DiasporaProfileJsonReader( - '/Users/hankdev/Desktop/diaspora_pretty.json'); + final reader = DiasporaProfileJsonReader(jsonPath, ConnectionsManager()); final contacts = reader.readContacts(); print(contacts.length); print(contacts.first); }); + + test('Diaspora Posts Test', () { + final reader = DiasporaProfileJsonReader(jsonPath, ConnectionsManager()); + final posts = reader.readPosts(); + + print(posts.length); + print(posts.first); + + final postsWithImage = posts.firstWhere((element) => element.mediaAttachments.isNotEmpty, orElse: ()=>TimelineEntry()); + print(postsWithImage); + + final resharePost = posts.firstWhere((element) => element.externalLink.isNotEmpty, orElse: ()=>TimelineEntry()); + print(resharePost); + + }); + } From 096c4ce3db49c89c99278833d0d70c9bf8368e53 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Wed, 9 Mar 2022 08:34:52 -0500 Subject: [PATCH 05/14] Fix changes to archive type properly tracked --- .../diaspora/services/diaspora_archive_service.dart | 2 ++ .../lib/src/settings/settings_view.dart | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart b/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart index 11e44d9..980142a 100644 --- a/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart +++ b/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart @@ -90,6 +90,8 @@ class DiasporaArchiveService implements ArchiveService { _postEntries.addAll(newPosts); } } + + _postEntries.sort((p1,p2)=>p2.entry.creationTimestamp.compareTo(p1.entry.creationTimestamp)); } void _loadImages() { diff --git a/friendica_archive_browser/lib/src/settings/settings_view.dart b/friendica_archive_browser/lib/src/settings/settings_view.dart index 5ac969a..afd8d26 100644 --- a/friendica_archive_browser/lib/src/settings/settings_view.dart +++ b/friendica_archive_browser/lib/src/settings/settings_view.dart @@ -31,6 +31,7 @@ class _SettingsViewState extends State { VideoPlayerSettingType _videoPlayerTypeOption = VideoPlayerSettingType.custom; bool _validRootFolder = false; bool _differentSettingValues = false; + ArchiveType _archiveType = ArchiveType.unknown; Level _logLevel = Level.SEVERE; @override @@ -159,10 +160,9 @@ class _SettingsViewState extends State { style: Theme.of(context).textTheme.bodyText1), const SizedBox(width: 10), DropdownButton( - value: widget._settingsController.archiveType, + value: _archiveType, onChanged: (newArchiveType) async { - await widget._settingsController - .updateArchiveType(newArchiveType!); + _archiveType = newArchiveType!; setState(() {}); }, items: ArchiveType.values @@ -172,6 +172,7 @@ class _SettingsViewState extends State { )) .toList(), ), + const SizedBox(width: 15), Expanded( child: TextField( controller: _folderPathController, @@ -281,6 +282,7 @@ class _SettingsViewState extends State { .updateVideoPlayerCommand(_videoPlayerPathController.text); } await widget._settingsController.updateLogLevel(_logLevel); + await widget._settingsController.updateArchiveType(_archiveType); setState(() {}); } @@ -290,6 +292,7 @@ class _SettingsViewState extends State { _videoPlayerTypeOption = widget._settingsController.videoPlayerSettingType; _videoPlayerPathController.text = widget._settingsController.videoPlayerCommand; + _archiveType = widget._settingsController.archiveType; _logLevel = widget._settingsController.logLevel; } @@ -304,6 +307,7 @@ class _SettingsViewState extends State { newValue |= (_videoPlayerPathController.text != widget._settingsController.videoPlayerCommand); newValue |= (_logLevel != widget._settingsController.logLevel); + newValue |= (_archiveType != widget._settingsController.archiveType); if (oldValue == newValue) return; setState(() { _differentSettingValues = newValue; From 0f59ec3afb8464e64c74aff6a8c8cb0f6fddb0b0 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Wed, 9 Mar 2022 17:08:22 -0500 Subject: [PATCH 06/14] Add Diaspora post photo w/local caching (if downloaded) --- .../diaspora_media_attachment_serializer.dart | 27 ++++++++++++ .../diaspora_posts_serializer.dart | 5 +++ .../services/diaspora_archive_service.dart | 42 +++++++++++++------ 3 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 friendica_archive_browser/lib/src/diaspora/serializers/diaspora_media_attachment_serializer.dart diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_media_attachment_serializer.dart b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_media_attachment_serializer.dart new file mode 100644 index 0000000..5c9ca08 --- /dev/null +++ b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_media_attachment_serializer.dart @@ -0,0 +1,27 @@ +import '../../models/media_attachment.dart'; +import '../../utils/offsetdatetime_utils.dart'; + +MediaAttachment mediaAttachmentfromDiasporaJson(Map json) { + final entityData = json['entity_data'] ?? {}; + final createdAtString = entityData['created_at'] ?? ''; + final creationTimestamp = + OffsetDateTimeUtils.epochSecTimeFromTimeZoneString(createdAtString) + .getValueOrElse(() => -1); + String uriBase = entityData['remote_photo_path'] ?? ''; + final photoName = entityData['remote_photo_name'] ?? ''; + final separator = uriBase.endsWith('/') ? '' : '/'; + final uri = Uri.parse('$uriBase$separator$photoName'); + const explicitType = AttachmentMediaType.image; + final thumbnailUri = Uri(); + const title = ''; + const description = ''; + + return MediaAttachment( + uri: uri, + creationTimestamp: creationTimestamp, + thumbnailUri: thumbnailUri, + metadata: {}, + title: title, + explicitType: explicitType, + description: description); +} diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart index c398397..e2d1087 100644 --- a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart +++ b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart @@ -7,6 +7,7 @@ import 'package:markdown/markdown.dart'; import 'package:result_monad/result_monad.dart'; import '../../services/connections_manager.dart'; +import 'diaspora_media_attachment_serializer.dart'; final _logger = Logger('DiasporaPostsSerializer'); const _statusMessageType = 'status_message'; @@ -75,11 +76,15 @@ Result _buildStatusMessageType( final authorName = entityData['author'] ?? ''; final author = connections.getByName(authorName).getValueOrElse(() => Connection()); + final photos = (entityData['photos'] as List? ?? []) + .map((e) => mediaAttachmentfromDiasporaJson(e)); + final timelineEntry = TimelineEntry( id: postId, creationTimestamp: epochTime, body: postHtml, author: author.name, + mediaAttachments: photos.toList(), authorId: author.id); return Result.ok(timelineEntry); } diff --git a/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart b/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart index 980142a..6dccaa9 100644 --- a/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart +++ b/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'dart:io'; import 'package:friendica_archive_browser/src/diaspora/services/diaspora_path_mapping_service.dart'; @@ -17,6 +16,7 @@ class DiasporaArchiveService implements ArchiveService { final DiasporaPathMappingService pathMappingService; final Map _imagesByRequestUrl = {}; + final List _topLevelDirectories = []; final List _postEntries = []; final List _orphanedCommentEntries = []; final List _allComments = []; @@ -35,6 +35,7 @@ class DiasporaArchiveService implements ArchiveService { _orphanedCommentEntries.clear(); _allComments.clear(); _postEntries.clear(); + _topLevelDirectories.clear(); } FutureResult, ExecError> getPosts() async { @@ -63,10 +64,17 @@ class DiasporaArchiveService implements ArchiveService { Result getImageByUrl(String url) { if (_imagesByRequestUrl.isEmpty) { - _loadImages(); + _populateTopLevelSubDirectory(); } - final result = _imagesByRequestUrl[url]; + var result = _imagesByRequestUrl[url]; + if (result == null) { + final localFile = _getLocalVersion(url); + if (localFile.isSuccess) { + _imagesByRequestUrl[url] = localFile.value; + result = localFile.value; + } + } return result == null ? Result.error(ExecError(errorMessage: '$url not found')) : Result.ok(result); @@ -91,18 +99,28 @@ class DiasporaArchiveService implements ArchiveService { } } - _postEntries.sort((p1,p2)=>p2.entry.creationTimestamp.compareTo(p1.entry.creationTimestamp)); + _postEntries.sort((p1, p2) => + p2.entry.creationTimestamp.compareTo(p1.entry.creationTimestamp)); } - void _loadImages() { - final imageJsonPath = p.join(_baseArchiveFolder, 'images.json'); - final jsonFile = File(imageJsonPath); - if (jsonFile.existsSync()) { - final json = jsonDecode(jsonFile.readAsStringSync()) as List; - final imageEntries = json.map((j) => ImageEntry.fromJson(j)); - for (final entry in imageEntries) { - _imagesByRequestUrl[entry.url] = entry; + void _populateTopLevelSubDirectory() { + final topLevelDirectories = Directory(_baseArchiveFolder) + .listSync(recursive: false) + .where((e) => e.statSync().type == FileSystemEntityType.directory); + _topLevelDirectories.addAll(topLevelDirectories); + } + + Result _getLocalVersion(String url) { + final filename = Uri.parse(url).pathSegments.last; + for (final dir in _topLevelDirectories) { + final newPath = p.join(dir.path, filename); + if (File(newPath).existsSync()) { + final imageEntry = + ImageEntry(postId: '', localFilename: newPath, url: url); + return Result.ok(imageEntry); } } + + return Result.error(ExecError.message('Local file not found')); } } From 233ebccf6e5d05bc5496cfcf32b0c149ecc719b1 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Wed, 9 Mar 2022 17:30:48 -0500 Subject: [PATCH 07/14] Refactor components and screens out of friendica sub-folder to top level --- .../components/filter_control_component.dart | 0 .../{friendica => }/components/geo/geo_extensions.dart | 0 .../src/{friendica => }/components/geo/map_bounds.dart | 0 .../src/{friendica => }/components/geo/marker_data.dart | 0 .../components/link_elements_component.dart | 0 .../components/media_timeline_component.dart | 2 +- .../components/media_wrapper_component.dart | 0 .../src/{friendica => }/components/tree_entry_card.dart | 0 friendica_archive_browser/lib/src/home.dart | 4 ++-- .../lib/src/models/location_data.dart | 2 +- .../lib/src/{friendica => }/screens/entries_screen.dart | 8 ++++---- .../src/{friendica => }/screens/geospatial_screen.dart | 9 +++++---- .../{friendica => }/screens/media_slideshow_screen.dart | 2 +- .../lib/src/{friendica => }/screens/stats_screen.dart | 2 +- 14 files changed, 15 insertions(+), 14 deletions(-) rename friendica_archive_browser/lib/src/{friendica => }/components/filter_control_component.dart (100%) rename friendica_archive_browser/lib/src/{friendica => }/components/geo/geo_extensions.dart (100%) rename friendica_archive_browser/lib/src/{friendica => }/components/geo/map_bounds.dart (100%) rename friendica_archive_browser/lib/src/{friendica => }/components/geo/marker_data.dart (100%) rename friendica_archive_browser/lib/src/{friendica => }/components/link_elements_component.dart (100%) rename friendica_archive_browser/lib/src/{friendica => }/components/media_timeline_component.dart (96%) rename friendica_archive_browser/lib/src/{friendica => }/components/media_wrapper_component.dart (100%) rename friendica_archive_browser/lib/src/{friendica => }/components/tree_entry_card.dart (100%) rename friendica_archive_browser/lib/src/{friendica => }/screens/entries_screen.dart (93%) rename friendica_archive_browser/lib/src/{friendica => }/screens/geospatial_screen.dart (97%) rename friendica_archive_browser/lib/src/{friendica => }/screens/media_slideshow_screen.dart (98%) rename friendica_archive_browser/lib/src/{friendica => }/screens/stats_screen.dart (98%) diff --git a/friendica_archive_browser/lib/src/friendica/components/filter_control_component.dart b/friendica_archive_browser/lib/src/components/filter_control_component.dart similarity index 100% rename from friendica_archive_browser/lib/src/friendica/components/filter_control_component.dart rename to friendica_archive_browser/lib/src/components/filter_control_component.dart diff --git a/friendica_archive_browser/lib/src/friendica/components/geo/geo_extensions.dart b/friendica_archive_browser/lib/src/components/geo/geo_extensions.dart similarity index 100% rename from friendica_archive_browser/lib/src/friendica/components/geo/geo_extensions.dart rename to friendica_archive_browser/lib/src/components/geo/geo_extensions.dart diff --git a/friendica_archive_browser/lib/src/friendica/components/geo/map_bounds.dart b/friendica_archive_browser/lib/src/components/geo/map_bounds.dart similarity index 100% rename from friendica_archive_browser/lib/src/friendica/components/geo/map_bounds.dart rename to friendica_archive_browser/lib/src/components/geo/map_bounds.dart diff --git a/friendica_archive_browser/lib/src/friendica/components/geo/marker_data.dart b/friendica_archive_browser/lib/src/components/geo/marker_data.dart similarity index 100% rename from friendica_archive_browser/lib/src/friendica/components/geo/marker_data.dart rename to friendica_archive_browser/lib/src/components/geo/marker_data.dart diff --git a/friendica_archive_browser/lib/src/friendica/components/link_elements_component.dart b/friendica_archive_browser/lib/src/components/link_elements_component.dart similarity index 100% rename from friendica_archive_browser/lib/src/friendica/components/link_elements_component.dart rename to friendica_archive_browser/lib/src/components/link_elements_component.dart diff --git a/friendica_archive_browser/lib/src/friendica/components/media_timeline_component.dart b/friendica_archive_browser/lib/src/components/media_timeline_component.dart similarity index 96% rename from friendica_archive_browser/lib/src/friendica/components/media_timeline_component.dart rename to friendica_archive_browser/lib/src/components/media_timeline_component.dart index d4b08e9..66c188b 100644 --- a/friendica_archive_browser/lib/src/friendica/components/media_timeline_component.dart +++ b/friendica_archive_browser/lib/src/components/media_timeline_component.dart @@ -1,7 +1,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/friendica/screens/media_slideshow_screen.dart'; +import 'package:friendica_archive_browser/src/screens/media_slideshow_screen.dart'; import 'package:friendica_archive_browser/src/models/media_attachment.dart'; import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; diff --git a/friendica_archive_browser/lib/src/friendica/components/media_wrapper_component.dart b/friendica_archive_browser/lib/src/components/media_wrapper_component.dart similarity index 100% rename from friendica_archive_browser/lib/src/friendica/components/media_wrapper_component.dart rename to friendica_archive_browser/lib/src/components/media_wrapper_component.dart diff --git a/friendica_archive_browser/lib/src/friendica/components/tree_entry_card.dart b/friendica_archive_browser/lib/src/components/tree_entry_card.dart similarity index 100% rename from friendica_archive_browser/lib/src/friendica/components/tree_entry_card.dart rename to friendica_archive_browser/lib/src/components/tree_entry_card.dart diff --git a/friendica_archive_browser/lib/src/home.dart b/friendica_archive_browser/lib/src/home.dart index 4196779..cf5a2d3 100644 --- a/friendica_archive_browser/lib/src/home.dart +++ b/friendica_archive_browser/lib/src/home.dart @@ -3,8 +3,8 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; -import 'friendica/screens/entries_screen.dart'; -import 'friendica/screens/stats_screen.dart'; +import 'screens/entries_screen.dart'; +import 'screens/stats_screen.dart'; import 'settings/settings_controller.dart'; import 'settings/settings_view.dart'; diff --git a/friendica_archive_browser/lib/src/models/location_data.dart b/friendica_archive_browser/lib/src/models/location_data.dart index 08eebe4..fd66249 100644 --- a/friendica_archive_browser/lib/src/models/location_data.dart +++ b/friendica_archive_browser/lib/src/models/location_data.dart @@ -1,7 +1,7 @@ import 'dart:math'; import 'package:flutter/widgets.dart'; -import 'package:friendica_archive_browser/src/friendica/components/link_elements_component.dart'; +import 'package:friendica_archive_browser/src/components/link_elements_component.dart'; import 'model_utils.dart'; diff --git a/friendica_archive_browser/lib/src/friendica/screens/entries_screen.dart b/friendica_archive_browser/lib/src/screens/entries_screen.dart similarity index 93% rename from friendica_archive_browser/lib/src/friendica/screens/entries_screen.dart rename to friendica_archive_browser/lib/src/screens/entries_screen.dart index 24eeeb5..958ebbb 100644 --- a/friendica_archive_browser/lib/src/friendica/screens/entries_screen.dart +++ b/friendica_archive_browser/lib/src/screens/entries_screen.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/friendica/components/filter_control_component.dart'; -import 'package:friendica_archive_browser/src/friendica/components/tree_entry_card.dart'; +import 'package:friendica_archive_browser/src/components/filter_control_component.dart'; +import 'package:friendica_archive_browser/src/components/tree_entry_card.dart'; import 'package:friendica_archive_browser/src/models/entry_tree_item.dart'; import 'package:friendica_archive_browser/src/models/model_utils.dart'; import 'package:friendica_archive_browser/src/screens/error_screen.dart'; @@ -10,8 +10,8 @@ import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; import 'package:result_monad/result_monad.dart'; -import '../../screens/loading_status_screen.dart'; -import '../../screens/standin_status_screen.dart'; +import 'loading_status_screen.dart'; +import 'standin_status_screen.dart'; class EntriesScreen extends StatelessWidget { static final _logger = Logger('$EntriesScreen'); diff --git a/friendica_archive_browser/lib/src/friendica/screens/geospatial_screen.dart b/friendica_archive_browser/lib/src/screens/geospatial_screen.dart similarity index 97% rename from friendica_archive_browser/lib/src/friendica/screens/geospatial_screen.dart rename to friendica_archive_browser/lib/src/screens/geospatial_screen.dart index 5ac0ce1..8b998b2 100644 --- a/friendica_archive_browser/lib/src/friendica/screens/geospatial_screen.dart +++ b/friendica_archive_browser/lib/src/screens/geospatial_screen.dart @@ -2,10 +2,8 @@ import 'dart:math'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/friendica/components/geo/geo_extensions.dart'; -import 'package:friendica_archive_browser/src/friendica/components/geo/map_bounds.dart'; -import 'package:friendica_archive_browser/src/friendica/components/geo/marker_data.dart'; -import 'package:friendica_archive_browser/src/friendica/components/tree_entry_card.dart'; +import 'package:friendica_archive_browser/src/components/geo/geo_extensions.dart'; +import 'package:friendica_archive_browser/src/components/tree_entry_card.dart'; import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; import 'package:friendica_archive_browser/src/models/entry_tree_item.dart'; import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; @@ -25,6 +23,9 @@ import 'package:network_to_file_image/network_to_file_image.dart'; import 'package:provider/provider.dart'; import 'package:result_monad/result_monad.dart'; +import '../components/geo/map_bounds.dart'; +import '../components/geo/marker_data.dart'; + class GeospatialViewScreen extends StatelessWidget { static final _logger = Logger('$GeospatialViewScreen'); diff --git a/friendica_archive_browser/lib/src/friendica/screens/media_slideshow_screen.dart b/friendica_archive_browser/lib/src/screens/media_slideshow_screen.dart similarity index 98% rename from friendica_archive_browser/lib/src/friendica/screens/media_slideshow_screen.dart rename to friendica_archive_browser/lib/src/screens/media_slideshow_screen.dart index c50042a..a4c477f 100644 --- a/friendica_archive_browser/lib/src/friendica/screens/media_slideshow_screen.dart +++ b/friendica_archive_browser/lib/src/screens/media_slideshow_screen.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:friendica_archive_browser/src/friendica/components/media_wrapper_component.dart'; +import 'package:friendica_archive_browser/src/components/media_wrapper_component.dart'; import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; import 'package:friendica_archive_browser/src/models/media_attachment.dart'; import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; diff --git a/friendica_archive_browser/lib/src/friendica/screens/stats_screen.dart b/friendica_archive_browser/lib/src/screens/stats_screen.dart similarity index 98% rename from friendica_archive_browser/lib/src/friendica/screens/stats_screen.dart rename to friendica_archive_browser/lib/src/screens/stats_screen.dart index bdb884c..4407ed1 100644 --- a/friendica_archive_browser/lib/src/friendica/screens/stats_screen.dart +++ b/friendica_archive_browser/lib/src/screens/stats_screen.dart @@ -3,7 +3,7 @@ import 'package:friendica_archive_browser/src/components/heatmap_widget.dart'; import 'package:friendica_archive_browser/src/components/timechart_widget.dart'; import 'package:friendica_archive_browser/src/components/top_interactactors_widget.dart'; import 'package:friendica_archive_browser/src/components/word_frequency_widget.dart'; -import 'package:friendica_archive_browser/src/friendica/components/filter_control_component.dart'; +import 'package:friendica_archive_browser/src/components/filter_control_component.dart'; import 'package:friendica_archive_browser/src/models/model_utils.dart'; import 'package:friendica_archive_browser/src/models/time_element.dart'; import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; From 4a9d57f4c7b2b83bea8925d92ace4b3e2c4637d9 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Wed, 9 Mar 2022 17:30:56 -0500 Subject: [PATCH 08/14] Add handling of deleted reshared posts. --- .../diaspora/serializers/diaspora_posts_serializer.dart | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart index e2d1087..94af926 100644 --- a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart +++ b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart @@ -43,9 +43,11 @@ Result _buildReshareMessageType( .getValueOrElse(() => -1); final postId = entityData['guid'] ?? ''; final authorName = entityData['author'] ?? ''; - final parentGuid = entityData['root_guid'] ?? ''; - final parentName = entityData['root_author'] ?? ''; - final externalLink = _buildReshareUrl(authorName, parentName, parentGuid); + final String parentGuid = entityData['root_guid'] ?? ''; + final String parentName = entityData['root_author'] ?? ''; + final deletedPost = parentGuid.isEmpty || parentName.isEmpty; + final externalLink = deletedPost ? '' : _buildReshareUrl(authorName, parentName, parentGuid); + final text = deletedPost ? 'Original post deleted by author' : ''; final author = connections.getByName(authorName).getValueOrElse(() => Connection()); final parentAuthor = connections @@ -60,6 +62,7 @@ Result _buildReshareMessageType( parentAuthor: parentAuthor.name, parentAuthorId: parentAuthor.id, externalLink: externalLink, + body: text, ); return Result.ok(timelineEntry); } From 1ec9939f9b59e6c488122af305cb822d640c96e1 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Tue, 15 Mar 2022 20:42:30 -0400 Subject: [PATCH 09/14] Add reaction and comment processing for Diaspora data. --- .../components/media_timeline_component.dart | 2 +- .../lib/src/components/tree_entry_card.dart | 10 +-- .../diaspora/models/diaspora_reaction.dart | 55 +++++++++++++ .../diaspora/models/diaspora_relayables.dart | 13 ++++ .../diaspora_contact_serializer.dart | 6 ++ .../diaspora_posts_serializer.dart | 41 +++++----- .../diaspora_relayables_serializer.dart | 78 +++++++++++++++++++ .../services/diaspora_archive_service.dart | 78 ++++++++++++++++++- .../diaspora_profile_json_reader.dart | 25 ++++++ .../friendica_timeline_entry_serializer.dart | 2 +- .../lib/src/models/timeline_entry.dart | 51 +++++++----- .../lib/src/screens/stats_screen.dart | 2 +- .../lib/src/services/connections_manager.dart | 9 +++ 13 files changed, 322 insertions(+), 50 deletions(-) create mode 100644 friendica_archive_browser/lib/src/diaspora/models/diaspora_reaction.dart create mode 100644 friendica_archive_browser/lib/src/diaspora/models/diaspora_relayables.dart create mode 100644 friendica_archive_browser/lib/src/diaspora/serializers/diaspora_relayables_serializer.dart diff --git a/friendica_archive_browser/lib/src/components/media_timeline_component.dart b/friendica_archive_browser/lib/src/components/media_timeline_component.dart index 66c188b..51096b5 100644 --- a/friendica_archive_browser/lib/src/components/media_timeline_component.dart +++ b/friendica_archive_browser/lib/src/components/media_timeline_component.dart @@ -1,8 +1,8 @@ import 'dart:math'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/screens/media_slideshow_screen.dart'; import 'package:friendica_archive_browser/src/models/media_attachment.dart'; +import 'package:friendica_archive_browser/src/screens/media_slideshow_screen.dart'; import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; import 'package:provider/provider.dart'; diff --git a/friendica_archive_browser/lib/src/components/tree_entry_card.dart b/friendica_archive_browser/lib/src/components/tree_entry_card.dart index 3059bb0..6e50c47 100644 --- a/friendica_archive_browser/lib/src/components/tree_entry_card.dart +++ b/friendica_archive_browser/lib/src/components/tree_entry_card.dart @@ -40,7 +40,7 @@ class TreeEntryCard extends StatelessWidget { ? entry.title : entry.parentId.isEmpty ? (entry.isReshare ? 'Reshare' : 'Post') - : 'Comment on post by ${entry.parentAuthor}'; + : 'Comment on post by ${entry.author}'; final dateStamp = ' At ' + formatter.format( DateTime.fromMillisecondsSinceEpoch(entry.creationTimestamp * 1000) @@ -81,7 +81,8 @@ class TreeEntryCard extends StatelessWidget { icon: const Icon(Icons.copy)), ), Tooltip( - message: 'Open link to original item', + message: + 'Open link to original item (${entry.externalLink})', child: IconButton( onPressed: () async { await canLaunch(entry.externalLink) @@ -130,10 +131,9 @@ class TreeEntryCard extends StatelessWidget { ), if (entry.locationData.hasData()) entry.locationData.toWidget(spacingHeight), - if (treeEntry.entry.externalLink.isNotEmpty) ...[ + if (treeEntry.entry.links.isNotEmpty) ...[ const SizedBox(height: spacingHeight), - LinkElementsComponent( - links: [Uri.parse(treeEntry.entry.externalLink)]) + LinkElementsComponent(links: treeEntry.entry.links) ], if (entry.mediaAttachments.isNotEmpty) ...[ const SizedBox(height: spacingHeight), diff --git a/friendica_archive_browser/lib/src/diaspora/models/diaspora_reaction.dart b/friendica_archive_browser/lib/src/diaspora/models/diaspora_reaction.dart new file mode 100644 index 0000000..15029e2 --- /dev/null +++ b/friendica_archive_browser/lib/src/diaspora/models/diaspora_reaction.dart @@ -0,0 +1,55 @@ +class DiasporaReaction { + final String authorString; + final String guid; + final String parentGuid; + final ParentType parentType; + final ReactionType reactionType; + + DiasporaReaction( + {required this.authorString, + this.guid = '', + required this.parentGuid, + this.parentType = ParentType.post, + required this.reactionType}); + + static DiasporaReaction fromJson(Map json) => + DiasporaReaction( + authorString: json['author'] ?? '', + guid: json['guid'] ?? '', + parentGuid: json['parent_guid'] ?? '', + parentType: _parentTypeFromString(json['parent_type'] ?? ''), + reactionType: _reactionTypeFromBool(json['positive'] ?? true)); +} + +enum ParentType { + unknown, + comment, + post, +} + +ParentType _parentTypeFromString(String string) { + final stringLower = string.toLowerCase(); + if (stringLower == 'post') { + return ParentType.post; + } + + if (stringLower == 'comment') { + return ParentType.comment; + } + + return ParentType.unknown; +} + +enum ReactionType { + unknown, + dislike, + like, +} + +ReactionType _reactionTypeFromBool(bool value) { + if (value) { + return ReactionType.like; + } + + return ReactionType.dislike; +} diff --git a/friendica_archive_browser/lib/src/diaspora/models/diaspora_relayables.dart b/friendica_archive_browser/lib/src/diaspora/models/diaspora_relayables.dart new file mode 100644 index 0000000..abf1319 --- /dev/null +++ b/friendica_archive_browser/lib/src/diaspora/models/diaspora_relayables.dart @@ -0,0 +1,13 @@ +import 'package:friendica_archive_browser/src/diaspora/models/diaspora_reaction.dart'; +import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; + +class DiasporaRelayable { + final DiasporaReaction? reaction; + final TimelineEntry? comment; + + bool get isReaction => reaction != null; + + bool get isComment => comment != null; + + DiasporaRelayable({this.reaction, this.comment}); +} diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart index 6f54bd2..f602163 100644 --- a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart +++ b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart @@ -1,4 +1,5 @@ import 'package:friendica_archive_browser/src/models/connection.dart'; +import 'package:uuid/uuid.dart'; Connection contactFromDiasporaJson(Map json) { const network = "Diaspora"; @@ -25,6 +26,11 @@ Connection contactFromDiasporaJson(Map json) { network: network); } +Connection contactFromDiasporaId(String accountId) => Connection( + id: 'generated_${const Uuid().v4}', + status: ConnectionStatus.none, + profileUrl: _profileUrlFromAccountId(accountId)); + Uri _profileUrlFromAccountId(String accountId) { if (accountId.isEmpty) { return Uri(); diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart index 94af926..93d8820 100644 --- a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart +++ b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart @@ -46,7 +46,9 @@ Result _buildReshareMessageType( final String parentGuid = entityData['root_guid'] ?? ''; final String parentName = entityData['root_author'] ?? ''; final deletedPost = parentGuid.isEmpty || parentName.isEmpty; - final externalLink = deletedPost ? '' : _buildReshareUrl(authorName, parentName, parentGuid); + final reshareLink = deletedPost + ? '' + : _buildPostOrReshareUrl(authorName, parentName, parentGuid); final text = deletedPost ? 'Original post deleted by author' : ''; final author = connections.getByName(authorName).getValueOrElse(() => Connection()); @@ -54,16 +56,16 @@ Result _buildReshareMessageType( .getByName(parentName) .getValueOrElse(() => Connection(name: parentName)); final timelineEntry = TimelineEntry( - id: postId, - creationTimestamp: epochTime, - author: author.name, - authorId: author.id, - isReshare: true, - parentAuthor: parentAuthor.name, - parentAuthorId: parentAuthor.id, - externalLink: externalLink, - body: text, - ); + id: postId, + creationTimestamp: epochTime, + author: author.name, + authorId: author.id, + externalLink: _buildPostOrReshareUrl(authorName, '', postId), + isReshare: true, + parentAuthor: parentAuthor.name, + parentAuthorId: parentAuthor.id, + body: text, + links: [Uri.parse(reshareLink)]); return Result.ok(timelineEntry); } @@ -83,16 +85,19 @@ Result _buildStatusMessageType( .map((e) => mediaAttachmentfromDiasporaJson(e)); final timelineEntry = TimelineEntry( - id: postId, - creationTimestamp: epochTime, - body: postHtml, - author: author.name, - mediaAttachments: photos.toList(), - authorId: author.id); + id: postId, + creationTimestamp: epochTime, + body: postHtml, + author: author.name, + externalLink: _buildPostOrReshareUrl(authorName, '', postId), + mediaAttachments: photos.toList(), + authorId: author.id, + ); return Result.ok(timelineEntry); } -String _buildReshareUrl(String author, String rootAuthor, String rootGuid) { +String _buildPostOrReshareUrl( + String author, String rootAuthor, String rootGuid) { final accountId = rootAuthor.isNotEmpty ? rootAuthor : author; final accountIdPieces = accountId.split('@'); if (accountIdPieces.length != 2) { diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_relayables_serializer.dart b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_relayables_serializer.dart new file mode 100644 index 0000000..a9a944f --- /dev/null +++ b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_relayables_serializer.dart @@ -0,0 +1,78 @@ +import 'package:friendica_archive_browser/src/diaspora/models/diaspora_relayables.dart'; +import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:friendica_archive_browser/src/utils/offsetdatetime_utils.dart'; +import 'package:logging/logging.dart'; +import 'package:markdown/markdown.dart'; +import 'package:result_monad/result_monad.dart'; + +import '../models/diaspora_reaction.dart'; + +final _logger = Logger('DiasporaPostsSerializer'); +const _commentType = 'comment'; +const _likeType = 'like'; +const _knownRelayableTypes = [_commentType, _likeType]; + +Result relayableFromDiasporaPostJson( + Map json) { + if (!json.containsKey('entity_data')) { + return Result.error(ExecError.message('Relayable item has no entity data')); + } + final entityType = json['entity_type'] ?? ''; + final entityData = json['entity_data'] ?? {}; + if (!_knownRelayableTypes.contains(entityType)) { + final guid = entityData['guid']; + final error = 'Unknown entity type $entityType for Relayable ID: $guid'; + _logger.severe(error); + return Result.error(ExecError.message(error)); + } + + if (entityType == _commentType) { + return _buildCommentRelayable(entityData); + } + + if (entityType == _likeType) { + return _buildReactionRelayable(entityData); + } + + return Result.error(ExecError.message('Unknown type: $entityType')); +} + +Result _buildCommentRelayable( + Map entityData) { + final author = entityData['author'] ?? ''; + final guid = entityData['guid'] ?? ''; + final parentGuid = entityData['parent_guid'] ?? ''; + final commentMarkdown = entityData['text'] ?? ''; + final commentHtml = markdownToHtml(commentMarkdown); + final epochTime = OffsetDateTimeUtils.epochSecTimeFromTimeZoneString( + entityData['created_at'] ?? '') + .getValueOrElse(() => -1); + + final timelineEntry = TimelineEntry( + id: guid, + creationTimestamp: epochTime, + body: commentHtml, + author: author, + parentId: parentGuid, + externalLink: _buildCommentUrl(author, parentGuid, guid), + ); + return Result.ok(DiasporaRelayable(comment: timelineEntry)); +} + +Result _buildReactionRelayable( + Map entityData) { + final reaction = DiasporaReaction.fromJson(entityData); + return Result.ok(DiasporaRelayable(reaction: reaction)); +} + +String _buildCommentUrl(String author, String parentGuid, String commentGuid) { + final accountIdPieces = author.split('@'); + if (accountIdPieces.length != 2) { + return commentGuid; + } + + final server = accountIdPieces[1]; + + return 'https://$server/p/$parentGuid#$commentGuid'; +} diff --git a/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart b/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart index 6dccaa9..1b465d5 100644 --- a/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart +++ b/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:friendica_archive_browser/src/diaspora/services/diaspora_path_mapping_service.dart'; import 'package:friendica_archive_browser/src/diaspora/services/diaspora_profile_json_reader.dart'; +import 'package:friendica_archive_browser/src/models/connection.dart'; import 'package:friendica_archive_browser/src/services/archive_service_interface.dart'; import 'package:path/path.dart' as p; import 'package:result_monad/result_monad.dart'; @@ -10,6 +11,8 @@ import '../../models/entry_tree_item.dart'; import '../../models/local_image_archive_entry.dart'; import '../../services/connections_manager.dart'; import '../../utils/exec_error.dart'; +import '../models/diaspora_reaction.dart'; +import '../serializers/diaspora_contact_serializer.dart'; class DiasporaArchiveService implements ArchiveService { @override @@ -94,15 +97,84 @@ class DiasporaArchiveService implements ArchiveService { if (_ownersName.isEmpty) { _ownersName = reader.readOwnersName(); reader.readContacts(); - final newPosts = reader.readPosts().map((e) => EntryTreeItem(e, false)); + final entryTree = {}; + final newPosts = + reader.readPosts().map((e) => EntryTreeItem(e, false)).toList(); + + for (final post in newPosts) { + entryTree[post.id] = post; + } + + final userComments = reader + .readUserRelayables() + .where((r) => r.isComment) + .map((r) => r.comment!); + final othersRelayables = reader.readOthersRelayables(); + final othersComments = + othersRelayables.where((r) => r.isComment).map((r) => r.comment!); + final othersReactions = + othersRelayables.where((r) => r.isReaction).map((r) => r.reaction!); + + final allComments = [...userComments, ...othersComments]; + allComments.sort( + (c1, c2) => c1.creationTimestamp.compareTo(c2.creationTimestamp)); + + for (final comment in allComments) { + final parentId = comment.parentId; + final parent = entryTree[parentId]; + if (parent == null) { + final newEntry = EntryTreeItem(comment, true); + entryTree[comment.id] = newEntry; + if (userComments.contains(comment)) { + _orphanedCommentEntries.add(newEntry); + } + } else { + parent.addChild(EntryTreeItem(comment, false)); + } + } + + for (final reaction in othersReactions) { + final treeEntry = entryTree[reaction.parentGuid]; + if (treeEntry == null) { + continue; + } + + final builtConnections = {}; + final builtConnection = builtConnections[reaction.authorString] ?? + contactFromDiasporaId(reaction.authorString); + builtConnections[reaction.authorString] = builtConnection; + final result = + connectionsManager.getByProfileUrl(builtConnection.profileUrl); + final connection = result.fold( + onSuccess: (c) => c, + onError: (error) { + connectionsManager.addConnection(builtConnection); + return builtConnection; + }); + + switch (reaction.reactionType) { + case ReactionType.unknown: + break; + case ReactionType.dislike: + treeEntry.entry.dislikes.add(connection); + break; + case ReactionType.like: + treeEntry.entry.likes.add(connection); + break; + } + } + _postEntries.addAll(newPosts); } } - _postEntries.sort((p1, p2) => - p2.entry.creationTimestamp.compareTo(p1.entry.creationTimestamp)); + _postEntries.sort((p1, p2) => _reverseChronologicalSort(p1, p2)); + _orphanedCommentEntries.sort((p1, p2) => _reverseChronologicalSort(p1, p2)); } + int _reverseChronologicalSort(EntryTreeItem p1, EntryTreeItem p2) => + p2.entry.creationTimestamp.compareTo(p1.entry.creationTimestamp); + void _populateTopLevelSubDirectory() { final topLevelDirectories = Directory(_baseArchiveFolder) .listSync(recursive: false) diff --git a/friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart b/friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart index 6520207..b36c9d0 100644 --- a/friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart +++ b/friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart @@ -1,7 +1,9 @@ import 'dart:convert'; import 'dart:io'; +import 'package:friendica_archive_browser/src/diaspora/models/diaspora_relayables.dart'; import 'package:friendica_archive_browser/src/diaspora/serializers/diaspora_contact_serializer.dart'; +import 'package:friendica_archive_browser/src/diaspora/serializers/diaspora_relayables_serializer.dart'; import 'package:friendica_archive_browser/src/models/connection.dart'; import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; import 'package:friendica_archive_browser/src/services/connections_manager.dart'; @@ -61,4 +63,27 @@ class DiasporaProfileJsonReader { .sort((p1, p2) => p2.creationTimestamp.compareTo(p1.creationTimestamp)); return posts; } + + List readUserRelayables() { + if (connectionsManager.length == 0) { + readContacts(); + } + + return _readRelayableJson(jsonData['user']?['relayables'] ?? []); + } + + List readOthersRelayables() { + if (connectionsManager.length == 0) { + readContacts(); + } + + return _readRelayableJson(jsonData['others_data']?['relayables'] ?? []); + } + + List _readRelayableJson(List relayableJsonList) => + relayableJsonList + .map((e) => relayableFromDiasporaPostJson(e)) + .where((r) => r.isSuccess) + .map((r) => r.value) + .toList(); } diff --git a/friendica_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart b/friendica_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart index 636c876..dd40f96 100644 --- a/friendica_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart +++ b/friendica_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart @@ -55,12 +55,12 @@ TimelineEntry timelineEntryFromFriendicaJson( modificationTimestamp: modificationTimestamp, backdatedTimestamp: backdatedTimestamp, locationData: actualLocationData, - externalLink: externalLink, body: body, isReshare: isReshare, id: id, parentId: parentId, parentAuthorId: parentAuthorId, + externalLink: externalLink, author: author, authorId: authorId, parentAuthor: parentAuthor, diff --git a/friendica_archive_browser/lib/src/models/timeline_entry.dart b/friendica_archive_browser/lib/src/models/timeline_entry.dart index cad73df..36f63c8 100644 --- a/friendica_archive_browser/lib/src/models/timeline_entry.dart +++ b/friendica_archive_browser/lib/src/models/timeline_entry.dart @@ -41,6 +41,8 @@ class TimelineEntry { final List dislikes; + final List links; + TimelineEntry({ this.id = '', this.parentId = '', @@ -56,10 +58,13 @@ class TimelineEntry { this.parentAuthorId = '', this.externalLink = '', this.locationData = const LocationData(), - this.likes = const [], - this.dislikes = const [], + this.links = const [], + List? likes, + List? dislikes, List? mediaAttachments, - }) : mediaAttachments = mediaAttachments ?? []; + }) : mediaAttachments = mediaAttachments ?? [], + likes = likes ?? [], + dislikes = dislikes ?? []; TimelineEntry.randomBuilt() : creationTimestamp = DateTime.now().millisecondsSinceEpoch, @@ -78,6 +83,7 @@ class TimelineEntry { locationData = LocationData.randomBuilt(), likes = const [], dislikes = const [], + links = [], mediaAttachments = [ MediaAttachment.randomBuilt(), MediaAttachment.randomBuilt() @@ -103,24 +109,26 @@ class TimelineEntry { List? dislikes, List? links}) { return TimelineEntry( - creationTimestamp: creationTimestamp ?? this.creationTimestamp, - backdatedTimestamp: backdatedTimestamp ?? this.backdatedTimestamp, - modificationTimestamp: - modificationTimestamp ?? this.modificationTimestamp, - id: id ?? this.id, - isReshare: isReshare ?? this.isReshare, - parentId: parentId ?? this.parentId, - externalLink: externalLink ?? this.externalLink, - body: body ?? this.body, - title: title ?? this.title, - author: author ?? this.author, - authorId: authorId ?? this.authorId, - parentAuthor: parentAuthor ?? this.parentAuthor, - parentAuthorId: parentAuthorId ?? this.parentAuthorId, - locationData: locationData ?? this.locationData, - mediaAttachments: mediaAttachments ?? this.mediaAttachments, - likes: likes ?? this.likes, - dislikes: dislikes ?? this.dislikes); + creationTimestamp: creationTimestamp ?? this.creationTimestamp, + backdatedTimestamp: backdatedTimestamp ?? this.backdatedTimestamp, + modificationTimestamp: + modificationTimestamp ?? this.modificationTimestamp, + id: id ?? this.id, + isReshare: isReshare ?? this.isReshare, + parentId: parentId ?? this.parentId, + externalLink: externalLink ?? this.externalLink, + body: body ?? this.body, + title: title ?? this.title, + author: author ?? this.author, + authorId: authorId ?? this.authorId, + parentAuthor: parentAuthor ?? this.parentAuthor, + parentAuthorId: parentAuthorId ?? this.parentAuthorId, + locationData: locationData ?? this.locationData, + mediaAttachments: mediaAttachments ?? this.mediaAttachments, + likes: likes ?? this.likes, + dislikes: dislikes ?? this.dislikes, + links: links ?? this.links, + ); } @override @@ -147,6 +155,7 @@ class TimelineEntry { if (mediaAttachments.isNotEmpty) 'Photos and Videos:', ...mediaAttachments.map((e) => e.toHumanString(mapper)), if (locationData.hasPosition) locationData.toHumanString(), + if (links.isNotEmpty) ...['Links:', ...links.map((e) => e.toString())] ].join('\n'); } diff --git a/friendica_archive_browser/lib/src/screens/stats_screen.dart b/friendica_archive_browser/lib/src/screens/stats_screen.dart index 4407ed1..3358922 100644 --- a/friendica_archive_browser/lib/src/screens/stats_screen.dart +++ b/friendica_archive_browser/lib/src/screens/stats_screen.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/components/filter_control_component.dart'; import 'package:friendica_archive_browser/src/components/heatmap_widget.dart'; import 'package:friendica_archive_browser/src/components/timechart_widget.dart'; import 'package:friendica_archive_browser/src/components/top_interactactors_widget.dart'; import 'package:friendica_archive_browser/src/components/word_frequency_widget.dart'; -import 'package:friendica_archive_browser/src/components/filter_control_component.dart'; import 'package:friendica_archive_browser/src/models/model_utils.dart'; import 'package:friendica_archive_browser/src/models/time_element.dart'; import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; diff --git a/friendica_archive_browser/lib/src/services/connections_manager.dart b/friendica_archive_browser/lib/src/services/connections_manager.dart index 137fccd..c71401f 100644 --- a/friendica_archive_browser/lib/src/services/connections_manager.dart +++ b/friendica_archive_browser/lib/src/services/connections_manager.dart @@ -4,12 +4,14 @@ import 'package:result_monad/result_monad.dart'; class ConnectionsManager { final _connectionsById = {}; final _connectionsByName = {}; + final _connectionsByProfileUrl = {}; int get length => _connectionsById.length; void clearCaches() { _connectionsById.clear(); _connectionsByName.clear(); + _connectionsByProfileUrl.clear(); } bool addConnection(Connection connection) { @@ -18,6 +20,7 @@ class ConnectionsManager { } _connectionsById[connection.id] = connection; _connectionsByName[connection.name] = connection; + _connectionsByProfileUrl[connection.profileUrl] = connection; return true; } @@ -43,4 +46,10 @@ class ConnectionsManager { return result != null ? Result.ok(result) : Result.error('$name not found'); } + + Result getByProfileUrl(Uri url) { + final result = _connectionsByProfileUrl[url]; + + return result != null ? Result.ok(result) : Result.error('$url not found'); + } } From af69bb910b5872970265da71e6852c85e1c4f62e Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Wed, 16 Mar 2022 15:03:38 -0400 Subject: [PATCH 10/14] Fix image file preview loading --- .../src/components/media_wrapper_component.dart | 15 +++++++-------- .../services/diaspora_path_mapping_service.dart | 4 ++++ .../services/friendica_path_mapping_service.dart | 14 ++------------ 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/friendica_archive_browser/lib/src/components/media_wrapper_component.dart b/friendica_archive_browser/lib/src/components/media_wrapper_component.dart index 7cce22a..b3d836e 100644 --- a/friendica_archive_browser/lib/src/components/media_wrapper_component.dart +++ b/friendica_archive_browser/lib/src/components/media_wrapper_component.dart @@ -55,13 +55,13 @@ class MediaWrapperComponent extends StatelessWidget { noImageText: 'No Thumbnail', noImageOnTapText: 'Click to launch video in external player (No Thumbnail)', - onTap: () async => - await _attemptToPlay(context, videoPlayerCommand, path)); + onTap: () async => await _attemptToPlay( + context, videoPlayerCommand, path.toString())); } return TextButton( onPressed: () async { - await _attemptToPlay(context, videoPlayerCommand, path); + await _attemptToPlay(context, videoPlayerCommand, path.toString()); }, child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( @@ -74,8 +74,7 @@ class MediaWrapperComponent extends StatelessWidget { } if (mediaAttachment.explicitType == AttachmentMediaType.image) { - final imageResult = - _uriToImage(mediaAttachment.uri, archiveService.pathMappingService); + final imageResult = _uriToImage(path, archiveService.pathMappingService); if (imageResult.image == null) { final errorPath = imageResult.path.isNotEmpty ? imageResult.path @@ -172,13 +171,13 @@ class MediaWrapperComponent extends StatelessWidget { return InkWell(onTap: onTap, child: imageWidget); } - String _calculatePath(ArchiveServiceProvider archiveService) { + Uri _calculatePath(ArchiveServiceProvider archiveService) { final url = mediaAttachment.uri.toString(); String basePath = ''; if (url.startsWith('http')) { final localCacheFile = archiveService.getImageByUrl(url); if (localCacheFile.isFailure) { - return url; + return mediaAttachment.uri; } basePath = localCacheFile.value.localFilename; @@ -186,7 +185,7 @@ class MediaWrapperComponent extends StatelessWidget { basePath = mediaAttachment.uri.path; } - return archiveService.pathMappingService.toFullPath(basePath); + return Uri.parse(basePath); } } diff --git a/friendica_archive_browser/lib/src/diaspora/services/diaspora_path_mapping_service.dart b/friendica_archive_browser/lib/src/diaspora/services/diaspora_path_mapping_service.dart index 2e9ec39..5d2f62e 100644 --- a/friendica_archive_browser/lib/src/diaspora/services/diaspora_path_mapping_service.dart +++ b/friendica_archive_browser/lib/src/diaspora/services/diaspora_path_mapping_service.dart @@ -40,6 +40,10 @@ class DiasporaPathMappingService implements PathMappingService { @override String toFullPath(String relPath) { + if (File(relPath).existsSync()) { + return relPath; + } + for (final file in _photoDirectories) { final fullPath = p.join(file.path, relPath); if (File(fullPath).existsSync()) { diff --git a/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart b/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart index d189bd3..5d4b1bb 100644 --- a/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart +++ b/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart @@ -29,19 +29,9 @@ class FriendicaPathMappingService implements PathMappingService { } _archiveDirectories.clear(); - try { - if (_calcRootIsSingleArchiveFolder()) { - _archiveDirectories.add(Directory(rootFolder)); - return; - } - } catch (e) { - _logger - .severe('Error thrown while trying to calculate root structure: $e'); - return; - } - + final recursive = !_calcRootIsSingleArchiveFolder(); _archiveDirectories.addAll(Directory(settings.rootFolder) - .listSync(recursive: false) + .listSync(recursive: recursive) .where((element) => element.statSync().type == FileSystemEntityType.directory)); } From c138bc9aecf1d51967e2247b8d3b202f0660c047 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Wed, 16 Mar 2022 15:20:57 -0400 Subject: [PATCH 11/14] Fix link preview when OpenGraph image data is relative path not server URL --- .../lib/src/components/link_elements_component.dart | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/friendica_archive_browser/lib/src/components/link_elements_component.dart b/friendica_archive_browser/lib/src/components/link_elements_component.dart index 055c1fb..580c96b 100644 --- a/friendica_archive_browser/lib/src/components/link_elements_component.dart +++ b/friendica_archive_browser/lib/src/components/link_elements_component.dart @@ -45,6 +45,16 @@ class _LinkElementsComponentState extends State { var ogData = MetadataParser.openGraph(document); ogData.url ??= url.toString(); + if (!(ogData.image?.startsWith('http') ?? true)) { + try { + final separator = ogData.image?.startsWith('/') ?? true ? '' : '/'; + final serverPath = 'https://${url.host}$separator${ogData.image}'; + ogData.image = serverPath; + } catch (e) { + _logger.finest( + 'Unable to map relative ogData.image data into server url'); + } + } _linkPreviewData.add(ogData); } From a1aa67ba9dd895199def2f5ebef6cab494c10232 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Wed, 16 Mar 2022 18:22:33 -0400 Subject: [PATCH 12/14] Rename friendica_archive_browser to fediverse_archive_browser --- friendica_archive_browser/README.md | 9 +++---- friendica_archive_browser/lib/main.dart | 2 +- friendica_archive_browser/lib/src/app.dart | 6 ++--- .../lib/src/components/barchart_panel.dart | 2 +- .../components/filter_control_component.dart | 2 +- .../src/components/geo/geo_extensions.dart | 2 +- .../lib/src/components/geo/marker_data.dart | 2 +- .../components/heatmap/heatmap_component.dart | 10 ++++---- .../src/components/heatmap/heatmap_tile.dart | 2 +- .../lib/src/components/heatmap_widget.dart | 6 ++--- .../components/media_timeline_component.dart | 8 +++---- .../components/media_wrapper_component.dart | 10 ++++---- .../lib/src/components/timechart_widget.dart | 10 ++++---- .../components/top_interactactors_widget.dart | 8 +++---- .../lib/src/components/tree_entry_card.dart | 12 +++++----- .../src/components/word_frequency_widget.dart | 4 ++-- .../diaspora/models/diaspora_relayables.dart | 4 ++-- .../diaspora_contact_serializer.dart | 2 +- .../diaspora_posts_serializer.dart | 8 +++---- .../diaspora_relayables_serializer.dart | 8 +++---- .../services/diaspora_archive_service.dart | 8 +++---- .../diaspora_profile_json_reader.dart | 12 +++++----- .../friendica_timeline_entry_serializer.dart | 4 ++-- .../services/friendica_archive_service.dart | 14 +++++------ .../friendica_path_mapping_service.dart | 2 +- friendica_archive_browser/lib/src/home.dart | 2 +- .../lib/src/models/entry_tree_item.dart | 2 +- .../lib/src/models/location_data.dart | 2 +- .../lib/src/models/media_attachment.dart | 2 +- .../lib/src/models/time_element.dart | 2 +- .../lib/src/models/timeline_entry.dart | 4 ++-- .../lib/src/screens/entries_screen.dart | 14 +++++------ .../lib/src/screens/error_screen.dart | 4 ++-- .../lib/src/screens/geospatial_screen.dart | 24 +++++++++---------- .../src/screens/media_slideshow_screen.dart | 12 +++++----- .../lib/src/screens/stats_screen.dart | 20 ++++++++-------- .../services/archive_service_interface.dart | 2 +- .../services/archive_service_provider.dart | 16 ++++++------- .../lib/src/services/connections_manager.dart | 2 +- .../lib/src/settings/settings_controller.dart | 6 ++--- .../lib/src/settings/settings_service.dart | 2 +- .../lib/src/settings/settings_view.dart | 8 +++---- .../lib/src/utils/clipboard_helper.dart | 2 +- .../lib/src/utils/offsetdatetime_utils.dart | 2 +- .../lib/src/utils/time_stat_generator.dart | 4 ++-- .../src/utils/top_interactors_generator.dart | 6 ++--- .../linux/my_application.cc | 4 ++-- friendica_archive_browser/pubspec.yaml | 4 ++-- .../test/additional_key_logger_test.dart | 2 +- .../disapora_profile_json_reader_test.dart | 6 ++--- .../test/word_map_generator_test.dart | 2 +- .../windows/runner/Runner.rc | 12 +++++----- .../windows/runner/main.cpp | 2 +- 53 files changed, 164 insertions(+), 163 deletions(-) diff --git a/friendica_archive_browser/README.md b/friendica_archive_browser/README.md index 12b457c..bd1035e 100644 --- a/friendica_archive_browser/README.md +++ b/friendica_archive_browser/README.md @@ -1,11 +1,12 @@ -# Friendica Archive Browser +# Fediverse Archive Browser -A Flutter-based cross platform desktop -application for browsing the Friendica account archive that a user can +A Flutter-based cross platform desktop application for browsing +the archives from Diaspora or Friendica. The Diaspora archive can be exported +directly from your profile on your pod. The Friendica archive can be generate and update using the [Friendica Archiver](https://gitlab.com/mysocialportal/friendica-archiving-tools/-/tree/main/friendica_archiver). The archive takes the form of a folder with a series of JSON files and a local image archive. Simply point the application at this folder and -begin usage +begin usage. ## Installation diff --git a/friendica_archive_browser/lib/main.dart b/friendica_archive_browser/lib/main.dart index 86cdbb6..9f58ad5 100644 --- a/friendica_archive_browser/lib/main.dart +++ b/friendica_archive_browser/lib/main.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/utils/temp_file_builder.dart'; +import 'package:fediverse_archive_browser/src/utils/temp_file_builder.dart'; import 'package:logging/logging.dart'; import 'src/app.dart'; diff --git a/friendica_archive_browser/lib/src/app.dart b/friendica_archive_browser/lib/src/app.dart index 2a7b61f..cc4ee4d 100644 --- a/friendica_archive_browser/lib/src/app.dart +++ b/friendica_archive_browser/lib/src/app.dart @@ -2,9 +2,9 @@ import 'package:desktop_window/desktop_window.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; -import 'package:friendica_archive_browser/src/themes.dart'; -import 'package:friendica_archive_browser/src/utils/scrolling_behavior.dart'; +import 'package:fediverse_archive_browser/src/services/archive_service_provider.dart'; +import 'package:fediverse_archive_browser/src/themes.dart'; +import 'package:fediverse_archive_browser/src/utils/scrolling_behavior.dart'; import 'package:provider/provider.dart'; import 'home.dart'; diff --git a/friendica_archive_browser/lib/src/components/barchart_panel.dart b/friendica_archive_browser/lib/src/components/barchart_panel.dart index 6bb0a36..fcdd54c 100644 --- a/friendica_archive_browser/lib/src/components/barchart_panel.dart +++ b/friendica_archive_browser/lib/src/components/barchart_panel.dart @@ -1,6 +1,6 @@ import 'package:charts_flutter/flutter.dart' as charts; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/models/stat_bin.dart'; +import 'package:fediverse_archive_browser/src/models/stat_bin.dart'; import 'package:logging/logging.dart'; class BarChartComponent extends StatelessWidget { diff --git a/friendica_archive_browser/lib/src/components/filter_control_component.dart b/friendica_archive_browser/lib/src/components/filter_control_component.dart index 12da6fd..546a9f4 100644 --- a/friendica_archive_browser/lib/src/components/filter_control_component.dart +++ b/friendica_archive_browser/lib/src/components/filter_control_component.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:fediverse_archive_browser/src/settings/settings_controller.dart'; import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; diff --git a/friendica_archive_browser/lib/src/components/geo/geo_extensions.dart b/friendica_archive_browser/lib/src/components/geo/geo_extensions.dart index c5a339f..4eb67a4 100644 --- a/friendica_archive_browser/lib/src/components/geo/geo_extensions.dart +++ b/friendica_archive_browser/lib/src/components/geo/geo_extensions.dart @@ -1,6 +1,6 @@ import 'dart:ui'; -import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; +import 'package:fediverse_archive_browser/src/models/timeline_entry.dart'; import 'package:latlng/latlng.dart'; import 'package:map/map.dart'; diff --git a/friendica_archive_browser/lib/src/components/geo/marker_data.dart b/friendica_archive_browser/lib/src/components/geo/marker_data.dart index c921c9e..eeca700 100644 --- a/friendica_archive_browser/lib/src/components/geo/marker_data.dart +++ b/friendica_archive_browser/lib/src/components/geo/marker_data.dart @@ -1,6 +1,6 @@ import 'dart:ui'; -import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; +import 'package:fediverse_archive_browser/src/models/timeline_entry.dart'; class MarkerData { final List posts; diff --git a/friendica_archive_browser/lib/src/components/heatmap/heatmap_component.dart b/friendica_archive_browser/lib/src/components/heatmap/heatmap_component.dart index 54a5c99..67a2d6d 100644 --- a/friendica_archive_browser/lib/src/components/heatmap/heatmap_component.dart +++ b/friendica_archive_browser/lib/src/components/heatmap/heatmap_component.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/components/heatmap/heatmap_tile.dart'; -import 'package:friendica_archive_browser/src/components/heatmap/tile_color_map.dart'; -import 'package:friendica_archive_browser/src/models/stat_bin.dart'; -import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; -import 'package:friendica_archive_browser/src/utils/time_stat_generator.dart'; +import 'package:fediverse_archive_browser/src/components/heatmap/heatmap_tile.dart'; +import 'package:fediverse_archive_browser/src/components/heatmap/tile_color_map.dart'; +import 'package:fediverse_archive_browser/src/models/stat_bin.dart'; +import 'package:fediverse_archive_browser/src/settings/settings_controller.dart'; +import 'package:fediverse_archive_browser/src/utils/time_stat_generator.dart'; import 'package:provider/provider.dart'; class HeatMapComponent extends StatelessWidget { diff --git a/friendica_archive_browser/lib/src/components/heatmap/heatmap_tile.dart b/friendica_archive_browser/lib/src/components/heatmap/heatmap_tile.dart index 5084fee..4e524c5 100644 --- a/friendica_archive_browser/lib/src/components/heatmap/heatmap_tile.dart +++ b/friendica_archive_browser/lib/src/components/heatmap/heatmap_tile.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/components/heatmap/tile_color_map.dart'; +import 'package:fediverse_archive_browser/src/components/heatmap/tile_color_map.dart'; class HeatMapTile extends StatelessWidget { static const width = 12.0; diff --git a/friendica_archive_browser/lib/src/components/heatmap_widget.dart b/friendica_archive_browser/lib/src/components/heatmap_widget.dart index 0f450dd..3646b60 100644 --- a/friendica_archive_browser/lib/src/components/heatmap_widget.dart +++ b/friendica_archive_browser/lib/src/components/heatmap_widget.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/models/time_element.dart'; -import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; -import 'package:friendica_archive_browser/src/utils/time_stat_generator.dart'; +import 'package:fediverse_archive_browser/src/models/time_element.dart'; +import 'package:fediverse_archive_browser/src/screens/standin_status_screen.dart'; +import 'package:fediverse_archive_browser/src/utils/time_stat_generator.dart'; import 'heatmap/heatmap_component.dart'; diff --git a/friendica_archive_browser/lib/src/components/media_timeline_component.dart b/friendica_archive_browser/lib/src/components/media_timeline_component.dart index 51096b5..6efbdd8 100644 --- a/friendica_archive_browser/lib/src/components/media_timeline_component.dart +++ b/friendica_archive_browser/lib/src/components/media_timeline_component.dart @@ -1,10 +1,10 @@ import 'dart:math'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/models/media_attachment.dart'; -import 'package:friendica_archive_browser/src/screens/media_slideshow_screen.dart'; -import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; -import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:fediverse_archive_browser/src/models/media_attachment.dart'; +import 'package:fediverse_archive_browser/src/screens/media_slideshow_screen.dart'; +import 'package:fediverse_archive_browser/src/services/archive_service_provider.dart'; +import 'package:fediverse_archive_browser/src/settings/settings_controller.dart'; import 'package:provider/provider.dart'; import 'media_wrapper_component.dart'; diff --git a/friendica_archive_browser/lib/src/components/media_wrapper_component.dart b/friendica_archive_browser/lib/src/components/media_wrapper_component.dart index b3d836e..5fc5f8f 100644 --- a/friendica_archive_browser/lib/src/components/media_wrapper_component.dart +++ b/friendica_archive_browser/lib/src/components/media_wrapper_component.dart @@ -2,11 +2,11 @@ import 'dart:async'; import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/models/media_attachment.dart'; -import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; -import 'package:friendica_archive_browser/src/services/path_mapper_service_interface.dart'; -import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; -import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; +import 'package:fediverse_archive_browser/src/models/media_attachment.dart'; +import 'package:fediverse_archive_browser/src/services/archive_service_provider.dart'; +import 'package:fediverse_archive_browser/src/services/path_mapper_service_interface.dart'; +import 'package:fediverse_archive_browser/src/settings/settings_controller.dart'; +import 'package:fediverse_archive_browser/src/utils/snackbar_status_builder.dart'; import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; diff --git a/friendica_archive_browser/lib/src/components/timechart_widget.dart b/friendica_archive_browser/lib/src/components/timechart_widget.dart index fe61f7b..01ecabe 100644 --- a/friendica_archive_browser/lib/src/components/timechart_widget.dart +++ b/friendica_archive_browser/lib/src/components/timechart_widget.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/components/barchart_panel.dart'; -import 'package:friendica_archive_browser/src/models/stat_bin.dart'; -import 'package:friendica_archive_browser/src/models/time_element.dart'; -import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; -import 'package:friendica_archive_browser/src/utils/time_stat_generator.dart'; +import 'package:fediverse_archive_browser/src/components/barchart_panel.dart'; +import 'package:fediverse_archive_browser/src/models/stat_bin.dart'; +import 'package:fediverse_archive_browser/src/models/time_element.dart'; +import 'package:fediverse_archive_browser/src/screens/standin_status_screen.dart'; +import 'package:fediverse_archive_browser/src/utils/time_stat_generator.dart'; import 'package:logging/logging.dart'; class TimeChartWidget extends StatefulWidget { diff --git a/friendica_archive_browser/lib/src/components/top_interactactors_widget.dart b/friendica_archive_browser/lib/src/components/top_interactactors_widget.dart index b35795d..081865b 100644 --- a/friendica_archive_browser/lib/src/components/top_interactactors_widget.dart +++ b/friendica_archive_browser/lib/src/components/top_interactactors_widget.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/models/time_element.dart'; -import 'package:friendica_archive_browser/src/services/connections_manager.dart'; -import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; -import 'package:friendica_archive_browser/src/utils/top_interactors_generator.dart'; +import 'package:fediverse_archive_browser/src/models/time_element.dart'; +import 'package:fediverse_archive_browser/src/services/connections_manager.dart'; +import 'package:fediverse_archive_browser/src/utils/snackbar_status_builder.dart'; +import 'package:fediverse_archive_browser/src/utils/top_interactors_generator.dart'; import 'package:logging/logging.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/friendica_archive_browser/lib/src/components/tree_entry_card.dart b/friendica_archive_browser/lib/src/components/tree_entry_card.dart index 6e50c47..25f131f 100644 --- a/friendica_archive_browser/lib/src/components/tree_entry_card.dart +++ b/friendica_archive_browser/lib/src/components/tree_entry_card.dart @@ -1,12 +1,12 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart'; -import 'package:friendica_archive_browser/src/models/entry_tree_item.dart'; -import 'package:friendica_archive_browser/src/models/location_data.dart'; -import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; -import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; -import 'package:friendica_archive_browser/src/utils/clipboard_helper.dart'; -import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; +import 'package:fediverse_archive_browser/src/models/entry_tree_item.dart'; +import 'package:fediverse_archive_browser/src/models/location_data.dart'; +import 'package:fediverse_archive_browser/src/services/archive_service_provider.dart'; +import 'package:fediverse_archive_browser/src/settings/settings_controller.dart'; +import 'package:fediverse_archive_browser/src/utils/clipboard_helper.dart'; +import 'package:fediverse_archive_browser/src/utils/snackbar_status_builder.dart'; import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/friendica_archive_browser/lib/src/components/word_frequency_widget.dart b/friendica_archive_browser/lib/src/components/word_frequency_widget.dart index 3fe6167..e3d91e1 100644 --- a/friendica_archive_browser/lib/src/components/word_frequency_widget.dart +++ b/friendica_archive_browser/lib/src/components/word_frequency_widget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/models/time_element.dart'; -import 'package:friendica_archive_browser/src/utils/word_map_generator.dart'; +import 'package:fediverse_archive_browser/src/models/time_element.dart'; +import 'package:fediverse_archive_browser/src/utils/word_map_generator.dart'; import 'package:logging/logging.dart'; class WordFrequencyWidget extends StatefulWidget { diff --git a/friendica_archive_browser/lib/src/diaspora/models/diaspora_relayables.dart b/friendica_archive_browser/lib/src/diaspora/models/diaspora_relayables.dart index abf1319..88d3c11 100644 --- a/friendica_archive_browser/lib/src/diaspora/models/diaspora_relayables.dart +++ b/friendica_archive_browser/lib/src/diaspora/models/diaspora_relayables.dart @@ -1,5 +1,5 @@ -import 'package:friendica_archive_browser/src/diaspora/models/diaspora_reaction.dart'; -import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; +import 'package:fediverse_archive_browser/src/diaspora/models/diaspora_reaction.dart'; +import 'package:fediverse_archive_browser/src/models/timeline_entry.dart'; class DiasporaRelayable { final DiasporaReaction? reaction; diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart index f602163..a2cc6cf 100644 --- a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart +++ b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart @@ -1,4 +1,4 @@ -import 'package:friendica_archive_browser/src/models/connection.dart'; +import 'package:fediverse_archive_browser/src/models/connection.dart'; import 'package:uuid/uuid.dart'; Connection contactFromDiasporaJson(Map json) { diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart index 93d8820..c842247 100644 --- a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart +++ b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart @@ -1,7 +1,7 @@ -import 'package:friendica_archive_browser/src/models/connection.dart'; -import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; -import 'package:friendica_archive_browser/src/utils/exec_error.dart'; -import 'package:friendica_archive_browser/src/utils/offsetdatetime_utils.dart'; +import 'package:fediverse_archive_browser/src/models/connection.dart'; +import 'package:fediverse_archive_browser/src/models/timeline_entry.dart'; +import 'package:fediverse_archive_browser/src/utils/exec_error.dart'; +import 'package:fediverse_archive_browser/src/utils/offsetdatetime_utils.dart'; import 'package:logging/logging.dart'; import 'package:markdown/markdown.dart'; import 'package:result_monad/result_monad.dart'; diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_relayables_serializer.dart b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_relayables_serializer.dart index a9a944f..aecd8f7 100644 --- a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_relayables_serializer.dart +++ b/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_relayables_serializer.dart @@ -1,7 +1,7 @@ -import 'package:friendica_archive_browser/src/diaspora/models/diaspora_relayables.dart'; -import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; -import 'package:friendica_archive_browser/src/utils/exec_error.dart'; -import 'package:friendica_archive_browser/src/utils/offsetdatetime_utils.dart'; +import 'package:fediverse_archive_browser/src/diaspora/models/diaspora_relayables.dart'; +import 'package:fediverse_archive_browser/src/models/timeline_entry.dart'; +import 'package:fediverse_archive_browser/src/utils/exec_error.dart'; +import 'package:fediverse_archive_browser/src/utils/offsetdatetime_utils.dart'; import 'package:logging/logging.dart'; import 'package:markdown/markdown.dart'; import 'package:result_monad/result_monad.dart'; diff --git a/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart b/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart index 1b465d5..fb1b53e 100644 --- a/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart +++ b/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart @@ -1,9 +1,9 @@ import 'dart:io'; -import 'package:friendica_archive_browser/src/diaspora/services/diaspora_path_mapping_service.dart'; -import 'package:friendica_archive_browser/src/diaspora/services/diaspora_profile_json_reader.dart'; -import 'package:friendica_archive_browser/src/models/connection.dart'; -import 'package:friendica_archive_browser/src/services/archive_service_interface.dart'; +import 'package:fediverse_archive_browser/src/diaspora/services/diaspora_path_mapping_service.dart'; +import 'package:fediverse_archive_browser/src/diaspora/services/diaspora_profile_json_reader.dart'; +import 'package:fediverse_archive_browser/src/models/connection.dart'; +import 'package:fediverse_archive_browser/src/services/archive_service_interface.dart'; import 'package:path/path.dart' as p; import 'package:result_monad/result_monad.dart'; diff --git a/friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart b/friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart index b36c9d0..a302a45 100644 --- a/friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart +++ b/friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart @@ -1,12 +1,12 @@ import 'dart:convert'; import 'dart:io'; -import 'package:friendica_archive_browser/src/diaspora/models/diaspora_relayables.dart'; -import 'package:friendica_archive_browser/src/diaspora/serializers/diaspora_contact_serializer.dart'; -import 'package:friendica_archive_browser/src/diaspora/serializers/diaspora_relayables_serializer.dart'; -import 'package:friendica_archive_browser/src/models/connection.dart'; -import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; -import 'package:friendica_archive_browser/src/services/connections_manager.dart'; +import 'package:fediverse_archive_browser/src/diaspora/models/diaspora_relayables.dart'; +import 'package:fediverse_archive_browser/src/diaspora/serializers/diaspora_contact_serializer.dart'; +import 'package:fediverse_archive_browser/src/diaspora/serializers/diaspora_relayables_serializer.dart'; +import 'package:fediverse_archive_browser/src/models/connection.dart'; +import 'package:fediverse_archive_browser/src/models/timeline_entry.dart'; +import 'package:fediverse_archive_browser/src/services/connections_manager.dart'; import '../serializers/diaspora_posts_serializer.dart'; diff --git a/friendica_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart b/friendica_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart index dd40f96..d6da700 100644 --- a/friendica_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart +++ b/friendica_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart @@ -1,5 +1,5 @@ -import 'package:friendica_archive_browser/src/friendica/serializers/friendica_contact_serializer.dart'; -import 'package:friendica_archive_browser/src/friendica/serializers/friendica_media_attachment_serializer.dart'; +import 'package:fediverse_archive_browser/src/friendica/serializers/friendica_contact_serializer.dart'; +import 'package:fediverse_archive_browser/src/friendica/serializers/friendica_media_attachment_serializer.dart'; import 'package:logging/logging.dart'; import '../../models/location_data.dart'; diff --git a/friendica_archive_browser/lib/src/friendica/services/friendica_archive_service.dart b/friendica_archive_browser/lib/src/friendica/services/friendica_archive_service.dart index 0b6660b..4cc62ca 100644 --- a/friendica_archive_browser/lib/src/friendica/services/friendica_archive_service.dart +++ b/friendica_archive_browser/lib/src/friendica/services/friendica_archive_service.dart @@ -1,13 +1,13 @@ import 'dart:convert'; import 'dart:io'; -import 'package:friendica_archive_browser/src/friendica/serializers/friendica_timeline_entry_serializer.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; -import 'package:friendica_archive_browser/src/models/entry_tree_item.dart'; -import 'package:friendica_archive_browser/src/models/local_image_archive_entry.dart'; -import 'package:friendica_archive_browser/src/services/archive_service_interface.dart'; -import 'package:friendica_archive_browser/src/services/connections_manager.dart'; -import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:fediverse_archive_browser/src/friendica/serializers/friendica_timeline_entry_serializer.dart'; +import 'package:fediverse_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; +import 'package:fediverse_archive_browser/src/models/entry_tree_item.dart'; +import 'package:fediverse_archive_browser/src/models/local_image_archive_entry.dart'; +import 'package:fediverse_archive_browser/src/services/archive_service_interface.dart'; +import 'package:fediverse_archive_browser/src/services/connections_manager.dart'; +import 'package:fediverse_archive_browser/src/utils/exec_error.dart'; import 'package:path/path.dart' as p; import 'package:result_monad/result_monad.dart'; diff --git a/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart b/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart index 5d4b1bb..e32ab55 100644 --- a/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart +++ b/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart @@ -1,6 +1,6 @@ import 'dart:io'; -import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:fediverse_archive_browser/src/settings/settings_controller.dart'; import 'package:logging/logging.dart'; import 'package:path/path.dart' as p; diff --git a/friendica_archive_browser/lib/src/home.dart b/friendica_archive_browser/lib/src/home.dart index cf5a2d3..6e0d9d7 100644 --- a/friendica_archive_browser/lib/src/home.dart +++ b/friendica_archive_browser/lib/src/home.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; +import 'package:fediverse_archive_browser/src/services/archive_service_provider.dart'; import 'screens/entries_screen.dart'; import 'screens/stats_screen.dart'; diff --git a/friendica_archive_browser/lib/src/models/entry_tree_item.dart b/friendica_archive_browser/lib/src/models/entry_tree_item.dart index b6b3cff..095f752 100644 --- a/friendica_archive_browser/lib/src/models/entry_tree_item.dart +++ b/friendica_archive_browser/lib/src/models/entry_tree_item.dart @@ -1,4 +1,4 @@ -import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; +import 'package:fediverse_archive_browser/src/models/timeline_entry.dart'; class EntryTreeItem { final TimelineEntry entry; diff --git a/friendica_archive_browser/lib/src/models/location_data.dart b/friendica_archive_browser/lib/src/models/location_data.dart index fd66249..b64cbbd 100644 --- a/friendica_archive_browser/lib/src/models/location_data.dart +++ b/friendica_archive_browser/lib/src/models/location_data.dart @@ -1,7 +1,7 @@ import 'dart:math'; import 'package:flutter/widgets.dart'; -import 'package:friendica_archive_browser/src/components/link_elements_component.dart'; +import 'package:fediverse_archive_browser/src/components/link_elements_component.dart'; import 'model_utils.dart'; diff --git a/friendica_archive_browser/lib/src/models/media_attachment.dart b/friendica_archive_browser/lib/src/models/media_attachment.dart index a3c92a8..b049f9f 100644 --- a/friendica_archive_browser/lib/src/models/media_attachment.dart +++ b/friendica_archive_browser/lib/src/models/media_attachment.dart @@ -1,6 +1,6 @@ import 'dart:io'; -import 'package:friendica_archive_browser/src/services/path_mapper_service_interface.dart'; +import 'package:fediverse_archive_browser/src/services/path_mapper_service_interface.dart'; import 'model_utils.dart'; diff --git a/friendica_archive_browser/lib/src/models/time_element.dart b/friendica_archive_browser/lib/src/models/time_element.dart index a905fa0..97d5260 100644 --- a/friendica_archive_browser/lib/src/models/time_element.dart +++ b/friendica_archive_browser/lib/src/models/time_element.dart @@ -1,4 +1,4 @@ -import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; +import 'package:fediverse_archive_browser/src/models/timeline_entry.dart'; class TimeElement { final DateTime timestamp; diff --git a/friendica_archive_browser/lib/src/models/timeline_entry.dart b/friendica_archive_browser/lib/src/models/timeline_entry.dart index 36f63c8..138ff42 100644 --- a/friendica_archive_browser/lib/src/models/timeline_entry.dart +++ b/friendica_archive_browser/lib/src/models/timeline_entry.dart @@ -1,5 +1,5 @@ -import 'package:friendica_archive_browser/src/models/connection.dart'; -import 'package:friendica_archive_browser/src/services/path_mapper_service_interface.dart'; +import 'package:fediverse_archive_browser/src/models/connection.dart'; +import 'package:fediverse_archive_browser/src/services/path_mapper_service_interface.dart'; import 'package:intl/intl.dart'; import 'location_data.dart'; diff --git a/friendica_archive_browser/lib/src/screens/entries_screen.dart b/friendica_archive_browser/lib/src/screens/entries_screen.dart index 958ebbb..0ce16fa 100644 --- a/friendica_archive_browser/lib/src/screens/entries_screen.dart +++ b/friendica_archive_browser/lib/src/screens/entries_screen.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/components/filter_control_component.dart'; -import 'package:friendica_archive_browser/src/components/tree_entry_card.dart'; -import 'package:friendica_archive_browser/src/models/entry_tree_item.dart'; -import 'package:friendica_archive_browser/src/models/model_utils.dart'; -import 'package:friendica_archive_browser/src/screens/error_screen.dart'; -import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; -import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:fediverse_archive_browser/src/components/filter_control_component.dart'; +import 'package:fediverse_archive_browser/src/components/tree_entry_card.dart'; +import 'package:fediverse_archive_browser/src/models/entry_tree_item.dart'; +import 'package:fediverse_archive_browser/src/models/model_utils.dart'; +import 'package:fediverse_archive_browser/src/screens/error_screen.dart'; +import 'package:fediverse_archive_browser/src/settings/settings_controller.dart'; +import 'package:fediverse_archive_browser/src/utils/exec_error.dart'; import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; import 'package:result_monad/result_monad.dart'; diff --git a/friendica_archive_browser/lib/src/screens/error_screen.dart b/friendica_archive_browser/lib/src/screens/error_screen.dart index 56a4283..0daa73f 100644 --- a/friendica_archive_browser/lib/src/screens/error_screen.dart +++ b/friendica_archive_browser/lib/src/screens/error_screen.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; -import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:fediverse_archive_browser/src/settings/settings_controller.dart'; +import 'package:fediverse_archive_browser/src/utils/exec_error.dart'; import 'package:provider/provider.dart'; class ErrorScreen extends StatelessWidget { diff --git a/friendica_archive_browser/lib/src/screens/geospatial_screen.dart b/friendica_archive_browser/lib/src/screens/geospatial_screen.dart index 8b998b2..6ebc486 100644 --- a/friendica_archive_browser/lib/src/screens/geospatial_screen.dart +++ b/friendica_archive_browser/lib/src/screens/geospatial_screen.dart @@ -2,18 +2,18 @@ import 'dart:math'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/components/geo/geo_extensions.dart'; -import 'package:friendica_archive_browser/src/components/tree_entry_card.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; -import 'package:friendica_archive_browser/src/models/entry_tree_item.dart'; -import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; -import 'package:friendica_archive_browser/src/screens/error_screen.dart'; -import 'package:friendica_archive_browser/src/screens/loading_status_screen.dart'; -import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; -import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; -import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; -import 'package:friendica_archive_browser/src/utils/exec_error.dart'; -import 'package:friendica_archive_browser/src/utils/temp_file_builder.dart'; +import 'package:fediverse_archive_browser/src/components/geo/geo_extensions.dart'; +import 'package:fediverse_archive_browser/src/components/tree_entry_card.dart'; +import 'package:fediverse_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; +import 'package:fediverse_archive_browser/src/models/entry_tree_item.dart'; +import 'package:fediverse_archive_browser/src/models/timeline_entry.dart'; +import 'package:fediverse_archive_browser/src/screens/error_screen.dart'; +import 'package:fediverse_archive_browser/src/screens/loading_status_screen.dart'; +import 'package:fediverse_archive_browser/src/screens/standin_status_screen.dart'; +import 'package:fediverse_archive_browser/src/services/archive_service_provider.dart'; +import 'package:fediverse_archive_browser/src/settings/settings_controller.dart'; +import 'package:fediverse_archive_browser/src/utils/exec_error.dart'; +import 'package:fediverse_archive_browser/src/utils/temp_file_builder.dart'; import 'package:intl/intl.dart'; import 'package:latlng/latlng.dart'; import 'package:logging/logging.dart'; diff --git a/friendica_archive_browser/lib/src/screens/media_slideshow_screen.dart b/friendica_archive_browser/lib/src/screens/media_slideshow_screen.dart index a4c477f..1956c4e 100644 --- a/friendica_archive_browser/lib/src/screens/media_slideshow_screen.dart +++ b/friendica_archive_browser/lib/src/screens/media_slideshow_screen.dart @@ -3,12 +3,12 @@ import 'dart:io'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:friendica_archive_browser/src/components/media_wrapper_component.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; -import 'package:friendica_archive_browser/src/models/media_attachment.dart'; -import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; -import 'package:friendica_archive_browser/src/themes.dart'; -import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; +import 'package:fediverse_archive_browser/src/components/media_wrapper_component.dart'; +import 'package:fediverse_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; +import 'package:fediverse_archive_browser/src/models/media_attachment.dart'; +import 'package:fediverse_archive_browser/src/settings/settings_controller.dart'; +import 'package:fediverse_archive_browser/src/themes.dart'; +import 'package:fediverse_archive_browser/src/utils/snackbar_status_builder.dart'; import 'package:provider/provider.dart'; class MediaSlideShowScreen extends StatefulWidget { diff --git a/friendica_archive_browser/lib/src/screens/stats_screen.dart b/friendica_archive_browser/lib/src/screens/stats_screen.dart index 3358922..2430e92 100644 --- a/friendica_archive_browser/lib/src/screens/stats_screen.dart +++ b/friendica_archive_browser/lib/src/screens/stats_screen.dart @@ -1,14 +1,14 @@ import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/components/filter_control_component.dart'; -import 'package:friendica_archive_browser/src/components/heatmap_widget.dart'; -import 'package:friendica_archive_browser/src/components/timechart_widget.dart'; -import 'package:friendica_archive_browser/src/components/top_interactactors_widget.dart'; -import 'package:friendica_archive_browser/src/components/word_frequency_widget.dart'; -import 'package:friendica_archive_browser/src/models/model_utils.dart'; -import 'package:friendica_archive_browser/src/models/time_element.dart'; -import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; -import 'package:friendica_archive_browser/src/services/archive_service_provider.dart'; -import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; +import 'package:fediverse_archive_browser/src/components/filter_control_component.dart'; +import 'package:fediverse_archive_browser/src/components/heatmap_widget.dart'; +import 'package:fediverse_archive_browser/src/components/timechart_widget.dart'; +import 'package:fediverse_archive_browser/src/components/top_interactactors_widget.dart'; +import 'package:fediverse_archive_browser/src/components/word_frequency_widget.dart'; +import 'package:fediverse_archive_browser/src/models/model_utils.dart'; +import 'package:fediverse_archive_browser/src/models/time_element.dart'; +import 'package:fediverse_archive_browser/src/screens/standin_status_screen.dart'; +import 'package:fediverse_archive_browser/src/services/archive_service_provider.dart'; +import 'package:fediverse_archive_browser/src/utils/snackbar_status_builder.dart'; import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; diff --git a/friendica_archive_browser/lib/src/services/archive_service_interface.dart b/friendica_archive_browser/lib/src/services/archive_service_interface.dart index a4b994c..87159df 100644 --- a/friendica_archive_browser/lib/src/services/archive_service_interface.dart +++ b/friendica_archive_browser/lib/src/services/archive_service_interface.dart @@ -1,4 +1,4 @@ -import 'package:friendica_archive_browser/src/services/path_mapper_service_interface.dart'; +import 'package:fediverse_archive_browser/src/services/path_mapper_service_interface.dart'; import 'package:result_monad/result_monad.dart'; import '../models/entry_tree_item.dart'; diff --git a/friendica_archive_browser/lib/src/services/archive_service_provider.dart b/friendica_archive_browser/lib/src/services/archive_service_provider.dart index 20d305e..722a7f3 100644 --- a/friendica_archive_browser/lib/src/services/archive_service_provider.dart +++ b/friendica_archive_browser/lib/src/services/archive_service_provider.dart @@ -1,12 +1,12 @@ import 'package:flutter/cupertino.dart'; -import 'package:friendica_archive_browser/src/diaspora/services/diaspora_archive_service.dart'; -import 'package:friendica_archive_browser/src/diaspora/services/diaspora_path_mapping_service.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_archive_service.dart'; -import 'package:friendica_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; -import 'package:friendica_archive_browser/src/services/archive_service_interface.dart'; -import 'package:friendica_archive_browser/src/services/connections_manager.dart'; -import 'package:friendica_archive_browser/src/services/path_mapper_service_interface.dart'; -import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:fediverse_archive_browser/src/diaspora/services/diaspora_archive_service.dart'; +import 'package:fediverse_archive_browser/src/diaspora/services/diaspora_path_mapping_service.dart'; +import 'package:fediverse_archive_browser/src/friendica/services/friendica_archive_service.dart'; +import 'package:fediverse_archive_browser/src/friendica/services/friendica_path_mapping_service.dart'; +import 'package:fediverse_archive_browser/src/services/archive_service_interface.dart'; +import 'package:fediverse_archive_browser/src/services/connections_manager.dart'; +import 'package:fediverse_archive_browser/src/services/path_mapper_service_interface.dart'; +import 'package:fediverse_archive_browser/src/settings/settings_controller.dart'; import 'package:result_monad/result_monad.dart'; import '../models/archive_types_enum.dart'; diff --git a/friendica_archive_browser/lib/src/services/connections_manager.dart b/friendica_archive_browser/lib/src/services/connections_manager.dart index c71401f..b4246e4 100644 --- a/friendica_archive_browser/lib/src/services/connections_manager.dart +++ b/friendica_archive_browser/lib/src/services/connections_manager.dart @@ -1,4 +1,4 @@ -import 'package:friendica_archive_browser/src/models/connection.dart'; +import 'package:fediverse_archive_browser/src/models/connection.dart'; import 'package:result_monad/result_monad.dart'; class ConnectionsManager { diff --git a/friendica_archive_browser/lib/src/settings/settings_controller.dart b/friendica_archive_browser/lib/src/settings/settings_controller.dart index c7fa89b..4620d0e 100644 --- a/friendica_archive_browser/lib/src/settings/settings_controller.dart +++ b/friendica_archive_browser/lib/src/settings/settings_controller.dart @@ -1,9 +1,9 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/models/archive_types_enum.dart'; -import 'package:friendica_archive_browser/src/settings/video_player_settings.dart'; -import 'package:friendica_archive_browser/src/utils/temp_file_builder.dart'; +import 'package:fediverse_archive_browser/src/models/archive_types_enum.dart'; +import 'package:fediverse_archive_browser/src/settings/video_player_settings.dart'; +import 'package:fediverse_archive_browser/src/utils/temp_file_builder.dart'; import 'package:intl/intl.dart'; import 'package:logging/logging.dart'; import 'package:path_provider/path_provider.dart'; diff --git a/friendica_archive_browser/lib/src/settings/settings_service.dart b/friendica_archive_browser/lib/src/settings/settings_service.dart index 92406cd..761f945 100644 --- a/friendica_archive_browser/lib/src/settings/settings_service.dart +++ b/friendica_archive_browser/lib/src/settings/settings_service.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/models/archive_types_enum.dart'; +import 'package:fediverse_archive_browser/src/models/archive_types_enum.dart'; import 'package:logging/logging.dart'; import 'package:shared_preferences/shared_preferences.dart'; diff --git a/friendica_archive_browser/lib/src/settings/settings_view.dart b/friendica_archive_browser/lib/src/settings/settings_view.dart index afd8d26..8a45172 100644 --- a/friendica_archive_browser/lib/src/settings/settings_view.dart +++ b/friendica_archive_browser/lib/src/settings/settings_view.dart @@ -2,10 +2,10 @@ import 'dart:io'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; -import 'package:friendica_archive_browser/src/models/archive_types_enum.dart'; -import 'package:friendica_archive_browser/src/settings/video_player_settings.dart'; -import 'package:friendica_archive_browser/src/utils/clipboard_helper.dart'; -import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; +import 'package:fediverse_archive_browser/src/models/archive_types_enum.dart'; +import 'package:fediverse_archive_browser/src/settings/video_player_settings.dart'; +import 'package:fediverse_archive_browser/src/utils/clipboard_helper.dart'; +import 'package:fediverse_archive_browser/src/utils/snackbar_status_builder.dart'; import 'package:logging/logging.dart'; import 'settings_controller.dart'; diff --git a/friendica_archive_browser/lib/src/utils/clipboard_helper.dart b/friendica_archive_browser/lib/src/utils/clipboard_helper.dart index 02db994..d45ed8c 100644 --- a/friendica_archive_browser/lib/src/utils/clipboard_helper.dart +++ b/friendica_archive_browser/lib/src/utils/clipboard_helper.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; +import 'package:fediverse_archive_browser/src/utils/snackbar_status_builder.dart'; Future copyToClipboard( {required BuildContext context, diff --git a/friendica_archive_browser/lib/src/utils/offsetdatetime_utils.dart b/friendica_archive_browser/lib/src/utils/offsetdatetime_utils.dart index 8f05822..c9a0926 100644 --- a/friendica_archive_browser/lib/src/utils/offsetdatetime_utils.dart +++ b/friendica_archive_browser/lib/src/utils/offsetdatetime_utils.dart @@ -1,4 +1,4 @@ -import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:fediverse_archive_browser/src/utils/exec_error.dart'; import 'package:result_monad/result_monad.dart'; import 'package:time_machine/time_machine_text_patterns.dart'; diff --git a/friendica_archive_browser/lib/src/utils/time_stat_generator.dart b/friendica_archive_browser/lib/src/utils/time_stat_generator.dart index 5633572..3a34800 100644 --- a/friendica_archive_browser/lib/src/utils/time_stat_generator.dart +++ b/friendica_archive_browser/lib/src/utils/time_stat_generator.dart @@ -1,5 +1,5 @@ -import 'package:friendica_archive_browser/src/models/stat_bin.dart'; -import 'package:friendica_archive_browser/src/models/time_element.dart'; +import 'package:fediverse_archive_browser/src/models/stat_bin.dart'; +import 'package:fediverse_archive_browser/src/models/time_element.dart'; class TimeStatGenerator { final List _elements; diff --git a/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart b/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart index 78b1eae..f0a1010 100644 --- a/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart +++ b/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart @@ -1,6 +1,6 @@ -import 'package:friendica_archive_browser/src/models/connection.dart'; -import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; -import 'package:friendica_archive_browser/src/services/connections_manager.dart'; +import 'package:fediverse_archive_browser/src/models/connection.dart'; +import 'package:fediverse_archive_browser/src/models/timeline_entry.dart'; +import 'package:fediverse_archive_browser/src/services/connections_manager.dart'; class TopInteractorsGenerator { final _interactors = {}; diff --git a/friendica_archive_browser/linux/my_application.cc b/friendica_archive_browser/linux/my_application.cc index ce0d7e2..774d3a0 100644 --- a/friendica_archive_browser/linux/my_application.cc +++ b/friendica_archive_browser/linux/my_application.cc @@ -40,11 +40,11 @@ static void my_application_activate(GApplication* application) { if (use_header_bar) { GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "Friendica Archive Browser"); + gtk_header_bar_set_title(header_bar, "Fediverse Archive Browser"); gtk_header_bar_set_show_close_button(header_bar, TRUE); gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); } else { - gtk_window_set_title(window, "Friendica Archive Browser"); + gtk_window_set_title(window, "Fediverse Archive Browser"); } gtk_window_set_default_size(window, 900, 700); diff --git a/friendica_archive_browser/pubspec.yaml b/friendica_archive_browser/pubspec.yaml index b2aacfd..5d5e119 100644 --- a/friendica_archive_browser/pubspec.yaml +++ b/friendica_archive_browser/pubspec.yaml @@ -1,5 +1,5 @@ -name: friendica_archive_browser -description: A Friendica Archive Browser +name: fediverse_archive_browser +description: An Archive Browser for various fediverse projects (Friendica, Diaspora) # Prevent accidental publishing to pub.dev. publish_to: 'none' diff --git a/friendica_archive_browser/test/additional_key_logger_test.dart b/friendica_archive_browser/test/additional_key_logger_test.dart index e51c81a..574ca2c 100644 --- a/friendica_archive_browser/test/additional_key_logger_test.dart +++ b/friendica_archive_browser/test/additional_key_logger_test.dart @@ -1,7 +1,7 @@ // ignore_for_file: avoid_print import 'package:flutter_test/flutter_test.dart'; -import 'package:friendica_archive_browser/src/models/model_utils.dart'; +import 'package:fediverse_archive_browser/src/models/model_utils.dart'; import 'package:logging/logging.dart'; void main() { diff --git a/friendica_archive_browser/test/disapora_profile_json_reader_test.dart b/friendica_archive_browser/test/disapora_profile_json_reader_test.dart index 3e1c465..a6db632 100644 --- a/friendica_archive_browser/test/disapora_profile_json_reader_test.dart +++ b/friendica_archive_browser/test/disapora_profile_json_reader_test.dart @@ -1,9 +1,9 @@ // ignore_for_file: avoid_print import 'package:flutter_test/flutter_test.dart'; -import 'package:friendica_archive_browser/src/diaspora/services/diaspora_profile_json_reader.dart'; -import 'package:friendica_archive_browser/src/models/timeline_entry.dart'; -import 'package:friendica_archive_browser/src/services/connections_manager.dart'; +import 'package:fediverse_archive_browser/src/diaspora/services/diaspora_profile_json_reader.dart'; +import 'package:fediverse_archive_browser/src/models/timeline_entry.dart'; +import 'package:fediverse_archive_browser/src/services/connections_manager.dart'; const jsonPath = '/Users/hankdev/Desktop/diaspora_pretty.json'; diff --git a/friendica_archive_browser/test/word_map_generator_test.dart b/friendica_archive_browser/test/word_map_generator_test.dart index 48666d8..802ee02 100644 --- a/friendica_archive_browser/test/word_map_generator_test.dart +++ b/friendica_archive_browser/test/word_map_generator_test.dart @@ -1,7 +1,7 @@ // ignore_for_file: avoid_print import 'package:flutter_test/flutter_test.dart'; -import 'package:friendica_archive_browser/src/utils/word_map_generator.dart'; +import 'package:fediverse_archive_browser/src/utils/word_map_generator.dart'; void main() { test('Empty collection stats', () { diff --git a/friendica_archive_browser/windows/runner/Runner.rc b/friendica_archive_browser/windows/runner/Runner.rc index 03af09d..f6643cd 100644 --- a/friendica_archive_browser/windows/runner/Runner.rc +++ b/friendica_archive_browser/windows/runner/Runner.rc @@ -63,13 +63,13 @@ IDI_APP_ICON ICON "resources\\fba_app_icon.ico" #ifdef FLUTTER_BUILD_NUMBER #define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER #else -#define VERSION_AS_NUMBER 0,1,3 +#define VERSION_AS_NUMBER 1,0,0 #endif #ifdef FLUTTER_BUILD_NAME #define VERSION_AS_STRING #FLUTTER_BUILD_NAME #else -#define VERSION_AS_STRING "0.1.3" +#define VERSION_AS_STRING "1.0.0" #endif VS_VERSION_INFO VERSIONINFO @@ -90,12 +90,12 @@ BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "My Social Portal" "\0" - VALUE "FileDescription", "Friendica ArchiveB rowser" "\0" + VALUE "FileDescription", "Fediverse ArchiveB rowser" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "friendica_archive_browser" "\0" + VALUE "InternalName", "fediverse_archive_browser" "\0" VALUE "LegalCopyright", "Copyright (C) 2022 My Social Portal All rights reserved." "\0" - VALUE "OriginalFilename", "friendica_archive_browser.exe" "\0" - VALUE "ProductName", "Friendica Archive Browser" "\0" + VALUE "OriginalFilename", "fediverse_archive_browser.exe" "\0" + VALUE "ProductName", "Fediverse Archive Browser" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" END END diff --git a/friendica_archive_browser/windows/runner/main.cpp b/friendica_archive_browser/windows/runner/main.cpp index 1d174e0..9948868 100644 --- a/friendica_archive_browser/windows/runner/main.cpp +++ b/friendica_archive_browser/windows/runner/main.cpp @@ -27,7 +27,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, FlutterWindow window(project); Win32Window::Point origin(10, 10); Win32Window::Size size(915, 700); - if (!window.CreateAndShow(L"Friendica Archive Browser", origin, size)) { + if (!window.CreateAndShow(L"Fediverse Archive Browser", origin, size)) { return EXIT_FAILURE; } window.SetQuitOnClose(true); From ec409e5ce178357ab440c6908c3ccd83955235e5 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Wed, 16 Mar 2022 18:25:59 -0400 Subject: [PATCH 13/14] Rename friendica_archive_browser directory to fediverse_archive_browser --- .../.gitignore | 0 .../.metadata | 0 .../CHANGELOG.md | 0 .../LICENSE | 0 .../README.md | 0 .../analysis_options.yaml | 0 .../assets/images/2.0x/flutter_logo.png | Bin .../assets/images/3.0x/flutter_logo.png | Bin .../assets/images/flutter_logo.png | Bin .../l10n.yaml | 0 .../lib/main.dart | 0 .../lib/src/app.dart | 0 .../lib/src/components/barchart_panel.dart | 0 .../src/components/filter_control_component.dart | 0 .../lib/src/components/geo/geo_extensions.dart | 0 .../lib/src/components/geo/map_bounds.dart | 0 .../lib/src/components/geo/marker_data.dart | 0 .../src/components/heatmap/heatmap_component.dart | 0 .../lib/src/components/heatmap/heatmap_tile.dart | 0 .../lib/src/components/heatmap/tile_color_map.dart | 0 .../lib/src/components/heatmap_widget.dart | 0 .../lib/src/components/link_elements_component.dart | 0 .../src/components/media_timeline_component.dart | 0 .../lib/src/components/media_wrapper_component.dart | 0 .../lib/src/components/timechart_widget.dart | 0 .../src/components/top_interactactors_widget.dart | 0 .../lib/src/components/tree_entry_card.dart | 0 .../lib/src/components/word_frequency_widget.dart | 0 .../lib/src/diaspora/models/diaspora_reaction.dart | 0 .../src/diaspora/models/diaspora_relayables.dart | 0 .../serializers/diaspora_contact_serializer.dart | 0 .../diaspora_media_attachment_serializer.dart | 0 .../serializers/diaspora_posts_serializer.dart | 0 .../serializers/diaspora_relayables_serializer.dart | 0 .../diaspora/services/diaspora_archive_service.dart | 0 .../services/diaspora_path_mapping_service.dart | 0 .../services/diaspora_profile_json_reader.dart | 0 .../serializers/friendica_contact_serializer.dart | 0 .../friendica_media_attachment_serializer.dart | 0 .../friendica_timeline_entry_serializer.dart | 0 .../services/friendica_archive_service.dart | 0 .../services/friendica_path_mapping_service.dart | 0 .../lib/src/home.dart | 0 .../lib/src/localization/app_en.arb | 0 .../lib/src/models/archive_types_enum.dart | 0 .../lib/src/models/connection.dart | 0 .../lib/src/models/entry_tree_item.dart | 0 .../lib/src/models/local_image_archive_entry.dart | 0 .../lib/src/models/location_data.dart | 0 .../lib/src/models/media_attachment.dart | 0 .../lib/src/models/model_utils.dart | 0 .../lib/src/models/stat_bin.dart | 0 .../lib/src/models/time_element.dart | 0 .../lib/src/models/timeline_entry.dart | 0 .../lib/src/screens/entries_screen.dart | 0 .../lib/src/screens/error_screen.dart | 0 .../lib/src/screens/geospatial_screen.dart | 0 .../lib/src/screens/loading_status_screen.dart | 0 .../lib/src/screens/media_slideshow_screen.dart | 0 .../lib/src/screens/standin_status_screen.dart | 0 .../lib/src/screens/stats_screen.dart | 0 .../lib/src/services/archive_service_interface.dart | 0 .../lib/src/services/archive_service_provider.dart | 0 .../lib/src/services/connections_manager.dart | 0 .../src/services/path_mapper_service_interface.dart | 0 .../lib/src/settings/settings_controller.dart | 0 .../lib/src/settings/settings_service.dart | 0 .../lib/src/settings/settings_view.dart | 0 .../lib/src/settings/video_player_settings.dart | 0 .../lib/src/themes.dart | 0 .../lib/src/utils/clipboard_helper.dart | 0 .../lib/src/utils/exec_error.dart | 0 .../lib/src/utils/offsetdatetime_utils.dart | 0 .../lib/src/utils/scrolling_behavior.dart | 0 .../lib/src/utils/snackbar_status_builder.dart | 0 .../lib/src/utils/temp_file_builder.dart | 0 .../lib/src/utils/time_stat_generator.dart | 0 .../lib/src/utils/top_interactors_generator.dart | 0 .../lib/src/utils/word_map_generator.dart | 0 .../linux/.gitignore | 0 .../linux/CMakeLists.txt | 0 .../linux/flutter/CMakeLists.txt | 0 .../linux/flutter/generated_plugin_registrant.cc | 0 .../linux/flutter/generated_plugin_registrant.h | 0 .../linux/flutter/generated_plugins.cmake | 0 .../linux/main.cc | 0 .../linux/my_application.cc | 0 .../linux/my_application.h | 0 .../macos/.gitignore | 0 .../macos/Flutter/Flutter-Debug.xcconfig | 0 .../macos/Flutter/Flutter-Release.xcconfig | 0 .../macos/Flutter/GeneratedPluginRegistrant.swift | 0 .../macos/Podfile | 0 .../macos/Podfile.lock | 0 .../macos/Runner.xcodeproj/project.pbxproj | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../Runner.xcworkspace/contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../macos/Runner/AppDelegate.swift | 0 .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/app_icon_1024.png | Bin .../AppIcon.appiconset/app_icon_128.png | Bin .../AppIcon.appiconset/app_icon_16.png | Bin .../AppIcon.appiconset/app_icon_256.png | Bin .../AppIcon.appiconset/app_icon_32.png | Bin .../AppIcon.appiconset/app_icon_512.png | Bin .../AppIcon.appiconset/app_icon_64.png | Bin .../AppIcon.appiconset/fba_app_icon_128.png | Bin .../AppIcon.appiconset/fba_app_icon_16.png | Bin .../AppIcon.appiconset/fba_app_icon_256.png | Bin .../AppIcon.appiconset/fba_app_icon_32.png | Bin .../AppIcon.appiconset/fba_app_icon_512.png | Bin .../AppIcon.appiconset/fba_app_icon_64.png | Bin .../macos/Runner/Base.lproj/MainMenu.xib | 0 .../macos/Runner/Configs/AppInfo.xcconfig | 0 .../macos/Runner/Configs/Debug.xcconfig | 0 .../macos/Runner/Configs/Release.xcconfig | 0 .../macos/Runner/Configs/Warnings.xcconfig | 0 .../macos/Runner/DebugProfile.entitlements | 0 .../macos/Runner/Info.plist | 0 .../macos/Runner/MainFlutterWindow.swift | 0 .../macos/Runner/Release.entitlements | 0 .../macos/Runner/RunnerDebug.entitlements | 0 .../pubspec.lock | 0 .../pubspec.yaml | 0 .../test/additional_key_logger_test.dart | 0 .../test/disapora_profile_json_reader_test.dart | 0 .../test/word_map_generator_test.dart | 0 .../windows/.gitignore | 0 .../windows/CMakeLists.txt | 0 .../windows/flutter/CMakeLists.txt | 0 .../windows/flutter/generated_plugin_registrant.cc | 0 .../windows/flutter/generated_plugin_registrant.h | 0 .../windows/flutter/generated_plugins.cmake | 0 .../windows/runner/CMakeLists.txt | 0 .../windows/runner/Runner.rc | 0 .../windows/runner/flutter_window.cpp | 0 .../windows/runner/flutter_window.h | 0 .../windows/runner/main.cpp | 0 .../windows/runner/resource.h | 0 .../windows/runner/resources/app_icon.ico | Bin .../windows/runner/resources/fba_app_icon.ico | Bin .../windows/runner/runner.exe.manifest | 0 .../windows/runner/utils.cpp | 0 .../windows/runner/utils.h | 0 .../windows/runner/win32_window.cpp | 0 .../windows/runner/win32_window.h | 0 148 files changed, 0 insertions(+), 0 deletions(-) rename {friendica_archive_browser => fediverse_archive_browser}/.gitignore (100%) rename {friendica_archive_browser => fediverse_archive_browser}/.metadata (100%) rename {friendica_archive_browser => fediverse_archive_browser}/CHANGELOG.md (100%) rename {friendica_archive_browser => fediverse_archive_browser}/LICENSE (100%) rename {friendica_archive_browser => fediverse_archive_browser}/README.md (100%) rename {friendica_archive_browser => fediverse_archive_browser}/analysis_options.yaml (100%) rename {friendica_archive_browser => fediverse_archive_browser}/assets/images/2.0x/flutter_logo.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/assets/images/3.0x/flutter_logo.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/assets/images/flutter_logo.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/l10n.yaml (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/main.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/app.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/barchart_panel.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/filter_control_component.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/geo/geo_extensions.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/geo/map_bounds.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/geo/marker_data.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/heatmap/heatmap_component.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/heatmap/heatmap_tile.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/heatmap/tile_color_map.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/heatmap_widget.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/link_elements_component.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/media_timeline_component.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/media_wrapper_component.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/timechart_widget.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/top_interactactors_widget.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/tree_entry_card.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/components/word_frequency_widget.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/diaspora/models/diaspora_reaction.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/diaspora/models/diaspora_relayables.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/diaspora/serializers/diaspora_contact_serializer.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/diaspora/serializers/diaspora_media_attachment_serializer.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/diaspora/serializers/diaspora_posts_serializer.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/diaspora/serializers/diaspora_relayables_serializer.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/diaspora/services/diaspora_archive_service.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/diaspora/services/diaspora_path_mapping_service.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/diaspora/services/diaspora_profile_json_reader.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/friendica/serializers/friendica_contact_serializer.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/friendica/serializers/friendica_media_attachment_serializer.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/friendica/services/friendica_archive_service.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/friendica/services/friendica_path_mapping_service.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/home.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/localization/app_en.arb (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/models/archive_types_enum.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/models/connection.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/models/entry_tree_item.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/models/local_image_archive_entry.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/models/location_data.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/models/media_attachment.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/models/model_utils.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/models/stat_bin.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/models/time_element.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/models/timeline_entry.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/screens/entries_screen.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/screens/error_screen.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/screens/geospatial_screen.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/screens/loading_status_screen.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/screens/media_slideshow_screen.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/screens/standin_status_screen.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/screens/stats_screen.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/services/archive_service_interface.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/services/archive_service_provider.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/services/connections_manager.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/services/path_mapper_service_interface.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/settings/settings_controller.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/settings/settings_service.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/settings/settings_view.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/settings/video_player_settings.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/themes.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/utils/clipboard_helper.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/utils/exec_error.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/utils/offsetdatetime_utils.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/utils/scrolling_behavior.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/utils/snackbar_status_builder.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/utils/temp_file_builder.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/utils/time_stat_generator.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/utils/top_interactors_generator.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/lib/src/utils/word_map_generator.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/linux/.gitignore (100%) rename {friendica_archive_browser => fediverse_archive_browser}/linux/CMakeLists.txt (100%) rename {friendica_archive_browser => fediverse_archive_browser}/linux/flutter/CMakeLists.txt (100%) rename {friendica_archive_browser => fediverse_archive_browser}/linux/flutter/generated_plugin_registrant.cc (100%) rename {friendica_archive_browser => fediverse_archive_browser}/linux/flutter/generated_plugin_registrant.h (100%) rename {friendica_archive_browser => fediverse_archive_browser}/linux/flutter/generated_plugins.cmake (100%) rename {friendica_archive_browser => fediverse_archive_browser}/linux/main.cc (100%) rename {friendica_archive_browser => fediverse_archive_browser}/linux/my_application.cc (100%) rename {friendica_archive_browser => fediverse_archive_browser}/linux/my_application.h (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/.gitignore (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Flutter/Flutter-Debug.xcconfig (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Flutter/Flutter-Release.xcconfig (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Flutter/GeneratedPluginRegistrant.swift (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Podfile (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Podfile.lock (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner.xcodeproj/project.pbxproj (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner.xcworkspace/contents.xcworkspacedata (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/AppDelegate.swift (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_128.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_16.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_256.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_32.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_512.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_64.png (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Base.lproj/MainMenu.xib (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Configs/AppInfo.xcconfig (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Configs/Debug.xcconfig (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Configs/Release.xcconfig (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Configs/Warnings.xcconfig (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/DebugProfile.entitlements (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Info.plist (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/MainFlutterWindow.swift (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/Release.entitlements (100%) rename {friendica_archive_browser => fediverse_archive_browser}/macos/Runner/RunnerDebug.entitlements (100%) rename {friendica_archive_browser => fediverse_archive_browser}/pubspec.lock (100%) rename {friendica_archive_browser => fediverse_archive_browser}/pubspec.yaml (100%) rename {friendica_archive_browser => fediverse_archive_browser}/test/additional_key_logger_test.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/test/disapora_profile_json_reader_test.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/test/word_map_generator_test.dart (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/.gitignore (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/CMakeLists.txt (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/flutter/CMakeLists.txt (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/flutter/generated_plugin_registrant.cc (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/flutter/generated_plugin_registrant.h (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/flutter/generated_plugins.cmake (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/runner/CMakeLists.txt (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/runner/Runner.rc (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/runner/flutter_window.cpp (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/runner/flutter_window.h (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/runner/main.cpp (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/runner/resource.h (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/runner/resources/app_icon.ico (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/runner/resources/fba_app_icon.ico (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/runner/runner.exe.manifest (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/runner/utils.cpp (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/runner/utils.h (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/runner/win32_window.cpp (100%) rename {friendica_archive_browser => fediverse_archive_browser}/windows/runner/win32_window.h (100%) diff --git a/friendica_archive_browser/.gitignore b/fediverse_archive_browser/.gitignore similarity index 100% rename from friendica_archive_browser/.gitignore rename to fediverse_archive_browser/.gitignore diff --git a/friendica_archive_browser/.metadata b/fediverse_archive_browser/.metadata similarity index 100% rename from friendica_archive_browser/.metadata rename to fediverse_archive_browser/.metadata diff --git a/friendica_archive_browser/CHANGELOG.md b/fediverse_archive_browser/CHANGELOG.md similarity index 100% rename from friendica_archive_browser/CHANGELOG.md rename to fediverse_archive_browser/CHANGELOG.md diff --git a/friendica_archive_browser/LICENSE b/fediverse_archive_browser/LICENSE similarity index 100% rename from friendica_archive_browser/LICENSE rename to fediverse_archive_browser/LICENSE diff --git a/friendica_archive_browser/README.md b/fediverse_archive_browser/README.md similarity index 100% rename from friendica_archive_browser/README.md rename to fediverse_archive_browser/README.md diff --git a/friendica_archive_browser/analysis_options.yaml b/fediverse_archive_browser/analysis_options.yaml similarity index 100% rename from friendica_archive_browser/analysis_options.yaml rename to fediverse_archive_browser/analysis_options.yaml diff --git a/friendica_archive_browser/assets/images/2.0x/flutter_logo.png b/fediverse_archive_browser/assets/images/2.0x/flutter_logo.png similarity index 100% rename from friendica_archive_browser/assets/images/2.0x/flutter_logo.png rename to fediverse_archive_browser/assets/images/2.0x/flutter_logo.png diff --git a/friendica_archive_browser/assets/images/3.0x/flutter_logo.png b/fediverse_archive_browser/assets/images/3.0x/flutter_logo.png similarity index 100% rename from friendica_archive_browser/assets/images/3.0x/flutter_logo.png rename to fediverse_archive_browser/assets/images/3.0x/flutter_logo.png diff --git a/friendica_archive_browser/assets/images/flutter_logo.png b/fediverse_archive_browser/assets/images/flutter_logo.png similarity index 100% rename from friendica_archive_browser/assets/images/flutter_logo.png rename to fediverse_archive_browser/assets/images/flutter_logo.png diff --git a/friendica_archive_browser/l10n.yaml b/fediverse_archive_browser/l10n.yaml similarity index 100% rename from friendica_archive_browser/l10n.yaml rename to fediverse_archive_browser/l10n.yaml diff --git a/friendica_archive_browser/lib/main.dart b/fediverse_archive_browser/lib/main.dart similarity index 100% rename from friendica_archive_browser/lib/main.dart rename to fediverse_archive_browser/lib/main.dart diff --git a/friendica_archive_browser/lib/src/app.dart b/fediverse_archive_browser/lib/src/app.dart similarity index 100% rename from friendica_archive_browser/lib/src/app.dart rename to fediverse_archive_browser/lib/src/app.dart diff --git a/friendica_archive_browser/lib/src/components/barchart_panel.dart b/fediverse_archive_browser/lib/src/components/barchart_panel.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/barchart_panel.dart rename to fediverse_archive_browser/lib/src/components/barchart_panel.dart diff --git a/friendica_archive_browser/lib/src/components/filter_control_component.dart b/fediverse_archive_browser/lib/src/components/filter_control_component.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/filter_control_component.dart rename to fediverse_archive_browser/lib/src/components/filter_control_component.dart diff --git a/friendica_archive_browser/lib/src/components/geo/geo_extensions.dart b/fediverse_archive_browser/lib/src/components/geo/geo_extensions.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/geo/geo_extensions.dart rename to fediverse_archive_browser/lib/src/components/geo/geo_extensions.dart diff --git a/friendica_archive_browser/lib/src/components/geo/map_bounds.dart b/fediverse_archive_browser/lib/src/components/geo/map_bounds.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/geo/map_bounds.dart rename to fediverse_archive_browser/lib/src/components/geo/map_bounds.dart diff --git a/friendica_archive_browser/lib/src/components/geo/marker_data.dart b/fediverse_archive_browser/lib/src/components/geo/marker_data.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/geo/marker_data.dart rename to fediverse_archive_browser/lib/src/components/geo/marker_data.dart diff --git a/friendica_archive_browser/lib/src/components/heatmap/heatmap_component.dart b/fediverse_archive_browser/lib/src/components/heatmap/heatmap_component.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/heatmap/heatmap_component.dart rename to fediverse_archive_browser/lib/src/components/heatmap/heatmap_component.dart diff --git a/friendica_archive_browser/lib/src/components/heatmap/heatmap_tile.dart b/fediverse_archive_browser/lib/src/components/heatmap/heatmap_tile.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/heatmap/heatmap_tile.dart rename to fediverse_archive_browser/lib/src/components/heatmap/heatmap_tile.dart diff --git a/friendica_archive_browser/lib/src/components/heatmap/tile_color_map.dart b/fediverse_archive_browser/lib/src/components/heatmap/tile_color_map.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/heatmap/tile_color_map.dart rename to fediverse_archive_browser/lib/src/components/heatmap/tile_color_map.dart diff --git a/friendica_archive_browser/lib/src/components/heatmap_widget.dart b/fediverse_archive_browser/lib/src/components/heatmap_widget.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/heatmap_widget.dart rename to fediverse_archive_browser/lib/src/components/heatmap_widget.dart diff --git a/friendica_archive_browser/lib/src/components/link_elements_component.dart b/fediverse_archive_browser/lib/src/components/link_elements_component.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/link_elements_component.dart rename to fediverse_archive_browser/lib/src/components/link_elements_component.dart diff --git a/friendica_archive_browser/lib/src/components/media_timeline_component.dart b/fediverse_archive_browser/lib/src/components/media_timeline_component.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/media_timeline_component.dart rename to fediverse_archive_browser/lib/src/components/media_timeline_component.dart diff --git a/friendica_archive_browser/lib/src/components/media_wrapper_component.dart b/fediverse_archive_browser/lib/src/components/media_wrapper_component.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/media_wrapper_component.dart rename to fediverse_archive_browser/lib/src/components/media_wrapper_component.dart diff --git a/friendica_archive_browser/lib/src/components/timechart_widget.dart b/fediverse_archive_browser/lib/src/components/timechart_widget.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/timechart_widget.dart rename to fediverse_archive_browser/lib/src/components/timechart_widget.dart diff --git a/friendica_archive_browser/lib/src/components/top_interactactors_widget.dart b/fediverse_archive_browser/lib/src/components/top_interactactors_widget.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/top_interactactors_widget.dart rename to fediverse_archive_browser/lib/src/components/top_interactactors_widget.dart diff --git a/friendica_archive_browser/lib/src/components/tree_entry_card.dart b/fediverse_archive_browser/lib/src/components/tree_entry_card.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/tree_entry_card.dart rename to fediverse_archive_browser/lib/src/components/tree_entry_card.dart diff --git a/friendica_archive_browser/lib/src/components/word_frequency_widget.dart b/fediverse_archive_browser/lib/src/components/word_frequency_widget.dart similarity index 100% rename from friendica_archive_browser/lib/src/components/word_frequency_widget.dart rename to fediverse_archive_browser/lib/src/components/word_frequency_widget.dart diff --git a/friendica_archive_browser/lib/src/diaspora/models/diaspora_reaction.dart b/fediverse_archive_browser/lib/src/diaspora/models/diaspora_reaction.dart similarity index 100% rename from friendica_archive_browser/lib/src/diaspora/models/diaspora_reaction.dart rename to fediverse_archive_browser/lib/src/diaspora/models/diaspora_reaction.dart diff --git a/friendica_archive_browser/lib/src/diaspora/models/diaspora_relayables.dart b/fediverse_archive_browser/lib/src/diaspora/models/diaspora_relayables.dart similarity index 100% rename from friendica_archive_browser/lib/src/diaspora/models/diaspora_relayables.dart rename to fediverse_archive_browser/lib/src/diaspora/models/diaspora_relayables.dart diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart b/fediverse_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart similarity index 100% rename from friendica_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart rename to fediverse_archive_browser/lib/src/diaspora/serializers/diaspora_contact_serializer.dart diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_media_attachment_serializer.dart b/fediverse_archive_browser/lib/src/diaspora/serializers/diaspora_media_attachment_serializer.dart similarity index 100% rename from friendica_archive_browser/lib/src/diaspora/serializers/diaspora_media_attachment_serializer.dart rename to fediverse_archive_browser/lib/src/diaspora/serializers/diaspora_media_attachment_serializer.dart diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart b/fediverse_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart similarity index 100% rename from friendica_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart rename to fediverse_archive_browser/lib/src/diaspora/serializers/diaspora_posts_serializer.dart diff --git a/friendica_archive_browser/lib/src/diaspora/serializers/diaspora_relayables_serializer.dart b/fediverse_archive_browser/lib/src/diaspora/serializers/diaspora_relayables_serializer.dart similarity index 100% rename from friendica_archive_browser/lib/src/diaspora/serializers/diaspora_relayables_serializer.dart rename to fediverse_archive_browser/lib/src/diaspora/serializers/diaspora_relayables_serializer.dart diff --git a/friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart b/fediverse_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart similarity index 100% rename from friendica_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart rename to fediverse_archive_browser/lib/src/diaspora/services/diaspora_archive_service.dart diff --git a/friendica_archive_browser/lib/src/diaspora/services/diaspora_path_mapping_service.dart b/fediverse_archive_browser/lib/src/diaspora/services/diaspora_path_mapping_service.dart similarity index 100% rename from friendica_archive_browser/lib/src/diaspora/services/diaspora_path_mapping_service.dart rename to fediverse_archive_browser/lib/src/diaspora/services/diaspora_path_mapping_service.dart diff --git a/friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart b/fediverse_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart similarity index 100% rename from friendica_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart rename to fediverse_archive_browser/lib/src/diaspora/services/diaspora_profile_json_reader.dart diff --git a/friendica_archive_browser/lib/src/friendica/serializers/friendica_contact_serializer.dart b/fediverse_archive_browser/lib/src/friendica/serializers/friendica_contact_serializer.dart similarity index 100% rename from friendica_archive_browser/lib/src/friendica/serializers/friendica_contact_serializer.dart rename to fediverse_archive_browser/lib/src/friendica/serializers/friendica_contact_serializer.dart diff --git a/friendica_archive_browser/lib/src/friendica/serializers/friendica_media_attachment_serializer.dart b/fediverse_archive_browser/lib/src/friendica/serializers/friendica_media_attachment_serializer.dart similarity index 100% rename from friendica_archive_browser/lib/src/friendica/serializers/friendica_media_attachment_serializer.dart rename to fediverse_archive_browser/lib/src/friendica/serializers/friendica_media_attachment_serializer.dart diff --git a/friendica_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart b/fediverse_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart similarity index 100% rename from friendica_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart rename to fediverse_archive_browser/lib/src/friendica/serializers/friendica_timeline_entry_serializer.dart diff --git a/friendica_archive_browser/lib/src/friendica/services/friendica_archive_service.dart b/fediverse_archive_browser/lib/src/friendica/services/friendica_archive_service.dart similarity index 100% rename from friendica_archive_browser/lib/src/friendica/services/friendica_archive_service.dart rename to fediverse_archive_browser/lib/src/friendica/services/friendica_archive_service.dart diff --git a/friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart b/fediverse_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart similarity index 100% rename from friendica_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart rename to fediverse_archive_browser/lib/src/friendica/services/friendica_path_mapping_service.dart diff --git a/friendica_archive_browser/lib/src/home.dart b/fediverse_archive_browser/lib/src/home.dart similarity index 100% rename from friendica_archive_browser/lib/src/home.dart rename to fediverse_archive_browser/lib/src/home.dart diff --git a/friendica_archive_browser/lib/src/localization/app_en.arb b/fediverse_archive_browser/lib/src/localization/app_en.arb similarity index 100% rename from friendica_archive_browser/lib/src/localization/app_en.arb rename to fediverse_archive_browser/lib/src/localization/app_en.arb diff --git a/friendica_archive_browser/lib/src/models/archive_types_enum.dart b/fediverse_archive_browser/lib/src/models/archive_types_enum.dart similarity index 100% rename from friendica_archive_browser/lib/src/models/archive_types_enum.dart rename to fediverse_archive_browser/lib/src/models/archive_types_enum.dart diff --git a/friendica_archive_browser/lib/src/models/connection.dart b/fediverse_archive_browser/lib/src/models/connection.dart similarity index 100% rename from friendica_archive_browser/lib/src/models/connection.dart rename to fediverse_archive_browser/lib/src/models/connection.dart diff --git a/friendica_archive_browser/lib/src/models/entry_tree_item.dart b/fediverse_archive_browser/lib/src/models/entry_tree_item.dart similarity index 100% rename from friendica_archive_browser/lib/src/models/entry_tree_item.dart rename to fediverse_archive_browser/lib/src/models/entry_tree_item.dart diff --git a/friendica_archive_browser/lib/src/models/local_image_archive_entry.dart b/fediverse_archive_browser/lib/src/models/local_image_archive_entry.dart similarity index 100% rename from friendica_archive_browser/lib/src/models/local_image_archive_entry.dart rename to fediverse_archive_browser/lib/src/models/local_image_archive_entry.dart diff --git a/friendica_archive_browser/lib/src/models/location_data.dart b/fediverse_archive_browser/lib/src/models/location_data.dart similarity index 100% rename from friendica_archive_browser/lib/src/models/location_data.dart rename to fediverse_archive_browser/lib/src/models/location_data.dart diff --git a/friendica_archive_browser/lib/src/models/media_attachment.dart b/fediverse_archive_browser/lib/src/models/media_attachment.dart similarity index 100% rename from friendica_archive_browser/lib/src/models/media_attachment.dart rename to fediverse_archive_browser/lib/src/models/media_attachment.dart diff --git a/friendica_archive_browser/lib/src/models/model_utils.dart b/fediverse_archive_browser/lib/src/models/model_utils.dart similarity index 100% rename from friendica_archive_browser/lib/src/models/model_utils.dart rename to fediverse_archive_browser/lib/src/models/model_utils.dart diff --git a/friendica_archive_browser/lib/src/models/stat_bin.dart b/fediverse_archive_browser/lib/src/models/stat_bin.dart similarity index 100% rename from friendica_archive_browser/lib/src/models/stat_bin.dart rename to fediverse_archive_browser/lib/src/models/stat_bin.dart diff --git a/friendica_archive_browser/lib/src/models/time_element.dart b/fediverse_archive_browser/lib/src/models/time_element.dart similarity index 100% rename from friendica_archive_browser/lib/src/models/time_element.dart rename to fediverse_archive_browser/lib/src/models/time_element.dart diff --git a/friendica_archive_browser/lib/src/models/timeline_entry.dart b/fediverse_archive_browser/lib/src/models/timeline_entry.dart similarity index 100% rename from friendica_archive_browser/lib/src/models/timeline_entry.dart rename to fediverse_archive_browser/lib/src/models/timeline_entry.dart diff --git a/friendica_archive_browser/lib/src/screens/entries_screen.dart b/fediverse_archive_browser/lib/src/screens/entries_screen.dart similarity index 100% rename from friendica_archive_browser/lib/src/screens/entries_screen.dart rename to fediverse_archive_browser/lib/src/screens/entries_screen.dart diff --git a/friendica_archive_browser/lib/src/screens/error_screen.dart b/fediverse_archive_browser/lib/src/screens/error_screen.dart similarity index 100% rename from friendica_archive_browser/lib/src/screens/error_screen.dart rename to fediverse_archive_browser/lib/src/screens/error_screen.dart diff --git a/friendica_archive_browser/lib/src/screens/geospatial_screen.dart b/fediverse_archive_browser/lib/src/screens/geospatial_screen.dart similarity index 100% rename from friendica_archive_browser/lib/src/screens/geospatial_screen.dart rename to fediverse_archive_browser/lib/src/screens/geospatial_screen.dart diff --git a/friendica_archive_browser/lib/src/screens/loading_status_screen.dart b/fediverse_archive_browser/lib/src/screens/loading_status_screen.dart similarity index 100% rename from friendica_archive_browser/lib/src/screens/loading_status_screen.dart rename to fediverse_archive_browser/lib/src/screens/loading_status_screen.dart diff --git a/friendica_archive_browser/lib/src/screens/media_slideshow_screen.dart b/fediverse_archive_browser/lib/src/screens/media_slideshow_screen.dart similarity index 100% rename from friendica_archive_browser/lib/src/screens/media_slideshow_screen.dart rename to fediverse_archive_browser/lib/src/screens/media_slideshow_screen.dart diff --git a/friendica_archive_browser/lib/src/screens/standin_status_screen.dart b/fediverse_archive_browser/lib/src/screens/standin_status_screen.dart similarity index 100% rename from friendica_archive_browser/lib/src/screens/standin_status_screen.dart rename to fediverse_archive_browser/lib/src/screens/standin_status_screen.dart diff --git a/friendica_archive_browser/lib/src/screens/stats_screen.dart b/fediverse_archive_browser/lib/src/screens/stats_screen.dart similarity index 100% rename from friendica_archive_browser/lib/src/screens/stats_screen.dart rename to fediverse_archive_browser/lib/src/screens/stats_screen.dart diff --git a/friendica_archive_browser/lib/src/services/archive_service_interface.dart b/fediverse_archive_browser/lib/src/services/archive_service_interface.dart similarity index 100% rename from friendica_archive_browser/lib/src/services/archive_service_interface.dart rename to fediverse_archive_browser/lib/src/services/archive_service_interface.dart diff --git a/friendica_archive_browser/lib/src/services/archive_service_provider.dart b/fediverse_archive_browser/lib/src/services/archive_service_provider.dart similarity index 100% rename from friendica_archive_browser/lib/src/services/archive_service_provider.dart rename to fediverse_archive_browser/lib/src/services/archive_service_provider.dart diff --git a/friendica_archive_browser/lib/src/services/connections_manager.dart b/fediverse_archive_browser/lib/src/services/connections_manager.dart similarity index 100% rename from friendica_archive_browser/lib/src/services/connections_manager.dart rename to fediverse_archive_browser/lib/src/services/connections_manager.dart diff --git a/friendica_archive_browser/lib/src/services/path_mapper_service_interface.dart b/fediverse_archive_browser/lib/src/services/path_mapper_service_interface.dart similarity index 100% rename from friendica_archive_browser/lib/src/services/path_mapper_service_interface.dart rename to fediverse_archive_browser/lib/src/services/path_mapper_service_interface.dart diff --git a/friendica_archive_browser/lib/src/settings/settings_controller.dart b/fediverse_archive_browser/lib/src/settings/settings_controller.dart similarity index 100% rename from friendica_archive_browser/lib/src/settings/settings_controller.dart rename to fediverse_archive_browser/lib/src/settings/settings_controller.dart diff --git a/friendica_archive_browser/lib/src/settings/settings_service.dart b/fediverse_archive_browser/lib/src/settings/settings_service.dart similarity index 100% rename from friendica_archive_browser/lib/src/settings/settings_service.dart rename to fediverse_archive_browser/lib/src/settings/settings_service.dart diff --git a/friendica_archive_browser/lib/src/settings/settings_view.dart b/fediverse_archive_browser/lib/src/settings/settings_view.dart similarity index 100% rename from friendica_archive_browser/lib/src/settings/settings_view.dart rename to fediverse_archive_browser/lib/src/settings/settings_view.dart diff --git a/friendica_archive_browser/lib/src/settings/video_player_settings.dart b/fediverse_archive_browser/lib/src/settings/video_player_settings.dart similarity index 100% rename from friendica_archive_browser/lib/src/settings/video_player_settings.dart rename to fediverse_archive_browser/lib/src/settings/video_player_settings.dart diff --git a/friendica_archive_browser/lib/src/themes.dart b/fediverse_archive_browser/lib/src/themes.dart similarity index 100% rename from friendica_archive_browser/lib/src/themes.dart rename to fediverse_archive_browser/lib/src/themes.dart diff --git a/friendica_archive_browser/lib/src/utils/clipboard_helper.dart b/fediverse_archive_browser/lib/src/utils/clipboard_helper.dart similarity index 100% rename from friendica_archive_browser/lib/src/utils/clipboard_helper.dart rename to fediverse_archive_browser/lib/src/utils/clipboard_helper.dart diff --git a/friendica_archive_browser/lib/src/utils/exec_error.dart b/fediverse_archive_browser/lib/src/utils/exec_error.dart similarity index 100% rename from friendica_archive_browser/lib/src/utils/exec_error.dart rename to fediverse_archive_browser/lib/src/utils/exec_error.dart diff --git a/friendica_archive_browser/lib/src/utils/offsetdatetime_utils.dart b/fediverse_archive_browser/lib/src/utils/offsetdatetime_utils.dart similarity index 100% rename from friendica_archive_browser/lib/src/utils/offsetdatetime_utils.dart rename to fediverse_archive_browser/lib/src/utils/offsetdatetime_utils.dart diff --git a/friendica_archive_browser/lib/src/utils/scrolling_behavior.dart b/fediverse_archive_browser/lib/src/utils/scrolling_behavior.dart similarity index 100% rename from friendica_archive_browser/lib/src/utils/scrolling_behavior.dart rename to fediverse_archive_browser/lib/src/utils/scrolling_behavior.dart diff --git a/friendica_archive_browser/lib/src/utils/snackbar_status_builder.dart b/fediverse_archive_browser/lib/src/utils/snackbar_status_builder.dart similarity index 100% rename from friendica_archive_browser/lib/src/utils/snackbar_status_builder.dart rename to fediverse_archive_browser/lib/src/utils/snackbar_status_builder.dart diff --git a/friendica_archive_browser/lib/src/utils/temp_file_builder.dart b/fediverse_archive_browser/lib/src/utils/temp_file_builder.dart similarity index 100% rename from friendica_archive_browser/lib/src/utils/temp_file_builder.dart rename to fediverse_archive_browser/lib/src/utils/temp_file_builder.dart diff --git a/friendica_archive_browser/lib/src/utils/time_stat_generator.dart b/fediverse_archive_browser/lib/src/utils/time_stat_generator.dart similarity index 100% rename from friendica_archive_browser/lib/src/utils/time_stat_generator.dart rename to fediverse_archive_browser/lib/src/utils/time_stat_generator.dart diff --git a/friendica_archive_browser/lib/src/utils/top_interactors_generator.dart b/fediverse_archive_browser/lib/src/utils/top_interactors_generator.dart similarity index 100% rename from friendica_archive_browser/lib/src/utils/top_interactors_generator.dart rename to fediverse_archive_browser/lib/src/utils/top_interactors_generator.dart diff --git a/friendica_archive_browser/lib/src/utils/word_map_generator.dart b/fediverse_archive_browser/lib/src/utils/word_map_generator.dart similarity index 100% rename from friendica_archive_browser/lib/src/utils/word_map_generator.dart rename to fediverse_archive_browser/lib/src/utils/word_map_generator.dart diff --git a/friendica_archive_browser/linux/.gitignore b/fediverse_archive_browser/linux/.gitignore similarity index 100% rename from friendica_archive_browser/linux/.gitignore rename to fediverse_archive_browser/linux/.gitignore diff --git a/friendica_archive_browser/linux/CMakeLists.txt b/fediverse_archive_browser/linux/CMakeLists.txt similarity index 100% rename from friendica_archive_browser/linux/CMakeLists.txt rename to fediverse_archive_browser/linux/CMakeLists.txt diff --git a/friendica_archive_browser/linux/flutter/CMakeLists.txt b/fediverse_archive_browser/linux/flutter/CMakeLists.txt similarity index 100% rename from friendica_archive_browser/linux/flutter/CMakeLists.txt rename to fediverse_archive_browser/linux/flutter/CMakeLists.txt diff --git a/friendica_archive_browser/linux/flutter/generated_plugin_registrant.cc b/fediverse_archive_browser/linux/flutter/generated_plugin_registrant.cc similarity index 100% rename from friendica_archive_browser/linux/flutter/generated_plugin_registrant.cc rename to fediverse_archive_browser/linux/flutter/generated_plugin_registrant.cc diff --git a/friendica_archive_browser/linux/flutter/generated_plugin_registrant.h b/fediverse_archive_browser/linux/flutter/generated_plugin_registrant.h similarity index 100% rename from friendica_archive_browser/linux/flutter/generated_plugin_registrant.h rename to fediverse_archive_browser/linux/flutter/generated_plugin_registrant.h diff --git a/friendica_archive_browser/linux/flutter/generated_plugins.cmake b/fediverse_archive_browser/linux/flutter/generated_plugins.cmake similarity index 100% rename from friendica_archive_browser/linux/flutter/generated_plugins.cmake rename to fediverse_archive_browser/linux/flutter/generated_plugins.cmake diff --git a/friendica_archive_browser/linux/main.cc b/fediverse_archive_browser/linux/main.cc similarity index 100% rename from friendica_archive_browser/linux/main.cc rename to fediverse_archive_browser/linux/main.cc diff --git a/friendica_archive_browser/linux/my_application.cc b/fediverse_archive_browser/linux/my_application.cc similarity index 100% rename from friendica_archive_browser/linux/my_application.cc rename to fediverse_archive_browser/linux/my_application.cc diff --git a/friendica_archive_browser/linux/my_application.h b/fediverse_archive_browser/linux/my_application.h similarity index 100% rename from friendica_archive_browser/linux/my_application.h rename to fediverse_archive_browser/linux/my_application.h diff --git a/friendica_archive_browser/macos/.gitignore b/fediverse_archive_browser/macos/.gitignore similarity index 100% rename from friendica_archive_browser/macos/.gitignore rename to fediverse_archive_browser/macos/.gitignore diff --git a/friendica_archive_browser/macos/Flutter/Flutter-Debug.xcconfig b/fediverse_archive_browser/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from friendica_archive_browser/macos/Flutter/Flutter-Debug.xcconfig rename to fediverse_archive_browser/macos/Flutter/Flutter-Debug.xcconfig diff --git a/friendica_archive_browser/macos/Flutter/Flutter-Release.xcconfig b/fediverse_archive_browser/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from friendica_archive_browser/macos/Flutter/Flutter-Release.xcconfig rename to fediverse_archive_browser/macos/Flutter/Flutter-Release.xcconfig diff --git a/friendica_archive_browser/macos/Flutter/GeneratedPluginRegistrant.swift b/fediverse_archive_browser/macos/Flutter/GeneratedPluginRegistrant.swift similarity index 100% rename from friendica_archive_browser/macos/Flutter/GeneratedPluginRegistrant.swift rename to fediverse_archive_browser/macos/Flutter/GeneratedPluginRegistrant.swift diff --git a/friendica_archive_browser/macos/Podfile b/fediverse_archive_browser/macos/Podfile similarity index 100% rename from friendica_archive_browser/macos/Podfile rename to fediverse_archive_browser/macos/Podfile diff --git a/friendica_archive_browser/macos/Podfile.lock b/fediverse_archive_browser/macos/Podfile.lock similarity index 100% rename from friendica_archive_browser/macos/Podfile.lock rename to fediverse_archive_browser/macos/Podfile.lock diff --git a/friendica_archive_browser/macos/Runner.xcodeproj/project.pbxproj b/fediverse_archive_browser/macos/Runner.xcodeproj/project.pbxproj similarity index 100% rename from friendica_archive_browser/macos/Runner.xcodeproj/project.pbxproj rename to fediverse_archive_browser/macos/Runner.xcodeproj/project.pbxproj diff --git a/friendica_archive_browser/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/fediverse_archive_browser/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from friendica_archive_browser/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to fediverse_archive_browser/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/friendica_archive_browser/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/fediverse_archive_browser/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from friendica_archive_browser/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to fediverse_archive_browser/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/friendica_archive_browser/macos/Runner.xcworkspace/contents.xcworkspacedata b/fediverse_archive_browser/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from friendica_archive_browser/macos/Runner.xcworkspace/contents.xcworkspacedata rename to fediverse_archive_browser/macos/Runner.xcworkspace/contents.xcworkspacedata diff --git a/friendica_archive_browser/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/fediverse_archive_browser/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from friendica_archive_browser/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to fediverse_archive_browser/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/friendica_archive_browser/macos/Runner/AppDelegate.swift b/fediverse_archive_browser/macos/Runner/AppDelegate.swift similarity index 100% rename from friendica_archive_browser/macos/Runner/AppDelegate.swift rename to fediverse_archive_browser/macos/Runner/AppDelegate.swift diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png similarity index 100% rename from friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png rename to fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png similarity index 100% rename from friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png rename to fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png similarity index 100% rename from friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png rename to fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png similarity index 100% rename from friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png rename to fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png similarity index 100% rename from friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png rename to fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png similarity index 100% rename from friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png rename to fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png similarity index 100% rename from friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png rename to fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_128.png b/fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_128.png similarity index 100% rename from friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_128.png rename to fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_128.png diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_16.png b/fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_16.png similarity index 100% rename from friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_16.png rename to fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_16.png diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_256.png b/fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_256.png similarity index 100% rename from friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_256.png rename to fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_256.png diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_32.png b/fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_32.png similarity index 100% rename from friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_32.png rename to fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_32.png diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_512.png b/fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_512.png similarity index 100% rename from friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_512.png rename to fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_512.png diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_64.png b/fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_64.png similarity index 100% rename from friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_64.png rename to fediverse_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_64.png diff --git a/friendica_archive_browser/macos/Runner/Base.lproj/MainMenu.xib b/fediverse_archive_browser/macos/Runner/Base.lproj/MainMenu.xib similarity index 100% rename from friendica_archive_browser/macos/Runner/Base.lproj/MainMenu.xib rename to fediverse_archive_browser/macos/Runner/Base.lproj/MainMenu.xib diff --git a/friendica_archive_browser/macos/Runner/Configs/AppInfo.xcconfig b/fediverse_archive_browser/macos/Runner/Configs/AppInfo.xcconfig similarity index 100% rename from friendica_archive_browser/macos/Runner/Configs/AppInfo.xcconfig rename to fediverse_archive_browser/macos/Runner/Configs/AppInfo.xcconfig diff --git a/friendica_archive_browser/macos/Runner/Configs/Debug.xcconfig b/fediverse_archive_browser/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from friendica_archive_browser/macos/Runner/Configs/Debug.xcconfig rename to fediverse_archive_browser/macos/Runner/Configs/Debug.xcconfig diff --git a/friendica_archive_browser/macos/Runner/Configs/Release.xcconfig b/fediverse_archive_browser/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from friendica_archive_browser/macos/Runner/Configs/Release.xcconfig rename to fediverse_archive_browser/macos/Runner/Configs/Release.xcconfig diff --git a/friendica_archive_browser/macos/Runner/Configs/Warnings.xcconfig b/fediverse_archive_browser/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from friendica_archive_browser/macos/Runner/Configs/Warnings.xcconfig rename to fediverse_archive_browser/macos/Runner/Configs/Warnings.xcconfig diff --git a/friendica_archive_browser/macos/Runner/DebugProfile.entitlements b/fediverse_archive_browser/macos/Runner/DebugProfile.entitlements similarity index 100% rename from friendica_archive_browser/macos/Runner/DebugProfile.entitlements rename to fediverse_archive_browser/macos/Runner/DebugProfile.entitlements diff --git a/friendica_archive_browser/macos/Runner/Info.plist b/fediverse_archive_browser/macos/Runner/Info.plist similarity index 100% rename from friendica_archive_browser/macos/Runner/Info.plist rename to fediverse_archive_browser/macos/Runner/Info.plist diff --git a/friendica_archive_browser/macos/Runner/MainFlutterWindow.swift b/fediverse_archive_browser/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from friendica_archive_browser/macos/Runner/MainFlutterWindow.swift rename to fediverse_archive_browser/macos/Runner/MainFlutterWindow.swift diff --git a/friendica_archive_browser/macos/Runner/Release.entitlements b/fediverse_archive_browser/macos/Runner/Release.entitlements similarity index 100% rename from friendica_archive_browser/macos/Runner/Release.entitlements rename to fediverse_archive_browser/macos/Runner/Release.entitlements diff --git a/friendica_archive_browser/macos/Runner/RunnerDebug.entitlements b/fediverse_archive_browser/macos/Runner/RunnerDebug.entitlements similarity index 100% rename from friendica_archive_browser/macos/Runner/RunnerDebug.entitlements rename to fediverse_archive_browser/macos/Runner/RunnerDebug.entitlements diff --git a/friendica_archive_browser/pubspec.lock b/fediverse_archive_browser/pubspec.lock similarity index 100% rename from friendica_archive_browser/pubspec.lock rename to fediverse_archive_browser/pubspec.lock diff --git a/friendica_archive_browser/pubspec.yaml b/fediverse_archive_browser/pubspec.yaml similarity index 100% rename from friendica_archive_browser/pubspec.yaml rename to fediverse_archive_browser/pubspec.yaml diff --git a/friendica_archive_browser/test/additional_key_logger_test.dart b/fediverse_archive_browser/test/additional_key_logger_test.dart similarity index 100% rename from friendica_archive_browser/test/additional_key_logger_test.dart rename to fediverse_archive_browser/test/additional_key_logger_test.dart diff --git a/friendica_archive_browser/test/disapora_profile_json_reader_test.dart b/fediverse_archive_browser/test/disapora_profile_json_reader_test.dart similarity index 100% rename from friendica_archive_browser/test/disapora_profile_json_reader_test.dart rename to fediverse_archive_browser/test/disapora_profile_json_reader_test.dart diff --git a/friendica_archive_browser/test/word_map_generator_test.dart b/fediverse_archive_browser/test/word_map_generator_test.dart similarity index 100% rename from friendica_archive_browser/test/word_map_generator_test.dart rename to fediverse_archive_browser/test/word_map_generator_test.dart diff --git a/friendica_archive_browser/windows/.gitignore b/fediverse_archive_browser/windows/.gitignore similarity index 100% rename from friendica_archive_browser/windows/.gitignore rename to fediverse_archive_browser/windows/.gitignore diff --git a/friendica_archive_browser/windows/CMakeLists.txt b/fediverse_archive_browser/windows/CMakeLists.txt similarity index 100% rename from friendica_archive_browser/windows/CMakeLists.txt rename to fediverse_archive_browser/windows/CMakeLists.txt diff --git a/friendica_archive_browser/windows/flutter/CMakeLists.txt b/fediverse_archive_browser/windows/flutter/CMakeLists.txt similarity index 100% rename from friendica_archive_browser/windows/flutter/CMakeLists.txt rename to fediverse_archive_browser/windows/flutter/CMakeLists.txt diff --git a/friendica_archive_browser/windows/flutter/generated_plugin_registrant.cc b/fediverse_archive_browser/windows/flutter/generated_plugin_registrant.cc similarity index 100% rename from friendica_archive_browser/windows/flutter/generated_plugin_registrant.cc rename to fediverse_archive_browser/windows/flutter/generated_plugin_registrant.cc diff --git a/friendica_archive_browser/windows/flutter/generated_plugin_registrant.h b/fediverse_archive_browser/windows/flutter/generated_plugin_registrant.h similarity index 100% rename from friendica_archive_browser/windows/flutter/generated_plugin_registrant.h rename to fediverse_archive_browser/windows/flutter/generated_plugin_registrant.h diff --git a/friendica_archive_browser/windows/flutter/generated_plugins.cmake b/fediverse_archive_browser/windows/flutter/generated_plugins.cmake similarity index 100% rename from friendica_archive_browser/windows/flutter/generated_plugins.cmake rename to fediverse_archive_browser/windows/flutter/generated_plugins.cmake diff --git a/friendica_archive_browser/windows/runner/CMakeLists.txt b/fediverse_archive_browser/windows/runner/CMakeLists.txt similarity index 100% rename from friendica_archive_browser/windows/runner/CMakeLists.txt rename to fediverse_archive_browser/windows/runner/CMakeLists.txt diff --git a/friendica_archive_browser/windows/runner/Runner.rc b/fediverse_archive_browser/windows/runner/Runner.rc similarity index 100% rename from friendica_archive_browser/windows/runner/Runner.rc rename to fediverse_archive_browser/windows/runner/Runner.rc diff --git a/friendica_archive_browser/windows/runner/flutter_window.cpp b/fediverse_archive_browser/windows/runner/flutter_window.cpp similarity index 100% rename from friendica_archive_browser/windows/runner/flutter_window.cpp rename to fediverse_archive_browser/windows/runner/flutter_window.cpp diff --git a/friendica_archive_browser/windows/runner/flutter_window.h b/fediverse_archive_browser/windows/runner/flutter_window.h similarity index 100% rename from friendica_archive_browser/windows/runner/flutter_window.h rename to fediverse_archive_browser/windows/runner/flutter_window.h diff --git a/friendica_archive_browser/windows/runner/main.cpp b/fediverse_archive_browser/windows/runner/main.cpp similarity index 100% rename from friendica_archive_browser/windows/runner/main.cpp rename to fediverse_archive_browser/windows/runner/main.cpp diff --git a/friendica_archive_browser/windows/runner/resource.h b/fediverse_archive_browser/windows/runner/resource.h similarity index 100% rename from friendica_archive_browser/windows/runner/resource.h rename to fediverse_archive_browser/windows/runner/resource.h diff --git a/friendica_archive_browser/windows/runner/resources/app_icon.ico b/fediverse_archive_browser/windows/runner/resources/app_icon.ico similarity index 100% rename from friendica_archive_browser/windows/runner/resources/app_icon.ico rename to fediverse_archive_browser/windows/runner/resources/app_icon.ico diff --git a/friendica_archive_browser/windows/runner/resources/fba_app_icon.ico b/fediverse_archive_browser/windows/runner/resources/fba_app_icon.ico similarity index 100% rename from friendica_archive_browser/windows/runner/resources/fba_app_icon.ico rename to fediverse_archive_browser/windows/runner/resources/fba_app_icon.ico diff --git a/friendica_archive_browser/windows/runner/runner.exe.manifest b/fediverse_archive_browser/windows/runner/runner.exe.manifest similarity index 100% rename from friendica_archive_browser/windows/runner/runner.exe.manifest rename to fediverse_archive_browser/windows/runner/runner.exe.manifest diff --git a/friendica_archive_browser/windows/runner/utils.cpp b/fediverse_archive_browser/windows/runner/utils.cpp similarity index 100% rename from friendica_archive_browser/windows/runner/utils.cpp rename to fediverse_archive_browser/windows/runner/utils.cpp diff --git a/friendica_archive_browser/windows/runner/utils.h b/fediverse_archive_browser/windows/runner/utils.h similarity index 100% rename from friendica_archive_browser/windows/runner/utils.h rename to fediverse_archive_browser/windows/runner/utils.h diff --git a/friendica_archive_browser/windows/runner/win32_window.cpp b/fediverse_archive_browser/windows/runner/win32_window.cpp similarity index 100% rename from friendica_archive_browser/windows/runner/win32_window.cpp rename to fediverse_archive_browser/windows/runner/win32_window.cpp diff --git a/friendica_archive_browser/windows/runner/win32_window.h b/fediverse_archive_browser/windows/runner/win32_window.h similarity index 100% rename from friendica_archive_browser/windows/runner/win32_window.h rename to fediverse_archive_browser/windows/runner/win32_window.h From ba490b0887e14471143b4922940fadd803140dc6 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Wed, 16 Mar 2022 19:01:22 -0400 Subject: [PATCH 14/14] Update main README to reflect new naming/capabilities --- README.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 097c61d..9abb31d 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,20 @@ -# Friendica Archiving Tools +# Fediverse Archiving Tools -This repository contains two tools in support of archiving your Friendica data: -* [Friendica Archiver](https://gitlab.com/mysocialportal/friendica-archiving-tools/-/tree/main/friendica_archiver): a tool to create and update your archive -* [Friendica Archive Browser](https://gitlab.com/mysocialportal/friendica-archiving-tools/-/tree/main/friendica_archive_browser): a desktop application that runs on Windows, Mac, and Linux to browse your archive, extract information, see statistics on it etc. +This repository contains tools for working with locally archived data +from [Fediverse](https://en.wikipedia.org/wiki/Fediverse) accounts. + +## Archive Browser + +* [Fediverse Archive Browser](https://gitlab.com/mysocialportal/friendica-archiving-tools/-/tree/main/friendica_archive_browser): a desktop application that runs on Windows, Mac, and Linux to browse your archives, extract information, see statistics on it etc. + + +## Archive Generators/Updaters + +For fediverse platforms that don't have the ability to export data or +export it completely/easily. For those there are some archive generators: +* [Friendica Archiver](https://gitlab.com/mysocialportal/friendica-archiving-tools/-/tree/main/friendica_archiver): a tool to create and update your YFriendica archive -Installation can be as simple as going to the desired page and downloading the latest pre-existing binaries. There are build instructions as well though. # Licensing -Both tools have a license file in their respective folders, as well as this top level one that reflect that these tools are licensed under [The Mozilla Public License Version 2.0 (MPLv2.0)](https://www.mozilla.org/en-US/MPL/2.0/) +All tools have a license file in their respective folders, as well as this top level one that reflect that these tools are licensed under [The Mozilla Public License Version 2.0 (MPLv2.0)](https://www.mozilla.org/en-US/MPL/2.0/)