video: improved date parsing
This commit is contained in:
parent
7c18334934
commit
e594378efc
2 changed files with 42 additions and 6 deletions
|
@ -22,6 +22,7 @@ import 'package:flutter/foundation.dart';
|
||||||
|
|
||||||
class VideoMetadataFormatter {
|
class VideoMetadataFormatter {
|
||||||
static final _epoch = DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
|
static final _epoch = DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
|
||||||
|
static final _anotherDatePattern = RegExp(r'(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})');
|
||||||
static final _durationPattern = RegExp(r'(\d+):(\d+):(\d+)(.\d+)');
|
static final _durationPattern = RegExp(r'(\d+):(\d+):(\d+)(.\d+)');
|
||||||
static final _locationPattern = RegExp(r'([+-][.0-9]+)');
|
static final _locationPattern = RegExp(r'([+-][.0-9]+)');
|
||||||
static final Map<String, String> _codecNames = {
|
static final Map<String, String> _codecNames = {
|
||||||
|
@ -80,19 +81,16 @@ class VideoMetadataFormatter {
|
||||||
static Future<CatalogMetadata?> getCatalogMetadata(AvesEntry entry) async {
|
static Future<CatalogMetadata?> getCatalogMetadata(AvesEntry entry) async {
|
||||||
final mediaInfo = await getVideoMetadata(entry);
|
final mediaInfo = await getVideoMetadata(entry);
|
||||||
|
|
||||||
int? dateMillis;
|
|
||||||
|
|
||||||
bool isDefined(dynamic value) => value is String && value != '0';
|
bool isDefined(dynamic value) => value is String && value != '0';
|
||||||
|
|
||||||
var dateString = mediaInfo[Keys.date];
|
var dateString = mediaInfo[Keys.date];
|
||||||
if (!isDefined(dateString)) {
|
if (!isDefined(dateString)) {
|
||||||
dateString = mediaInfo[Keys.creationTime];
|
dateString = mediaInfo[Keys.creationTime];
|
||||||
}
|
}
|
||||||
|
int? dateMillis;
|
||||||
if (isDefined(dateString)) {
|
if (isDefined(dateString)) {
|
||||||
final date = DateTime.tryParse(dateString);
|
dateMillis = parseVideoDate(dateString);
|
||||||
if (date != null) {
|
if (dateMillis == null) {
|
||||||
dateMillis = date.millisecondsSinceEpoch;
|
|
||||||
} else {
|
|
||||||
await reportService.recordError('getCatalogMetadata failed to parse date=$dateString for mimeType=${entry.mimeType} entry=$entry', null);
|
await reportService.recordError('getCatalogMetadata failed to parse date=$dateString for mimeType=${entry.mimeType} entry=$entry', null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -106,6 +104,33 @@ class VideoMetadataFormatter {
|
||||||
return entry.catalogMetadata;
|
return entry.catalogMetadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int? parseVideoDate(String dateString) {
|
||||||
|
final date = DateTime.tryParse(dateString);
|
||||||
|
if (date != null) {
|
||||||
|
return date.millisecondsSinceEpoch;
|
||||||
|
}
|
||||||
|
|
||||||
|
// `DateTime` does not recognize:
|
||||||
|
// - `UTC 2021-05-30 19:14:21`
|
||||||
|
|
||||||
|
final match = _anotherDatePattern.firstMatch(dateString);
|
||||||
|
if (match != null) {
|
||||||
|
final year = int.tryParse(match.group(1)!);
|
||||||
|
final month = int.tryParse(match.group(2)!);
|
||||||
|
final day = int.tryParse(match.group(3)!);
|
||||||
|
final hour = int.tryParse(match.group(4)!);
|
||||||
|
final minute = int.tryParse(match.group(5)!);
|
||||||
|
final second = int.tryParse(match.group(6)!);
|
||||||
|
|
||||||
|
if (year != null && month != null && day != null && hour != null && minute != null && second != null) {
|
||||||
|
final date = DateTime(year, month, day, hour, minute, second, 0);
|
||||||
|
return date.millisecondsSinceEpoch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
// pattern to extract optional language code suffix, e.g. 'location-eng'
|
// pattern to extract optional language code suffix, e.g. 'location-eng'
|
||||||
static final keyWithLanguagePattern = RegExp(r'^(.*)-([a-z]{3})$');
|
static final keyWithLanguagePattern = RegExp(r'^(.*)-([a-z]{3})$');
|
||||||
|
|
||||||
|
|
11
test/model/video/metadata_test.dart
Normal file
11
test/model/video/metadata_test.dart
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import 'package:aves/model/video/metadata.dart';
|
||||||
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
test('Video date parsing', () {
|
||||||
|
final localOffset = DateTime.now().timeZoneOffset;
|
||||||
|
|
||||||
|
expect(VideoMetadataFormatter.parseVideoDate('2011-05-08T03:46+09:00'), DateTime(2011, 5, 8, 12, 46).add(-localOffset).millisecondsSinceEpoch);
|
||||||
|
expect(VideoMetadataFormatter.parseVideoDate('UTC 2021-05-30 19:14:21'), DateTime(2021, 5, 30, 19, 14, 21).millisecondsSinceEpoch);
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in a new issue