VO4UOVTJKRL5LOOMKGMQ5DGN5SAZGCEUAUZTKGRE6N3KSCCXHWFAC
pub fn make_content_path(content_url: &Uri) -> PathBuf {
make_content_folder(content_url).join(make_content_filename(content_url))
pub fn make_content_path(content_url: &Uri) -> Option<PathBuf> {
make_content_folder(content_url)
.map(|f| make_content_filename(content_url).map(|ff| f.join(ff)))
.flatten()
pub fn make_content_filename(content_url: &Uri) -> PathBuf {
let filename = content_url.path()[1..].to_string();
PathBuf::from(filename)
pub fn make_content_filename(content_url: &Uri) -> Option<PathBuf> {
if !content_url.path().is_empty() {
let filename = content_url.path()[1..].to_string();
Some(PathBuf::from(filename))
} else {
None
}
Ok(inner
.request(get_content::Request::new(
content_url.path().trim_matches('/'),
content_url
.authority()
.unwrap()
.as_str()
.try_into()
.unwrap(),
))
.await?)
.map(|response| response.file)
if let (Some(server_address), Some(content_id)) = (
content_url
.authority()
.map(|a| a.as_str().try_into().map_or(None, Some))
.flatten(),
if content_url.path().is_empty() {
None
} else {
Some(content_url.path().trim_matches('/'))
},
) {
inner
.request(get_content::Request::new(content_id, server_address))
.await
.map_or_else(|err| Err(err.into()), |response| Ok(response.file))
} else {
Err(ClientError::Custom(String::from(
"Could not make server address or content ID",
)))
}
let path = media::make_content_path(&thumbnail_url);
let server_media_dir =
media::make_content_folder(&thumbnail_url);
tokio::fs::create_dir_all(server_media_dir).await?;
tokio::fs::write(path, raw_data.as_slice())
.await
.map(|_| (thumbnail_url, raw_data))
.map_err(|e| e.into())
if let (Some(content_path), Some(server_media_dir)) = (
media::make_content_path(&thumbnail_url),
media::make_content_folder(&thumbnail_url),
) {
tokio::fs::create_dir_all(server_media_dir).await?;
tokio::fs::write(content_path, raw_data.as_slice())
.await
.map(|_| (thumbnail_url, raw_data))
.map_err(|e| e.into())
} else {
Err(ClientError::Custom(String::from(
"Could not make content path or server media path",
)))
}
let content_path = media::make_content_path(&content_url);
return if content_path.exists() {
Command::perform(async move { Ok(content_path) }, process_path_result)
} else {
let inner = self.client.inner();
Command::perform(
async move {
match Client::download_content(inner, content_url.clone()).await {
Ok(raw_data) => {
let server_media_dir = media::make_content_folder(&content_url);
tokio::fs::create_dir_all(server_media_dir).await?;
tokio::fs::write(&content_path, raw_data.as_slice()).await?;
Ok((
content_path,
if is_thumbnail {
Some((content_url, raw_data))
if let Some(content_path) = media::make_content_path(&content_url) {
return if content_path.exists() {
Command::perform(async move { Ok(content_path) }, process_path_result)
} else {
let inner = self.client.inner();
Command::perform(
async move {
match Client::download_content(inner, content_url.clone()).await {
Ok(raw_data) => {
if let Some(server_media_dir) =
media::make_content_folder(&content_url)
{
tokio::fs::create_dir_all(server_media_dir).await?;
tokio::fs::write(&content_path, raw_data.as_slice())
.await?;
Ok((
content_path,
if is_thumbnail {
Some((content_url, raw_data))
} else {
None
},
))
Err(err) => Err(err),
}
},
|result| match result {
Ok((content_path, thumbnail)) => {
open::that_in_background(content_path);
if let Some((content_url, raw_data)) = thumbnail {
super::Message::MainScreen(Message::DownloadedThumbnail {
thumbnail_url: content_url,
thumbnail: ImageHandle::from_memory(raw_data),
})
} else {
super::Message::Nothing
},
|result| match result {
Ok((content_path, thumbnail)) => {
open::that_in_background(content_path);
if let Some((content_url, raw_data)) = thumbnail {
super::Message::MainScreen(Message::DownloadedThumbnail {
thumbnail_url: content_url,
thumbnail: ImageHandle::from_memory(raw_data),
})
} else {
super::Message::Nothing
}
log::warn!("An IO error occured while trying to create a folder to hard link a file you tried to upload: {}", err);
if let Err(err) =
tokio::fs::create_dir_all(server_media_dir)
.await
{
log::warn!("An IO error occured while trying to create a folder to hard link a file you tried to upload: {}", err);
}
log::warn!("An IO error occured while hard linking a file you tried to upload (this may result in a duplication of the file): {}", err);
if let Err(err) =
tokio::fs::hard_link(&path, content_path).await
{
log::warn!("An IO error occured while hard linking a file you tried to upload (this may result in a duplication of the file): {}", err);
}