Improved exif info
This commit is contained in:
parent
f33a8c4d4f
commit
5fcbcb77fb
1 changed files with 46 additions and 7 deletions
|
|
@ -110,14 +110,21 @@ type FlagValue = {
|
||||||
|
|
||||||
const pathsC2PASource = (): FlagValue[] => {
|
const pathsC2PASource = (): FlagValue[] => {
|
||||||
return [
|
return [
|
||||||
{path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exif:Make", transform: getExifMakeModel },
|
{path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exif:Make", transform: getExifMakeModelPrefixed },
|
||||||
{path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exif:Model", transform: getExifMakeModel },
|
{path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exif:Model", transform: getExifMakeModelPrefixed },
|
||||||
{path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=c2pa.actions|c2pa.actions.v2]/data/actions[action=c2pa.created]/softwareAgent/name"},
|
{path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=c2pa.actions|c2pa.actions.v2]/data/actions[action=c2pa.created]/softwareAgent/name"},
|
||||||
{path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=c2pa.actions|c2pa.actions.v2]/data/actions[action=c2pa.created]/softwareAgent"},
|
{path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=c2pa.actions|c2pa.actions.v2]/data/actions[action=c2pa.created]/softwareAgent"},
|
||||||
{path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=c2pa.actions|c2pa.actions.v2]/data/actions[action=c2pa.created]/../../../claim_generator"}
|
{path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=c2pa.actions|c2pa.actions.v2]/data/actions[action=c2pa.created]/../../../claim_generator"}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const pathsExifSource = (): FlagValue[] => {
|
||||||
|
return [
|
||||||
|
{path: "integrity/exif/Make", transform: getExifMakeModelNoPrefix },
|
||||||
|
{path: "integrity/exif/Model", transform: getExifMakeModelNoPrefix }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
const pathsC2PACreationDate = (): FlagValue[] => {
|
const pathsC2PACreationDate = (): FlagValue[] => {
|
||||||
return [
|
return [
|
||||||
{path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=c2pa.actions|c2pa.actions.v2]/data/actions[action=c2pa.created]/when"},
|
{path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=c2pa.actions|c2pa.actions.v2]/data/actions[action=c2pa.created]/when"},
|
||||||
|
|
@ -131,6 +138,20 @@ const pathsC2PACreationDate = (): FlagValue[] => {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const pathsC2PACamera = (): FlagValue[] => {
|
||||||
|
return [
|
||||||
|
{path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exif:LensMake"},
|
||||||
|
{path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exif:LensModel"},
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
const pathsExifCamera = (): FlagValue[] => {
|
||||||
|
return [
|
||||||
|
{path: "integrity/exif/LensMake"},
|
||||||
|
{path: "integrity/exif/LensModel"},
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
const getExifValue = (val: string): string => {
|
const getExifValue = (val: string): string => {
|
||||||
return val.replace(/^"(.+(?="$))"$/, "$1");
|
return val.replace(/^"(.+(?="$))"$/, "$1");
|
||||||
};
|
};
|
||||||
|
|
@ -146,19 +167,27 @@ const pathsExifCreationDate = (): FlagValue[] => {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
const getExifMakeModel = (ignoredvalue: any, match: FlagMatchRuleValue): string => {
|
const getExifMakeModelNoPrefix = (ignoredvalue: any, match: FlagMatchRuleValue): string => {
|
||||||
|
return getExifMakeModel(match, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
const getExifMakeModelPrefixed = (ignoredvalue: any, match: FlagMatchRuleValue): string => {
|
||||||
|
return getExifMakeModel(match, "exif:");
|
||||||
|
}
|
||||||
|
|
||||||
|
const getExifMakeModel = (match: FlagMatchRuleValue, prefix: string): string => {
|
||||||
// Make and model
|
// Make and model
|
||||||
let makeAndModel = "";
|
let makeAndModel = "";
|
||||||
const make = extractFlagValues("../exif:Make", match.path)?.at(0)?.value as string;
|
const make = extractFlagValues(`../${prefix}Make`, match.path)?.at(0)?.value as string;
|
||||||
const model = extractFlagValues("../exif:Model", match.path)?.at(0)?.value as string;
|
const model = extractFlagValues(`../${prefix}Model`, match.path)?.at(0)?.value as string;
|
||||||
if (make) {
|
if (make) {
|
||||||
makeAndModel += make;
|
makeAndModel += getExifValue(make);
|
||||||
}
|
}
|
||||||
if (model) {
|
if (model) {
|
||||||
if (makeAndModel.length > 0) {
|
if (makeAndModel.length > 0) {
|
||||||
makeAndModel += ", ";
|
makeAndModel += ", ";
|
||||||
}
|
}
|
||||||
makeAndModel += model;
|
makeAndModel += getExifValue(model);
|
||||||
}
|
}
|
||||||
return makeAndModel;
|
return makeAndModel;
|
||||||
}
|
}
|
||||||
|
|
@ -361,6 +390,10 @@ export const extractProofHintFlags = (proof?: Proof): ProofHintFlags | undefined
|
||||||
let dateCreatedSource: ProofHintFlagSource | undefined = undefined;
|
let dateCreatedSource: ProofHintFlagSource | undefined = undefined;
|
||||||
|
|
||||||
source = getFirstWithData(pathsC2PASource(), rootMatchPath);
|
source = getFirstWithData(pathsC2PASource(), rootMatchPath);
|
||||||
|
if (!source) {
|
||||||
|
source = getFirstWithData(pathsExifSource(), rootMatchPath);
|
||||||
|
}
|
||||||
|
|
||||||
dateCreated = getFirstWithDataAsDate(pathsC2PACreationDate(), rootMatchPath);
|
dateCreated = getFirstWithDataAsDate(pathsC2PACreationDate(), rootMatchPath);
|
||||||
if (dateCreated) {
|
if (dateCreated) {
|
||||||
dateCreatedSource = "c2pa";
|
dateCreatedSource = "c2pa";
|
||||||
|
|
@ -385,6 +418,12 @@ export const extractProofHintFlags = (proof?: Proof): ProofHintFlags | undefined
|
||||||
} else if ([C2PASourceTypeTrainedAlgorithmicMedia, C2PASourceTypeCompositeWithTrainedAlgorithmicMedia].includes(digitalSourceType)) {
|
} else if ([C2PASourceTypeTrainedAlgorithmicMedia, C2PASourceTypeCompositeWithTrainedAlgorithmicMedia].includes(digitalSourceType)) {
|
||||||
generator = "ai";
|
generator = "ai";
|
||||||
generatorSource = "c2pa";
|
generatorSource = "c2pa";
|
||||||
|
} else if (getFirstWithData(pathsC2PACamera(), rootMatchPath)) {
|
||||||
|
generator = "camera";
|
||||||
|
generatorSource = "c2pa";
|
||||||
|
} else if (getFirstWithData(pathsExifCamera(), rootMatchPath)) {
|
||||||
|
generator = "camera";
|
||||||
|
generatorSource = "exif";
|
||||||
} else if (matchFlag(ruleScreenshotMeta(), rootMatchPath).result) {
|
} else if (matchFlag(ruleScreenshotMeta(), rootMatchPath).result) {
|
||||||
generator = "screenshot";
|
generator = "screenshot";
|
||||||
generatorSource = "metadata";
|
generatorSource = "metadata";
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue