148 lines
5.5 KiB
Lua
148 lines
5.5 KiB
Lua
-- SOURCE: https://github.com/kelciour/mpv-scripts/blob/master/sub-export.lua
|
|
-- COMMIT: 29 Aug 2018 5039d8b
|
|
--
|
|
-- Usage:
|
|
-- add bindings to input.conf:
|
|
-- key script-message-to sub_export export-selected-subtitles
|
|
--
|
|
-- Note:
|
|
-- Requires FFmpeg in PATH environment variable or edit ffmpeg_path in the script options,
|
|
-- for example, by replacing "ffmpeg" with "C:\Programs\ffmpeg\bin\ffmpeg.exe"
|
|
-- Note:
|
|
-- The script support subtitles in srt, ass, and sup formats.
|
|
-- Note:
|
|
-- A small circle at the top-right corner is a sign that export is happenning now.
|
|
-- Note:
|
|
-- The exported subtitles will be automatically selected with visibility set to true.
|
|
-- Note:
|
|
-- It could take ~1-5 minutes to export subtitles.
|
|
|
|
local msg = require 'mp.msg'
|
|
local utils = require 'mp.utils'
|
|
local options = require "mp.options"
|
|
|
|
---- Script Options ----
|
|
local o = {
|
|
ffmpeg_path = "ffmpeg",
|
|
-- eng=English, chs=Chinese
|
|
language = "eng",
|
|
}
|
|
|
|
options.read_options(o)
|
|
------------------------
|
|
|
|
local is_windows = package.config:sub(1, 1) == "\\" -- detect path separator, windows uses backslashes
|
|
|
|
local TEMP_DIR = os.getenv("TEMP") or "/tmp"
|
|
local function is_writable(path)
|
|
local file = io.open(path, "w")
|
|
if file then
|
|
file:close()
|
|
os.remove(path)
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function export_selected_subtitles()
|
|
local i = 0
|
|
local tracks_count = mp.get_property_number("track-list/count")
|
|
while i < tracks_count do
|
|
local track_type = mp.get_property(string.format("track-list/%d/type", i))
|
|
local track_index = mp.get_property_number(string.format("track-list/%d/ff-index", i))
|
|
local track_selected = mp.get_property(string.format("track-list/%d/selected", i))
|
|
local track_title = mp.get_property(string.format("track-list/%d/title", i))
|
|
local track_lang = mp.get_property(string.format("track-list/%d/lang", i))
|
|
local track_external = mp.get_property(string.format("track-list/%d/external", i))
|
|
local track_codec = mp.get_property(string.format("track-list/%d/codec", i))
|
|
local path = mp.get_property('path')
|
|
local dir, filename = utils.split_path(path)
|
|
local fname = mp.get_property("filename/no-ext")
|
|
local index = string.format("0:%d", track_index)
|
|
|
|
if track_type == "sub" and track_selected == "yes" then
|
|
if track_external == "yes" then
|
|
if o.language == 'chs' then
|
|
msg.info("错误:已选择外部字幕")
|
|
mp.osd_message("错误:已选择外部字幕", 2)
|
|
else
|
|
msg.info("Error: external subtitles have been selected")
|
|
mp.osd_message("Error: external subtitles have been selected", 2)
|
|
end
|
|
return
|
|
end
|
|
|
|
local video_file = utils.join_path(dir, filename)
|
|
|
|
local subtitles_ext = ".srt"
|
|
if string.find(track_codec, "ass") ~= nil then
|
|
subtitles_ext = ".ass"
|
|
elseif string.find(track_codec, "pgs") ~= nil then
|
|
subtitles_ext = ".sup"
|
|
end
|
|
|
|
if track_lang ~= nil then
|
|
if track_title ~= nil then
|
|
subtitles_ext = "." .. track_title .. "." .. track_lang .. subtitles_ext
|
|
else
|
|
subtitles_ext = "." .. track_lang .. subtitles_ext
|
|
end
|
|
end
|
|
|
|
subtitles_file = utils.join_path(dir, fname .. subtitles_ext)
|
|
|
|
if not is_writable(subtitles_file) then
|
|
subtitles_file = utils.join_path(TEMP_DIR, fname .. subtitles_ext)
|
|
end
|
|
|
|
if o.language == 'chs' then
|
|
msg.info("正在导出当前字幕")
|
|
mp.osd_message("正在导出当前字幕")
|
|
else
|
|
msg.info("Exporting selected subtitles")
|
|
mp.osd_message("Exporting selected subtitles")
|
|
end
|
|
|
|
cmd = string.format("%s -y -hide_banner -loglevel error -i '%s' -map '%s' -vn -an -c:s copy '%s'",
|
|
o.ffmpeg_path, video_file, index, subtitles_file)
|
|
windows_args = { 'powershell', '-NoProfile', '-Command', cmd }
|
|
unix_args = { '/bin/bash', '-c', cmd }
|
|
args = is_windows and windows_args or unix_args
|
|
|
|
mp.add_timeout(mp.get_property_number("osd-duration") * 0.001, process)
|
|
|
|
break
|
|
end
|
|
|
|
i = i + 1
|
|
end
|
|
end
|
|
|
|
function process()
|
|
local screenx, screeny, aspect = mp.get_osd_size()
|
|
|
|
mp.set_osd_ass(screenx, screeny, "{\\an9}● ")
|
|
local res = mp.command_native({ name = "subprocess", capture_stdout = true, playback_only = false, args = args })
|
|
mp.set_osd_ass(screenx, screeny, "")
|
|
if res.status == 0 then
|
|
if o.language == 'chs' then
|
|
msg.info("当前字幕已导出")
|
|
mp.osd_message("当前字幕已导出")
|
|
else
|
|
msg.info("Finished exporting subtitles")
|
|
mp.osd_message("Finished exporting subtitles")
|
|
end
|
|
mp.commandv("sub-add", subtitles_file)
|
|
mp.set_property("sub-visibility", "yes")
|
|
else
|
|
if o.language == 'chs' then
|
|
msg.info("当前字幕导出失败")
|
|
mp.osd_message("当前字幕导出失败, 查看控制台获取更多信息.")
|
|
else
|
|
msg.info("Failed to export subtitles")
|
|
mp.osd_message("Failed to export subtitles, check console for more info.")
|
|
end
|
|
end
|
|
end
|
|
|
|
mp.register_script_message("export-selected-subtitles", export_selected_subtitles) |