import 'package:collection/collection.dart'; import 'package:logging/logging.dart'; import 'package:nc_photos/account.dart'; import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/entity/person.dart'; import 'package:nc_photos/entity/person/adapter.dart'; import 'package:nc_photos/entity/person/content_provider/recognize.dart'; import 'package:nc_photos/entity/person_face.dart'; import 'package:nc_photos/object_extension.dart'; import 'package:nc_photos/use_case/find_file_descriptor.dart'; import 'package:nc_photos/use_case/recognize_face/list_recognize_face_item.dart'; import 'package:np_codegen/np_codegen.dart'; part 'recognize.g.dart'; @npLog class PersonRecognizeAdapter implements PersonAdapter { PersonRecognizeAdapter(this._c, this.account, this.person) : _provider = person.contentProvider as PersonRecognizeProvider; @override Stream> listFace() { return ListRecognizeFaceItem(_c)(account, _provider.face) .asyncMap((faces) async { final found = await FindFileDescriptor(_c)( account, faces.map((e) => e.fileId).toList(), onFileNotFound: (fileId) { _log.warning("[listFace] File not found: $fileId"); }, ); return faces .map((i) { final f = found.firstWhereOrNull((e) => e.fdId == i.fileId); return f?.run(BasicPersonFace.new); }) .whereNotNull() .toList(); }); } final DiContainer _c; final Account account; final Person person; final PersonRecognizeProvider _provider; }