3 个版本

0.1.2 2024 年 8 月 1 日
0.1.1 2024 年 6 月 4 日
0.1.0 2024 年 6 月 4 日

340多媒体

Download history 354/week @ 2024-06-03 14/week @ 2024-06-10 3/week @ 2024-06-17 9/week @ 2024-07-01 118/week @ 2024-07-29

每月 124 次下载
用于 somafm

MIT/Apache

36KB
629

icy-metadata

crates.io docs.rs license CI codecov GitHub repo size Lines of Code

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