//--------------------------------------------------------------------------- Ztring Export_PBCore::Transform(MediaInfo_Internal &MI) { //Current date/time is ISO format time_t Time=time(NULL); Ztring TimeS; TimeS.Date_From_Seconds_1970((int32u)Time); TimeS.FindAndReplace(__T("UTC "), __T("")); TimeS.FindAndReplace(__T(" "), __T("T")); TimeS+=__T('Z'); Ztring ToReturn; ToReturn+=__T("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); ToReturn+=__T("<PBCoreDescriptionDocument xsi:schemaLocation=\"http://www.pbcore.org/PBCore/PBCoreNamespace.html http://www.pbcore.org/PBCore/PBCoreXSD_Ver_1-2-1.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.pbcore.org/PBCore/PBCoreNamespace.html\">\n"); ToReturn+=__T("\t<!-- Generated at ")+TimeS+__T(" by ")+MediaInfoLib::Config.Info_Version_Get()+__T(" -->\n"); ToReturn+=__T("\t<!-- Warning: MediaInfo outputs only pbcoreInstantiation, other mandatory PBCore data is junk -->\n"); ToReturn+=__T("\t<pbcoreIdentifier>\n"); ToReturn+=__T("\t\t<identifier>***</identifier>\n"); ToReturn+=__T("\t\t<identifierSource>***</identifierSource>\n"); ToReturn+=__T("\t</pbcoreIdentifier>\n"); ToReturn+=__T("\t<pbcoreTitle>\n"); ToReturn+=__T("\t\t<title>***</title>\n"); ToReturn+=__T("\t</pbcoreTitle>\n"); ToReturn+=__T("\t<pbcoreDescription>\n"); ToReturn+=__T("\t\t<description>***</description>\n"); ToReturn+=__T("\t\t<descriptionType>***</descriptionType>\n"); ToReturn+=__T("\t</pbcoreDescription>\n"); ToReturn+=__T("\t<pbcoreInstantiation>\n"); //pbcoreFormatID ToReturn+=__T("\t\t<pbcoreFormatID>\n"); //formatIdentifier ToReturn+=__T("\t\t\t<formatIdentifier>")+MI.Get(Stream_General, 0, General_FileName)+__T("</formatIdentifier>\n"); //formatIdentifierSource ToReturn+=__T("\t\t\t<formatIdentifierSource version=\"PBCoreXSD_Ver_1.2_D1\">File Name</formatIdentifierSource>\n"); ToReturn+=__T("\t\t</pbcoreFormatID>\n"); //formatDigital if (!MI.Get(Stream_General, 0, General_InternetMediaType).empty()) { ToReturn+=__T("\t\t<formatDigital>"); ToReturn+=MI.Get(Stream_General, 0, General_InternetMediaType); ToReturn+=__T("</formatDigital>\n"); } else { //TODO: how to implement formats without Media Type? ToReturn+=__T("\t\t<formatDigital>"); if (MI.Count_Get(Stream_Video)) ToReturn+=__T("video/x-"); else if (MI.Count_Get(Stream_Image)) ToReturn+=__T("image/x-"); else if (MI.Count_Get(Stream_Audio)) ToReturn+=__T("audio/x-"); else ToReturn+=__T("application/x-"); ToReturn+=Ztring(MI.Get(Stream_General, 0, __T("Format"))).MakeLowerCase(); ToReturn+=__T("</formatDigital>\n"); } //formatLocation ToReturn+=__T("\t\t<formatLocation>")+MI.Get(Stream_General, 0, General_CompleteName)+__T("</formatLocation>\n"); //dateCreated if (!MI.Get(Stream_General, 0, General_Encoded_Date).empty()) { Ztring dateCreated=MI.Get(Stream_General, 0, General_Recorded_Date); dateCreated.FindAndReplace(__T("UTC"), __T("-")); dateCreated.FindAndReplace(__T(" "), __T("T")); dateCreated+=__T('Z'); ToReturn+=__T("\t\t<dateCreated>")+dateCreated+__T("</dateCreated>\n"); } //dateIssued if (!MI.Get(Stream_General, 0, General_Recorded_Date).empty()) { Ztring dateIssued=MI.Get(Stream_General, 0, General_Recorded_Date); dateIssued.FindAndReplace(__T("UTC"), __T("-")); dateIssued.FindAndReplace(__T(" "), __T("T")); dateIssued+=__T('Z'); ToReturn+=__T("\t\t<dateIssued>")+dateIssued+__T("</dateIssued>\n"); } //formatMediaType if (!PBCore_MediaType(MI).empty()) ToReturn+=__T("\t\t<formatMediaType version=\"PBCoreXSD_Ver_1.2_D1\">")+PBCore_MediaType(MI)+__T("</formatMediaType>\n"); else ToReturn+=__T("\t\t<formatMediaType version=\"PBCoreXSD_Ver_1.2_D1\">application/octet-stream</formatMediaType>\n"); //formatGenerations ToReturn+=__T("\t\t<formatGenerations version=\"PBCoreXSD_Ver_1.2_D1\" />\n"); //formatFileSize if (!MI.Get(Stream_General, 0, General_FileSize).empty()) ToReturn+=__T("\t\t<formatFileSize>")+MI.Get(Stream_General, 0, General_FileSize)+__T("</formatFileSize>\n"); //formatTimeStart if (!MI.Get(Stream_Video, 0, Video_Delay_Original_String3).empty()) ToReturn+=__T("\t\t<formatTimeStart>")+MI.Get(Stream_Video, 0, Video_Delay_Original_String3)+__T("</formatTimeStart>\n"); else if (!MI.Get(Stream_Video, 0, Video_Delay_String3).empty()) ToReturn+=__T("\t\t<formatTimeStart>")+MI.Get(Stream_Video, 0, Video_Delay_String3)+__T("</formatTimeStart>\n"); //formatDuration if (!MI.Get(Stream_General, 0, General_Duration_String3).empty()) ToReturn+=__T("\t\t<formatDuration>")+MI.Get(Stream_General, 0, General_Duration_String3)+__T("</formatDuration>\n"); //formatDataRate if (!MI.Get(Stream_General, 0, General_OverallBitRate).empty()) { ToReturn+=__T("\t\t<formatDataRate>"); ToReturn+=MI.Get(Stream_General, 0, General_OverallBitRate); if (!MI.Get(Stream_General, 0, General_OverallBitRate_Mode).empty()) ToReturn+=__T(' ')+MI.Get(Stream_General, 0, General_OverallBitRate_Mode); ToReturn+=__T("</formatDataRate>\n"); } //formatTracks ToReturn+=__T("\t\t<formatTracks>")+Ztring::ToZtring(MI.Count_Get(Stream_Video)+MI.Count_Get(Stream_Audio)+MI.Count_Get(Stream_Image)+MI.Count_Get(Stream_Text))+__T("</formatTracks>\n"); //Streams for (size_t StreamKind=Stream_General+1; StreamKind<Stream_Max; StreamKind++) for (size_t StreamPos=0; StreamPos<MI.Count_Get((stream_t)StreamKind); StreamPos++) PBCore_Transform(ToReturn, MI, (stream_t)StreamKind, StreamPos); ToReturn+=__T("\t</pbcoreInstantiation>\n"); ToReturn+=__T("</PBCoreDescriptionDocument>\n"); //Carriage return ToReturn.FindAndReplace(__T("\n"), EOL, 0, Ztring_Recursive); return ToReturn; }
//--------------------------------------------------------------------------- Ztring Export_PBCore::Transform(MediaInfo_Internal &MI) { Node Node_Main("PBCoreDescriptionDocument"); Node_Main.Add_Attribute("xsi:schemaLocation", "http://www.pbcore.org/PBCore/PBCoreNamespace.html http://www.pbcore.org/PBCore/PBCoreXSD_Ver_1-2-1.xsd"); Node_Main.Add_Attribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); Node_Main.Add_Attribute("xmlns", "http://www.pbcore.org/PBCore/PBCoreNamespace.html"); Node* Node_Identifier = Node_Main.Add_Child("pbcoreIdentifier"); Node_Identifier->Add_Child("identifier", "***"); Node_Identifier->Add_Child("identifierSource", "***"); Node_Main.Add_Child("pbcoreTitle")->Add_Child("title", "***"); Node* Node_Description = Node_Main.Add_Child("pbcoreDescription"); Node_Description->Add_Child("description", "***"); Node_Description->Add_Child("descriptionType", "***"); Node* Node_Instantiation = Node_Main.Add_Child("pbcoreInstantiation"); //pbcoreFormatID Node* Node_FormatID = Node_Instantiation->Add_Child("pbcoreFormatID"); //formatIdentifier Node_FormatID->Add_Child("formatIdentifier", MI.Get(Stream_General, 0, General_FileName)); //formatIdentifierSource Node_FormatID->Add_Child("formatIdentifierSource", "File Name", "version", "PBCoreXSD_Ver_1.2_D1"); //formatDigital //TODO: how to implement formats without Media Type? Ztring Format; if (!MI.Get(Stream_General, 0, General_InternetMediaType).empty()) Format=Ztring(MI.Get(Stream_General, 0, General_InternetMediaType)); else if (MI.Count_Get(Stream_Video)) Format=__T("video/x-")+Ztring(MI.Get(Stream_General, 0, __T("Format"))).MakeLowerCase(); else if (MI.Count_Get(Stream_Image)) Format=__T("image/x-")+Ztring(MI.Get(Stream_General, 0, __T("Format"))).MakeLowerCase(); else if (MI.Count_Get(Stream_Audio)) Format=__T("audio/x-")+Ztring(MI.Get(Stream_General, 0, __T("Format"))).MakeLowerCase(); else Format=__T("application/x-")+Ztring(MI.Get(Stream_General, 0, __T("Format"))).MakeLowerCase(); Node_Instantiation->Add_Child("formatDigital", Format); //formatLocation Node_Instantiation->Add_Child("formatLocation", MI.Get(Stream_General, 0, General_CompleteName)); //dateCreated if (!MI.Get(Stream_General, 0, General_Encoded_Date).empty()) { Ztring dateCreated=MI.Get(Stream_General, 0, General_Recorded_Date); dateCreated.FindAndReplace(__T("UTC"), __T("-")); dateCreated.FindAndReplace(__T(" "), __T("T")); dateCreated+=__T('Z'); Node_Instantiation->Add_Child("dateCreated", dateCreated); } //dateIssued if (!MI.Get(Stream_General, 0, General_Recorded_Date).empty()) { Ztring dateIssued=MI.Get(Stream_General, 0, General_Recorded_Date); dateIssued.FindAndReplace(__T("UTC"), __T("-")); dateIssued.FindAndReplace(__T(" "), __T("T")); dateIssued+=__T('Z'); Node_Instantiation->Add_Child("dateIssued", dateIssued); } //formatMediaType Node_Instantiation->Add_Child("formatMediaType", PBCore_MediaType(MI).empty()?Ztring(__T("application/octet-stream")):PBCore_MediaType(MI), "version", "PBCoreXSD_Ver_1.2_D1"); //formatGenerations Node_Instantiation->Add_Child("formatGenerations", "","version", "PBCoreXSD_Ver_1.2_D1"); //formatFileSize Node_Instantiation->Add_Child_IfNotEmpty(MI, Stream_General, 0, General_FileSize, "formatFileSize"); //formatTimeStart if (!MI.Get(Stream_Video, 0, Video_Delay_Original_String3).empty()) Node_Instantiation->Add_Child("formatTimeStart", MI.Get(Stream_Video, 0, Video_Delay_Original_String3)); else if (!MI.Get(Stream_Video, 0, Video_Delay_String3).empty()) Node_Instantiation->Add_Child("formatTimeStart", MI.Get(Stream_Video, 0, Video_Delay_String3)); //formatDuration Node_Instantiation->Add_Child_IfNotEmpty(MI, Stream_General, 0, General_Duration_String3, "formatDuration"); //formatDataRate if (!MI.Get(Stream_General, 0, General_OverallBitRate).empty()) { Ztring formatDataRate=MI.Get(Stream_General, 0, General_OverallBitRate); if (!MI.Get(Stream_General, 0, General_OverallBitRate_Mode).empty()) formatDataRate+=__T(' ')+MI.Get(Stream_General, 0, General_OverallBitRate_Mode); Node_Instantiation->Add_Child("formatDataRate", formatDataRate); } //formatTracks Node_Instantiation->Add_Child("formatTracks", Ztring::ToZtring(MI.Count_Get(Stream_Video)+MI.Count_Get(Stream_Audio)+MI.Count_Get(Stream_Image)+MI.Count_Get(Stream_Text))); Ztring ToReturn; //Streams for (size_t StreamKind=Stream_General+1; StreamKind<Stream_Max; StreamKind++) for (size_t StreamPos=0; StreamPos<MI.Count_Get((stream_t)StreamKind); StreamPos++) PBCore_Transform(Node_Instantiation, MI, (stream_t)StreamKind, StreamPos); ToReturn+=Ztring().From_UTF8(To_XML(Node_Main, 0, true, true).c_str()); size_t Pos=ToReturn.find(__T("<PBCoreDescriptionDocument")); if(Pos!=Ztring::npos) ToReturn.insert(Pos, __T("<!-- Warning: MediaInfo outputs only pbcoreInstantiation, other mandatory PBCore data is junk -->\n")); //Carriage return if (MediaInfoLib::Config.LineSeparator_Get()!=__T("\n")) ToReturn.FindAndReplace(__T("\n"), MediaInfoLib::Config.LineSeparator_Get(), 0, Ztring_Recursive); return ToReturn; }