Home

Awesome

<p align="center"> <img src="https://user-images.githubusercontent.com/69171671/117440218-4ae26800-af23-11eb-87b4-1d9026fc953f.png"/> </p>

mpvacious

AUR Chat GitHub Donate

mpvacious is your semi-automatic subs2srs for mpv. It supports multiple workflows and allows you to quickly create Anki cards while watching your favorite TV show. Video demonstration.

Requirements

<table> <tr> <th><a href="https://www.gnu.org/gnu/about-gnu.html">GNU/Linux</a></th> <th><a href="https://www.gnu.org/proprietary/malware-microsoft.en.html">Windows 10+</a></th> <th><a href="https://www.gnu.org/proprietary/malware-apple.en.html">macOS</a></th> <th>Comments</th> </tr> <tr> <td><a href="https://wiki.archlinux.org/index.php/Mpv">mpv</a></td> <td><a href="https://sourceforge.net/projects/mpv-player-windows/files">mpv</a></td> <td><a href="https://mpv.io/installation/">mpv</a></td> <td>v0.32.0 or newer.</td> </tr> <tr> <td><a href="https://wiki.archlinux.org/index.php/Anki">Anki</a></td> <td colspan="2" align="center"><a href="https://apps.ankiweb.net/">Anki</a></td> <td></td> </tr> <tr> <td colspan="3" align="center"><a href="https://ankiweb.net/shared/info/2055492159">AnkiConnect</a></td> <td>Install from AnkiWeb.</td> </tr> <tr> <td><a href="https://www.archlinux.org/packages/core/x86_64/curl/">curl</a></td> <td colspan="2" align="center"><a href="https://curl.haxx.se/">curl</a></td> <td>Installed by default on all platforms except Windows 7.</td> </tr> <tr> <td><a href="https://www.archlinux.org/packages/extra/x86_64/xclip/">xclip</a> or <a href="https://archlinux.org/packages/extra/x86_64/wl-clipboard">wl-copy</a></td> <td></td> <td>pbcopy</td> <td>To copy subtitle text to clipboard.</td> </tr> </table>

Install all dependencies at once (on Arch-based distros):

$ sudo pacman -Syu mpv anki curl xclip --needed

Prerequisites

Installation

There are multiple ways you can install mpvacious. I recommend installing with git so that you can easily update on demand.

mpvacious is a user-script for mpv, so it has to be installed in the directory mpv reads its user-scripts from.

OSLocation
GNU/Linux~/.config/mpv/scripts/
WindowsC:/Users/Username/AppData/Roaming/mpv/scripts/

Windows is not recommended, but we acknowledge that some people haven't switched to GNU/Linux yet.

Using git

Clone the repo to the scripts directory.

mkdir -p ~/.config/mpv/scripts/
git clone 'https://github.com/Ajatt-Tools/mpvacious.git' ~/.config/mpv/scripts/subs2srs

To update, run the following command.

cd ~/.config/mpv/scripts/subs2srs && git pull

From the AUR

mpvacious can be installed with the mpv-mpvacious package.

Manually

This way is not recommended because it's easy to make a mistake during the process and end up with a broken install.

Download the repository or the latest release and extract the folder containing subs2srs.lua to your mpv scripts directory.

<details> <summary>Expected directory tree</summary>
~/.config/mpv/scripts
|-- other script 1
|-- other script 2
|-- subs2srs
|   |-- main.lua
|   |-- subs2srs.lua
|   `-- other files
`-- other script 3
</details> <details> <summary>A note for mpv v0.32 and older</summary>

Older versions of mpv don't know how to handle user-scripts in subdirectories. You need to tell mpv where to look for mpvacious.

Open or create ~/.config/mpv/scripts/modules.lua and add these lines:

local mpv_scripts_dir_path = os.getenv("HOME") ..  "/.config/mpv/scripts/"
package.path = package.path .. ';' .. os.getenv("HOME") .. '/.config/mpv/scripts/subs2srs/?.lua'
function load(relative_path) dofile(mpv_scripts_dir_path .. relative_path) end
load("subs2srs/subs2srs.lua")
</details>

Note: in Celluloid user scripts are installed in /.config/celluloid/scripts/. When following the instructions above, replace .config/mpv with .config/celluloid and optionally subs2srs with the name of the folder mpvacious is cloned into.

Configuration

The config file should be created by the user, if needed.

OSConfig location
GNU/Linux~/.config/mpv/script-opts/subs2srs.conf
WindowsC:/Users/Username/AppData/Roaming/mpv/script-opts/subs2srs.conf
Windows (portable)mpv.exeフォルダ/portable_config/script-opts/subs2srs.conf

If a parameter is not specified in the config file, the default value will be used. mpv doesn't tolerate spaces before and after =.

<p align="center"> <a href="https://github.com/Ajatt-Tools/mpvacious/blob/master/.github/RELEASE/subs2srs.conf">Example configuration file</a> </p>

Sentence field should be first in the note type settings. Otherwise, Anki won't allow mpvacious to add new notes.

Tip: Try our official note type if you don't want to configure note fields yourself. Alternatively, we have a collection of user-created note types, which you can browse here.

If you are having problems playing media files on older mobile devices, set audio_format to mp3 and/or snapshot_format to jpg. Otherwise, I recommend sticking with opus for audio, and avif or webp for images, as they greatly reduce the size of the generated files.

If you still use AnkiMobile (the proprietary Anki app), set opus_container to m4a or webm. I'll allow iOS to play Opus files, while still maintaining compatibility with non-Apple devices. For really old iOS devices, set opus_container to caf. CAF plays only on Anki Desktop, AnkiWeb in Safari and AnkiMobile, and is really not recommended. (Please note that Lockdown Mode completely disables Opus and AVIF support, though you may try to add an exception for AnkiMobile.)

If no matter what mpvacious fails to create audio clips and/or snapshots, change use_ffmpeg to yes. By using ffmpeg instead of the encoder built in mpv you can work around most encoder issues. You need to have ffmpeg installed for this to work.

Key bindings

The user may change some global key bindings, though this step is not necessary. See Usage for the explanation of what they do.

OSConfig location
GNU/Linux~/.config/mpv/input.conf
WindowsC:/Users/Username/AppData/Roaming/mpv/input.conf

Default bindings:

a            script-binding mpvacious-menu-open

Ctrl+g       script-binding mpvacious-animated-snapshot-toggle

Ctrl+n       script-binding mpvacious-export-note

Ctrl+m       script-binding mpvacious-update-last-note
Ctrl+M       script-binding mpvacious-overwrite-last-note

Ctrl+c       script-binding mpvacious-copy-primary-sub-to-clipboard
Ctrl+C       script-binding mpvacious-copy-secondary-sub-to-clipboard
Ctrl+t       script-binding mpvacious-autocopy-toggle

H            script-binding mpvacious-sub-seek-back
L            script-binding mpvacious-sub-seek-forward

Alt+h        script-binding mpvacious-sub-seek-back-pause
Alt+l        script-binding mpvacious-sub-seek-forward-pause

Ctrl+h       script-binding mpvacious-sub-rewind
Ctrl+H       script-binding mpvacious-sub-replay
Ctrl+L       script-binding mpvacious-sub-play-up-to-next

Ctrl+v       script-binding mpvacious-secondary-sid-toggle
Ctrl+k       script-binding mpvacious-secondary-sid-prev
Ctrl+j       script-binding mpvacious-secondary-sid-next

Note: A capital letter means that you need to press Shift in order to activate the corresponding binding. For example, <kbd>Ctrl+M</kbd> actually means <kbd>Ctrl+Shift+m</kbd>. mpv accepts both variants in input.conf.

Usage

Global bindings

Menu:

Enable\Disable animation:

Make a card:

Update the last card:

Clipboard:

Seeking:

Secondary subtitles:

Menu options

Advanced menu has the following options:

Then seek with <kbd>Shift+h</kbd> and <kbd>Shift+l</kbd> to the previous/next line that you want to add. Press <kbd>n</kbd> to make the card.

If above fails, you have to manually set timings.

Then, as earlier, press <kbd>n</kbd> to make the card.

Tip: change playback speed by pressing <kbd>[</kbd> and <kbd>]</kbd> to precisely mark start and end of the phrase.

My subtitles are not in sync

If subs are badly timed, first, you could try to re-time them. Read Retiming subtitles. Or shift timings using key bindings provided by mpv (usually <kbd>z</kbd> and <kbd>Shift+z</kbd>).

Example sentence card

With the addon you can make cards like this in just a few seconds.

card-example

Audio cards

It is possible to make a card with just audio, and a picture when subtitles for the show you are watching aren't available, for example. mpv by default allows you to do a 1 second exact seek by pressing <kbd>Shift+LEFT</kbd> and <kbd>Shift+RIGHT</kbd>. Open the mpvacious menu by pressing <kbd>a</kbd>, seek to the position you need, and set the timings. Then press <kbd>g</kbd> to invoke the Add Cards dialog. Here's a video demonstration.

If the show is hard-subbed, you can use transformers-ocr to recognize and add text to the card.

Secondary subtitles

If you want to add a translation to your cards, and you have the subtitles in that language, you can add them as secondary subtitles if you run mpv with --secondary-sid=<sid> parameter, sid being the track identifier for the subtitle.

You also need to specify secondary_field in the config file if it is different from the default.

If you want to load secondary subtitles automatically, don't modify the run parameters and instead set the desired languages in the config file (secondary_sub_lang option).

Secondary subtitles will be visible when hovering over the top part of the mpv window.

https://user-images.githubusercontent.com/69171671/188492261-909ba3e8-b82c-493f-88cf-0ec953dfcfe1.mp4

By pressing <kbd>Ctrl</kbd>+<kbd>v</kbd> you can control secondary sid visibility without using the mouse.

Other tools

If you don't like the default Rikaitan Search tool, try:

You can use any html page as long as it has <body></body> in it.

Additional mpv key bindings

I recommend adding these lines to your input.conf for smoother experience.

# vim-like seeking
l seek 5
h seek -5
j seek -60
k seek 60

# Cycle between subtitle files
K cycle sub
J cycle sub down

# Add/subtract 50 ms delay from subs
Z add sub-delay +0.05
z add sub-delay -0.05

# Adjust timing to previous/next subtitle
X sub-step 1
x sub-step -1

Profiles

Mpvacious supports config profiles. To make use of them, create a new config file called subs2srs_profiles.conf in the same folder as your subs2srs.conf. Inside the file, define available profile names (without .conf) and the name of the active profile:

profiles=subs2srs,english,german
active=subs2srs

In the example above, I have three profiles. The first one is the default, the second one is for learning English, the third one is for learning German.

Then in the same folder create config files for each of the defined profiles. For example, below is the contents of my english.conf file:

deck_name=English sentence mining
model_name=General
sentence_field=Question
audio_field=Audio
image_field=Extra

You don't have to redefine all settings in the new profile. Specify only the ones you want to be different from the default.

To cycle profiles, open the advanced menu by pressing <kbd>a</kbd> and then press <kbd>p</kbd>. At any time you can see what profile is active in the menu's status bar.

Hacking

If you want to modify this script or make an entirely new one from scratch, these links may help.