ZtringListList::ZtringListList(const ZtringListList &Source) : std::vector<ZenLib::ZtringList, std::allocator<ZenLib::ZtringList> > () { Separator[0]=Source.Separator[0]; Separator[1]=Source.Separator[1]; Quote=Source.Quote; Max[0]=Source.Max[0]; Max[1]=Source.Max[1]; reserve(Source.size()); for (intu Pos=0; Pos<Source.size(); Pos++) push_back(Source[Pos]); }
//--------------------------------------------------------------------------- void File_SubRip::Read_Buffer_Continue() { if (!IsSub && (Buffer_Size<File_Size && Buffer_Size<65536)) { Element_WaitForMoreData(); return; } ZtringListList Temp; Temp.Separator_Set(0, __T("\r\n\r\n")); Temp.Separator_Set(1, __T("\r\n")); Temp.Write(Ztring().From_UTF8((const char*)Buffer, Buffer_Size>65536?65536:Buffer_Size)); if (Temp.empty()) Temp.Write(Ztring().From_Local((const char*)Buffer, Buffer_Size>65536?65536:Buffer_Size)); // Trying from local code page size_t IsOk=0; size_t IsNok=0; for (size_t Pos=0; Pos<Temp.size(); Pos++) { if (Temp(Pos, 0).To_int64u()==Pos+1) IsOk++; else IsNok++; if (Temp(Pos, 1).size()>22 && Temp(Pos, 1)[2]==__T(':') && Temp(Pos, 1)[5]==__T(':') && Temp(Pos, 1).find(__T(" --> "))!=string::npos) IsOk++; else IsNok++; } if (!IsOk || IsNok>IsOk/2) { Reject(); return; } if (!Status[IsAccepted]) { Accept(); Fill(Stream_General, 0, General_Format, "SubRip"); Stream_Prepare(Stream_Text); Fill(Stream_Text, 0, "Format", "SubRip"); Fill(Stream_Text, 0, "Codec", "SubRip"); } Element_Offset=File_Size; }
//--------------------------------------------------------------------------- bool File_SubRip::FileHeader_Begin() { if (!IsSub && (Buffer_Size<File_Size && Buffer_Size<65536)) { Element_WaitForMoreData(); return false; } ZtringListList List; List.Separator_Set(0, __T("\n\n")); List.Separator_Set(1, __T("\n")); if (Buffer[0]==0xEF && Buffer[1]==0xBB && Buffer[2]==0xBF) HasBOM=true; bool IsLocal=false; Ztring Temp; Temp.From_UTF8((const char*)Buffer+(HasBOM?3:0), (Buffer_Size>65536?65536:Buffer_Size)-(HasBOM?3:0)); if (Temp.empty()) { Temp.From_Local((const char*)Buffer+(HasBOM?3:0), (Buffer_Size>65536?65536:Buffer_Size)-(HasBOM?3:0)); // Trying from local code page IsLocal=true; } Temp.FindAndReplace(__T("\r\n"), __T("\n"), 0, Ztring_Recursive); Temp.FindAndReplace(__T("\r"), __T("\n"), 0, Ztring_Recursive); List.Write(Temp); if (List(0, 0)==__T("WEBVTT FILE") || List(0, 0)==__T("WEBVTT")) IsVTT=true; if (!IsVTT) { size_t IsOk=0; size_t IsNok=0; for (size_t Pos=0; Pos<List.size(); Pos++) { if (List(Pos, 0).To_int64u()==Pos+1) IsOk++; else IsNok++; if (List(Pos, 1).size()>22 && List(Pos, 1)[2]==__T(':') && List(Pos, 1)[5]==__T(':') && List(Pos, 1).find(__T(" --> "))!=string::npos) IsOk++; else IsNok++; } if (!IsOk || IsNok>IsOk/2) { Reject(); return true; } } if (!IsSub && File_Size!=(int64u)-1 && Buffer_Size!=File_Size) { Element_WaitForMoreData(); return false; } if (!Status[IsAccepted]) { Accept(); Fill(Stream_General, 0, General_Format, IsVTT?"WebVTT":"SubRip"); Stream_Prepare(Stream_Text); Fill(Stream_Text, 0, "Format", IsVTT?"WebVTT":"SubRip"); Fill(Stream_Text, 0, "Codec", IsVTT?"WebVTT":"SubRip"); } if (IsLocal) Temp.From_Local((const char*)Buffer+(HasBOM?3:0), Buffer_Size-(HasBOM?3:0)); else Temp.From_UTF8((const char*)Buffer+(HasBOM?3:0), Buffer_Size-(HasBOM?3:0)); Temp.FindAndReplace(__T("\r\n"), __T("\n"), 0, Ztring_Recursive); Temp.FindAndReplace(__T("\r"), __T("\n"), 0, Ztring_Recursive); List.Write(Temp); #if MEDIAINFO_DEMUX size_t Pos=0; for (;;) { if (Pos>=List.size()) break; if (List[Pos].size()>=3 || (IsVTT && List[Pos].size()>=2)) { Ztring PTS_Begin_String=List[Pos][IsVTT?0:1].SubString(Ztring(), __T(" --> ")); Ztring PTS_End_String=List[Pos][IsVTT?0:1].SubString(__T(" --> "), Ztring()); if (IsVTT) { size_t Extra_Pos=PTS_End_String.find(__T(' ')); if (Extra_Pos!=string::npos) PTS_End_String.resize(Extra_Pos); //Discarding positioning } item Item; Item.PTS_Begin=SubRip_str2timecode(PTS_Begin_String.To_UTF8().c_str()); Item.PTS_End=SubRip_str2timecode(PTS_End_String.To_UTF8().c_str()); for (size_t Pos2=IsVTT?1:2; Pos2<List[Pos].size(); Pos2++) { List[Pos][Pos2].Trim(); Item.Content+=List[Pos][Pos2]; if (Pos2+1<List[Pos].size()) Item.Content+=EOL; } Items.push_back(Item); } Pos++; } #endif //MEDIAINFO_DEMUX return true; }
//--------------------------------------------------------------------------- int Preferences::ExplorerShell() { TRegistry* Reg=new TRegistry; Reg->RootKey = HKEY_CLASSES_ROOT; ZtringListList Liste; Liste=_T( ".mkv;MKVFile\r\n" ".mka;MKAFile\r\n" ".mks;MKSFile\r\n" ".ogg;OGGFile\r\n" ".ogm;OGMFile\r\n" ".ogv;OGMFile\r\n" ".wav;WAVFile\r\n" ".avi;AVIFile\r\n" ".divx;AVIFile\r\n" ".gvi;AVIFile\r\n" ".mpeg;mpegFile\r\n" ".mpg;mpegFile\r\n" ".dat;datFile\r\n" ".mpe;mpegFile\r\n" ".mpgx;mpegFile\r\n" ".mpm;mpegFile\r\n" ".m1s;mpegFile\r\n" ".vob;mpegFile\r\n" ".m2s;mpegFile\r\n" ".mp4;mpeg4File\r\n" ".m4a;mpeg4File\r\n" ".mpgv;mpegFile\r\n" ".mpv;mpegFile\r\n" ".m1v;mpegFile\r\n" ".m2v;mpegFile\r\n" ".ts;tsFile\r\n" ".m2ts;m2tsFile\r\n" ".mp2;mp3File\r\n" ".mp3;mp3File\r\n" ".mpc;mpcFile\r\n" ".mp+;mpcFile\r\n" ".asf;ASFFile\r\n" ".wmv;WMVFile\r\n" ".wma;WMAFile\r\n" ".mov;MOVFile\r\n" ".qt;QTFile\r\n" ".rm;RMFile\r\n" ".ra;RMFile\r\n" ".ifo;IfoFile\r\n" ".ac3;AC3File\r\n" ".dts;DTSFile\r\n" ".aac;AACFile\r\n" ".ape;APEFile\r\n" ".mac;APEFile\r\n" ".flac;FLACFile\r\n" ".3gp;mpeg4File\r\n" ".3gpp;mpeg4File\r\n" ".swf;FlashFile\r\n" ".flv;FlashVideoFile\r\n" ".rmvb;FlashVideoFile\r\n" ".tp;FlashVideoFile\r\n" ".smv;SMVFile\r\n" ".dpg;DPGFile"); bool IsChanged=false; int32s ShellExtension=Config.Read(_T("ShellExtension")).To_int32s(); for (size_t I1=0; I1<Liste.size(); I1++) { //Open (or create) a extension. Create only if Sheel extension is wanted if (Reg->OpenKey(Liste(I1, 0).c_str(), ShellExtension)) { //test if extension is known AnsiString Player=Reg->ReadString(_T("")); if (Player=="") { //extension not known, will use our default Player=Liste(I1, 1).c_str(); try {Reg->WriteString(_T(""), Player);} catch (...){} IsChanged=true; } Reg->CloseKey(); //Test if MediaInfo shell extension is known if (Reg->OpenKey(Player+_T("\\Shell\\MediaInfo\\Command"), false)) { //MediaInfo shell extension is known if (Config.Read(_T("ShellExtension")).To_int32s()) { //test if good writing AnsiString ShellExtensionToWtrite="\"" + Application->ExeName +"\" \"%1\""; AnsiString ShellExtension=Reg->ReadString(_T("")).c_str(); if (ShellExtension!=ShellExtensionToWtrite) { //This is not the good shell extension, writing new one try {Reg->WriteString(_T(""), ShellExtensionToWtrite);} catch (...){} IsChanged=true; } } else { //Should not be here, deleting Reg->CloseKey(); Reg->DeleteKey(Player+"\\Shell\\MediaInfo"); Reg->DeleteKey(Player+"\\Shell\\Media Info"); IsChanged=true; } Reg->CloseKey(); } else { //MediaInfo Shell extension is not known if (Config.Read(_T("ShellExtension")).To_int32s()) { //Create it Reg->DeleteKey(Player+"\\Shell\\Media Info"); //Delete the lod version if it exists Reg->OpenKey(Player+_T("\\Shell\\MediaInfo\\Command"), true); AnsiString ShellExtensionToWtrite="\"" + Application->ExeName +"\" \"%1\""; try {Reg->WriteString(_T(""), ShellExtensionToWtrite);} catch (...){} Reg->CloseKey(); IsChanged=true; } } } } //end Reg->Free(); if (IsChanged) SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); return 1; }
void TExportF::Export_Run() { //Create text for the file Ztring Text; Ztring Append_Separator=__T("\r\n"); if (Export->ActivePage==Export_CSV) { //Full information bool MediaInfo_Complete; if (CSV_Advanced->Checked) MediaInfo_Complete=true; else MediaInfo_Complete=false; //General ZtringListListF CSV; ZtringListList Parameters; Parameters.Write(MediaInfo::Option_Static(__T("Info_Parameters_CSV"))); int Pos_Start=1; int Pos_End=Parameters.Find(__T("Video"))-1; int CSV_Pos=0; for (int I1=0; I1<Pos_End-Pos_Start; I1++) if (MediaInfo_Complete || ToExport->Get(0, Stream_General, 0, I1, Info_Options)[InfoOption_ShowInInform]==__T('Y')) { CSV(0, CSV_Pos)=Ztring(__T("General "))+Parameters(Pos_Start+I1, 0); for (int FilePos=0; FilePos<ToExport->Count_Get(); FilePos++) CSV(1+FilePos, CSV_Pos)=ToExport->Get(FilePos, Stream_General, 0, I1); CSV_Pos++; } //Video Pos_Start=Pos_End+2; Pos_End=Parameters.Find(__T("Audio"))-1; for (int I1=0; I1<Pos_End-Pos_Start; I1++) { for (int Count=0; Count<CSV_Stream_Video->ItemIndex; Count++) if (MediaInfo_Complete || ToExport->Get(0, Stream_Video, 0, I1, Info_Options)[InfoOption_ShowInInform]==__T('Y')) { CSV(0, CSV_Pos)=Ztring(__T("Video "))+Ztring::ToZtring(Count)+__T(" ")+Parameters(Pos_Start+I1, 0); for (int FilePos=0; FilePos<ToExport->Count_Get(); FilePos++) CSV(1+FilePos, CSV_Pos)=ToExport->Get(FilePos, Stream_Video, 0, I1); CSV_Pos++; } } //Audio Pos_Start=Pos_End+2; Pos_End=Parameters.Find(__T("Text"))-1; for (int Count=0; Count<CSV_Stream_Audio->ItemIndex; Count++) { for (int I1=0; I1<Pos_End-Pos_Start; I1++) if (MediaInfo_Complete || ToExport->Get(0, Stream_Audio, 0, I1, Info_Options)[InfoOption_ShowInInform]==__T('Y')) { CSV(0, CSV_Pos)=Ztring(__T("Audio "))+Ztring::ToZtring(Count)+__T(" ")+Parameters(Pos_Start+I1, 0); for (int FilePos=0; FilePos<ToExport->Count_Get(); FilePos++) CSV(1+FilePos, CSV_Pos)=ToExport->Get(FilePos, Stream_Audio, Count, I1); CSV_Pos++; } } //Text Pos_Start=Pos_End+2; Pos_End=Parameters.Find(__T("Chapters"))-1; for (int Count=0; Count<CSV_Stream_Text->ItemIndex; Count++) { for (int I1=0; I1<Pos_End-Pos_Start; I1++) if (MediaInfo_Complete || ToExport->Get(0, Stream_Text, 0, I1, Info_Options)[InfoOption_ShowInInform]==__T('Y')) { CSV(0, CSV_Pos)=Ztring(__T("Text "))+Ztring::ToZtring(Count)+__T(" ")+Parameters(Pos_Start+I1, 0); for (int FilePos=0; FilePos<ToExport->Count_Get(); FilePos++) CSV(1+FilePos, CSV_Pos)=ToExport->Get(FilePos, Stream_Text, Count, I1); CSV_Pos++; } } //Chapters Pos_Start=Pos_End+2; Pos_End=Parameters.size()-1; for (int Count=0; Count<CSV_Stream_Other->ItemIndex; Count++) { for (int I1=0; I1<Pos_End-Pos_Start; I1++) if (MediaInfo_Complete || ToExport->Get(0, Stream_Other, 0, I1, Info_Options)[InfoOption_ShowInInform]==__T('Y')) { CSV(0, CSV_Pos)=Ztring(__T("Chapters "))+Ztring::ToZtring(Count)+__T(" ")+Parameters(Pos_Start+I1, 0); for (int FilePos=0; FilePos<ToExport->Count_Get(); FilePos++) CSV(1+FilePos, CSV_Pos)=ToExport->Get(FilePos, Stream_Other, Count, I1); CSV_Pos++; } } //Separators Ztring Separator_Col=ZEN_UNICODE(CSV_Separator_Col->Text); if (Separator_Col==__T("(Tab)")) Separator_Col=__T("\t"); Ztring Separator_Line=ZEN_UNICODE(CSV_Separator_Line->Text); if (Separator_Line==__T("(Default)")) #ifdef WIN32 Separator_Line=__T("\r\n"); #else #error #endif //WIN32 Separator_Line.FindAndReplace(__T("\\r"), __T("\r")); Separator_Line.FindAndReplace(__T("\\n"), __T("\n")); Append_Separator=Separator_Line.c_str(); Ztring Quote=ZEN_UNICODE(CSV_Quote->Text); CSV.Separator_Set(0, Separator_Line); CSV.Separator_Set(1, Separator_Col); CSV.Quote_Set(Quote); if (File_Append->Checked) CSV.Delete(0); Text=CSV.Read().c_str(); } else if (Export->ActivePage==Export_Sheet) { ZtringListListF SheetF; //Configure for (size_t Pos=0; Pos<Prefs->Details[Prefs_Sheet].size(); Pos++) { Ztring Z1=__T("Column"); Z1+=Ztring::ToZtring(Pos); //Searching kind of stream stream_t S; ZenLib::Char C=__T('G'); if (Prefs->Details[Prefs_Sheet].Find(Z1)==(size_t)-1) break; C=Prefs->Details[Prefs_Sheet](Z1, 1)[0]; switch (C) { case __T('G'): S=Stream_General; break; case __T('V'): S=Stream_Video; break; case __T('A'): S=Stream_Audio; break; case __T('T'): S=Stream_Text; break; case __T('C'): S=Stream_Other; break; default: S=Stream_General; } SheetF(0, Pos)=ToExport->Get(0, S, Prefs->Details[Prefs_Sheet](Z1, 2).To_int32u(), Prefs->Details[Prefs_Sheet](Z1, 3), Info_Name_Text); if (C!=__T('G')) SheetF(0, Pos)=Prefs->Details[Prefs_Sheet](Z1, 1)+Prefs->Details[Prefs_Sheet](Z1, 2)+__T(" ")+SheetF(0, Pos); } //Show all available files for (int FilePos=0; FilePos<ToExport->Count_Get(); FilePos++) for (size_t Pos=0; Pos<Prefs->Details[Prefs_Sheet].size(); Pos++) { Ztring Z1=__T("Column"); Z1+=Ztring::ToZtring(Pos); //Searching Stream kind stream_t S; ZenLib::Char C=__T('G'); if (Prefs->Details[Prefs_Sheet].Find(Z1)==(size_t)-1) break; C=Prefs->Details[Prefs_Sheet](Z1, 1)[0]; switch (C) { case __T('G'): S=Stream_General; break; case __T('V'): S=Stream_Video; break; case __T('A'): S=Stream_Audio; break; case __T('T'): S=Stream_Text; break; case __T('C'): S=Stream_Other; break; default: S=Stream_General; } //Showing SheetF(1+FilePos, Pos)=ToExport->Get(FilePos, S, Prefs->Details[Prefs_Sheet](Z1, 2).To_int32u(), Prefs->Details[Prefs_Sheet](Z1, 3)); } //Separators Ztring Separator_Col=ZEN_UNICODE(Sheet_Separator_Col->Text); if (Separator_Col==__T("(Tab)")) Separator_Col=__T("\t"); Ztring Separator_Line=ZEN_UNICODE(Sheet_Separator_Line->Text); if (Separator_Line==__T("(Default)")) #ifdef WIN32 Separator_Line=__T("\r\n"); #else #error #endif //WIN32 if (Separator_Line==__T("\\r\\n")) Separator_Line=__T("\r\n"); if (Separator_Line==__T("\\r")) Separator_Line=__T("\r"); if (Separator_Line==__T("\\n")) Separator_Line=__T("\n"); Ztring Quote=ZEN_UNICODE(Sheet_Quote->Text); Append_Separator=Separator_Line.c_str(); SheetF.Separator_Set(0, Separator_Line); SheetF.Separator_Set(1, Separator_Col); SheetF.Quote_Set(Quote); if (File_Append->Checked) SheetF.Delete(0); Text=SheetF.Read().c_str(); } else if (Export->ActivePage==Export_Text) { ToExport->Option_Static(__T("Inform")); Text=ToExport->Inform().c_str(); } else if (Export->ActivePage==Export_HTML) { ToExport->Option_Static(__T("Inform"), __T("HTML")); Text=ToExport->Inform().c_str(); Append_Separator=__T("<hr>\r\n"); } else if (Export->ActivePage==Export_XML) { ToExport->Option_Static(__T("Inform"), __T("XML")); if (Export_XML_SideCar->Checked) { for (size_t Pos=0; Pos<ToExport->Count_Get(); Pos++) { Text=ToExport->Inform(Pos).c_str(); File F; F.Create(Ztring(ToExport->Get(Pos, Stream_General, 0, __T("CompleteName")).c_str())+__T(".mediainfo.xml")); F.Write(Text); } return; } Text=ToExport->Inform().c_str(); } else if (Export->ActivePage==Export_MPEG7) { ToExport->Option_Static(__T("Inform"), __T("MPEG-7")); if (Export_MPEG7_SideCar->Checked) { for (size_t Pos=0; Pos<ToExport->Count_Get(); Pos++) { Text=ToExport->Inform(Pos).c_str(); File F; F.Create(Ztring(ToExport->Get(Pos, Stream_General, 0, __T("CompleteName")).c_str())+__T(".mpeg7.xml")); F.Write(Text); } return; } Text=ToExport->Inform().c_str(); } else if (Export->ActivePage==Export_PBCore) { ToExport->Option_Static(__T("Inform"), __T("PBCore_1.2")); if (Export_PBCore_SideCar->Checked) { for (size_t Pos=0; Pos<ToExport->Count_Get(); Pos++) { Text=ToExport->Inform(Pos).c_str(); File F; F.Create(Ztring(ToExport->Get(Pos, Stream_General, 0, __T("CompleteName")).c_str())+__T(".PBCore.xml")); F.Write(Text); } return; } Text=ToExport->Inform().c_str(); } else if (Export->ActivePage==Export_PBCore2) { ToExport->Option_Static(__T("Inform"), __T("PBCore_2.0")); if (Export_PBCore2_SideCar->Checked) { for (size_t Pos=0; Pos<ToExport->Count_Get(); Pos++) { Text=ToExport->Inform(Pos).c_str(); File F; F.Create(Ztring(ToExport->Get(Pos, Stream_General, 0, __T("CompleteName")).c_str())+__T(".PBCore2.xml")); F.Write(Text); } return; } Text=ToExport->Inform().c_str(); } else if (Export->ActivePage==Export_EBUCore_1_5) { ToExport->Option_Static(__T("Inform"), __T("EBUCore_1.5")); if (Export_EBUCore_1_5_SideCar->Checked) { for (size_t Pos=0; Pos<ToExport->Count_Get(); Pos++) { Text=ToExport->Inform(Pos).c_str(); File F; F.Create(Ztring(ToExport->Get(Pos, Stream_General, 0, __T("CompleteName")).c_str())+__T(".EBUCore.xml")); F.Write(Text); } return; } Text=ToExport->Inform().c_str(); } else if (Export->ActivePage==Export_EBUCore_1_6) { ToExport->Option_Static(__T("Inform"), __T("EBUCore_1.6")); if (Export_EBUCore_1_6_SideCar->Checked) { for (size_t Pos=0; Pos<ToExport->Count_Get(); Pos++) { Text=ToExport->Inform(Pos).c_str(); File F; F.Create(Ztring(ToExport->Get(Pos, Stream_General, 0, __T("CompleteName")).c_str())+__T(".EBUCore.xml")); F.Write(Text); } return; } Text=ToExport->Inform().c_str(); } else if (Export->ActivePage==Export_FIMS_1_1) { ToExport->Option_Static(__T("Inform"), __T("FIMS_1.1")); if (Export_FIMS_1_1_SideCar->Checked) { for (size_t Pos=0; Pos<ToExport->Count_Get(); Pos++) { Text=ToExport->Inform(Pos).c_str(); File F; F.Create(Ztring(ToExport->Get(Pos, Stream_General, 0, __T("CompleteName")).c_str())+__T(".FIMS.xml")); F.Write(Text); } return; } Text=ToExport->Inform().c_str(); } else if (Export->ActivePage==Export_FIMS_1_2) { ToExport->Option_Static(__T("Inform"), __T("FIMS_1.2")); if (Export_FIMS_1_2_SideCar->Checked) { for (size_t Pos=0; Pos<ToExport->Count_Get(); Pos++) { Text=ToExport->Inform(Pos).c_str(); File F; F.Create(Ztring(ToExport->Get(Pos, Stream_General, 0, __T("CompleteName")).c_str())+__T(".FIMS.xml")); F.Write(Text); } return; } Text=ToExport->Inform().c_str(); } else if (Export->ActivePage==Export_FIMS_1_3) { ToExport->Option_Static(__T("Inform"), __T("FIMS_1.3")); if (Export_FIMS_1_3_SideCar->Checked) { for (size_t Pos=0; Pos<ToExport->Count_Get(); Pos++) { Text=ToExport->Inform(Pos).c_str(); File F; F.Create(Ztring(ToExport->Get(Pos, Stream_General, 0, __T("CompleteName")).c_str())+__T(".FIMS.xml")); F.Write(Text); } return; } Text=ToExport->Inform().c_str(); } else if (Export->ActivePage==Export_reVTMD) { ToExport->Option_Static(__T("Inform"), __T("reVTMD")); if (Export_reVTMD_SideCar->Checked) { for (size_t Pos=0; Pos<ToExport->Count_Get(); Pos++) { Text=ToExport->Inform(Pos).c_str(); File F; F.Create(Ztring(ToExport->Get(Pos, Stream_General, 0, __T("CompleteName")).c_str())+__T(".reVTMD.xml")); F.Write(Text); } return; } Text=ToExport->Inform().c_str(); } else if (Export->ActivePage==Export_Custom) { ToExport->Option_Static(__T("Inform"), Prefs->Details[Prefs_Custom].Read()); if (Custom_One->State==cbChecked) { for (int FilePos=0; FilePos<ToExport->Count_Get(); FilePos++) { Ztring Z1=ToExport->Inform(FilePos).c_str(); //Put begin and end of file Z1=Prefs->Details[Prefs_Custom](Stream_Max+2, 1)+Z1; //Begin Z1+=Prefs->Details[Prefs_Custom](Stream_Max+4, 1); //End Z1.FindAndReplace(__T("\\r\\n"),__T( "\r\n"), 0, Ztring_Recursive); Text=Z1.c_str();;//Write file File F; FileName FN=ZEN_UNICODE(Name->Text); FN.Name_Set(FN.Name_Get()+Ztring::ToZtring(FilePos).c_str()); F.Open(FN, File::Access_Write); F.Write(Text); } return; //No need to save the file, already done } else Text=ToExport->Inform().c_str(); } //Writing file File F; if (File_Append->Checked) { F.Open(ZEN_UNICODE(Name->Text), File::Access_Write_Append); F.Write(Append_Separator); } else F.Create(ZEN_UNICODE(Name->Text)); F.Write(Text); }
//--------------------------------------------------------------------------- bool File_Hls::FileHeader_Begin() { //Element_Size if (File_Size>1024*1024 || File_Size<10) { Reject("HLS"); return false; //HLS files are not big } if (Buffer_Size<File_Size) return false; //Wait for complete file Ztring Document; Document.From_UTF8((char*)Buffer, Buffer_Size); ZtringList Lines; size_t LinesSeparator_Pos=Document.find_first_of(__T("\r\n")); if (LinesSeparator_Pos>File_Size-1) { Reject("HLS"); return false; } Ztring LinesSeparator; if (Document[LinesSeparator_Pos]==__T('\r') && LinesSeparator_Pos+1<Document.size() && Document[LinesSeparator_Pos+1]==__T('\n')) LinesSeparator=__T("\r\n"); else if (Document[LinesSeparator_Pos]==__T('\r')) LinesSeparator=__T("\r"); else if (Document[LinesSeparator_Pos]==__T('\n')) LinesSeparator=__T("\n"); else { Reject("HLS"); return false; } Lines.Separator_Set(0, LinesSeparator); Lines.Write(Document); if (Lines(0)!=__T("#EXTM3U")) { Reject("HLS"); return false; } Accept("HLS"); Fill(Stream_General, 0, General_Format, "HLS"); ReferenceFiles=new File__ReferenceFilesHelper(this, Config); if (!IsSub) ReferenceFiles->ContainerHasNoId=true; File__ReferenceFilesHelper::reference ReferenceFile; bool IsGroup=false; for (size_t Line=0; Line<Lines.size(); Line++) { if (!Lines[Line].empty()) { if (Lines[Line].find(__T("#EXT-X-KEY:"))==0) { ZtringListList List; List.Separator_Set(0, __T(",")); List.Separator_Set(1, __T("=")); List.Write(Lines[Line].substr(11, string::npos)); for (size_t Pos=0; Pos<List.size(); ++Pos) { if (List[Pos](0)==__T("METHOD")) { if (List[Pos](1).find(__T("AES-128"))==0) { Fill(Stream_General, 0, General_Encryption_Format, "AES"); Fill(Stream_General, 0, General_Encryption_Length, "128"); Fill(Stream_General, 0, General_Encryption_Method, "Segment"); Fill(Stream_General, 0, General_Encryption_Mode, "CBC"); Fill(Stream_General, 0, General_Encryption_Padding, "PKCS7"); Fill(Stream_General, 0, General_Encryption_InitializationVector, "Sequence number"); #if MEDIAINFO_AES //Trying to get the key from FileName.FileExt.key if (Config->Encryption_Key_Get().empty()) { File KeyFile; if (KeyFile.Open(File_Name+__T(".key"))) { if (KeyFile.Size_Get()==16) { int8u Key[16]; if (KeyFile.Read(Key, 16)==16) Config->Encryption_Key_Set(Key, 16); } else Fill(Stream_General, 0, "Encryption_Key_Problem", KeyFile.Size_Get()); } } #endif } Fill(Stream_General, 0, General_Encryption, List[Pos](1)); } } } else if (Lines[Line].find(__T("#EXT-X-STREAM-INF:"))==0) { IsGroup=true; } else if (Lines[Line][0]==__T('#')) ; else { if (IsGroup) { ReferenceFile.FileNames.push_back(Lines[Line]); ReferenceFile.StreamID=ReferenceFiles->References.size()+1; ReferenceFiles->References.push_back(ReferenceFile); IsGroup=false; ReferenceFile=File__ReferenceFilesHelper::reference(); #if MEDIAINFO_EVENTS ParserIDs[0]=MediaInfo_Parser_HlsIndex; StreamIDs_Width[0]=sizeof(size_t); #endif //MEDIAINFO_EVENTS } else ReferenceFile.FileNames.push_back(Lines[Line]); } } } if (!ReferenceFile.FileNames.empty()) { ReferenceFiles->References.push_back(ReferenceFile); Fill(Stream_General, 0, General_Format_Profile, "Media"); } else { Fill(Stream_General, 0, General_Format_Profile, "Master"); } Element_Offset=File_Size; //All should be OK... return true; }
//--------------------------------------------------------------------------- void GUI_Main_xxxx__Common::Fill () { //Preparing Updating=true; //Showing ZtringListList List; List.Separator_Set(0, EOL); List.Separator_Set(1, _T(",")); List.Write(Fill_Content()); //Elminating unuseful info from filenames FileName_Before.clear(); if (List.size()==2 && !List[1].empty()) { size_t ToDelete=List[1][0].rfind(PathSeparator); if (ToDelete!=string::npos) { FileName_Before=List[1][0].substr(0, ToDelete+1); List[1][0].erase(0, ToDelete+1); } } else if (List.size()>1 && !List[1].empty()) { size_t ToDelete; size_t File_Pos; for (ToDelete=0; ToDelete<List[1][0].size(); ToDelete++) { char Char_File1=List[1][0][ToDelete]; for (File_Pos=2; File_Pos<List.size(); File_Pos++) if (ToDelete>=List[File_Pos][0].size() || List[File_Pos][0][ToDelete]!=Char_File1) break; if (File_Pos!=List.size()) break; } ToDelete=List[1][0].rfind(PathSeparator, ToDelete); if (ToDelete!=string::npos) { FileName_Before=List[1][0].substr(0, ToDelete+1); for (File_Pos=1; File_Pos<List.size(); File_Pos++) List[File_Pos][0].erase(0, ToDelete+1); } } if (List.empty() || List[0].empty()) { setRowCount(0); setColumnCount(0); //Preparing Updating=false; return; } //Forcing reset, else this seems to be some Qt bug in the table display setRowCount(0); setColumnCount(0); //Filling - HorizontalHeader setRowCount((int)List.size()-1); size_t ColumnMissing_Count=0; for (size_t Option=0; Option<Main->Preferences->Group_Options_Count_Get(Fill_Group()); Option++) if (!Main->Menu_Fields_CheckBoxes[Fill_Group()*options::MaxCount+Option]->isChecked()) ColumnMissing_Count++; setColumnCount((int)(List[0].size()-ColumnMissing_Count)); ColumnMissing_Count=0; for (size_t Data_Pos=0; Data_Pos<List[0].size(); Data_Pos++) if (Data_Pos==0 || Main->Menu_Fields_CheckBoxes[Fill_Group()*options::MaxCount+Data_Pos-1]->isChecked()) { QTableWidgetItem* Item=new QTableWidgetItem(QString().fromUtf8(List[0][Data_Pos].To_Local().c_str())); Item->setToolTip(Columns_ToolTip(List[0][Data_Pos])); setHorizontalHeaderItem((int)(Data_Pos-ColumnMissing_Count), Item); } else ColumnMissing_Count++; //Filling - VerticalHeader and content for (size_t File_Pos=1; File_Pos<List.size(); File_Pos++) { if (List[File_Pos].empty()) List[File_Pos].resize(1); //Empty filename, we need to manualy add it. ColumnMissing_Count=0; for (size_t Data_Pos=0; Data_Pos<List[0].size(); Data_Pos++) if (Data_Pos==0 || Main->Menu_Fields_CheckBoxes[Fill_Group()*options::MaxCount+Data_Pos-1]->isChecked()) { QTableWidgetItem* Item; if (Data_Pos<List[File_Pos].size()) { ZenLib::Ztring Value=List[File_Pos][Data_Pos]; Value.FindAndReplace(EOL, "\n", 0, Ztring_Recursive); Item=new QTableWidgetItem(QString().fromUtf8(Value.To_Local().c_str())); Item->setToolTip(Columns_ToolTip(List[0][Data_Pos])); } else Item=new QTableWidgetItem(QString()); if (!C->IsValid_Get(FileName_Before+List[File_Pos][0]) || (Data_Pos<List[File_Pos].size() && !Fill_Enabled(FileName_Before+List[File_Pos][0], List[0][Data_Pos], List[File_Pos][Data_Pos]))) Item->setFlags(Item->flags()&((Qt::ItemFlags)-1-Qt::ItemIsEnabled)); setItem((int)File_Pos-1, (int)(Data_Pos-ColumnMissing_Count), Item); } else ColumnMissing_Count++; } //Configuring Colors_Update(); resizeColumnsToContents(); setSortingEnabled(true); //Preparing Updating=false; }
//--------------------------------------------------------------------------- bool File_SubRip::FileHeader_Begin() { if (!IsSub && (Buffer_Size<File_Size && Buffer_Size<65536)) { Element_WaitForMoreData(); return false; } ZtringListList List; List.Separator_Set(0, __T("\n\n")); List.Separator_Set(1, __T("\n")); if (Buffer_Size>=3 && Buffer[0]==0xEF && Buffer[1]==0xBB && Buffer[2]==0xBF) HasBOM=true; bool IsLocal=false; Ztring Temp; Temp.From_UTF8((const char*)Buffer+(HasBOM?3:0), (Buffer_Size>65536?65536:Buffer_Size)-(HasBOM?3:0)); if (Temp.empty()) { #ifdef WINDOWS Temp.From_Local((const char*)Buffer+(HasBOM?3:0), (Buffer_Size>65536?65536:Buffer_Size)-(HasBOM?3:0)); // Trying from local code page #else //WINDOWS Temp.From_ISO_8859_1((const char*)Buffer+(HasBOM?3:0), (Buffer_Size>65536?65536:Buffer_Size)-(HasBOM?3:0)); #endif //WINDOWS IsLocal=true; } Temp.FindAndReplace(__T("\r\n"), __T("\n"), 0, Ztring_Recursive); Temp.FindAndReplace(__T("\r"), __T("\n"), 0, Ztring_Recursive); List.Write(Temp); if (List(0, 0)==__T("WEBVTT FILE") || List(0, 0)==__T("WEBVTT")) IsVTT=true; if (!IsVTT) { size_t IsOk=0; size_t IsNok=0; for (size_t Pos=0; Pos<List.size(); Pos++) { if (List(Pos, 0).To_int64u()==Pos+1) IsOk++; else IsNok++; if (List(Pos, 1).size()>22 && List(Pos, 1)[2]==__T(':') && List(Pos, 1)[5]==__T(':') && List(Pos, 1).find(__T(" --> "))!=string::npos) IsOk++; else IsNok++; } if (!IsOk || IsNok>IsOk/2) { Reject(); return true; } } if (!IsSub && File_Size!=(int64u)-1 && Buffer_Size!=File_Size) { Element_WaitForMoreData(); return false; } if (!Status[IsAccepted]) { Accept(); Fill(Stream_General, 0, General_Format, IsVTT?"WebVTT":"SubRip"); Stream_Prepare(Stream_Text); Fill(Stream_Text, 0, "Format", IsVTT?"WebVTT":"SubRip"); Fill(Stream_Text, 0, "Codec", IsVTT?"WebVTT":"SubRip"); } if (IsLocal) #ifdef WINDOWS Temp.From_Local((const char*)Buffer+(HasBOM?3:0), Buffer_Size-(HasBOM?3:0)); #else //WINDOWS Temp.From_ISO_8859_1((const char*)Buffer+(HasBOM?3:0), Buffer_Size-(HasBOM?3:0)); #endif //WINDOWS else