Reproduzir um arquivo mp3 aleatório

3

Eu preciso de um comando que reproduza um mp3 aleatório de um diretório. Até agora eu tentei

ls *.mp3 | shuf -n 1 | omxplayer

Cada jogador diferente apenas age como se não tivesse recebido um nome de arquivo e cospe a ajuda. Obrigado pela ajuda!

    
por aramsichord 03.03.2017 / 02:21

2 respostas

3

Em primeiro lugar, eu não gosto de Bash. Caminhos de tubulação para processos não são tão bons, e causam todo tipo de esquisitice quando não são feitos 'só isso'. Dito isto, muitas das coisas que você está tentando fazer no Bash que não são gentis com trabalho ou operação podem ser feitas com (infelizmente) mais código, mas podem funcionar do jeito que você quer , em outras línguas.

Então, estando um pouco entediado e interessado em criar algo para isso, eu fui e escrevi um script Python (muito difícil) que pode fazer o que você está procurando. Pode parecer complexo, mas funciona muito bem, e eu coloquei comentários onde quer que seja ou expliquei isso abaixo.

OBSERVAÇÃO: Eu só testei isso com o VLC player e o Rhythmbox no meu sistema, e com xdg-open que abre o manipulador padrão da GUI para o arquivo fornecido. No meu caso, o VLC é o padrão que xdg-open chama. Se você estiver em uma GUI e quiser apenas usar o media player padrão para o arquivo MP3, use xdg-open para "player".

Requisitos do pacote no seu sistema:

  • python (Python 2.6 ou superior, mas não Python 3)
  • python-dev (bibliotecas Python de importância)

Processo de instalação de scripts:

Não há muito trabalho aqui. Mas, para simplificar, siga estas etapas:

  1. Crie uma pasta bin no seu diretório pessoal: mkdir /home/$USER/bin
  2. Altere o diretório para a nova pasta 'bin': cd /home/$USER/bin
  3. Crie um arquivo chamado randommp3 . Copie e cole o código da seção "Código / Script" abaixo neste arquivo com um editor de texto. Salve o dito arquivo.
  4. Tornar o arquivo executável: chmod +x /home/$USER/bin/randommp3
  5. Divirta-se, mas observe os seguintes detalhes de uso:
    • Você não tem escolha a não ser especificar qual media player usar. oxmplayer seria o que você colocaria no lugar de player quando você executasse o arquivo.
    • Se a sua música for não em /home/$USER/Music (onde $USER é o usuário atualmente conectado), você também precisará especificar o caminho completo do diretório com o argumento --dir (ou um de seus aliases, conforme explicado na seção "uso" abaixo). Se o caminho da pasta contiver espaços , você deverá envolvê-lo entre aspas simples (por exemplo, para o diretório "Minhas músicas" em um determinado caminho, você digitaria como /path/to/My Music para o argumento --dir ).

Exemplo de execução :

Abra um arquivo MP3 aleatório a partir da pasta Music do usuário em seu diretório Home, no GUI VLC Player

randommp3 vlc-wrapper

Abra um arquivo MP3 aleatório de uma unidade externa chamada "MusicDrive" montada em Music Drive na pasta /media , no media player chamado oxmplayer

randommp3 --dir '/media/Music Drive' oxmplayer

Uso

randommp3 [-h] [--dir DIRPATH] player

Open a random MP3 in the player of choice, or the default player

positional arguments:
  player                The executable name of the media player to open the
                        MP3 with. If none specified, uses the system default
                        player.

optional arguments:
  -h, --help            show this help message and exit
  --dir DIRPATH, --directory DIRPATH, --music-dir DIRPATH
                        The path to the directory where your music is stored.
                        If the path has spaces, wrap the entire path in
                        single-quotes ('/home/ubuntu/My Music/' for example).
                        If not specified, the current user's Music directory
                        in their /home/ folder is used.

Código: (ou um link que você pode salvar se você for realmente tão preguiçoso )

#!/usr/bin/python

import getpass
import subprocess as sp
import os
import glob
import random
import argparse

if __name__ == "__main__":
    # Parse arguments to the script
    argparser = argparse.ArgumentParser(description="Open a random MP3 in the player of choice, or the default player",
                                        add_help=True)
    argparser.add_argument('--dir', '--directory', '--music-dir', dest='dirpath', type=str,
                           default=str('/home/' + getpass.getuser() + '/Music'), required=False,
                           help="The path to the directory where your music is stored. If the path has spaces, wrap the "
                                "entire path in single-quotes ('/home/ubuntu/My Music/' for example). If not specified, "
                                "the current user's Music directory in their /home/ folder is used.")
    argparser.add_argument('player', type=str, help="The executable name of the media player "
                                                    "to open the MP3 with. If none specified, "
                                                    "uses the system default player.")

    # Using the above 'argparser' items, get the arguments for what we're going to be using.
    args = argparser.parse_args()

    # Gp to the directory your music is in.
    os.chdir(args.dirpath)
    mp3s = glob.glob('*.mp3')

    # Modify the directory path to make sure we have the trailing slash
    dirpath = args.dirpath
    if dirpath[-1] not in '/\':
        dirpath += '/'

    # Actually open the MP3 file, and /dev/null to suppress output messages from the process.
    DEV_NULL = open(os.devnull, 'w')
    execpath = [args.player, '%s%s' % (dirpath, str(random.choice(mp3s)))]
    sp.Popen(execpath, stdout=DEV_NULL, stderr=DEV_NULL)
    
por Thomas Ward 03.03.2017 / 03:25
3

Este comando deve funcionar no bash. Você pode querer executá-lo estando na pasta pai de onde seus arquivos MP3 estão.

find . -type f -name '*.mp3' | shuf -n 1 | xargs -d "\n" omxplayer

ou substitua omxplayer pelo seu media player favorito.

Ou outro comando que funciona é usar o xdg-open para usar seu player padrão, como @muru comentou:

xdg-open "$(find . -type f -name '*.mp3' | shuf -n 1)"

OBSERVAÇÃO: Se você remover o -n 1 do shuf , ele reproduzirá todos os arquivos MP3 em uma ordem embaralhada. Mas isso requer o uso do player real e não xdg-open . E isso só funciona no primeiro comando aqui. Apenas testei isso.

    
por Terrance 03.03.2017 / 04:32