☰
Automatic Ripping Machine(ARM)音乐 CD 抓轨配置指南:深入解析 `.abcde.conf`
2026/10/13 2:57:15 网站建设 项目流程
  • 音视频
  • 后端

【免费下载链接】automatic-ripping-machine

Automatic Ripping Machine (ARM) Scripts

项目地址:https://gitcode.com/gh_mirrors/au/automatic-ripping-machine
点击查看免费下载

Automatic Ripping Machine(ARM)在识别出光盘为音乐 CD 后,会将其转交给 abcde 完成抓轨与编码,而承载所有抓轨策略的配置文件就是.abcde.conf。本文以 ARM 仓库自带的 setup/.abcde.conf 为骨架,完整讲解每个配置分区的作用、取值与底层调用链,并说明如何通过 ARM Web UI 在线编辑该文件,让你可以按需定制输出格式、目录结构、并行编码数与 CDDB 元数据来源。

一、.abcde.conf是什么

abcde(A Better CD Encoder)是 Linux 下经典的音频 CD 抓轨与编码工具,ARM 并不自己实现音乐抓轨,而是将音乐光盘任务"外包"给 abcde。仓库内 arm/ripper/utils.py 中的rip_music()函数展示了这一调用关系:

abcfile = cfg.arm_config["ABCDE_CONFIG_FILE"] if job.disctype == "music": logging.info("Disc identified as music") # If user has set a cfg.arm_config file with ARM use it if os.path.isfile(abcfile): cmd = f'abcde -d "{job.devpath}" -c {abcfile} >> "{os.path.join(job.config.LOGPATH, logfile)}" 2>&1' else: cmd = f'abcde -d "{job.devpath}" >> "{os.path.join(job.config.LOGPATH, logfile)}" 2>&1' ... args = {"status": JobState.AUDIO_RIPPING.value} database_updater(args, job) try: subprocess.check_output(cmd, shell=True).decode("utf-8") logging.info("abcde call successful") args = {"status": JobState.IDLE.value} database_updater(args, job) return True except subprocess.CalledProcessError as ab_error: err = f"Call to abcde failed with code: {ab_error.returncode} ({ab_error.output})" args = {"status": JobState.FAILURE.value, "errors": err} database_updater(args, job) logging.error(err)

可以看到:ARM 会读取arm.yaml中的ABCDE_CONFIG_FILE键得到配置文件路径,然后用abcde -d <光驱设备> -c <配置文件>调用 abcde,并将标准输出与错误一并追加到 ARM 的任务日志中。若配置路径不存在则回退为不带-c的默认调用。抓轨期间任务状态被标记为JobState.AUDIO_RIPPING,成功置为IDLE,失败则写入FAILURE与错误信息。

1.1 文件默认位置

仓库文档 arm_wiki/Config-abcde.conf.md 明确指出默认位置为/home/arm/.abcde.conf;而在 ARM 的实际部署中,安装脚本会把它安装到系统配置目录:

  • Debian 安装脚本 scripts/installers/DebianInstaller.sh 会把setup/.abcde.conf复制为/etc/arm/config/abcde.conf,并另存一份.default作为恢复备份;
  • Docker 容器脚本 scripts/docker/runit/arm_user_files_setup.sh 会在/etc/arm/config/abcde.conf缺失时从仓库setup/.abcde.conf复制,并建立/etc/abcde.conf符号链接(这是 abcde 自身的默认查找路径,用作-C变量为空的兜底);
  • arm_wiki/Configuring-ARM.md 也提示:如需调整音频 CD 相关设置,可在/etc/arm/config/abcde.conf中找到 abcde 配置文件,除非你在arm.yaml中另行指定了路径。

也就是说,默认路径随安装方式不同而略有差异(/home/arm/.abcde.conf是文档给出的标准位置,/etc/arm/config/abcde.conf是 ARM 安装器实际落盘的位置),具体以arm.yaml的ABCDE_CONFIG_FILE值为准。

1.2 ARM 如何加载与读取它

arm/config/config.py 通过_load_abcde()以文本方式读取整个文件内容:

def _load_abcde(fp): with open(fp, "r") as abcde_read_file: config = abcde_read_file.read() return config

随后(同文件 arm/config/config.py):

# abcde config file, open and read contents abcde_config_path = arm_config["ABCDE_CONFIG_FILE"] abcde_config = _load_abcde(abcde_config_path)

即 ARM 启动时就会把整个 abcde 配置读入内存,供 Web UI 展示与在线编辑使用。

二、CDDB 元数据来源(CDDBMETHOD 等)

CDDBMETHOD决定抓轨时从何处获取光盘的曲目与专辑元数据。仓库默认配置为:

CDDBMETHOD=musicbrainz

可选值为cddb、musicbrainz、cdtext,可用逗号分隔组合为顺序尝试列表(例如cddb,musicbrainz),所有结果都会展示供选择。ARM 文档对musicbrainz有明确警示:除非你清楚自己在做什么,否则不要更改它(Do not change this unless you know what you're doing),因为 ARM 自身也是依赖 MusicBrainz 进行音频光盘识别与曲目入库的。

2.1 ARM 侧的 MusicBrainz 集成

ARM 在抓轨之前会先调用 arm/ripper/music_brainz.py 识别音乐光盘:main()中先通过discid包计算光盘 Disc ID,再依据arm.yaml的GET_AUDIO_TITLE配置(可取none、musicbrainz、freecddb,见 arm/ui/comments.json 中的说明)决定是否查询 MusicBrainz。查询时(get_disc_info())使用mb.set_useragent(app="arm", version=str(job.arm_version), ...)声明客户端身份,然后调用mb.get_releases_by_discid(discid, includes=['artist-credits', 'recordings'])获取发行信息。

check_musicbrainz_data()会从返回数据中筛选出format == "CD"的发行版本,解析艺人、专辑标题、年份与曲目列表,调用process_tracks()逐曲写入 ARM 数据库,并把crc_id(release id)、hasnicetitle、title、no_of_titles等写入任务记录。主流程 arm/ripper/main.py 中,音乐光盘分支为:

elif job.disctype == "music": # Try to recheck music disc for auto ident music_brainz.main(job) if utils.rip_music(job, log_file): utils.notify(job, constants.NOTIFY_TITLE, f"Music CD: {job.title} {constants.PROCESS_COMPLETE}") utils.scan_emby()

即"先让 MusicBrainz 识别并入库,再由 abcde 实际抓轨编码"。

2.2 其他 CDDB 相关选项

仓库默认配置中以下选项均被注释(保持默认),但提供了完整说明,可按需启用:

参数默认/示例说明
CDDBURL"https://freedb.freedb.org/~cddb/cddb.cgi"指定自定义 CDDB 服务器;若只想走代理,设置http_proxy环境变量即可(wget 会自动使用)
CDDBPROTO6CDDB 协议级别,5 为 latin1 输出,6 为 UTF-8 编码
HELLOINFO"`whoami`@`hostname`"CDDB 协议需要的用户名@主机名信息
CDDBSUBMITfreedb-submit@freedb.orgCDDB 变更提交通信地址
CDDBCOPYLOCAL/CDDBLOCALDIR/CDDBLOCALRECURSIVEn/$HOME/.cddb/y是否把抓取的 CDDB 条目缓存在本地$CDDBLOCALDIR
NOSUBMITn设为y后 abcde 永不询问是否提交编辑过的 cddb 文件
NOCDDBQUERYn设为y等效于命令行-n,永不访问 CDDB 服务器,直接进入空白 cddb 文件编辑模式;y隐含NOSUBMIT=y
CDDBUSELOCALn设为y时优先使用本地缓存条目(配合CDDBLOCALRECURSIVE=y;Grip 等工具也共用$HOME/.cddb)
SHOWCDDBFIELDSyear,genre逗号分隔,指定解析函数输出的字段,默认YEAR和GENRE,不区分大小写(y,g同样有效)

三、输出格式(OUTPUTTYPE)与编码器

3.1 OUTPUTTYPE:可选输出类型

配置文件注释中给出的完整支持列表为:flac、m4a、mp3、mpc、ogg、opus、mka、spx、vorbis、wav、wv、ape、aiff,共 13 种。可用单一格式(如ogg),也可逗号分隔多格式同时输出(如flac,mp3)。注意:OUTPUTTYPE已被弃用,OUTPUTFORMAT字符串中不应再包含文件扩展名,否则会得到.ogg.ogg这类重复后缀。

#OUTPUTTYPE=ogg

3.2 编码器语法(ENCODERSYNTAX)

*ENCODERSYNTAX系列变量指定每种格式使用的编码器实现,仓库配置中全部注释掉(使用default):

#MP3ENCODERSYNTAX=default #OGGENCODERSYNTAX=default #FLACENCODERSYNTAX=default #SPEEXENCODERSYNTAX=default #MKAENCODERSYNTAX=default #MPCENCODERSYNTAX=default #WVENCODERSYNTAX=default #APENCODERSYNTAX=default #AACENCODERSYNTAX=default #OPUSENCODERSYNTAX=default #MP2ENCODERSYNTAX=default #TTAENCODERSYNTAX=default #AIFFENCODERSYNTAX=default

各格式可选编码器汇总(来自仓库配置注释):

格式可用编码器
Oggoggenc、vorbize
MP3lame、gogo、bladeenc、l3enc、xingmp3enc、mp3enc
FLACflac(当前唯一支持)
Speexspeexenc(唯一)
MPCmpcenc(唯一)
WavPackwavpack、ffmpeg
APEmac(唯一)
AAC/M4Afdkaac、ffmpeg、neroAacEnc、faac、qaac、fhgaacenc
Opusopusenc(唯一)
MP2twolame、ffmpeg
TTAtta、ttaenc
AIFFffmpeg(唯一)

default是oggenc、lame、flac、speexenc、mpcenc、wavpack、fdkaac、opus、twolame、tta的有效取值,它会同时决定二进制默认位置、命令行选项变量与选项传递位置。NORMALIZERSYNTAX目前只支持normalize。

3.3 编码器选项(*OPTS)

仓库配置给出了各编码器的推荐参数示例,均默认注释:

  • MP3(LAME):推荐-V 0——可变比特率(VBR),目标约 245 Kbps、范围 220–260 Kbps(参考 Hydrogenaudio 的 LAME 推荐设置):
    #LAMEOPTS=

    另有GOGOOPTS、BLADEENCOPTS(如-br 192)、L3ENCOPTS(如-br 256000 -hq -crc)、XINGMP3ENCOPTS、MP3ENCOPTS(如-v -br 256000 -qual 9 -no-is -bw 16500)。

  • FLAC:FLACOPTS="--silent"是对 flacget_console_width()的 floating point exception 问题的规避(flac 1.3.1 修正);FLACGAINOPTS="--add-replay-gain"传给 MetaFlac 用于 ReplayGain 标签。
  • AAC/M4A(abcde 2.7 起,旧 AACENCOPTS 已作废):
    • fdkaac:FDKAACENCOPTS='--bitrate 192k'(或推荐--profile 2 --bitrate-mode 5 --afterburner 1);
    • FFmpeg:FFMPEGENCOPTS="-c:a aac -b:a 192k"(老版本 FFmpeg 需加-strict -2);
    • neroAacEnc:建议-q 0.65;faac:建议-q 250;
    • qaac:--tvbr 100或--alac(Apple Lossless);fhgaacenc:--vbr 4。
    • 注意 Wine 路径带空格问题:"$HOME/.wine/drive_c/Program Files/qaac/qaac.exe"会让 abcde 无法处理,应使用"$HOME/.wine/drive_c/qaac/qaac.exe"。
  • WavPack:WAVENCOPTS(建议-hx3);WVGAINOPTS='-a'启用 album gain(track gain 是默认)。
  • APE:APENCOPTS='-c4000',不设置时 mac 会出错,取值 1000–5000。
  • AIFF:AIFFENCOPTS="-write_id3v2 1 -id3v2_version 4"(1 开启 id3v2 标签,0 关闭;版本 4 为 id3v2.4,3 为 id3v2.3)。
  • MP2:twolame 高度推荐--bitrate 320。
  • Opus:参考opusenc -h。
  • FFmpeg 通用(MKA/其他):WavPack-c:a wavpack -compression_level 6(仅 FFmpeg,avconv 无原生编码器)、ALAC-c:a alac、mp2-c:a mp2 -b:a 320k。

3.4 编码器与工具路径

配置注释提供了完整的二进制路径变量列表,便于自定义:LAME、GOGO、BLADEENC、L3ENC、XINGMP3ENC、MP3ENC、VORBIZE、OGGENC、FLAC、SPEEXENC、MPCENC、WVENC、APENC、FAAC、NEROAACENC、FDKAAC、OPUSENC、TWOLAME、TTA、TTAENC、QAAC、FHGAACENC。使用 avconv 而非 FFmpeg 时,在FFMPEG变量中给出 avconv 的路径(如FFMPEG=/usr/bin/avconv)。

标签、抓轨与工具类:ID3、ID3V2、MID3V2、EYED3、CDPARANOIA、CD_PARANOIA、CDDA2WAV(icedax)、PIRD、CDDAFS、CDDISCID、CDDBTOOL、MD5SUM、DISTMP3、VORBISCOMMENT、METAFLAC、NORMALIZE(normalize-audio)、CDSPEED(eject)、VORBISGAIN、MKCUE、MKTOC(cdrdao)、DIFF、WVGAIN、WVTAG、APETAG、GLYRC、IDENTIFY、CONVERT、DISPLAYCMD、WINE。

3.5 音频抓取方式(CDROMREADERSYNTAX)与 HTTP 工具

#CDROMREADERSYNTAX=cdparanoia #CUEREADERSYNTAX=default #CUE2DISCID=abcde.cue2discid

CDROMREADERSYNTAX当前可选cdparanoia、libcdio(cd-paranoia)、icedax、cdda2wav、dagrab、pird、cddafs(仅 macOS)与flac。CUE 读取支持mkcue与abcde.mkcue(内部实现,无需外部程序)两种模式;CUE2DISCID则负责把 CUE 表转回 CD Disc ID 用于 CDDB 查询(/path/to/cue2discid或内置的abcde.cue2discid)。

#HTTPGET=wget #HTTPGETOPTS="-q -O -"

HTTPGET默认 wget;FreeBSD 用 fetch(HTTPGETOPTS="-q -o -")、macOS 用 curl(-f -s)。修改HTTPGET时HTTPGETOPTS也应同步调整;若HTTPGETOPTS为空或未定义,则使用默认选项。

四、输出目录与文件名格式(OUTPUTDIR / OUTPUTFORMAT)

4.1 输出目录

OUTPUTDIR="/home/arm/music/" #WAVOUTPUTDIR=`pwd`

OUTPUTDIR指定最终成品音乐的根目录(ARM 默认指向arm用户家目录下的music)。注意 Docker 容器脚本注释提到:abcde 配置中的music与 Docker Compose 文档中的Music存在目录名大小写不一致,需要建立符号链接统一。WAVOUTPUTDIR可单独指定中间 WAV 文件的存放位置(默认当前目录)。

4.2 文件名格式(OUTPUTFORMAT)

OUTPUTFORMAT控制最终文件路径结构,可使用变量:OUTPUT、GENRE、ALBUMFILE、ARTISTFILE、TRACKFILE、TRACKNUM、YEAR。必须用单引号包裹,abcde 会自动创建其中的目录部分。

仓库默认:

OUTPUTFORMAT='${ARTISTFILE}/${ALBUMFILE}/${TRACKNUM} - ${TRACKFILE}' #OUTPUTFORMAT='${ARTISTFILE}-${ALBUMFILE}/${TRACKNUM}.${TRACKFILE}'

即"艺术家/专辑/序号 - 曲名"的嵌套目录结构;注释中的备选是"艺术家-专辑/序号.曲名"的单层结构。

4.3 合辑与单轨专辑

VAOUTPUTFORMAT='Various ${ALBUMFILE}/${TRACKNUM} ${ARTISTFILE} ${TRACKFILE}' ONETRACKOUTPUTFORMAT=$OUTPUTFORMAT VAONETRACKOUTPUTFORMAT=$VAOUTPUTFORMAT
  • VAOUTPUTFORMAT:Various Artists 合辑的格式(默认Various 专辑/序号 艺术家 曲名);
  • ONETRACKOUTPUTFORMAT/VAONETRACKOUTPUTFORMAT:适用于"单文件"抓轨(ONEFILE)的格式,默认分别继承上面两个变量。

这与 ARM 文档中提到的"Merge CD into single track (for live albums)"能力对应——将整张 CD 合并为单个轨道文件(适合现场专辑)。

4.4 文件名整理函数(mungefilename)

abcde 默认会对 CDDB 数据做三类清洗以得到可用文件名:

  1. 删除标题前的点号;
  2. 将空格替换为下划线(可移除该规则以保留空格);
  3. 删除 Windows/Linux 都不允许的一批字符。

仓库默认启用的函数:

mungefilename () { echo "$@" | sed s,:,\ -,g | sed s,/,-,g | tr -d \?\[:cntrl:\] }

即把冒号替换为"冒号+空格"、斜杠替换为连字符、删除问号与控制字符。注释中还有两个备选实现:

  • VARIANT 1(works anywhere):全部转小写,把[- ,.:'\/!@#?$%^&()]等一律替换为下划线、去除连续与首尾下划线,并 recode 为 flat ASCII;
  • VARIANT 2(legible):只把/与:替换为空格(eyeD3 无法处理路径中的冒号),合并连续空格、去首尾空格。

另有可选的mungetrackname、mungeartistname、mungealbumname、mungegenre覆写函数。仓库默认启用了mungealbumname的一个实用技巧:用cd-discid $CDROM计算的 ID 作为后缀,避免多张"Unknown Album"未知专辑互相覆盖文件夹:

ID_SUFFIX=$(cd-discid $CDROM | cut -f1 -d ' ') mungealbumname () { mungefilename $(echo "$@" | sed s,'Unknown Album','Unknown Album_'$ID_SUFFIX,g) }

mungegenre默认只是把流派转为小写。

五、行为控制:并行、交互、垫零与低磁盘模式

5.1 并行编码数(MAXPROCS)

MAXPROCS=4

MAXPROCS指定同时运行的编码器数量,等效于命令行-j。在 SMP(多核)系统上可显著加速,默认 1,仓库配置设为 4。

5.2 交互模式与轨道垫零

INTERACTIVE=n PADTRACKS=y
  • INTERACTIVE=n:让 abcde 全程非交互(命令行无对应开关,一旦设置将永远非交互);
  • PADTRACKS=y:强制轨道号用 0 补足两位,即使只有一首歌也输出01.my_song.ext样式。

5.3 低磁盘模式与批量归一化

#LOWDISK=n #BATCHNORM=n
  • LOWDISK=n:默认并行化(边读整张 CD 边编码);设为y则关闭并行(抓轨、编码交替进行),适合磁盘空间紧张的系统;
  • BATCHNORM=y:启用批量归一化,保留专辑内各曲目的相对音量差异。

5.4 nice 级别

#ENCNICE=10 #READNICE=10 #DISTMP3NICE=10

设置编码器、CD 读取器与 distmp3 进程的相对 nice 值(父进程 nice 为 12 时,编码器 nice 3 意味着绝对 nice 15)。留空则使用默认 nice 增量(tcsh 为 4,bsdutils nice 为 10)。

5.5 NOGAP 与 KEEPWAVS

#KEEPWAVS=n #NOGAP=y
  • KEEPWAVS=n:编码后保留 WAV(需同时把clean从默认 actions 中移除,否则临时目录会被清空);
  • NOGAP=y:使用 lame 编码器时启用无间隔(gapless)编码。

六、动作管线(ACTIONS)与播放列表

6.1 ACTIONS:abcde 的动作管线

ACTIONS=musicbrainz,read,encode,tag,move,clean,playlist,getalbumart,embedalbumart

ACTIONS是逗号分隔的动作序列。可选动作:cddb、cue、read、normalize、encode、tag、move、replaygain、playlist、getalbumart、embedalbumart、clean、default。动作间存在隐含依赖:

  • encode隐含read;
  • normalize隐含read;
  • tag隐含cddb,read,encode;
  • move隐含cddb,read,encode,tag;
  • replaygain隐含cddb,read,encode,tag,move;
  • playlist隐含cddb;
  • embedalbumart隐含getalbumart。

新动作可追加在default之后,如ACTIONS=default,playlist,无需重复默认动作。仓库默认的完整管线是:MusicBrainz 取元数据 → 抓轨 → 编码 → 打标签 → 移动到输出目录 → 清理临时文件 → 生成播放列表 → 下载并嵌入专辑封面。

6.2 播放列表(PLAYLIST)

#PLAYLISTFORMAT='${ARTISTFILE}-${ALBUMFILE}.${OUTPUT}.m3u' #PLAYLISTDATAPREFIX='' #VAPLAYLISTFORMAT='${ARTISTFILE}-${ALBUMFILE}.${OUTPUT}.m3u' #VAPLAYLISTDATAPREFIX='' #DOSPLAYLIST=n

播放列表格式与OUTPUTFORMAT使用同样的变量;若指定了子目录,abcde 会自动创建并把列表中的文件引用指向该子目录。PLAYLISTDATAPREFIX可为每个文件名加任意前缀(如流媒体 URL)。VAPLAYLISTFORMAT/VAPLAYLISTDATAPREFIX是合辑版本。DOSPLAYLIST=y则使用 CR-LF 换行(部分硬件播放器要求)。

6.3 专辑封面(album art)

#GLYRCOPTS= #ALBUMARTFILE="cover.jpg" #ALBUMARTTYPE="JPEG" #IDENTIFYOPTS= #CONVERTOPTS= #DISPLAYCMDOPTS="-resize 512x512 -title abcde_album_art" #ALBUMARTALWAYSCONVERT="n"

GLYRCOPTS传给 glyrc 下载封面,例如--formats jpg;jpeg只搜索 JPEG、--from <provider>、--lang <langcode>限定来源与语言;ALBUMARTFILE/ALBUMARTTYPE指定封面文件名与类型;ImageMagick 相关:CONVERTOPTS(如-colorspace RGB -resize 600x600>)、IDENTIFYOPTS、DISPLAYCMDOPTS。默认仅在图片类型与ALBUMARTTYPE不同时才调用 convert,设ALBUMARTALWAYSCONVERT="y"可强制总是转换。

6.4 MP3 标签版本

#ID3TAGV=id3v2.4 #ID3OPTS= #ID3V2OPTS= #EYED3OPTS="--set-encoding=utf16-LE"

MP3 有三种打标签方式:id3v1(id3)、id3v2.3(id3v2)、id3v2.4(eyeD3,默认)。ID3TAGV可选择旧格式,EYED3OPTS默认使用 UTF-16-LE 编码。

七、光驱与系统相关设置

7.1 光驱设备与 IDE 总线

#CDROM=/dev/cdrom #CDPARANOIACDROMBUS="d"

CDROM指定读取设备(可定义为单轨 flac 文件,但通常无意义);IDE 总线需CDPARANOIACDROMBUS="d",ide-scsi 仿真层则用"g"。注意 ARM 调用 abcde 时始终通过-d显式传入实际光驱设备路径(job.devpath),因此此处通常无需修改。

7.2 光驱与抓轨选项

#CDPARANOIAOPTS= #CDDA2WAVOPTS= #PIRDOPTS="-p" #DAGRABOPTS= #CDDAFSOPTS="-f" #EJECTOPTS= #CDSPEEDOPTS="-x" #CDSPEEDVALUE=""

CDPARANOIOPTS同时被 GNU 的 cd-paranoia 使用(设置CDROMREADERSYNTAX=libcdio时用此变量);dagrab 的-n 8(sectors per request)值得尝试;CDSPEEDOPTS="-x"配合CDSPEEDVALUE用于设置读取速度。EJECTOPTS是 eject 命令选项。

7.3 抓轨完成后弹出光盘

#EJECTCD=y

取消注释即让 abcde 在所有轨道读取完成后自动弹出 CD。这与 ARM 侧的AUTO_EJECT配置(arm/ui/comments.json 中有说明)是不同层级的两套弹出机制,可同时生效。

7.4 远程编码与详细输出

#REMOTEHOSTS=foo,bar,baz,quux,qiix #EXTRAVERBOSE=0

REMOTEHOSTS可把编码任务分发到远程主机(需本地安装 distmp3、远程运行 distmp3host);EXTRAVERBOSE=1,2,...输出后台动作的详细信息,网络慢或 CDDB 服务器响应不及时时有帮助。

八、自定义钩子函数(pre_read / post_read / post_encode)

abcde 支持三个可覆写的 shell 钩子,仓库默认均为空实现,可注入自定义命令:

#pre_read () #{ #: #}
  • pre_read:读盘前执行。可关闭托盘(eject -t,需 eject 支持)、设置读取速度(Debian 下eject -x或cdset -x);
  • post_read:读盘后执行。可保存 CD TOC 副本;
  • post_encode:编码后执行。可把结果目录通过网络移动走,或与之前运行结果对比做测试。

注意:钩子中调用的可执行文件必须在$PATH中,或使用完整/path/to/binary路径。

九、通过 ARM Web UI 在线编辑

ARM 在"设置 → abcde Config"页签提供了图形化编辑入口(arm/ui/settings/templates/settings/abcde.html):页面上是一个覆盖全屏高度的文本域,内容为当前 abcde 配置全文({{ abcde_cfg }}),下方 Submit 按钮保存。若检测到配置文件只读,文本域会被禁用并提示 "abcde.conf is read-only"。

对应的服务端逻辑在 arm/ui/settings/settings.py 的save_abcde():

@route_settings.route('/save_abcde_settings', methods=['POST']) @login_required def save_abcde(): ... form = AbcdeForm() if form.validate(): abcde_cfg_str = str(form.abcdeConfig.data).strip() # Windows machines can put \r\n instead of \n newlines, which corrupts the config file clean_abcde_str = '\n'.join(abcde_cfg_str.splitlines()) try: with open(cfg.abcde_config_path, "w") as abcde_file: abcde_file.write(clean_abcde_str) abcde_file.close() success = True cfg.abcde_config = clean_abcde_str except OSError as e: app.logger.error(f"{cfg.abcde_config_path} is read-only", exc_info=e)

要点:

  • 表单由 arm/ui/forms.py 中的AbcdeForm提供(abcdeConfig文本字段,DataRequired校验);
  • 保存前会把\r\n统一为\n('\n'.join(abcde_cfg_str.splitlines())),避免 Windows 换行破坏配置;
  • 写入路径即cfg.abcde_config_path(来自arm.yaml的ABCDE_CONFIG_FILE),写失败(只读)会记录错误日志并返回success=False;
  • 配置修改后立即生效于内存中的cfg.abcde_config,无需重启;后续音乐光盘任务调用abcde -c <路径>时自然读到新配置。

同时 arm/ui/settings/settings.py 通过is_read_only(cfg.abcde_config_path)探测文件权限来展示只读提示。更完整的 UI 说明见 arm_wiki/Web-Settings.md 的 "abcde Config" 一节。

十、安装与排查提示

  • 依赖安装:Debian 安装脚本 scripts/installers/DebianInstaller.sh 会apt install -y abcde ... cdparanoia ...等依赖包,确保 abcde 与抓轨工具就位;
  • 文件落盘位置:安装时会把仓库的setup/.abcde.conf复制为/etc/arm/config/abcde.conf,同时保留abcde.conf.default备份;Docker 场景还会链接/etc/abcde.conf;
  • 默认路径的两种说法:文档层面对外宣称/home/arm/.abcde.conf(abcde 的用户级默认位置),ARM 实际安装则统一到/etc/arm/config/abcde.conf。两者以arm.yaml的ABCDE_CONFIG_FILE配置值为准,这也是 UI 在线编辑写入的目标路径;
  • 识别链路:音乐光盘需在arm.yaml中把GET_AUDIO_TITLE设为musicbrainz才会走完整识别,否则仅依赖 abcde 自身CDDBMETHOD获取元数据;
  • 日志排查:abcde 的完整输出(含错误码)会追加写入 ARM 任务日志(rip_music()中的重定向),抓轨失败时CalledProcessError携带的 returncode 与输出可在任务详情中查看。

结语

.abcde.conf是 ARM 音乐抓轨能力的"策略中枢":从元数据来源(CDDBMETHOD)、输出容器与编码器选择、目录与文件名格式、并行编码数,到播放列表、封面获取与自定义钩子,全部集中于此。ARM 的工程实现(arm/config/config.py、arm/ripper/utils.py、arm/ui/settings/settings.py)让这一文件既可以在安装时按需复制修改,也可以随时通过 Web UI 在线编辑并即时生效。掌握上述参数,你就能把"放入光盘 → 自动识别 → 自动抓轨 → 自动归档"的音乐自动化流程调整到完全符合个人收藏习惯。

  • 音视频
  • 后端

【免费下载链接】automatic-ripping-machine

Automatic Ripping Machine (ARM) Scripts

项目地址:https://gitcode.com/gh_mirrors/au/automatic-ripping-machine
点击查看免费下载
上一篇:抖音视频批量下载终极指南:douyin-downloader 一套就够,无水印全类型保存
下一篇:抖音下载工具 douyin-downloader 完整上手指南:批量去水印下载、直播录制与评论采集一次讲清

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询