A sophisticated interactive music player built on MOC (Music on Console) and the chloop REPL framework that transforms audio listening into an intelligent, annotated experience. This library provides vim-style keyboard controls, timestamp marking, and persistent comment storage to help users deeply engage with audio content.
The core philosophy centers on active listening workflows where users can mark interesting moments, add contextual notes, and build searchable audio archives over time. Whether analyzing podcasts, studying music, reviewing recordings, or conducting audio research, mocp-cli reduces the mental overhead of navigating complex audio files by making annotation and navigation effortless.
The library integrates seamlessly with Redis-based data storage and the broader helper library ecosystem, enabling powerful audio workflow automation and cross-session persistence.
Install the actual MOC player/server
sudo apt-get install -y moc
or
brew install moc
If you don't have docker installed, install Redis and start server
sudo apt-get install -y redis-server
or
brew install redis
brew services start redis
Install with pip
pip install mocp-cli
A lot of what powers the cool interactive features are provided by the COMMENTS
and FILES
redis_helper.Collections
defined in yt_helper
.
Install with pip
pip install yt-helper
or
pip install "mocp-cli[extras]"
Calling mocplayer
will start a REPL that will send commands to the running instance of mocp --server
. Any arguments passed to mocplayer
are assumed to be glob patterns that should be passed to the moc.find_select_and_play
function.
# Start the interactive player with audio files
mocplayer ~/Music/*.mp3
# Or start with a specific directory
mocplayer ~/Podcasts/
Basic Controls:
space
- pause/unpausem
- mark current timestamp for later referencec
- show all comments/marks for current filei
- show info about currently playing filen
- next file in playlistp
- previous file in playlisth
/l
- seek backward/forward (5 seconds)H
/L
- seek backward/forward (30 seconds)←
/→
- seek backward/forward (1 second, arrow keys)j
/k
- volume down/up↓
/↑
- volume down/up (arrow keys)f
- find and play audio files in current directoryF
- find, select, and play audio files in current directory-
- add timestamped comment with custom textq
- quitQ
- stop MOC server and quit
Advanced Features:
J
- jump to a previously saved markC
- browse and play most-commented filesR
- browse and play recently added filesCtrl+a
- start jumploop with first 62 marks selectede
- edit timestamp of existing comment/markd
- delete selected comments/marksD
- delete current file and remove all associated data
Colon Commands:
:seek N
- seek forward/backward by N seconds:go timestamp
- jump to specific timestamp (e.g.,:go 1h23m45s
,:go 2:15:30
):jump
- jump to a saved comment or mark (same asJ
):jumploop
- start interactive mark navigation session:most_commented [limit]
- browse most-commented files (default limit 62):recent_files [limit]
- browse recently added files (default limit 62):delete_comments
- select comments/marks to delete:delete
- delete current file and associated data:edit_timestamp
- edit timestamp of existing comment/mark:find pattern1 pattern2
- find and select files by glob patterns
What you gain: Transform passive audio consumption into an active, searchable knowledge base. Mark key moments while listening, add contextual notes, and build a personal audio archive that becomes more valuable over time. Never lose track of important audio moments again.
Player
- Main interactive REPL for controlling MOC player with vim-style keybindings- Inherits from
GetCharLoop
for single-keystroke efficiency chfunc_dict
: Ordered dictionary mapping keys to (function, help_text) tuplesname
: Collection name for Redis storage ('mocp')prompt
: Display prompt ('mocplayer> ')input_hook
: Function to handle timestamped comments via-
inputpre_input_hook
: Function to capture current timestamp contextbreak_chars
: Characters that exit the loop (['q', 'Q'])- Returns: Interactive session (call with
Player()
to start) - Internal calls:
GetCharLoop.__init__()
, moc module functions, COMMENTS collection
- Inherits from
-
seek(num)
- Seek forward or backward by specified secondsnum
: Number of seconds to seek (positive=forward, negative=backward)- Returns: None (updates playback position)
- Internal calls: moc.seek
-
go(timestamp)
- Jump to absolute position in current filetimestamp
: String in formats like '3h4m5s', '2:15:30', '300s', '300'- Returns: None (seeks to position)
- Internal calls: moc.go
-
jump()
- Interactive jump to saved comment or mark- Returns: None (opens selection interface for saved marks)
- Internal calls:
jump_to_select()
function
-
jumploop()
- Start interactive navigation session between marks- Returns: None (starts unbuffered navigation loop through selected marks up to 62)
- Internal calls:
jumploop()
function
-
most_commented(limit=62)
- Browse and play most-commented fileslimit
: Maximum number of files to display (default 62)- Returns: None (opens selection interface for frequently annotated files)
- Internal calls:
most_commented_files_play_select()
function
-
recent_files(limit=62)
- Browse and play recently added fileslimit
: Maximum number of files to display (default 62)- Returns: None (opens selection interface for recently added files)
- Internal calls:
recent_files_play_select()
function
-
find(*glob_patterns)
- Find and select audio files by pattern*glob_patterns
: File/directory glob patterns to search- Returns: None (opens selection interface for matching files)
- Internal calls: moc.find_select_and_play
-
delete_comments()
- Select and delete comments/marks for current file- Returns: None (opens selection interface for comment deletion)
- Internal calls:
delete_comments_select()
function
-
edit_timestamp()
- Edit timestamp of existing comment/mark- Returns: None (opens selection interface for timestamp editing)
- Internal calls:
edit_comment_timestamp_select()
function
delete()
- Delete current audio file and remove all associated data- Returns: None (removes file from filesystem, updates FILES collection, removes COMMENTS)
- Internal calls:
delete()
function