Merge metadata streams

This commit is contained in:
Neeraj Gupta
2024-07-17 14:57:54 +05:30
parent 087e84b7ba
commit 95369097a5
2 changed files with 31 additions and 3 deletions

View File

@@ -14,7 +14,7 @@ import "package:photos/models/location/location.dart";
class FFProbeProps {
Map<String, dynamic>? prodData;
Location? location;
DateTime? creationTime;
DateTime? creationTimeUTC;
String? bitrate;
String? majorBrand;
String? fps;
@@ -45,7 +45,7 @@ class FFProbeProps {
return buffer.toString();
}
static fromJson(Map<dynamic, dynamic>? json) {
static parseData(Map<dynamic, dynamic>? json) {
final Map<String, dynamic> parsedData = {};
final FFProbeProps result = FFProbeProps();
@@ -76,6 +76,7 @@ class FFProbeProps {
break;
case FFProbeKeys.creationTime:
parsedData[stringKey] = _formatDate(json[key] ?? "");
result.creationTimeUTC = _getUTCDateTime(json[key] ?? "");
break;
case FFProbeKeys.durationMicros:
parsedData[stringKey] = formatPreciseDuration(
@@ -112,7 +113,20 @@ class FFProbeProps {
}
// iterate through the streams
final List<dynamic> streams = json["streams"];
final List<dynamic> newStreams = [];
final Map<String, dynamic> metadata = {};
for (final stream in streams) {
if (stream['type'] == 'metadata') {
for (final key in stream.keys) {
if (key == FFProbeKeys.frameCount && stream[key]?.toString() == "1") {
continue;
}
metadata[key] = stream[key];
}
metadata.remove(FFProbeKeys.index);
} else {
newStreams.add(stream);
}
for (final key in stream.keys) {
if (key == FFProbeKeys.rFrameRate) {
result.fps = _formatFPS(stream[key]);
@@ -126,6 +140,10 @@ class FFProbeProps {
}
}
}
if (metadata.isNotEmpty) {
newStreams.add(metadata);
}
parsedData["streams"] = newStreams;
result.prodData = parsedData;
return result;
}
@@ -171,6 +189,16 @@ class FFProbeProps {
return formatDateTime(newDate, 'en_US', false);
}
static DateTime? _getUTCDateTime(String value) {
final dateInUtc = DateTime.tryParse(value);
if (dateInUtc == null) return null;
final epoch = DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
if (dateInUtc == epoch) return null;
return DateTime.fromMicrosecondsSinceEpoch(
dateInUtc.microsecondsSinceEpoch,
);
}
// input example: '00:00:05.408000000' or '5.408000'
static Duration? _parseDuration(String? value) {
if (value == null) return null;

View File

@@ -17,7 +17,7 @@ class FFProbeUtil {
final properties = await getMetadata(mediaInformation);
try {
return FFProbeProps.fromJson(properties);
return FFProbeProps.parseData(properties);
} catch (e, stackTrace) {
_logger.severe(
"Error parsing FFProbe properties: $properties",