Media file finder and player
Project description
mf - Media File Finder
A cross-platform command-line tool for finding and playing video files in large collections
Features
- 🔍 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
- 🌐 IMDB lookup - Automatically open IMDB pages for media files
- ⚙️ Flexible configuration - TOML-based config with extension filtering and path management
- 🖥️ Cross-platform - Works on Windows, Linux, and macOS
Installation
Install with uv:
uv tool install mediafinder
Quick Start
[!NOTE] If
mfis shadowed by another command on your system (e.g., Metafont), usemediafinderinstead — 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 VLC as a playlist
mf play # Play random file
- Find latest additions:
mf new # Show 20 newest files
mf new 50 # Show 50 newest files
Commands
Core Commands
mf find [pattern]- Search for media files matching the glob patternmf new [n]- Show latest additions (default: 20 files)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 config- Configuremfmf version- Print version informationmformf --help- Print help
Last search results
mf last/mf last show- Show indexed results from the last file searchmf 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.
Cache Management
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 cache
Configuration Management
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
Search Paths
Add multiple paths of a (scattered) collection:
mf config set search_paths "/movies" "/tv-shows" "/documentaries"
Media Extensions
Control which file types are considered media files:
mf config set media_extensions ".mp4" ".mkv" ".avi" ".mov" ".wmv"
Extension Matching
Toggle whether to filter results by media extensions:
mf config set match_extensions true # Only return configured media types
mf config set match_extensions false # Return all files matching pattern
Automatic wildcard wrapping
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 false
Parallel search
Toggle 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 false
Other Settings
fullscreen_playback(bool): If true,mf playlaunches VLC with--fullscreen --no-video-title-show.prefer_fd(bool): Use the bundledfdscanner when possible. Automatically ignored for mtime-sorted searches (mf new) which always use the Python scanner.
Editing the Config
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.
Input Normalization
- 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.
Search Patterns
- 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
Integration Features
- VLC Integration: Automatically launches VLC media player
- 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).
Performance
- Uses bundled
fdbinary for fast file scanning when possible - Automatic fallback to Python scanning if
fdunavailable - Parallel scanning across multiple search paths
Benchmarking fd vs pure python file scanning
- 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.
Requirements
- Python 3.10+
- VLC media player (for
playcommand) - Internet connection (for IMDB lookup)
License
This project is licensed under the MIT License - see the LICENSE-MIT file for details.
Third-Party Software
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mediafinder-0.8.0.tar.gz.
File metadata
- Download URL: mediafinder-0.8.0.tar.gz
- Upload date:
- Size: 5.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.12 {"installer":{"name":"uv","version":"0.9.12"},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
faeedc5bab7e9cf575251a390a1fdc3b6b117ee9d1f1812f598c529c0c07c419
|
|
| MD5 |
b3eca53bc6040cfd3781c2ec219f1c09
|
|
| BLAKE2b-256 |
82155cd140b26b2b730520be65a3e5fb77d5810b6fa8aa62f001621ce71e9390
|
File details
Details for the file mediafinder-0.8.0-py3-none-any.whl.
File metadata
- Download URL: mediafinder-0.8.0-py3-none-any.whl
- Upload date:
- Size: 5.9 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.12 {"installer":{"name":"uv","version":"0.9.12"},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b63c3b91b36eeb719fa6d5e166b516d6c0275b24ddbf3e3bcaf6734c5d172d66
|
|
| MD5 |
04afd0f6f467d8481ed1802f13f9a1de
|
|
| BLAKE2b-256 |
307f84d2dc8e98873cd828cb3e4d2d8445d0df42bd07886ba5eb5c4107603742
|