2 个不稳定版本
0.4.1 | 2023年10月2日 |
---|---|
0.4.0 |
|
0.3.2 | 2023年8月28日 |
0.2.0 |
|
0.1.1 |
|
#2273 在 解析器实现
每月下载 53 次
22KB
285 行
ncm_parser
一个单文件实现的 .ncm 解析器。这里的 ncm 是一种加密的音乐文件格式,在 网易云音乐 上广泛使用。
更多详情请见 https://www.cnblogs.com/cyx-b/p/13443003.html
API 文档在这里可用 here.
一个单文件实现的 .ncm 解析器。
最低所需 Rust 版本
nightly 现在可用。启用了 4 个仅 nightly 的功能
#![功能(iter_next_chunk)]
#![功能(iter_advance_by)]
#![功能(iterator_try_collect)]
#![功能(doc_auto_cfg)]
当这些功能稳定后,我会将版本提升到 1.0。
可能的错误
在版本 0.4.0 之前,我已经测试过 129 个 ncm 文件,几乎所有的 bug 都出在 ncm 元数据的解析上。如果遇到问题的话就尝试自己解析吧。
在版本 0.4.0 之前,我已经测试过 129 个 ncm 文件,几乎所有的 bug 都出在 ncm 元数据的解析上。如果遇到问题的话就尝试自己解析吧。
示例
use ncm_parser::NCMMetadata;
use std::fs::File;
use std::io::{Read, Write};
use std::path::Path;
fn main() {
// Open .ncm file
let ncm_file_name = Path::new("xxx.ncm");
let mut ncm_file = std::fs::read(ncm_file_name).unwrap();
// Parse ncm file with `from_iter`
let mut ncm_file_from_iter =
ncm_parser::from_iter(ncm_file.into_iter()).unwrap();
// Directly parse ncm file with `from_reader`
let mut ncm_file_from_reader =
ncm_parser::from_reader(File::open(ncm_file_name).unwrap()).unwrap();
// Both functions get same result.
assert_eq!(
ncm_file_from_iter.get_image().unwrap(),
ncm_file_from_reader.get_image().unwrap()
);
assert_eq!(
ncm_file_from_iter.get_metadata().unwrap(),
ncm_file_from_reader.get_metadata().unwrap()
);
assert_eq!(
ncm_file_from_iter.get_music().unwrap(),
ncm_file_from_reader.get_music().unwrap()
);
// Parse metadata
let ncm_meta = ncm_file_from_iter.get_parsed_metadata().unwrap();
let image = ncm_file_from_iter.get_image_unchecked();
let metadata = ncm_file_from_iter.get_metadata_unchecked();
let music = ncm_file_from_iter.get_music_unchecked();
// Save music
let music_name = ncm_file_name.with_extension(&ncm_meta.format);
std::fs::write(music_name, &music).unwrap();
// Get image format
let image_ext = ncm_meta.album_pic_url.rsplit_once('.').unwrap().1;
// Save cover image
let image_name = ncm_file_name.with_extension(image_ext);
std::fs::write(image_name, &image).unwrap();
// Save metadata
let meta_name = ncm_file_name.with_extension("json");
std::fs::write(meta_name, &metadata).unwrap();
}
贡献
请随意贡献您喜欢的一切。
许可协议
目前许可协议为 MIT。
依赖项
~1–1.8MB
~40K SLoC