Support videos with C2PA info
This commit is contained in:
parent
69b950512f
commit
834a519f15
3 changed files with 77 additions and 44 deletions
|
|
@ -45,23 +45,45 @@ onMounted(() => {
|
||||||
const a = attachment;
|
const a = attachment;
|
||||||
loadingProof.value = true;
|
loadingProof.value = true;
|
||||||
metaStripped.value = true;
|
metaStripped.value = true;
|
||||||
a.loadSrc()
|
|
||||||
.then((data) => {
|
const isVideo = a.event.getContent().msgtype == "m.video";
|
||||||
if (data && data.data) {
|
if (isVideo) {
|
||||||
return proofmode.proofCheckSource(data.data).then((res) => {
|
a.loadBlob()
|
||||||
a.proof = res;
|
.then((data) => {
|
||||||
if (res?.integrity?.c2pa) {
|
if (data && data.data) {
|
||||||
// If we have proof, overwrite the flags
|
return proofmode.proofCheckFile(new File([data.data], a.name)).then((res) => {
|
||||||
a.mediaMetadata = extractMediaMetadata(a.proof);
|
a.proof = res;
|
||||||
}
|
if (res?.integrity?.c2pa) {
|
||||||
updateMetaStripped(a);
|
// If we have proof, overwrite the flags
|
||||||
});
|
a.mediaMetadata = extractMediaMetadata(a.proof);
|
||||||
}
|
}
|
||||||
})
|
updateMetaStripped(a);
|
||||||
.catch(() => {})
|
});
|
||||||
.finally(() => {
|
}
|
||||||
loadingProof.value = false;
|
})
|
||||||
});
|
.catch(() => { })
|
||||||
|
.finally(() => {
|
||||||
|
loadingProof.value = false;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
a.loadSrc()
|
||||||
|
.then((data) => {
|
||||||
|
if (data && data.data) {
|
||||||
|
return proofmode.proofCheckSource(data.data).then((res) => {
|
||||||
|
a.proof = res;
|
||||||
|
if (res?.integrity?.c2pa) {
|
||||||
|
// If we have proof, overwrite the flags
|
||||||
|
a.mediaMetadata = extractMediaMetadata(a.proof);
|
||||||
|
}
|
||||||
|
updateMetaStripped(a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(() => { })
|
||||||
|
.finally(() => {
|
||||||
|
loadingProof.value = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
updateMetaStripped(attachment);
|
updateMetaStripped(attachment);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -204,6 +204,8 @@ export class AttachmentManager {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
attachment.thumbnail = thumb;
|
attachment.thumbnail = thumb;
|
||||||
|
attachment.proof = await proofmode.proofCheckFile(file);
|
||||||
|
attachment.mediaMetadata = extractMediaMetadata(attachment.proof);
|
||||||
}
|
}
|
||||||
|
|
||||||
attachment.status = "loaded";
|
attachment.status = "loaded";
|
||||||
|
|
|
||||||
|
|
@ -129,11 +129,11 @@ const pathsC2PASource = (): FlagValue[] => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exif:Make",
|
path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exif:Make",
|
||||||
transform: getExifMakeModelPrefixed,
|
transform: getMakeModel,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exif:Model",
|
path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exif:Model",
|
||||||
transform: getExifMakeModelPrefixed,
|
transform: getMakeModel,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
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",
|
||||||
|
|
@ -141,6 +141,15 @@ const pathsC2PASource = (): FlagValue[] => {
|
||||||
{
|
{
|
||||||
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=stds.exif]/data/tiff:Make",
|
||||||
|
transform: getMakeModel,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/tiff:Model",
|
||||||
|
transform: getMakeModel,
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
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",
|
||||||
},
|
},
|
||||||
|
|
@ -149,8 +158,8 @@ const pathsC2PASource = (): FlagValue[] => {
|
||||||
|
|
||||||
const pathsExifSource = (): FlagValue[] => {
|
const pathsExifSource = (): FlagValue[] => {
|
||||||
return [
|
return [
|
||||||
{ path: "integrity/exif/Make", transform: getExifMakeModelNoPrefix },
|
{ path: "integrity/exif/Make", transform: getMakeModel },
|
||||||
{ path: "integrity/exif/Model", transform: getExifMakeModelNoPrefix },
|
{ path: "integrity/exif/Model", transform: getMakeModel },
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -181,6 +190,8 @@ const pathsC2PACamera = (): FlagValue[] => {
|
||||||
{ path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exif:SceneType", matches: ["^1$", "^directly photographed image$"] },
|
{ path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exif:SceneType", matches: ["^1$", "^directly photographed image$"] },
|
||||||
{ 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:LensMake" },
|
||||||
{ path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exif:LensModel" },
|
{ path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exif:LensModel" },
|
||||||
|
{ path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exifEX:LensMake" },
|
||||||
|
{ path: "integrity/c2pa/manifest_info/manifests[]/assertions[label=stds.exif]/data/exifEX:LensModel" },
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -284,12 +295,28 @@ const pathsExifCreationDate = (): FlagValue[] => {
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
const getExifMakeModelNoPrefix = (ignoredvalue: any, match: FlagMatchRuleValue): string => {
|
const getMakeModel = (ignoredval: string, match: FlagMatchRuleValue): string => {
|
||||||
return getExifMakeModel(match, "");
|
let prefix: string = "";
|
||||||
};
|
|
||||||
|
|
||||||
const getExifMakeModelPrefixed = (ignoredvalue: any, match: FlagMatchRuleValue): string => {
|
const pathLeaf = match.path.at(0)?.path;
|
||||||
return getExifMakeModel(match, "exif:");
|
if (pathLeaf && pathLeaf.indexOf(":") >= 0) {
|
||||||
|
prefix = pathLeaf.substring(0, pathLeaf.indexOf(":") + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make and model
|
||||||
|
let makeAndModel = "";
|
||||||
|
const make = extractFlagValues(`../${prefix}Make`, match.path)?.at(0)?.value as string;
|
||||||
|
const model = extractFlagValues(`../${prefix}Model`, match.path)?.at(0)?.value as string;
|
||||||
|
if (make) {
|
||||||
|
makeAndModel += getExifValue(make);
|
||||||
|
}
|
||||||
|
if (model) {
|
||||||
|
if (makeAndModel.length > 0) {
|
||||||
|
makeAndModel += ", ";
|
||||||
|
}
|
||||||
|
makeAndModel += getExifValue(model);
|
||||||
|
}
|
||||||
|
return makeAndModel;
|
||||||
};
|
};
|
||||||
|
|
||||||
const exifStringTransform = (value: any, match: FlagMatchRuleValue): string => {
|
const exifStringTransform = (value: any, match: FlagMatchRuleValue): string => {
|
||||||
|
|
@ -320,24 +347,6 @@ const exifStringTransform = (value: any, match: FlagMatchRuleValue): string => {
|
||||||
return value;
|
return value;
|
||||||
};
|
};
|
||||||
|
|
||||||
const getExifMakeModel = (match: FlagMatchRuleValue, prefix: string): string => {
|
|
||||||
// Make and model
|
|
||||||
let makeAndModel = "";
|
|
||||||
const make = extractFlagValues(`../${prefix}Make`, match.path)?.at(0)?.value as string;
|
|
||||||
const model = extractFlagValues(`../${prefix}Model`, match.path)?.at(0)?.value as string;
|
|
||||||
if (make) {
|
|
||||||
makeAndModel += getExifValue(make);
|
|
||||||
}
|
|
||||||
if (model) {
|
|
||||||
if (makeAndModel.length > 0) {
|
|
||||||
makeAndModel += ", ";
|
|
||||||
}
|
|
||||||
makeAndModel += getExifValue(model);
|
|
||||||
}
|
|
||||||
return makeAndModel;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const extractFlagValues = (flagPath: string, path: FlagMatchRulePathSegment[]): FlagMatchRuleValue[] => {
|
const extractFlagValues = (flagPath: string, path: FlagMatchRulePathSegment[]): FlagMatchRuleValue[] => {
|
||||||
const getValues = (keys: string[], path: FlagMatchRulePathSegment[]): FlagMatchRuleValue[] | undefined => {
|
const getValues = (keys: string[], path: FlagMatchRulePathSegment[]): FlagMatchRuleValue[] | undefined => {
|
||||||
if (keys.length == 0 || path.length == 0) return undefined;
|
if (keys.length == 0 || path.length == 0) return undefined;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue