use lazy_regex::regex;
pub(crate) fn extract_filename_from_subject(subject: &str) -> Option<&str> {
if let Some(captured) = regex!(r#""(.*)""#).captures(subject) {
let trimmed = captured.get(1).map(|m| m.as_str().trim());
if let Some(s) = trimmed
&& !s.is_empty()
{
return Some(s);
}
}
if let Some(captured) =
regex!(r"^(?:\[|\()(?:\d+/\d+)(?:\]|\))\s-\s(.*)\syEnc\s(?:\[|\()(?:\d+/\d+)(?:\]|\))\s\d+").captures(subject)
{
let trimmed = captured.get(1).map(|m| m.as_str().trim());
if let Some(s) = trimmed
&& !s.is_empty()
{
return Some(s);
}
}
if let Some(captured) =
regex!(r"\b([\w\-+()' .,]+(?:\[[\w\-/+()' .,]*][\w\-+()' .,]*)*\.[A-Za-z0-9]{2,4})\b").captures(subject)
{
let trimmed = captured.get(1).map(|m| m.as_str().trim());
if let Some(s) = trimmed
&& !s.is_empty()
{
return Some(s);
}
}
None
}
#[cfg(test)]
mod tests {
use super::*;
use rstest::rstest;
#[rstest]
#[case(
"[011/116] - [AC-FFF] Highschool DxD BorN - 02 [BD][1080p-Hi10p] FLAC][Dual-Audio][442E5446].mkv yEnc (1/2401) 1720916370",
"[AC-FFF] Highschool DxD BorN - 02 [BD][1080p-Hi10p] FLAC][Dual-Audio][442E5446].mkv"
)]
#[case(
"[010/108] - [SubsPlease] Ijiranaide, Nagatoro-san - 02 (1080p) [6E8E8065].mkv yEnc (1/2014) 1443366873",
"[SubsPlease] Ijiranaide, Nagatoro-san - 02 (1080p) [6E8E8065].mkv"
)]
#[case(
r#"[1/8] - "TenPuru - No One Can Live on Loneliness v05 {+ "Book of Earthly Desires" pamphlet} (2021) (Digital) (KG Manga).cbz" yEnc (1/230) 164676947"#,
r#"TenPuru - No One Can Live on Loneliness v05 {+ "Book of Earthly Desires" pamphlet} (2021) (Digital) (KG Manga).cbz"#
)]
fn test_extract_filename_from_subject(#[case] subject: &str, #[case] filename: &str) {
assert_eq!(extract_filename_from_subject(subject), Some(filename));
}
}