A single file ncm parser. Here, the ncm is an encrypted music file format which is widely used on NeteaseCloudMuic.
For more details see https://www.cnblogs.com/cyx-b/p/13443003.html
API Documentation is avaliable here.
一个单文件实现的 .ncm 解析器。
Nightly now. 4 nightly-only features are enabled in this crate:
#![feature(iter_next_chunk)]
#![feature(iter_advance_by)]
#![feature(iterator_try_collect)]
#![feature(doc_auto_cfg)]
Once these features get stable, the version number of this crate will bump up to 1.0.0.
```rust use ncm_parser::NCMMetadata; use std::fs::File; use std::io::{Read, Write}; use std::path::Path;
fn main() { // Open .ncm file let mut ncmfile = Vec::new(); let ncmfilename = Path::new("xxx.ncm"); File::open(ncmfilename) .unwrap() .readtoend(&mut ncmfile) .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();
// Two methods are identital.
assert_eq!(
ncm_file_from_iter.get_image(),
ncm_file_from_reader.get_image()
);
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()
);
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();
// Parse metadata
let ncm_meta = ncm_file_from_iter.get_parsed_matadata().unwrap();
// Save music
let music_name = ncm_file_name.with_extension(&ncm_meta.format);
File::create(music_name).unwrap().write_all(&music).unwrap();
// Read the cover 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);
File::create(image_name).unwrap().write_all(image).unwrap();
// Save metadata
let meta_name = ncm_file_name.with_extension("json");
File::create(meta_name).unwrap().write_all(metadata).unwrap();
} ```
Feel free to contribute everything you like.
Currently licensed under MIT.