Use plain git hash for VERSION when there is no exact tag.
[dcpomatic.git] / src / lib / dcp_content_type.cc
index 1c96979e4cb77470a5bc84a63b1a6609a06f4471..bc9bf0d6775d47939c365a66d9040e94a557a2a2 100644 (file)
@@ -1,19 +1,20 @@
 /*
-    Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net>
 
-    This program is free software; you can redistribute it and/or modify
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2 of the License, or
     (at your option) any later version.
 
-    This program is distributed in the hope that it will be useful,
+    DCP-o-matic is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
 
 */
 
  *  @brief A description of the type of content for a DCP (e.g. feature, trailer etc.)
  */
 
-#include <cassert>
 #include "dcp_content_type.h"
+#include "dcpomatic_assert.h"
+
+#include "i18n.h"
+
 
+using boost::optional;
 using namespace std;
 
-vector<DCPContentType const *> DCPContentType::_dcp_content_types;
 
-DCPContentType::DCPContentType (string p, libdcp::ContentKind k, string d)
+vector<DCPContentType> DCPContentType::_dcp_content_types;
+
+
+DCPContentType::DCPContentType (string p, dcp::ContentKind k, string d)
        : _pretty_name (p)
        , _libdcp_kind (k)
-       , _dci_name (d)
+       , _isdcf_name (d)
 {
 
 }
 
+
 void
 DCPContentType::setup_dcp_content_types ()
 {
-       _dcp_content_types.push_back (new DCPContentType ("Feature", libdcp::FEATURE, "FTR"));
-       _dcp_content_types.push_back (new DCPContentType ("Short", libdcp::SHORT, "SHR"));
-       _dcp_content_types.push_back (new DCPContentType ("Trailer", libdcp::TRAILER, "TLR"));
-       _dcp_content_types.push_back (new DCPContentType ("Test", libdcp::TEST, "TST"));
-       _dcp_content_types.push_back (new DCPContentType ("Transitional", libdcp::TRANSITIONAL, "XSN"));
-       _dcp_content_types.push_back (new DCPContentType ("Rating", libdcp::RATING, "RTG"));
-       _dcp_content_types.push_back (new DCPContentType ("Teaser", libdcp::TEASER, "TSR"));
-       _dcp_content_types.push_back (new DCPContentType ("Policy", libdcp::POLICY, "POL"));
-       _dcp_content_types.push_back (new DCPContentType ("Public Service Announcement", libdcp::PUBLIC_SERVICE_ANNOUNCEMENT, "PSA"));
-       _dcp_content_types.push_back (new DCPContentType ("Advertisement", libdcp::ADVERTISEMENT, "ADV"));
+       /// TRANSLATORS: these are the types that a DCP can have, explained in some
+       /// more detail here: https://registry-page.isdcf.com/contenttypes/
+       _dcp_content_types = {
+               DCPContentType(_("Feature"), dcp::ContentKind::FEATURE, N_("FTR")),
+               DCPContentType(_("Short"), dcp::ContentKind::SHORT, N_("SHR")),
+               DCPContentType(_("Trailer"), dcp::ContentKind::TRAILER, N_("TLR")),
+               DCPContentType(_("Test"), dcp::ContentKind::TEST, N_("TST")),
+               DCPContentType(_("Transitional"), dcp::ContentKind::TRANSITIONAL, N_("XSN")),
+               DCPContentType(_("Rating"), dcp::ContentKind::RATING, N_("RTG")),
+               DCPContentType(_("Teaser"), dcp::ContentKind::TEASER, N_("TSR")),
+               DCPContentType(_("Policy"), dcp::ContentKind::POLICY, N_("POL")),
+               DCPContentType(_("Public Service Announcement"), dcp::ContentKind::PUBLIC_SERVICE_ANNOUNCEMENT, N_("PSA")),
+               DCPContentType(_("Advertisement"), dcp::ContentKind::ADVERTISEMENT, N_("ADV")),
+               DCPContentType(_("Clip"), dcp::ContentKind::CLIP, N_("CLP")),
+               DCPContentType(_("Promo"), dcp::ContentKind::PROMO, N_("PRO")),
+               DCPContentType(_("Stereo card"), dcp::ContentKind::STEREOCARD, N_("STR")),
+               DCPContentType(_("Episode"), dcp::ContentKind::EPISODE, N_("EPS")),
+               DCPContentType(_("Highlights"), dcp::ContentKind::HIGHLIGHTS, N_("HLT")),
+               DCPContentType(_("Event"), dcp::ContentKind::EVENT, N_("EVT")),
+       };
 }
 
+
 DCPContentType const *
-DCPContentType::from_pretty_name (string n)
+DCPContentType::from_isdcf_name (string n)
 {
-       for (vector<DCPContentType const *>::const_iterator i = _dcp_content_types.begin(); i != _dcp_content_types.end(); ++i) {
-               if ((*i)->pretty_name() == n) {
-                       return *i;
+       for (auto& i: _dcp_content_types) {
+               if (i.isdcf_name() == n) {
+                       return &i;
                }
        }
 
-       return 0;
+       return nullptr;
 }
 
+
 DCPContentType const *
-DCPContentType::from_dci_name (string n)
+DCPContentType::from_libdcp_kind (dcp::ContentKind kind)
 {
-       for (vector<DCPContentType const *>::const_iterator i = _dcp_content_types.begin(); i != _dcp_content_types.end(); ++i) {
-               if ((*i)->dci_name() == n) {
-                       return *i;
+       for (auto& i: _dcp_content_types) {
+               if (i.libdcp_kind() == kind) {
+                       return &i;
                }
        }
 
-       return 0;
+       DCPOMATIC_ASSERT (false);
+       return nullptr;
 }
 
+
 DCPContentType const *
 DCPContentType::from_index (int n)
 {
-       assert (n >= 0 && n < int (_dcp_content_types.size ()));
-       return _dcp_content_types[n];
+       DCPOMATIC_ASSERT (n >= 0 && n < int(_dcp_content_types.size()));
+       return &_dcp_content_types[n];
 }
 
-int
+
+optional<int>
 DCPContentType::as_index (DCPContentType const * c)
 {
-       vector<DCPContentType*>::size_type i = 0;
-       while (i < _dcp_content_types.size() && _dcp_content_types[i] != c) {
+       vector<DCPContentType>::size_type i = 0;
+       while (i < _dcp_content_types.size() && &_dcp_content_types[i] != c) {
                ++i;
        }
 
-       if (i == _dcp_content_types.size ()) {
-               return -1;
+       if (i == _dcp_content_types.size()) {
+               return {};
        }
 
        return i;
 }
 
+
 vector<DCPContentType const *>
 DCPContentType::all ()
 {
-       return _dcp_content_types;
+       vector<DCPContentType const *> raw;
+       for (auto& type: _dcp_content_types) {
+               raw.push_back (&type);
+       }
+       return raw;
 }