Supports both Kodi's <musicvideo> XML format and a simple plain text fallback.

When a video starts playing, FS42 looks for a .nfo file with the same base name in the same directory. If found, it spawns an overlay process showing the metadata in the lower-left corner -- white text with a black outline, no background box.

By default the overlay shows for the first 10 seconds and the last 10 seconds of the video. It stays hidden in between. For very short clips (under 20 seconds total) it shows for the full duration.

NFO File Format

FS42 reads the standard Kodi <musicvideo> format, compatible with Kodi, Jellyfin, and Emby. If you need a tool to generate them, nfo-maker-thingy was written specifically for music video files.

<?xml version='1.0' encoding='utf-8'?>
<musicvideo>
  <title>No Rain</title>
  <artist>Blind Melon</artist>
  <album>Live at the Palace</album>
  <year>1993</year>
</musicvideo>

Fields used, in display order:

Field Display Line Notes
<artist> 1 (large, bold)
<title> 2
<album> 3
<year> 4 Falls back to <premiered> year if absent

Other fields (<genre>, <musicbrainzartistid>, etc.) are ignored.

Plain Text Fallback

If no XML is detected, FS42 reads up to 5 lines of plain text, one field per line.

Example Blind_Melon_No_Rain.nfo:

Blind Melon
No Rain
Live at the Palace
1993

File Placement

NFO files must live alongside the video with the same base name:

catalog/music/music_mix/Blind_Melon_No_Rain.mp4
catalog/music/music_mix/Blind_Melon_No_Rain.nfo

Videos without a matching NFO play normally with no overlay.

Overlay Timing

Condition Behaviour
play_duration > 20s Show for first 10s, hide, show again for last 10s
play_duration ≤ 20s Show for full duration
PPV / looping playback Show permanently

The 10-second default is defined by DEFAULT_SHOW_SECONDS in fs42/nfo_agent.py.

Configuration

All overlay appearance settings are controlled by an overlay_conf object in main_config.json. Every field is optional -- defaults are used for anything you omit.

{
  "overlay_conf": {
    "overlay_type": "normal",
    "overlay_effect": "outline",
    "overlay_offset_px": 2,
    "overlay_font_path": null,
    "overlay_text_color": [255, 255, 255, 255],
    "overlay_shadow_color": [0, 0, 0, 255],
    "overlay_title_size": 30,
    "overlay_body_size": 20,
    "overlay_title_weight": "bold",
    "overlay_body_weight": "normal",
    "overlay_fade_duration_ms": 600
  }
}

Display Type

overlay_type controls how much information is shown:

Value Fields Displayed
"normal" (default) Artist, title, album, year
"minimal" Artist and title only

Visual Effect

overlay_effect controls the text rendering style:

Value Description
"outline" (default) Text with a solid outline
"drop_shadow" Graduated shadow built from layered offset copies

overlay_offset_px sets the pixel distance for the outline or shadow (default: 2).

Font

overlay_font_path accepts an absolute path to a TrueType (.ttf) font file. If omitted or the file is not found, Arial is used as a fallback.

Colors

Colors are RGBA arrays with values 0--255:

Field Default Description
overlay_text_color [255, 255, 255, 255] Main text color
overlay_shadow_color [0, 0, 0, 255] Outline or shadow color

Text Size and Weight

Field Default Description
overlay_title_size 30 Font size in pixels for the artist line
overlay_body_size 20 Font size in pixels for title, album, and year
overlay_title_weight "bold" "bold" or "normal"
overlay_body_weight "normal" "bold" or "normal"

Fade Animation

overlay_fade_duration_ms sets the fade-in and fade-out duration in milliseconds when the overlay appears and disappears (default: 600).

Commercials and Channel Changes

The overlay is cleared when: - A commercial or bump starts playing - The channel is changed - The next video starts (the old overlay closes before the new one opens)

See Also

  • fs42/nfo_agent.py -- NFO parsing and overlay logic
  • Pay-Per-View -- PPV also reads NFO files for movie metadata