From b5b20f829ed95febe7aba55ebe3679c998b35b5e Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 19 Feb 2014 10:47:11 +0000 Subject: [PATCH] Add some basic JSON stuff. --- ChangeLog | 4 +++ src/lib/analyse_audio_job.cc | 6 ++++ src/lib/analyse_audio_job.h | 1 + src/lib/examine_content_job.cc | 6 ++++ src/lib/examine_content_job.h | 1 + src/lib/job.cc | 25 +++++++++++++++- src/lib/job.h | 2 ++ src/lib/scp_dcp_job.cc | 7 ++++- src/lib/scp_dcp_job.h | 1 + src/lib/send_kdm_email_job.cc | 6 ++++ src/lib/send_kdm_email_job.h | 1 + src/lib/transcode_job.cc | 6 ++++ src/lib/transcode_job.h | 1 + src/lib/util.cc | 54 ++++++++++++++++++++++++++++++++++ src/lib/util.h | 2 ++ src/lib/wscript | 1 + src/tools/dcpomatic_cli.cc | 25 +++++++++++++++- test/job_test.cc | 4 +++ 18 files changed, 150 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6e645b484..9f05f852f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2014-02-19 Carl Hetherington + + * Add some basic JSON stuff. + 2014-02-18 Carl Hetherington * Version 1.64.14 released. diff --git a/src/lib/analyse_audio_job.cc b/src/lib/analyse_audio_job.cc index 8186f9de4..bfe0ed61f 100644 --- a/src/lib/analyse_audio_job.cc +++ b/src/lib/analyse_audio_job.cc @@ -48,6 +48,12 @@ AnalyseAudioJob::name () const return _("Analyse audio"); } +string +AnalyseAudioJob::json_name () const +{ + return N_("analyse_audio"); +} + void AnalyseAudioJob::run () { diff --git a/src/lib/analyse_audio_job.h b/src/lib/analyse_audio_job.h index 3d4881983..3e376634c 100644 --- a/src/lib/analyse_audio_job.h +++ b/src/lib/analyse_audio_job.h @@ -30,6 +30,7 @@ public: AnalyseAudioJob (boost::shared_ptr, boost::shared_ptr); std::string name () const; + std::string json_name () const; void run (); private: diff --git a/src/lib/examine_content_job.cc b/src/lib/examine_content_job.cc index cbf180ffc..8f16e2e5c 100644 --- a/src/lib/examine_content_job.cc +++ b/src/lib/examine_content_job.cc @@ -46,6 +46,12 @@ ExamineContentJob::name () const return _("Examine content"); } +string +ExamineContentJob::json_name () const +{ + return N_("examine_content"); +} + void ExamineContentJob::run () { diff --git a/src/lib/examine_content_job.h b/src/lib/examine_content_job.h index b6903b86b..c8037224f 100644 --- a/src/lib/examine_content_job.h +++ b/src/lib/examine_content_job.h @@ -30,6 +30,7 @@ public: ~ExamineContentJob (); std::string name () const; + std::string json_name () const; void run (); private: diff --git a/src/lib/job.cc b/src/lib/job.cc index 66fa3755d..76976df32 100644 --- a/src/lib/job.cc +++ b/src/lib/job.cc @@ -239,7 +239,7 @@ Job::set_progress (float p, bool force) } } -/** @return fractional progress of this sub-job, or -1 if not known */ +/** @return fractional progress of the current sub-job, or -1 if not known */ float Job::progress () const { @@ -325,6 +325,29 @@ Job::status () const return s.str (); } +string +Job::json_status () const +{ + boost::mutex::scoped_lock lm (_state_mutex); + + switch (_state) { + case NEW: + return N_("new"); + case RUNNING: + return N_("running"); + case PAUSED: + return N_("paused"); + case FINISHED_OK: + return N_("finished_ok"); + case FINISHED_ERROR: + return N_("finished_error"); + case FINISHED_CANCELLED: + return N_("finished_cancelled"); + } + + return ""; +} + /** @return An estimate of the remaining time for this sub-job, in seconds */ int Job::remaining_time () const diff --git a/src/lib/job.h b/src/lib/job.h index 6310da32a..489464558 100644 --- a/src/lib/job.h +++ b/src/lib/job.h @@ -43,6 +43,7 @@ public: /** @return user-readable name of this job */ virtual std::string name () const = 0; + virtual std::string json_name () const = 0; /** Run this job in the current thread. */ virtual void run () = 0; @@ -64,6 +65,7 @@ public: int elapsed_time () const; virtual std::string status () const; + std::string json_status () const; std::string sub_name () const { return _sub_name; } diff --git a/src/lib/scp_dcp_job.cc b/src/lib/scp_dcp_job.cc index 22715978a..0b713b042 100644 --- a/src/lib/scp_dcp_job.cc +++ b/src/lib/scp_dcp_job.cc @@ -110,6 +110,12 @@ SCPDCPJob::name () const return _("Copy DCP to TMS"); } +string +SCPDCPJob::json_name () const +{ + return N_("scp_dcp"); +} + void SCPDCPJob::run () { @@ -223,4 +229,3 @@ SCPDCPJob::set_status (string s) boost::mutex::scoped_lock lm (_status_mutex); _status = s; } - diff --git a/src/lib/scp_dcp_job.h b/src/lib/scp_dcp_job.h index bdc83af18..e3960d73b 100644 --- a/src/lib/scp_dcp_job.h +++ b/src/lib/scp_dcp_job.h @@ -29,6 +29,7 @@ public: SCPDCPJob (boost::shared_ptr); std::string name () const; + std::string json_name () const; void run (); std::string status () const; diff --git a/src/lib/send_kdm_email_job.cc b/src/lib/send_kdm_email_job.cc index 89bce9a14..8af0b556a 100644 --- a/src/lib/send_kdm_email_job.cc +++ b/src/lib/send_kdm_email_job.cc @@ -50,6 +50,12 @@ SendKDMEmailJob::name () const return String::compose (_("Email KDMs for %1"), _film->name()); } +string +SendKDMEmailJob::json_name () const +{ + return N_("send_kdm_email"); +} + void SendKDMEmailJob::run () { diff --git a/src/lib/send_kdm_email_job.h b/src/lib/send_kdm_email_job.h index fcab56ce5..f4d154a91 100644 --- a/src/lib/send_kdm_email_job.h +++ b/src/lib/send_kdm_email_job.h @@ -34,6 +34,7 @@ public: ); std::string name () const; + std::string json_name () const; void run (); private: diff --git a/src/lib/transcode_job.cc b/src/lib/transcode_job.cc index 5c195ee1b..7b304cb35 100644 --- a/src/lib/transcode_job.cc +++ b/src/lib/transcode_job.cc @@ -50,6 +50,12 @@ TranscodeJob::name () const return String::compose (_("Transcode %1"), _film->name()); } +string +TranscodeJob::json_name () const +{ + return N_("transcode"); +} + void TranscodeJob::run () { diff --git a/src/lib/transcode_job.h b/src/lib/transcode_job.h index 9128206d2..6e3c1ead9 100644 --- a/src/lib/transcode_job.h +++ b/src/lib/transcode_job.h @@ -35,6 +35,7 @@ public: TranscodeJob (boost::shared_ptr f); std::string name () const; + std::string json_name () const; void run (); std::string status () const; diff --git a/src/lib/util.cc b/src/lib/util.cc index b2f8c4470..a86033e57 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -89,6 +89,7 @@ using std::min; using std::max; using std::list; using std::multimap; +using std::map; using std::istream; using std::numeric_limits; using std::pair; @@ -939,6 +940,52 @@ make_signer () return shared_ptr (new libdcp::Signer (chain, signer_key)); } +map +split_get_request (string url) +{ + enum { + AWAITING_QUESTION_MARK, + KEY, + VALUE + } state = AWAITING_QUESTION_MARK; + + map r; + string k; + string v; + for (size_t i = 0; i < url.length(); ++i) { + switch (state) { + case AWAITING_QUESTION_MARK: + if (url[i] == '?') { + state = KEY; + } + break; + case KEY: + if (url[i] == '=') { + v.clear (); + state = VALUE; + } else { + k += url[i]; + } + break; + case VALUE: + if (url[i] == '&') { + r.insert (make_pair (k, v)); + k.clear (); + state = KEY; + } else { + v += url[i]; + } + break; + } + } + + if (state == VALUE) { + r.insert (make_pair (k, v)); + } + + return r; +} + libdcp::Size fit_ratio_within (float ratio, libdcp::Size full_frame) { @@ -959,3 +1006,10 @@ wrapped_av_malloc (size_t s) return p; } +string +entities_to_text (string e) +{ + boost::algorithm::replace_all (e, "%3A", ":"); + boost::algorithm::replace_all (e, "%2F", "/"); + return e; +} diff --git a/src/lib/util.h b/src/lib/util.h index a229bbfc9..9bf139b82 100644 --- a/src/lib/util.h +++ b/src/lib/util.h @@ -78,6 +78,8 @@ extern boost::filesystem::path mo_path (); extern std::string tidy_for_filename (std::string); extern boost::shared_ptr make_signer (); extern libdcp::Size fit_ratio_within (float ratio, libdcp::Size); +extern std::string entities_to_text (std::string e); +extern std::map split_get_request (std::string url); struct FrameRateConversion { diff --git a/src/lib/wscript b/src/lib/wscript index 4921afaee..8702adebb 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -37,6 +37,7 @@ sources = """ job.cc job_manager.cc kdm.cc + json_server.cc log.cc player.cc playlist.cc diff --git a/src/tools/dcpomatic_cli.cc b/src/tools/dcpomatic_cli.cc index c40ea6662..a74ece149 100644 --- a/src/tools/dcpomatic_cli.cc +++ b/src/tools/dcpomatic_cli.cc @@ -33,6 +33,7 @@ #include "lib/log.h" #include "lib/ui_signaller.h" #include "lib/server_finder.h" +#include "lib/json_server.h" using std::string; using std::cerr; @@ -52,6 +53,8 @@ help (string n) << " -f, --flags show flags passed to C++ compiler on build\n" << " -n, --no-progress do not print progress to stdout\n" << " -r, --no-remote do not use any remote servers\n" + << " -j, --json run a JSON server on the specified port\n" + << " -k, --keep-going keep running even when the job is complete\n" << "\n" << " is the film directory.\n"; } @@ -63,6 +66,8 @@ main (int argc, char* argv[]) bool progress = true; bool no_remote = false; int log_level = 0; + int json_port = 0; + bool keep_going = false; int option_index = 0; while (1) { @@ -74,10 +79,12 @@ main (int argc, char* argv[]) { "no-progress", no_argument, 0, 'n'}, { "no-remote", no_argument, 0, 'r'}, { "log-level", required_argument, 0, 'l' }, + { "json", required_argument, 0, 'j' }, + { "keep-going", no_argument, 0, 'k' }, { 0, 0, 0, 0 } }; - int c = getopt_long (argc, argv, "vhdfnrl:", long_options, &option_index); + int c = getopt_long (argc, argv, "vhdfnrl:j:k", long_options, &option_index); if (c == -1) { break; @@ -105,6 +112,12 @@ main (int argc, char* argv[]) case 'l': log_level = atoi (optarg); break; + case 'j': + json_port = atoi (optarg); + break; + case 'k': + keep_going = true; + break; } } @@ -122,6 +135,10 @@ main (int argc, char* argv[]) ServerFinder::instance()->disable (); } + if (json_port) { + new JSONServer (json_port); + } + cout << "DCP-o-matic " << dcpomatic_version << " git " << dcpomatic_git_commit; char buf[256]; if (gethostname (buf, 256) == 0) { @@ -201,6 +218,12 @@ main (int argc, char* argv[]) } } + if (keep_going) { + while (1) { + dcpomatic_sleep (3600); + } + } + /* This is just to stop valgrind reporting leaks due to JobManager indirectly holding onto codecs. */ diff --git a/test/job_test.cc b/test/job_test.cc index a3ad1bb6c..4d32b1e0c 100644 --- a/test/job_test.cc +++ b/test/job_test.cc @@ -54,6 +54,10 @@ public: string name () const { return ""; } + + string json_name () const { + return ""; + } }; BOOST_AUTO_TEST_CASE (job_manager_test) -- 2.30.2