X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fswaroop_controls.cc;h=d8019a41e7b840b4dc82a4bbee143ba167f59b48;hb=3044ef060894c62e8a1cef15ad14078001093982;hp=36aac7cff222e323c6bf1ea433fda2ec1960973c;hpb=99c721f617e034ff722858d0982204bacec786d8;p=dcpomatic.git diff --git a/src/wx/swaroop_controls.cc b/src/wx/swaroop_controls.cc index 36aac7cff..d8019a41e 100644 --- a/src/wx/swaroop_controls.cc +++ b/src/wx/swaroop_controls.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2018 Carl Hetherington + Copyright (C) 2018-2019 Carl Hetherington This file is part of DCP-o-matic. @@ -29,7 +29,9 @@ #include "lib/cross.h" #include "lib/scoped_temporary.h" #include "lib/internet.h" +#include "lib/ffmpeg_content.h" #include +#include #include #include @@ -40,6 +42,7 @@ using std::sort; using boost::shared_ptr; using boost::dynamic_pointer_cast; using boost::optional; +using namespace dcpomatic; SwaroopControls::SwaroopControls (wxWindow* parent, shared_ptr viewer) : Controls (parent, viewer, false) @@ -117,13 +120,17 @@ SwaroopControls::SwaroopControls (wxWindow* parent, shared_ptr viewe _content_view->update (); update_playlist_directory (); + + _viewer->set_background_image (true); } void SwaroopControls::check_restart () { + cout << "check_restart called\n"; FILE* f = fopen_boost (Config::path("position"), "r"); if (!f) { + cout << "could not open position file (" << errno << ")\n"; return; } @@ -132,10 +139,12 @@ SwaroopControls::check_restart () int64_t time; fscanf (f, "%63s %d %ld", id, &index, &time); + cout << "Looking for playlist " << id << " to restart.\n"; + for (size_t i = 0; i < _playlists.size(); ++i) { if (_playlists[i].id() == id) { - _selected_playlist = i; - _selected_playlist_position = index; + cout << "Found playlist " << id << "\n"; + select_playlist (i, index); update_current_content (); _viewer->seek (DCPTime(time), false); _viewer->start (); @@ -158,7 +167,11 @@ SwaroopControls::viewer_position_changed () + " " + dcp::raw_convert(_selected_playlist_position) + " " + dcp::raw_convert(_viewer->position().get()); - fwrite (p.c_str(), p.length(), 1, f); + checked_fwrite (p.c_str(), p.length(), f, Config::path("position")); +#ifdef DCPOMATIC_LINUX + fflush (f); + fsync (fileno(f)); +#endif fclose (f); } } @@ -169,6 +182,7 @@ SwaroopControls::started () Controls::started (); _play_button->Enable (false); _pause_button->Enable (true); + _viewer->set_background_image (false); } void @@ -214,6 +228,7 @@ SwaroopControls::stop_clicked () _selected_playlist_position = 0; update_current_content (); } + _viewer->set_background_image (true); } bool @@ -261,6 +276,15 @@ SwaroopControls::log (wxString s) strftime (buffer, 64, "%c", t); wxString ts = std_to_wx(string(buffer)) + N_(": "); _log->SetValue(_log->GetValue() + ts + s + "\n"); + + optional log = Config::instance()->player_activity_log_file(); + if (!log) { + return; + } + + FILE* f = fopen_boost (*log, "a"); + fprintf (f, "%s%s\n", wx_to_std(ts).c_str(), wx_to_std(s).c_str()); + fclose (f); } void @@ -326,7 +350,7 @@ SwaroopControls::get_kdm_from_url (shared_ptr dcp) string url = Config::instance()->kdm_server_url(); boost::algorithm::replace_all (url, "{CPL}", *dcp->cpl()); optional kdm; - if (dcp->cpl() && !get_from_url(url, false, temp)) { + if (dcp->cpl() && !get_from_url(url, false, false, temp)) { try { kdm = dcp::EncryptedKDM (dcp::file_to_string(temp.file())); if (kdm->cpl_id() != dcp->cpl()) { @@ -362,6 +386,28 @@ SwaroopControls::get_kdm_from_directory (shared_ptr dcp) return optional(); } +optional +SwaroopControls::get_kdm_from_directory (shared_ptr ffmpeg) +{ + using namespace boost::filesystem; + optional kdm_dir = Config::instance()->player_kdm_directory(); + if (!kdm_dir) { + return optional(); + } + for (directory_iterator i = directory_iterator(*kdm_dir); i != directory_iterator(); ++i) { + try { + if (file_size(i->path()) < MAX_KDM_SIZE) { + EncryptedECinemaKDM kdm (dcp::file_to_string(i->path())); + if (kdm.id() == ffmpeg->id().get_value_or("")) { + return kdm; + } + } + } catch (std::exception& e) { + /* Hey well */ + } + } + return optional(); +} void SwaroopControls::spl_selection_changed () { @@ -384,6 +430,14 @@ SwaroopControls::spl_selection_changed () return; } + select_playlist (selected, 0); +} + +void +SwaroopControls::select_playlist (int selected, int position) +{ + log (wxString::Format("load-playlist %s", std_to_wx(_playlists[selected].name()).data())); + wxProgressDialog dialog (_("DCP-o-matic"), "Loading playlist and KDMs"); BOOST_FOREACH (SPLEntry const & i, _playlists[selected].get()) { @@ -396,8 +450,12 @@ SwaroopControls::spl_selection_changed () kdm = get_kdm_from_directory (dcp); } if (kdm) { - dcp->add_kdm (*kdm); - dcp->examine (_film, shared_ptr()); + try { + dcp->add_kdm (*kdm); + dcp->examine (_film, shared_ptr()); + } catch (KDMError& e) { + error_dialog (this, "Could not load KDM."); + } } if (dcp->needs_kdm()) { /* We didn't get a KDM for this */ @@ -407,6 +465,23 @@ SwaroopControls::spl_selection_changed () return; } } + shared_ptr ffmpeg = dynamic_pointer_cast (i.content); + if (ffmpeg && ffmpeg->encrypted()) { + optional kdm = get_kdm_from_directory (ffmpeg); + if (kdm) { + try { + ffmpeg->add_kdm (*kdm); + ffmpeg->examine (_film, shared_ptr()); + } catch (KDMError& e) { + error_dialog (this, "Could not load KDM."); + } + } else { + error_dialog (this, "This playlist cannot be loaded as a KDM is missing."); + _selected_playlist = boost::none; + _spl_view->SetItemState (selected, 0, wxLIST_STATE_SELECTED); + return; + } + } } _current_spl_view->DeleteAllItems (); @@ -422,7 +497,7 @@ SwaroopControls::spl_selection_changed () } _selected_playlist = selected; - _selected_playlist_position = 0; + _selected_playlist_position = position; dialog.Pulse (); reset_film (); dialog.Pulse (); @@ -489,6 +564,8 @@ SwaroopControls::viewer_finished () _viewer->start (); } } else { + _selected_playlist_position = 0; + _viewer->set_background_image (true); ResetFilm (shared_ptr(new Film(optional()))); } }