A cross-platform command-line tool for finding and playing video files in large collections
- 🔍 Fast file search - Uses vendored
fdbinary with automatic fallback to Python scanning - 🎯 Flexible pattern matching - Glob-based search patterns with automatic wildcard wrapping
- 🚀 Quick access to search results - Access found files by index number
- 📋 Search results as playlists - Play through search results in order
- 💾 Caching of library metadata - Cache library metadata for fast file lookups in network storage
- 📁 Multi-path scanning - Search across multiple configured directories simultaneously
- 🕒 Latest additions - Find newest files by modification time
- 🎬 Media player integration - Launch files directly in VLC or mpv
- 📦 RAR archive support - Automatically extract and play video files from RAR archives
- 🌐 IMDB lookup - Automatically open IMDB pages for media files
- ⚙️ Flexible configuration - TOML-based config with extension filtering and path management
- 📜 Scriptable output - Plain text output mode for easy piping and scripting
- 🖥️ Cross-platform - Works on Windows, Linux, and macOS
Install with uv:
uv tool install mediafinder
Note
If mf is shadowed by another command on your system (e.g., Metafont), use mediafinder instead — it's already installed and works exactly the same way.
- Configure search paths where your media files are located:
mf config set search_paths "/path/to/movies" "/path/to/tv-shows"- Optional: Activate library caching
If your collection is stored on the network, activate caching for fast file searches:
mf config set cache_library true- Find media files matching a filename pattern:
mf find "batman" # Finds files containing "batman"
mf find "*.mp4" # Finds all MP4 files
mf find "2023" # Finds files from 2023- Play a file from search results:
mf play 1 # Play first result
mf play next # Search results as playlist: play next result
mf play list # Send current search results to video player as a playlist
mf play # Play random file- Find latest additions:
mf new # Show 20 newest files
mf new 50 # Show 50 newest filesmf find [pattern]- Search for media files matching the glob pattern (supports--plain/-pfor scriptable output)mf new [n]- Show latest additions (default: 20 files, supports--plain/-pfor scriptable output)mf play [index]- Play a file by index, or random file if no index givenmf imdb <index>- Open IMDB page for a media filemf filepath <index>- Print full path of a search resultmf version- Print version information or run version checkmf cleanup- Resetmediafinderby deleting all configuration and cache filesmf stats- Show library statisticsmf last- Show last search result index with the last played file highlightedmf config- Configuremfmf cache- Manage library cache (rebuild, show location, clear)mformf --help- Print help
The find, new, and last commands support plain text output for easy scripting and piping.
Plain mode is automatically enabled when output is piped or redirected - no flags needed:
# Automatically outputs plain text
mf find batman | head -5
mf new 10 | grep 1080p
mf last > results.txt
# Find and play first result
vlc "$(mf find batman | head -1)"
# Count search results
mf find 2023 | wc -l
# Process multiple files
mf find "*.mkv" | while read -r file; do
echo "Processing: $file"
doneInteractive terminal usage displays rich formatted output, while piped/redirected commands automatically get plain text.
Use --plain or -p when you want plain output directly in your terminal without piping:
# View plain paths in terminal (useful for copying paths, etc.)
mf find batman --plain
mf new 5 -pUse the mf stats command to print various statistics that describe your collection:
On-demand extraction: mf can extract and play video files from RAR archives. When you play a RAR file, it's automatically extracted to a temporary directory.
Requirements: Requires one of these extraction tools installed:
unrar(official UnRAR utility)unar(The Unarchiver command-line tool)7z(7-Zip)bsdtar(libarchive with RAR support)- WinRAR (Windows)
Example usage:
mf find "*.rar" # Find RAR archives
mf play 1 # Automatically extracts and plays the videoNote: The mf play list command (playing multiple files as a playlist) is not supported for RAR archives. Play individual RAR files by index instead.
mf last/mf last show- Show indexed results from the last file search (supports--plain/-pfor scriptable output)mf last file- Print search result file locationmf last clear- Clear last search results
Cached indices remain valid until you run another find or new command that overwrites the last search.
Configuration:
mf config set cache_library <true/false>- Turn library caching on or offmf config set library_cache_interval <interval>- Set auto-rebuild interval in seconds (default 86400 (1 day), 0 to disable)
Manual control:
mf cache rebuild- Trigger a library cache rebuildmf cache file- Print cache locationmf cache clear- Clear the cachemf stats- Show library statistics
mf can be configured directly on the command line:
mf config set <key> <values>- Set configuration valuesmf config add <key> <values>- Add values to list settingsmf config remove <key> <values>- Remove values from list settingsmf config get <key>- Get configuration valuemf config list- Show the current configurationmf config edit- Edit config file in default editormf config file- Print config file locationmf config settings- Print a table of all available settings
Add multiple paths of a (scattered) collection:
mf config set search_paths "/movies" "/tv-shows" "/documentaries"Control which file types are considered media files:
mf config set media_extensions ".mp4" ".mkv" ".avi" ".mov" ".wmv" ".rar"
By default, common video formats and .rar archives are included.
Toggle whether search patterns should be wrapped with wildcards automatically:
# Wraps search patterns with '*' if no wildcards (* ? [ ]) present.
# 'mf find batman' searches for files matching *batman*.
mf config set auto_wildcards true
# Does not wrap search patterns.
# 'mf find batman' searches for files exactly named batman.
mf config set auto_wildcards falseToggle whether file searches should be parallelized over search paths:
# Runs file searches concurrently over all paths defined in search_paths (potentially faster).
mf config set parallel_search true
# Runs file searches sequentially over all paths defined in search_paths. Use this if
# your search paths are on the same mechanical (but not solid state) hard drive to avoid
# disk thrashing.
mf config set parallel_search falsevideo_player(str): Video player to use (vlc,mpv, orauto). Default isauto, which prefers VLC with automatic fallback to mpv.fullscreen_playback(bool): If true,mf playlaunches the video player in fullscreen mode.prefer_fd(bool): Use the bundledfdscanner when possible. Automatically ignored for mtime-sorted searches (mf new) which always use the Python scanner.display_paths(bool): Turn filepath display in search results on or off.
mf config edit resolves an editor in this order:
$VISUALor$EDITOR- Windows: Notepad++ if present else Notepad
- POSIX: first available of
nano,vim,vi
If no editor is found, it prints the path so you can edit manually.
- Boolean values accept:
true,false,yes,no,y,n,on,off,1,0(case-insensitive; synonyms normalized to true/false). - Media extensions are normalized to lowercase with a leading dot (
mkv→.mkv). - Paths are stored as absolute POSIX-style strings.
- Use quotes around patterns with wildcards to prevent shell expansion
- Patterns without wildcards are automatically wrapped:
batmanbecomes*batman* - Automatic wildcard wrapping only happens if the pattern contains none of:
* ? [ ]. - Examples:
mf find "*.mp4"- All MP4 filesmf find batman- Files containing "batman"mf find "*2023*1080p*"- 2023 releases in 1080pmf find "s01e??"- Season 1 episodes
- Video Player Integration: Automatically launches VLC or mpv media player with configurable preference
- IMDB Lookup: Uses filename parsing to find matching IMDB entries
- Smart Caching: Search results are cached for quick index-based access
- Cross-platform paths: Handles Windows and Unix path conventions
- Random Playback:
mf play(without index) randomly selects a file by scanning all configured paths (not just the last cached search).
- Uses bundled
fdbinary for fast file scanning when possible - Automatic fallback to Python scanning if
fdunavailable - Parallel scanning across multiple search paths
- All tests with
hyperfineand warm caches:hyperfine --warmup 3 --runs 10 "mf find test". - Media collection on two separate, mechanical USB drives in a file server on the local network, served via SMB for Windows and NFS for Linux clients, 16.3 TiB / 3540 files total.
- Tested on the file server itself with local file access as well as on a Linux and a Windows desktop with network file access.
mf findcan use both thefdscanner as well as the pure python one. First run was with the default settingprefer_fd = true. After that I switched to the python scanner viamf config set prefer_fd falseand tested again.
| Platform | Pure Python (ms) | fd Scanner (ms) |
Improvement |
|---|---|---|---|
| Linux Server (local file access) | 697.9 ± 17.1 | 443.5 ± 2.6 | 36% faster |
| Linux Desktop (NFS) | 1,618.0 ± 28.0 | 478.2 ± 21.2 | 70% faster |
| Windows Desktop (SMB) | 2,371.0 ± 90.0 | 1,601.0 ± 94.0 | 32% faster |
- The
fdscanner provides 32-70% performance improvement for search operations over pure python file scanning.
- Python 3.10+
- VLC or mpv media player (for
playcommand) - Internet connection (for IMDB lookup)
- Optional: RAR extraction tool (
unrar,unar,7z,bsdtar, or WinRAR) for playing archived media files
This project is licensed under the MIT License - see the LICENSE-MIT file for details.
This package includes the fd file finder binary, which is dual-licensed under MIT OR Apache-2.0.
Copyright (c) 2017-present the fd developers.
- MIT License: See
src/mf/bin/LICENSE-fd-MIT - Apache License 2.0: See
src/mf/bin/LICENSE-fd-APACHE
