#media #manager #validation #music #library #media-file

librmo

一个用于管理媒体文件和播放它们的库

18 个版本

0.3.4 2024年8月10日
0.3.3 2024年7月11日
0.3.0 2024年6月25日
0.2.7 2024年5月4日
0.1.4 2024年4月15日

1976命令行工具 中排名

Download history 434/week @ 2024-04-29 13/week @ 2024-05-06 11/week @ 2024-05-20 1/week @ 2024-06-10 112/week @ 2024-06-24 297/week @ 2024-07-08 6/week @ 2024-07-15 101/week @ 2024-08-05 27/week @ 2024-08-12

每月下载量 128

MIT 许可证

190KB
2.5K SLoC

libRMO - Rust 媒体 ORM

提供了一种ORM,用于结构化引用媒体文件和元数据。利用这些信息,我们可以验证元数据的完整性。

从定义至少一个起始根文件夹开始,生成完整的媒体库,并从中运行有用的功能。

使用方法

[dependencies]
# Add to dependencies
librmo = "0.1.0"

初始化库,这将生成配置 %XDG_CONFIG_HOME/liborm 和缓存 %XDG_CACHE_HOME/liborm 文件夹,创建sqlite数据库并应用迁移

use librmo::migration;

migration::run().await;

现在后端已准备就绪,我们可以提供一个库目录以开始收集

use librmo::media_manager::MusicManager as MM;

let lib_name = "MyMusic";
let lib_path = "/path/to/music";
MM::insert_library(lib_name, lib_path).await?;

我们可以确认此库存在

use librmo::media_manager::MusicManager as MM;
use librmo::entity::library::Model as LibraryModel

let libraries: Vec<LibraryModel> = MM::get_library().await?;
println!("{:?}", libraries);
// [Model { id: 1, name: "MyMusic", path: "/path/to/music", files: "" }]

现在我们有一个起始目录,我们可以启动管理器。这个过程是对每个文件进行简单的walkdir,并将它们存储在数据库中,包括它们的完整路径、修改时间和与内部扩展枚举列表的匹配。
这应该很快,对于 ~16k 个文件,大约需要 ~12s。
我们创建一个实例的 Collector,并提供一个起始目录作为参数

use librmo::media_manager::MusicManager as MM;

let mm = MM::new(None);
mm.execute().await?;

然后我们可以获取所有媒体文件的信息
然后我们创建一个专辑记录,并设置专辑的元数据

然后我们创建一个艺术家记录,并设置艺术家的元数据
然后我们创建一个专辑艺术家的关系,并设置专辑和艺术家之间的关联
然后我们获取所有专辑的艺术家信息

use librmo::media_checker::MusicChecker as MC;

MC::execute().await?;

然后我们获取所有专辑的艺术家信息并创建一个艺术家实例

migration::run().await?;
let lib_name = "MyMusic";
let lib_path = "/home/samuel/Music";
MM::insert_library(lib_name, lib_path).await?;
MM::execute().await?;
MC::execute().await?;

然后我们创建一个专辑的媒体文件记录,并设置媒体文件的信息

然后我们获取所有专辑的媒体文件信息并创建一个媒体文件实例

use librmo::media_validator as MV;

let reports = MV::get_reports().await?;
println!("{} Reports - {:?}", reports.len(), reports);
//14 Reports - [ReportList { report_type: "ALBUMID", path: "/home/samuel/Music/sample_mp3.mp3" }, ... }

这里为缺失的每个标签创建了一个条目,并列出了文件的路径。

可以从 Front Cover 条目生成专辑封面图,通过 trackalbum 上的 mb_release_id 属性。

let tracks = MC::get_tracks().await?;
//or
let albums = MC::get_albums().await?;
// Use your favourite method of selecting a record
let release_id = tracks[albums.len() - 1].mb_release_id.clone();
MC::generate_album_art_by_release_id(release_id)
MC::generate_album_art_full_by_release_id(release_id)

生成的 jpg 图像将位于 %XDG_CACHE_HOME/librmo/album_art%XDG_CACHE_HOME/librmo/album_art_full,文件名为 <mb_release_id>.jpg

构建

Fedora

sudo dnf install gcc pkg-config perl-FindBin openssl-devel alsa-lib-devel

未来功能/改进

错误和性能

  • check_media 应该首先获取所有 music 记录并比较,而不是一个接一个地比较
  • 将专辑封面缩略图生成分离到异步函数中,也允许按需调用
  • 重置数据库,目前如果删除库记录会变慢
  • 允许清除或 report
  • 删除库中不再存在的媒体记录
  • 清除已删除的媒体后,如果无曲目剩余,则删除专辑
  • 加快报告插入操作的速度
  • 在报告条目中更好地描述缺失的标签

功能

  • 允许覆盖数据库和缓存存储的位置
  • 允许选择艺术品缩略图文件格式,目前锁定为 jpg
  • 调整输出文件的分辨率,锁定为 300x300
  • 检查艺术品的尺寸,如果太小则添加 report 条目
  • 日志设置和有用的信息

依赖项

~51–86MB
~1.5M SLoC