diff options
Diffstat (limited to 'src/queue.rs')
| -rw-r--r-- | src/queue.rs | 64 |
1 files changed, 32 insertions, 32 deletions
diff --git a/src/queue.rs b/src/queue.rs index 26aeb8b..b0acf5f 100644 --- a/src/queue.rs +++ b/src/queue.rs | |||
| @@ -17,28 +17,27 @@ pub struct AudioMetadata { | |||
| 17 | } | 17 | } |
| 18 | 18 | ||
| 19 | pub fn extract_metadata(path: &Path) -> Option<AudioMetadata> { | 19 | pub fn extract_metadata(path: &Path) -> Option<AudioMetadata> { |
| 20 | use symphonia::core::formats::probe::Hint; | ||
| 20 | use symphonia::core::io::MediaSourceStream; | 21 | use symphonia::core::io::MediaSourceStream; |
| 21 | use symphonia::core::meta::StandardTagKey; | 22 | use symphonia::core::meta::StandardTag; |
| 22 | use symphonia::core::probe::Hint; | ||
| 23 | 23 | ||
| 24 | let file = std::fs::File::open(path).ok()?; | 24 | let file = std::fs::File::open(path).ok()?; |
| 25 | let mss = MediaSourceStream::new(Box::new(file), Default::default()); | 25 | let mss = MediaSourceStream::new(Box::new(file), Default::default()); |
| 26 | 26 | ||
| 27 | let hint = Hint::new(); | 27 | let hint = Hint::new(); |
| 28 | let mut probed = symphonia::default::get_probe() | 28 | let mut probed = symphonia::default::get_probe() |
| 29 | .format(&hint, mss, &Default::default(), &Default::default()) | 29 | .probe(&hint, mss, Default::default(), Default::default()) |
| 30 | .ok()?; | 30 | .ok()?; |
| 31 | 31 | ||
| 32 | // Extract duration from format track's codec parameters | 32 | // Extract duration from track's num_frames and time_base |
| 33 | let duration_secs = probed | 33 | let duration_secs = probed |
| 34 | .format | ||
| 35 | .tracks() | 34 | .tracks() |
| 36 | .iter() | 35 | .iter() |
| 37 | .find(|t| t.codec_params.n_frames.is_some() && t.codec_params.time_base.is_some()) | 36 | .find(|t| t.num_frames.is_some() && t.time_base.is_some()) |
| 38 | .and_then(|t| { | 37 | .and_then(|t| { |
| 39 | let n_frames = t.codec_params.n_frames?; | 38 | let n_frames = t.num_frames?; |
| 40 | let tb = t.codec_params.time_base?; | 39 | let tb = t.time_base?; |
| 41 | Some(n_frames as f64 * tb.numer as f64 / tb.denom as f64) | 40 | Some(n_frames as f64 * tb.numer.get() as f64 / tb.denom.get() as f64) |
| 42 | }); | 41 | }); |
| 43 | 42 | ||
| 44 | let mut metadata = AudioMetadata { | 43 | let mut metadata = AudioMetadata { |
| @@ -46,38 +45,39 @@ pub fn extract_metadata(path: &Path) -> Option<AudioMetadata> { | |||
| 46 | ..Default::default() | 45 | ..Default::default() |
| 47 | }; | 46 | }; |
| 48 | 47 | ||
| 49 | if let Some(meta) = probed.metadata.get() | ||
| 50 | && let Some(rev) = meta.current() | ||
| 51 | { | 48 | { |
| 52 | for tag in rev.tags() { | 49 | let meta = probed.metadata(); |
| 53 | match tag.std_key { | 50 | if let Some(rev) = meta.current() { |
| 54 | Some(StandardTagKey::TrackTitle) => { | 51 | for tag in &rev.media.tags { |
| 55 | metadata.title = Some(tag.value.to_string()); | 52 | match &tag.std { |
| 56 | } | 53 | Some(StandardTag::TrackTitle(value)) => { |
| 57 | Some(StandardTagKey::Artist) => { | 54 | metadata.title = Some(value.to_string()); |
| 58 | metadata.artist = Some(tag.value.to_string()); | 55 | } |
| 59 | } | 56 | Some(StandardTag::Artist(value)) => { |
| 60 | Some(StandardTagKey::Album) => { | 57 | metadata.artist = Some(value.to_string()); |
| 61 | metadata.album = Some(tag.value.to_string()); | 58 | } |
| 59 | Some(StandardTag::Album(value)) => { | ||
| 60 | metadata.album = Some(value.to_string()); | ||
| 61 | } | ||
| 62 | _ => {} | ||
| 62 | } | 63 | } |
| 63 | _ => {} | ||
| 64 | } | 64 | } |
| 65 | } | 65 | } |
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | if metadata.title.is_none() && metadata.artist.is_none() && metadata.album.is_none() { | 68 | if metadata.title.is_none() && metadata.artist.is_none() && metadata.album.is_none() { |
| 69 | let mut format = probed.format; | 69 | let meta = probed.metadata(); |
| 70 | if let Some(rev) = format.metadata().current() { | 70 | if let Some(rev) = meta.current() { |
| 71 | for tag in rev.tags() { | 71 | for tag in &rev.media.tags { |
| 72 | match tag.std_key { | 72 | match &tag.std { |
| 73 | Some(StandardTagKey::TrackTitle) => { | 73 | Some(StandardTag::TrackTitle(value)) => { |
| 74 | metadata.title = Some(tag.value.to_string()); | 74 | metadata.title = Some(value.to_string()); |
| 75 | } | 75 | } |
| 76 | Some(StandardTagKey::Artist) => { | 76 | Some(StandardTag::Artist(value)) => { |
| 77 | metadata.artist = Some(tag.value.to_string()); | 77 | metadata.artist = Some(value.to_string()); |
| 78 | } | 78 | } |
| 79 | Some(StandardTagKey::Album) => { | 79 | Some(StandardTag::Album(value)) => { |
| 80 | metadata.album = Some(tag.value.to_string()); | 80 | metadata.album = Some(value.to_string()); |
| 81 | } | 81 | } |
| 82 | _ => {} | 82 | _ => {} |
| 83 | } | 83 | } |
