Daemon which connects to active mpv instances, saving a history of what I watch/listen to
Project description
mpv-history-daemon
This functions by connecting to socket files created by mpv-sockets
. That launches mpv with unique mpv sockets at /tmp/mpvsockets/
.
For each mpv
socket, this attaches event handlers which tell me whenever a file in a playlist ends, whenever I seek (skip), what the current working directory/path is, and whenever I play/pause an item. Once the mpv
instance quits, it saves all the events to a JSON file.
Later, I can reconstruct whether or not a file was paused/playing based on the events, how long mpv
was open, and which file was playing, in addition to being able to see what file/URL I was playing.
Install
Requires python3.6+
pip install mpv-history-daemon
Known Issues
For whatever reason, this stops working after a few days of continuous use, so I wrap this with another script which restarts this every so often. I would recommend starting this by running:
mpv_history_daemon_restart /your/data/dir
Usage
daemon
Usage: mpv-history-daemon daemon [OPTIONS] SOCKET_DIR DATA_DIR
Socket dir is the directory with mpv sockets (/tmp/mpvsockets, probably)
Data dir is the directory to store the history JSON files
Options:
--log-file PATH location of logfile
--help Show this message and exit.
Some logs, to get an idea of what this captures:
[D 200901 03:47:54 mpv-history-daemon:115] 1598956534118491075|1598957274.3349547|mpv-launched|1598957274.334953
[D 200901 03:47:54 mpv-history-daemon:115] 1598956534118491075|1598957274.335344|working-directory|/home/sean/Music
[D 200901 03:47:54 mpv-history-daemon:115] 1598956534118491075|1598957274.3356173|playlist-count|12
[D 200901 03:47:54 mpv-history-daemon:115] 1598956534118491075|1598957274.3421223|playlist-pos|2
[D 200901 03:47:54 mpv-history-daemon:115] 1598956534118491075|1598957274.342346|path|Masayoshi Takanaka/Masayoshi Takanaka - Alone (1988)/02 - Feedback's Feel.mp3
[D 200901 03:47:54 mpv-history-daemon:115] 1598956534118491075|1598957274.3425295|media-title|Feedback's Feel
[D 200901 03:47:54 mpv-history-daemon:115] 1598956534118491075|1598957274.3427346|metadata|{'title': "Feedback's Feel", 'album': 'Alone', 'genre': 'Jazz', 'album_artist': '高中正義', 'track': '02/8', 'disc': '1/1', 'artist': '高中正義', 'date': '1981'}
[D 200901 03:47:54 mpv-history-daemon:115] 1598956534118491075|1598957274.342985|duration|351.033469
[D 200901 03:47:54 mpv-history-daemon:115] 1598956534118491075|1598957274.343794|resumed|{'percent-pos': 66.85633}
[D 200901 03:48:41 mpv-history-daemon:115] 1598956534118491075|1598957321.3952177|eof|None
[D 200901 03:48:41 mpv-history-daemon:115] 1598956534118491075|1598957321.3955588|mpv-quit|1598957321.395554
[W 200901 03:48:41 mpv-history-daemon:186] Ignoring error: [Errno 32] Broken pipe
[D 200901 03:48:44 mpv-history-daemon:236] Connected refused for socket at /tmp/mpvsockets/1598956534118491075, removing dead socket file...
[I 200901 03:48:44 mpv-history-daemon:314] /tmp/mpvsockets/1598956534118491075: writing to file...
More events would keep getting logged, as I pause/play, or the file ends and a new file starts. The key for each JSON value is the epoch time, so everything is timestamped.
parse
The daemon saves the raw event data above in JSON files, which can then be parsed into individual instances of media:
$ mpv-history-daemon parse --help
Usage: mpv-history-daemon parse [OPTIONS] DATA_DIR
Takes the data directory and parses events into Media
Options:
--all-events return all events, even ones which by context you probably
didn't listen to
--debug Increase log verbosity/print warnings while parsing JSON files
--help Show this message and exit.
As an example:
{
"path": "/home/data/media/music/MF DOOM/Madvillain - Madvillainy/04 - Madvillain - Bistro.mp3",
"is_stream": false,
"start_time": 1614905952,
"end_time": 1614906040,
"pause_duration": 20.578377723693848,
"media_duration": 67.578776,
"media_title": "04 - Madvillain - Bistro.mp3",
"percents": [
[1614905960, 11.150022],
[1614905981, 11.151141]
],
"metadata": {}
}
This can also be called from python:
>>> from pathlib import Path
>>> from mpv_history_daemon.events import history
>>> list(history([Path("1611383220380934268.json")]))
[
Media(path='/home/data/media/music/MF DOOM/Madvillain - Madvillainy/05 - Madvillain - Raid [feat. M.E.D. aka Medaphoar].mp3',
is_stream=False,
start_time=datetime.datetime(2021, 1, 23, 6, 27, tzinfo=datetime.timezone.utc),
end_time=datetime.datetime(2021, 1, 23, 6, 29, 30, tzinfo=datetime.timezone.utc),
pause_duration=0.0,
media_duration=150.569796,
media_title='Raid [feat. M.E.D. aka Medaphoar]',
percents=[(datetime.datetime(2021, 1, 23, 6, 27, 2, tzinfo=datetime.timezone.utc), 1.471624)]
metadata={})
]
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
Hashes for mpv_history_daemon-0.1.5-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 28b945e16da2a726f462c8f6ca8f490db745fa364aec0fbd407acbb0db3385d7 |
|
MD5 | 5e5d465c919b2f4ae8dcc72b872e0685 |
|
BLAKE2b-256 | 55425d11fe99dab203529a8510f45db059ed786d281e926ca545f829fe68409a |