3 个版本
新 0.1.2 | 2024 年 8 月 1 日 |
---|---|
0.1.1 | 2024 年 6 月 4 日 |
0.1.0 | 2024 年 6 月 4 日 |
340 在 多媒体
每月 124 次下载
用于 somafm
36KB
629 行
icy-metadata
icy-metadata 是一个用于读取与 Icecast 兼容的 Web 服务器返回的元数据的库。
安装
cargo add icy-metadata
特性
reqwest
- 为reqwest
的客户端构建器和请求构建器添加便利方法来设置 icy 元数据头。serde
- 启用元数据结构体的序列化和反序列化。
头信息
从 HTTP 响应中解析常见的 Icecast 头信息。 icy-metadata
将查找几个常见的别名以找到头值。
use icy_metadata::IcyHeaders;
use std::error::Error;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let stream =
reqwest::get("https://some-cool-url.com/some-file.mp3").await?;
let icy_headers = IcyHeaders::parse_from_headers(stream.headers());
println!("{icy_headers:?}");
Ok(())
}
读取流中的信息
一些流在其自身中包含有关当前曲目信息。将流包装在 IcyMetadataReader
中提供了一个接口来读取这些值。
use std::error::Error;
use std::num::NonZeroUsize;
use icy_metadata::{IcyHeaders, IcyMetadataReader, RequestIcyMetadata};
use stream_download::http::reqwest::{self, Client};
use stream_download::http::HttpStream;
use stream_download::storage::bounded::BoundedStorageProvider;
use stream_download::storage::memory::MemoryStorageProvider;
use stream_download::{Settings, StreamDownload};
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
// We need to add a header to tell the Icecast server that we can parse the metadata
// embedded within the stream itself.
let client = Client::builder().request_icy_metadata().build()?;
let stream =
HttpStream::new(client, "https://some-cool-url.com/some-file.mp3".parse()?).await?;
let icy_headers = IcyHeaders::parse_from_headers(stream.headers());
// buffer 5 seconds of audio
// bitrate (in kilobits) / bits per byte * bytes per kilobyte * 5 seconds
let prefetch_bytes = icy_headers.bitrate().unwrap() / 8 * 1024 * 5;
let reader = StreamDownload::from_stream(
stream,
// use bounded storage to keep the underlying size from growing indefinitely
BoundedStorageProvider::new(
MemoryStorageProvider,
// be liberal with the buffer size, you need to make sure it holds
// enough space to prevent any out-of-bounds reads
NonZeroUsize::new(512 * 1024).unwrap(),
),
Settings::default().prefetch_bytes(prefetch_bytes as u64),
)
.await?;
let metadata_reader = IcyMetadataReader::new(
reader,
// Since we requested icy metadata, the metadata interval header should be
// present in the response. This will allow us to parse the metadata
// within the stream.
icy_headers.metadata_interval(),
// Print the stream metadata whenever we receive new values
|metadata| println!("{metadata:?}\n"),
);
Ok(())
}
流内查找
支持查找,但有少量限制。有关 IcyMetadataReader
的详细信息,请参阅文档。
支持的 Rust 版本
当前 MSRV 为 1.70.0
。
依赖项
~3–17MB
~194K SLoC