Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get full path of currently playing file in mpv

Tags:

linux

mpv

Is there a way to get the full path of the currently playing file from mpv, after mpv has been launched?

I saw this question but it doesn't show how to get properties, just how send commands.

Edit: by 'get the full path', I mean from programatically; from another program or a terminal, not by using mpv commands/keybindings on the mpv application itself.

like image 721
Sean Breckenridge Avatar asked Oct 16 '22 02:10

Sean Breckenridge


2 Answers

To do this, you have to start mpv with the --input-ipc-server option, or put that in your mpv.conf file. That would look like:

--input-ipc-server=/tmp/mpvsocket

or without the dashes in the mpv.conf file:

input-ipc-server=/tmp/mpvsocket

The socket is connected to the most recent mpv instance launched with the same input-ipc-server.

Then, you can use a command like:

echo '{ "command": ["get_property", "<some property>"] }' | socat - /tmp/mpvsocket

For example:

$ echo '{ "command": ["get_property", "path"] }' | socat - /tmp/mpvsocket
{"data":"01 - Don't Know Why.mp3","request_id":0,"error":"success"}

You can get a list of properties by doing mpv --list-properties

To get the full path, combine the working-directory and path properties. The response can be parsed with jq, so for the desired output:

#!/bin/sh

SOCKET='/tmp/mpvsocket'

# pass the property as the first argument
mpv_communicate() {
  printf '{ "command": ["get_property", "%s"] }\n' "$1" | socat - "${SOCKET}" | jq -r ".data"
}

WORKING_DIR="$(mpv_communicate "working-directory")"
FILEPATH="$(mpv_communicate "path")"

printf "%s/%s\n" "$WORKING_DIR" "$FILEPATH"

Edit: I've since added additional error handling to what the above script became; mpv-currently-playing. Shouldn't always try to compute an absolute path unless you're sure its playing a local file. If its a URL, that could end up messing up the scheme/location

like image 149
Sean Breckenridge Avatar answered Oct 22 '22 07:10

Sean Breckenridge


try this :

echo '{ "command": ["get_property", "playlist"] }' | socat - /tmp/mpvsocket |jq '.data[].filename'

"/mnt/d6/media/vid.mp4"

ie

# -- 1
echo '{ "command": ["get_property", "playlist"] }' | socat - /tmp/mpvsocket # |jq . '.data[].filename'

{"data":[{"filename":"/mnt/d6/media/vid.mp4","current":true,"playing":true}],"request_id":0,"error":"success"}


# -- 2
echo '{ "command": ["get_property", "playlist"] }' | socat - /tmp/mpvsocket |jq . # '.data[].filename'

{
  "data": [
    {
      "filename": "/mnt/d6/media/vid.mp4",
      "current": true,
      "playing": true
    }
  ],
  "request_id": 0,
  "error": "success"
}


# -- 3
echo '{ "command": ["get_property", "playlist"] }' | socat - /tmp/mpvsocket |jq '.data[].filename'

"/mnt/d6/media/vid.mp4"


# -- 4
enjoy ;)


# -- jq
https://www.baeldung.com/linux/jq-command-json
https://stedolan.github.io/jq/tutorial/

jq is like sed for JSON data :

you can use it to slice and filter and map and transform structured data
with the same ease that sed, awk, grep and 
friends let you play with text.
like image 20
hong tong Avatar answered Oct 22 '22 09:10

hong tong