rikai-mpv is a port of rikaichamp Japanese dictionary and parser into mpv video player.
As for the graphical part, it takes inspiration from interSubs script but has been largely rewritten for the Python side.
rikai-mpv-demo.mp4
Pieces of code are also borrowed from normal-jp and hikibiki-data.
By default, rikai-mpv uses Noto Serif CJK JP Light font: https://www.google.com/get/noto/#serif-jpan . If you wish to use an other one, make sure to change it in rikai_config.py
.
Dependencies are:
- Linux OS with X-based display
python >=3.8.5
PyQt5 >=5.9.2
QtWebEngineWidgets
(likely installed withpip install PyQtWebEngine
, see here)node >=v14.16
typescript
(install withnpm install --global typescript
)yarn
(install withnpm install --global yarn
)socat
rikai-mpv may work with different versions, but has not been tested. A port into Windows should be doable, although we rely on Unix sockets for lua <--> python <--> node.js communication.
Currently, the script supports Linux only. It has not been tested for Wayland-based display and has been designed for X11. You can install as follow:
Clone in your mpv/scripts/
folder (the install will break elsewhere):
cd ~/.config/mpv/scripts/
git clone https://github.com/fxmarty/rikai-mpv.git
Add a symlink at the top of the scripts
directory for mpv to detect it:
ln -s rikai-mpv/front.lua .
Then, go to rikai-mpv/rikai-backend/
and run:
yarn install
tsc
This is to install necessary dependencies, and compile typescript source into javascript.
If necessary, modify rikai_config.py
to fit your needs. The available options are limited right now and should be expended. In particular, if you use several screens, set n_screen
as a number corresponding to the screen you want the subtitles to be displayed on.
On KDE (kwin), go to Compositor settings and uncheck "Allow applications to block compositing". This is necessary to allow transparency. Screenshot.
F5
start rikai-mpv. Starting may take several seconds.F7
stop rikai-mpv- With the mouse on a subtitle, left click then
Ctrl + Alt + UP
/Ctrl + Alt + DOWN
to zoom/dezoom the subtitles - With the mouse on a subtitle, right click then
Ctrl + Alt + UP
/Ctrl + Alt + DOWN
to zoom/dezoom the popup - Popups are scrollable in case they don't fit in screen.
On top of these bindings, mpv's built-in hotkeys for going to next/previous subtitle may prove useful:
# to add in ~/.config/mpv/input.conf
LEFT no-osd sub-seek -1 # previous subtitle
RIGHT no-osd sub-seek +1 # next subtitle
- rikai-mpv is by default active only in full screen mode.
- rikai-mpv overrides the settings set for subtitles styling in
mpv.conf
. You may wish to editrikai_config.py
to fit your needs. - rikai-mpv used to work with a secondary sid (e.g. in English) with mpv 0.29.1 (when activated at least once before turning on rikai-mpv), but does not with recent versions of mpv. A solution should be found, see mpv-player/mpv#9175 for more information.
rikaichamp-backend
is not a complete port of rikaichamp features, as it (mainly) lacks support for automatic updates of the dictionary files and support for kanji dictionaries.
If you wish to do modifications to the TypeScript side, make sure to have installed typescript
and yarn
system-wide and do as follows in rikaichamp-backend
:
yarn install
Modifications will be applied to rikai-mpv after compiling TypeScript into JavaScript with tsc
, as rikai-mpv uses plain JavaScript with node.js.
Outlining text in Qt is tricky. The current solution may well break repainting of the subtitles, and a better solution is welcome if found. If repainting of subtitles is broken (e.g. only some part is showing, or it is not showing at all even though the semi-transparent background is showing), the culprit is most likely here: https://github.com/fxmarty/rikai-mpv/blob/main/subtitles_popup_graphics.py#L452
The port of rikaichamp rikaichamp-backend
is more or less v0.3.5. Everything related to the browser has been removed so that the parser is node-friendly. Note however that the popup HTML is still built with rikaichamp (using jsdom), and that it is still a web rendering that happens under the hood in Qt with a QWebEngineView
instance for the popup.
Compared to interSubs, the subtitle rendering uses QTextEdit
instead of QLabel
, which offers much more flexibility. Notably, interSubs was not fit for Japanese parsing, as it relies on spaces between words to query a dictionary. This implementation should be more flexible if it were to be merged into interSubs, as it allows parsing as many characters as needed and not just separated by blanks, e.g. interSubs could not parse "living room" as a single word, and could also not parse languages such as Chinese or Thai.
A great thanks to birtles for helping me to get through rikaichamp's code!
The code borrowed from rikaichamp and modified is published under GNU v3 license. The rest of the code base is published under the MIT license.