Download files

This commit is contained in:
Brandon Thomas committed 2023-02-14 12:47:23 -05:00
1 parent 0a0105410d
commit a1b8a22225
5 files changed
+73 -3

No files matched your search

+7
View File
@@ -56,6 +56,13 @@ macro_rules! impl_crockford_generator {
$t(token)
}
#[inline]
pub fn entropy_suffix(&self) -> &str {
&self.0
.strip_prefix($variant.prefix())
.unwrap_or(&self.0)
}
#[inline]
pub fn entropic_character_len() -> usize {
let token_prefix = Self::token_prefix();
@@ -163,4 +163,16 @@ mod crockford_traits {
let token_string = MediaUploadToken::generate().to_string();
assert!(token_string.starts_with(prefix));
}
#[test]
fn entropy_suffix() {
let token = MediaUploadToken::new_from_str("mu_foo");
assert_eq!(token.entropy_suffix(), "foo");
let token = MediaUploadToken::new_from_str("bar");
assert_eq!(token.entropy_suffix(), "bar");
let token = MediaUploadToken::generate();
assert_eq!(token.entropy_suffix().len(), 29);
}
}
@@ -163,4 +163,16 @@ mod crockford_traits {
let token_string = UserToken::generate().to_string();
assert!(token_string.starts_with(prefix));
}
#[test]
fn entropy_suffix() {
let token = UserToken::new_from_str("U:foo");
assert_eq!(token.entropy_suffix(), "foo");
let token = UserToken::new_from_str("bar");
assert_eq!(token.entropy_suffix(), "bar");
let token = UserToken::generate();
assert_eq!(token.entropy_suffix().len(), 13);
}
}
@@ -3,6 +3,7 @@ use log::info;
use path_absolutize::Absolutize;
use errors::{anyhow, AnyhowResult};
use hashing::sha256::sha256_hash_string::sha256_hash_string;
use tokens::tokens::news_stories::NewsStoryToken;
use crate::persistence::hashed_directory_path::hashed_directory_path;
#[derive(Clone)]
@@ -18,6 +19,7 @@ impl SaveDirectory {
}
}
// TODO: Move web pages for news under "news_stories/{hashed_url_path}/"
pub fn directory_for_webpage_url(&self, url: &str) -> AnyhowResult<PathBuf> {
let url_hash = sha256_hash_string(url)?;
let directory_path= hashed_directory_path(&url_hash);
@@ -30,6 +32,20 @@ impl SaveDirectory {
Ok(directory)
}
// TODO: Move web pages for news under "news_stories/{hashed_url_path}/audio/"
// This requires associating the job with the URL.
pub fn directory_for_audio(&self, news_story_token: &NewsStoryToken) -> AnyhowResult<PathBuf> {
let entropy_part = news_story_token.entropy_suffix();
let directory_path= hashed_directory_path(&entropy_part);
let directory = self.directory.clone()
.join("audio/")
.join(directory_path)
.join(news_story_token.as_str());
Ok(directory)
}
pub fn html_file_for_webpage_url(&self, url: &str) -> AnyhowResult<PathBuf> {
Ok(self.directory_for_webpage_url(url)?.join("webpage.html"))
}
@@ -46,6 +62,11 @@ impl SaveDirectory {
Ok(self.directory_for_webpage_url(url)?.join("speakable_monologue.yaml"))
}
pub fn audio_wav_file_for_news_story(&self, news_story_token: &NewsStoryToken, sequence_order: i64) -> AnyhowResult<PathBuf> {
let filename = format!("{}.wav", sequence_order);
Ok(self.directory_for_audio(news_story_token)?.join(filename))
}
/// This is just the first directory structure, which is sequential audio files.
/// We'll be using a database and well-formed filesystem layout later.
pub fn get_audio_files_dir_v1(&self) -> PathBuf {
@@ -1,3 +1,4 @@
use std::io::Cursor;
use crate::shared_state::job_state::JobState;
use errors::{anyhow, AnyhowResult};
use fakeyou_client::api::tts_inference::{CreateTtsInferenceRequest, TtsInferenceJobStatusStatePayload};
@@ -7,6 +8,7 @@ use sqlite_queries::queries::by_table::tts_render_targets::list::tts_render_targ
use sqlite_queries::queries::by_table::tts_render_targets::update::update_tts_render_target_successfully_downloaded::Args;
use sqlite_queries::queries::by_table::tts_render_targets::update::update_tts_render_target_successfully_downloaded::update_tts_render_target_successfully_downloaded;
use std::sync::Arc;
use tokens::tokens::news_stories::NewsStoryToken;
use tokens::tokens::tts_models::TtsModelToken;
use tokens::tokens::tts_render_tasks::TtsRenderTaskToken;
@@ -46,7 +48,7 @@ pub async fn process_single_record(target: &TtsRenderTarget, job_state: &Arc<Job
//}).await?;
}
Some(payload) => {
process_download(&target.token, &payload, job_state).await?;
process_download(&target, &payload, job_state).await?;
}
}
},
@@ -55,7 +57,7 @@ pub async fn process_single_record(target: &TtsRenderTarget, job_state: &Arc<Job
Ok(())
}
async fn process_download(task_token: &TtsRenderTaskToken, payload: &TtsInferenceJobStatusStatePayload, job_state: &Arc<JobState>) -> AnyhowResult<()> {
async fn process_download(target: &TtsRenderTarget, payload: &TtsInferenceJobStatusStatePayload, job_state: &Arc<JobState>) -> AnyhowResult<()> {
let tts_result_token = match &payload.maybe_result_token {
None => return Ok(()), // TODO: Wait
Some(result_token) => result_token.to_string(),
@@ -67,9 +69,25 @@ async fn process_download(task_token: &TtsRenderTaskToken, payload: &TtsInferenc
};
let audio_url = get_audio_url(&bucket_path, true);
let news_story_token = NewsStoryToken::new_from_str(&target.story_token);
{
let directory = job_state.save_directory.directory_for_audio(&news_story_token)?;
std::fs::create_dir_all(&directory)?;
}
{
let download_filename = job_state.save_directory
.audio_wav_file_for_news_story(&news_story_token, target.sequence_order)?;
let response = reqwest::get(&audio_url).await?;
let mut file = std::fs::File::create(download_filename)?;
let mut content = Cursor::new(response.bytes().await?);
std::io::copy(&mut content, &mut file)?;
}
update_tts_render_target_successfully_downloaded(Args {
tts_render_task_token: task_token,
tts_render_task_token: &target.token,
tts_result_token: &tts_result_token,
result_url: &audio_url,
sqlite_pool: &job_state.sqlite_pool,