mirror of
https://framagit.org/veretcle/scootaloo.git
synced 2025-07-21 09:31:19 +02:00
feat: add copyprofile subcommand
This commit is contained in:
35
src/util.rs
35
src/util.rs
@@ -1,5 +1,6 @@
|
||||
use crate::{twitter::get_tweet_media, ScootalooError};
|
||||
|
||||
use base64::encode;
|
||||
use egg_mode::tweet::Tweet;
|
||||
use futures::{stream, stream::StreamExt};
|
||||
use log::{error, info, warn};
|
||||
@@ -71,6 +72,27 @@ pub async fn generate_media_ids(
|
||||
(media_url, media_ids)
|
||||
}
|
||||
|
||||
/// Transforms the media into a base64 equivalent
|
||||
pub async fn base64_media(u: &str) -> Result<String, Box<dyn Error>> {
|
||||
let mut response = reqwest::get(u).await?;
|
||||
|
||||
let mut buffer = Vec::new();
|
||||
|
||||
while let Some(chunk) = response.chunk().await? {
|
||||
copy(&mut &*chunk, &mut buffer).await?;
|
||||
}
|
||||
|
||||
let content_type = response
|
||||
.headers()
|
||||
.get("content-type")
|
||||
.ok_or_else(|| ScootalooError::new(&format!("Cannot get media content type for {}", u)))?
|
||||
.to_str()?;
|
||||
|
||||
let encoded_f = encode(buffer);
|
||||
|
||||
Ok(format!("data:{};base64,{}", content_type, encoded_f))
|
||||
}
|
||||
|
||||
/// Gets and caches Twitter Media inside the determined temp dir
|
||||
pub async fn cache_media(u: &str, t: &str) -> Result<String, Box<dyn Error>> {
|
||||
// create dir
|
||||
@@ -129,4 +151,17 @@ mod tests {
|
||||
|
||||
remove_dir_all(TMP_DIR).unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_base64_media() {
|
||||
let img = base64_media(
|
||||
"https://forum.nintendojo.fr/styles/prosilver/theme/images/ndfr_casual.png",
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
assert!(img.starts_with("data:image/png;base64,"));
|
||||
|
||||
assert!(img.ends_with("="));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user