From 27b027a0316b5529bc8013896048e72ca3eab76a Mon Sep 17 00:00:00 2001 From: Toni Gundogdu Date: Sun, 13 Jan 2013 12:17:48 +0200 Subject: [PATCH] Add subtitle/export/subrip.lua Adds support for converting subtitle data into SubRip format. Signed-off-by: Toni Gundogdu --- share/Makefile.am | 7 +++ share/subtitle/export/subrip.lua | 100 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 share/subtitle/export/subrip.lua diff --git a/share/Makefile.am b/share/Makefile.am index c9fa052..817d156 100644 --- a/share/Makefile.am +++ b/share/Makefile.am @@ -52,6 +52,13 @@ endif # WITH_FIXME # Subtitle property scripts. +subtitleexportdir=$(pkgdatadir)/$(VERSION)/subtitle/export + +dist_subtitleexport_DATA=\ + subtitle/export/subrip.lua + +# Subtitle property scripts. + subtitledir=$(pkgdatadir)/$(VERSION)/subtitle dist_subtitle_DATA=\ diff --git a/share/subtitle/export/subrip.lua b/share/subtitle/export/subrip.lua new file mode 100644 index 0000000..2338b3a --- /dev/null +++ b/share/subtitle/export/subrip.lua @@ -0,0 +1,100 @@ +-- libquvi-scripts +-- Copyright (C) 2013 Toni Gundogdu +-- +-- This file is part of libquvi-scripts . +-- +-- This program is free software: you can redistribute it and/or +-- modify it under the terms of the GNU Affero General Public +-- License as published by the Free Software Foundation, either +-- version 3 of the License, or (at your option) any later version. +-- +-- This program 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 Affero General Public License for more details. +-- +-- You should have received a copy of the GNU Affero General +-- Public License along with this program. If not, see +-- . +-- + +--[[ +Notes + * http://en.wikipedia.org/wiki/SubRip#SubRip_text_file_format + * Uses comma (,) for a decimal separator + * Uses CRLF, with LF line terminators +]]-- + +local SubRip = {format='subrip'} -- Utility functions unique to this script + +-- Identify the script. +function ident(qargs) + return { + can_export_data = (qargs.to_format == SubRip.format), + export_format = SubRip.format + } +end + +-- Export data. +function export(qargs) + local C = require 'quvi/const' + if qargs.from_format == C.sif_tt then + return SubRip.from_tt(qargs) + else + error(string.format('unsupported subtitle format: 0x%x', + qargs.from_format)) + end +end + +-- +-- Utility functions +-- + +-- timed-text (tt) - YouTube uses this for both CCs and TTSes. +function SubRip.from_tt(qargs) + + local f = '%d\r\n%02d:%02d:%06.3f --> %02d:%02d:%06.3f\r\n%s\r\n\r\n' + local E = require 'quvi/entity' + local U = require 'quvi/util' + local L = require 'lxp.lom' + + local x = quvi.fetch(qargs.input_url) + local t = L.parse(x) + local r = {} + + local last_start = 0 + + -- + -- NOTE: Building up a large string by concatenation will create a lot + -- temporary strings burdening the Lua garbage collector. The + -- Lua way is to put the strings into a table. + -- + + for i=1, #t do + if t[i].tag == 'text' then + local start = tonumber(t[i].attr['start'] or 0) + local dur = tonumber(t[i].attr['dur'] or (start-last_start)) + local end_sec = tonumber(start) + dur + + local text = U.trim( E.convert_html(t[i][1]) ) + + local start_tc = SubRip.to_timecode(start) + local end_tc = SubRip.to_timecode(end_sec) + + local s = string.format(f, i, start_tc.hh, start_tc.mm, start_tc.ss, + end_tc.hh, end_tc.mm, end_tc.ss, text) + + -- Use comma for a decimal separator. + table.insert(r, (s:gsub('(%d+)%.(%d+)', '%1,%2'))) + last_start = start + end + end + qargs.data = table.concat(r, '') + return qargs +end + +function SubRip.to_timecode(s) + return {hh=(s/3600)%60, mm=(s/60)%60, ss=s%60} +end + +-- vim: set ts=2 sw=2 tw=72 expandtab: -- 2.11.4.GIT