Fix failure to parse subtitle files with OS X line endings.
[dcpomatic.git] / src / lib / text_subtitle.cc
index 0f5e055cfc781180069506e8c05fe0ecdf8e3e37..a3c3975e4aba8a80aed05de87c744b150a36db20 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014-2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2018 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -36,12 +36,20 @@ using std::cout;
 using std::string;
 using boost::shared_ptr;
 using boost::scoped_array;
+using boost::optional;
 using dcp::Data;
 
 TextSubtitle::TextSubtitle (shared_ptr<const TextSubtitleContent> content)
 {
        Data in (content->path (0));
 
+       /* Fix OS X line endings */
+       for (int i = 0; i < in.size(); ++i) {
+               if (in.data()[i] == '\r' && ((i == in.size() - 1) || in.data()[i + 1] != '\n')) {
+                       in.data()[i] = '\n';
+               }
+       }
+
        UErrorCode status = U_ZERO_ERROR;
        UCharsetDetector* detector = ucsdet_open (&status);
        ucsdet_setText (detector, reinterpret_cast<const char *> (in.data().get()), in.size(), &status);
@@ -85,6 +93,17 @@ TextSubtitle::TextSubtitle (shared_ptr<const TextSubtitleContent> content)
        delete reader;
 }
 
+/** @return time of first subtitle, if there is one */
+optional<ContentTime>
+TextSubtitle::first () const
+{
+       if (_subtitles.empty()) {
+               return optional<ContentTime>();
+       }
+
+       return ContentTime::from_seconds(_subtitles[0].from.all_as_seconds());
+}
+
 ContentTime
 TextSubtitle::length () const
 {