#598 support for Sony predictive capture as burst

This commit is contained in:
Thibault Deckers 2023-04-19 13:05:38 +02:00
parent 03df8fbd26
commit 1e9b931758
5 changed files with 47 additions and 11 deletions

View file

@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
## <a id="unreleased"></a>[Unreleased] ## <a id="unreleased"></a>[Unreleased]
### Added
- Collection: support for Sony predictive capture as burst
## <a id="v1.8.5"></a>[v1.8.5] - 2023-04-18 ## <a id="v1.8.5"></a>[v1.8.5] - 2023-04-18
### Added ### Added

View file

@ -2,6 +2,7 @@ import 'dart:async';
import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/entry.dart';
import 'package:aves/model/multipage.dart'; import 'package:aves/model/multipage.dart';
import 'package:aves/ref/bursts.dart';
import 'package:aves/ref/mime_types.dart'; import 'package:aves/ref/mime_types.dart';
import 'package:aves/services/common/services.dart'; import 'package:aves/services/common/services.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
@ -17,15 +18,8 @@ extension ExtraAvesEntryMultipage on AvesEntry {
bool get isMotionPhoto => (catalogMetadata?.isMotionPhoto ?? false) || _isMotionPhotoLegacy; bool get isMotionPhoto => (catalogMetadata?.isMotionPhoto ?? false) || _isMotionPhotoLegacy;
String? getBurstKey(List<String> patterns) { String? getBurstKey(List<String> patterns) {
if (filenameWithoutExtension != null) { final key = BurstPatterns.getKeyForName(filenameWithoutExtension, patterns);
for (final pattern in patterns) { return key != null ? '$directory/$key' : null;
final match = RegExp(pattern).firstMatch(filenameWithoutExtension!);
if (match != null) {
return '$directory/${match.group(1)}';
}
}
}
return null;
} }
Future<MultiPageInfo?> getMultiPageInfo() async { Future<MultiPageInfo?> getMultiPageInfo() async {

View file

@ -309,6 +309,7 @@ class Settings extends ChangeNotifier {
if (videoBackgroundMode == VideoBackgroundMode.pip && !device.supportPictureInPicture) { if (videoBackgroundMode == VideoBackgroundMode.pip && !device.supportPictureInPicture) {
_set(videoBackgroundModeKey, null); _set(videoBackgroundModeKey, null);
} }
collectionBurstPatterns = collectionBurstPatterns.where(BurstPatterns.options.contains).toList();
} }
// app // app

View file

@ -1,6 +1,8 @@
class BurstPatterns { class BurstPatterns {
static const samsung = r'^(\d{8}_\d{6})_(\d+)$'; static const _keyGroupName = 'key';
static const sony = r'^DSC_\d+_BURST(\d{17})(_COVER)?$';
static const samsung = r'^(?<key>\d{8}_\d{6})_(\d+)$';
static const sony = r'^DSC(PDC)?_\d+_BURST(?<key>\d{17})(_COVER)?$';
static final options = [ static final options = [
BurstPatterns.samsung, BurstPatterns.samsung,
@ -33,6 +35,22 @@ class BurstPatterns {
_Manufacturers.samsung: samsung, _Manufacturers.samsung: samsung,
_Manufacturers.sony: sony, _Manufacturers.sony: sony,
}; };
static String? getKeyForName(String? filename, List<String> patterns) {
if (filename != null) {
for (final pattern in patterns) {
final match = RegExp(pattern).firstMatch(filename);
if (match != null) {
if (match.groupNames.contains(_keyGroupName)) {
return match.namedGroup(_keyGroupName);
}
// fallback to fetching group by index for backward compatibility
return match.group(1);
}
}
}
return null;
}
} }
// values as returned by `DeviceInfoPlugin().androidInfo` // values as returned by `DeviceInfoPlugin().androidInfo`

19
test/ref/bursts_test.dart Normal file
View file

@ -0,0 +1,19 @@
import 'package:aves/ref/bursts.dart';
import 'package:test/test.dart';
void main() {
test('Samsung burst', () {
expect(BurstPatterns.getKeyForName('20151021_072800_006', [BurstPatterns.samsung]), '20151021_072800');
expect(BurstPatterns.getKeyForName('20151021_072800_007', [BurstPatterns.samsung]), '20151021_072800');
});
test('Sony burst', () {
expect(BurstPatterns.getKeyForName('DSC_0006_BURST20151021072800123', [BurstPatterns.sony]), '20151021072800123');
expect(BurstPatterns.getKeyForName('DSC_0007_BURST20151021072800123', [BurstPatterns.sony]), '20151021072800123');
});
test('Sony predictive capture', () {
expect(BurstPatterns.getKeyForName('DSCPDC_0002_BURST20180619163426901', [BurstPatterns.sony]), '20180619163426901');
expect(BurstPatterns.getKeyForName('DSCPDC_0003_BURST20180619163426901_COVER', [BurstPatterns.sony]), '20180619163426901');
});
}