在我的乌班图 Linux 18.04我有一大堆 WMA 文件(不要问),这些文件与另一台受 DRM 保护的计算机上的几个文件混合在一起。后者无法播放,甚至使某些播放器软件崩溃。
是否有一种快速简便的方法可以递归整个子目录树并检测哪些 WMA 文件受 DRM 保护?我见过基于 Windows XP 和 Powershell 的解决方案,但没有看到针对 *ix 的解决方案。
请注意,我并不是在寻找一种(法律上可疑的)方法来剥离 DRM 保护;我只是在寻找一种方法。我只需要找出哪些受 DRM 保护,而不需要一一尝试,这样我就可以删除它们。
建议停止使用 WMA 并改用更合理的格式是没有必要的;如果可以的话,我从不使用 WMA。然而,为我付饭票的人要求我支持这个[审查],所以我别无选择。
答案1
是否有一种快速简便的方法可以递归整个子目录树并检测哪些 WMA 文件受 DRM 保护?
当然!您需要提供任何类型的程序来检测文件是否受 DRM 保护。递归部分很简单。您可能正在使用bash
,因此此脚本会递归、检查、打印经过 DRM 处理的文件;如果您将其替换echo
为rm
.
# to make bash understand **; ZSH doesn't need this
shopt -s globstar
shopt -s nocaseglob
for candidate in **/**.wma ; do
magic_command_that_fails_with_drm "${candidate}" || echo "${candidate}"
done
如果您碰巧有一个命令行程序可以可靠地与这些文件一起崩溃,那么,它可以作为magic_command_that_fails_with_drm
.否则,请尝试mplayer -really-quiet -vo null -ao pcm:fast:file=...
:
#!/bin/bash
# to make bash understand **; ZSH doesn't need this
shopt -s globstar
shopt -s nocaseglob
for candidate in **/**.wma ; do
tmpfile=$(mktemp)
mplayer -really-quiet -vo null -ao "pcm:fast:file=${tmpfile}" "${candidate}" 2> /dev/null
# check whether file exists and is non-empty
if [ ! -s "${tmpfile}" ]; then
echo "${candidate}"
fi
# delete the PCM file again.
rm "${tmpfile}"
done
答案2
您可以使用ffprobe
(随 一起提供ffmpeg
) 和grep
作为字符串“DRM”:
find . -iname "*.wma" \
| while read -r f; do
ffprobe "$f" 2>&1 | grep -q ' DRM' && echo "$f";
done
或者与单行代码相同:
find . -iname "*.wma" | while read -r f; do ffprobe "$f" 2>&1 | grep -q ' DRM' && echo "$f"; done