yt-dlp-nicocomments
A yt-dlp postprocessor plugin that converts Niconico comments to an ASS subtitle track.
Fonts
The plugin lays out and draws comments with:
- Noto Sans JP (Regular and Bold)
- Noto Serif JP (Regular)
- Noto Emoji
- Noto Sans Math
- Noto Sans Symbols 2
- Noto Sans SC (Regular)
- Noto Sans KR (Regular)
- Noto Sans Thai
The package includes these fonts under the SIL Open Font License 1.1. With
--embed-subs, the plugin saves the video as an MKV file and attaches the fonts
to it (unless embedfonts=false).
To keep the video file small, the plugin removes the unused glyphs from the fonts using fontTools.
Install
If yt-dlp is installed with uv or pip, install the plugin in the same environment:
uv tool install yt-dlp --with yt-dlp-nicocomments
pip install -U yt-dlp-nicocomments
If you use the yt-dlp executable, download the .whl file from the
latest release
and put it in a yt-dlp plugin directory:
| Platform | Plugin directory |
|---|---|
| macOS, Linux | ~/.config/yt-dlp/plugins/ |
| Windows | %APPDATA%\yt-dlp\plugins\ |
To make sure that the release workflow of this repository built the file, run:
gh attestation verify yt_dlp_nicocomments-*.whl -R hiroki-io/yt-dlp-nicocomments
The yt-dlp executable cannot load fontTools from the plugin directory. To attach
smaller fonts, install fontTools so that the pyftsubset command is on PATH,
for example with brew install fonttools or pipx install fonttools.
To use the code from a clone of this repository, download the fonts and put the repository in a plugin directory:
python3 ~/yt-dlp-nicocomments/tools/font_data.py
mkdir -p ~/.config/yt-dlp/plugins
ln -s ~/yt-dlp-nicocomments ~/.config/yt-dlp/plugins/yt-dlp-nicocomments
Usage
yt-dlp --embed-subs --use-postprocessor "NicoComments:when=video" \
https://www.nicovideo.jp/watch/sm9
when=video is necessary because the plugin must run before yt-dlp writes the
subtitles.
Options
Options are passed after the postprocessor name (NicoComments:), separated by
semicolons:
| Option | Values | Default | Description |
|---|---|---|---|
lang |
ja, en, or zh, separated by commas |
ja |
Comment languages. Each language becomes a separate subtitle track. |
comments |
A number of comments, or all |
0 |
Minimum number of comments per language. See Past comments. |
nglevel |
high, medium, low, or none |
medium |
Hide comments that many users added to their NG lists. high hides the most comments. |
opacity |
A number from 0 to 1 |
1 |
Comment opacity |
writejson |
true, yes, 1, false, no, or 0 |
false |
Write comments to a JSON file |
defaulttrack |
true, yes, 1, false, no, or 0 |
true |
Mark the subtitle track of the first comment language as default |
embedfonts |
true, yes, 1, false, no, or 0 |
true |
Attach the fonts to the video file when --embed-subs is used |
Example:
--use-postprocessor "NicoComments:when=video;lang=ja,en;nglevel=high"
Shortcut
To shorten the command, define an alias in the yt-dlp configuration file
~/.config/yt-dlp/config:
--alias --nico "--embed-subs --use-postprocessor NicoComments:when=video"
Then use the alias instead of the options:
yt-dlp --nico https://www.nicovideo.jp/watch/sm9
Save only the comment track
To save the comment track as an ASS file without the video, use --write-subs
and --skip-download:
yt-dlp --skip-download --write-subs --use-postprocessor "NicoComments:when=video" \
https://www.nicovideo.jp/watch/sm9
The ASS file does not contain the fonts, so install the font files linked in Fonts on the computer that plays it.
Past comments
The comment API returns only the recent comments of a video. When these comments
are fewer than comments, the plugin loads older comments until it has at least
that many comments for each language, or until no older comments are left.
comments=all loads all past comments.
Fetching past comments requires a free Niconico account. Pass your cookies to
yt-dlp, for example with --cookies-from-browser:
yt-dlp --cookies-from-browser chrome --embed-subs \
--use-postprocessor "NicoComments:when=video;comments=10000" \
https://www.nicovideo.jp/watch/sm9
Smooth scrolling in mpv
mpv redraws subtitles only when the video frame changes. To update them at the
display refresh rate, load the mpv script
nicocomments-display-fps.lua.
The script converts the video to the refresh rate of the display that shows the
mpv window.
The script adds an fps video filter. If mpv or IINA saves the playback
position, it also saves this filter, and the filter stays in effect when you
resume the video without the script.
mpv
Download the script and run mpv with it:
mpv --script=/path/to/nicocomments-display-fps.lua --video-sync=display-resample video.mkv
nicocomments-play.sh
runs the same command and passes its arguments to mpv. Put it in the same
directory as nicocomments-display-fps.lua:
chmod +x nicocomments-play.sh
./nicocomments-play.sh video.mkv
On Windows, use
nicocomments-play.bat
in the same way:
nicocomments-play.bat video.mkv
To use the script for all videos, put it in the mpv scripts directory and add
video-sync=display-resample to mpv.conf:
| Platform | mpv scripts directory |
|---|---|
| macOS, Linux | ~/.config/mpv/scripts/ |
| Windows | %APPDATA%\mpv\scripts\ |
IINA
IINA plays videos with mpv, so it can use the same script. Open Settings > Advanced, select Enable advanced settings, and add these entries to Additional mpv options:
| Name | Value |
|---|---|
scripts |
Absolute path to nicocomments-display-fps.lua |
video-sync |
display-resample |
If you already set up the mpv scripts directory and mpv.conf, you can instead
select Use config directory and choose ~/.config/mpv. Restart IINA after
you change these settings.
Burn the comments into the video
To burn the comment track into the video, run this command with an FFmpeg build that includes libass:
ffmpeg -i video.mkv -vf subtitles=video.mkv -c:a copy video-burned.mp4
FFmpeg encodes the video again, so this takes time and lowers the quality.
Metadata
Release files for yt-dlp-nicocomments 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| yt_dlp_nicocomments-0.2.1.tar.gz | 26.5 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| yt_dlp_nicocomments-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 53.0 MB
Release files / yt_dlp_nicocomments-0.2.1.tar.gz
| Download URL | yt_dlp_nicocomments-0.2.1.tar.gz |
|---|---|
| Size | 26.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3bd866ba984149ccd74ae4c163c552f15509acc3657069ecffb90ef0ebe8132d
|
|
BLAKE2b-256 checksum How to use checksums |
553be0b1fab66a8ae53a523576c1db0272a83831c09ae53a74db5f8bb6714b83
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.
Transparency logRelease files / yt_dlp_nicocomments-0.2.1-py3-none-any.whl
| Download URL | yt_dlp_nicocomments-0.2.1-py3-none-any.whl |
|---|---|
| Size | 26.5 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d9185b74dd52b91188b977cfa86ff9a4bdc8d3e2a98c73f6bca2d053271ace57
|
|
BLAKE2b-256 checksum How to use checksums |
4f05c64767f4ef126f9e1a0488c6ca5ef561579a001cc2ddeddbb8dd275b9ac6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.
Transparency log