Filter by mime
Some checks failed
CI / Typos (push) Successful in 17s
CI / Build and test (push) Successful in 2m28s
CI / Clippy (push) Failing after 3m59s
CI / Build and test (all features) (push) Successful in 9m40s

This commit is contained in:
2026-03-15 10:20:15 -07:00
parent 32aedb9dc1
commit a2079877fd
30 changed files with 258 additions and 93 deletions

View File

@@ -9,7 +9,7 @@ use std::{
use tracing::trace;
use crate::{
extract::traits::{ListExtractor, ObjectExtractor},
extract::traits::{ExtractState, ListExtractor, ObjectExtractor},
value::{Item, PileValue, SyncReadBridge},
};
@@ -46,16 +46,32 @@ impl FlacImagesExtractor {
return Ok(count);
}
fn mime_ok(&self, state: &ExtractState) -> bool {
if state.ignore_mime {
return true;
}
let essence = self.item.mime().essence_str();
essence == "audio/flac" || essence == "audio/x-flac"
}
}
#[async_trait::async_trait]
impl ListExtractor for FlacImagesExtractor {
async fn get<'a>(&'a self, mut idx: usize) -> Result<Option<PileValue>, std::io::Error> {
async fn get(
&self,
state: &ExtractState,
mut idx: usize,
) -> Result<Option<PileValue>, std::io::Error> {
trace!(
key = self.item.key().as_str(),
"Getting index {idx} from FlacImagesExtractor",
);
if !self.mime_ok(state) {
return Ok(None);
}
let key = self.item.key();
let reader = SyncReadBridge::new_current(self.item.read().await?);
let image = tokio::task::spawn_blocking(move || {
@@ -98,7 +114,11 @@ impl ListExtractor for FlacImagesExtractor {
}))
}
async fn len(&self) -> Result<usize, std::io::Error> {
async fn len(&self, state: &ExtractState) -> Result<usize, std::io::Error> {
if !self.mime_ok(state) {
return Ok(0);
}
if let Some(x) = self.cached_count.get() {
return Ok(*x);
}
@@ -178,12 +198,21 @@ impl FlacExtractor {
return Ok(self.output.get_or_init(|| output));
}
fn mime_ok(&self, state: &ExtractState) -> bool {
if state.ignore_mime {
return true;
}
let essence = self.item.mime().essence_str();
essence == "audio/flac" || essence == "audio/x-flac"
}
}
#[async_trait::async_trait]
impl ObjectExtractor for FlacExtractor {
async fn field(
&self,
state: &ExtractState,
name: &Label,
args: Option<&str>,
) -> Result<Option<PileValue>, std::io::Error> {
@@ -191,6 +220,10 @@ impl ObjectExtractor for FlacExtractor {
return Ok(None);
}
if !self.mime_ok(state) {
return Ok(None);
}
if name.as_str() == "images" {
return Ok(Some(self.images.clone()));
}