我需要一个命令来播放目录中的随机 mp3。到目前为止,我已经尝试过
ls *.mp3 | shuf -n 1 | omxplayer
每个不同的播放器都表现得好像没有收到文件名并吐出帮助。谢谢帮助!
答案1
首先,我不喜欢 Bash。将路径管道化到进程并不好,如果不“恰到好处”地完成,会导致各种奇怪的情况。话虽如此,你在 Bash 中尝试做的许多工作或操作都不太好的事情可以用(不幸的是)更多的代码来完成,但可以工作以您希望的方式使用其他语言。
因此,由于有点无聊,并且对为此创建一些东西感兴趣,我去编写了一个(非常粗糙的)Python 脚本,它可以完成您想要的功能。它可能看起来很复杂,但效果很好,我已经在任何地方添加了注释或在下面进行了解释。
笔记:我仅使用系统上的 VLC 播放器和 Rhythmbox 对此进行了测试,并使用xdg-open
它们打开 GUI 中给定文件的默认处理程序。就我而言,VLC 是默认调用的xdg-open
。如果您使用的是 GUI,并且只想使用默认的媒体播放器播放 MP3 文件,请使用xdg-open
“播放器”。
系统上的软件包要求:
python
(Python 2.6 或更高版本,但不是Python 3)python-dev
(重要的 Python 库)
脚本安装过程:
这里其实不需要做太多工作。但为了简单起见,请按照以下步骤操作:
bin
在您的主目录中 创建一个文件夹:mkdir /home/$USER/bin
- 将目录更改为新的“bin”文件夹:
cd /home/$USER/bin
- 创建一个名为 的文件
randommp3
。使用文本编辑器将下面“代码/脚本”部分的代码复制并粘贴到此文件中。保存该文件。 - 使文件可执行:
chmod +x /home/$USER/bin/randommp3
- 玩得开心,但请注意以下使用要点:
- 您别无选择,只能指定要使用的媒体播放器。 将是您在执行文件时
oxmplayer
所要放置的内容。player
- 如果你的音乐不是
/home/$USER/Music
(其中是$USER
当前登录的用户),则还必须使用参数指定完整目录路径--dir
(或其别名之一,如下面的“用法”部分所述)。如果文件夹路径包含任何如果没有任何空格,则必须将其括在单引号中(例如,对于给定路径中的“我的音乐”目录,您可以将其作为参数输入/path/to/My Music
)--dir
。
- 您别无选择,只能指定要使用的媒体播放器。 将是您在执行文件时
示例执行:
在 GUI VLC 播放器中,从用户主目录中的音乐文件夹中打开一个随机 MP3 文件
randommp3 vlc-wrapper
Music Drive
打开位于文件夹中的外部驱动器“MusicDrive”中的随机 MP3 文件/media
,在媒体播放器中oxmplayer
randommp3 --dir '/media/Music Drive' oxmplayer
用法
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.
代码:(或如果你真的很懒的话可以保存这个链接)
#!/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)
答案2
此命令应在 bash 中运行。您可能希望从 MP3 文件所在的父文件夹中运行它。
find . -type f -name '*.mp3' | shuf -n 1 | xargs -d "\n" omxplayer
或omxplayer
用您最喜欢的媒体播放器替换。
或者另一个有效的命令是使用xdg-open
你的默认播放器,就像@muru 所评论的那样:
xdg-open "$(find . -type f -name '*.mp3' | shuf -n 1)"
笔记:-n 1
如果从 中 删除shuf
,则它将按随机顺序播放所有 MP3 文件。但这需要使用实际的播放器而不是xdg-open
。并且它只在此处的第一个命令中有效。刚刚测试过。
答案3
Debian linux 有一个名为的 perl 程序randomplay
,可以播放一个或多个指定目录中的 *.mp3 和其他音频格式的文件。我已经用了好几年了。
例如,在我的顶级音乐目录中,以下内容播放来自所有给定目录的随机歌曲列表:
randomplay artist1 artist2 artist3
由于它是 perl,我推测只要安装了依赖项,它就可以在任何 Linux 系统上运行。不知道它是否能在其他操作系统上运行。
编辑重新阅读一下这个问题,听起来这个人可能只想播放一首随机歌曲。在这种情况下,这个--tracks=n
论点很有用:
randomplay --tracks=1 directory