mirror of
https://github.com/narrrl/proton-stream.git
synced 2026-11-04 00:47:00 +01:00
35 lines
1.3 KiB
Rust
35 lines
1.3 KiB
Rust
//! Reading the chapter list out of the player.
|
|
//!
|
|
//! The chapters themselves — what a name claims, what the rest of the file
|
|
//! settles, where the tail begins — live in [`pstr_core::chapters`], because
|
|
//! Android reads its chapter list through its own JNI adapter and must reach
|
|
//! the same verdict as this crate does. Only the mpv read is here.
|
|
//!
|
|
//! Read the same way as the track list — `chapter-list/N/title`, one
|
|
//! sub-property at a time — for the same reason: those are plain strings and
|
|
//! doubles, and a node walk would buy nothing.
|
|
|
|
use libmpv2::Mpv;
|
|
|
|
pub use pstr_core::chapters::{
|
|
Chapter, ChapterRole, chapter_at, chapter_end, credits_start, roles,
|
|
};
|
|
|
|
/// Every chapter of the file mpv currently has open.
|
|
pub(crate) fn read(mpv: &Mpv) -> Vec<Chapter> {
|
|
let count: i64 = mpv.get_property("chapter-list/count").unwrap_or(0);
|
|
(0..count)
|
|
.map(|index| Chapter {
|
|
index,
|
|
title: mpv
|
|
.get_property::<String>(&format!("chapter-list/{index}/title"))
|
|
.ok()
|
|
.map(|title| title.trim().to_string())
|
|
.filter(|title| !title.is_empty()),
|
|
start: mpv
|
|
.get_property(&format!("chapter-list/{index}/time"))
|
|
.unwrap_or(0.0),
|
|
})
|
|
.collect()
|
|
}
|