in src/main/java/com/netflix/imflibrary/app/IMPFixer.java [190:285]
public static List<ErrorLogger.ErrorObject> analyzePackageAndWrite(File rootFile, File targetFile, String versionCPLSchema, Boolean copyTrackfile, Boolean generateHash) throws
IOException, ParserConfigurationException, SAXException, JAXBException, URISyntaxException, NoSuchAlgorithmException {
IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl();
List<PayloadRecord> headerPartitionPayloadRecords = new ArrayList<>();
BasicMapProfileV2MappedFileSet mapProfileV2MappedFileSet = new BasicMapProfileV2MappedFileSet(rootFile);
AssetMap assetMap = new AssetMap(new File(mapProfileV2MappedFileSet.getAbsoluteAssetMapURI()));
for (AssetMap.Asset packingListAsset : assetMap.getPackingListAssets()) {
PackingList packingList = new PackingList(new File(rootFile, packingListAsset.getPath().toString()));
Map<UUID, IMPBuilder.IMFTrackFileMetadata> imfTrackFileMetadataMap = new HashMap<>();
for (PackingList.Asset asset : packingList.getAssets()) {
File assetFile = new File(rootFile, assetMap.getPath(asset.getUUID()).toString());
ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(assetFile);
if (asset.getType().equals(PackingList.Asset.APPLICATION_MXF_TYPE)) {
PayloadRecord headerPartitionPayloadRecord = getHeaderPartitionPayloadRecord(resourceByteRangeProvider, new IMFErrorLoggerImpl());
headerPartitionPayloadRecords.add(headerPartitionPayloadRecord);
byte[] bytes = headerPartitionPayloadRecord.getPayload();
byte[] hash = asset.getHash();
if( generateHash) {
hash = IMFUtils.generateSHA1Hash(resourceByteRangeProvider);
}
imfTrackFileMetadataMap.put(getTrackFileId(headerPartitionPayloadRecord),
new IMPBuilder.IMFTrackFileMetadata(bytes,
hash,
CompositionPlaylistBuilder_2016.defaultHashAlgorithm,
assetFile.getName(),
resourceByteRangeProvider.getResourceSize())
);
if(copyTrackfile) {
File outputFile = new File(targetFile.toString() + File.separator + assetFile.getName());
Files.copy(assetFile.toPath(), outputFile.toPath(), REPLACE_EXISTING);
}
}
}
Map<UUID, PayloadRecord> trackFileIDToHeaderPartitionPayLoadMap =
getTrackFileIdToHeaderPartitionPayLoadMap(headerPartitionPayloadRecords);
for (PackingList.Asset asset : packingList.getAssets()) {
File assetFile = new File(rootFile, assetMap.getPath(asset.getUUID()).toString());
ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(assetFile);
if (asset.getType().equals(PackingList.Asset.TEXT_XML_TYPE) && ApplicationComposition.isCompositionPlaylist(resourceByteRangeProvider)) {
ApplicationComposition applicationComposition = ApplicationCompositionFactory.getApplicationComposition(resourceByteRangeProvider, new IMFErrorLoggerImpl());
if(applicationComposition == null){
continue;
}
Set<UUID> trackFileIDsSet = trackFileIDToHeaderPartitionPayLoadMap.keySet();
if(versionCPLSchema.equals(""))
{
String coreConstraintsSchema = applicationComposition.getCoreConstraintsSchema();
if (coreConstraintsSchema.equals(CoreConstraints.NAMESPACE_IMF_2013)) {
versionCPLSchema = "2013";
}
else if (coreConstraintsSchema.equals(CoreConstraints.NAMESPACE_IMF_2016)
|| coreConstraintsSchema.equals(CoreConstraints.NAMESPACE_IMF_2020)) {
versionCPLSchema = "2016";
}
else {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CORE_CONSTRAINTS_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.FATAL,
String.format("Input package CoreConstraints Schema %s not supported", applicationComposition.getCoreConstraintsSchema()));
}
}
if(versionCPLSchema.equals("2016"))
{
imfErrorLogger.addAllErrors(IMPBuilder.buildIMP_2016("IMP",
"Netflix",
applicationComposition.getEssenceVirtualTracks(),
applicationComposition.getEditRate(),
"http://www.smpte-ra.org/schemas/2067-21/2016",
imfTrackFileMetadataMap,
targetFile));
}
else if(versionCPLSchema.equals("2013")) {
imfErrorLogger.addAllErrors(IMPBuilder.buildIMP_2013("IMP",
"Netflix",
applicationComposition.getEssenceVirtualTracks(),
applicationComposition.getEditRate(),
"http://www.smpte-ra.org/schemas/2067-21/2016",
imfTrackFileMetadataMap,
targetFile));
}
else {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CORE_CONSTRAINTS_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.FATAL,
String.format("Invalid CPL schema %s for output", versionCPLSchema.equals("2013")));
}
}
}
}
return imfErrorLogger.getErrors();
}