2 个不稳定版本

0.4.1 2023年10月2日
0.4.0 2023年10月2日
0.3.2 2023年8月28日
0.2.0 2023年7月26日
0.1.1 2023年7月23日

#2273解析器实现

Download history 9/week @ 2024-04-05

每月下载 53

MIT 许可协议

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