Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- -- Open clipboard inserter
- -- -- Wait for unknown word and add it to anki through yomichan
- -- -- Select all the subtitle lines to add to the card.
- -- -- Ctrl + c [make sure it copies with paragraphs included, otherwise it wont work]
- -- -- Change back to MPV and Ctrl + v
- -- -- Done. The lines, their respective Audio and the current paused image
- -- will be added to the back of the card
- -- -- It's not too bad. You would need the prefix path to whatever it is on Windows. The clipboard command would need to be to changed to the windows equivalent (whatever that is). You would need ffmpeg and curl in your path. I'm not 100% that "\" works as an escape character in windows cmd in this way (maybe it does), so possibly you would need to change that. I don't see anything else though.
- -- -- djt anon: i managed to get it to copy the lines. not sure what the original clip() funtion was for tho. not sure why it doesn't update the fields or run the ffmpeg command tho lol
- local utils = require 'mp.utils'
- local msg = require 'mp.msg'
- local subs = {}
- -- User Config
- local FRONT_FIELD = "Front"
- local SENTENCE_AUDIO_FIELD = "Audio"
- local SENTENCE_FIELD = "Sentence"
- local IMAGE_FIELD = "Image"
- local prefix = os.getenv("HOMEPATH") .. '/AppData/Roaming/Anki2/Japanese/collection.media/'
- function trim(s)
- return string.gsub(s, "^%s*(.-)%s*$", "%1")
- end
- function get_name(s, e)
- return mp.get_property("filename"):gsub('%W','').. tostring(s) .. tostring(e)
- end
- function clip()
- local res = utils.subprocess({ args = {
- 'powershell', '-NoProfile', '-Command', string.format([[& {
- Trap {
- Write-Error -ErrorRecord $_
- Exit 1
- }
- Add-Type -AssemblyName PresentationCore
- [System.Windows.Clipboard]::SetText('%s')
- }]], mp.get_property("sub-text"))
- } })
- end
- function create_audio(s, e)
- if s == nil or e == nil then
- return
- end
- local t = tostring(e - s)
- local source = mp.get_property("path")
- local destination = prefix .. get_name(s, e) .. '.mp3'
- local cmd = "ffmpeg -y -i \"" .. source .. "\" -ss " .. tostring(s)
- .. " -t " .. t .. " -q:a 0 -map a \"".. destination.. "\" 2> /dev/null &"
- os.execute(cmd)
- end
- function get_clipboard()
- local command = 'powershell.exe -command "get-clipboard"'
- local handle = io.popen(command)
- local result = handle:read("*a")
- handle:close()
- return result
- end
- function set_clipboard(name, sub)
- if sub and mp.get_property_number('sub-start') then
- local sub_delay = mp.get_property_native("sub-delay")
- clip(sub)
- subs[sub] = { mp.get_property_number('sub-start') + sub_delay, mp.get_property_number('sub-end') + sub_delay }
- end
- end
- function create_screenshot(s, e)
- local img = prefix .. get_name(s,e) .. '.jpg'
- mp.commandv("raw", "no-osd", "screenshot-to-file", img)
- os.execute("mogrify -resize 640x480 -quality 85 -format jpg \"" .. img .."\"")
- end
- function get_extract()
- local lines = get_clipboard()
- local e = 0
- local s = 0
- for line in lines:gmatch("([^\n]*)\n?") do
- line = trim(line)
- if subs[line]~= nil then
- msg.info(lines)
- if subs[line][1] ~= nil and subs[line][2] ~= nil then
- msg.info(lines)
- if s == 0 then
- s = subs[line][1]
- else
- s = math.min(s, subs[line][1])
- end
- e = math.max(e, subs[line][2])
- end
- end
- end
- if e ~= 0 then
- local ifield = create_screenshot(s, e)
- local afield = create_audio(s, e)
- local tfield = string.gsub(string.gsub(lines,"\n", "<br />"), "\r", "")
- ifield = '<img src=\"'.. get_name(s,e) ..'.jpg\">'
- afield = "[sound:".. get_name(s,e) .. ".mp3]"
- add_to_last_added(ifield, afield, tfield)
- end
- end
- function get(request)
- local args = {
- "curl",
- "localhost:8765",
- "-X",
- "GET",
- "-d",
- request
- }
- local result =
- utils.subprocess(
- {
- args = args,
- cancellable = true
- }
- )
- return utils.parse_json(result.stdout)
- end
- function add_to_last_added(ifield, afield, tfield)
- local noteid = math.max(unpack(get('{"action": "findNotes", "params": {"query": "added:1"}, "version": 6}')["result"]))
- local note = get('{"action": "notesInfo", "params": {"notes": ['.. noteid.. ']}, "version": 6}')
- ifield = string.gsub(ifield, "\"", "\\\"")
- afield = string.gsub(afield, "\"", "\\\"")
- tfield = string.gsub(tfield, "\"", "\\\"")
- if note ~= nil then
- get('{"action": "updateNoteFields", "version": 6, "params": {"note": {"id": ' .. noteid.. ', "fields": {"' .. SENTENCE_AUDIO_FIELD .. '": "' .. afield .. '", "' .. SENTENCE_FIELD .. '": "' .. tfield .. '", "' .. IMAGE_FIELD .. '": "' .. ifield .. '" } } } }')
- mp.osd_message("Updated note: " .. note["result"][1]["fields"][FRONT_FIELD]["value"], 3)
- msg.info("Updated note: " .. note["result"][1]["fields"][FRONT_FIELD]["value"])
- end
- end
- function ex()
- pcall(get_extract)
- end
- mp.observe_property("sub-text", 'string', set_clipboard)
- mp.add_key_binding("ctrl+v", ex)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement