Lua script to export markers as mp4 chapters
authorJohannes Mueller <github@johannes-mueller.org>
Thu, 8 Sep 2016 20:34:39 +0000 (22:34 +0200)
committerRobin Gareus <robin@gareus.org>
Mon, 12 Sep 2016 10:03:16 +0000 (12:03 +0200)
Location markers, that are not xruns are exported as mp4 chapter
marks. This requires `Location::name()` to be exposed to Lua.

scripts/export_mp4chaps.lua [new file with mode: 0644]

diff --git a/scripts/export_mp4chaps.lua b/scripts/export_mp4chaps.lua
new file mode 100644 (file)
index 0000000..b7ab231
--- /dev/null
@@ -0,0 +1,55 @@
+ardour {
+       ["type"] = "EditorAction",
+       name = "Export markers as mp4chaps",
+       author = "Johannes Mueller",
+       description = [[
+Exports MP4chaps of all markers except xruns. The markers are stored in the
+export directory of the session in mp4 chapter marks format. The filename
+is mp4chaps.txt
+
+Note that there's always a chapter mark "Intro" at 00:00:00.000 as some
+players can't live without it. If there are no exportable markers, the file
+is not created.
+
+This is a bit more convenient than the export option, as one does not
+have to wait for the export.
+]],
+        license = "GPLv2"
+}
+
+function factory (unused_params) return function ()
+
+        fr = Session:frame_rate()
+       chaps = {}
+
+        for l in Session:locations():list():iter() do
+                name = l:name()
+                if not l:is_mark() or string.find(name, "^xrun%d*$") then
+                       goto next end
+
+               t = l:start()
+               h = math.floor(t / (3600*fr))
+               r = t - (h*3600*fr)
+               m = math.floor(r / (60*fr))
+               r = r - m*60*fr
+               s = math.floor(r / fr)
+               r = r - s*fr
+               ms = math.floor(r*1000/fr)
+               table.insert(chaps, string.format("%02d:%02d:%02d.%03d %s\n", h, m, s, ms, name))
+               ::next::
+        end
+
+       if next(chaps) == nil then
+               goto out end
+
+       table.insert(chaps, "00:00:00.000 Intro\n")
+       table.sort(chaps)
+
+       file = io.open(string.format("%s/export/mp4chaps.txt", Session:path()), "w")
+       for i, line in ipairs(chaps) do
+               file:write(line)
+       end
+        file:close()
+
+       ::out::
+end end