|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
#!/usr/bin/env lua5.1
-- This file:
-- http://anggtwu.net/LUA/Subtitles3.lua.html
-- http://anggtwu.net/LUA/Subtitles3.lua
-- (find-angg "LUA/Subtitles3.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e () (interactive) (find-angg "LUA/Subtitles3.lua"))
-- See: (find-angg ".emacs.templates" "find-subtitles3-links")
--
-- (find-anggfile "LUA/lua50init.lua" "cruft-jan2024.lua")
-- (find-blogme3 "cruft-jan2024.lua")
Path.addLUAtopath()
require "GetOpt1" -- (find-angg "LUA/GetOpt1.lua")
json = require "json"
JsonSubs = Class {
type = "JsonSubs",
__index = {
segtext_ = function (seg) return seg.utf8 end,
segtext = function (j,seg) return seg.utf8 end,
segstext = function (j,segs) return mapconcat(j.segtext_, segs) end,
evtext = function (j,ev) return j:segstext(ev.segs) end,
splittime = function (j,ms)
local n = ms
local chop = function (a) local b=math.fmod(n,a); n=(n-b)/a; return b end
local ms,secs,mins,hours = chop(1000),chop(60),chop(60),n
return hours,mins,secs,ms
end,
mmss = function (j,ms)
local hours,mins,secs,ms = j:splittime(ms)
if hours ~= 0 then return format("%d:%02d:%02d", hours,mins,secs) end
return format("%02d:%02d", mins,secs)
end,
evmmss = function (j,ev)
return j:mmss(ev.tStartMs)
end,
evtimetext = function (j,ev)
local time = ev.tStartMs and j:evmmss(ev)
local text = ev.segs and j:evtext(ev)
return time,text
end,
alltimetexts = function (j,events)
local timetexts = VTable {}
for i,ev in ipairs(events) do
local time,text = j:evtimetext(ev)
if time and text and text:match("%S") then
table.insert(timetexts, HTable {time, text})
end
end
return timetexts
end,
findtimetext = function (j,c,time,text)
local q = function (s) return (s:gsub('["\\]', '\\%1')) end
local fmt = '%% (find-%svideo "%s" "%s")'
return format(fmt, c, time, q(text))
end,
finds = function (j,events,c)
local f = function (pair) return j:findtimetext(c, pair[1], pair[2]) end
local timetexts = j:alltimetexts(events)
return mapconcat(f, timetexts, "\n")
end,
},
}
-- (find-angg "LUA/GetOpt1.lua" "GetOpt-tests")
mygetopt = GetOpt {
["-c"] = function (g,c_)
c = c_
g:rest(2)
end,
["-json3"] = function (g,fname)
bigstr = ee_readfile(fname)
o = json.decode.decode(bigstr)
g:rest(2)
end,
["-print"] = function (g)
jss = JsonSubs {}
print(jss:finds(o.events, c))
g:rest(1)
end,
}
mygetopt:run(...)
--[[
* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
~/LUA/Subtitles3.lua -c 2024algpergs -json3 /tmp/subs/subs.json3 -print
--]]
--[==[
* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
rm -Rv /tmp/subs/
mkdir /tmp/subs/
cd /tmp/subs/
URL="https://youtu.be/vBkxGIrv2Q0"
yt-dlp --write-auto-sub --skip-download --sub-format=json3 --sub-lang=pt $URL
cp -v *.pt.json3 subs.json3
--]==]
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Subtitles3.lua"
bigstr = ee_readfile "/tmp/subs/subs.json3"
jss = JsonSubs {}
o = json.decode.decode(bigstr)
= jss:finds(o.events, "2024lean4of0")
PPPV(o.events[1])
PPPV(o.events[2])
PPPV(o.events[2].segs)
PPPV(o.events[2].segs[1])
= jss:segtext (o.events[2].segs[1])
= jss:segstext(o.events[2].segs)
= jss:evtext (o.events[2])
= jss:splittime(3600*1000)
= jss:mmss (3600*1000)
= jss:mmss ( 4*1000)
PPPV(o.events[2])
= jss:evmmss (o.events[2])
= jss:evtimetext(o.events[1])
= jss:evtimetext(o.events[2])
= jss:evtimetext(o.events[3])
= jss:evtimetext(o.events[4])
= jss:evtimetext(o.events[5])
= #o.events
PPPV(o.events[1])
PPPV(o.events[2])
PPPV(o.events[3])
PPPV(o.events[4])
PPPV(o.events[5])
% (find-cae0video "00:00" "Oi! O meu nome é Eduardo Ochs. Eu sou")
= jss:alltimetexts(o.events)
= o.events[2].tStartMs
PPPV(o.events[3])
PPPV(o.events[4])
= jss:evtext(o.events[2])
= o.events[2].tStartMs
--]==]
-- Local Variables:
-- coding: utf-8-unix
-- End: