From 64d4ee9168443fc919e9cc3fda2bae47a2e191b1 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 26 May 2023 00:36:52 +0900 Subject: [PATCH] Implement chapter detection --- transcoder/src/identify.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/transcoder/src/identify.rs b/transcoder/src/identify.rs index db54ed8a..54e03cd6 100644 --- a/transcoder/src/identify.rs +++ b/transcoder/src/identify.rs @@ -119,6 +119,32 @@ pub async fn identify(path: String) -> Result { }) .collect(), fonts: vec![], - chapters: vec![], + chapters: output["media"]["tracks"] + .members() + .find(|x| x["@type"] == "Menu") + .map(|x| { + std::iter::zip(x["extra"].entries(), x["extra"].entries().skip(1)) + .map(|((start, name), (end, _))| Chapter { + start: time_to_seconds(start), + end: time_to_seconds(end), + name: name.as_str().unwrap().to_string(), + }) + .collect() + }) + .unwrap_or(vec![]), }) } + +fn time_to_seconds(time: &str) -> f32 { + let splited: Vec = time + .split('_') + .skip(1) + .map(|x| x.parse().unwrap()) + .collect(); + let hours = splited[0]; + let minutes = splited[1]; + let seconds = splited[2]; + let ms = splited[3]; + + (hours * 60. + minutes) * 60. + seconds + ms / 1000. +}