19 个版本

0.9.0 2024年4月16日
0.8.3 2023年12月25日
0.8.2 2023年6月5日
0.6.3 2023年3月10日
0.5.1 2022年10月3日

操作系统 中排名第 87

每月下载量 41

授权协议 MPL-2.0

105KB
2K SLoC

大诺

大诺 是一个针对 ffmpeg 的封装,用于校验兼容 ffmpeg 的媒体文件的内部文件流,并将它们存储在可以用于稍后验证这种校验和的格式中。这很方便,因为,如果您选择更改元数据标签或更改文件名,媒体校验和应该保持不变。

功能

  • 非媒体路径过滤(可禁用)
  • 高度并发的哈希(选择线程数)
  • 几个有用的模式:写入、测试、打印、转储或重复
  • 从多个校验和算法中选择(默认:murmur3、MD5、adler32、CRC32、SHA160、SHA256、SHA512)
  • 在执行哈希函数之前解码流
  • 写入xattrs或哈希文件(并且总是读取并操作两者)

为什么是 dano?因为 FLAC 真的很聪明

对我来说,一流的校验和是 FLAC 音乐格式与众不同的一个方面。FLAC 支持在其容器内写入和检查流。当我询问 FLAC 音频流是否与最初写入磁盘的流具有相同的校验和时,flac 命令会告诉我校验和是否匹配

 flac -t 'Link Wray - Rumble! The Best of Link Wray - 01-01 - 02 - The Swag.flac'
Link Wray - Rumble! The Best of Link Wray - 01-01 - 02 - The Swag.flac: ok

为什么不能在所有地方都这样做呢?

问题是——为什么我们没有为视频和其他媒体流提供这种功能?答案是,当然我们有,(因为 ffmpeg 是无与伦比的!)我们只是从未使用过它。 dano 的目标是使 ffmpeg 提供的功能更容易使用。

对于无损文件,这意味着我们可以确认无损文件解码到与我们编码的精确比特流相同,但对于所有文件,这意味着我们的校验和可以稳定地抵抗元数据更改、文件名更改、或/或将比特流从一个媒体容器移动到另一个容器。

因此,例如,当我询问媒体流是否与最初写入磁盘时的校验和相同,dano 会告诉我校验和是否匹配

 dano -w 'Sample.mkv'
murmur3=2f23cebfe8969a8e11cd3919ce9c9067 : "Sample.mkv"
 dano -t 'Sample.mkv'
"Sample": OK
# Now change our file's name and our checksum still verifies,
# because the checksum is stored in a xattr
➜ mv 'Sample.mkv' 'test1.mkv'
➜ dano -t 'test2.mkv'
"test1.mkv": OK
# Now change our file's metadata and *write a new file in a 
# new container* and our checksum is the *same*
➜ ffmpeg -i 'test1.mkv' -metadata author="Kimono" 'test2.mp4'
➜ dano -w 'test2.mp4'
murmur3=2f23cebfe8969a8e11cd3919ce9c9067 : "test2.mkv"

我可以用 dano 与我的 FLAC 文件一起使用吗?

当然可以。 dano 甚至可以直接导入您的 FLAC 文件的校验和

# Import dano checksum from FLAC and write to an xattr
➜ dano --import-flac 'Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.flac'
MD5=fed8052012fb6d0523ef3980a0f6f7bd : "Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.flac"
Writing dano hash for: "Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.flac"
No old file data to overwrite.
# Verify checksum is the same as the checksum embedded in the FLAC container
➜ metaflac --show-md5sum 'Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.flac'
fed8052012fb6d0523ef3980a0f6f7bd
# Verify the decoded FLAC audio stream is the same as the xattr checksum
➜ dano -t 'Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.flac'
"Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.flac": OK

唉,为什么 ALAC 不能更像 FLAC 呢?

我明白了!对于真正的收藏家来说,如果你在更改专辑封面后无法验证你的校验和,校验还有什么用呢?

dano 允许你存储一个稳定的校验和,并在以后验证它,就像 FLAC 一样

# To test, this we will create an ALAC copy of a FLAC file
ffmpeg -i 'Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.flac' -acodec alac 'Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.m4a'
# Write dano checksum to an xattr
➜ dano -w --only=audio --decode --hash-algo=md5 'Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.m4a'
MD5=fed8052012fb6d0523ef3980a0f6f7bd : "Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.m4a"
Writing dano hash for: "Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.m4a"
No old file data to overwrite.
# Verify checksum is the same as the decoded FLAC audio stream
➜ metaflac --show-md5sum "Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.flac"
fed8052012fb6d0523ef3980a0f6f7bd
# Verify the decoded ALAC audio stream is the same as the xattr checksum
➜ dano -t "Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.m4a"
"Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.m4a": OK

我能用 dano 查找重复文件吗?

如果你曾经使用过 fdupes,你就知道它有多么酷。 fdupes 可以递归地搜索文件树以发现重复文件。唯一的问题是——如果你的某些媒体文件具有相同的内部比特流,但不同的文件校验和怎么办?也许这样的比特流包含在不同的/不同的容器中,或者附加了不同的文件元数据/标签?

dano 可以根据它们的内部比特流轻松找到这样的重复媒体

# To test, create a copy
➜ cp 'Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.flac' 'Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance-copy1.flac'
# Copy will not contain a hash, so we will create one
➜ dano -w -x ./*
murmur3=ff95fc73a64ace424964f30af3ed932  : "./Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance-copy1.flac"
No new file paths to write.
Overwriting dano hash for: "./Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance-copy1.flac"
# Now, find duplicates
➜ find . -type f | dano --dupes
murmur3=ff95fc73a64ace424964f30af3ed932  : "./Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance-copy1.flac"
murmur3=ff95fc73a64ace424964f30af3ed932  : "./Pavement - Wowee Zowee_ Sordid Sentinels Edition - 02-02 - 50 - We Dance.flac"
WARN: Duplicates found.

欢呼吧!Yo, yo, yo!

灵感来自 hashdeepmd5treeflac,以及当然还有 ffmpeg

通过原生包安装

对于基于 Debian 的发行版(如 Ubuntu),我维护一个个人软件包存档,或 PPA。有关使用说明,请参阅链接存储库

对于基于 Debian 和 Redhat 的 Linux 发行版(如 Ubuntu 或 Fedora 等),请检查标记版本以获取您发行版的原生包。

您还可以从最新源创建并安装自己的原生包,如下所示

 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
 cargo install cargo-deb 
 git clone https://github.com/kimono-koans/dano.git
 cd ./dano/; cargo deb
# to install on a Debian/Ubuntu-based system
➜ dpkg -i ./target/debian/dano_*.deb
# or convert to RPM 
➜ alien -r ./target/debian/dano_*.deb
# and install on a Redhat-based system
➜ rpm -i --replacefiles ./dano*.rpm

从源安装

目前,如果您想导入 FLAC 文件,dano 依赖于 ffmpegmetaflac

您可以安装 rustup 并按如下方式构建 dano

 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 
 cargo install dano

注意:除了您可能从包管理器或操作系统提供的(例如,apt install rustc cargo)以外,注重安全的用户可能对以下信息感兴趣:除了上述方法外,还有替代方法来安装 rustc 编译器和 cargo,这允许您在安装之前验证 rustup

警告:dano 仅在 MacOS 和 Linux 上进行过测试,并且可能只能在支持 Unix-y Rust 的平台上编译和运行,但 Windows 版本可能只需要进行一些小的修改即可编译。关于 Windows 版本的进一步想法可以在链接问题中找到。

依赖关系

~6–15MB
~220K SLoC