【问题标题】:Get full path of currently playing file in mpv获取mpv中当前播放文件的完整路径
【发布时间】:2020-10-16 08:07:17
【问题描述】:

mpv启动后,有没有办法从mpv获取当前播放文件的完整路径?

我看到this 的问题,但它没有显示如何获取属性,只是如何发送命令。

编辑:“获取完整路径”是指以编程方式;从另一个程序或终端,而不是通过在 mpv 应用程序本身上使用 mpv 命令/键绑定。

【问题讨论】:

    标签: linux mpv


    【解决方案1】:

    为此,您必须使用 --input-ipc-server 选项启动 mpv,或将其放入您的 mpv.conf 文件中。看起来像:

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

    或者在mpv.conf 文件中没有破折号:

    input-ipc-server=/tmp/mpvsocket

    套接字连接到使用相同input-ipc-server 启动的最新mpv 实例。

    然后,您可以使用如下命令:

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

    例如:

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

    你可以通过mpv --list-properties获取属性列表

    要获取完整路径,请结合 working-directory 和 path 属性。可以使用jq 解析响应,因此对于所需的输出:

    #!/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"
    

    编辑:我已经为上述脚本添加了额外的错误处理; mpv-currently-playing。除非您确定它正在播放本地文件,否则不应总是尝试计算绝对路径。如果它是一个 URL,那最终可能会弄乱方案/位置

    【讨论】:

    • 自从我离开这个问题以来,一直在玩这个。留下我的随机脚本here 以防有人想要更多示例。
    【解决方案2】:

    试试这个:

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

    即

    # -- 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.
    

    【讨论】:

      【解决方案3】:

      把它放在你的 mpv 配置文件中,以便在打开时显示完整路径

      osd-playing-msg=${path}
      

      【讨论】:

      • 猜猜它的相关性,但不完全是我的问题(正如我的回答所描述的那样)——我想从终端或其他程序获取路径,而不是从 mpv 本身获取路径。已更新问题以使其更加明显
      猜你喜欢
      • 2014-09-17
      • 2014-05-18
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多