From fc10f97bfa1010c68b4f10c9ebe08289fa80655d Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Tue, 24 Aug 2021 09:54:27 +0900 Subject: [PATCH] video: improved date detection --- lib/model/entry.dart | 6 +++++- lib/model/metadata.dart | 3 ++- lib/model/video/metadata.dart | 28 +++++++++++++++++++++++++++- lib/ref/mime_types.dart | 3 ++- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/lib/model/entry.dart b/lib/model/entry.dart index 9c036e9a6..5d2812de2 100644 --- a/lib/model/entry.dart +++ b/lib/model/entry.dart @@ -429,10 +429,14 @@ class AvesEntry { } else { if (isVideo && (!isSized || durationMillis == 0)) { // exotic video that is not sized during loading - final fields = await VideoMetadataFormatter.getCatalogMetadata(this); + final fields = await VideoMetadataFormatter.getLoadingMetadata(this); await _applyNewFields(fields, persist: persist); } catalogMetadata = await metadataService.getCatalogMetadata(this, background: background); + + if (isVideo && (catalogMetadata?.dateMillis ?? 0) == 0) { + catalogMetadata = await VideoMetadataFormatter.getCatalogMetadata(this); + } } } diff --git a/lib/model/metadata.dart b/lib/model/metadata.dart index 862d904d7..50e76bd00 100644 --- a/lib/model/metadata.dart +++ b/lib/model/metadata.dart @@ -75,13 +75,14 @@ class CatalogMetadata { CatalogMetadata copyWith({ int? contentId, String? mimeType, + int? dateMillis, bool? isMultiPage, int? rotationDegrees, }) { return CatalogMetadata( contentId: contentId ?? this.contentId, mimeType: mimeType ?? this.mimeType, - dateMillis: dateMillis, + dateMillis: dateMillis ?? this.dateMillis, isAnimated: isAnimated, isFlipped: isFlipped, isGeotiff: isGeotiff, diff --git a/lib/model/video/metadata.dart b/lib/model/video/metadata.dart index 23131a53a..f906ac1a7 100644 --- a/lib/model/video/metadata.dart +++ b/lib/model/video/metadata.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:aves/model/entry.dart'; +import 'package:aves/model/metadata.dart'; import 'package:aves/model/video/channel_layouts.dart'; import 'package:aves/model/video/codecs.dart'; import 'package:aves/model/video/keys.dart'; @@ -9,6 +10,7 @@ import 'package:aves/model/video/profiles/h264.dart'; import 'package:aves/model/video/profiles/hevc.dart'; import 'package:aves/ref/languages.dart'; import 'package:aves/ref/mp4.dart'; +import 'package:aves/services/services.dart'; import 'package:aves/utils/file_utils.dart'; import 'package:aves/utils/math_utils.dart'; import 'package:aves/utils/string_utils.dart'; @@ -50,7 +52,7 @@ class VideoMetadataFormatter { return info; } - static Future> getCatalogMetadata(AvesEntry entry) async { + static Future> getLoadingMetadata(AvesEntry entry) async { final mediaInfo = await getVideoMetadata(entry); final fields = {}; @@ -75,6 +77,30 @@ class VideoMetadataFormatter { return fields; } + static Future getCatalogMetadata(AvesEntry entry) async { + final mediaInfo = await getVideoMetadata(entry); + + int? dateMillis; + + final dateString = mediaInfo[Keys.date]; + if (dateString is String && dateString != '0') { + final date = DateTime.tryParse(dateString); + if (date != null) { + dateMillis = date.millisecondsSinceEpoch; + } else { + await reportService.recordError('getCatalogMetadata failed to parse date=$dateString for mimeType=${entry.mimeType} entry=$entry', null); + } + } + + if (dateMillis != null) { + return (entry.catalogMetadata ?? CatalogMetadata(contentId: entry.contentId)).copyWith( + dateMillis: dateMillis, + ); + } + + return entry.catalogMetadata; + } + // pattern to extract optional language code suffix, e.g. 'location-eng' static final keyWithLanguagePattern = RegExp(r'^(.*)-([a-z]{3})$'); diff --git a/lib/ref/mime_types.dart b/lib/ref/mime_types.dart index 302e3ddcf..f3a6e5601 100644 --- a/lib/ref/mime_types.dart +++ b/lib/ref/mime_types.dart @@ -41,6 +41,7 @@ class MimeTypes { static const anyVideo = 'video/*'; static const avi = 'video/avi'; + static const aviVnd = 'video/vnd.avi'; static const mkv = 'video/x-matroska'; static const mov = 'video/quicktime'; static const mp2t = 'video/mp2t'; // .m2ts @@ -61,7 +62,7 @@ class MimeTypes { static const Set _knownOpaqueImages = {heic, heif, jpeg}; - static const Set _knownVideos = {avi, mkv, mov, mp2t, mp4, ogg}; + static const Set _knownVideos = {avi, aviVnd, mkv, mov, mp2t, mp4, ogg}; static final Set knownMediaTypes = {..._knownOpaqueImages, ...alphaImages, ...rawImages, ...undecodableImages, ..._knownVideos};