feat(backend): insert yt-dlp metadata on successful download
This commit is contained in:
parent
94464c6cd8
commit
a3353cca65
1 changed files with 46 additions and 4 deletions
50
cli/src/extractors/external/ytdlp.rs
vendored
50
cli/src/extractors/external/ytdlp.rs
vendored
|
@ -39,6 +39,7 @@ impl Extractor for YtDlpExtractor {
|
|||
"--progress",
|
||||
"--no-call-home",
|
||||
"--no-playlist",
|
||||
"--write-info-json",
|
||||
url.as_str(),
|
||||
])
|
||||
.current_dir(temp_dir.path())
|
||||
|
@ -102,14 +103,52 @@ impl Extractor for YtDlpExtractor {
|
|||
));
|
||||
}
|
||||
|
||||
let mut result = vec![];
|
||||
|
||||
let files = std::fs::read_dir(temp_dir.path())?.collect::<Result<Vec<_>, _>>()?;
|
||||
|
||||
let destination = files
|
||||
.first()
|
||||
.iter()
|
||||
.find(|f| f.path().extension().map(|e| e != "json").unwrap_or(false))
|
||||
.ok_or_else(|| {
|
||||
anyhow::anyhow!("yt-dlp didn't produce any files in {:?}", temp_dir.path())
|
||||
})?
|
||||
.path();
|
||||
|
||||
let json_path = files
|
||||
.iter()
|
||||
.find(|f| f.path().extension().map(|e| e == "json").unwrap_or(false))
|
||||
.ok_or_else(|| {
|
||||
anyhow::anyhow!(
|
||||
"yt-dlp didn't produce any json files in {:?}",
|
||||
temp_dir.path()
|
||||
)
|
||||
})?
|
||||
.path();
|
||||
let json_text = std::fs::read_to_string(json_path)?;
|
||||
let json_data = serde_json::from_str::<serde_json::Value>(&json_text)?;
|
||||
for key in [
|
||||
"title",
|
||||
"fulltitle",
|
||||
"description",
|
||||
"channel",
|
||||
"uploader",
|
||||
"channel_url",
|
||||
"upload_date",
|
||||
"timestamp",
|
||||
] {
|
||||
if let Some(value) = json_data.get(key) {
|
||||
result.push(Entry {
|
||||
entity: address.clone(),
|
||||
attribute: format!("YTDL_META_{}", key).parse().unwrap(),
|
||||
value: EntryValue::guess_from(value.to_string()),
|
||||
provenance: context.provenance.clone() + "EXTRACTOR yt-dlp",
|
||||
user: context.user.clone(),
|
||||
timestamp: chrono::Utc::now().naive_utc(),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
let stored = store.store(
|
||||
connection,
|
||||
destination.clone().into(),
|
||||
|
@ -119,16 +158,19 @@ impl Extractor for YtDlpExtractor {
|
|||
None,
|
||||
context.clone(),
|
||||
)?;
|
||||
job_handle.update_progress(100.0)?;
|
||||
|
||||
Ok(vec![Entry {
|
||||
result.push(Entry {
|
||||
entity: address.clone(),
|
||||
attribute: "YTDLD".parse().unwrap(),
|
||||
value: Address::Hash(stored).into(),
|
||||
provenance: context.provenance.clone() + "EXTRACTOR yt-dlp",
|
||||
user: context.user.clone(),
|
||||
timestamp: chrono::Utc::now().naive_utc(),
|
||||
}])
|
||||
});
|
||||
|
||||
job_handle.update_progress(100.0)?;
|
||||
|
||||
Ok(result)
|
||||
} else {
|
||||
Ok(vec![])
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue