--  Usage:
--     Select subtitles and press Shift + X. 
-- 
--  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: 
--     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.

utils = require 'mp.utils'

---- Script Options ----
ffmpeg_path = [[ffmpeg]]
------------------------

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_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))

        if track_type == "sub" and track_selected == "yes" then
            if track_external == "yes" then
                mp.osd_message("Error: external subtitles have been selected", 2)
                return
            end

            local video_file = mp.get_property("working-directory") .. "/" .. mp.get_property("filename")

            local subtitles_ext = ".srt"
            if track_codec == "ass" then
                subtitles_ext = ".ass"
            end

            if track_lang ~= nil then
                subtitles_ext = "." .. track_lang .. subtitles_ext
            end
            
            subtitles_file = mp.get_property("working-directory") .. "/" .. mp.get_property("filename/no-ext") .. subtitles_ext

            mp.osd_message("Exporting selected subtitles")

            args = {ffmpeg_path, '-y', '-hide_banner', '-loglevel', 'error', '-i', video_file, "-map", string.format("0:%d", track_index), subtitles_file}

            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 = utils.subprocess({ args = args })
    mp.set_osd_ass(screenx, screeny, "")

    if res.status == 0 then
        mp.osd_message("Finished exporting subtitles")
        mp.commandv("sub-add", subtitles_file)
        mp.set_property("sub-visibility", "yes")
    else
        mp.osd_message("Failed to export subtitles")
    end
end

mp.add_key_binding("X", "export-selected-subtitles", export_selected_subtitles)