void MicroDVDSubtitleFormat::WriteFile(const AssFile *src, wxString const& filename, wxString const& encoding) const { agi::vfr::Framerate fps = AskForFPS(true, false); if (!fps.IsLoaded()) return; AssFile copy(*src); copy.Sort(); StripComments(copy.Line); RecombineOverlaps(copy.Line); MergeIdentical(copy.Line); StripTags(copy.Line); ConvertNewlines(copy.Line, "|"); TextFileWriter file(filename, encoding); // Write FPS line if (!fps.IsVFR()) { file.WriteLineToFile(wxString::Format("{1}{1}%.6f", fps.FPS())); } // Write lines for (LineList::const_iterator cur = copy.Line.begin(); cur != copy.Line.end(); ++cur) { if (AssDialogue *current = dynamic_cast<AssDialogue*>(*cur)) { int start = fps.FrameAtTime(current->Start, agi::vfr::START); int end = fps.FrameAtTime(current->End, agi::vfr::END); file.WriteLineToFile(wxString::Format("{%i}{%i}%s", start, end, current->Text)); } } }
void MicroDVDSubtitleFormat::WriteFile(const AssFile *src, agi::fs::path const& filename, std::string const& encoding) const { agi::vfr::Framerate fps = AskForFPS(true, false); if (!fps.IsLoaded()) return; AssFile copy(*src); copy.Sort(); StripComments(copy); RecombineOverlaps(copy); MergeIdentical(copy); StripTags(copy); ConvertNewlines(copy, "|"); TextFileWriter file(filename, encoding); // Write FPS line if (!fps.IsVFR()) file.WriteLineToFile(str(boost::format("{1}{1}%.6f") % fps.FPS())); // Write lines for (auto current : copy.Line | agi::of_type<AssDialogue>()) { int start = fps.FrameAtTime(current->Start, agi::vfr::START); int end = fps.FrameAtTime(current->End, agi::vfr::END); file.WriteLineToFile(str(boost::format("{%i}{%i}%s") % start % end % boost::replace_all_copy(current->Text.get(), "\\N", "|"))); } }
void EncoreSubtitleFormat::WriteFile(const AssFile *src, wxString const& filename, wxString const&) const { agi::vfr::Framerate fps = AskForFPS(false, true); if (!fps.IsLoaded()) return; // Convert to encore AssFile copy(*src); copy.Sort(); StripComments(copy.Line); RecombineOverlaps(copy.Line); MergeIdentical(copy.Line); StripTags(copy.Line); ConvertNewlines(copy.Line, "\r\n"); // Encode wants ; for NTSC and : for PAL // The manual suggests no other frame rates are supported char sep = fps.NeedsDropFrames() ? ';' : ':'; SmpteFormatter ft(fps, sep); // Write lines int i = 0; TextFileWriter file(filename, "UTF-8"); for (LineList::const_iterator cur = copy.Line.begin(); cur != copy.Line.end(); ++cur) { if (AssDialogue *current = dynamic_cast<AssDialogue*>(*cur)) { ++i; file.WriteLineToFile(wxString::Format("%i %s %s %s", i, ft.ToSMPTE(current->Start), ft.ToSMPTE(current->End), current->Text)); } } }
void TTXTSubtitleFormat::ConvertToTTXT(AssFile &file) const { file.Sort(); StripComments(file); RecombineOverlaps(file); MergeIdentical(file); StripTags(file); ConvertNewlines(file, "\r\n"); // Find last line agi::Time lastTime; if (!file.Events.empty()) lastTime = file.Events.back().End; // Insert blank line at the end auto diag = new AssDialogue; diag->Start = lastTime; diag->End = lastTime+OPT_GET("Timing/Default Duration")->GetInt(); file.Events.push_back(*diag); }
void TTXTSubtitleFormat::ConvertToTTXT(AssFile &file) const { file.Sort(); StripComments(file); RecombineOverlaps(file); MergeIdentical(file); StripTags(file); ConvertNewlines(file, "\r\n"); // Find last line AssTime lastTime; for (auto line : file.Line | boost::adaptors::reversed | agi::of_type<AssDialogue>()) { lastTime = line->End; break; } // Insert blank line at the end auto diag = new AssDialogue; diag->Start = lastTime; diag->End = lastTime+OPT_GET("Timing/Default Duration")->GetInt(); file.Line.push_back(*diag); }
void EncoreSubtitleFormat::WriteFile(const AssFile *src, agi::fs::path const& filename, agi::vfr::Framerate const& video_fps, std::string const&) const { agi::vfr::Framerate fps = AskForFPS(false, true, video_fps); if (!fps.IsLoaded()) return; // Convert to encore AssFile copy(*src); copy.Sort(); StripComments(copy); RecombineOverlaps(copy); MergeIdentical(copy); StripTags(copy); ConvertNewlines(copy, "\r\n"); // Encore wants ; for NTSC and : for PAL // The manual suggests no other frame rates are supported SmpteFormatter ft(fps, fps.NeedsDropFrames() ? ";" : ":"); // Write lines int i = 0; TextFileWriter file(filename, "UTF-8"); for (auto const& current : copy.Events) file.WriteLineToFile(str(boost::format("%i %s %s %s") % ++i % ft.ToSMPTE(current.Start) % ft.ToSMPTE(current.End) % current.Text)); }
void TTXTSubtitleFormat::ConvertToTTXT(AssFile &file) const { file.Sort(); StripComments(file.Line); RecombineOverlaps(file.Line); MergeIdentical(file.Line); StripTags(file.Line); ConvertNewlines(file.Line, "\r\n"); // Find last line AssTime lastTime; for (LineList::reverse_iterator cur = file.Line.rbegin(); cur != file.Line.rend(); ++cur) { if (AssDialogue *prev = dynamic_cast<AssDialogue*>(*cur)) { lastTime = prev->End; break; } } // Insert blank line at the end AssDialogue *diag = new AssDialogue; diag->Start = lastTime; diag->End = lastTime+OPT_GET("Timing/Default Duration")->GetInt(); file.Line.push_back(diag); }