13 个版本

0.3.2 2023年10月19日
0.3.1 2023年7月20日
0.3.0 2023年3月28日
0.1.7 2022年10月4日
0.1.1 2021年11月18日

#554命令行工具

每月42次下载
legacygui 中使用

GPL-3.0-or-later

155KB
4K SLoC

dependency status Translation status

legacylisten

legacylisten 是我编写的一个简单的 CLI 音频播放器,因为现有的没有一个能满足我的需求。主要功能是可以更改播放歌曲的频率(legacylisten 总是处于随机模式),但还有一些其他更奇特的功能。

工作原理

legacylisten 会创建一个包含所有歌曲的列表,这些歌曲位于 ~/.zvavybir/legacylisten/data [^1] 及其子目录中,以及它们所谓的“播放可能性”[^2] 和音量(标准值分别为 10 和 10%)。然后它会随机选择一首歌曲,其播放概率与播放可能性成正比,并播放它,除非你要求不同。

音量可以根据每首歌曲进行调整并保存。虽然实现起来很简单(确实非常简单),但没有办法改变全局音量,因为我认为这最好留给操作系统来处理。一个音频播放器能做得非常好的事情是识别正在播放的歌曲并根据它来操作。该功能的预期用途是一次性调整非常安静的歌曲的音量,然后用户就再也不用被烦恼了。

另一个相当隐晦的功能是,你可以不仅立即暂停/退出,而且只能在当前歌曲结束时暂停/退出。最奇特的是,legacylisten 如果收到 *NIX 信号 SIGUSR1,则会切断与磁盘的所有连接,只有在收到 SIGUSR2 信号时才会再次开始读取。SIGUSR1 不会中断正在播放的歌曲,因为歌曲是缓冲的[^3]。

命令

命令是控制 legacylisten 的方式,并且总是由单个字符组成。最初这些是命令名称的首字母,但由于这导致了相当奇怪的名称(比如 f – "fainter" – 减少音量),我决定按照字母顺序编号。

要执行命令,只需输入其字母(但请记住,终端通常是按行缓冲的,这意味着在按回车之前,legacylisten 不会看到 – 并对 – 你的输入做出反应)。

以下命令存在

  • ?:显示带有帮助信息的所有命令列表(本质上就是这篇文档)。[^4]
  • a:增加当前歌曲的播放可能性1。
  • b:减少当前歌曲的播放可能性1。
  • c:退出legacylisten并将歌曲的可能性和音量保存到~/.zvavybir/legacylisten/songs.csv
  • d:暂停播放。
  • e:在按下dl后继续播放(不过不会覆盖SIGUSR1)。
  • f:跳过歌曲。
  • g:永久性地将当前歌曲的音量增加1%(但不超过100%)。
  • h:永久性地将当前歌曲的音量减少1%(但不低于0%)。
  • i:显示歌曲已经播放的时间以及(如果可用)总播放时间。
  • j:在播放和暂停之间切换。
  • k:当前歌曲播放完毕后立即退出legacylisten(优先于l)。
  • l:与k类似,但只是暂停而不是退出。
  • m:显示歌曲的ID3标签中的元数据(长度通常需要通过i查询,因为很少保存到ID3标签中)。
  • n:在您的首选图片查看器中打开歌曲的封面图片(它使用mimeopen,据我所知,在MS Windows上不可用,因此在那里不会工作)。如果歌曲没有封面,则打开~/.zvavybir/legacylisten/default.png(不需要是PNG文件)代替。有关备用图像的详细信息(包括创建的图像),请参阅此处
  • o:停止所有重复播放(但如果当前歌曲是重复的,则不会立即结束;如果想要立即跳过,请使用f)。
  • p:重复当前歌曲一次。
  • q:永久重复当前歌曲。
  • r:跳转到当前歌曲的开始或(如果它已经在开始处)到上一个歌曲。您可以回溯任意多的歌曲(或更确切地说是歌曲的数量)。所有播放过的歌曲都被保存(但仅在legacylisten的一个运行中,如果重新启动它,则历史记录会丢失),并且如果您回溯,下一首歌曲将与之前在该歌曲上跟随的歌曲相同。

低内存处理程序

如前所述,尤其是较旧的legacylisten版本,内存占用非常大,这使得我的系统有时无法使用几秒钟。在Linux中,此类问题通常由OOM杀手(结束最不重要且内存消耗最大的进程)处理,但事实证明,我偶尔被迫使用的Chromium网页浏览器(Google Chrome的免费软件版本)比我犯的罪行还要糟糕。不是做些合理的事情,而是在legacylisten中添加了一个监视可用内存的例程,并在它下降到某些(可配置的)阈值以下时终止自身(目前是一个GiB)。

这目前使用了关于“空闲RAM”的错误概念(它将用于磁盘缓存的内存计算为已使用,尽管它不是;有关更多信息,请参阅此著名网站),因此它不必要地触发。尽管这比反过来要好,但由于这个原因,低内存处理程序默认是关闭的。

本程序使用*NIX函数sysconf(3),因此在旧平台上无法运行。

配置文件

legacylisten可以通过~/.zvavybir/legacylisten/conffile.csv文件进行配置。如果无法解析某个选项,它将被静默忽略,因此请小心。每个选项都在单独一行(末尾必须有换行符,即使在MS Windows下也是如此),并且每个部分的值都必须用逗号分隔。以下是我的配置文件示例:

data_dir,/media/my_user_name/external_harddrive/legacylisten
ignore_ram,false
lang,esperanto
repeat_bonus,2

目前有六个可能的选项

  • data_dir:如果您将音乐收藏夹放在其他位置(例如,像我一样在外置硬盘或~/Music中),您可以使用此选项更改legacylisten将搜索的目录。即使在*NIX系统下,配置文件中也不支持使用~/的表示法。
  • minimum_ram:低内存处理器的阈值(以字节为单位)。
  • ignore_ram:禁用低内存处理器(可能的值是truefalse)。如果设置了此选项(目前是默认值),则忽略minimum_ram
  • langlegacylisten支持基本国际化,此选项用于激活它。目前此选项有五个可能的值
    • english:将语言设置为英语(这是默认值)。
    • germandeutsch:将语言设置为德语。
    • esperanto:将语言设置为世界语。
    • dutchnederlands:将语言设置为荷兰语。
    • custom:如果您有一个翻译文件,但它尚未包含在官方源代码中(可能是您仍在完善它,只是想尝试一下,或者由于法律原因您被禁止在legacylisten许可协议下发布),此选项允许您仍然使用它。此选项需要两个其他值,即翻译文件的路径和语言ID。例如,如果英语尚未包含在内,您可以使用此类选项来绕过这一点
      lang,custom,/path/to/file/translation.fl,en-US,
      
      路径没有对文件名或文件扩展名的要求,但语言标识符必须正确。
  • repeat_bonus:重复播放一首歌通常意味着这首歌很好,应该更频繁地播放,但很容易忘记增加其播放概率,因此此选项会自动执行此操作。每次重复播放一首歌时,都会按配置值增加。您也可以设置一个负值。
  • enable_dbus:启用dbus模块。D-Bus/MPRIS负责将legacylisten优雅地集成到您的系统中。这不是使legacylisten工作所必需的。默认值是false

插件接口

如果歌曲中没有元数据标签,您可以使用插件接口来告诉 legacylisten 歌曲的标题和艺术家。每个插件都是一个位于 ~/.zvavybir/legacylisten/parser 目录(或其子目录)中的外壳脚本(或可执行文件,如果您的偏好是可执行文件)并从stdin接收歌曲的文件名(不包含换行符)作为输入。如果文件名可以解析,它必须在stdout上输出歌曲的标题和艺术家(以零字节分隔,可选地以尾随零字节结尾)。如果输出中没有零字节,则解析被视为失败并被忽略。

安装

安装 legacylisten 最简单的方法是使用 rustup 和 Cargo。按照其网站上的指示安装 rustup 后,输入以下命令安装 legacylisten 本身

cargo install legacylisten

贡献

与所有软件一样,legacylisten 也可以不断改进。虽然我正在努力使其单独使用,但我没有无限的时间,尤其是并不是总是有最好的想法。如果您可以帮助改进它或其他方式(例如,通过功能请求、添加其他语言或改进文档)请提供帮助

我假设除非另有说明,否则每个贡献都遵循必要的许可。

许可

虽然对于 Rust 程序来说并不常见,但 legacylisten 是在 GNU 通用公共许可证版本 3 或(根据您的选择)任何后续版本下发布的。

更多信息请参阅 LICENSE.md

[^1]: 虽然并非有意 (甚至相反),但 legacylisten 应该相当便携(~/ 指的是用户的主目录 - 在 legacylisten 中,即使在 MS Windows 下也是如此)。

[^2]: 或简称为“可能性”。

[^3]: 这当然在内存占用方面相当糟糕,但这是我迄今为止能做得最好的(至少它比最差的实现好一个数量级)。如果您有更好的想法, 贡献

[^4]: 此命令有点特殊,因为其内部处理方式不同。您可以从以下两个方面看到这一点:一方面是它特殊的名字(仅非字母的)另一方面是(当您运行 legacylisten 时),通常命令是严格按顺序执行的,但此命令是在同一行上指定的所有其他命令之前运行的。

依赖项

~14-46MB
~754K SLoC