This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

✨ Add SyncData.marker_ms_range

+35 -32
+11 -31
examples/schedule-hell/src/main.rs
··· 1 1 mod scenes; 2 2 3 3 use anyhow::anyhow; 4 - use itertools::Itertools; 5 4 use schedule_hell::State; 6 5 use shapemaker::{ui::Log, *}; 7 6 use std::{fs, path::PathBuf, time::Duration}; ··· 21 20 .expect("Failed to sync from WAV file"); 22 21 23 22 if let Ok(marker) = args.value_from_str::<_, String>("--marker") { 24 - let marker_start = video 25 - .syncdata 26 - .markers 27 - .iter() 28 - .find_map(|(&ms, m)| if m == &marker { Some(ms) } else { None }) 29 - .expect("Marker not found"); 30 - 31 - let marker_end = video 23 + let range = video 32 24 .syncdata 33 - .markers 34 - .iter() 35 - .filter(|&(&ms, _)| ms > marker_start) 36 - .sorted_by_key(|&(&ms, _)| ms) 37 - .find_map(|(&ms, m)| if m != &marker { Some(ms) } else { None }); 25 + .marker_ms_range(marker) 26 + .expect("Cannot find marker {marker:?} in sync data"); 38 27 39 - video.start_rendering_at = Timestamp::from_ms(marker_start as _); 40 - video.duration_override = 41 - marker_end.map(|end| Duration::from_millis((end - marker_start) as _)) 28 + video.start_rendering_at = Timestamp::from_ms(range.start); 29 + video.duration_override = Some(Duration::from_millis(range.len() as _)); 42 30 } 43 31 44 - video.duration_override = Some( 45 - args.value_from_str("--duration") 46 - .map(Duration::from_secs) 47 - .unwrap_or(video.duration_override.unwrap_or_default()), 48 - ); 32 + if let Ok(duration) = args.value_from_str("--duration") { 33 + video.duration_override = Some(Duration::from_secs(duration)); 34 + } 49 35 50 - if video.duration_override.is_some_and(|d| d.is_zero()) { 51 - video.duration_override = None; 36 + if let Ok(start) = args.value_from_str("--start") { 37 + video.start_rendering_at = Timestamp::from_seconds(start); 52 38 } 53 - 54 - video.start_rendering_at = args 55 - .value_from_str("--start") 56 - .ok() 57 - .map(Timestamp::from_seconds) 58 - .unwrap_or(video.start_rendering_at); 59 39 60 40 video.resolution = args.value_from_str("--resolution").ok().unwrap_or(480); 61 41 video.fps = args.value_from_str("--fps").ok().unwrap_or(30); ··· 78 58 canvas.root().set( 79 59 "credits text", 80 60 Shape::Text( 81 - world.start.translated(2, 2), 61 + world.start, 82 62 "Postamble / Schedule Hell".into(), 83 63 12.0, 84 64 )
+24 -1
src/synchronization/sync.rs
··· 1 1 use super::audio::Stem; 2 2 use anyhow::Result; 3 3 use serde::{Deserialize, Serialize}; 4 - use std::{collections::HashMap, path::PathBuf}; 4 + use std::{collections::HashMap, fmt::Display, ops::Range, path::PathBuf}; 5 5 6 6 pub type TimestampMS = usize; 7 7 ··· 23 23 self.bpm = other.bpm.or(self.bpm); 24 24 self.stems.extend(other.stems); 25 25 self.markers.extend(other.markers); 26 + } 27 + 28 + pub fn marker_ms_range( 29 + &self, 30 + marker: impl Display, 31 + ) -> Option<Range<TimestampMS>> { 32 + let start = self.markers.iter().find_map(|(&ms, m)| { 33 + if m == &marker.to_string() { 34 + Some(ms) 35 + } else { 36 + None 37 + } 38 + })?; 39 + 40 + let end = self.markers.iter().find_map(|(&ms, m)| { 41 + if m == &marker.to_string() && ms > start { 42 + Some(ms) 43 + } else { 44 + None 45 + } 46 + })?; 47 + 48 + Some(start..end) 26 49 } 27 50 }