mpv2oboeru

mpv helpers to create flashcards from movies and TV shows
git clone anongit@rnpnr.xyz:mpv2oboeru.git
Log | Files | Refs | Feed | README | LICENSE

Commit: 27f0b567d61a04d54b6b0db9ad7e3aa31e3bbbe9
Parent: 332ecc052bef1e40cf3cb01ad0227ef202352449
Author: Ren Tatsumoto
Date:   Sun, 24 Oct 2021 09:38:54 +0300

move encoder

Diffstat:
Aencoder.lua | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msubs2srs.lua | 118++++++++++---------------------------------------------------------------------
2 files changed, 125 insertions(+), 103 deletions(-)

diff --git a/encoder.lua b/encoder.lua @@ -0,0 +1,110 @@ +local mp = require('mp') +local utils = require('mp.utils') +local _config, _store_fn, _os_temp_dir, _subprocess + +local pad_timings = function(padding, start_time, end_time) + local video_duration = mp.get_property_number('duration') + start_time = start_time - padding + end_time = end_time + padding + + if start_time < 0 then + start_time = 0 + end + + if end_time > video_duration then + end_time = video_duration + end + + return start_time, end_time +end + +local get_active_track = function(track_type) + local track_list = mp.get_property_native('track-list') + for _, track in pairs(track_list) do + if track.type == track_type and track.selected == true then + return track + end + end + return nil +end + +local create_snapshot = function(timestamp, filename) + local source_path = mp.get_property("path") + local output_path = utils.join_path(_os_temp_dir(), filename) + + local args = { + 'mpv', + source_path, + '--loop-file=no', + '--audio=no', + '--no-ocopy-metadata', + '--no-sub', + '--frames=1', + '--ovcopts-add=lossless=0', + '--ovcopts-add=compression_level=6', + table.concat { '--ovc=', _config.snapshot_codec }, + table.concat { '-start=', timestamp }, + table.concat { '--ovcopts-add=quality=', tostring(_config.snapshot_quality) }, + table.concat { '--vf-add=scale=', _config.snapshot_width, ':', _config.snapshot_height }, + table.concat { '-o=', output_path } + } + local on_finish = function() + _store_fn(filename, output_path) + os.remove(output_path) + end + _subprocess(args, on_finish) +end + +local create_audio = function(start_timestamp, end_timestamp, filename, padding) + local source_path = mp.get_property("path") + local audio_track = get_active_track('audio') + local audio_track_id = mp.get_property("aid") + local output_path = utils.join_path(_os_temp_dir(), filename) + + if audio_track and audio_track.external == true then + source_path = audio_track['external-filename'] + audio_track_id = 'auto' + end + + if padding > 0 then + start_timestamp, end_timestamp = pad_timings(padding, start_timestamp, end_timestamp) + end + + local args = { + 'mpv', + source_path, + '--loop-file=no', + '--video=no', + '--no-ocopy-metadata', + '--no-sub', + '--audio-channels=mono', + '--oacopts-add=vbr=on', + '--oacopts-add=application=voip', + '--oacopts-add=compression_level=10', + table.concat { '--oac=', _config.audio_codec }, + table.concat { '--start=', start_timestamp }, + table.concat { '--end=', end_timestamp }, + table.concat { '--aid=', audio_track_id }, + table.concat { '--volume=', _config.tie_volumes and mp.get_property('volume') or '100' }, + table.concat { '--oacopts-add=b=', _config.audio_bitrate }, + table.concat { '-o=', output_path } + } + local on_finish = function() + _store_fn(filename, output_path) + os.remove(output_path) + end + _subprocess(args, on_finish) +end + +local init = function(config, store_fn, os_temp_dir, subprocess) + _config = config + _store_fn = store_fn + _os_temp_dir = os_temp_dir + _subprocess = subprocess +end + +return { + init = init, + create_snapshot = create_snapshot, + create_audio = create_audio, +} diff --git a/subs2srs.lua b/subs2srs.lua @@ -98,11 +98,11 @@ local utils = require('mp.utils') local msg = require('mp.msg') local OSD = require('osd_styler') local config_manager = require('config') +local encoder = require('encoder') -- namespaces local subs local clip_autocopy -local encoder local ankiconnect local menu local platform @@ -483,6 +483,17 @@ local function update_sentence(new_data, stored_data) return new_data end +local function audio_padding() + local video_duration = mp.get_property_number('duration') + if config.audio_padding == 0.0 or not video_duration then + return 0.0 + end + if subs.user_timings.is_set('start') or subs.user_timings.is_set('end') then + return 0.0 + end + return config.audio_padding +end + ------------------------------------------------------------ -- utility classes @@ -656,7 +667,7 @@ local function export_to_anki(gui) local audio_filename = filename_factory.make_audio_filename(sub['start'], sub['end']) encoder.create_snapshot(snapshot_timestamp, snapshot_filename) - encoder.create_audio(sub['start'], sub['end'], audio_filename) + encoder.create_audio(sub['start'], sub['end'], audio_filename, audio_padding()) local note_fields = construct_note_fields(sub['text'], snapshot_filename, audio_filename) ankiconnect.add_note(note_fields, gui) @@ -683,7 +694,7 @@ local function update_last_note(overwrite) local create_media = function() encoder.create_snapshot(snapshot_timestamp, snapshot_filename) - encoder.create_audio(sub['start'], sub['end'], audio_filename) + encoder.create_audio(sub['start'], sub['end'], audio_filename, audio_padding()) end local new_data = construct_note_fields(sub['text'], snapshot_filename, audio_filename) @@ -996,106 +1007,6 @@ do end ------------------------------------------------------------ --- provides interface for creating audio clips and snapshots - -encoder = {} - -encoder.pad_timings = function(start_time, end_time) - local video_duration = mp.get_property_number('duration') - if config.audio_padding == 0.0 or not video_duration then - return start_time, end_time - end - if subs.user_timings.is_set('start') or subs.user_timings.is_set('end') then - return start_time, end_time - end - start_time = start_time - config.audio_padding - end_time = end_time + config.audio_padding - if start_time < 0 then - start_time = 0 - end - if end_time > video_duration then - end_time = video_duration - end - return start_time, end_time -end - -encoder.get_active_track = function(track_type) - local track_list = mp.get_property_native('track-list') - for _, track in pairs(track_list) do - if track.type == track_type and track.selected == true then - return track - end - end - return nil -end - -encoder.create_snapshot = function(timestamp, filename) - local source_path = mp.get_property("path") - local output_path = utils.join_path(platform.tmp_dir(), filename) - - local args = { - 'mpv', - source_path, - '--loop-file=no', - '--audio=no', - '--no-ocopy-metadata', - '--no-sub', - '--frames=1', - '--ovcopts-add=lossless=0', - '--ovcopts-add=compression_level=6', - table.concat { '--ovc=', config.snapshot_codec }, - table.concat { '-start=', timestamp }, - table.concat { '--ovcopts-add=quality=', tostring(config.snapshot_quality) }, - table.concat { '--vf-add=scale=', config.snapshot_width, ':', config.snapshot_height }, - table.concat { '-o=', output_path } - } - local on_finish = function() - ankiconnect.store_file(filename, output_path) - os.remove(output_path) - end - subprocess(args, on_finish) -end - -encoder.create_audio = function(start_timestamp, end_timestamp, filename) - local source_path = mp.get_property("path") - local audio_track = encoder.get_active_track('audio') - local audio_track_id = mp.get_property("aid") - local output_path = utils.join_path(platform.tmp_dir(), filename) - - if audio_track and audio_track.external == true then - source_path = audio_track['external-filename'] - audio_track_id = 'auto' - end - - start_timestamp, end_timestamp = encoder.pad_timings(start_timestamp, end_timestamp) - - local args = { - 'mpv', - source_path, - '--loop-file=no', - '--video=no', - '--no-ocopy-metadata', - '--no-sub', - '--audio-channels=mono', - '--oacopts-add=vbr=on', - '--oacopts-add=application=voip', - '--oacopts-add=compression_level=10', - table.concat { '--oac=', config.audio_codec }, - table.concat { '--start=', start_timestamp }, - table.concat { '--end=', end_timestamp }, - table.concat { '--aid=', audio_track_id }, - table.concat { '--volume=', config.tie_volumes and mp.get_property('volume') or '100' }, - table.concat { '--oacopts-add=b=', config.audio_bitrate }, - table.concat { '-o=', output_path } - } - local on_finish = function() - ankiconnect.store_file(filename, output_path) - os.remove(output_path) - end - subprocess(args, on_finish) -end - ------------------------------------------------------------- -- AnkiConnect requests ankiconnect = {} @@ -1598,6 +1509,7 @@ local main = (function() end config_manager.init(config, profiles) + encoder.init(config, ankiconnect.store_file, platform.tmp_dir, subprocess) clip_autocopy.init() ensure_deck()