#include "subtitleparser.h" #include #include #include #include Subtitle::Subtitle(const QString &text, quint64 start, quint64 stop) { m_text = text; m_start = start; m_stop = stop; m_offset = 0; } void Subtitle::offsetTime(qint64 time) { if (time < 0 && static_cast(m_start) < -time) m_offset = -m_start; else m_offset = time; } bool Subtitle::isContainedIn(quint64 time) const { return time >= (m_start + m_offset) && time <= (m_stop + m_offset); } QString Subtitle::text() const { return m_text; } bool Subtitle::isAfter(quint64 time) const { return (m_stop + m_offset) > time; } QString Subtitle::formatTime(quint64 time) const { quint64 hours = time / (1000 * 60 * 60); quint64 leftover = time % (1000 * 60 * 60); quint64 minutes = leftover / (1000 * 60); leftover = leftover % (1000 * 60); quint64 seconds = leftover / 1000; quint64 milliseconds = leftover % 1000; QChar zero = QLatin1Char('0'); return QString("%1:%2:%3,%4"). arg(hours, 2, 10, zero). arg(minutes, 2, 10, zero). arg(seconds, 2, 10, zero). arg(QString(QString::number(milliseconds) + QLatin1String("00")).left(3)); } QString Subtitle::toString() const { return QString("%1 --> %2\n%3\n").arg(formatTime(m_start + m_offset)).arg(formatTime(m_stop + m_offset)).arg(m_text); } SubtitleParser::SubtitleParser(QIODevice *toRead, const QString &fileName) { m_fileName = fileName; QTextStream reader(toRead); QString nextLine; while (!(nextLine = reader.readLine()).isNull()) { QString timeStamp = reader.readLine(); QString text; bool notFirst = false; while (!(nextLine = reader.readLine()).isEmpty()) { if (notFirst) { text.append("\n"); } notFirst = true; text.append(nextLine); } QStringList times = timeStamp.split(" --> "); if (times.length() != 2) break; m_subtitles.append(Subtitle(text, parseTime(times[0]), parseTime(times[1]))); } m_searchPosition = m_subtitles.constBegin(); } quint64 SubtitleParser::parseTime(const QString &time) { QStringList split = time.split(':'); if (split.length() != 3) return 0; QStringList secs = split[2].split(','); if (secs.length() != 2) return 0; return split[0].toULongLong() * 60 * 60 * 1000 + split[1].toULongLong() * 60 * 1000 + secs[0].toULongLong() * 1000 + secs[1].toULongLong(); } QString SubtitleParser::fileName() const { return m_fileName; } QString SubtitleParser::subtitleAtTime(quint64 time) { QLinkedList::const_iterator i; bool forward = true; for (i = m_searchPosition; i != m_subtitles.constEnd(); ) { if (i->isContainedIn(time)) { m_searchPosition = i; return i->text(); } if (i->isAfter(time)) { if (i == m_subtitles.constBegin()) break; --i; forward = false; } else { if (!forward) break; ++i; } } return QString(' '); } void SubtitleParser::offsetTime(qint64 time) { for (QLinkedList::iterator i = m_subtitles.begin(); i != m_subtitles.end(); ++i) i->offsetTime(time); } void SubtitleParser::writeOut(QIODevice *toWrite) { QTextStream writer(toWrite); int number = 0; for (QLinkedList::const_iterator i = m_subtitles.constBegin(); i != m_subtitles.constEnd(); i++) { writer << ++number << QChar('\n') << i->toString(); if (i + 1 != m_subtitles.constEnd()) writer << QChar('\n'); } }