void FrameMain::LoadSubtitles(wxString const& filename, wxString const& charset) { if (context->ass->loaded) { if (TryToCloseSubs() == wxCANCEL) return; } try { // Make sure that file isn't actually a timecode file try { TextFileReader testSubs(filename, charset); wxString cur = testSubs.ReadLineFromFile(); if (cur.Left(10) == "# timecode") { context->videoController->LoadTimecodes(filename); return; } } catch (...) { // if trying to load the file as timecodes fails it's fairly // safe to assume that it is in fact not a timecode file } context->ass->Load(filename, charset); wxFileName file(filename); StandardPaths::SetPathValue("?script", file.GetPath()); config::mru->Add("Subtitle", STD_STR(filename)); OPT_SET("Path/Last/Subtitles")->SetString(STD_STR(file.GetPath())); // Save backup of file if (context->ass->CanSave() && OPT_GET("App/Auto/Backup")->GetBool()) { if (file.FileExists()) { wxString path = lagi_wxString(OPT_GET("Path/Auto/Backup")->GetString()); if (path.empty()) path = file.GetPath(); wxFileName dstpath(StandardPaths::DecodePath(path + "/")); if (!dstpath.DirExists()) wxMkdir(dstpath.GetPath()); dstpath.SetFullName(file.GetName() + ".ORIGINAL." + file.GetExt()); wxCopyFile(file.GetFullPath(), dstpath.GetFullPath(), true); } } } catch (agi::FileNotFoundError const&) { wxMessageBox(filename + " not found.", "Error", wxOK | wxICON_ERROR | wxCENTER, this); config::mru->Remove("Subtitle", STD_STR(filename)); return; } catch (agi::Exception const& err) { wxMessageBox(lagi_wxString(err.GetChainedMessage()), "Error", wxOK | wxICON_ERROR | wxCENTER, this); } catch (...) { wxMessageBox("Unknown error", "Error", wxOK | wxICON_ERROR | wxCENTER, this); return; } }
void run () override { testTrivial (); testSimple (); testOneSub (); testSubs (); testSubsShort (); testFailureObject (); testFailureArray (); testKeyFailure (); }
void SubsController::Load(agi::fs::path const& filename, std::string charset) { try { if (charset.empty()) charset = CharSetDetect::GetEncoding(filename); } catch (agi::UserCancelException const&) { return; } // Make sure that file isn't actually a timecode file if (charset != "binary") { try { TextFileReader testSubs(filename, charset); std::string cur = testSubs.ReadLineFromFile(); if (boost::starts_with(cur, "# timecode")) { context->videoController->LoadTimecodes(filename); return; } } catch (...) { // if trying to load the file as timecodes fails it's fairly // safe to assume that it is in fact not a timecode file } } const SubtitleFormat *reader = SubtitleFormat::GetReader(filename); try { AssFile temp; reader->ReadFile(&temp, filename, charset); bool found_style = false; bool found_dialogue = false; // Check if the file has at least one style and at least one dialogue line for (auto const& line : temp.Line) { AssEntryGroup type = line.Group(); if (type == AssEntryGroup::STYLE) found_style = true; if (type == AssEntryGroup::DIALOGUE) found_dialogue = true; if (found_style && found_dialogue) break; } // And if it doesn't add defaults for each if (!found_style) temp.InsertLine(new AssStyle); if (!found_dialogue) temp.InsertLine(new AssDialogue); context->ass->swap(temp); } catch (agi::UserCancelException const&) { return; } catch (agi::fs::FileNotFound const&) { wxMessageBox(filename.wstring() + " not found.", "Error", wxOK | wxICON_ERROR | wxCENTER, context->parent); config::mru->Remove("Subtitle", filename); return; } catch (agi::Exception const& err) { wxMessageBox(to_wx(err.GetChainedMessage()), "Error", wxOK | wxICON_ERROR | wxCENTER, context->parent); return; } catch (std::exception const& err) { wxMessageBox(to_wx(err.what()), "Error", wxOK | wxICON_ERROR | wxCENTER, context->parent); return; } catch (...) { wxMessageBox("Unknown error", "Error", wxOK | wxICON_ERROR | wxCENTER, context->parent); return; } SetFileName(filename); // Push the initial state of the file onto the undo stack undo_stack.clear(); redo_stack.clear(); autosaved_commit_id = saved_commit_id = commit_id + 1; context->ass->Commit("", AssFile::COMMIT_NEW); // Save backup of file if (CanSave() && OPT_GET("App/Auto/Backup")->GetBool()) { auto path_str = OPT_GET("Path/Auto/Backup")->GetString(); agi::fs::path path; if (path_str.empty()) path = filename.parent_path(); else path = config::path->Decode(path_str); agi::fs::CreateDirectory(path); agi::fs::Copy(filename, path/(filename.stem().string() + ".ORIGINAL" + filename.extension().string())); } FileOpen(filename); }