X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Fwx%2Fswaroop_controls.cc;h=99b1fd0647531ae89c570f9e62c9338b354b2cf9;hp=8cd3b1d5bab913429e687f6d567ec10d5a920ba1;hb=63c1bbc1ba177600523b2257223070cc2dbde7b7;hpb=6a1837228d90b49bba78c8822b989463fb4dfb0d diff --git a/src/wx/swaroop_controls.cc b/src/wx/swaroop_controls.cc index 8cd3b1d5b..99b1fd064 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,6 +29,8 @@ #include "lib/cross.h" #include "lib/scoped_temporary.h" #include "lib/internet.h" +#include "lib/ffmpeg_content.h" +#include "lib/compose.hpp" #include #include #include @@ -41,6 +43,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) @@ -167,6 +170,7 @@ SwaroopControls::viewer_position_changed () checked_fwrite (p.c_str(), p.length(), f, Config::path("position")); #ifdef DCPOMATIC_LINUX + fflush (f); fsync (fileno(f)); #endif fclose (f); @@ -190,6 +194,18 @@ SwaroopControls::stopped () _pause_button->Enable (false); } +void +SwaroopControls::decrement_allowed_shows () +{ + if (_selected_playlist) { + SPL& spl = _playlists[*_selected_playlist]; + spl.decrement_allowed_shows(); + if (spl.path()) { + spl.write (*spl.path()); + } + } +} + void SwaroopControls::play_clicked () { @@ -226,6 +242,7 @@ SwaroopControls::stop_clicked () update_current_content (); } _viewer->set_background_image (true); + decrement_allowed_shows (); } bool @@ -274,7 +291,7 @@ SwaroopControls::log (wxString s) wxString ts = std_to_wx(string(buffer)) + N_(": "); _log->SetValue(_log->GetValue() + ts + s + "\n"); - optional log = Config::instance()->player_log_file(); + optional log = Config::instance()->player_activity_log_file(); if (!log) { return; } @@ -347,7 +364,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()) { @@ -383,6 +400,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 () { @@ -405,6 +444,11 @@ SwaroopControls::spl_selection_changed () return; } + if (!_playlists[selected].have_allowed_shows()) { + error_dialog (this, "There are no more allowed shows of this playlist."); + return; + } + select_playlist (selected, 0); } @@ -440,6 +484,23 @@ SwaroopControls::select_playlist (int selected, int position) 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 (); @@ -525,5 +586,8 @@ SwaroopControls::viewer_finished () _selected_playlist_position = 0; _viewer->set_background_image (true); ResetFilm (shared_ptr(new Film(optional()))); + stopped (); } + + decrement_allowed_shows (); }