X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fswaroop_controls.cc;h=d6ab5c39daa0de4322b5c6e6b3a0bdc98299eba4;hb=196de029044f4dbac5f74f68e08a89f778c3a236;hp=a32e50a21eccd95778957733ff9b8fb5d3f7c973;hpb=86414bd87863626c0f234c2807af006e28a7c042;p=dcpomatic.git diff --git a/src/wx/swaroop_controls.cc b/src/wx/swaroop_controls.cc index a32e50a21..d6ab5c39d 100644 --- a/src/wx/swaroop_controls.cc +++ b/src/wx/swaroop_controls.cc @@ -27,6 +27,8 @@ #include "lib/player_video.h" #include "lib/dcp_content.h" #include "lib/cross.h" +#include "lib/scoped_temporary.h" +#include "lib/internet.h" #include #include #include @@ -34,6 +36,7 @@ using std::string; using std::cout; using std::exception; +using std::sort; using boost::shared_ptr; using boost::dynamic_pointer_cast; using boost::optional; @@ -46,13 +49,13 @@ SwaroopControls::SwaroopControls (wxWindow* parent, shared_ptr viewe , _next_button (new Button(this, "Next")) , _previous_button (new Button(this, "Previous")) , _current_disable_timeline (false) - , _current_disable_next_previous (false) + , _current_disable_next (false) { + _button_sizer->Add (_previous_button, 0, wxEXPAND); _button_sizer->Add (_play_button, 0, wxEXPAND); _button_sizer->Add (_pause_button, 0, wxEXPAND); _button_sizer->Add (_stop_button, 0, wxEXPAND); _button_sizer->Add (_next_button, 0, wxEXPAND); - _button_sizer->Add (_previous_button, 0, wxEXPAND); _spl_view = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_NO_HEADER); _spl_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 740); @@ -92,7 +95,7 @@ SwaroopControls::SwaroopControls (wxWindow* parent, shared_ptr viewe _current_spl_view = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_NO_HEADER); _current_spl_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 500); _current_spl_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 80); - e_sizer->Add (left_sizer, 0, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); + e_sizer->Add (left_sizer, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); e_sizer->Add (_current_spl_view, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); _v_sizer->Add (e_sizer, 1, wxEXPAND); @@ -135,6 +138,7 @@ SwaroopControls::check_restart () _selected_playlist_position = index; update_current_content (); _viewer->seek (DCPTime(time), false); + _viewer->start (); } } @@ -154,7 +158,7 @@ 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")); fclose (f); } } @@ -191,8 +195,8 @@ SwaroopControls::setup_sensitivity () _pause_button->Enable (_viewer->playing()); _slider->Enable (!_current_disable_timeline); _spl_view->Enable (!_viewer->playing()); - _next_button->Enable (!_current_disable_next_previous && can_do_next()); - _previous_button->Enable (!_current_disable_next_previous && can_do_previous()); + _next_button->Enable (!_current_disable_next && can_do_next()); + _previous_button->Enable (can_do_previous()); } void @@ -206,6 +210,10 @@ SwaroopControls::stop_clicked () { _viewer->stop (); _viewer->seek (DCPTime(), true); + if (_selected_playlist) { + _selected_playlist_position = 0; + update_current_content (); + } } bool @@ -271,6 +279,13 @@ SwaroopControls::add_playlist_to_list (SPL spl) _spl_view->InsertItem (it); } +struct SPLComparator +{ + bool operator() (SPL const & a, SPL const & b) { + return a.name() < b.name(); + } +}; + void SwaroopControls::update_playlist_directory () { @@ -290,12 +305,61 @@ SwaroopControls::update_playlist_directory () SPL spl; spl.read (i->path(), _content_view); _playlists.push_back (spl); - add_playlist_to_list (spl); } } catch (exception& e) { /* Never mind */ } } + + sort (_playlists.begin(), _playlists.end(), SPLComparator()); + BOOST_FOREACH (SPL i, _playlists) { + add_playlist_to_list (i); + } + + _selected_playlist = boost::none; +} + +optional +SwaroopControls::get_kdm_from_url (shared_ptr dcp) +{ + ScopedTemporary temp; + 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)) { + try { + kdm = dcp::EncryptedKDM (dcp::file_to_string(temp.file())); + if (kdm->cpl_id() != dcp->cpl()) { + kdm = boost::none; + } + } catch (std::exception& e) { + /* Hey well */ + } + } + return kdm; +} + +optional +SwaroopControls::get_kdm_from_directory (shared_ptr dcp) +{ + 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) { + dcp::EncryptedKDM kdm (dcp::file_to_string(i->path())); + if (kdm.cpl_id() == dcp->cpl()) { + return kdm; + } + } + } catch (std::exception& e) { + /* Hey well */ + } + } + return optional(); } void @@ -320,6 +384,31 @@ SwaroopControls::spl_selection_changed () return; } + wxProgressDialog dialog (_("DCP-o-matic"), "Loading playlist and KDMs"); + + BOOST_FOREACH (SPLEntry const & i, _playlists[selected].get()) { + dialog.Pulse (); + shared_ptr dcp = dynamic_pointer_cast (i.content); + if (dcp && dcp->needs_kdm()) { + optional kdm; + kdm = get_kdm_from_url (dcp); + if (!kdm) { + kdm = get_kdm_from_directory (dcp); + } + if (kdm) { + dcp->add_kdm (*kdm); + dcp->examine (_film, shared_ptr()); + } + if (dcp->needs_kdm()) { + /* We didn't get a KDM for this */ + 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 (); int N = 0; @@ -334,7 +423,9 @@ SwaroopControls::spl_selection_changed () _selected_playlist = selected; _selected_playlist_position = 0; + dialog.Pulse (); reset_film (); + dialog.Pulse (); update_current_content (); } @@ -371,17 +462,15 @@ SwaroopControls::update_current_content () { DCPOMATIC_ASSERT (_selected_playlist); - bool const was_playing = _viewer->stop (); + wxProgressDialog dialog (_("DCP-o-matic"), "Loading content"); SPLEntry const & e = _playlists[*_selected_playlist].get()[_selected_playlist_position]; _current_disable_timeline = e.disable_timeline; - _current_disable_next_previous = !e.skippable; + _current_disable_next = !e.skippable; setup_sensitivity (); + dialog.Pulse (); reset_film (); - if (was_playing) { - _viewer->start (); - } } void @@ -391,5 +480,15 @@ SwaroopControls::viewer_finished () return; } - next_clicked (); + bool const stop = _playlists[*_selected_playlist].get()[_selected_playlist_position].stop_after_play; + + _selected_playlist_position++; + if (_selected_playlist_position < int(_playlists[*_selected_playlist].get().size())) { + update_current_content (); + if (!stop) { + _viewer->start (); + } + } else { + ResetFilm (shared_ptr(new Film(optional()))); + } }