Como obter o título da mídia tocando em VLC ou outros players de mídia usando o CLI?

2

Eu quero que o título da mídia seja reproduzido no VLC usando a linha de comando. A coisa mais próxima que eu tenho atualmente é esse comando.

ps aux | grep vlc

A saída é

pc       27636  2.1  2.3 1261964 90028 ?       Sl   21:46   0:23 /usr/bin/vlc --started-from-file /media/pc/Everything/TV shows/Discovery Channel - The History Of Hacking.avi
pc       28317  0.0  0.0  11748  2196 pts/0    S+   22:05   0:00 grep --colour=auto vlc
    
por Wally 02.12.2015 / 17:36

3 respostas

3

Tenho certeza de que há uma maneira legal e limpa de fazer isso. Provavelmente via D-bus. Infelizmente, eu não sei o que é assim, então aqui está uma abordagem mais hacky. Você pode usar lsof para imprimir os arquivos abertos por um processo em execução. A opção relevante aqui é (de man lsof ):

-c c    selects  the  listing  of  files  for  processes  executing the
        command that begins with the characters of c.  Multiple commands
        may be specified, using multiple -c options.  They are joined in
        a single ORed set before participating in AND option selection.

Portanto, lsof -c vlc listará todos os arquivos abertos pelos processos cujo nome começa com vlc . Isso, no entanto, listará todos os tipos de coisas, incluindo várias bibliotecas e outras coisas que não nos interessam. O quarto campo da saída de lsof (no meu Arch, pelo menos) é o descritor de arquivo do arquivo (para arquivos regulares) seguido por uma única letra descrevendo o modo no qual o arquivo foi aberto ( r para leitura, neste caso). O quinto campo é o tipo de arquivo e, aqui, queremos que seja REG para regular. Colocando tudo isso junto, obtemos (o -w suprime os avisos):

$ lsof -wc vlc | awk '$4~"[0-9]r" && $5=="REG"'
vlc     16532 terdon   16r      REG    8,19    131338  69731703 /path/to/foo.avi

Para obter apenas o nome do arquivo, você pode usar o GNU grep :

$ lsof -wc vlc | awk '$4~"[0-9]r" && $5=="REG"' | grep -o '/.*'
/path/to/foo.avi

E para obter apenas o nome do arquivo:

$ lsof -wc vlc | awk '$4~"[0-9]r" && $5=="REG"' | grep -o '[^/]*$'
foo.avi
    
por 02.12.2015 / 17:53
0

Não tenho certeza se você está atrás do título (que está nos metadados do arquivo) ou do nome do arquivo (que está na linha de comando). Qualquer coisa ps ou pgrep não lhe dará diretamente o título, mas pode obter o arquivo. Você pode obter todos os vlcs em execução e sua linha de comando.

pgrep -a vlc

Isto irá encontrar qualquer processo com vlc em seu nome, mas não em flags, então ele corresponde a um binário chamado um-programa-com-vlc-em-ele mas não algum outro programa - flags --do-vlc

Agora, como você extrai o nome do arquivo da linha de comando é um pouco complicado, você pode querer executá-lo através do sed, mas imagino que será um pouco frágil.

pgrep -a vlc | sed -r 's%^.*\/([^/.]+)%%g'

Você obterá uma lista de programas em execução com vlc em seu nome binário e a saída será toda a última barra até o ponto.

Você começa a jogar algo como / home / movies / dr. Nompg então você está sem sorte.

    
por 05.12.2015 / 03:21
0

Você pode usar o d-bus observando a especificação da interface do mpris em aqui

Usando a interface qdbus e mpris:

qdbus org.mpris.MediaPlayer2.vlc \

(o VLC pode ser substituído por outros media players também.)  E, em seguida, extrair metadados a partir dele:

/org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Metadata \

e finalmente, usando o grep e cortando os dados desnecessários, você pode ver o título:

| grep "xesam:title:" | cut -c 14-
    
por 20.02.2018 / 08:40