- 音视频
- 后端
【免费下载链接】automatic-ripping-machine
Automatic Ripping Machine (ARM) Scripts
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 会自动使用) |
CDDBPROTO | 6 | CDDB 协议级别,5 为 latin1 输出,6 为 UTF-8 编码 |
HELLOINFO | "`whoami`@`hostname`" | CDDB 协议需要的用户名@主机名信息 |
CDDBSUBMIT | freedb-submit@freedb.org | CDDB 变更提交通信地址 |
CDDBCOPYLOCAL/CDDBLOCALDIR/CDDBLOCALRECURSIVE | n/$HOME/.cddb/y | 是否把抓取的 CDDB 条目缓存在本地$CDDBLOCALDIR |
NOSUBMIT | n | 设为y后 abcde 永不询问是否提交编辑过的 cddb 文件 |
NOCDDBQUERY | n | 设为y等效于命令行-n,永不访问 CDDB 服务器,直接进入空白 cddb 文件编辑模式;y隐含NOSUBMIT=y |
CDDBUSELOCAL | n | 设为y时优先使用本地缓存条目(配合CDDBLOCALRECURSIVE=y;Grip 等工具也共用$HOME/.cddb) |
SHOWCDDBFIELDS | year,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=ogg3.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各格式可选编码器汇总(来自仓库配置注释):
| 格式 | 可用编码器 |
|---|---|
| Ogg | oggenc、vorbize |
| MP3 | lame、gogo、bladeenc、l3enc、xingmp3enc、mp3enc |
| FLAC | flac(当前唯一支持) |
| Speex | speexenc(唯一) |
| MPC | mpcenc(唯一) |
| WavPack | wavpack、ffmpeg |
| APE | mac(唯一) |
| AAC/M4A | fdkaac、ffmpeg、neroAacEnc、faac、qaac、fhgaacenc |
| Opus | opusenc(唯一) |
| MP2 | twolame、ffmpeg |
| TTA | tta、ttaenc |
| AIFF | ffmpeg(唯一) |
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"。
- fdkaac:
- 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.cue2discidCDROMREADERSYNTAX当前可选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=$VAOUTPUTFORMATVAOUTPUTFORMAT:Various Artists 合辑的格式(默认Various 专辑/序号 艺术家 曲名);ONETRACKOUTPUTFORMAT/VAONETRACKOUTPUTFORMAT:适用于"单文件"抓轨(ONEFILE)的格式,默认分别继承上面两个变量。
这与 ARM 文档中提到的"Merge CD into single track (for live albums)"能力对应——将整张 CD 合并为单个轨道文件(适合现场专辑)。
4.4 文件名整理函数(mungefilename)
abcde 默认会对 CDDB 数据做三类清洗以得到可用文件名:
- 删除标题前的点号;
- 将空格替换为下划线(可移除该规则以保留空格);
- 删除 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=4MAXPROCS指定同时运行的编码器数量,等效于命令行-j。在 SMP(多核)系统上可显著加速,默认 1,仓库配置设为 4。
5.2 交互模式与轨道垫零
INTERACTIVE=n PADTRACKS=yINTERACTIVE=n:让 abcde 全程非交互(命令行无对应开关,一旦设置将永远非交互);PADTRACKS=y:强制轨道号用 0 补足两位,即使只有一首歌也输出01.my_song.ext样式。
5.3 低磁盘模式与批量归一化
#LOWDISK=n #BATCHNORM=nLOWDISK=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=yKEEPWAVS=n:编码后保留 WAV(需同时把clean从默认 actions 中移除,否则临时目录会被清空);NOGAP=y:使用 lame 编码器时启用无间隔(gapless)编码。
六、动作管线(ACTIONS)与播放列表
6.1 ACTIONS:abcde 的动作管线
ACTIONS=musicbrainz,read,encode,tag,move,clean,playlist,getalbumart,embedalbumartACTIONS是逗号分隔的动作序列。可选动作: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=0REMOTEHOSTS可把编码任务分发到远程主机(需本地安装 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
相关推荐
claude-skills 仓库 flutter-expert 技能实战指南:Flutter 3 跨平台应用的 Riverpod/Bloc 状态管理、GoRouter 导航与性能优化
claude skills 仓库 flutter expert 技能实战指南:Flutter 3 跨平台应用的 Riverpod/Bloc 状态管理、GoRou
音视频后端Automatic Ripping Machine (ARM) 入门指南:从硬件选型到系统配置
Automatic Ripping Machine ARM 入门指南:从硬件选型到系统配置 项目概述 Automatic Ripping Machine ARM
音视频后端CTF Wiki 实战解析:RSA 私钥 d 泄露攻击与 Wiener 攻击的原理与攻防实践
CTF Wiki 实战解析:RSA 私钥 d 泄露攻击与 Wiener 攻击的原理与攻防实践 本文基于 CTF Wiki 中文仓库中 RSA 私钥 d 相关攻击
音视频后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考